BLENDER_v240REND p1SRt m SRipo` 0 58q QSRDATA` n DATA n ` DATA n8 RDATA8 n RDATA nȴ 8 DATAȴ n RDATA nX ȴ DATAX n  RDATA n X DATA n DATA0 ox DATAx o 0 ` 8 DATA o x ` DATA oP 8 ȴ DATAP o  ȴ DATA o P  DATA o( X DATA( op  X DATAp o ( DATA o p ȴ DATA oH  DATAH o X DATA oع H  DATAع o DATA oع ȴ X DATAq` ȴ 8 RRRSȽ о h DATAh p@ OutputRender>DATA@ p h RenderRender@>DATA p @ AnimRender>DATA p FormatRender>DATAȽ ^о 333?6DdCNBhhD{;AH[CC(BDC??SdDATATо `Ƚ 333?6/9DATAq` X RRRSDATA`q5  2O=E=o?ax)8 DATAx)YX 333?6L???xЄ=????xЄ>?2O=E=o~W::?$ǝASAxЄ>?2O=E=o????xЄ=??SA  B?=CxЄ= DATATX ` x)333?6LOAD FILE/9DATA( ]8 X 333?6LzC AzC A #< #<`jFzD OBDATA8 ^ 333?6LDdCDv@CC(BDC??DATA5q` X ȴ ?C΍?AHMRRR@  DATA(@ ] 333?6zC AzC Aee #< #<`jFzD OBDATA Y @ 333?6?w?w/??w?w??ͧA??C΍?Gŗ4w4Ɓ*<@Aj?g?i"B*֟6˜w4(@?C΍?AHM?w?w/?5?5SA  B?=CxЄ= DATAT ` 333?6OAD FILE/9DATA ^ 333?6DdCDv@CC(BDC??SRt m SRmodel 4-up  ` 8q .DATA n DATA nH DATAH n DATA n H DATA n DATA nh DATAh n DATA n h DATA n@ DATA@ n DATA n @ DATA n DATA n DATA` o H DATA o ` DATA o8 DATA8 o DATA o 8 DATA o h DATA oX H DATAX o  h DATA o X DATA o0 DATA0 ox h @ DATAx o 0 @ DATA o x DATA oP h DATAP o  @ DATA o P DATA o( DATA( op  DATAp o (  DATA op  DATA qX  X DATA p OutputRender>DATA p RenderRender@>DATA p AnimRender>DATA p` FormatRender>DATA` p8 Link and MaterialsEditing>DATA8 p ` MeshEditing@>DATA p 8 Mesh ToolsEditing>DATA p  Mesh Tools 1Editing>DATA p Anim settingsObject>DATA pp DrawObject@>DATAp pH HooksObject@> DATAH p( p ConstraintsObject>DATA( p H EffectsObject>H DATA p ( Particle InteractionObject>H DATA p SoftbodyObject>H DATA p PreviewMaterial>DATA p` MaterialMaterial@>DATA` p8 PaintEditing>DATA8 p ` PreviewTexture>DATA p 8 Radio RenderRadio>DATA p  Radio ToolRadio@>DATA p PreviewWorld>DATA pp WorldWorld@>DATAp pH PaintImage>"DATAH p p PreviewLamp>DATA p H LampLamp@>DATA p Shadow and SpotLamp>DATA p Texture and InputLamp>DATA p Map ToLamp> DATA pX Mist / Stars / PhysicsWorld>DATAX p0 Amb OccWorld> DATA0 p X Texture and InputWorld>DATA pP0 Map ToWorld>0 DATAPp(V  ModifiersEditing>DATA(V p PShapesEditing>PDATA p (V RampsMaterial@> DATA pؾ ShadersMaterial>DATAؾ pؾ Mirror TranspMaterial> DATAؾ pؾ ؾ TextureMaterial>DATAؾ p> ؾ TextureTexture@>DATA> p ؾ ColorsTexture@>ؾ DATA px > MagicTexture>DATAx pX~ WoodTexture>DATAX~ p x BlendTexture>DATA p(P X~ Map InputMaterial>ؾ DATA(P p  Map ToMaterial>ؾ DATA p (P ImageTexture>DATA pV Anim and MovieTexture>DATAVp Fields and DeflectionPhysics>DATA p VParticles Physics@>DATA p Soft BodyPhysics>DATAp Fluid SimulationPhysics> DATA ^ 333? @DhCG´DpdCC(BDC??8q (o DATA b 333? CC` @F>N?S?DATAT ` 333? SELECT FONT PATH/Library/Fonts/_1/../../der (b)/../ (ej b)/../d forge test/../d2005.blend DATAX qX h H  DATAX q( X  )>ac?o?    X @ a a DATAX Y 333?X ???Qz<xЄ? ?%% ??% xЄ>Qz=?)ܤo)>acac?o! Pz=?)>ac?o????Qz<xЄ??@  B?=2<=CxЄQz< DATA( ] X 333?X zC AzC A #< #<`jFzD OBDATA ^@ 333?X DdCDv@CC(BDC??DATAT@ ` 333?X PMSELECT IMAGEc:\blender\2005_overwater4\v\Local Settings\Temporary Internet Files\Content.IE5\PZRJTL4E\ow0031.jpg @ P9EDATA( q X m==o? ( p i i DATA( Y 333?( ?3?3̾n>` ???3?3>` ?n?m=1n;=0=_?9Ab4OAzC>` ?n?m==o??3?3̾n>` ??5?59A  B??==C̾` n> DATA( ]h ( 333?( zC AzC A #< #<`jFzD OBDATAh ^p  333?( DdCDv@CC(BDC??DATATp `h 333?( sSELECT OUTPUT PICTURES/C:\blender\flag2006\render\python/../der/../on/../wi2flender.py `LDATA q ( h @ $= =o?  @ mmDATA Y 333? ???xЄ=????xЄ>?$= =o(*Z+_;?%AZAyxЄ>?$= =o????xЄ=??%A  B??,==CxЄ= DATA( ]8  333? zC AzC A #< #<`jFzD OBDATA8 ^@ 333? DdCDv@CC(BDC??DATAT@ `8 333? Save AsEC:\blender\flag2006\wgv\Local Settings\Temporary Internet Files\Co5\PZRJTL4E\wind2.blendTADATA q @  ?I1@AHM       DATA Y 333? jW?1 4) ) e3kW?3M4!4,$?mW?) 203{ 3?) jW3; .Z?k?4o ?) ?&4W?kW?|I1@$ٳس5u@,$@ E?JӞ04I2K2Ը>(N,AH:A)ן5T$Á)@?I1@AHMjW?1 4) ) e3kW?3M4!4,$?1-?0-vK>yK>SA  B?? m;=CxЄ= DATAT `8  333? OAD FILE/9DATA(8 ]  333? zC AzC A #< #<`jFzD OBDATA ^8 333? DdCDv@CC(BDC??SRt mP0  SRscreen@    H ) 8q . DATA@ n DATA n @ DATA n  DATA n`  DATA` n  DATA n ` DATA n8  DATA8 n  DATA n 8 |DATA n |DATA oX   DATAX o  @  DATA o X @ ` DATA o0    DATA0 ox  `  DATAx o 0   DATA o x  8 DATA oP   8 DATAP o  `  DATA o P   DATA o(    DATA( op  8  DATAp o (   DATA o p  8 DATA o `  DATAH q @ `   wH P 8 DATAp8 Anim settingsObject>DATA8 p8 DrawObject@>DATA8 p8 ConstraintsObject>DATAH ^P 333?H DdC=PDPAVCC(BDC?? DATATP `H 333?H /9DATA q! H    8 DATA! q) `    | m=a=o?{{{|5" ( DATA" b# 333?! CC>??|?DATA(# ]% " 333?! zC̽̌?zC@55 #< #<`jF@F OBzC̽̌?DATA% Y( # 333?! ????????| m=a=o?p=A< WA??p=A  B? #<CDATAT( `% 333?! LOAD FILE/+ant/anters/eget/e/../a6.jpgndDATA) q!   8  ??Pף}}}* . DATA(* ]+ 333?) :[CW8]R@?zC@CC #< #<`jFzD Hm OB:[CW8]R@DATA+ Y. * 333?) ??? ???? A???PA A!O?j?}GCHB? A  B? #<CDATAT. `+ 333?) /9SRtP0 mPQ  SRscreen.0020 4 X4 9 h9 J 8q 1DATA0 n@1 DATA@1 n1 0 DATA1 n1 @1 DATA1 n2 1 DATA2 n`2 1 DATA`2 n2 2 DATA2 n2 `2 DATA2 n83 2 DATA83 n3 2 DATA3 n3 83 DATA3 n4 3 `DATA4 n3 `DATAX4 o4 @1 1 DATA4 o4 X4 0 1 DATA4 o05 4 0 2 DATA05 ox5 4 1 `2 DATAx5 o5 05 2 `2 DATA5 o6 x5 @1 2 DATA6 oP6 5 1 2 DATAP6 o6 6 2 2 DATA6 o6 P6 2 83 DATA6 o(7 6 2 83 DATA(7 op7 6 2 3 DATAp7 o7 (7 `2 3 DATA7 o8 p7 83 3 DATA8 oH8 7 83 3 DATAH8 o8 8 3 3 DATA8 o8 H8 2 4 DATA8 o 9 8 2 4 DATA 9 o8 3 4 DATAh9 q< 0 2 `2 1 Cdh: p; DATAh: ^p; 333?DdCIzաDPAVCC(BDC??DATATp; `h: 333?/9DATA< q= h9 2 @1 1 2 dDATA= q@D < 2 83 3 `2 8=i>o? d> B DATA> _? 333?zCAzCA A@FB= A DATA? YB > 333?????????8=i>o?fffAD&@??fffA  B? #<CDATATB `? 333?AVE TARGA/t1.blend9DATA@D qJ = 3 4 2 3 8=H>o?ccc d@E I DATA@E _F 333?zCAzCA1||1 A@FB= A DATAF YI @E 333?????????8=H>o?fffA*@??fffA  B? #<CDATATI `F 333?AVE TARGA/t1.blend9DATAJ q@D 83 2 4 3 8=>o?]]]^dK O DATA(K ]L 333?B̽̌?B̽̌? #< #<`jFzD SQB̽̌?DATAL YO K 333?????????8=>o?fffA@??fffA  B? #<CDATATO `L 333?OAD FILE/9SRtPQ mP0 SRscriptsQ T T X Y h 8q QSRDATAQ n@R DATA@R nR Q DATAR nR @R RDATAR nS R RDATAS n`S R DATA`S nS S RDATAS nS `S DATAS n8T S RDATA8T nT S DATAT n8T DATAT oU @R R DATAU oXU T Q R DATAXU oU U Q S DATAU oU XU R `S DATAU o0V U S `S DATA0V oxV U @R S DATAxV oV 0V R S DATAV oW xV S S DATAW oPW V S 8T DATAPW oW W `S 8T DATAW oW PW S T DATAW o(X W S T DATA(X opX W S S DATApX oX (X 8T T DATAX opX `S S DATAY q_ Q S `S R RRRS`] h^ Z \ DATAZ pZ OutputRender>DATAZ p[ Z RenderRender@>DATA[ p\ Z AnimRender>DATA\ p[ FormatRender>DATA`] ^h^ 333?9EDdCNBhhD{;AH[CC(BDC??SdDATATh^ ``] 333?9E/9DATA_ q` Y S @R R S RRRSDATA` qh _ S S T 8T 2O=E=o?aa g DATAa Yd 333?7???xЄ=????xЄ>?2O=E=o~W::?$ǝASAxЄ>?2O=E=o????xЄ=??SA  B?=CxЄ= DATATd ``f a 333?7OAD FILE/9DATA(`f ]g d 333?7zC AzC A #< #<`jFzD OBDATAg ^`f 333?7DdCDv@CC(BDC??DATAh q` 8T T S `S ?C΍?AHMRRR i o DATAxi dhj 333?9'  % =DATA(hj ]k i 333?9'zC AzC Aee #< #<`jFzD OBDATAk Yn hj 333?9'?w?w/??w?w??ͧA??C΍?Gŗ4w4Ɓ*<@Aj?g?i"B*֟6˜w4(@?C΍?AHM?w?w/?5?5SA  B?=CxЄ= DATAn ^o k 333?9'DdCDv@CC(BDC??DATATo `n 333?9'Open Text File/Applications/blender/python/../S2flender.py FSC8q WSC1 w `u v v Զ?!6~=v < dd??< d@??_@@@????L?fff??@ A////render\wi//#DhYDATA`u Ou .G DATAu Ov `u "a DATAv OPv u cБ DATAPv Ov v .? DATAv OPv .G DATA(v N,xd'=A@DATA< VZ ?o: IM0y IMow0031.jpgc:\blender\2005_overwater4\ow0031.jpg(f (`9 { и (@v DATAv Qt DATATt JFIF NeoGeo_C     C  @" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?EDR2@V{CsS_\}OmİKEG jBʄoshÞhiL0ܕ+DX ` 8&6no͢U|`+:N}kz[r?Ue<ZJLCq+j-)UvOJ O Ap[! K̽A9- ED5?2LVy-)ڟeItܦ$lbRXU^Qv&Z]X 3HwVդ.k>KFv:-4c%$]c#Ƣ%;gKpFd{STr:E9%}eJȆ26&{R>N!Xex@~<"Ld(ܺ.7DC}rO͖-ĉFu 銞KiEG+HېGc?X8y2}蹤ǩJM0 54 ȌJ3.kiڨqXNZxVoI'ҡT5k*sV A&x(ZSq#6'X!x.$;dJQg}E-RpGMTblzȒ6LX*)msh3VOq"8Af;98橩v%Jd>G;aܓ 4@S!3H0OV,GS-2.!l^(슑nW*2E-V6>L}",%A!jS9p!&^[["v\TX=EWPئ{\~ 1nqT[@MDMN5Rڑ.<޹g; P V ZP櫴Ғ)~|><) ʐ+<2wJ|0˜(aւ(Ir;{9v4e s9/Ɯ.C͓PӹW'#֟Ɯ~_rjL܄h7Lr[Ո8N\դɻ"[jix z6$o*O6k~r+y]ݥA?ZYnGW+ G-'uZ9|5 K+9f}B qT&jQ`˾OVQW"%9=VU~fI32XI&MVf| N~rƟn8ؑ۽M>Oc'޵kyVUs}sI@mOCC.7мI:sUGCPj=M`v?Mmjbp\Jײ/)R_86Fзg1fTduN@5$ \󗙑CS|^6U帶8߈\Fׄ6= Ōz1уTPrm*©%2)%n^cY~3U.-8-l ,߅Ek(QfnHWՇ?Jus5|Ml&>QBrL-vm9?i">ӊ?o;)3=lY#Jbu_Ԓ6<#)zt#d'rZQC>27NKfP~^"~4cN) NTlU U{[r9l5ظH*J8?F<6rj+i.G$Tr@hI-?M%> m m=EOPⴇb`gNi$=p*Wڞh\aQ5# ;k sZi8/ҥfQE;.l# Ml[q>2?P$PmŻ\$:7ZnE zCœ})p*յЯSyLǕ^FQu;)qZ eric9_pQY'@>n*Qt~~ڳ>u"2)8VEњ2wȭI?*%ݼģkh&NIi{sƩ9v%"eyujK[\a+%ɇjH'N%ԊNVMFjDn#ȫR-5e;=1?M=(\jq؊-kQ2=XVN/)F=EZ1psttNWݯ˚Iңtqf-uikFCȹIBIԋܑ%h=_G֠K.pEw LzVrhCDpc4iۗ*ߍZ]4*+3=V1Jµ r`{ kAa'Rr)E.;`oީ_UR0H-dsuJ̗tO\)ۋaT~>D}(Bo|P4ٴG )7Ϙ>e$d>$T1wk?C,N"DIDe`ۓ5>~[ƄrZ6)>>\=*N bl0OֳRI5sK*VpM[[$C\m-'6FIlB4=`nApFX44S4pj$P,hHW1I,J,@hrMG)?ED 8<*|q;a*dfr4 2d*>J[jB4@CSHYrwEnUy N0 )q E:KS@CM2HܧZ-C>RnΝ2铮Wj³ӚJϩˈwܷ>q᳇PTZr߻dLOjhn>N[->X$q=7UG0(*D gAK6Vu,N<jِY2ޡBT, 0$ Fs>1eWd!PH>h6UiT}ܟsn݄a p-I0\Ӭb,• @xQjTrԵn[L3[vZڱE? ["75fh#DFB>~f 7^P} pt_CKC*itF בƤi^$/TP-5G,FÙ&)c޺*&$t9YqZF&T]wXriHX1.*~oOd\[]G9HcV.x$7Ҥ+[*6555,ji6of-Cޘ+ }F1\GLgܭ4,u+Wm+o1NQR${)gjK-ZhQN[=VrϱR`HXA9/n5ZwXukR]V4|73Hxg5 jM)l}jN ս.*Xsi>f5R( ~c;4Nj:/Fԍg;:tDX9<~tI]"ݺtnH\mTT&>L`7'ڢ7Ӂ5ihe)G1lv,>͘d9 T.f'Z(řдҝ+Ug p=9FYo'N*[Qe+]cv}MDģ)!橽zHoUi*:iH15q擻$z%ێT-4}z:莺tvwm,DW.,?pgU'fPASVKYwB VFwv+ ߅!o&riTǟa3m3TnMI{'EZ;l֊pEG$tn<=(%W7J9?Jk⛐2k=Mሦ<%9*cc&i1=?Ji2W9\zM!)wjO5I:UfM#?aW+SGH#U¤ 8 !Ĝ旯QMygGsRE'} i8Qsޘ?΁華n!"ҥ3"zOIڧ9il̛H#*&u7[#m/foɧH܌^t9.12#%Pk5&C1t{bCG@b&'=ӎl%y,._ ar7֒~ry VhX}*'gL\VYJsߧ4b+55byCL t6w{o^H.W>Vc9S9m ڌ2~8[3 Z8.1cTf{SsJr{-Sʰ|gj Trӻ4S 08!CDWSF#dUn0e2r F ۗtv *02h]RPhqsd8ƃ,hR.yjppƥMmmhܚ%:BES5 /SC)@B} JНBMfUU/$ YS6gcD-gk)ppjc¿4͎FƘ]C#Tn\>߮yN[i@~SbM#6;f]b?,LOҶb9)֗Er.f9?ݫ6R)GEFD2ҥɴ5㣷nK8?Z fjgQY+X2@z&GW&1aAPH"L hYD >GTY; Cijք6f\U&xղ[}Q l77@XLQ\bYN#[S&n}ӁEI8-xe;B>RKREh.I32L>UR~ ׇetUSw }*EJb+9CH>]N O}1U6HoW]yk|kZ}ER=Qgs%|7pIPQU.COhY*iWRh6ѝL'y UL$",7gT&*R}9Q8 mL~4'u'`ﱲi^\h1(hG*6D9W  `\t눛;bL.j\\YƻvΠ'BTQ^B"\3ՌPE6T}>c֭]B|+.xG*#?c.chr"T<2c,j0Mn4{14<8Hit"$isЩ{7*҅&74,8 gs= 4ܖ(r\EL ܊)|{ThI3H9޿C<{gLNh.s65M"x4銪@5P9A+9)# IiKw)+iNȸǸir}YtɆx7UOsņܷymjaF~ ϖFq4SKj5bE8I9Ci:P.5bs00ϸۢUk]F#.wZGR|OӭG,ZdSVz%݀>iCt لL텉Ojֈ̿H--۟(JW =isX&NN܊ͧ2g`X5/6ojcZP~ba-]l`eV:YbGA{DžF&?bO88<`78دyʄN2]0>j3N6c][I)[O>\FG+Eh霔:]ZPLºf0fhw&旷ܯbΆ9r}*h[zi3oƟϮ}$&]wz|Vs J}r." N# JnTm4JVZh`1cU&LCK%j8-\ ŽQK- 7¦# #5Z(@YKQW H#"Œ3gS\إPzhBJB8AiYЀ}*n2ly#򨦰q5e$*6i /枡wRI\2W<W())ΫUӌVjC94N*Hv\&gګo궚;t3Ui@> &Μ"dfcsZdՈ䔂mBZk-ܩl&nW"ȸ215b)ܪSjRF)Io;F3PKk#Sɋ4g* * ֊Q DWQ%^؎.,Oq8I,rHX}mY:!zC,{˹If%OTv7G6w80">Z$-Ï mU9F]QisSvh1w.A8xUcTEN8z)>ى)=G)>`${0&hqϤE;HHvw0"\Ve )lYHUpu?Y;`D ƺfuV.+֙#c{-Uur $g(ji-wdCT'5A f;#Ԗ<Ԏij7 XJNOStvIx '̠֜R(cS04QM.qC&z;'@콿Zi3ƚYOz{To;6;̠t0Q4㚍ٺd81l }L? rmf2naZ <6:~fM|Њi u* Z%ᐡBS.cEVHr2?*_OZ6ϰgǹr@ U.r9/-b8 (X[lV8moR(S:UrO}ɡlhuUY>bO 'EHli =Hz*į8 UiV* /_U~'b}wR"k.|^{r)ʈ =^GRWw{"7Uq{ig Rq{GI{v֦jӼ+eabR;v%/ Po9@'%C-@ZFSf?Pif.MJ--Q\ɕR ?~{k |Kt|p{QӜAvF{leJkJo{tkw p\`I!`caQm|Fr@7~Z}$rcVntk6ɏmm" {5ifM3N\=/v%l*­V,gK864^pk'-M2S6~VVuSq-mvgb=M5#ߟ805d<*0d3Uc.Lش YG)K#3a=c,˒ƟoI }*}3=5} S.Ԡ$:Ϸ%+j(k>N.2Ppdlz&mU>uhGM-'V#$1,=%fTWN؝[ί}T[ګ~+i+jcis#ެ28{U#)-ҥlj gONcf~i !Try/)F}~HUD90f.1 }($GS^cH\U$ឋ6V$Q p*^OjOn[\A?Z["yFK/<~_3V$&yٛe_lKܻ`{Sqnq$5$Z[nPy[UW\I 5QZ f eǸfM4-lTXs\b#Oc>`n[##KaTHw$]B݇߅F]9RaArQGӲ.f7R Es>o-@Vrb}jޯ˓lN+5?cPڛԫN 9?Jt{2Vu hGb c]8L\%z9lK{Fc gNJ?Ӝˬj=NMgK{q9EFkfC!$3j7bysl$ %HGR*' @F4sOsҩ!#g@zTGsEp.if5\i4Li?)sȥiH*6s4ΚGcLe$uNnN)w4[bl7QM0~&Ϩ5.OҒ[=s澥I#Zljyl҆j+@qOYYqZN*vji zl̘dEUE@dv,fiki}J0OEw WrkR  TJF}L,u+K}wMLbC58ȏ3ǵs [ +tY$C[Y a73njyʴVío?RV$A}7dz6H Z3^ڸ%>VK;DB-zo8A%1?U۶kvoN*dsD F;M6X.D md9ܚ̀t((d5S>vYI1RnC˰JȍR$) "'Qz,++|ăOZ*sIGQ@āI g›-MT3OsZF Ub{k9*[9m'S횒,ܣmɫz`G֫X"E(;v>¸C{xR?]$6?Th#<7 {Tܣd>´_IO& r)\ {bCi*1VцdCqIͱΙ «4 ֬NyQ˥H Kfl&I-wy1;=cu߻\,#Mb2-oMtoY'4˯ Erc WT!et\8N𵜑 @+5d3n*u:5iG)2^=9D%'G\UY#DcP#k6NĊqSRЦ/a*Ř#_'ҩڷ }m 3Uvgܰ+X~oӭ'ݫcu8JkMGU^]8!۟qIV9Xe cNk:Qʙ/Hy'H}9 `qK3# h˦ڹO.;QmvsjܞQ<-vڜT;ЀGZ/dZ.o?YK5J/ms# ٤T[RVgG$do’\+[K y96}*yr5*kM69#m]vEQatdGyqڵL &m?эg-בuF\:6JVRs >џwκ87jVAQ-QMͥPO0m+b]9xϡ  /#^eYMqnHϧ{i|SɓZb4ljTt6?j5Q61VFƌZ eO4o#n:T˱\d`lmڛ, QWg1wV򎊦;KbȡE4&}Bw"⠒0km AUj[E &]lifx>響}(;}-uqs$$ 7s/ۋ^*ޘG~5;.ϵZ]6=,%9*>*TbARd{Er~Y}7UYJU!4C>&[碫\a$KHC'k}Xԭ5_bNjķQĀ58f{d6U_\ҭEr瀨~0y.i$"flHyDq$C\@JǛUq\ڪ5}}JQʖ%#YaxVx.Ǘ'|w ܪ:: oE0p[8_ΩUij]+lR}Ȟ2Jbxv U3rSM!s 輄5 ѓGӚ};q*MLgǸ\Hnm~qzj)XТK𦮌xW؟_V6q5`^}Auڪ)y}sUm s1#~FI[5 ==儃q. jYd`+tL{j3<`})VlD{mͯE#Zk㗟cY`j,9SlTAs>=phT{]5<s{DDj?i cqS7I!F+s^S׊l $\tqI4  ~ȿnem!k6j"66RC`cliqR߅[ZZ| ? JyC>!H,#1ZEss;M㚮n ]c°:S qU{_ l#mJ9!}UWA%ˁG*'đw\֒;nr^ #ۊx7-.} uo42xZC&g#7ؓܚ?ey#&-TGSJ] UG溏÷#z{1ؚ~jFlrm[66G7Ԉ^*WaWmH8TY\:E)aTq܏ < m&;tQXj"A*;9O<`mxA ԃ7 km#ɴ;U_ަշR+>Ntco n$\sZ ݙTvG>h0iH'#54>ԌFe*:*yBX8UZm"V8VY]vpymh[jy V!T1N]/p'Vi= ;H|䄱I?^Ү:+c֩>"ҡFjIhE2=*G8#CqYS dwMD)4O\sp@~f*A"ߕXyj}R]\M*KKR bڜ)Hā9(5>bZ+=PH8G+U}jY7'@<֛}U%{<#R3I^'VrHU.-7Ԕ%9R930hymTf6n}):,2tBqc$ibz^#'6pW?Zr@jG{= ~4W3"ڏơOU+Ï SPL-O^3bqH:7F~B>iN{sZ#Hٚr{I,r%hWΞϖ]V7LS x~QlPtJ^#sg4ϭ,vNWRgCaӮ_N;VDO{&N4߰';?V*v}t;Z={3ێXhhB.3mRr!E6׈XU#܏g.ICX+abfСK#(8~*]h˩z[Ц~ڎhjҤ6ek9U5.Iє$zSLxGҴ|C=1Oͤ]P>檜z#;5wJ8X}Em.OK~<{=41Ns ?Bmlc^8I@iM/gޏh٦cG^!ɘ/ і+@4!isɍB(mZ6EEs\c$hAxA\I3 f ~52B܅_?E*332s-mY`}yҴ`1ULNcr}֪W0vmBYJךq0}*&?z@sV.~AL\S-Q=:,&l;!4˚mL`H8q-K-M5 q K G{G3Qnrq Q6K ~őՖaKoc SR4*(^$P,aX iaLR6}\IҮK#9K.kYl{fTSq4{F#lA䰫[ُV|VYG A>y*?GM#E51և{)w}Z}4mBj?c?*}7Έ?Z\0Ͼiig"9 f#RY9'7~_7 w-,;ԛc#>J+W'sr=^E.qqlYO1z}qTcU@w1OF1ir0{4As?Jw@r\S' 2Q/?C^b]ną`Tk!ş[΅`lI1C q_"Oc۴lTi wr$2y2~py&5 KNe9h֩,-PGnc,l۶cY4RF[]@Q=C{SQCk@O- rdA$S "}@7#g+уѣE{b>Tn>|";\`{V?QVHRlv8sR"ِw'ڨo~BD3?C|#8rjc?Uk1sv٩-UuG(srNqP5;IZ_ޓWy2{٩RIafѪdn \J}dbFG a4ԻxVSTq&RUfOcLXm}¯hjt<e)`^cR}!o)9NZ-Ь>hTOcԁNK 9i@hù} cqw)FH47@5S)`1TeF MW%1Mh[~4bOzNĈ Z$a7M|Kl>ihs>Ďȼ?*^@ط֘ C,QsY86N}U6[G$~"TNW5;O,ց?'e?rZO.~zM;w6cӞ* mLC 9MgʲoʿM/1V9`9Ռ.ʪ|G£M'2JOM/lz qJJ)KrzV'5e79$)Hlz\-mwWE'*1HOjd=vT<@>f[oREG "jNkDXFj7& (Ԋ#-XxifJ ZHH?JMŔu^LFTsjxh˟fkrOR'QMXLjj}.$AS֊XLFn諏Nmm z8#6Et#GjCGH>d<ԛ-X ™4evF^%ӚKT$fWEjzz |ж7D7|9sׁ^ e|#_ ^!$k=fBRT|d^'G\ٞ?J>|5yk~ҟ -b.5 1 '&f;" zWmSUC1]&O^/S}U<]h+=HtS?|:H}NnxD2](? 73ZnͿؾ*y/ٹŀ:Pk_ٿ SǗPE׃Q5k rn~q%*MfR8܅H dvX2}Ȯ~|R^/c=7^b7DX B@ 1[^N9 ?t2W|alH0O֧]BAĐg4%#-c>rGimpLp'' +(`R[(nPȃUjBx#&4]fȓU{|ү[i#3iKirچ:Y!Pcڤ#5]4KTђ1R$c\R$*ffU)rZ5YdI$p{|>|}hM:,~j*0qgd9دgUsH'dGF*V…vQXU܉Fs,qNT8f+g܊wH\E5c;30[Z&_sZl aB~4s@Xփj`DJqy@Fhs=t#4-(ss}qQ%S 9vQ b[+iyیR K}&eģ~?DlӚxw')~ƒ6PI4⹢MetF#ƢK?=<ԆV3ihu=ES4=$򞭏¬$og[)8ʃLQ*u tieB.Ǣّn3zibFDC?IG҆' #T.UU"{#U N+1s1K7H~Ok&'hf =?tNRefPeJA37 8Y 0*Ҭ>SqCPқ3<ٺsTeI@uHmٱK#r'o=Fr7Q*c}{SSDRi(ű?uOZfFFƚj ժr5tHl}5-?*sGaʬc5ǔj7?*[i  gc-~A:f:i N:d/Q>I5F#tqG\ *u(@z^Ѱ(WA֠V<1qhH*N}/ia\?tﱾ1h#^4gj=4㏘Fl oƇ:zqGfb`Fchٟb=@{Eq{R]4bs-n {՟NSC$Z(r}FMlc运c1SUTهc{RlIcI,sQ 9&/fg-JM$/Ԧ81ǍG@:9[h@sȫxAG5Hng,R) <>h>o'|+>>sT'QYqKUz2GCK9Y|(Sg?jZa9U H)"{W߳?G`;ZGZKk @v+%L@N ucܾpɕ(tB(.t mE8#͂G+Nx&ee..I 9V`G "?ߵ=Oxr34\3",|eFpaYeYv,927Q ׏~ȿP_D_ |XV[ ^>PJdKX@8$W0a, Q5{E%`0t b{\UR_˜AW?QUISQKdGE\Œ~~FFqG; xiUAa |$=1iC73%5UqsC[8ۃFJؗ#A^{@2W$8uRϭ&S7Z[e\}(6q>jiQcvކֻ#lo* o{T?1bF0)#hڪxuص1T\)#)\ 5:wt@£Lm-W*Dd*6zS@.%\85 Ű[5j;)c>z{SwF"gy(Pt@A^9m:vQ9[ 5I9V m>6ڐDBI2XÆϾj&h[GJI!n@ǭR.f!ϑsJ`=B1? uJ'٣5?N'8֯~)@??hO-i,IS~ )<Q̿uiu([*ٴeTƘ,hL?\gimŏ lC ss!&i[6ZZ`Iˆ2o%?eNmeJhG G4q!1nGR EnwsGvMW4<>QT#;ՏD%M8TϹ؉F\he^-"WIC* F#e!8oүc)sG;H:ҷW~;R&n!G8r*\ X ipOhHE7졆\( [C=% mGURy<ʟ2I?:f/tms?0|8I[~2AO-hJAj>Py(~lK)w_ҕm~jн)wVG󂳑OY=ލ׏d}%_3ڡwýDҗqCLӁ?JVCPaޜ}1J,S_ΤWhj_u  Ƶy_I塚:}Oؗ  _Fq8gKBU]0P|1$p+I3_g?Ư[xGik/ T`AX@" 7l>=/w2dPFRx ۻg~~/g2dQv#3 qjGL4`d_\9hҝkSU d#nV/ ZkYc?Imiz-Bj0Fh61u.12$ڷCjxa=~36d4CGQ43KvqWzĤɏ^zOB)_%#SWviETkZ%KxB^Q5B8o |x^X=^ .p SdW>QUqo[\șMGv?)t^bH"vاhWhrAhr~`<3 š^C8Q;.ƣ*g$wD4ngSZzGUd Q>4Je$QtԆ d]O,(L43ZC,?Zc[8)iHjAxdvTdG@WkW1/C\+\?h[L7e`>ej60J Z={3ڞrqrV sʐYGC?~[GMH,&ZQBҴP9时H6қ?jHҘO QX%AT j*37h۝r FDF.~Xe$R\aKRxm9T?oJjǏ?J15rO cGw?h *RV(I5Iumw%?%.ο_$h:<zkXLh1b3 ,w'+{mVKW?t`0G9=!Hin =w#ZFR?n~IՌN[Fe65|[1Za[\>hR^\ze+UTP2I;I``>X8sb_ۏ[?6xɉ~jhr ~%XNFKHE;`ڣece8'8Sac)=i@(: :)=M8: "^FM8ŬYB"l?_:>#3R,W œІ]Y S>>Ὴo//c  2󂤩$Eg%ƥO^u'tg+(~Z~_b߶cOVfRnmPaxv,?L\Uh{ݬ:㺰 ;S79%FPPxj@$ڨ֣ڢTYQ#9<4 0Y0g~-GC!T*Vk@ #ku6}j j 9,P5!nm8d7r*kf8G9R>$洟L$4fzlc@˓۽j>}Q=E5Y }lM eVZJIo~l k-<΃o8֏n/fe}i~։7zƏc/uzc <6A]_P2hpW&gqتjkP;jB{mr:kwm`:jK/!|k 6*VsȎ?1 ?B+%54ܟS1[V3F$ |VŹϥ'AO*͆NjA["elO\`hUFoܜj+A<*OH P3Ÿ\ }? `pb۠O=b*xf?Z@ǂ@+EcӷiϲPr2I3(fnրlgaFFW`5!U%-)t}K^d2˭d 3^1B꟰CMIH E!$@V#3n't.Yǡ?:mJWi|GϕI, a_JZ*ME(=M-@ R M9T Z*sIׁOQ Cs?Zb}|}ǨɧcNi qN)H +D|mVO<{mkEu C͜9p6FFH :nm>@"1vd;MtJ?Fz&H_nMQi!B|Y+~ԽZ ;-E>kp?}kX쑋\x5kvٖ\+N+ h"Sﳎ??!{#$ھ2Nh(nIӊ6jc[G F\(P_u ϛ$YTMtF5SX0T0Äp )ñĵ5V8my?sA"3Շ'?%5؛w#$Ji.H,K]EFs:1iuK5ig)l}34}؜3pEBtk]aw *ި~ Ci"Z>.CÚEw&{>xN;Ve(EiZy>sZ?dv,cK^͙qqOB)"$dRN)`~̠miS#;i^=3u䁑szZfGCS֩WGok2Ӵ{:6 so>.\Ox&y3ʽHZ­bZs=*%$5mJ.K"b9Uv>j5{kXs'ٙ9;q܏_lx ?:iO B\V@pTiG⏬( r{R^;g@GG*e}L *R$cS?) _ =$~4DD4Wc뚶*mwzcl//(,@Q'țb6ҧOQNN"i.Ow#PÙ>$0F>MIBQ_*< 2'#i|o?w##[JgI.30VD}͔ :ӭS[YyRg9~~,B`$5ޢ `6BJ+>-BcKh8Rco^~G@8#\)ZG}McJ((h_]xUXdg۸FJƸUP9~bEvC(lr)d2~F,QOؾl_J,eF,QOؾl_J,eKEYR`zQEYR`zQEY4REŠ( +="sN=)=))i\KEݧ\S9Ni[A!>ME9psQAȧJ*0HN(Ro_Z7.T;7Gg_hzit ƛ^nYIV ޣڧ!'֟2-ʖ7=8yl:r B7P o>X)o*x־WC~{oƦ`ֱ0 h0TqL*W}F1J'aW~KO ϵ Hچ_L6`prK^ȣg)0}iS2Mcp ϒ,QIlpj W>n@Oү-ÊkAҚ17hqفHmʶ)o^3qS}ZSJoٻ k{SwcnU-1F9b{?ȒN6=m"un}Bn2j%ЇT%%|ylRu^Tg񪷾9է"'>?˿~E'Gg_UB&ٍg*\u \.!ԓ0L+8xNȟZZvRVUp'}fqR0>O!x@E-3T?3]~QVw`]XL~CƟo+<֬\<xZP6Ӭyt~Q %ɞAo@UqA5^v+YO.Mĭ?OpM[`QUbp!+ZЛO9"쟍[`?b yy9 ,i,X{㎿}qS`ֹky#*s^gB =F en^dAZI;#VlsRJ1݋أ q_zW"Q,q2O&9c~bp R+ M22?K|Clo9 o8h6#nQ^y?$jXE¨8+帉U~&mA]m?d>n0~,|);;\F 3?<\?_uJW\{ɬ-2ẔA!,KAaFܨ.vWG F‰1QԔA)H#%U69P {Ѱ{G*6z6zZ(6z6 Z(6/Җ,MF bQ})hؾl_JZ(6KEY`zQEY%X;f^m9SAE+!](uB4 S9 $#4SPu=F)j.x 04(b:P$ E88Qfye m!uXc]Cgg߈:[2IȊG4vT!98#.{ i$4N3m;WΙ<]r)Eҵ xY?gfBɅId~$]uߑ*H#q*Ssb#ixxH77ŧBJA?_جgN9eߗRNy)?J>Zf}7Ȫ3U}#ǝL6*Ah8O.OBfka?ƧnQFj˭W6kQ}WȰl6<%l]@#m?Ux%VkuaI8Iqʲ䳳Tq➁c%o"H?00cW7>VU$\?boFVBG/֪]JLqKCk2X[)CImCeE=oGV?C9"W3JHCTt5xSswl[\Jm{[&gjSdU3_f'o8T4-FO{AO;-C4Ze/F,\nU­xK 8f#~nR1QTݵ!j~(hՈe 'kƽ3×`{\m+ߋ>?ƴf> Ktx# 3Uyں>?%-mO cɫB ̭LZ>)8Ю{7M>%7YT`/q.?SAK, ۦZoxΛ M {n YWEoH_;?+4޷_v/q{ۓw7^> OѾx./MsKUud0U1UU0P U6cfߣ/ /1q[(] >'E߅|uG/;Z`OJXUf<M|\ƾcq5PxI%pҘJ|x^|u⎫mDn5Cj+t;A+3}>_JPo HЏ# ^]4Kym moI0ii @=œ0pS?wn> _Mjub.IF UsOZ6 ^N NuM%WZ!z>4$%QUt) KEvƏ/Ө.4l4( hiQdcv9>$6oⷐS<Uqjs/哳Kg>QOsyaǰ?e.IIm{> 31 f 9U~N}lW"hIb;#_cYe_g(?5FJK?SAxQHa:j3E$?jo}{b'+:²05}/?sH1cJ>YCcH Y/>]C{Z. kjӑtXi? t6Y5#nZ? oaQ_cdBRyʱ[VY7ThǨK0}ia2HdXmȻow*'WeMcݖdU]5O~'X 92Ի0ǥŹ֑Ӷ엀c{GOa}?4s]jOfQd}FK63M$H)|6ϝJ:YيzQ^bjϸg]J:>N?ƪ67HO%tx3D2^L2pqhI ]s]|N#QR)=oa)ҏ4ݒ\Sz*ِ=<5u ~}cJ2Z\8!Pdq6;W|o>:QQ}Z~0T!H|YxI___EEo kEN8<ۢ/럂_z+æ{cT%6*y&'x1k 3*rN5W/MkM~ķ[N?_? ~'7.S}.A$y1`C㧨m9;Yn4oiH$/*NG|n'"SJQ~ibBdg7 8,?:?- _1HyJ>"7kv:~ +G nT>#`kv z%|^2Jti+na>,@2dǜkǿazΧQ/@ZgM?믟gO|)qX=8UmgH'Wx x&OOw `Dyݑ5݆sL_h^lTƫ*tcAݼ1̏|OڜX^ћ=>!E.HM CqRJTy5&xx"0ҧ37e=ooĿ^!X#p I&F>:fRi#͂+e,X2Fcm^>HƱHıC\廜ƹڞdʹdg5_u_д]G{d|34SP]ޯ}Cpm}#)n=`Ԋ] '+*?xwx5-R.'`䐖cIPe>L-(y-_f+.jr(9(=)h¬;RTQOP#Pv({SRoJJ(((((((((((((((pFX؏P(eM|h{Xҋ;OtcQy:[;am /?_j]Ȩ~xN>/4ڇ~YSgj74 7Q=,&G)!fCEO>Gf@AfAEY/G>>sGYCE[a'G4{,(ZIS149eإE]{Y@Ҽ;,;֐FF(ӛ_|eQZx]-w >,ۻ$93f,V1 cs>|Ewx+w i/cA/!k@՛٧nI1ƣmJïW8Z+toקHtC&>e,/ WCo&[t2W`.h$Y# Afi\Valɺ+b6O@<'@ ?n/op x dc @mE]֍Qb۲th>%,TIx>ox ްJ~K9z_Ss xX m[F^x"n;Oki۟*-t~xzoiYe/pW%Ld:n&f׻/D?l=ɸ./:6kjRCRBAXm; B[_JYY|?eˣa:ʏR >բj2'd>G&ϧ\_Z꒽ [/>Bl+$?w?% /"ʛ M/B'oyD2=S?ଟfdLv[qZS]By=~fn ba$KϲXK$2%[&YX<<1FDRGCqdjD_)̘G'4WoMh[biq1G>>SK@tDQ񆏜c}}'Pg~S~%?Ej<[V̗-gQ^wWTNlUx3qX_Vy<PcI]T xyEvsгfDA:yK↞HnU=OVoB#7#Pua4H̭8QO*>% J}Aea'?ƫÖ]+@[_t_z{Nxw,h@Gä?%>hYv)zRm_J>Oʐ蚺hWة}(=6@G>@9,ʻZ/G>>sGYvz6ztLgDi??O~[( 2FV?5/~(Կ?o,XԿ?o3R|‹+lc/StڀM~AfA{Ѱ{ڇ~ڇ~AfA{Ѱ{ڇ~ڇ~AfA{Ѱ{ڇ~ڇ~AfA{Ѱ{ڇ~ڇ~AfA{Ѱ{ڇ~ڇ~Afv>T=</A \0T>uP~T4}q@>Ҟ/@z4}0@$Gn3#QEQER4\ڟ})@MfJ~Qpo)h`5WQ8~t݈is5- 'X43=*QџB1Hh"$u$U:X7%U[X#u'+J!*q)2nkcBG8],.r,Aֲl)Ş8 cK<ూzGp2+5-畒%W,p+9ە9&)cp}v{!{5WeDPTu=#]Ac'W?ʼҼNkSkE [ZheGh cJc.'rJg~<4[eY4@xǐ~#i50 )x xnwR]5K2[,˥Ñ]#foǚ/:U ||כ;n⢳B-{[ױ; B5 |{ 8_/WWc!ޭ:-> oSl=7+>^әoIYAb+j@0GI3{A o]۬y+5}˜/cڢTt^S1k/c'(%!qA[U-Vc/p%58ѕ5_k3^X˰Tn ?U~QH>*ZZY^=8I}FOWNV}25f #knBr+_w{nc"솫5eP͞hAOΣjR=s8`xVj9a'Z VZLUvRg#ڒ?3c4Qӥz@ yFF=GFlQ@ 9G4@ NzR1~b€:R!ϥg(ARdzRR9H9 \?( ~񞊿&4 ;QGg v#(ҥdPלfȸ>MCm—Mݞy?@ǜd4#g)aciqIw\RRg=sE]ڗ P1;J)sQ>0(ԣʝ$R4z? )V0Nw`(QOC(E~@Ԉm5 9ߞX`cQݐUT$;mlf?-Ke$Io>}օwE5?j(,?x湉'Ʌd-|:ab?F|ְ4\&:ku  %ɮZ4  6=%[`u-.AqKq]EGrJo8]ׅm"]ʧV<('PkˬuS $ -.yx)r x.*O|LMVThG> "Yu_ }^eR:|9 {H=`$W}KWIlGu5 oq*^ͽwNlv׾@cK >-j?WH{i$ariiUd"vh A^4QyV/L"H|m׷FZnyG LPaܦ?Z K}P?Z=*fܨk\wh{HrSiJ .@#AYwJI!\~ ׭G7ՙwf̚39~~UiD*?vր&'=?s|@#NG~dzsHP7~"(S@2rb}M +}R?!@ :4~:+~Tr?_gZ+צ:87P+G$U lTFuxo?+G: ܚ\H3ʔ)=G@OJxv;R0QG# ցaN vt.:Mzg4?1?md9p(9i8rT!ʑIH~?S+?_,RZ:T^HPHH-I KY25`?Z5/A?WkJb-=- 91jlO ]tyT%.:嶭CK+p{}I)뮆 ;Y Xw wZ/Yuk94P3\]m{mżHj/›FYے:n+_͠%m=jq鲑[Bv 46T[ ?{NטYCT!@o$4h?WoJV?NE?u!_׫m$~e83~g/ěIر}_Bx3wB|E0/FΚ'_W!gៅ;q]e2k?lQM|*1_tNkOGSM>+ ratHc|9e,pZWԣ^P÷gWHrCX4E|r Q7>x$))@77_,>9sH%$iIkPy`(!ƛ%8~V3 _Or_L"z~J-jx>Ij>_r~{rGFZ m%'d|F7qN޺~HꄣݯdR i4Ki>^l'^)qz’#547dy\'?;FVo i$tBF*N?}]<'.z3>!x[E!ݖ{+$?dѯ~ i<>+)ܛ4M"]vxgH+DZ}_V|_In][^#L;Ao)?+|qiGs5%,Nւt9"n+pQZF~xfwuhre7&;fQN׳ޡ rwiyȢ>Şsn䎬 T׹Bg$yn eElٍrوMqWkUma#k D4>Szԝ9s'|+f\BOrkUj+C)k:/} y+20hX}j`?\Jк>e$DMPA˩BEn!'sUDunq?@Vr;ǚFgfaxTiq1)WC+u~"3щtadd}ʓjэTW P(/?)j]v_恀р>)J;@qmdM ,iE0vҩUp9[(viY#)P(Āv?"?LS22Lΐ>L);@\gڈiD1A2iw0 r/:o4 a(D} &z#R.qL?ʏ6~4$%qM )GC--V?4Zr~cRuCYWSïa[ƞ[UWS8 OktMRk?ÿ Ms5ם vb?pn>xoImL:[&?ˊ3W85 |6-cH>į0)jQ1?{veZpSt>C )6Fvqؓ7KTX[ኯna9]]~_UJ8^q~T/Tc*οRi#o?JܷW~&V¾ʆ~_Y"HcG|~pp'i< 2i!'jۧ٣5l-?j.?v&L5,BlTBoٹ [X}xzE,J}JUU?{Q WcqYd~?dG5 4GL6!ßq]?ڧJ;T2!! 쮿ɫO>%\F^r- |E^3_{LIJ+g7~8k#=Hl p^&eV7 _CkhNzǝ W|ph?֍E1Uۇu'7J׹5-tl+ɼZ}5Rf^p_Jy߉|E;Aݏ]{h(}NWz3Ԯ|(sGqk lO:]5ŽS A&,4ƻ#(qWkO2ģz=6LzctB|MNozdƠn~bY}OTvߩ d}z_F?$|'=LgVEt+ȷ̸a|"oߝ;J44GV2cAE1)7cOim8?:`?' b)< @f@##Zw) x t%_#2) &wZ0vC16EPQSP"h$y˜@&r(ZsIi"= ei|߭DYWXJ :+TAnqEiR7)wP4q\O"^/Kv=bTЉCiS{}H Me-X7o5*[PP!N‹ ,/Ο΢ /XZΏ81bh_ͩA1#-]6~K \@݊FWzRΊp#??k5(UYo#1_a|[k%)a_$h+?S:~U^ =W΃^!1@Y?|2X/GIBJ3.457u~UžшXi ?() |3gI1п ڿ3c^&d^lv?<2V{3]t/B ~UiA<=-njM ?S^h~+RƱNW6*y1NiקE|9/%e|Zҭk=M0;◀oX,߳o-s zW<>nHq֧m_PEZ'>aX:P䗮kL^Z'9"OZڇdҞ?J۴Ѵh8hi(qm(%8D?-i-i{֟pGGe42Z]cTmGgVºܱ V-8+.qN ]:rV PuxOOQz~OXe&ǑRT4ߓf^l!i?GWQ1{Nwhᔗ rl-7_fD$-E)2HyPM`Wɯ.KiKYjՄG0S7fN7g*\ øRL1O{ S?@WHIF?W=" 3ׅƚ3;p|usOEc밶5+ouX`!_2l!8H+F3vG(7?W'⏌w 엦˟\uIեoG5d |h}Ӂ"prI5Y?n_ןuٶ; ׈6PH,O1JqΓLMuH qj%*Q]f+9덛^Oa#HUX:vBcZ U&s xFi|<K[Ӈoľ>5Mv힃p#Y񶡺H4gNY5r)lq>2BiQ[ğm'u1>fQ4vSt \n9~ԋTF}Z6 ꌗFd5239m&S9, z1PihjHh13 *6*f:t6"L'S<<֤l?ք1@bji}֩~?ҏE`)AOJޑfk:cȭ)Bw<Q-#it/:Y;mB6s9?HO TS}rͿ!mv rK*:n8z/ݝ?^'\ejҸQA8sRnBXND?*ٳY WZkC Pzkbφ2N*sɓ ̈́OMZ; :ͥV"ڽOC7)['&j>8|ySA-?dG i:u')m$V> HαXnK6hXBK6{ ' J6?:Qzޗug6M-`8`*$X^7AtG?Zz+ bDy)jh*RoOΣ*4 Bzpԕ$@~bjb[HRzEyJ'hRzRNz xpu, `QڤMzƕ4-rO֍+ w0OEh_i+؟g+MoM ԩ?ֺ5 [mVKh=>So#q?qzSIf:NqLsk;ٗdFdFl*Y?5=8Mt:w`kuj XO^uIe7hN]./VY="ykO&?7ՠִ|7ólh5F2\=_(#]/`РyW?4gaL-60 k T kƀSxձyt_=Ntj,7Nܠ(4Q|en.OCWh/_8trwqw_%$u=ꏫיZ.X/H45=^9ovCŚmzʽOÚU=6Pdxï3Şx{&qƽ~)ǰ3Њܒ6y]V|gU 2Cqm#&b?F)a2?xhG;I:ϸ#ۧz7W*kQsNz"J]AWϽDGwG.UH\ yypkYdeNI[m/VhO-k74w`GHm75O:2=kX 4ܽYq/XzMy.%kN}#zJ5F@O\qt%~=%)8Tq~6^ /H"şoM[sĎRZ+RD5 0B&qkΥV~o[?ݱOvK,뿰?搶kU/Y>kʿ?^D_zg͏^Iz[\j_J&IDu<ß<4tn@n59q0ml㨾Nk7Nz\?f$z8V7$qNU/<_"|CJk>!|Wj$5u}{fOq+ }x?>W%=.Gקjkt𯂿(DFodrH:ѺP8'/fSq<>Yb %Q+9`p9;7)mxځռW;RSu]$Mŏi>xA!c[2 rBA# ί|@ȫS~WZ Xeno5hy,@=95W9/O%ou i dl \Lcx8ᯆG2G޲xzK8\u+'8ێ&cVխKy~CԹM9pj5,HIk+m2JzW;~#BҮe ^\[$S_T}^'޵|A]4V!}|Ѩ"8_@+δk~ Ux7Z*R~]K{ǥYMܼX}oԶ #Vsio]j!&l? ֝F-aMk!Ǖ bU4ZvyZ>M_X#1_ܵ8[>#qǩ W3~&v1젿 ^j7aQzf;x]Qć Ayr6=Mu'\)-տk:vߞX߃4WSl%3+rrOֽ¿e X5a;)l"kqEi?FOd? t ^Ik8k/^ݣD}^}ٟ@*Zv 5Ђ.E`95󘈺ⷭDzto^ 4Ҽ#F3],}p!vkѴ/PlɮZQ3Fs|ʏ7o0g_ fz˗ %AZ4r_)jQ-5("2ZGQ|sz0u-SvfD5qvW%<5u~/ٝ\Bl-yȭ``37PA{h?n`14 q@HvAhAsWR~"Z%6 Ь̾aR7 Azr?1L9 2qPo-Ǚ_S5E11u;f[!H_no!M$XR}8?Jp< ?Jk0˥j+[y 㞔yiE8+TWVc>uLBI*[;0=gŧvL0/uM|O!{5XERi?C%ys.ogaI/K~gT%O,mw mx7H]Ɖn7\ ucPد%RL05U9]_#oT,^A*.Śg\C [Z"{@k{X=1Ɣ#GxS>.&Yf|BB}^[75?ar??aφYV!\?d+%Y: ½*XEi&yʺT52ZX\gbb?~|Fu씠1^-9F&_8/#e<ۅ$MGpGzP=$8 s|~NYq Vx~:Gk:G&"+Hߩ -&h3ZMd;bkAf?.ͷKl#%{^"(DT"\T%/{_okvB ;=> \ aȏ=0ۓ/L[V.7c 98F1YI榏cuf]Ks݂FYĽjn4!` MNv'b )-m%򩔒#RfMcum nkW Y)/_QW-/#7@V3tSU>$9͆IJ gd O ~v'Ÿ آYF(Q|kLyڀѼ9@VJ^MFY@|u9_KHیxVU -L87?޼KAqݩH ǽrVgE<5=mT}׃p,!("Ծ#j]Ale5VT޵Nb?:꺕5ltv> Ʃ u2ǻ?QES&\~(Mi xۿ% c#㢚GnƼ|nUҽ7_~G`C؀kgQ 5tL }\LjC  ȣL^?C/Vv=,5lLVy'~xBHMݫs<%湯៏Z{Ӽ[ 3i@ux%ׇQp$բZs!]BOG3uZG0ԋc^Y_ŶLu؅_hxÚf03.ik1c~Წ+#&vH_ċw*t5\/>3Ċ ʻ}֞!Z˔=W#<1,`WO$i?;>=5e^돎+~]/UUX: lWվ'%oMºmcZ&yv2:)20Кe{bFC+ieǞ룝U]%"h#f3Ʃ~?-Dc2؜+t~,o,a-p*T0x~?($%,L$$2209BkbfJ(L۟sk @Psv H᛿󣍲@FN8{ֳ |/n1R\v'?ÍQd Vӥ`Lip4?L+cץq|Iߪ9ȮjLJF-\߉ eco ?>E{TdNGOQ>?k6Z5;q! B琤WN3Oʹ:O_tS k ""e?5*y)Eß:ŗwOR=T޼OQAG@˃%Oh=OXœf9M "=_ΆWQOQR:֖u4VSԁNCUwv wE>9TFQ)C &XB\vqoJc#^ˢߴ:热d_G#iM<ݤ}|{浍>uUs֞c_S5[T 7@f` tV?O?p2=3Ş7Z&!*|lQ}i=_xi__`e5ךoݲWe߂4 |Ry!˹g>{i-φ \ o3T#ȨǦ=؀5g'o;|nLG%g?+ȧl@,$|],؎00P=EmߓV47sbMYοa 8D3!,Ա$5~'~i+ mOzi.|GY\FG4'NM|3 E׏x eI]d]'ۗUᩯy~3굟&?kM#ž!nGTR:U?|3׌tz_-PZ셈خ;\ coҞ/ x]Ht{ddHqF5I1G8:QV9V 5$p\tCZԭ65 @؅Q$IST:W V^UҴ8B&7\|2+9-(,{ }W 0i^HFstz'5m]&U\v4Pk#Ay>goǓgQں{9@Š 1X~`O|=Io&ww׿`k{s L=R`$Nqە;9|uay obS6 wW崝@ۡ3d}+MR6V=υ5͝ө2PpEty&;پQ+o!Z+8SW~},\[8/xCTGV$׿|/d:i$d vT~Co.~";3`*%Ib=WC\na>^:k\4g Y3 p+63Vѳ$COUÃ\խt{yK9'djY~{ iTH:U6SZ3&ωeIOl2%1*O( Ff<]F>e:Om״ņ'捻"*@&X-~^aᅯN?^2ψEߦwj:6eah~9TUǽ?9cWupѺk@Onm]3zʪoaSi6C|g#>glvSJ<·2=hܾzBZiT<9ѕXR8aQ9վ.r@9}r8 5}>{u+Oӷ i~% ݂۱> mM _Z_~ 9uJBlho_YŖZ,gΕhX[6G~mocbQW=]f<` kއ5HRGF#«ͭۂT=}pHMqYMq޻K7ωav퓊k4lZF동I?ְRK?*$1炵~瑹#5-$Ea<(}j WWU|Wƃvs5wh WI*EӟrGzIF\<7u!|.d#"K}6C=̄gl~Y\3y7Y.[M6\;[4C d\8~LY h~>:Y +DYHe8=~~>1߈2w{yoj _s0xppcc9<+j߉tiYljXb}k_ZPDϛass,K ee#Wi:n鱈tj6(XoA`կ/*_ߵ]%R>&ݦ_>9u@ĞWC[J6w}D^tNN{wƛκ5xBGP ]@'zO?gE4oh:]Ė^r9MPzƏ|?̈2Lg5ۉ!; X s]BJ!{rq>xᦃqe㏉'*P]1ZUB]'$ 9'Z4vըl0nH}E3Zl`TV{ʵm (Ey?Z4PGzjMiYx09Q+jOWC씀p?kgO̿A^O/ڎsBM*g#[tn~Ҿ|^Ԃ|Qr?xPWZXF ~,+[{֗> (']ViDK^#6Β_TprvͱX?zυ<1QEe `U =$F$mém@Ϗ!@ap> & 5 M4h9?yaQ]l>OtS*MwYֶ[=kgUޚ"|4%qڼ3.AU"!AM+ԣI|EG/M?qP-3֥{/-*[^ˡ2aKH0c_O~U͹QE`QUԭ7xkhʱ!X` u⚋{X1E"@ĹStcฑ`i󞄌SIsؖ=hHe+U{gQIťImg >Ȭ; qMI :Vfұ4obkJ\Nqڳ5KB vN݁-Ҿ#)cΥx'k;W)wg#^u[ nڠ~\Ե"nWP[.:B7mN{Ķta^utd}V2;k^1]JO$\፤~ks-+6N\&Hz+?ZY^0|GtlH???Zo^u1H}=Wzh J:9S*"SOKX e'#|Sp^AA4ֆF|?dk~LE1<:d;v.1ۚx\pO?=:~?~K'G|oe<&9@L<_9As $i[-b=נTNJ?v ÕN޻'>=<܆&y \dlqW|q? /L[a<2nI99->x53F v\y&GڸOÚ Xn]-  %%iE/ pT#jm?țyʓțyʰMw:K+47ʓʋD4naLwEh ~ˎhp@ܚmʸg_(oYWO+[fN[YJgV_6 If<7]VO VVܱtP}p9N_[]obMzW-Z" mv^''VѴ 02|Ǟ0]JLf95YGɫ⑌S}Ck#5xvčjGPxh7l4KxYӂ7 ǛLIɍ*>|L?]SyS9Ro[/,ϩ5Tg_ʙ"iDcEDMcK)r\F1zc[c=~.H .&r Ғyу9g(.dAϚ] *XxAZz=L&Y^携 o{fq_/|}{[ϊ~jXO#K6zO͒cOA9Q_NiD3sҬV@@+:u}jk\3 ~!|,Կ|u[,DR#(v5E~2 {\/+sudW`?8PkcI38_h}eEi?H>_D>Ǚq^x9"9v>Zs>Ԃ/zեez6s^oN,6`Jg^FISA45T;[2 ʀzز3Ϫt뛀Y=]&<ϴHzR2GL% NeăZt9dǖs7+#wŶ^mjNWIˑ»?~4Haro9 m :.r^>#C7xRِ /Z*зWt- EUVH4:lEUJ4izYPִc"HӅP? qk:rgUNXNw(F+Y9M2 $fGsھ:n.-+(+]Rm6/2 )$nFlm,yVUJ1t8'O8U.^^8Eϛdt!V~dScfw(w1\}89hqϚJfXVnܨh'v%UO2Op?#Oi8rk%ǘylg8>98ɜqQZrr qQ#9?ZVɺZ734T"Gx%Y41vf/fsO+}Nl ʪ/1U΄SQhSzOڋ~dh"sas ?GoZ4_+/Qy7In;wWVdc&חDj1э&KխZEa`Bi*ʹ2ēq?zn]Dw Tuxgp!Bslϫ$ǫ_ĭK 8&ᆵ';/q"K"lJr=k!}o&٥sǖt*Aumχl"{"E'zh_g@WQCo!<|v=85juFN3霆 ~ڤn~VԷmt~x IXNw]޸ok *?U._dJcş72j V%M'覸-SŸ~K#qI-d݀9ҿI D~Mr6, 1 .Ƌ$I>/i_[| Eq+M? ;1,%IR?S-;l2By@lMpǞݱ].a5K P{F#@⾨> ?_E\tcS`00 qDpؕ/?2ZO- -j;&NY%ƚiN{!\swk$1_qẙ! YŞO\ª^%흱?e8զy+k&`N,kX/M>#A\&Ԑ=qY?Ȋϧ?jVݚ^:'$0夊,O^x1x>=ѳEėǣXu}_ 0[ԒA㏉Mgʹ^lb3k͟('^= F#RDPXh#]?~PL9o{SNrx`7_k>m+~Ӵ{vm&fl'rrx8bV"NvG^Kݪ {ርyT䟷֭k'Ť01%Р}GV]7 eo`8]kInٓC~LF s }"RwKǽt/yq?Ji xP~n~~qRx*6Ab#&GLF+_=VVDz|K{9 MX#  r;{|I|"4x4}4&5=Nվe68ã)Z[Y#jzDdzU>ɮ_յd_5Y/# FIJɡfcQ9e $5Bw/B}<;qytJxcA!Sr {O{yQ Wb`-͹P}YƄH M0׵`VMm@R1-}+Sv&5bEN:QEz+EXQEXQ@Q@Q@Q@Q@ hպKPzTZ寄^)I`c54+4gҺ)Woo¾;1ʰmFuQRQ߁֗j'^[ρs@Ͷn+Bxkn2|﷩*w=:5!j|onͺ k[n:W.l56fKeEz|lk)>ܞH[2"+*?JM2&,WOtpN7.m$y%oWjVV@}+!X{ f%J'LC5;}{hLP+K:Rt'͸Wu [ږyN{sXDۻ?ݮX4)? |a#?2ɝ󵚤m ן$6[=@PNcn!OC|\iҟC|?'^12xgdv܌=\>ɧnm+U׍I{|}[C&%cJѫ H\4XRz? oq(V 52F'I~?nTXǴq =3_z2;="sp SE|uG_iz6'<6| M@sԆ-{Z%H_(uFd>t}m9_t:[h:F*y=  :3#6=[7V$̙ 3FNFOkpG*ƨp~鏃״5ծ:#{߇$V;Nt؜굜ߺiD?mL:yT?5;qzK,25B0pY(ÿz߇En͌G KDS*^mGJpX_w{jꦪ\v DP*Y[Xf XjЃ2֌7Jῆd>k&.2žu|Uh^".4A♬қ~צݘʟzœ&kg%{Oe-i>̹L#5xJ15\ jV`9Y9<pw._Xi;$tp#c=1K]zgRl=/|hgŶǜ\m׃(i<+v jS)v#wjǞ/:Ji# 1UǟmPAJ/,ԡW$~ |u/dϩ5FO:d;XrEm>rI*[X짃t<9.x(y^?kk$)iJ6lu&l**DNW돽S=_gOSMN+)=[)4cQh"q@ C>ܿV(^LcW-|;s?"=sڢMuedQo)0 1`!'E{.'*垣u͗⣚>O? F9{s֣Ji?`q\nmW_zhz**/L͜Ж2x~mJ>3S`~ٚ9;˹{6s_~П | ~M}/FTfY@~h9Բ[q G*wǽXrG*%.25.F}'J0DMaeoi: qՃ:ԍΪ Gk^ӊ5 y@8kf|qFTN5"ƙ47/B`k {I=nO2U5*34F5D*u\g8 h23>ӼqpGI|X#E4@hvo tzOk67]Ni?*⫋}١+?zo=W5I8s iiGUԬ9ukSsW­; ȿbģ A+F ABD1\4Ȍ#/ [Kh+V֒{*i1Z8xRNRMjK >׬[V fYvkW?^#ZļB|fI)?SP=M=ѿu7q !_OR|VRJĖFnPK<KWkF Я/A*h7i QȮPsQ5>,EeO d#ltIJ>;ip??Ƽ}*&o GԨv;뿎2)?5a[X|˵iר?YʎGI_V5Ad%MOݤ?\RBb#x'\+TȫDi\{*$_&_hjͯ]`wZ++rdؚ̛EK?0?Z@;J7:'^|o} elj10 ŃWjnfP>T㟚Aϯj6mƓr%qװH,̨7u$;Z61eU%̗ąn>[д&*{#[(^"8ڞlb=M>K P1,5+2<{~fM6p }BٺWOVqf>hn9&5XUg\1?4Fp qk->_5"8%\j>IƩI&1OxS7ZBep<יjuyCJFsQBhJ'X` 凄&WhCf!S^4y~Zsryk? MZwOծY7q$R¹e䟒w=$O|H-$NX ju{VV]޹{M@*kJPcUob*%,NAՈa;ꧥgXBX~Q0c=汒w6N-[C+>Rm)=qkP|!{wmڤJeY'cڣr~آ+4Cܑ]EP6 n5HT(V+ɞu|UY= 1J>[aRjULcU$[T3uBFsn>aXDd]U+|VD4yޭX-sZs+կd#j-b$N?J%PnǕA<Ζ6^xjq mO0rQ}NЊ5zds{*m8j-EE*F>U}j3,*rGϴlnQD⨙uQI%?>kŷ ڑt6QyjX20GҐy );SNס1kf3}åN7'҉d vOa]ʆbASIhO)ҫ pKvcMi# yh՗Q%3To,Rqg{[=?wkqթ/"?2Nj1EczVT_y)Z9y/ȼ+llqN]]uUL1|8j3J?©F()2w֤Ǩ[9f%W8[J\S*cbo$lp.Zw+/c,ZT|6=+[oAm#ʚAa'&\9L:lU ѶȠ 2PNz`Pa}*,=*[hڊ \\1p|M_1屴>`]Dr}J6Zdpkr+ R}j垐z沛4f:|/m*ݾv fÓZ6YOjW2V FkH~dJ4=P |q9r1^]+_p3\ɣ8{@[*Ѣ[v]C.ExؙzTbOWn'n_>xn{rk<1Ep|*Zf{nzBGOzGC:Pf]F2!kip0O;/|5"ERupNGJ{\ѽ:P-WV֦$_GʩbT$iԈ0)k)&vbQEhEPEPEPEPEPEP\%lC"ǪFɨ_Xt9=_7}dk@76iDqGejZs)*8ʔ=<6"\T^'\+5{I"WLW$4X yC5}+գU3t<V \ƭ/*cs5қ9'.u(+tyKcg&g`P+ٚ6sN(=Kg)4x=?1{8 q?s#a^v$si̹=~sRv=Ys'1/-@uKqu" ivQsҹUrA%x]!=WiJea=DV58%Ijg_KDZu烏zntrbA Z*19nZDخp?F#5+b1֩X5N3HPtA?Ê` "U94KNbwWNSc"mat49庺')x8#ޜQSJ̯%mb{,|9€tCAtHw CACameraL>=B B@?LA(gLALamp?????A4B>??? B4B?@@???IPPHmIPObIpoH H ?zC@OBDATATH ,P:[CW8]R@OB3YDATAP%i5:5A5SBWBWNBW_ C8]R@(C8]R@` 9C8]R@bKC[C+pCWO w MWOWorld??????A@pA A?L=TXd@y   TXS2flender.pyy 8z 8z 8z } DATA,y /Applications/blender/python/S2flender.pyDATA8z z DATAz z 8z @ %DATAz { z DATA{ X{ z ؏ ?DATAX{ { {  pBDATA{ { X{ X :1x% DATA{ 0| { Ȑ eswoDATA0| x| { ?DATAx| | 0| p *DATA| } x| Б DATA} P} |  I*DATAP} } } IDATA} } P}  Fng DATA} (~ } (pDATA(~ p~ } |DATAp~ ~ (~  DDATA~  p~ CDATA H ~  BngDATAH   1ngDATA  H DATA (  F@DATA( p  @DATAp  (  NDATA  p DATA H ȗ ?DATAH  8 ?DATA ؁ H ZDATA؁  8 SDATA h ؁ NDATAh  @ ?DATA  h DATA @ ADATA@  ` DATA Ѓ @ DATAЃ  DATA ` Ѓ  BDATA`   DATA  ` М DATA 8  6DATA8  DATA ȅ 8 Н DATAȅ  DATA X ȅ p DATAX   DATA  X  DATA 0 X DATA0 x DATAx  0 DATA  x 0 DATA P h ?DATAP   ؠ DATA  P ?DATA ( DATA( p С DATAp  (  DATA  p P DATA H DATAH  DATA ؊ H DATA؊  ` DATA h ؊ DATAh  DATA  h ( DATA @ p DATA@  DATA Ќ @ DATAЌ  ( DATA ` Ќ ` DATA`   DATA  ` DATA 8  DATA8  X DATA Ȏ 8 DATAȎ  DATA X Ȏ ( DATAX   h DATA  X DATA 0 DATA0 x ( DATAx  0 ` $DATA  x DATA P DATAP   H DATA  P DATA ( ة DATA( p DATAp  ( X DATA  p ( DATA H p DATAH  DATA ؓ H DATAؓ  (! DATA h ؓ p! DATAh  ! DATA  h " DATA @ P" DATA@  " DATA Е @ " DATAЕ  # DATA ` Е `# DATA`   # DATA  ` # DATA 8 ($ DATA8  `$ %DATA ȗ 8 $ DATAȗ  $ DATA X ȗ 0% DATAX   x% DATA  X % DATA 0 & DATA0 x H& DATAx  0 & DATA  x & DATA P (' DATAP   `' DATA  P ' DATA ( ' DATA( p 8( &DATAp  ( ( DATA  p ( DATA H ) DATAH  `) DATA ؜ H ) DATA؜  ) DATA h ؜ 8* DATAh  * DATA  h * DATA @ + DATA@  `+ DATA О @ + DATAО  + DATA ` О 8, DATA`   p, DATA  ` , DATA 8 - DATA8  h- DATA Ƞ 8 - DATAȠ  - DATA X Ƞ . DATAX   `. DATA  X . DATA 0 . DATA0 x (/ DATAx  0 h/ DATA  x / DATA P / DATAP   (0 DATA  P h0 DATA ( 0 DATA( p 0 DATAp  ( 1 ?DATA  p 1 DATA H 1 ?DATAH  @2 DATA إ H 2 DATAإ  2 DATA h إ 3 DATAh  h3 DATA  h 3 DATA @ 3 DATA@  84 DATA Ч @ x4 DATAЧ  4 DATA ` Ч 5 DATA`   @5 DATA  ` 5 DATA 8 5 DATA8  6 DATA ȩ 8 H6 DATAȩ  6 DATA X ȩ 6 DATAX   7 DATA  X X7 DATA 0 7 DATA0 x 7 DATAx  0 8 DATA  x `8 DATA P 8 -DATAP   9 DATA  P H9 DATA ( 9 DATA( p 9 DATAp  ( 0: DATA  p : DATA H : DATAH  ; DATA خ H h; DATAخ  ; DATA h خ ; DATAh  @< DATA  h < DATA @ < DATA@  = DATA а @ `= DATAа  = DATA ` а = DATA`   (> DATA  ` h> DATA 8 > DATA8  > DATA Ȳ 8 @? DATAȲ  ? DATA X Ȳ ? ?DATAX   0@ DATA  X x@ ?DATA 0 @ DATA0 x A DATAx  0 `A DATA  x A DATA P A DATAP   B DATA  P pB !DATA ( B DATA( p C DATAp  ( @C DATA  p C DATA H C DATAH  D DATA ط H pD DATAط  D DATA h ط D DATAh  (E DATA  h hE DATA @ E DATA@  E /DATA й @ PF DATAй  F DATA ` й F DATA`   G DATA  ` `G DATA 8 G DATA8  G DATA Ȼ 8 H DATAȻ  `H DATA X Ȼ H DATAX   H DATA  X I DATA 0 XI DATA0 x I DATAx  0 I DATA  x J DATA P XJ DATAP   J $DATA  P J DATA ( 0K DATA( p pK DATAp  ( K DATA  p L DATA H HL DATAH  L DATA  H L DATA  M DATA h 8M DATAh  xM DATA  h M DATA @ N DATA@  HN DATA  @ N DATA  N DATA ` (O DATA`   `O DATA  ` O DATA 8 O DATA8  (P DATA  8 pP DATA  P DATA X P DATAX   0Q DATA  X xQ DATA 0 Q DATA0 x Q DATAx  0 8R DATA  x R DATA P R DATAP   S DATA  P HS DATA ( S ,DATA( p S DATAp  ( T 'DATA  p xT DATA H T DATAH  U DATA  H HU DATA  U DATA h U DATAh  V DATA  h XV ,DATA @ V DATA@  W %DATA  @ XW DATA  W DATA ` W DATA`   (X DATA  ` hX DATA 8 X DATA8  X DATA  8 (Y DATA  `Y DATA X Y DATAX   Y DATA  X 0Z DATA 0 hZ DATA0 x Z DATAx  0 Z DATA  x 0[ DATA P h[ DATAP   [ DATA  P [ DATA ( (\ DATA( p x\ DATAp  ( \ DATA  p ] DATA H @] DATAH  x] DATA  H ] DATA  ] DATA h 8^ 9DATAh  ^ ADATA  h _ DATA @ `_ DATA@  _ )DATA  @ ` DATA  H` 7DATA ` ` (DATA`   a DATA  ` `a DATA 8 a DATA8  a DATA  8 0b DATA  hb DATA X b DATAX   b DATA  X 8c DATA 0 pc DATA0 x c DATAx  0 d DATA  x 8d DATA P d DATAP   d DATA  P e ,DATA ( `e DATA( p e 'DATAp  ( e DATA  p 8f DATA H f DATAH  f DATA  H g DATA  Xg DATA h g DATAh  g ,DATA  h 8h DATA @ h %DATA@  h DATA  @ i DATA  `i DATA ` i DATA`   i DATA  ` j DATA 8 hj DATA8  j DATA  8 j DATA  k DATA X `k 1DATAX   k DATA  X l DATA 0 `l DATA0 x l DATAx  0 l DATA  x 8m DATA P m ,DATAP   m DATA  P 8n DATA ( pn DATA( p n DATAp  ( n DATA  p 8o DATA H o DATAH  o DATA  H p DATA  Hp DATA h p DATAh  p DATA  h q (DATA @ `q DATA@  q CDATA  @ 0r DATA  hr DATA ` r DATA`   r DATA  ` (s DATA 8 ps DATA8  s DATA  8 s DATA  0t DATA X xt DATAX   t DATA  X t DATA 0 8u DATA0 x u DATAx  0 u DATA  x v DATA P Hv DATAP   v ,DATA  P v DATA ( w 'DATA( p xw DATAp  ( w DATA  p x DATA H Hx DATAH  x DATA  H x DATA  y DATA h Xy ,DATAh  y DATA  h z %DATA @ Xz DATA@  z DATA  @ z DATA  ({ DATA ` h{ DATA`   { DATA  ` { DATA 8 (| DATA8  p| DATA  8 | &DATA  } DATA X P} DATAX   } %DATA  X } DATA 0 0~ DATA0 x p~ DATAx  0 ~ DATA  x ~ DATA P @ 1DATAP    DATA  P  DATA ( ( DATA( p p DATAp  ( DATA  p  DATA H ` DATAH  DATA  H DATA  ( "DATA h DATAh  DATA  h DATA @ 8 &DATA@  +DATA  @ DATA  0 DATA ` x (DATA`   ؄ DATA  ` ( DATA 8 x DATA8  ȅ DATA  8  DATA  X .DATA X DATAX    DATA  X ` DATA 0 ,DATA0 x  DATAx  0 h DATA  x DATA P  DATAP   X DATA  P DATA ( Љ DATA( p DATAp  ( X DATA  p +DATA H DATAH  8 DATA  H %DATA ( ؋ DATA( p  DATAp  ( X 5DATA  p DATA H *DATAH   X DATA  H DATA    ؍ 0DATA  h  @ /DATAh   DATA  h <DATA @  X DATA@   DATA  @ DATA   8 DATA `  DATA`   ؐ DATA  `  DATA 8  h DATA8   DATA  8  DATA   H DATA X  =DATAX   DATA  X 0 DATA 0  p ;DATA0 x  :DATAx  0 P DATA  x EDATA P   DATAP   X DATA  P DATA (  DATA( p  @ DATAp  ( DATA  p DATA H DATAH  p DATA  H DATA   DATA h ` DATAh  DATA  h ؘ DATA @  DATA@  P 'DATA  @ DATA  DATA ` 0 DATA`   h ?DATA  ` ؚ DATA 8 ?DATA8  DATA  8 DATA   ( DATA X  p 5DATAX   ؜ DATA  X  +DATA 0  p DATA0 x  DATAx  0 #DATA  x @ DATA P  DATAP   ؞ DATA  P  DATA (  X DATA( p  ,DATAp  ( DATA  p 8 DATA H  DATAH   Ƞ :DATA  H 8 DATA    p /DATA  h  С EDATAh   H YDATA  h آ )DATA @  8 ADATA@   DATA  @ YDATA   DATA `  Ф DATA`    DATA  ` X DATA 8  DATA8   DATA  8 DATA   h DATA X  DATAX   DATA  X 0 DATA 0  p DATA0 x  DATAx  0 DATA  x 8 DATA P  DATAP   Ȩ DATA  P  DATA (  P DATA( p  5DATAp  ( DATA  p 8 +DATA H  DATAH   ت DATA  H  DATA    ` DATA  h  DATAh   $DATA  h @ DATA @  DATA@   ج DATA  @  DATA   X DATA `  KDATA`    >DATA  ` #DATA 8  خ DATA8   ( =DATA  8 JDATA !  [DATA! X! DATAX! ! ! GDATA! ! X! ` DATA! 0" ! _DATA0" x" ! @ ADATAx" " 0" >DATA" # x" ( >DATA# P# " <DATAP# # #  <DATA# # P# x DATA# ($ # DATA($ p$ # 8DATAp$ $ ($ ` %DATA$ % p$ DATA% H% $  0DATAH% % % p %DATA% % H% ȶ &DATA%  & % &DATA & h& % x 3DATAh& & & (DATA& & h& @ DATA& @' & x DATA@' ' & ȸ 1DATA' ' @' 0 DATA' ( ' DATA( `( ' ȹ KDATA`( ( ( H DATA( ( `( DATA( 8) ( DATA8) ) ( DATA) ) 8) h 1DATA) * ) л &DATA* X* ) ( DATAX* * * h DATA* * X* DATA* 0+ * ؼ DATA0+ x+ * DATAx+ + 0+ h DATA+ , x+ DATA, P, + X 6DATAP, , , DATA, , P,  DATA, (- , H DATA(- p- , DATAp- - (- ؿ 5DATA- . p- @ DATA. H. - WDATAH. . .  +DATA. . H. x (DATA.  / . /DATA / h/ . 8 DATAh/ / / /DATA/ / h/ DATA/ @0 / ( ,DATA@0 0 / DATA0 0 @0 #DATA0 1 0 ( DATA1 `1 0 x )DATA`1 1 1 DATA1 1 `1 0 DATA1 82 1 )DATA82 2 1 DATA2 2 82 8 )DATA2 3 2 )DATA3 X3 2 DATAX3 3 3 8 DATA3 3 X3 p 'DATA3 04 3 DATA04 x4 3  DATAx4 4 04 X DATA4 5 x4 DATA5 P5 4 DATAP5 5 5 LDATA5 5 P5 DATA5 (6 5 DATA(6 p6 5 ( DATAp6 6 (6 x 0DATA6 7 p6 DATA7 H7 6 0 DATAH7 7 7 p DATA7 7 H7 EDATA7  8 7 DATA 8 h8 7 X DATAh8 8 8 DATA8 8 h8 DATA8 @9 8 8 DATA@9 9 8 DATA9 9 @9 $DATA9 : 9 0 DATA: `: 9 p DATA`: : : 3DATA: : `:  DATA: 8; : H DATA8; ; : DATA; ; 8; DATA; < ; ( DATA< X< ; ` DATAX< < < DATA< < X< DATA< 0= < @ DATA0= x= < DATAx= = 0= ?DATA= > x= ( DATA> P> = p ?DATAP> > > DATA> > P>  DATA> (? > ` DATA(? p? > DATAp? ? (? DATA? @ p? DATA@ H@ ? h DATAH@ @ @ DATA@ @ H@ "DATA@  A @ H -DATA A hA @ DATAhA A A DATAA A hA ( DATAA @B A ` >DATA@B B A DATAB B @B  DATAB C B ` DATAC `C B DATA`C C C DATAC C `C ( DATAC 8D C x DATA8D D C DATAD D 8D  DATAD E D h DATAE XE D DATAXE E E DATAE E XE 8 DATAE 0F E DATA0F xF E PDATAxF F 0F P DATAF G xF DATAG PG F DATAPG G G DATAG G PG h DATAG (H G DATA(H pH G DATApH H (H 0 DATAH I pH x DATAI HI H DATAHI I I DATAI I HI @ DATAI  J I x DATA J hJ I DATAhJ J J DATAJ J hJ P DATAJ @K J DATA@K K J DATAK K @K  DATAK L K X DATAL `L K DATA`L L L DATAL L `L 0 DATAL 8M L h ?DATA8M M L DATAM M 8M  :DATAM N M 4DATAN XN M ;DATAXN N N ` DATAN N XN 8DATAN 0O N  9DATA0O xO N x DATAxO O 0O ?DATAO P xO 8 DATAP PP O p ?DATAPP P P DATAP P PP ( DATAP (Q P h DATA(Q pQ P DATApQ Q (Q DATAQ R pQ 0 DATAR HR Q p DATAHR R R DATAR R HR DATAR  S R 0 DATA S hS R x DATAhS S S DATAS S hS  DATAS @T S H DATA@T T S DATAT T @T ?DATAT U T 8 CDATAU `U T DATA`U U U DATAU U `U H DATAU 8V U DATA8V V U DATAV V 8V 8 DATAV W V DATAW XW V =DATAXW W W @ DATAW W XW DATAW 0X W #DATA0X xX W  DATAxX X 0X X DATAX Y xX DATAY PY X DATAPY Y Y 8 DATAY Y PY DATAY (Z Y DATA(Z pZ Y ( DATApZ Z (Z h 'DATAZ [ pZ iDATA[ H[ Z ` DATAH[ [ [ DATA[ [ H[ eDATA[  \ [ DATA \ h\ [ )DATAh\ \ \ @ DATA\ \ h\ DATA\ @] \ DATA@] ] \ DATA] ] @] ` DATA] ^ ] DATA^ `^ ] DATA`^ ^ ^ H DATA^ ^ `^ DATA^ 8_ ^ &DATA8_ _ ^ 8 #DATA_ _ 8_ 'DATA_ ` _ "DATA` X` _ @ !DATAX` ` ` DATA` ` X` DATA` 0a `  DATA0a xa ` ` DATAxa a 0a DATAa b xa DATAb Pb a 8 DATAPb b b x DATAb b Pb DATAb (c b DATA(c pc b H DATApc c (c DATAc d pc DATAd Hd c  DATAHd d d P <DATAd d Hd <DATAd  e d 0 9DATA e he d DATAhe e e DATAe e he ( !DATAe @f e <DATA@f f e &DATAf f @f H DATAf g f DATAg `g f DATA`g g g  DATAg g `g h DATAg 8h g DATA8h h g DATAh h 8h ( DATAh i h p IDATAi Xi h DATAXi i i @ DATAi i Xi x DATAi 0j i  (DATA0j xj i 0 DATAxj j 0j  DATAj k xj  DATAk Pk j  DATAPk k k ` DATAk k Pk  DATAk (l k  DATA(l pl k  @DATApl l (l  DATAl m pl  DATAm Hm l ( DATAHm m m ` DATAm m Hm  ?DATAm  n m  DATA n hn m H ?DATAhn n n  DATAn n hn  DATAn @o n H DATA@o o n  DATAo o @o  DATAo p o  DATAp `p o P DATA`p p p  DATAp p `p  DATAp 8q p 0 DATA8q q p x DATAq q 8q DATAq r q  DATAr Xr q P DATAXr r r DATAr r Xr DATAr 0s r  DATA0s xs r ` DATAxs s 0s DATAs t xs DATAt Pt s 0 DATAPt t t h DATAt t Pt DATAt (u t DATA(u pu t 0 DATApu u (u x DATAu v pu DATAv Hv u DATAHv v v H DATAv v Hv  DATAv  w v  DATA w hw v  DATAhw w w ` DATAw w hw  +DATAw @x w  DATA@x x w 8 DATAx x @x  DATAx y x  DATAy `y x  DATA`y y y X DATAy y `y  *DATAy 8z y  DATA8z z y 0 DATAz z 8z x DATAz { z  DATA{ X{ z  DATAX{ { { H DATA{ { X{  %DATA{ 0| {  DATA0| x| {  DATAx| | 0| ` DATA| } x|  DATA} P} |  DATAP} } } ( DATA} } P} ` DATA} (~ }  'DATA(~ p~ }  +DATAp~ ~ (~ h DATA~  p~  DATA H ~  ?DATAH   ` DATA  H  DATA (   DATA( p  8 DATAp  (  DATA  p  DATA H  DATAH  X DATA ؁ H  DATA؁   ?DATA h ؁ X +DATAh   8DATA  h ( :DATA @  *DATA@   DATA Ѓ @ @ $DATAЃ   DATA ` Ѓ  DATA`   0 DATA  ` p DATA 8  DATA8   DATA ȅ 8 8 ,DATAȅ   <DATA X ȅ  ?DATAX   x ,DATA  X  DATA 0 ( DATA0 x x DATAx  0 DATA  x ! DATA P P! DATAP   ! DATA  P ! DATA ( " ,DATA( p x" 0DATAp  ( " 4DATA  p H# *DATA H # DATAH  # $DATA ؊ H H$ DATA؊  $ DATA h ؊ $ DATAh  % DATA  h p% DATA @ % DATA@  % (DATA Ќ @ H& DATAЌ  & DATA ` Ќ & DATA`   (' DATA  ` x' DATA 8 ' DATA8  ( DATA Ȏ 8 8( DATAȎ  ( 7DATA X Ȏ ( DATAX   8) DATA  X ) DATA 0 ) DATA0 x * DATAx  0 P* DATA  x * "DATA P * 7DATAP   H+ *DATA  P + DATA ( + DATA( p H, DATAp  ( , DATA  p , DATA H - 2DATAH  x- =DATA ؓ H - >DATAؓ  X. ;DATA h ؓ . CDATAh  @/ ADATA  h / DATA @ / BDATA@  p0 ;DATA Е @ 0 ADATAЕ  X1 DATA ` Е 1 .DATA`   2 DATA  ` X2 DATA 8 2 DATA8  2 DATA ȗ 8 03 DATAȗ  p3 DATA X ȗ 3 .DATAX   4 9DATA  X x4 >DATA 0 4 CDATA0 x `5 DATAx  0 5 -DATA  x 6 DATA  X6 DATA   6 DATA  6 .DATA X P7 DATAX   7 /DATA  X 7 DATA 0 88 DATA0 x p8 #DATAx  0 8 DATA  x 9 DATA P @9 DATAP   9 DATA  P 9 DATA ( : DATA( p h: DATAp  ( : DATA  p : DATA H 8; DATAH  ; DATA  H ; .DATA  (< DATA h `< DATAh  < DATA  h < =DATA @ @= 9DATA@  = >DATA  @ > =DATA   > CDATA `  ? DATA`   X? 5DATA  ` ? DATA 8  @ DATA8   X@ (DATA  8 @ MDATA   8A .DATA X  A DATAX   A DATA  X (B DATA 0  `B -DATA0 x  B DATAx  0 C DATA  x `C DATA P  C DATAP   C DATA  P 8D DATA (  pD 8DATA( p  D DATAp  ( (E 8DATA  p E DATA H  E -DATAH   0F -DATA  H F DATA   F DATA h  (G 2DATAh  G )DATA  h G DATA @ 0H DATA@  hH [DATA  @ H DATA  0I DATA ` xI DATA`   I DATA  ` I QDATA 8 xJ >DATA8  J <DATA  8 XK 4DATA  K JDATA X @L KDATAX   L !DATA  X M 5DATA 0 M 0DATA0 x M DATAx  0 8N :DATA  x N ;DATA P  O $DATAP   pO DATA  P O DATA ` pP DATA` P DATA`P DATA80Q DATA8hQ DATA8Q DATAQ +DATAXPR DATAXR DATAXR DATA0@S DATA0xS +DATAx0S DATAx0T 'DATAPT DATAPT DATAP(U )DATA(U DATA(pU $DATAp(0V DATApxV DATAHV #DATAH W (DATAHW (DATA W (DATA h@X DATAh X *DATAhX DATA@0Y =DATA@Y DATA@Y 2DATAXZ -DATA`Z DATA`Z DATA`@[ DATA8[ DATA8[ DATA8[ ;DATA h\ DATA X \ DATAX   \ DATA  X 0] DATA 0! p] <DATA0!x! ] >DATAx!!0!P^ 4DATA!"x!^ 5DATA"P"! _ 0DATAP"""_ KDATA""P"` !DATA"(#"`` DATA(#p#"` DATAp##(#` DATA#$p# a DATA$H$#ha DATAH$$$a DATA$$H$b DATA$ %$Hb DATA %h%$b GDATAh%% %c DATA%%h%`c DATA%@&%c *DATA@&&%d DATA&&@&`d DATA&'&d DATA'`'&d DATA`'''(e DATA''`'he DATA'8('e 6DATA8(('f DATA((8(@f DATA()(f !DATA)X)(f DATAX)))(g DATA))X)`g 'DATA)0*)g DATA0*x*)g !DATAx**0*Ph DATA*+x*h DATA+P+*h DATAP+++@i DATA++P+i DATA+(,+i DDATA(,p,+8j DATAp,,(,xj DATA,-p,j DATA-H-,k %DATAH---hk DATA--H-k (DATA- .-l DATA .h.-`l DATAh.. .l DATA..h.m %DATA.@/.hm DATA@//.m DATA//@/m PDATA/0/hn DATA0`0/n DATA`000n DATA00`0 o DATA0810ho DATA8110o DATA1181o DATA121Hp DATA2X21p ,DATAX222p DATA22X2@q DATA2032q DATA03x32q DATAx3303r DATA34x3Hr QDATA4P43r DATAP444s DATA44P4Ps DATA4(54s DATA(5p54s DATAp55(5t DATA56p5`t DATA6H65t DATAH666u ,DATA66H6`u DATA6 76u DATA 7h76u DATAh77 78v DATA77h7xv DATA7@87v 8DATA@887 w DATA88@8pw 8DATA898w DATA9`98x @DATA`999x DATA99`9x DATA98:9y DATA8::9@y ?DATA::8:y DATA:;:y DATA;X;:@z DATAX;;;z DATA;;X;z DATA;0<;{ DATA0<x<;@{ DATAx<<0<{ 4DATA<=x<{ DATA=P=<8| DATAP===x| DATA==P=| DATA=(>=} "DATA(>p>=`} DATAp>>(>} DATA>?p>} "DATA?H?>P~ DATAH???~ DATA??H?~ DATA? @?0 4DATA @h@? )DATAh@@ @ _DATA@@h@ YDATA@@A@ )DATA@AA@x _DATAAA@A YDATAABA (DATAB`BA eDATA`BBB _DATABB`B DDATAB8CB iDATA8CCB8 |DATACC8C DATACDC DATADXDC *DATAXDDDP DATADDXD 3DATAD0ED DATA0E( DP 'DATA( p 0E DATAp  ( $DATA  p H $DATA H  uDATAH   H DATA  H DATA    ؊ DATA  h   DATAh   X DATA  h DATA @  DATA@   CDATA  @ DATA   ، CDATA `  P ,DATA`   *DATA  `  DATA 8  ` DATA8   DATA  8 h LDATA   DATA X  8 DATAX   DATA  X Ȑ 5DATA 0  0 5DATA0 x  7DATAx  0 *DATA  x ` .DATA P  ZDATAP   P DATA  P DATA (  DATA( p  0 mDATAp  ( Д DATA  p  DATA H  ` DATAH   DATA  H DATA    8 DATA  h  DATAh   Ȗ DATA  h  DATA @  X MDATA@   ؗ DATA  @ DATA   h DATA `  DATA`   DATA  ` @ DATA 8  DATA8   Й DATA  8  DATA   ` DATA X  DATAX   DATA  X 8 DATA 0  x :DATA0 x  SDATAx  0 p DATA ! x DATA! P! DATAP! ! ! @ DATA! ! P! DATA! (" ! ȝ "DATA(" p" ! DATAp" " (" ` DATA" # p" @DATA# H# "  DATAH# # # H DATA# # H# DATA#  $ # ?DATA $ h$ # 0 DATAh$ $ $ p 4DATA$ $ h$ ؠ 4DATA$ @% $ @ DATA@% % $ $DATA% % @% DATA% & % 8 #DATA& `& % DATA`& & & Т DATA& & `&  DATA& 8' & P DATA8' ' & DATA' ' 8' أ DATA' ( '  DATA( X( ' X DATAX( ( ( DATA( ( X( ؤ DATA( 0) ( DATA0) x) ( p DATAx) ) 0) DATA) * x)  DATA* P* ) P ]DATAP* * * DATA* * P* 0 DDATA* (+ * DATA(+ p+ * DATAp+ + (+ @ DATA+ , p+ DATA, H, + DATAH, , , DATA, , H, @ @DATA,  - , DATA - h- , DATAh- - - 8 DATA- - h- p ?DATA- @. - DATA@. . - DATA. . @. h DATA. / . DATA/ `/ . DATA`/ / / DATA/ / `/ ` -DATA/ 80 / DATA80 0 /  DATA0 0 80 P DATA0 1 0 DATA1 X1 0 DATAX1 1 1 DATA1 1 X1 h DATA1 02 1 DATA02 x2 1 DATAx2 2 02 H DATA2 3 x2 DATA3 P3 2 د DATAP3 3 3 ( DATA3 3 P3 p DATA3 (4 3 DATA(4 p4 3  DATAp4 4 (4 P $DATA4 5 p4 $DATA5 H5 4 -DATAH5 5 5 ` DATA5 5 H5 DATA5  6 5 &DATA 6 h6 5 H DATAh6 6 6 DATA6 6 h6 س DATA6 @7 6 ( DATA@7 7 6 ` @DATA7 7 @7 ش DATA7 8 7  DATA8 `8 7 X DATA`8 8 8 ?DATA8 8 `8 DATA8 89 8 H DATA89 9 8 8DATA9 9 89  DATA9 : 9 P DATA: X: 9 DATAX: : : %DATA: : X: 8 !DATA: 0; : DATA0; x; : ظ DATAx; ; 0; ( !DATA; < x; DATA< P< ; ȹ DATAP< < <  DATA< < P< X DATA< (= < DATA(= p= < DATAp= = (= @ DATA= > p= %DATA> H> = DATAH> > > ( DATA> > H> p DATA>  ? > 7DATA ? h? > DATAh? ? ? h DATA? ? h? DATA? @@ ? DATA@@ @ ? X UDATA@ @ @@ DATA@ A @ 0 >DATAA `A @ DATA`A A A DATAA A `A 8 'DATAA 8B A 'DATA8B B A 'DATAB B 8B @ 'DATAB C B DATAC XC B DATAXC C C DATAC C XC p DATAC 0D C +DATA0D xD C +DATAxD D 0D +DATAD E xD DATAE PE D DATAPE E E p DATAE E PE +DATAE (F E +DATA(F pF E +DATApF F (F DATAF G pF DATAG HG F p GDATAHG G G DATAG G HG ( DATAG  H G x DATA H hH G DATAhH H H DATAH H hH p DATAH @I H DATA@I I H  "DATAI I @I ` 8DATAI J I XDATAJ `J I ` DATA`J J J DATAJ J `J DATAJ 8K J 0 7DATA8K K J DATAK K 8K )DATAK L K 0 +DATAL XL K DATAXL L L DATAL L XL  DATAL 0M L P DATA0M xM L DATAxM M 0M DATAM N xM ( HDATAN PN M DATAPN N N GDATAN N PN p DATAN (O N DATA(O pO N  6DATApO O (O x *DATAO P pO >DATAP HP O H RDATAHP P P DATAP P HP DATAP  Q P ` DATA Q hQ P DATAhQ Q Q !DATAQ Q hQ 8 DATAQ @R Q p %DATA@R R Q -DATAR R @R ( DATAR S R h #DATAS `S R DATA`S S S  #DATAS S `S h *DATAS 8T S DATA8T T S  DATAT T 8T ` DATAT U T gDATAU XU T H ?DATAXU U U TDATAU U XU @ 2DATAU 0V U DATA0V xV U 6DATAxV V 0V X /DATAV W xV ODATAW PW V 8 DATAPW W W #DATAW W PW DATAW (X W ( DATA(X pX W p *DATApX X (X DATAX Y pX  ,DATAY HY X x DATAHY Y Y +DATAY Y HY  DATAY  Z Y H DATA Z hZ Y DATAhZ Z Z DATAZ Z hZ DATAZ @[ Z @ DATA@[ [ Z x @DATA[ [ @[ DATA[ \ [ ( DATA\ `\ [ p DATA`\ \ \ ?DATA\ \ `\  DATA\ 8] \ ` DATA8] ] \ DATA] ] 8] DATA] ^ ] 8 DATA^ X^ ] DATAX^ ^ ^ DATA^ ^ X^ DATA^ 0_ ^ 8 DATA0_ x_ ^ x DATAx_ _ 0_ DATA_ ` x_ DATA` P` _ @ )DATAP` ` ` DATA` ` P` DATA` (a ` 0 DATA(a pa ` x DATApa a (a DATAa b pa  DATAb Hb a X !DATAHb b b GDATAb b Hb ( .DATAb  c b aDATA c hc b DATAhc c c p DATAc c hc DATAc @d c DATA@d d c P DATAd d @d DATAd e d DATAe `e d 0 DATA`e e e DATAe e `e 'DATAe 8f e 'DATA8f f e x 'DATAf f 8f 'DATAf g f ( DATAg Xg f h DATAXg g g DATAg g Xg 'DATAg 0h g X 'DATA0h xh g 'DATAxh h 0h  'DATAh i xh ` DATAi Pi h DATAPi i i DATAi i Pi 8 DATAi (j i +DATA(j pj i +DATApj j (j H +DATAj k pj DATAk Hk j DATAHk k k 8 DATAk k Hk +DATAk  l k +DATA l hl k H +DATAhl l l DATAl l hl DATAl @m l 0 DATA@m m l x $DATAm m @m (DATAm n m 0 DATAn `n m x 6DATA`n n n 6DATAn n `n H DATAn 8o n DATA8o o n DATAo o 8o  DATAo p o ` DATAp Xp o DATAXp p p DATAp p Xp 0 8DATAp 0q p DATA0q xq p 3DATAxq q 0q P 5DATAq r xq =DATAr Pr q ( ;DATAPr r r DATAr r Pr DATAr (s r  DATA(s ps r X DATAps s (s DATAs t ps !DATAt Ht s 0 DATAHt t t h DATAt t Ht <DATAt  u t ( ;DATA u hu t DATAhu u u !DATAu u hu H 3DATAu @v u %DATA@v v u  DATAv v @v P 4DATAv w v DATAw `w v DATA`w w w 8 DATAw w `w x DATAw 8x w DATA8x x w 5DATAx x 8x h DATAx y x "DATAy Xy x =DATAXy y y h ADATAy y Xy DATAy 0z y 0 DATA0z xz y x DATAxz z 0z  DATAz { xz  DATA{ P{ z 0 DATAP{ { { x DATA{ { P{  /DATA{ (| {  DATA(| p| { X DATAp| | (|  DATA| } p|  DATA} H} | ( DATAH} } } x DATA} } H}  DATA}  ~ }  DATA ~ h~ } P #DATAh~ ~ ~  -DATA~ ~ h~  DATA~ @ ~ P 6DATA@  ~  DATA  @  DATA   H DATA `   DATA`    DATA  `  =DATA 8  DATA8   DATA ȁ 8  DATAȁ  H DATA X ȁ #DATAX   DATA  X ( DATA 0 x DATA0 x DATAx  0  DATA  x X DATA P DATAP   DATA  P 0 (DATA ( DATA( p DATAp  (  DATA  p X DATA H DATAH  DATA ؆ H ( DATA؆  h DATA h ؆  DATAh   DATA  h 0 DATA @  DATA@   DATA Ј @  DATAЈ  X DATA ` Ј  DATA`    %DATA  ` 0 ,DATA 8  !DATA8   DATA Ȋ 8 ( #DATAȊ   DATA X Ȋ  #DATAX   ( DATA  X ` %DATA 0  DATA0 x  DATAx  0 P DATA  x  (DATA P  !DATAP   P DATA  P  DATA (  $DATA( p 8 DATAp  (  KDATA  p  DATA H H DATAH   DATA ؏ H  DATA؏ (  -DATA( p ؏ p @DATAp  (  DATA  p 8 DATA H  8DATAH   DATA ؑ H H DATAؑ   DATA h ؑ  ,DATAh  0 DATA  h h +DATA @  DATA@   +DATA Г @ p %DATAГ   DATA ` Г  (DATA`   ` 2DATA  `  6DATA 8 0 DATA8  x &DATA ȕ 8  DATAȕ   DATA X ȕ h DATAX    DATA  X  DATA 0 ( DATA0 x h DATAx  0 ADATA  x ! DATA P P! DATAP   ! DATA  P ! BDATA ( H" DATA( p " DATAp  ( " DATA  p # DATA H `# DATAH  # DATA ؚ H # DATAؚ  8$ DATA h ؚ x$ DATAh  $ DATA  h % DATA @ P% DATA@  % DATA М @ % DATAМ  & DATA ` М h& DATA`   & DATA  ` & DATA 8 8' DATA8  x' DATA Ȟ 8 ' DATAȞ  ' DATA X Ȟ @( DATAX   ( DATA  X ( DATA 0 ) DATA0 x X) DATAx  0 ) DATA  x ) DATA P * DATAP   X* DATA  P * DATA ( * DATA( p 0+ DATAp  ( x+ DATA  p + DATA H , DATAH  P, DATA أ H , DATAأ  , DATA h أ (- DATAh  p- DATA  h - DATA @ . DATA@  H. DATA Х @ . DATAХ  . DATA ` Х / DATA`   h/ DATA  ` / DATA 8 / DATA8  @0 DATA ȧ 8 0 DATAȧ  0 ?DATA X ȧ 01 DATAX   h1 DATA  X 1 DATA 0 1 ?DATA0 x P2 DATAx  0 2 DATA  x 2 ?DATA P @3 DATAP   x3 DATA  P 3 DATA ( 3 ?DATA( p h4 DATAp  ( 4 DATA  p 4 DATA H 85 DATAH  x5 DATA ج H 5 DATAج  6 DATA h ج X6 DATAh  6 ?DATA  h 7 DATA @ 87 DATA@  x7 DATA Ю @ 7 ?DATAЮ  8 DATA ` Ю `8 DATA`   8 8DATA  ` 9 6DATA 8 9 5DATA8  9 DATA Ȱ 8 0: 2DATAȰ  : DATA X Ȱ : DATAX   (; DATA  X p; DATA 0 ; DATA0 x < DATAx  0 H< DATA  x < <DATA P = DATAP   P= ,DATA  P = DATA ( > 9DATA( p p> ?DATAp  ( > *DATA  p @? DATA H ? 7DATAH  ? !DATA ص H P@ >DATAص  @ DATA h ص A ADATAh  A DATA  h A DATA @ B !DATA@  XB @DATA з @ B @DATAз  HC DATA ` з C DATA`   C DATA  ` 0D ADATA 8 D DATA8  D DATA ȹ 8 8E DATAȹ  xE DATA X ȹ E DATAX   F DATA  X HF DATA 0 F DATA0 x F DATAx  0 (G DATA  x hG DATA P G DATAP   G DATA  P 0H ;DATA ( H 0DATA( p I NDATAp  ( I DATA  p I @DATA H HJ ODATAH  J $DATA ؾ H K DATAؾ  XK 0DATA h ؾ K QDATAh  HL DATA  h L )DATA @ L DATA@  0M DATA  @ xM DATA  M DATA ` N DATA`   hN DATA  ` N DATA 8 O DATA8  XO DATA  8 O DATA  O DATA X 0P DATAX   pP DATA  X P DATA 0 P DATA0 x HQ $DATAx  0 Q MDATA  x R DATA P `R DATAP   R KDATA  P S DATA ( XS DATA( p S DATAp  ( S 5DATA  p PT DATA H T 2DATAH  U DATA  H XU DATA  U DATA h U DATAh  (V :DATA  h V 5DATA @ W DATA@  PW $DATA  @ W +DATA  X DATA ` PX DATA`   X DATA  ` X DATA 8 (Y DATA8  pY DATA  8 Y $DATA  Z DATA X PZ DATAX   Z DATA  X Z DATA 0 [ DATA0 x X[ DATAx  0 [ DATA  x [ *DATA P H\ 0DATAP   \ ,DATA  P ] DATA ( H] DATA( p ] DATAp  ( ] $DATA  p ^ +DATA H p^ +DATAH  ^ 'DATA  H (_ +DATA  _ +DATA h _ DATAh  8` +DATA  h ` +DATA @ ` DATA@  8a !DATA  @ a DATA  a "DATA ` b &DATA`   xb DATA  ` b DATA 8 c DATA8  `c DATA  8 c DATA  c DATA X @d :DATAX   d <DATA  X e /DATA 0 e DATA0 x e DATAx  0 f *DATA  x `f 1DATA P f ?DATAP   8g DATA  P pg DATA ( g ADATA( p 0h PDATAp  ( h @DATA  p 0i QDATA H i CDATAH  0j DATA  H hj $DATA  j IDATA h @k 7DATAh  k DATA  h k DATA @ 8l DATA@  l ;DATA  @ m (DATA  `m (DATA ` m )DATA`   n DATA  ` Xn DATA 8 n DATA8  n DATA  8 0o DATA  po DATA X o DATAX   o DATA  X @p DATA 0 p DATA0 x p *DATAx  0 (q ,DATA  x q DATA P q DATAP   r DATA  P hr DATA ( r DATA( p s 6DATAp  ( ps DATA  p s DATA H t DATAH  Ht DATA  H t DATA  t 0DATA h (u (DATAh  u DATA  h u DATA @ v DATA@  Hv @DATA  @ v DATA  v DATA ` @w DATA`   xw ?DATA  ` w DATA 8 (x DATA8  px DATA  8 x DATA  y "DATA X Xy DATAX   y DATA  X y DATA 0 (z DATA0 x xz DATAx  0 z DATA  x { DATA P h{ DATAP   { DATA  P | DATA ( X| DATA(  | DATA  ( | DATA 0 H} DATA0 x } DATAx  0 } #DATA  x @~ DATA P ~ DATAP   ~ DATA  P  DATA ( h DATA( p  DATAp  ( DATA  p X DATA H DATAH  4DATA خ H ` DATAخ  DATA h خ DATAh  P DATA  h "DATA @ 7DATA@  P 6DATA а @ DATAа   DATA ` а P &DATA`   DATA  ` *DATA 8 H 7DATA8  6DATA Ȳ 8  DATAȲ  h DATA X Ȳ DATAX    DATA  X @ DATA 0 DATA0 x Ї DATAx  0  DATA  x h DATA P DATAP   DATA  P @ 5DATA ( 8DATA( p  >DATAp  ( =DATA  p 1DATA H ` .DATAH  DATA ط H DATAط  @ DATA h ط DATAh  Ȍ DATA  h  DATA @ X DATA@  DATA й @ DATAй  ( "DATA ` й =DATA`   DATA  ` @ DATA 8 DATA8  DATA Ȼ 8 ( DATAȻ  h DATA X Ȼ !DATAX    DATA  X X DATA 0 $DATA0 x 3DATAx  0 X DATA  x DATA P DATAP   H DATA  P DATA ( Г DATA( p  DATAp  ( X DATA P p +DATAP  DATA  P P DATA ( DATA( p DATAp  ( ( DATA  p ` ADATA H ؖ DATAH  ( DATA ؜ H h DATA؜  DATA h ؜ BDATAh  ` DATA  h <DATA @  (DATA@  x (DATA О @ ؙ )DATAО  8 DATA ` О p ADATA`   DATA  ` 8 DATA 8 x DATA8  DATA Ƞ 8 BDATAȠ  p (DATA X Ƞ М $DATAX   ( DATA  X h DATA 0 DATA0 x DATAx  0 P DATA  x DATA P "DATAP   X DATA  P DATA (  LDATA( p DATAp  ( ADATA  p 8 DATA H DATAH  ȡ DATA إ H  DATAإ  H CDATA h إ #DATAh   DATA  h ` #DATA @ DATA@   DATA Ч @ P #DATAЧ  DATA ` Ч DATA`   @ -DATA  ` -DATA 8 DATA8  @ PDATA ȩ 8 Ȧ DATAȩ  DATA X ȩ H DATAX   DATA  X PDATA 0 p DATA0 x DATAx  0 DATA  x H DATA P DATAP   ȩ DATA  P  DATA ( P DATA( p GDATAp  (  DATA  p H DATA H DATAH  ADATA خ H 8 DATAخ  DATA h خ Ȭ DATAh   DATA  h H BDATA @ DATA@   EDATA а @ DATAа  DATA ` а ADATA`   p DATA  ` DATA 8 DATA8  8 DATA Ȳ 8 x BDATAȲ  DATA X Ȳ @ DATAX   DATA  X ȱ DATA 0  DATA0 x X DATAx  0 DATA  x 2DATA P ` 5DATAP   ȳ DATA  P  DATA ( H DATA( p 2DATAp  ( 6DATA  p h DATA H DATAH  DATA ط H  ADATAط  DATA h ط ض DATAh   DATA  h X DATA @ BDATA@   DATA й @ ` DATAй  RDATA ` й ( DATA`   p DATA  ` DATA 8  (DATA8  h DATA Ȼ 8 DATAȻ  DATA X Ȼ 8 ADATAX   DATA  X DATA 0 @ DATA0 x DATAx  0 BDATA  x 8 &DATA P 'DATAP   /DATA  P H DATA ( DATA( p DATAp  ( DATA  p 8 DATA H x DATAH  DATA  H &DATA  P DATA h DATAh  DATA  h 8 DATA @ DATA@  DATA  @ DATA  @ DATA ` DATA`   DATA  `  DATA 8 X DATA8  DATA  8 DATA   DATA X h 4DATAX   *DATA  X 0 DATA 0 x 6DATA0 x DATAx  0 ( DATA  x p DATA P DATAP   DATA  P H DATA ( *DATA( p DATAp  ( DATA  p h 'DATA H DATAH   DATA  H H ,DATA  DATA h 7DATAh  P !DATA  h DATA @ "DATA@  8 DATA  @ DATA  DATA `  DATA`   X .DATA  ` MDATA 8 8 DATA8  x DATA  8 DATA  DATA X H DATAX   DATA  X DATA 0  DATA0 x P GDATAx  0 9DATA  x 8 2DATA P DATAP   DATA  P 8 &DATA ( ADATA( p  %DATAp  ( ` DATA  p DATA H DATAH  @ DATA  H DATA  DATA h  DATAh  P DATA  h 8DATA @ %DATA@  X )DATA  @ DATA   DATA ` X DATA`   DATA  ` DATA 8 3DATA8  >DATA  8 DATA  @ >DATA X !DATAX    *DATA  X h DATA 0 PDATA0 x 8 vDATAx  0 DATA  x ( ^DATA P BDATAP   0 HDATA  P .DATA (  DATA( p X NDATAp  ( DATA  p  "DATA H p EDATAH  DATA  H 8 DATA  p DATA h DATAh  DATA  h @ DATA @ DATA@  DATA  @ ( DATA  h "DATA ` "DATA`    DATA  ` P DATA 8 DATA8  DATA  8 0 DATA  h DATA X DATAX   0DATA  X ` DATA 0 DATA0 x QDATAx  0 h DATA  x eDATA P P ,DATAP   DATA  P  DATA ( P DATA( p ?DATAp  (  ODATA  p DATA H DATAH   DATA  H P DATA  DATA h DATAh  DATA  h @ KDATA @ DATA@  DATA  @ H DATA  DATA ` DATA`    DATA  ` X DATA 8 IDATA8   DATA  8 P *DATA  DATA X #DATAX   P DATA  X DATA 0 %DATA0 x @ DATAx  0 SDATA  x  DATA P X DATAP   DATA  P ADATA ( H DATA( p DATAp  ( DATA  p  DATA H X BDATAH  DATA  H CDATA  9DATA h  1DATAh  p %DATA  h DATA @  DATA@  @ DATA  @ DATA  DATA ` &DATA`   X DATA  ` DATA 8 DATA8  H DATA  8 'DATA  DATA X 0 DATAX   p ,DATA  X DATA 0  DATA0 x X !DATAx  0 DATA  x DATA P P DATAP   DATA  P 7DATA ( ( "DATA( p DATAp  ( 0DATA  p 0 eDATA H DATAH   DATA  H ` DATA  DATA h DATAh  8 DATA  h DATA @ DATA@  DATA  @ ` *DATA  DATA `  @DATA`   DATA  ` DATA 8  'DATA8  ` !DATA H 8  DATAH   DATA  H P DATA   DATA h  DATAh  ( DATA  h ` DATA @  DATA@   DATA  @ @ DATA   DATA `  DATA`    DATA  ` @ jDATA 8  DATA8  0 DATA  8  DATA   3DATA X 0 DATAX    DATA  X  DATA 0  DATA0 x 8 6DATAx  0  DATA  x  DATA P 6DATAP   #DATA  P "DATA ( 8 .DATA( p .DATAp  ( DATA  p @ DATA H DATAH  DATA  H 0 DATA  DATA h DATAh  DATA  h H %DATA @ ;DATA@   DATA  @ H DATA   DATA `  DATA`   ( DATA  ` p DATA 8  DATA8   DATA  8 8 DATA   fDATA X  DATAX   X DATA  X  DATA 0  DATA0 x  DATAx  0 h 2DATA  x  DATA P  DATAP   P DATA  P  DATA (  DATA( p  DATAp  ( x DATA  p  DATA H  >DATAH   >DATA  H  CDATA  p CDATA h  9DATAh  X DATA  h  DATA @  DATA@   DATA  @ P DATA   DATA `  DATA`   H *DATA  `  DATA 8  $DATA8  @ DATA  8 x DATA   0DATA X ( ODATAX    DATA  X  DATA 0  DATA0 x ` DATAx  0  DATA  x  DATA P  DATAP   ` DATA  P  5DATA (  5DATA( p  5DATAp  (  DATA  p 0 DATA H  DATAH   DATA  H ( DATA  x DATA h DATAh  DATA  h 8! DATA @ x! DATA@  ! DATA  @ " ADATA  " DATA ` " DATA`   # 5DATA  ` x# DATA 8 # 5DATA8  0$ DATA  8 p$ DATA  $ DATA X % DATAX   @% 8DATA  X % %DATA 0 & DATA0 x P& DATAx  0 & DATA  x & DATA P ' DATAP   `' DATA  P ' +DATA ( ' 6DATA( p `( DATAp  ( ( 6DATA  p ) ,DATA H h) DATAH  ) DATA  H * DATA  H* #DATA h * DATAh  * 3DATA  h H+ DATA @ + #DATA@  + BDATA  @ h, &DATA  , DATA ` , 'DATA`   P- DATA  ` - DATA 8 - DATA8  . DATA  8 p. +DATA  . +DATA X 0/ +DATAX   / #DATA  X / DATA 0 (0 DATA0 x h0 DATAx  0 0 4DATA  x 1 4DATA P 1 4DATAP   1 DATA  P @2 DATA ( 2 DATA( p 2 DATAp  ( 3 4DATA  p h3 DATA H 3 DATAH  3 DATA  H (4 DATA  h4 DATA h 4 DATAh  4 DATA  h 85 $DATA @ 5 DATA@  5 DATA  @ (6 DATA  `6 DATA ` 6 DATA`   7 DATA  ` X7 $DATA 8 7 DATA8  8 DATA  8 P8 :DATA  8 DATA X 9 2DATAX   x9 DATA  X 9 DATA 0 : DATA0 x X: .DATAx  0 : 7DATA  x ; DATA P X; %DATAP   ; 5DATA  P < BDATA ( < DATA( p < VDATAp  ( h= DATA  p = DATA H > UDATAH  > @DATA  H ? DATA  H? DATA h ? DATAh  ? DATA  h 8@ DATA @ @ DATA@  @ DATA  @ A DATA  hA DATA ` A DATA`   B DATA  ` HB DATA 8 B DATA8  B JDATA  8 XC LDATA  C LDATA X XD DATAX   D ZDATA  X 8E DATA 0 E :DATA0 x E -DATAx  0 XF 7DATA  x F *DATA P G DATAP   xG DATA  P G DATA ( G DATA( p 8H %DATAp  ( H $DATA  p H DATA H I DATAH  hI _DATA  H I DATA ( HJ DATA( p J >DATAp  ( J -DATA  p PK DATA H K DATAH   K DATA  H L BDATA    L ,DATA  h  L DATAh   8M DATA  h M :DATA @  M HDATA@   pN DATA  @ N %DATA   O DATA `  hO DATA`   O %DATA  ` P DATA 8  `P ADATA8   P DATA  8 0Q DATA   Q DATA X  Q EDATAX   PR GDATA  X R DATA 0  S DATA0 x  XS DATAx  0 S BDATA  x T BDATA P  T MDATAP   U DATA  P hU MDATA (  U DATA( p  8V @DATAp  ( V 2DATA  p W gDATA H W hDATAH  PX DATA  H X LDATA  Y DATA h hY [DATAh  Y dDATA  h Z DATA @ Z DATA@  [ DATA  @ `[ DATA  [ DATA ` [ DATA`   0\ 0DATA  ` \ DATA 8 \ 9DATA8  P] DATA  8 ] DATA   ] 9DATA X  P^ DATAX   ^ RDATA  X (_ DATA 0  x_ DATA0 x  _ DATAx  0 ` DATA  x X` DATA P  ` 9DATAP   a _DATA  P a DATA (  a &DATA( p  @b DATAp  ( b DATA  p b DATA H  (c DATAH   xc #DATA  H c DATA    d DATA  h  `d DATAh   d DATA  h d DATA @  He :DATA@   e !DATA  @ f &DATA   hf DATA `  f DATA`   g DATA  ` @g DATA 8  g :DATA8   h DATA  8 Ph SDATA   h DATA X  (i /DATAX   i DATA  X i :DATA 0  8j bDATA0 x  j DATAx  0 k /DATA  x k DATA P  k DATAP   l #DATA  P xl DATA (  l DATA( p  l DATAp  ( Hm 3DATA  p m DATA H  m DATAH   @n DATA  H n DATA    n 0DATA  h  8o DATAh   xo DATA  h o DATA @  p \DATA@   p DATA  @ p DATA   q DATA `  hq DATA`   q ?DATA  ` r DATA 8  Xr DATA8   r DATA  8 r DATA ! 8s DATA! X! xs DATAX! ! ! s BDATA! ! X! 8t DATA! 0" ! t )DATA0" x" ! t ,DATAx" " 0" @u DATA" # x" u DATA# P# " u DATAP# # # (v DATA# # P# pv "DATA# ($ # v DATA($ p$ # w DATAp$ $ ($ Pw DATA$ % p$ w DATA% H% $ w DATAH% % % x DATA% % H% Xx DATA%  & % x DATA & h& % x DATAh& & & 8y DATA& & h& y !DATA& @' & y DATA@' ' & 0z DATA' ' @' xz 'DATA' ( ' z DATA( `( ' { DATA`( ( ( P{ )DATA( ( `( { DATA( 8) ( { DATA8) ) ( 8| DATA) ) 8) | DATA) * ) | DATA* X* ) } DATAX* * * X} DATA* * X* } DATA* 0+ * } (DATA0+ x+ * @~ (DATAx+ + 0+ ~ (DATA+ , x+  (DATA, P, + ` DATAP, , ,  DATA, , P,  DATA, (- , 8 DATA(- p- , DATAp- - (- Ѐ DATA- . p- ( DATA. H. - h DATAH. . . DATA. . H.  DATA.  / . P DATA / h/ . DATAh/ / / DATA/ / h/ DATA/ @0 / h 'DATA@0 0 / DATA0 0 @0  DATA0 1 0 @ DATA1 `1 0 'DATA`1 1 1 DATA1 1 `1  DATA1 82 1 h DATA82 2 1 DATA2 2 82 DATA2 3 2 @ DATA3 X3 2 DATAX3 3 3 Ȇ DATA3 3 X3  (DATA3 04 3 p (DATA04 x4 3 Ї (DATAx4 4 04 0 (DATA4 5 x4 DATA5 P5 4 Ј DATAP5 5 5  DATA5 5 P5 h DATA5 (6 5 DATA(6 p6 5 DATAp6 6 (6 X DATA6 7 p6 DATA7 H7 6 DATAH7 7 7 8 DATA7 7 H7 DATA7  8 7 ؋ DATA 8 h8 7  DATAh8 8 8 P DATA8 8 h8 DATA8 @9 8 "DATA@9 9 8 @ 1DATA9 9 @9 DATA9 : 9 DATA: `: 9 @ DATA`: : : DATA: : `: Ў DATA: 8; : DATA8; ; : p DATA; ; 8; DATA; < ; DATA< X< ; P DATAX< < < DATA< < X< DATA< 0= < ( DATA0= x= < x DATAx= = 0= ȑ DATA= > x=  DATA> P> = H DATAP> > > DATA> > P> ؒ DATA> (? > ( DATA(? p? > x DATAp? ? (? DATA? @ p?  DATA@ H@ ? X DATAH@ @ @ DATA@ @ H@ DATA@  A @ 8 ^DATA A hA @ ȕ DATAhA A A DATAA A hA H >DATAA @B A DATA@B B A DATAB B @B 8 %DATAB C B DATAC `C B ؗ %DATA`C C C 0 DATAC C `C DATAC 8D C И DATA8D D C  DATAD D 8D h DATAD E D DATAE XE D  FDATAXE E E DATAE E XE К DATAE 0F E DATA0F xF E p DATAxF F 0F DATAF G xF DATAG PG F ( DATAPG G G h DATAG G PG &DATAG (H G  DATA(H pH G H &DATApH H (H DATAH I pH DATAI HI H @ DATAHI I I DATAI I HI DATAI  J I DATA J hJ I P DATAhJ J J DATAJ J hJ DATAJ @K J ( DATA@K K J h DATAK K @K DATAK L K  DATAL `L K X DATA`L L L DATAL L `L DATAL 8M L P DATA8M M L DATAM M 8M آ DATAM N M DATAN XN M h DATAXN N N DATAN N XN DATAN 0O N ( DATA0O xO N DATAxO O 0O ؤ DATAO P xO  DATAP PP O h DATAPP P P DATAP P PP  DATAP (Q P P DATA(Q pQ P &DATApQ Q (Q DATAQ R pQ 8 &DATAR HR Q DATAHR R R ا \DATAR R HR h DATAR  S R \DATA S hS R 8 #DATAhS S S DATAS S hS ة DATAS @T S ( DATA@T T S h DATAT T @T HDATAT U T 8 DATAU `U T DATA`U U U ث DATAU U `U ( DATAU 8V U h DATA8V V U DATAV V 8V DATAV W V ( DATAW XW V ` -DATAXW W W DATAW W XW DATAW 0X W H CDATA0X xX W DATAxX X 0X DATAX Y xX @ DATAY PY X +DATAPY Y Y .DATAY Y PY H DATAY (Z Y DATA(Z pZ Y &DATApZ Z (Z @ DATAZ [ pZ ;DATA[ H[ Z DATAH[ [ [ H $DATA[ [ H[ DATA[  \ [ DATA \ h\ [ 8 DATAh\ \ \ "DATA\ \ h\ &DATA\ @] \ 8 DATA@] ] \ DATA] ] @] ش <DATA] ^ ] H DATA^ `^ ] 4DATA`^ ^ ^ DATA^ ^ `^ @ DATA^ 8_ ^ DATA8_ _ ^ 9DATA_ _ 8_ P 0DATA_ ` _ DATA` X` _ DATAX` ` ` @ DATA` ` X` DATA` 0a ` DATA0a xa `  ZDATAxa a 0a DATAa b xa DATAb Pb a 8 DATAPb b b DATAb b Pb غ DATAb (c b ( HDATA(c pc b DATApc c (c DATAc d pc ( #DATAd Hd c %DATAHd d d ؼ %DATAd d Hd 0 DATAd  e d p DATA e he d %DATAhe e e DATAe e he P DATAe @f e DATA@f f e 1DATAf f @f X 3DATAf g f 3DATAg `g f ( DATA`g g g ` DATAg g `g DATAg 8h g DATA8h h g DATAh h 8h ` )DATAh i h DATAi Xi h  DATAXi i i P DATAi i Xi DATAi 0j i DATA0j xj i  DATAxj j 0j @ ADATAj k xj DATAk Pk j  DATAPk k k H DATAk k Pk DATAk (l k BDATA(l pl k @ DATApl l (l DATAl m pl DATAm Hm l ( DATAHm m m x DATAm m Hm (DATAm  n m  7DATA n hn m x DATAhn n n <DATAn n hn 8 DATAn @o n DATA@o o n DATAo o @o  DATAo p o X DATAp `p o DATA`p p p "DATAp p `p @ DATAp 8q p DATA8q q p DATAq q 8q DATAq r q @ DATAr Xr q x DATAXr r r DATAr r Xr  DATAr 0s r H DATA0s xs r DATAxs s 0s DATAs t xs DATAt Pt s p DATAPt t t DATAt t Pt DATAt (u t H DATA(u pu t DATApu u (u DATAu v pu  DATAv Hv u P DATAHv v v DATAv v Hv DATAv  w v  DATA w hw v P +DATAhw w w +DATAw w hw  DATAw @x w P DATA@x x w ADATAx x @x DATAx y x P DATAy `y x DATA`y y y DATAy y `y  BDATAy 8z y DATA8z z y DATAz z 8z DATAz { z p DATA{ X{ z DATAX{ { { DATA{ { X{ @ DATA{ 0| { DATA0| x| { MDATAx| | 0| ` DATA| } x| DATA} P} | DATAP} } } 8 DATA} } P} x DATA} (~ } DATA(~ p~ }  DATAp~ ~ (~ ` !DATA~  p~ BDATA H ~ 0 DATAH   p DATA  H DATA (  DATA( p  8 DATAp  ( x DATA  p DATA H  DATAH  X DATA ؁ H !DATA؁  JDATA h ؁ DATAh  DATA  h DATA @ @ DATA@  DATA Ѓ @ DATAЃ   +DATA ` Ѓ x DATA`   DATA  ` DATA 8 P DATA8  DATA ȅ 8 DATAȅ  8 DATA X ȅ DATAX   DATA  X  DATA 0 H DATA0 x !DATAx  0 DATA  x ( DATA P ` ADATAP   DATA  P DATA ( ` DATA( p DATAp  ( BDATA  p X *DATA H %DATAH   DATA ؊ H H DATA؊  DATA h ؊ $DATAh  0 DATA  h x $DATA @ DATA@   DATA Ќ @ P DATAЌ  *DATA ` Ќ 2DATA`   X DATA  ` DATA 8 DATA8   DATA Ȏ 8 P DATAȎ  DATA X Ȏ DATAX    DATA  X P DATA 0 DATA0 x DATAx  0 0 DATA  x p DATA P DATAP   DATA  P H DATA ( DATA( p DATAp  ( KDATA  p DATA H DATAH  0 'DATA ؓ H (DATAؓ  DATA h ؓ ( DATAh  x &DATA  h 'DATA @ ( DATA@  x DATA Е @ DATAЕ  7DATA ` Е ` 8DATA`   DATA  ` HDATA 8 DATA8  DATA ȗ 8  DATAȗ  ` DATA X ȗ DATAX   DATA  X DATA 0 ` DATA0 x 4DATAx  0  4DATA  x x DATA P DATAP   !DATA  P P !DATA ( DATA( p %DATAp  ( H "DATA  p "DATA H DATAH  @ DATA ؜ H DATA؜  @ 4DATA h ؜ DATAh  4DATA  h X +DATA @ DATA@  3DATA О @ ` +DATAО  4DATA ` О ( 4DATA`   DATA  ` DATA 8 DATA8  h 4DATA Ƞ 8 4DATAȠ  8 DATA X Ƞ p DATAX   DATA  X DATA 0 0 DATA0 x h DATAx  0 DATA  x DATA P @ DATAP   x DATA  P  ADATA ( ( DATA( p p DATAp  (  DATA  p  DATA H 0 BDATAH   #DATA إ H  ?DATAإ  p (DATA h إ  DATAh   DATA  h H DATA @  DATA@   DATA Ч @  )DATAЧ  h DATA ` Ч  DATA`    DATA  ` @ DATA 8 x #DATA8   DATA ȩ 8  %DATAȩ  p DATA X ȩ  DATAX    DATA  X H DATA 0  DATA0 x  DATAx  0   DATA  x X  DATA P  DATAP    DATA  P  DATA ( h  DATA( p  !DATAp  (   DATA  p P  DATA H  DATAH   DATA خ H   DATAخ  `  "DATA h خ  !DATAh    "DATA  h h  1DATA @  /DATA@  0 !DATA а @  DATAа   !DATA ` а ( DATA`   h DATA  `  DATA 8  %DATA8  ` hDATA Ȳ 8  MDATAȲ   DATA X Ȳ  DATAX    DATA  X P DATA 0  DATA0 x  !DATAx  0 8 !DATA  x  4DATA P  HDATAP   x DATA  P  6DATA ( ( 8DATA( p  DATAp  (  DATA  p  DATA H X DATAH   DATA ط H  DATAط  0 &DATA h ط  DATAh   DATA  h  DATA @ H $DATA@   DATA й @  %DATAй  @ DATA ` й  :DATA`    /DATA  ` P DATA 8  DATA8   DATA Ȼ 8  DATAȻ  H DATA X Ȼ  DATAX    DATA  X  DATA 0 ` DATA0 x  DATAx  0  DATA  x @ DATA P  DATAP    DDATA  P X DATA (  >DATA( p  *DATAp  ( ` DATA  p  DATA H  DATAH  0  DATA  H h  %DATA   TDATA h H! DATAh  ! ~DATA  h H" DATA @ " YDATA@  # DATA  @ P# DATA  # DATA ` # DATA`   $ DATA  ` P$ DATA 8 $ 0DATA8  % DATA  8 H% DATA  % 'DATA X % )DATAX   H& DATA  X & DATA 0 & DATA0 x ' nDATAx  0 ' DATA  x ' DATA P @( DATAP   ( DATA  P ( DATA ( ) KDATA( p ) DATAp  ( ) DATA  p * DATA H H* DATAH  * -DATA  H * DATA  (+ 4DATA h + DATAh  + DATA  h , DATA @ P, DATA@  , DATA  @ , DATA  (- DATA ` `- DATA`   - DATA  ` - DATA 8 . ADATA8  . DATA  8 . DATA  / DATA X `/ DATAX   / BDATA  X 0 DATA 0 h0 DATA0 x 0 DATAx  0 1 DATA  x P1 "DATA P 1 DATAP   DATA  P ؊ DATA (  DATA( p X DATAp  ( DATA  p DATA H 8 DATAH  DATA  H Ќ =DATA  @ ?DATA h >DATAh  DATA  h X DATA @ DATA@  'DATA  @ @ DATA  DATA ` DATA`   ( (DATA  ` "DATA 8 "DATA8  8 #DATA  8  #DATA   $DATA X @ #DATAX    $DATA  X  $DATA 0 H %DATA0 x  "DATAx  0  DATA  x 0 DATA P h DATAP    DATA  P  DATA ( 8 DATA( p  DATAp  (  DATA  p  DATA H ` DATAH   DATA  H  DATA  P DATA h  "DATAh   DATA  h ( "DATA @  /DATA@   *DATA  @ @ DATA  DATA ` ADATA`   8 DATA  ` DATA 8 2 DATA8  `2 DATA  8 2 BDATA  3 DATA X h3 DATAX   3 DATA  X 3 DATA 0 84 DATA0 x 4 "DATAx  0 4 DATA  x (5 DATA P p5 DATAP   5 DATA  P 5 DATA ( 06 DATA( p 6 DATAp  ( 6 DATA  p 7 DATA H h7 ?DATAH  7 ADATA  H P8 @DATA  8 DATA h 9 $DATAh  X9 'DATA  h 9 DATA @ 9 DATA@  (: DATA  @ `: DATA  : DATA ` : +DATA`   H; DATA  ` ; DATA 8 P< DATA8  < #DATA  8 < DATA  (= DATA X x= DATAX   = DATA  X > DATA 0 X> DATA0 x > DATAx  0 > DATA  x H? DATA P ? DATAP   ? DATA  P @ 1DATA ( x@ DATA( p @ DATAp  ( A DATA  p HA #DATA H A /DATAH  B DATA  H PB DATA  B DATA h B DATAh  C DATA  h hC DATA @ C %DATA@  D 0DATA  @ pD DATA  D DATA ` E DATA`   PE DATA  ` E #DATA 8 E DATA8  (F %DATA  8 F DATA  F DATA X G DATAX   G DATA  X H DATA 0 hH DATA0 x H %DATAx  0 I /DATA  x pI DATA P I %DATAP   J DATA  P pJ DATA ( J %DATA( p K #DATAp  ( xK DATA  p K %DATA H (L %DATAH  L DATA  H L %DATA  0M $DATA h M DATAh  M %DATA  h 0N %DATA @ N DATA@  N DATA  @ O DATA  hO #DATA ` O DATA`   %DATA  ` X DATA 8 DATA8  X DATA  8 )DATA   DATA X X %DATAX   DATA  X DATA 0 DATA0 x  -DATAx  0 h DATA  x %DATA P  DATAP   ` DATA  P  DATA ( h (DATA( p Ȗ DATAp  ( %DATA  p x #DATA H З DATAH  %DATA  H x DATA ( Ș DATA( p DATAp  ( Й DATA  p DATA H ` %DATAH   "DATA  H  DATA    X %DATA  h  'DATAh    DATA  h P %DATA @  DATA@   DATA  @ H %DATA   )DATA `  DATA`   H %DATA  ` DATA 8  DATA8   "DATA  8 x "DATA   П /DATA X  0 #DATAX   DATA  X Р DATA 0   ADATA0 x  DATAx  0 ȡ DATA  x  DATA P  H DATAP   BDATA  P DATA (  @ $DATA( p  DATAp  ( DATA  p DATA H p DATAH  DATA  H DATA  ( DATA h h DATAh  DATA  h إ DATA @  DATA@  X DATA  @ DATA  ئ DATA `  DATA`   P DATA  ` "DATA 8 DATA8  H #DATA  8 DATA   ب DATA X  &DATAX   x DATA  X &DATA 0   DATA0 x  ` 3DATAx  0 Ȫ 2DATA  x 0 6DATA P  >DATAP    7DATA  P p DATA (  DATA( p   &DATAp  ( h DATA  p &DATA H  DATAH   P DATA  H 3DATA    DATA  h  H DATAh   DATA  h د DATA @  ( DATA@   x DATA  @ &DATA    %DATA `  h &DATA`   /DATA  ` DATA 8  h :DATA8   ز 3DATA  8 @ DATA   DATA X  س &DATAX   0 4DATA  X DATA 0  д DATA0 x   DATAx  0 H DATA  x %DATA P  DATAP   0 %DATA  P DATA (  ȶ %DATA( p  3DATAp  ( %DATA  p DATA H  %DATAH   x DATA  H DATA     %DATA  h  ` DATAh   %DATA  h  DATA @  P %DATA@   DATA  @ DATA   0 1DATA `  DATA`   ػ %DATA  ` 0 DATA 8  x %DATA8   м DATA  8  DATA ! H DATA! X! 8DATAX! ! ! DATA! ! X! P 7DATA! 0" ! ]DATA0" x" ! H DATAx" " 0" DATA" # x" ؿ DATA# P# "  6DATAP# # # %DATA# # P# DATA# ($ # %DATA($ p$ # x DATAp$ $ ($ DATA$ % p$  DATA% H% $ X DATAH% % % DATA% % H% DATA%  & % @ DATA & h& % DATAh& & & DATA& & h& 0 DATA& @' & x (DATA@' ' & DATA' ' @' ( DATA' ( ' p DATA( `( ' DATA`( ( (  DATA( ( `( @ 4DATA( 8) ( DATA8) ) ( 9DATA) ) 8) P DATA) * ) 4DATA* X* ) DATAX* * * 8 DATA* * X* x DATA* 0+ * DATA0+ x+ * DATAx+ + 0+ ADATA+ , x+ DATA, P, + DATAP, , , DATA, , P, ` DATA, (- , BDATA(- p- ,  DATAp- - (- h #DATA- . p- 2DATA. H. - ( DDATAH. . . DATA. . H. 'DATA.  / . @ %DATA / h/ . DATAh/ / / DATA/ / h/  DATA/ @0 / ` DATA@0 0 / DATA0 0 @0 DATA0 1 0  DATA1 `1 0 ` DATA`1 1 1 DATA1 1 `1 DATA1 82 1 ( KDATA82 2 1 DATA2 2 82 dDATA2 3 2 DATA3 X3 2 DATAX3 3 3  DATA3 3 X3 ` DATA3 04 3 DATA04 x4 3 EDATAx4 4 04 h DATA4 5 x4 (DATA5 P5 4  DATAP5 5 5 ` DATA5 5 P5 DATA5 (6 5 DATA(6 p6 5 8 DATAp6 6 (6 DATA6 7 p6 DATA7 H7 6 *DATAH7 7 7 DATA7 7 H7 DATA7  8 7  DATA 8 h8 7 P DATAh8 8 8 DATA8 8 h8 DATA8 @9 8 ( DATA@9 9 8 x $DATA9 9 @9 DATA9 : 9  DATA: `: 9 h DATA`: : : 'DATA: : `:  DATA: 8; : @ DATA8; ; : DATA; ; 8; DATA; < ; DATA< X< ; h DATAX< < < %DATA< < X<  DATA< 0= < X DATA0= x= < DATAx= = 0= DATA= > x= @ DATA> P> = DATAP> > > 1DATA> > P> 0 DATA> (? > p DATA(? p? > DATAp? ? (?  DATA? @ p? X DATA@ H@ ? .DATAH@ @ @  \DATA@ @ H@ DATA@  A @ -DATA A hA @ P DATAhA A A DATAA A hA DATAA @B A 8 DATA@B B A DATAB B @B DATAB C B DATAC `C B p DATA`C C C DATAC C `C  DATAC 8D C P DATA8D D C DATAD D 8D DATAD E D H DATAE XE D DATAXE E E (DATAE E XE @ DATAE 0F E DATA0F xF E DATAxF F 0F 0 DATAF G xF p DATAG PG F DATAPG G G DATAG G PG 8 DATAG (H G p FDATA(H pH G )DATApH H (H H DATAH I pH DATAI HI H DATAHI I I 0 DATAI I HI *DATAI  J I #DATA J hJ I @ $DATAhJ J J 4DATAJ J hJ GDATAJ @K J x <DATA@K K J >DATAK K @K X =DATAK L K /DATAL `L K ( 3DATA`L L L DATAL L `L DATAL 8M L 0 DATA8M M L 1DATAM M 8M DATAM N M @ DATAN XN M .DATAXN N N DATAN N XN 0 )DATAN 0O N DATA0O xO N DATAxO O 0O 8 DATAO P xO DATAP PP O DATAPP P P  DATAP P PP ` DATAP (Q P +DATA(Q pQ P  DATApQ Q (Q P DATAQ R pQ DATAR HR Q DATAHR R R ( DATAR R HR p DATAR  S R DATA S hS R  %DATAhS S S p DATAS S hS DATAS @T S  DATA@T T S X (DATAT T @T DATAT U T DATAU `U T @ "DATA`U U U DATAU U `U DATAU 8V U ( DATA8V V U p CDATAV V 8V DATAV W V 0 DATAW XW V DATAXW W W DATAW W XW ( )DATAW 0X W DATA0X xX W DATAxX X 0X &DATAX Y xX x DATAY PY X DATAPY Y Y DATAY Y PY 0 DATAY (Z Y DATA(Z pZ Y GDATApZ Z (Z 0 DATAZ [ pZ h DATA[ H[ Z DATAH[ [ [ DATA[ [ H[ 0 DATA[  \ [ h DATA \ h\ [ ADATAh\ \ \  DATA\ \ h\ ` DATA\ @] \ DATA@] ] \ DATA] ] @]  BDATA] ^ ]  DATA^ `^ ]  ?DATA`^ ^ ^ P DATA^ ^ `^  DATA^ 8_ ^  3DATA8_ _ ^ 8 DATA_ _ 8_ p DATA_ ` _  DATA` X` _  &DATAX` ` ` X DATA` ` X`  "DATA` 0a `  #DATA0a xa ` @ DATAxa a 0a  %DATAa b xa  DATAb Pb a  8DATAPb b b  DATAb b Pb  DATAb (c b  DATA(c pc b ` DATApc c (c  DATAc d pc  ?DATAd Hd c P DATAHd d d  DATAd d Hd  ADATAd  e d 8 DATA e he d DATAhe e e DATAe e he  DATAe @f e H CDATA@f f e DATAf f @f  DATAf g f P DATAg `g f DATA`g g g 6DATAg g `g @ DATAg 8h g DATA8h h g DATAh h 8h ( DATAh i h x DATAi Xi h DATAXi i i  DATAi i Xi P DATAi 0j i  DATA0j xj i  ADATAxj j 0j 8 DATAj k xj  DATAk Pk j  DATAPk k k  DATAk k Pk @ CDATAk (l k  DATA(l pl k  DATApl l (l 8 DATAl m pl  DATAm Hm l  DATAHm m m  !DATAm m Hm X DATAm  n m  DATA n hn m  DATAhn n n ( DATAn n hn p DATAn @o n  DATA@o o n  DATAo o @o X DATAo p o  DATAp `p o  DATA`p p p  DATAp p `p @ ADATAp 8q p  DATA8q q p  DATAq q 8q @ DATAq r q  DATAr Xr q  BDATAXr r r 8 DATAr r Xr x PDATAr 0s r  YDATA0s xs r  UDATAxs s 0s  4DATAs t xs  9DATAt Pt s  @DATAPt t t h CDATAt t Pt  &DATAt (u t 8 DATA(u pu t p DATApu u (u  DATAu v pu  DATAv Hv u P DATAHv v v  DATAv v Hv  1DATAv  w v 8 5DATA w hw v  8DATAhw w w  DATAw w hw H DATAw @x w  DATA@x x w  DATAx x @x  MDATAx y x  DATAy `y x  GDATA`y y y P DATAy y `y DATAy 8z y ADATA8z z y H! DATAz z 8z ! kDATAz { z 0" _DATA{ X{ z " DATAX{ { { # ^DATA{ { X{ # ]DATA{ 0| { ($ DATA0| x| { p$ DATAx| | 0| H% DATA| } x| % DATA} P} | % ?DATAP} } } X& aDATA} } P} & tDATA} (~ } ' fDATA(~ p~ } 0( DATAp~ ~ (~ h( DATA~  p~ ( DATA H ~ ( DATAH   ) DATA  H ) DATA (  @* JDATA( p  * DATAp  ( + BDATA  p + VDATA H , \DATAH  , GDATA ؁ H - *DATA؁  p- >DATA h ؁ - >DATAh  P. =DATA  h . MDATA @ @/ JDATA@  / PDATA Ѓ @ H0 DATAЃ  0 DATA ` Ѓ 0 DATA`   1 8DATA  ` 1 DATA 8 1 2DATA8  02 DATA ȅ 8 h2 DATAȅ  2 DATA X ȅ 3 DATAX   H3 DATA  X 3 DATA 0 3 DATA0 x 4 DATAx  0 `4 DATA  x 4 DATA P 5 DATAP   P5 DATA  P 5 DATA ( 5 DATA( p 86 >DATAp  ( 6 DATA  p 6 DATA H 7 ,DATAH  x7 RDATA  H 8 UDATA P 8 DATAP   8 DATA  P 9 DATA ( @9 DATA( p 9 KDATAp  ( : :DATA  p x: QDATA H ; bDATAH  ; YDATA  H (< \DATA   < DATA  h = jDATAh   > jDATA  h > dDATA @  X? WDATA@   ? DATA  @ 0@ bDATA   @ WDATA `  PA DATA`   A DATA  ` `B DATA 8  (C WDATA8   C dDATA  8 HD ZDATA   D 8DATA X  HE 0DATAX   E DATA  X E DATA 0  8F DATA0 x  F DATAx  0 F DATA  x G DATA P  XG DATAP   G DATA  P G DATA (  0H DATA( p  xH DDATAp  ( H DATA  p @I DATA H  I DATAH   I =DATA  H HJ DATA    J DATA  h  J 5DATAh   0K 8DATA  h K :DATA @  L ?DATA@   L TDATA  @ M DATA   @M bDATA `  M dDATA`   pN ZDATA  ` O 8DATA 8  pO DATA8   O 7DATA  8 (P DATA   `P 1DATA X  P DATAX   Q DATA  X `Q DATA 0  Q DATA0 x  Q DATAx  0 8R DATA  x R DATA P  R DATAP   S DATA  P `S DATA (  S DATA( p  S DATAp  ( @T DATA  p T DATA H  T DATAH   T DATA  H 8U DATA p  U DATAp   U DATA  p V DATA H `V DATAH  V DATA  H V DATA  0W DATA h hW DATAh  W DATA  h X 'DATA @ `X DATA@  X DATA  @ X DATA  8Y DATA ` Y 'DATA`   Y DATA  ` 0Z DATA 8 xZ IDATA8  Z DATA  8 8[ DATA  p[ DATA X [ DATAX   \ DATA  X P\ DATA 0 \ DATA0 x \ DATAx  0 (] $DATA  x ] $DATA P ] DATAP   ^ DATA  P h^ DATA ( ^ DATA( p ^ 2DATAp  ( X_ DATA  p _ DATA H _ DATAH  (` /DATA  H ` DATA  ` DATA h a DATAh  @a ADATA  h a DATA @ b DATA@  @b DATA  @ b DATA  b BDATA ` 8c DATA`   c DATA  ` c DATA 8 d DATA8  Xd DATA  8 d DATA  d DATA X 0e DATAX   xe DATA  X e DATA 0 f DATA0 x Hf DATAx  0 f DATA  x f DATA P g DATAP   hg DATA  P g DATA ( g DATA( p @h DATAp  ( xh ADATA  p h DATA H @i DATAH  i DATA  H i DATA  j ADATA h xj DATAh  j 1DATA  h (k DATA @ xk DATA@  k DATA  @ l "DATA  hl DATA ` l DATA`   m DATA  ` @m DATA 8 m 'DATA8  m DATA  8 n DATA   pn 'DATA X  n DATAX   o 'DATA  X Xo DATA 0  o DATA0 x  o DATAx  0 p DATA  x `p DATA P  p DATAP   p DATA  P q ADATA (  q DATA( p  q DATAp  ( (r DATA  p hr DATA H  r ADATAH   s DATA  H hs DATA    s $DATA  h  t DATAh   @t DATA  h t DATA @  t DATA@   u DATA  @ `u DATA   u &DATA `  u DATA`   0v DATA  ` v DATA 8 v DATA8  w DATA  8 Xw DATA  w DATA X w "DATAX   @x ,DATA  X x DATA 0 x 5DATA0 x Py DATAx  0 y DATA  x y DATA P z DATAP   Pz DATA  P z ADATA ( { DATA( p P{ DATAp  ( { DATA  p { DATA H  | BDATAH   | DATA  H | DATA    } &DATA  h  x} DATAh   } "DATA  h ~ DATA @  P~ DATA@   ~ ADATA  @  DATA   P DATA `   DATA`    DATA  `  BDATA 8  DATA8   ؀ KDATA  8 X DATA   DATA X  DATAX   ( DATA  X p DATA 0  DATA0 x  DATAx  0 @ DATA  x DATA P  Ѓ DATAP   DATA  P ` DATA (  DATA( p  DATAp  ( H DATA  p DATA H  Ѕ DATAH   DATA  H ` DATA    DATA  h  DATAh   @ DATA  h DATA @  Ї DATA@    DATA  @ X DATA   DATA `  ؈ DATA`   DATA  ` ` DATA 8  DATA8   ؉ ADATA  8 P DATA   DATA X  ؊ DATAX    DATA  X X BDATA 0  Ћ DATA0 x  KDATAx  0 DATA  x DATA P  0 DATAP   x DATA  P DATA (   DATA( p  P DATAp  ( DATA ! p DATA! H! ( DATAH! ! ! p DATA! ! H! DATA!  " !  DATA " h" ! X DATAh" " " DATA" " h" DATA" @# " 8 DATA@# # " DATA# # @# Б DATA# $ #  DATA$ `$ # h DATA`$ $ $ DATA$ $ `$ DATA$ 8% $ @ DATA8% % $ DATA% % 8% ȓ DATA% & %  DATA& X& % X DATAX& & & DATA& & X& DATA& 0' & 0 DATA0' x' & p /DATAx' ' 0' Е DATA' ( x'  DATA( P( ' h DATAP( ( ( ADATA( ( P(  DATA( () ( ` DATA() p) ( DATAp) ) () DATA) * p) BDATA* H* ) DATAH* * * ,DATA* * H* @ 6DATA*  + * DDATA + h+ * /DATAh+ + + DATA+ + h+ К DATA+ @, +  DATA@, , + ` DATA, , @, "DATA, - , DATA- `- , @ DATA`- - - !DATA- - `- ؜ DATA- 8. - DATA8. . - ` #DATA. . 8. DATA. / . DATA/ X/ . @ DATAX/ / / DATA/ / X/ ؞ DATA/ 00 / ( DATA00 x0 / h DATAx0 0 00 DATA0 1 x0 !DATA1 P1 0 P $DATAP1 1 1 WDATA1 1 P1 0 DATA1 (2 1 x "DATA(2 p2 1 С DATAp2 2 (2  DATA2 3 p2 ` DATA3 H3 2 DATAH3 3 3 DATA3 3 H3 P DATA3  4 3 4DATA 4 h4 3 DATAh4 4 4 8 DATA4 4 h4 $DATA4 @5 4 $DATA@5 5 4 8 $DATA5 5 @5 DATA5 6 5 Х !DATA6 `6 5 ( 0DATA`6 6 6 DATA6 6 `6 ئ DATA6 87 6 ( !DATA87 7 6 DATA7 7 87 DATA7 8 7  !DATA8 X8 7 h DATAX8 8 8 DATA8 8 X8 /DATA8 09 8 ` !DATA09 x9 8 /DATAx9 9 09  !DATA9 : x9 p /DATA: P: 9 Ъ !DATAP: : : ( !DATA: : P: EDATA: (; : DATA(; p; : @ 'DATAp; ; (; DATA; < p; ج DATA< H< ; ( EDATAH< < < DATA< < H< "DATA<  = < 8 +DATA = h= < )DATAh= = = DATA= = h= 8 DATA= @> = 'DATA@> > = "DATA> > @> 8 DATA> ? > x !DATA? `? > а DATA`? ? ?  !DATA? ? `? h DATA? 8@ ? DATA8@ @ ? DATA@ @ 8@ H DATA@ A @ $DATAA XA @ "DATAXA A A 8 DATAA A XA x DATAA 0B A ȳ DATA0B xB A  DATAxB B 0B X $DATAB C xB "DATAC PC B  DATAPC C C H DATAC C PC DATAC (D C DATA(D pD C 8 DATApD D (D DATAD E pD ȶ DATAE HE D  DATAHE E E X DATAE E HE DATAE  F E DATA F hF E @ DATAhF F F DATAF F hF ȸ DATAF @G F  #DATA@G G F p DATAG G @G DATAG H G DATAH `H G P #DATA`H H H (DATAH H `H  DATAH 8I H H DATA8I I H DATAI I 8I Ȼ DATAI J I  5DATAJ XJ I SDATAXJ J J  DATAJ J XJ H DATAJ 0K J ?DATA0K xK J  DATAxK K 0K H ADATAK L xK DATAL PL K >DATAPL L L p DATAL L PL DATAL (M L !DATA(M pM L P DATApM M (M DATAM N pM DATAN HN M  @DATAHN N N DATAN N HN DATAN  O N  DATA O hO N P @DATAhO O O DATAO O hO 'DATAO @P O X (DATA@P P O DATAP P @P 6DATAP Q P X >DATAQ `Q P DATA`Q Q Q  %DATAQ Q `Q h %DATAQ 8R Q DATA8R R Q 3DATAR R 8R ` 1DATAR S R 3DATAS XS R 0 DATAXS S S x 4DATAS S XS DATAS 0T S ( DATA0T xT S h DATAxT T 0T DATAT U xT DATAU PU T <DATAPU U U DATAU U PU 9DATAU (V U 8 DATA(V pV U x 3DATApV V (V DATAV W pV ( 'DATAW HW V DATAHW W W 8DATAW W HW ( &DATAW  X W DATA X hX W DATAhX X X  DATAX X hX P DATAX @Y X CDATA@Y Y X  DATAY Y @Y H &DATAY Z Y DATAZ `Z Y ,DATA`Z Z Z 8 DATAZ Z `Z 'DATAZ 8[ Z %DATA8[ [ Z 0 DATA[ [ 8[ DATA[ \ [ DATA\ X\ [ DATAX\ \ \ 8 DATA\ \ X\ 5DATA\ 0] \ DATA0] x] \ 0DATAx] ] 0] ?DATA] ^ x] DATA^ P^ ] 0 DATAP^ ^ ^ p DATA^ ^ P^ DATA^ (_ ^ &DATA(_ p_ ^ P DATAp_ _ (_ DATA_ ` p_ 4DATA` H` _ H DATAH` ` ` DATA` ` H` DATA`  a `  DATA a ha ` X DATAha a a DATAa a ha cDATAa @b a p DATA@b b a DATAb b @b DATAb c b 0 $DATAc `c b DATA`c c c 3DATAc c `c 8 DATAc 8d c DATA8d d c DATAd d 8d  DATAd e d ` "DATAe Xe d )DATAXe e e  DATAe e Xe h DATAe 0f e )DATA0f xf e  DATAxf f 0f X DATAf g xf RDATAg Pg f  DATAPg g g P DATAg g Pg DATAg (h g DATA(h ph g  DATAph h (h X DATAh i ph DATAi Hi h %DATAHi i i 0 DATAi i Hi h DATAi  j i RDATA j hj i @ [DATAhj j j TDATAj j hj X PDATAj @k j QDATA@k k j h YDATAk k @k YDATAk l k MDATAl `l k  XDATA`l l l ZDATAl l `l ( PDATAl 8m l QDATA8m m l 8 VDATAm m 8m \DATAm n m P ODATAn Xn m DATAXn n n qDATAn n Xn nDATAn 0o n h nDATA0o xo n  nDATAxo o 0o oDATAo p xo H nDATAp Pp o mDATAPp p p nDATAp p Pp ( nDATAp (q p nDATA(q pq p h oDATApq q (q  oDATAq r pq pDATAr Hr q P lDATAHr r r lDATAr r Hr &DATAr  s r YDATA s hs r x XDATAhs s s  XDATAs s hs XDATAs @t s ( VDATA@t t s UDATAt t @t 8 XDATAt u t ^DATAu `u t X ^DATA`u u u YDATAu u `u x UDATAu 8v u XDATA8v v u XDATAv v 8v RDATAv w v HDATAw Xw v ( rDATAXw w w pDATAw w Xw x pDATAw 0x w pDATA0x xx w pDATAxx x 0x p pDATAx y xx  pDATAy Py x jDATAPy y y ` mDATAy y Py P lDATAy (z y P lDATA(z pz y PQ sDATApz z (z Q jDATAz { pz R mDATA{ H{ z 8S DATAH{ { { S YDATA{ { H{ T XDATA{  | { T XDATA | h| { 0U WDATAh| | | U WDATA| | h| @V VDATA| @} | V XDATA@} } | XW XDATA} } @} W XDATA} ~ } xX XDATA~ `~ } Y SDATA`~ ~ ~ Y XDATA~ ~ `~ Z TDATA~ 8 ~ Z TDATA8  ~ 0[ RDATA  8 [ RDATA   @\ RDATA X  \ RDATAX   P] RDATA  X ] RDATA 0 `^ RDATA0 x ^ RDATAx  0 p_ RDATA  x _ RDATA P ` RDATAP   a RDATA  P a RDATA ( b RDATA( p b RDATAp  ( (c RDATA  p c RDATA H 8d RDATAH  d RDATA ؄ H He RDATA؄  e RDATA h ؄ Xf RDATAh  f DATA  h g DATA @ Ph DATA@  i DATA І @ i yDATAІ  pj zDATA ` І k {DATA`   k xDATA  ` l |DATA 8 0m tDATA8  m qDATA Ȉ 8 n DATAȈ  8o DATA X Ȉ o DATAX   p DATA  X `q DATA 0 r DATA0 x r DATAx  0 s DATA  x @t DATA P t DATAP   u DATA  P hv pDATA ( w pDATA( p w pDATAp  ( `x pDATA  p y nDATA H y mDATAH  Hz mDATA ؍ H z lDATA؍  { jDATA h ؍ (| jDATAh  | nDATA  h h} DATA  } DATA#!BPY[DATA(@ """ Registration info Blender menues:DATA Name:'Sflender'DATA؏ Blender: 235DATA Group: 'Export'DATA<X Tip: 'S2flender(V2.4) Exporter to Macromedia(R) Flash(TM)'DATAȐ """DATA@ # -------------------------------------------------------------DATA,p # Copyright (c) 2003,2004 Emilio Aguirre DATAБ #DATAL # This program is free software; you can redistribute it and/or modifyDATAL # it under the terms of the GNU General Public License as published byDATAH # the Free Software Foundation; either version 2 of the License, orDATA, # (at your option) any later version.DATA #DATAH # This program is distributed in the hope that it will be useful,5{DATAD # but WITHOUT ANY WARRANTY; without even the implied warranty ofDATAD # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theDATA4 # GNU General Public License for more details.nDATA #DATAH # You should have received a copy of the GNU General Public LicenseDATAD # along with this program; if not, write to the Free Software/DATAP # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USADATA #DATA@ȗ # -------------------------------------------------------------DATA@8 # -------------------------------------------------------------DATA\ # *This program is based on the Macromedia Flash SWF File Format Specification (version 3)DATAT8 # by Macromedia, Inc. Copyright(c) 1995-2003 Macromedia, Inc. All rights reserved. DATAP # Macromedia and Flash are trademarks of Macromedia, Inc. (www.macromedia.com)DATA@@ # -------------------------------------------------------------DATA DATAD # ---------------------------------------------------------------DATA` # DATA # Import SectionDATA #pDATAD # --------------------------------------------------------------- DATA import BlenderDATAМ from os import listdirDATA8 from Blender import Object,Lamp,Camera,NMesh,Types,sysDATA from Blender.Mathutils import *DATAН from Blender.Draw import *DATA from Blender.Types import *DATAp from Blender.BGL import *DATA from Blender.Noise import *DATA from math import *DATA$X from operator import add,sub,mulDATA from time import *DATA DATA0 DATA@h # -------------------------------------------------------------DATAؠ # Generic FunctionsDATA@ # -------------------------------------------------------------DATA def MaxAbs(l):DATAС  if len(l)>0:DATA  m = abs(l[0])DATAP  for i in l:DATA  if abs(i)>m: m = abs(i)DATA  return mDATA  else: return 0DATA` DATA def BitSgn(val):DATA  if val>0: return 0DATA(  else: return 128DATAp DATA def Pad0(n):DATA  return [0]*nDATA( DATA` def Pad1(n):DATA  return [1]*nDATA DATA def Padding(s):DATAX  if s<8: return Pad0(8-s)DATA  d = s % 8DATA  if d == 0:DATA (  return []DATAh  else:DATA  n = 8 - dDATA  return Pad0(n)DATA( DATA(` def SetFileLength(movie,filelength):DATA  r = UI32(filelength)DATA  movie[4] = r[0]DATAH  movie[5] = r[1]DATA  movie[6] = r[2]DATAة  movie[7] = r[3]DATA  returnDATAX DATA( def GetChars(list):DATAp  k = 0DATA  l = 0DATA  size = len(list)DATA(!  numbytes = size/8DATA$p!  if ((size % 8) >0): numbytes+=1DATA!  bytes = Pad0(numbytes)DATA "  byte = 0 DATAP"  for i in range(size):DATA "  byte += list[i] * (2**(7-k)) DATA"  k+=1DATA #  if k>7:DATA`#  bytes[l]=chr(byte)DATA #  byte = 0DATA #  k = 0DATA($  l+=1DATA(`$  if k>0 and k<8: bytes[l] = chr(byte)DATA$  return bytesDATA$ DATA0% def PadChars(l):DATAx%  l.extend(Padding(len(l)))DATA%  return GetChars(l)DATA& DATA H& def GetBinary(number,digits=0):DATA&  if digits == 0:DATA&  maxbits = 1024DATA('  else:DATA`'  maxbits = digitsDATA'  Bits = Pad0(maxbits) DATA'  idx = maxbits-1DATA(8(  while (((number/2)!=0) and (idx>=0)):DATA(  # Get modulusDATA(  Bits[idx] = number % 2 DATA )  number/=2DATA `)  idx-=1DATA )  if (number==1): Bits[idx]=1DATA)  else: Bits[idx]=0DATA8*  if digits >0: return BitsDATA*  else: return Bits[idx:]DATA* DATA + def NBits(val): return len(val)DATA`+ DATA+ def InverseBits(l):DATA$+  return map(lambda x:abs(x-1),l)DATA8, DATAp, def TwosComplement(val):DATA$,  b = InverseBits(GetBinary(val))DATA-  d = GetBinary(1,len(b))DATAh-  r = []DATA-  c = 0DATA-  l = range(len(b))DATA .  l.reverse()DATA`.  for i in l:DATA.  s = b[i]+d[i]+cDATA.  if s == 2: DATA(/  r.append(0)DATA h/  c = 1DATA/  else:DATA/  r.append(s)DATA (0  c = 0DATAh0  r.reverse()DATA 0  return rDATA0 DATA@ 1 # -------------------------------------------------------------DATA1 # SWF ConstantsDATA@1 # -------------------------------------------------------------DATA@2 SOLID_FILL = 0DATA2 LINEAR_GRADIENT_FILL = 16DATA2 RADIAL_GRADIENT_FILL = 18DATA 3 TILED_BITMAP_FILL = 64DATAh3 CLIPPED_BITMAP_FILL = 65DATA3 DATA3 #Place Object FlagsDATA84 PO_NAME = 32DATAx4 PO_RATIO = 16DATA4 PO_COLOR_TRANS = 8DATA5 PO_MATRIX = 4DATA@5 PO_CHAR_ID = 2DATA 5 PO_MOVE = 1DATA5 #Shape Object FlagsDATA 6 SH_MOVE = 1DATAH6 SH_FILL0 = 2DATA6 SH_FILL1 = 4DATA6 SH_LINESTYLE = 8DATA7 SH_NEWSTYLES = 16DATAX7 #Button state flagsDATA 7 BT_HIT = 8DATA 7 BT_DOWN = 4DATA 8 BT_OVER = 2DATA `8 BT_UP = 1DATA08 #Buttons State transitions triggering actionsDATA9 BT_IDLE_TO_OVERUP = 1DATAH9 BT_OVERUP_TO_IDLE = 2DATA9 BT_OVERUP_TO_OVERDOWN = 4DATA9 BT_OVERDOWN_TO_OVERUP = 8DATA0: BT_OVERDOWN_TO_OUTDOWN = 16DATA: BT_OUTDOWN_TO_OVERDOWN = 32DATA: BT_OUTDOWN_TO_IDLE = 64DATA; BT_IDLE_TO_OVERDOWN = 128DATAh; BT_OVERDOWN_TO_IDLE = 256DATA ; #Font FlagsDATA; FONT_HASLAYOUT = 128 DATA@< FONT_SHIFTJIS = 64DATA< FONT_UNICODE = 32 DATA< FONT_ANSI = 16 DATA= FONT_WIDEOFFSETS = 8DATA`= FONT_WIDECODES = 4DATA= FONT_ITALIC = 2DATA= FONT_BOLD = 1DATA (> #Text FlagsDATAh> TEXT_HASFONT = 8DATA> TEXT_HASCOLOR = 4DATA> TEXT_HASYOFFSET = 2DATA@? TEXT_HASXOFFSET = 1DATA? DATA@? # -------------------------------------------------------------DATA0@ # Basic Data TypesDATA@x@ # -------------------------------------------------------------DATA@ DATA A def UI8(val):DATA`A  return chr(val)DATAA DATAA def UI16(val):DATA B  """Return in little-endian"""DATA$pB  return chr(val%256),chr(val/256)DATAB DATAC def UI32(val):DATA @C  """Return in little-endian"""DATAC  hi = UI16(val%65536)DATAC  lo = UI16(val/65536)DATA D  return hi[0],hi[1],lo[0],lo[1]DATApD DATAD def REVUI32(v):DATAD  h2 = ord(v[0])DATA(E  h1 = ord(v[1])DATAhE  l2 = ord(v[2])DATAE  l1 = ord(v[3]) DATA0E  return (((l1*256) + l2)*65536)+((h1*256) + h2)DATAPF DATAF def UB(val,size=0):DATAF  v = GetBinary(val)DATAG  z = size - len(v)DATA `G  if z>0:DATAG  r = Pad0(z)DATAG  r.extend(v)DATA H  return rDATA`H  else:DATAH  return v DATAH DATAI def SB(val,size=0):DATA XI  if val>=0:DATAI  r=[0]DATA I  r.extend(GetBinary(abs(val)))DATA J  else: DATAXJ  r=[1]DATA(J  r.extend(TwosComplement(abs(val)))DATAJ  z = size - len(r)DATA 0K  if z>0:DATApK  if (val<0): v = Pad1(z)DATAK  else: v = Pad0(z)DATAL  v.extend(r)DATA HL  return vDATAL  else:DATA L  return rDATAM DATA8M def SI16(val):DATAxM  r = GetChars(SB(val,16))DATAM  return r[1],r[0]DATAN DATAHN def SI32(val):DATAN  r = GetChars(SB(val,32))DATAN  return r[3],r[2],r[1],r[0]DATA(O  DATA`O def FB(val,size=0):DATAO  midpos = 512DATAO  maxbits= 1024DATA(P  if val>=0: r=[0]DATApP  else: r=[1] DATAP  DATAP  #Create bit listDATA0Q  Bits = Pad0(maxbits)DATAxQ  num = abs(val)DATAQ DATAQ  #Get integer partDATA8R  intnum = abs(int(num))DATAR DATAR  #Get decimal partDATAS  decnum = num - intnumDATAHS DATA0S  # Get binary representation of integer partDATAS  idxI = midposDATA( T  while (((intnum/2)!=0) and (idxI>=0)):DATAxT  # Get modulusDATAT  Bits[idxI] = intnum % 2 DATA U  intnum/=2DATA HU  idxI-=1DATA U  if (intnum==1): Bits[idxI]=1DATAU  else: Bits[idxI]=0DATA V DATA0XV  # Get binary representation of decimal partDATAV  idxD = midpos+1DATA(W  while (decnum>0.0 and idxD=1):DATAW  Bits[idxD] = 1DATA(X  decnum-=1.0DATAhX  else:DATAX  Bits[idxD] = 0DATA X  idxD+=1DATA(Y DATA `Y  i = idxIDATAY  while (i<=midpos):DATAY  r.extend([Bits[i]])DATA0Z  i+=1DATAhZ  i = 1DATAZ  while (i<=16):DATA Z  r.extend([Bits[i+midpos]])DATA0[  i+=1DATAh[  DATA[  z = size - len(r)DATA [  if z>0:DATA(\  if (val<0): v = Pad1(z)DATAx\  else: v = Pad0(z)DATA\  v.extend(r)DATA ]  return vDATA@]  else:DATA x]  return rDATA] DATA] def IEEE_FIXED(val):DATA<8^  """This returns a memory representation of a float pointDATAD^  according to the IEEE 32 bits flotating point representation.DATA _  +- 1.x * 2^eDATA `_  where x is the matissa fieldDATA,_  and e is the bias exponent (bias = 127)DATA`  DATA8H`  Memory out put: Bit 3 3222222 222211111111110000000000DATA,`  1 0987654 321098765432109876543210DATAa  Sign Bias MatissaDATA`a  exponent """DATAa  midpos = 512DATAa  maxbits= 1024DATA0b DATAhb  #Create bit listDATAb  Bits = Pad0(maxbits)DATAb  num = abs(val)DATA8c DATApc  #Get integer partDATAc  intnum = int(num)DATAd DATA8d  #Get decimal partDATAd  decnum = num - intnumDATAd DATA0e  # Get binary representation of integer partDATA`e  idxI = midposDATA(e  while (((intnum/2)!=0) and (idxI>=0)):DATAe  # Get modulusDATA8f  Bits[idxI] = intnum % 2 DATA f  intnum/=2DATA f  idxI-=1DATA g  if (intnum==1): Bits[idxI]=1DATAXg  else: Bits[idxI]=0DATAg DATA0g  # Get binary representation of decimal partDATA8h  idxD = midpos+1DATA(h  while (decnum>0.0 and idxD=1):DATA`i  Bits[idxD] = 1DATAi  decnum-=1.0DATAi  else:DATA j  Bits[idxD] = 0DATA hj  idxD+=1DATAj DATAj  #Get exponentDATA k  idx = 0DATA4`k  while ((idx> 1)DATA m  j = (midpos+1+(-1*exponent))DATA8n  k = 1DATApn  l = 1DATA n  byte = 0 DATAn  for i in range(j,j+23):DATA 8o  byte += Bits[i] * (2**(7-k)) DATAo  k+=1DATA o  if k>7:DATAp  bytes[l]=byteDATA Hp  byte = 0DATA p  k = 0DATAp  l+=1DATA,q  bytes[1] += ((biasExponent << 7) & 128)DATA$`q  # Return value in little-endianDATADq  return [chr(bytes[3]),chr(bytes[2]),chr(bytes[1]),chr(bytes[0])] DATA0r DATAhr def FIXED(val):DATAr  midpos = 512DATAr  maxbits= 1024DATA(s  if val>=0: r=[0]DATAps  else: r=[1] DATAs  DATAs  #Create bit listDATA0t  Bits = Pad0(maxbits)DATAxt  num = abs(val)DATAt DATAt  #Get integer partDATA8u  intnum = abs(int(num))DATAu DATAu  #Get decimal partDATAv  decnum = num - intnumDATAHv DATA0v  # Get binary representation of integer partDATAv  idxI = midposDATA( w  while (((intnum/2)!=0) and (idxI>=0)):DATAxw  # Get modulusDATAw  Bits[idxI] = intnum % 2 DATA x  intnum/=2DATA Hx  idxI-=1DATA x  if (intnum==1): Bits[idxI]=1DATAx  else: Bits[idxI]=0DATA y DATA0Xy  # Get binary representation of decimal partDATAy  idxD = midpos+1DATA(z  while (decnum>0.0 and idxD=1):DATAz  Bits[idxD] = 1DATA({  decnum-=1.0DATAh{  else:DATA{  Bits[idxD] = 0DATA {  idxD+=1DATA(|  for i in range(31):DATA p|  r.extend([Bits[midpos-14+i]])DATA(|  return r[24:]+r[16:24]+r[8:16]+r[0:8]DATA} DATAP} def RECT(x0,y0,x1,y1):DATA(}  #Convert values from pixels to TWIPSDATA}  xmin =x0*20DATA0~  xmax =x1*20DATAp~  ymin =y0*20DATA~  ymax =y1*20DATA~  #Number of bits per valueDATA4@  nbits = NBits(SB(MaxAbs([xmin,xmax,ymin,ymax])))DATA  #Create struct RECTDATA  r = []DATA(  r = UB(nbits,5)DATAp  r.extend(SB(xmin,nbits))DATA  r.extend(SB(xmax,nbits))DATA  r.extend(SB(ymin,nbits))DATA`  r.extend(SB(ymax,nbits))DATA  return rDATA DATA$( def MATRIX(sx,sy,rot0,rot1,tx,ty):DATA  r = []DATA  hasscale = 0DATA  hasrotate = 0DATA(8  if (sx!=1.0 or sy!=1.0): hasscale = 1DATA,  if (rot0!=0.0 or rot1!=0.0): hasrotate = 1DATA  r = [hasscale]DATA0  if (hasscale==1):DATA,x  nScaleBits =NBits(FB(MaxAbs([sx,sy])))DATA ؄  r.extend(UB(nScaleBits,5))DATA (  r.extend(FB(sx,nScaleBits))DATA x  r.extend(FB(sy,nScaleBits))DATAȅ  r.extend([hasrotate])DATA  if (hasrotate==1):DATA0X  nRotateBits = NBits(FB(MaxAbs([rot0,rot1])))DATA  r.extend(UB(nRotateBits,5))DATA$  r.extend(FB(rot0,nRotateBits))DATA$`  r.extend(FB(rot1,nRotateBits))DATA0  nTranslateBits = NBits(SB(MaxAbs([tx,ty])))DATA   r.extend(UB(nTranslateBits,5))DATA$h  r.extend(SB(tx,nTranslateBits))DATA$  r.extend(SB(ty,nTranslateBits))DATA   return rDATAX DATA def RGB(r,g,b):DATA Љ  return [chr(r),chr(g),chr(b)]DATA DATAX def RGBn(r,g,b):DATA,  return [chr(r*255),chr(g*255),chr(b*255)] DATA DATA8 def RGBA(r,g,b,a):DATA(  return [chr(r),chr(g),chr(b),chr(a)]DATA؋ DATA def RGBAn(r,g,b,a):DATA8X  return [chr(r*255),chr(g*255),chr(b*255),chr(a*255)]DATA  DATA, def CXFORM(rmul,gmul,bmul,radd,gadd,badd):DATAX  hasmult = 0DATA  hasadd = 0DATA4؍  if (rmul!=0 or gmul!=0 or bmul!=0): hasmult = 1DATA0@  if (radd!=0 or gadd!=0 or badd!=0): hasadd = 1DATA  r = [hasadd,hasmult]DATA@  nbits = NBits(SB(MaxAbs([rmul,gmul,bmul,radd,gadd,badd])))DATAX  r.extend(UB(nbits,4))DATA  if (hasmult>0):DATA  r.extend(SB(rmul,nbits))DATA8  r.extend(SB(gmul,nbits))DATA  r.extend(SB(bmul,nbits))DATAؐ  if (hasadd>0):DATA  r.extend(SB(radd,nbits))DATAh  r.extend(SB(gadd,nbits))DATA  r.extend(SB(badd,nbits))DATA   return r DATAH DATA@ def CXFORMWITHALPHA(rmul,gmul,bmul,amul,radd,gadd,badd,aadd):DATA  hasmult = 0DATA 0  hasadd = 0DATA<p  if (rmul!=0 or gmul!=0 or bmul!=0 or amul!=0): hasmult = 1DATA<  if (radd!=0 or gadd!=0 or badd!=0 or aadd!=0): hasadd = 1DATAP  r = [hasadd,hasmult]DATAH  nbits = NBits(SB(MaxAbs([rmul,gmul,bmul,amul,radd,gadd,badd,aadd])))DATA  r.extend(UB(nbits,4))DATAX  if (hasmult>0):DATA  r.extend(SB(rmul,nbits))DATA  r.extend(SB(gmul,nbits))DATA@  r.extend(SB(bmul,nbits))DATA  r.extend(SB(amul,nbits))DATA  if (hasadd>0):DATA  r.extend(SB(radd,nbits))DATAp  r.extend(SB(gadd,nbits))DATA  r.extend(SB(badd,nbits))DATA  r.extend(SB(aadd,nbits))DATA `  return rDATA DATAؘ def STRING(s):DATA  r = []DATA(P  for i in range(len(s)): r.append(s[i])DATA  r.append(chr(0))DATA  return rDATA0 DATA@h # -------------------------------------------------------------DATAؚ # Core Data TypesDATA@ # -------------------------------------------------------------DATA def GRADRECORD(ratio,color):DATA  r = [chr(ratio)]DATA(  if (len(color)>3):DATA8p  r.extend(RGBA(color[0],color[1],color[2],color[3]))DATA؜  else:DATA,  r.extend(RGB(color[0],color[1],color[2]))DATA p  return rDATA DATA$ def GRADIENT(NumGradients,records):DATA@  r = [chr(NumGradients)]DATA  for i in records:DATA؞  r.extend(i)DATA   return r DATAX  DATA0 def FILLSTYLE(type,param1=None,param2=None):DATA  r = [chr(type)]DATA8  if type == SOLID_FILL:DATA  if len(param1)>3:DATA<Ƞ  r.extend(RGBA(param1[0],param1[1],param1[2],param1[3]))DATA8  else:DATA0p  r.extend(RGB(param1[0],param1[1],param1[2]))DATAHС  elif (type == LINEAR_GRADIENT_FILL or type == RADIAL_GRADIENT_FILL):DATA\H  r.extend(PadChars(MATRIX(param1[0],param1[1],param1[2],param1[3],param1[4],param1[5])))DATA,آ  r.extend(GRADIENT(param2[0],param2[1]))DATAD8  elif (type == TILED_BITMAP_FILL or type == CLIPPED_BITMAP_FILL):DATA  r.extend(UI16(param1))DATA\  r.extend(PadChars(MATRIX(param2[0],param2[1],param2[2],param2[3],param2[4],param2[5])))DATA  return rDATAФ DATA  def FILLSTYLEARRAY(fillstyles):DATAX  count = len(fillstyles)DATA  r = []DATA  if count>=255:DATA  r = [UI16(count)]DATAh  else:DATA  r.extend(UI8(count))DATA  for i in fillstyles:DATA0  r.extend(i)DATA p  return rDATA DATA def LINESTYLE(width,color):DATA8  # Width in TWIPSDATA  w = UI16(width*10)DATAȨ  r = [w[0],w[1]]DATA  # Color valueDATAP  if (len(color)>3):DATA8  r.extend(RGBA(color[0],color[1],color[2],color[3]))DATA  else:DATA,8  r.extend(RGB(color[0],color[1],color[2]))DATA  return rDATAت  DATA  def LINESTYLEARRAY(linestyles):DATA`  count = len(linestyles)DATA  r = []DATA(  if count>255: r.extend(UI16(count))DATA@  else: r.extend(UI8(count))DATA  for i in linestyles:DATAج  r.extend(i)DATA   return rDATAX DATAL def CURVEEDGERECORD(ControlDeltaX,ControlDeltaY,AnchorDeltaX,AnchorDeltaY):DATA@  """SWF uses Quadratic Bezier curves, they need only 3 points:DATA$  - 2 on-curve anchor points, and DATA خ  1 off-curve control point.DATA@(  So, the first anchor point is the current drawing position,DATAL  the control point is the current drawing position plus the ControlDeltaDATA\  the last anchor point is the current drawing position plus ControlDelta plus AnchorDeltaDATA  Parameters:DATAH  ControlDeltaX, ControlDeltaY, LastAnchorDeltaX, LastAnchorDeltaY."""DATA`  r = [1,0] # Curved EdgeDATA`  nbits = NBits(SB(MaxAbs([ControlDeltaX*20,ControlDeltaY*20,AnchorDeltaX*20,AnchorDeltaY*20])))DATAD@  r.extend(UB(nbits-2,4)) # Nbits is biased by 2 in the swf readerDATA@  r.extend(SB(ControlDeltaX*20,nbits)) # X Control point changeDATA@(  r.extend(SB(ControlDeltaY*20,nbits)) # Y Control point changeDATA@  r.extend(SB(AnchorDeltaX*20,nbits)) # X anchor point changeDATA@  r.extend(SB(AnchorDeltaY*20,nbits)) # Y anchor point changeDATA x  return rDATA DATA< def LINEEDGERECORD(DeltaX,DeltaY,lineflag=1,vertflag=0):DATA(`  """ Parameters: Delta X - Position XDATA  Delta Y - Position YDATA4  Line Flag - 1 General Line (Default option)DATA(p  DeltaX and DeltaY are used.DATA(ȶ  Vert Flag parameter not usedDATA(  0 Vertical or Hotizontal LinesDATA4x  Vert Flag - 0 Horizontal Line Only DeltaX usedDATA,  1 Vertical line only DeltaY usedDATA@  """DATAx  r = [1,1] #Straight EdgeDATA4ȸ  nbits = NBits(SB(MaxAbs([DeltaX*20,DeltaY*20])))DATA0  r.extend(UB(nbits-2,4))DATA  r.extend([lineflag])DATALȹ  if lineflag==1: # Save General Lines #Nbits are biased by 2 in swf readerDATA H  r.extend(SB(DeltaX*20,nbits))DATA  r.extend(SB(DeltaY*20,nbits))DATA  else:DATA  r.extend([vertflag])DATA4h  if vertflag == 0: r.extend(SB(DeltaX*20,nbits))DATA(л  else: r.extend(SB(DeltaY*20,nbits)) DATA (  return rDATAh  DATA DATAؼ def ENDSHAPERECORD():DATA  return [0,0,0,0,0,0]DATAh DATA def STYLESHAPERECORD(f,DeltaX=0,DeltaY=0,Fill0Style=0,Fill1Style=0,LineStyle=0,nfbits=1,nlbits=1,FillArr=[],LineArr=[],sizepad=0):DATA8X  # Defines changes in line style, fill style, positionDATA  flags = GetBinary(f,5)DATA   r = [0]DATAH  r.extend(flags)DATA  if flags[4]==1:DATA8ؿ  MoveBits = NBits(SB(MaxAbs([DeltaX*20,DeltaY*20])))DATA@  r.extend(UB(MoveBits,5))DATAX  r.extend(SB(DeltaX*20,MoveBits)) # Move x converted to TWIPS (1 TWIP = 1 Pixel * 20 )DATA,  r.extend(SB(DeltaY*20,MoveBits)) # Move yDATA,x  if flags[3]==1: # StateFillStyle0DATA0  r.extend(UB(Fill0Style,nfbits)) #Fill 0 styleDATA8  if flags[2]==1:DATA0  r.extend(UB(Fill1Style,nfbits)) #Fill 1 styleDATA  if flags[1]==1:DATA0(  r.extend(UB(LineStyle,nlbits)) #Line styleDATA  if flags[0]== 1:DATA$  r.extend(Padding(sizepad+len(r)))DATA(  nfill = ord(FillArr[0])DATA,x  for i in FillArr: # FillStylesArrayDATA$  r.extend(GetBinary(ord(i),8))DATA0  nline = ord(LineArr[0])DATA,  for i in LineArr: # LineStylesArrayDATA$  r.extend(GetBinary(ord(i),8))DATA,8  r.extend(UB(NBits(GetBinary(nfill)),4))DATA,  r.extend(UB(NBits(GetBinary(nline)),4))DATA  return rDATA8 DATA(p def SHAPE(records,nfbits=15,nlbits=15):DATA  r = UB(nfbits,4)DATA  r.extend(UB(nlbits,4))DATA X  for i in records: r.extend(i)DATA  return rDATA DATAP def SHAPEWITHSTYLE(fillstylesarr,linestylesarr,records,nfbits=15,nlbits=15):DATA  r = []DATA  r.extend(fillstylesarr)DATA(  r.extend(linestylesarr)DATA4x  r.extend([chr(((nfbits << 4) + nlbits) & 255)])DATA  for i in records: r.extend(i)DATA 0  return r DATAp DATAH def BUTTONRECORD(flags,characterID,layer,matrix,ColorTransform=None):DATA  r = []DATAX  r.extend(flags)DATA  r.extend(UI16(characterID))DATA  r.extend(UI16(layer))DATA8  r.extend(PadChars(matrix))DATA  if ColorTransform!=None:DATA(  r.extend(PadChars(ColorTransform))DATA 0  return rDATAp DATA4 def KERNINGRECORD(wideflag,Code1,Code2,Adjustment):DATA  r = []DATAH  if wideflag == 1:DATA  r.extend(UI16(Code1))DATA  r.extend(UI16(Code2))DATA(  else:DATA`  r.extend(chr(Code1))DATA  r.extend(chr(Code2))DATA  r.extend(SI16(Adjustment))DATA @  return rDATA  DATA@ # -------------------------------------------------------------DATA( # SWF File Tags HeadersDATA@p # -------------------------------------------------------------DATA DATA def swfWrite(name,buf):DATA `  ans = 0DATA  try:DATA  f = open(name,'wb')DATA  for byte in buf:DATAh  f.write(byte)DATA  f.close()DATA$  except IOError, (errno,strerror):DATA0H  print "I/O Error(%s):%s" % (errno,strerror)DATA  ans = 1DATA  return ansDATA( DATA@` def swfHeaderBlock(filelength,framesize,framerate,framecount):DATA  """Header Block:DATA  Signature 'F' 1 byteDATA`  'W' 1 byteDATA  'S' 1 byteDATA  Version 1 byteDATA(  File length 4 bytesDATAx  Frame size 5 bytesDATA  Frame rate 2 bytesDATA   Frame count 2 bytes"""DATAh  #Initialize DATA  buf = ['F','W','S',chr(3)]DATA  #FileLengthDATA 8  buf.extend(UI32(filelength))DATA  #Frame SizeDATAT  buf.extend(PadChars(RECT(framesize[0],framesize[1],framesize[2],framesize[3])))DATAP  #Frame rateDATA  fr = UI16(framerate)DATA  buf.extend(fr[1])DATA  buf.extend(fr[0])DATAh  #Frame countDATA  fr = UI16(framecount)DATA  buf.extend(fr)DATA0  # Return the bufferDATA x  return bufDATA  DATA def swfTagHeader(tag,length):DATA@  r = []DATAx  if (length<=62):DATA  #Short HeaderDATA  n = (tag << 6) + lengthDATAP  r.extend(UI16(n))DATA  else:DATA  #Long HeaderDATA  n = (tag << 6) + 63DATAX  r.extend(UI16(n))DATA  r.extend(UI32(length))DATA  return rDATA0 DATA@h # -------------------------------------------------------------DATA # SWF File TagsDATA< # There are two categories of tags: definition and controlDATA8 # Definition tags manage a dictionary of resources. DATA< # Control tags control the display list and enable actions.DATA` #DATA< # CAUTION: Not all the tags were defined in this programDATA< # because I only use a base set of SWF tags to be able toDATA x # export blender animations.DATA@ # -------------------------------------------------------------DATA8 DATA@p # -------------------------------------------------------------DATA # Control TagsDATA( # - Control:DATAh # SetBackgroundColorDATA # Protect DATA # FrameLabelDATA0 # StartSoundDATAp # EndDATA # - Display List: DATA # PlaceObjectDATA0 # PlaceObject2DATAx # RemoveObjectDATA # RemoveObject2DATA # ShowFrameDATAH # - ActionsDATA # DoActionDATA@ # -------------------------------------------------------------DATAD8 def swfPlaceObject(characterId,depth,matrix,colortransform = None):DATA  size = 4 + len(matrix)DATA  if colortransform != None:DATA H  size+= len(colortransform)DATA  r = swfTagHeader(4,size)DATA  r.extend(UI16(characterId))DATA8  r.extend(UI16(depth))DATA  r.extend(PadChars(matrix))DATA@  if colortransform !=None: r.extend(PadChars(colortransform))DATA @  return rDATA DATA$ def swfPlaceObject2(f,depth,param):DATA  flags = GetBinary(f,6)DATA X  size = 3 DATA  if flags[0] == 1: #Has nameDATA  name = STRING(param[0])DATA8  size+=len(name)DATA  if flags[1] == 1: #Has ratioDATA  ratio = UI16(param[1])DATA (  size+=2DATA(h  if flags[2] == 1: #Has color transformDATAl  colortrans = PadChars(CXFORM(param[2][0],param[2][1],param[2][2],param[2][3],param[2][4],param[2][5]))DATA`  size+= len(colortrans)DATA  if flags[3] == 1: #Has matrixDATAh  matrix = PadChars(MATRIX(param[3][0],param[3][1],param[3][2],param[3][3],param[3][4],param[3][5]))DATA  size+= len(matrix)DATA,  if flags[4] == 1: #Has place a characterDATA @  character = UI16(param[4])DATA  size+=2DATA  if flags[5] == 1: #MoveDATA  passDATA`  r = swfTagHeader(26,size)DATA  bits = [0,0] # Reserved flagsDATA  bits.extend(flags)DATAH  r.extend(GetChars(bits))DATA  r.extend(UI16(depth))DATA(  if (flags[4]==1): r.extend(character)DATA$8  if (flags[3]==1): r.extend(matrix)DATA(  if (flags[2]==1): r.extend(colortrans)DATA$  if (flags[1]==1): r.extend(ratio)DATA$@  if (flags[0]==1): r.extend(name)DATA  return rDATA DATA  def swfRemoveObject(id,depth):DATA`  r = swfTagHeader(5,4)DATA  r.extend(UI16(id))DATA  r.extend(UI16(depth))DATA 8  return rDATAx DATA def swfRemoveObject2(depth):DATA  r = swfTagHeader(28,2)DATAH  r.extend(UI16(depth))DATA  return rDATA DATA def swfShowFrame():DATA@P  """Flag the end of the current frame. During playback, the DATA@  characters present in the display list will be rendered andDATA<0  the mouvie paused for the duration of a single frame."""DATA  return swfTagHeader(1,0)DATA DATA$( def swfSetBackgroundColor(r,g,b):DATA@  """ Set the background color of the display Tag ID = 9 """DATA(  return swfTagHeader(9,3) + RGB(r,g,b)DATAH DATA def swfFrameLabel(label):DATA  str = STRING(label)DATA   r = swfTagHeader(43,len(str))DATAh  r.extend(str)DATA  return rDATA DATA( def swfProtect():DATALp  """ Marks a file as not importable for editing in the authoring tool."""DATA  return swfTagHeader(24,0)DATA@ DATA$x def swfStartSound(id,soundinfo):DATA,  """Start playing the sound character"""DATA0  size = 2 + len(soundinfo)DATA  r = swfTagHeader(15,size)DATA  r.extend(UI16(id))DATA  r.extend(soundinfo)DATA `  return rDATA DATA def swfEnd():DATAD  """Marks the end of a file. This should always be the last tag DATA  in the file."""DATA  return swfTagHeader(0,0) DATA( DATA` DATA@ # -------------------------------------------------------------DATA # Action TagsDATA@H # -------------------------------------------------------------DATA  def swfActionGotoFrame(frame):DATA  r = [chr(129)]DATAH  r.extend(UI16(2))DATA  r.extend(UI16(frame))DATA   return rDATA DATA$P def swfActionGetURL(url,window):DATA  r = [chr(131)]DATA  us = STRING(url)DATA0  uw = STRING(window)DATA$x  r.extend(UI16(len(us)+len(uw)))DATA  r.extend(us)DATA  r.extend(uw)DATA P  return rDATA DATA def swfActionNextFrame():DATA  return [chr(4)]DATA` DATA def swfActionPrevFrame():DATA  return [chr(5)]DATA0 DATAh def swfActionPlay():DATA  return [chr(6)]DATA DATA0 def swfActionStop():DATAx  return [chr(7)]DATA DATA def swfActionToggleQualty():DATAH  return [chr(8)]DATA DATA def swfActionStopSounds():DATA  return [chr(9)]DATA` DATA, def swfActionWaitForFrame(frame,skipcount):DATA  r = [chr(138)]DATA8  r.extend(UI16(3))DATA  r.extend(UI16(frame))DATA  r.extend([chr(skipcount)])DATA   return rDATAX DATA, def swfActionSetTarget(length,targetname):DATA  r = [chr(139)]DATA0  r.extend(UI16(length))DATAx  tn = STRING(targetname)DATA  r.extend(tn)DATA   return rDATAH DATA( def swfActionGoToLabel(length,label):DATA  r = [chr(140)]DATA  r.extend(UI16(length))DATA`  tn = STRING(label)DATA  r.extend(tn)DATA   return rDATA(  DATA ` def swfDoAction(actionlist):DATA(  r = swfTagHeader(12,len(actionlist)+1)DATA,  if len(actionlist)>0: r.extend(actionlist)DATAh  r.extend([chr(0)])DATA   return rDATA@ # -------------------------------------------------------------DATA` # Definition TagsDATA # - DefineShapeDATA # - DefineShape2DATA8 # - DefineShape3DATA # - DefineSprite (SWF 3.0)DATA # - DefineBitsDATA # - DefineButtonDATAX # - DefineButton2DATA # - DefineButtonCxformDATA@ # -------------------------------------------------------------DATA,X def swfDefineShape(id,rect,shapewithstyle):DATA<  """ Defines a vector shape object. The shape definitionDATA<(  is a full-length encoded list of bezier curve informationDATA,  line styles and fill styles. (SWF 1.0)"""DATA  c = PadChars(rect)DATA(@  size = len(c) + len(shapewithstyle)DATA  r = swfTagHeader(2,size+2)DATA  r.extend(UI16(id))DATA0  r.extend(c)DATAp  r.extend(shapewithstyle)DATA   return rDATA DATA08 def swfDefineShape2(id,rect,shapewithstyle):DATA@  """Extends the capabilities of DefineShape with the abilityDATA@  to support more than 255 styles in the style list and multipleDATA0x  style lists in a single shape (SWF 2.0) """DATA  c = PadChars(rect)DATA (  size = len(c) + len(shapeinfo)DATA x  r = swfTagHeader(22,size+2)DATA  r.extend(UI16(id))DATA!  r.extend(c)DATAP!  r.extend(shapewithstyle)DATA !  return rDATA! DATA0" def swfDefineShape3(id,rect,shapewithstyle):DATA4x"  """Extends the capabilitys of the DefineShape2 DATA8"  by extending all of the RGB color fields to supportDATA,H#  RGBA with alpha transparency (SWF 3.0)"""DATA#  c = PadChars(rect)DATA(#  size = len(c) + len(shapewithstyle)DATA H$  r = swfTagHeader(32,size+2)DATA$  r.extend(UI16(id))DATA$  r.extend(c)DATA %  r.extend(shapewithstyle)DATA p%  return rDATA% DATA,% def swfDefineSprite(id,numframes,movie):DATAH&  size = len(movie) + 4DATA&  r = swfTagHeader(39,size)DATA&  r.extend(UI16(id))DATA('  r.extend(UI16(numframes))DATAx'  r.extend(movie)DATA '  return rDATA( DATA8( def swfDefineBits(id,jpeg):DATA8(  """Define a Bitmap character with JPEG compression."""DATA(  size = len(jpeg) + 2DATA8)  r = swfTagHeader(6,size)DATA)  r.extend(UI16(id))DATA)  r.extend(jpeg)DATA *  return rDATAP* DATA$* def JPEGTables(jpegencodingtable):DATA8*  """Defines the JPEG encoding table for the JPEG imagesDATA,H+  defined using the DefineBits records."""DATA +  size = len(jpegencodingtable)DATA+  r = swfTagHeader(8,size)DATA H,  r.extend(jpegencodingtable)DATA ,  return rDATA, DATA4- def swfDefineBitsJPEG2(id,jpeg,jpegencodingtable):DATA@x-  """Define a Bitmap character with JPEG compression. This tagDATA@-  differs from DefineBits in that the record contains both JPEGDATA<X.  encoding table and image data. This record allows multipleDATAD.  JPEGs with different compression rations inside a single SWF file.DATAD@/  The JPEG encoding and image data contained here are two separateDATA/  JPEG streams.DATAD/  Important NOTE: Each JPEG stream begins with the tag (0xFF,0xD8)DATA<p0  and a end of tream tag (0xFF,0xD9). This differs from the DATAD0  standard JPEG file that combines the image and the encoding dataDATAX1  into the same stream"""DATA01  size = len(jpeg) + len(jpegencodingtable) + 2DATA2  r = swfTagHeader(21,size)DATAX2  r.extend(UI16(id))DATA 2  r.extend(jpegencodingtable)DATA2  r.extend(jpeg)DATA 03  return rDATAp3 DATA03 def swfDefineButton(id,buttonrecords,actions):DATA<4  """Define a button character. A button is defined by an DATA@x4  up image, mouse over image, depressed image and a hit region.DATAD4  There is also a list of actions to take when the button is clickedDATA`5  and released."""DATA05  size = 2 + len(buttonrecords) + len(actions)DATA6  r = swfTagHeader(7,size)DATAX6  r.extend(UI16(id))DATA6  r.extend(buttonrecords)DATA06  r.extend([chr(0)]) # Button End Flag always 0DATAP7  r.extend(actions)DATA07  r.extend([chr(0)]) # Actions End Flag always 0DATA 7  return rDATA88 DATA$p8 def ACTCONDITIONLST(actconditions):DATA8  r = []DATA 9  offset = 0DATA@9  for act in actconditions:DATA9  r.extend(UI16(offset))DATA9  r.extend(act)DATA :  offset += len(act)DATA h:  return rDATA: DATA$: def ACTCONDITION(flags,actions):DATA8;  r = UI16(flags)DATA;  r.extend(actions)DATA0;  r.extend([chr(0)]) #Actions End Flag always 0DATA(<  returnDATA`< DATA<  DATA@< def swfDefineButton2(id,flags,buttonrecords,actconditionlst):DATA<@=  """Define a button character. A button is defined by an DATA@=  up image, mouse over image, depressed image and a hit region.DATA@ >  You can also specif the color transformation and sound data.DATAD>  There is also a list of actions to take when the button is clickedDATA ?  and released. (SWF 3.0) """ DATA8X?  size = 3 + len(buttonrecords) + len(actconditionlst)DATA?  r = swfTagHeader(34,size)DATA@  r.extend(UI16(id))DATA,X@  r.extend([chr(flags)]) # flags = 0 or 1DATAP@  r.extend(buttonrecords) # This records has to have COLORTRANSFORM with ALPHADATA08A  r.extend([chr(0)]) # Button End Flag always 0DATA A  r.extend(actionsconditions)DATA A  return rDATA(B DATA0`B def swfDefineButtonCxform(id,colortransform):DATA B  size = 2 + len(colortransform)DATAC  r = swfTagHeader(23,size)DATA`C  r.extend(UI16(id))DATAC  r.extend(colortransform)DATA C  return rDATA8D DATA<pD # ------------------------------------------------------DATAD # Fonts and TextDATA<(E # ------------------------------------------------------DATAE DATA0E def swfDefineFont(id,OffsetTable,ShapeTable):DATA00F  size = 2 + len(OffsetTable)+ len(ShapeTable)DATAF  r = swfTagHeader(10,size)DATAF  r.extend(UI16(id))DATA4(G  for offset in OffsetTable: r.extend(UI16(offset))DATA,G  for shape in ShapeTable: r.extend(shape)DATA G  return rDATA0H DATA\hH def swfDefineFont2(id,FontFlags,Fontname,OffsetTable,ShapeTable,FontCodeTable,Layout=None):DATAH  """DATA0I  Id - Object IdDATAxI  DATAI  FontFlags:DATATI  FONT_HASLAYOUT - FontFlagsHasLayout UB[1]: Has font metrics/layout informationDATA@xJ  FONT_SHIFTJIS - FontFlagsShiftJIS UB[1]: ShiftJIS encodingDATA@J  FONT_UNICODE - FontFlagsUnicode UB[1]: Unicode encodingDATA8XK  FONT_ANSI - FontFlagsAnsi UB[1]: ANSI encodingDATALK  FONT_WIDEOFFSETS- FontFlagsWideOffsets UB[1]: if 1, uses 32 bit offsetsDATAL@L  FONT_WIDECODES - FontFlagsWideCodes UB[1]: If 1 fonts uses 16-bit codesDATA$L  o uses 8 bit codes.DATA8M  FONT_ITALIC - FontFlagsItalic UB[1]: Italic FontDATA4M  FONT_BOLD - FontFlagsBold UB[1]: Bold FontDATA M  Fontname - String font nameDATA<8N  Offset Table - Beginnig of next shape in the Shape TableDATA<N  Shape Table - List of ShapeObjects that define each glyphDATA(O  FontCodeTable- Table of font codesDATA pO  Layout:DATAO  [FontAscent,FontDescent,FontLeading,[{FontAdvanceTable } list],[{FontBoundsTable } list ],[Kerning list]]DATApP  DATAP  """DATA P  flags = GetBinary(FontFlags)DATA0Q DATA hQ  r = [] DATAQ  r.extend(UI16(id))DATA,Q  r.extend(chr(0)) # FontFlagsReserved UB[8]DATAPR  r.extend(chr(FontFlags))DATAR  name = STRING(Fontname) DATAR  r.extend(chr(len(name)))DATA@S  r.extend(name)DATA,S  r.extend(UI16(len(ShapeTable))) #nGlyphsDATA S  for offset in OffsetTable: DATA(0T  if (flags[4]==1): # FONT_WIDEOFFSETS DATAT  r.extend(UI32(offset))DATA T  else: r.extend(UI16(offset))DATA,(U  for shape in ShapeTable: r.extend(shape)DATAU  for code in FontCodeTable:DATA(U  if (flags[5]==1): # FONT_WIDECODESDATA0V  r.extend(UI16(code))DATAxV  else: r.extend(chr(code))DATA$V  if (flags[0]==1): #FONT_HASLAYOUTDATA, W  r.extend(SI16(LayOut[0])) #FontAscent DATA,W  r.extend(SI16(Layout[1])) #FontDescentDATA,W  r.extend(SI16(Layout[2])) #FontLeadingDATA@X  for glyph in Layout[3]:DATA,X  r.extend(SI16(glyph)) #FontAdvanceTableDATAX  Bounds = []DATA@0Y  for rect in Layout[4]: Bounds.extend(rect) #FontBoundsTableDATA Y  r.extend(PadChars(Bounds))DATA4Y  r.extend(UI16(len(Layout[5]))) #FontKerningCountDATA0XZ  for kerning in Layout[5]: r.extend(kerning)DATAZ  DATA Z  r1 = swfTagHeader(48,len(r))DATA@[  r1.extend(r)DATA [  return r1DATA[ DATA<[ def swfDefineFontInfo(FontId,Fontname,FontFlags,CodeTable):DATAh\  """DATA\  Font Id - Id FontDATA\  Font name - string DATA0]  FontFlags:DATA@p]  FONT_UNICODE - FontFlagsUnicode UB[1]: Unicode encodingDATA@]  FONT_SHIFTJIS - FontFlagsShiftJIS UB[1]: ShiftJIS encodingDATA8P^  FONT_ANSI - FontFlagsAnsi UB[1]: ANSI encodingDATA8^  FONT_ITALIC - FontFlagsItalic UB[1]: Italic FontDATA4 _  FONT_BOLD - FontFlagsBold UB[1]: Bold FontDATAL_  FONT_WIDECODES - FontFlagsWideCodes UB[1]: If 1 fonts uses 16-bit codesDATA$`  o uses 8 bit codes.DATA ``  CodeTable - Glyph code table DATA`  """DATA`  r = []DATA a  r.extend(UI16(FontId))DATAha  name = STRING(Fontname)DATAa  r.extend(char(len(name)))DATAb  r.extend(name)DATA Hb  flags = GetBinary[FontFlags]DATAHb  newflags = [0,0,flags[2],flags[1],flags[3],flags[6],flags[7],flags[5]]DATA c  r.extend(GetChars(newflags))DATA`c  for glyphs in CodeTable:DATA,c  if (flags[7]==1): r.extend(UI16(glyphs))DATA d  else: r.extend(chr(glyphs))DATA`d DATA d  r1 = swfTagHeader(13,len(r))DATAd  r1.extend(r)DATA (e  return r1DATAhe DATA8e def GLYPHENTRY(idx,value,nGlyphBits=8,nAdvanceBits=8):DATAf  r = []DATA @f  r.extend(UB(idx,nGlyphBits))DATA$f  r.extend(UB(value,nAdvanceBits))DATA f  return r DATA(g DATA(`g def TEXTRECORDTYPE0(TextGplyphEntries):DATA g  r = [0]DATA$g  nglyphs = len(TextGplyphEntries)DATAPh  r.extend(UB(nglyphs,7))DATA$h  for glyph in TextGplyphEntries:DATAh  r.extend(glyph)DATA@i  return PadChars(r)DATAi DATAHi def TEXTRECORDTYPE1(TextFlags,Fontid=0,height=0,color=None,x=0,y=0):DATA8j  f = [1,0,0,0]DATAxj  f.extend(GetBinary(flags))DATAj  r = GetChars(f)DATA(k  if (f[4]==1): r.extend(UI16(Fontid))DATAhk  if (f[5]==1): DATA,k  if len(color)>3: r.extend(RGBA(color))DATA l  else: r.extend(RGB(color))DATA$`l  if (f[7]==1): r.extend(UI16(x))DATA$l  if (f[6]==1): r.extend(UI16(y))DATA(m  if (f[4]==1): r.extend(UI16(height))DATA hm  return rDATAm DATATm def swfDefineText(Textid,bounds,matrix,textrecords,nGlyphBits=8,nAdvanceBits=8):DATAhn  r = []DATAn  r.extend(UI16(Textid))DATAn  a = []DATA o  a.extend(bounds)DATAho  a.extend(matrix)DATAo  r.extend(PadChars(a))DATAo  r.append(chr(nGlyphBits))DATA Hp  r.append(chr(nAdvanceBits))DATA0p  for record in textrecords: r.extend(record)DATAp  r.append(chr(0))DATA @q  r1 = swfTagHeader(11,len(r))DATAq  r1.extend(r)DATA q  return r1DATAr DATATHr def swfDefineText2(Textid,bounds,matrix,textrecords,nGlyphBits=8,nAdvanceBits=8):DATAr  r = []DATAs  r.extend(UI16(Textid))DATAPs  a = []DATAs  a.extend(bounds)DATAs  a.extend(matrix)DATAt  r.extend(PadChars(a))DATA`t  r.append(chr(nGlyphBits))DATA t  r.append(chr(nAdvanceBits))DATA0u  for record in textrecords: r.extend(record)DATA`u  r.append(chr(0))DATA u  r1 = swfTagHeader(11,len(r))DATAu  r1.extend(r)DATA 8v  return r1DATAxv DATA<v # ------------------------------------------------------DATA w # Blender SWF Wrap ClassesDATA<pw # ------------------------------------------------------DATAw DATADx # --------------------------------------------------------------DATAx # DATAx # Class bShapeDATAy # DATA@@y # -------------------------------------------------------------DATAy class bShape:DATAy  "Blender swf shape class"DATA@z  recbits = []DATA z  fsa = []DATA z  lsa = []DATA {  nFills = 0DATA @{  nLines = 0DATA8{  def __init__(self,fillstylearr=[],linestylearr=[]):DATA{  "bShape initialization." DATA8|  recbits = []DATAx|  fsa = fillstylearrDATA|  lsa = linestylearrDATA$}  def AddFillStyle(self,fillstyle):DATA `}  self.fsa.append(fillstyle)DATA}  self.nFills+=1DATA$}  def AddLineStyle(self,linestyle):DATA P~  self.lsa.append(linestyle)DATA~  self.nLines+=1DATA~  def MoveTo(self,x,y):DATA80  self.recbits.extend(STYLESHAPERECORD(SH_MOVE,x,y))DATA,  def SetCurrentFill0(self,id,numfills=0):DATA`  if numfills>0: self.recbits.extend(STYLESHAPERECORD(SH_FILL0,0,0,id,0,0,NBits(UB(numfills))))DATA\  else: self.recbits.extend(STYLESHAPERECORD(SH_FILL0,0,0,id,0,0,NBits(UB(self.nFills))))DATA,  def SetCurrentFill1(self,id,numfills=0):DATA`x  if numfills>0: self.recbits.extend(STYLESHAPERECORD(SH_FILL1,0,0,0,id,0,NBits(UB(numfills))))DATA\  else: self.recbits.extend(STYLESHAPERECORD(SH_FILL1,0,0,0,id,0,NBits(UB(self.nFills))))DATA,  def SetCurrentLine(self,id,numlines=0):DATAh  if numlines>0: self.recbits.extend(STYLESHAPERECORD(SH_LINESTYLE,0,0,0,0,id,0,NBits(UB(numlines))))DATA`  else: self.recbits.extend(STYLESHAPERECORD(SH_LINESTYLE,0,0,0,0,id,0,NBits(UB(self.nLines))))DATAH  def AddNewStyles(self,nfb=1,nlb=1,FillArr=[],LineArr=[],sizepad=0):DATAl  self.recbits.extend(STYLESHAPERECORD(SH_NEWSTYLES,0,0,0,0,0,nfb,nlb,FillArr,LineArr,len(self.recbits)))DATA8  def SetStyleRecord(self,f,DeltaX=0,DeltaY=0,Fill0Style=0,Fill1Style=0,LineStyle=0,nfbits=1,nlbits=1,FillArr=[],LineArr=[]):DATA  self.recbits.extend(STYLESHAPERECORD(f,DeltaX,DeltaY,Fill0Style,Fill1Style,LineStyle,nfbits,nlbits,FillArr,LineArr,len(self.recbits)))DATA  def LineTo(self,x,y):DATA,  self.recbits.extend(LINEEDGERECORD(x,y))DATA P  def CurveTo(self,cx,cy,ax,ay):DATA4  self.recbits.extend(CURVEEDGERECORD(cx,cy,ax,ay))DATA  def EndShape(self):DATA(P  self.recbits.extend(ENDSHAPERECORD())DATA  def GetShape(self):DATA(  nFillBits = NBits(UB(self.nFills))DATA(H  nLineBits = NBits(UB(self.nLines))DATAx  return SHAPEWITHSTYLE(FILLSTYLEARRAY(self.fsa),LINESTYLEARRAY(self.lsa),PadChars(self.recbits),nFillBits,nLineBits)DATAH  def Reset(self):DATA  self.recbits = []DATA؊  self.fsa = []DATA  self.lsa = []DATAX  self.nFills = 0DATA  self.nLines = 0DATA DATAD # -----------------------------------------------------------------DATA # Test SWFDATAD، # -----------------------------------------------------------------DATA0P #movie = swfHeaderBlock(0,[0,0,92,469],12,1)DATA, #movie+=swfSetBackgroundColor(255,255,255)DATA #actions = swfActionStop()DATA ` #movie+=swfDoAction(actions)DATA #a = FILLSTYLEARRAY([FILLSTYLE(SOLID_FILL,[0,255,0,255]),FILLSTYLE(SOLID_FILL,[0,0,255,255]),FILLSTYLE(SOLID_FILL,[255,255,0,255])])DATAPh #b = LINESTYLEARRAY([LINESTYLE(1,[0,0,0,255]),LINESTYLE(3,[0,255,255,255])])DATA #nFillBits = NBits(UB(3)) DATA8 #nLineBits = NBits(UB(2))DATA #sh = bShape()DATA8Ȑ #sh.AddFillStyle(FILLSTYLE(SOLID_FILL,[0,255,0,255]))DATA80 #sh.AddFillStyle(FILLSTYLE(SOLID_FILL,[0,0,255,255]))DATA8 #sh.AddFillStyle(FILLSTYLE(SOLID_FILL,[255,255,0,255]))DATA, #sh.AddLineStyle(LINESTYLE(1,[0,0,0,255]))DATA0` #sh.AddLineStyle(LINESTYLE(3,[0,255,255,255]))DATA\ #sh.SetStyleRecord(SH_MOVE+SH_FILL0+SH_FILL1+SH_LINESTYLE,0,300,0,2,0,nFillBits,nLineBits)DATAP #sh.LineTo(0,100)DATA #sh.CurveTo(100,0,0,-100)DATA #sh.LineTo(-100,0)DATAp0 #sh.SetStyleRecord(SH_MOVE+SH_FILL0+SH_FILL1+SH_LINESTYLE+SH_NEWSTYLES,100,300,0,1,0,nFillBits,nLineBits,a,b)DATAД #sh.LineTo(0,100)DATA #sh.LineTo(100,0)DATA` #sh.LineTo(0,-100)DATA #sh.LineTo(-100,0)DATA #sh.MoveTo(150,350)DATA8 #sh.LineTo(25,0)DATA #sh.LineTo(0,25)DATAȖ #sh.LineTo(-25,0)DATA #sh.LineTo(0,-25)DATAPX #sh.SetStyleRecord(SH_MOVE+SH_FILL0+SH_FILL1,0,290,3,1,0,nFillBits,nLineBits)DATAؗ #sh.LineTo(0,50)DATA #sh.LineTo(50,0)DATAh #sh.LineTo(0,-50)DATA #sh.MoveTo(100,290)DATA #sh.LineTo(0,50)DATA@ #sh.CurveTo(20,0,0,-50)DATA #sh.LineTo(-50,0)DATAЙ #sh.MoveTo(200,290)DATA #sh.LineTo(0,50)DATA` #sh.LineTo(50,0)DATA #sh.LineTo(0,-50)DATA #sh.LineTo(-50,0)DATA8 #sh.EndShape()DATA<x #movie+=swfDefineShape3(1,RECT(0,0,400,400),sh.GetShape())DATAT #movie+=swfPlaceObject2(PO_MATRIX+PO_CHAR_ID,2,[0,0,0,[1.0,1.0,0.0,0.0,0.0,0.0],1])DATAp #movie+=swfShowFrame()DATA #movie+=swfEnd()DATA #a = len(movie)DATA@ #SetFileLength(movie,a)DATA #print movieDATA$ȝ #swfWrite('c:\swf\demo.swf',movie)DATA #print "Saved!"DATA`  DATAD # --------------------------------------------------------------DATA # DATAH # Class CRectDATA # DATA@ # -------------------------------------------------------------DATA0 class CRect:DATA8p  """ CRect (Left,Top, Right, Bottom) Rectangle classDATA8ؠ  Remember that the position (0,0) correspond to theDATA$@  left-bottom of the screen. """DATA(  def __init__(self,l=0,t=0,r=0,b=0):DATA  self.SetRect(l,t,r,b)DATA$8  def SetRect(self,l=0,t=0,r=0,b=0):DATA  self.L = lDATAТ  self.T = tDATA  self.R = rDATAP  self.B = bDATA  def SetNullRect(self):DATAأ  self.L = 0DATA  self.T = 0DATAX  self.R = 0DATA  self.B = 0DATAؤ  def Width(self):DATA  return abs(self.R-self.L)DATAp  def Height(self):DATA  return abs(self.T-self.B)DATA  def Center(self):DATA`P  return self.L+int((float(self.Width())/2.0)+0.5),self.B+int((float(self.Height())/2.0)+0.5)DATA  def PtInRect(self,x,y):DATAH0  if (x>=self.L and x<=self.R and y>=self.B and y<=self.T): return 1DATA  else: return 0DATA  def OffsetRect(self,x,y):DATA@  self.L += xDATA  self.T += yDATA  self.R += xDATA  self.B += yDATAD@ # --------------------------------------------------------------DATA # DATA # Class CGHandleDATA8 # DATA@p # -------------------------------------------------------------DATA class CGHandle:DATA  "Graphic Handle class"DATA h  rc = NoneDATA  id = 0DATA  intensity = 0DATA  maxcolors = 32DATA0`  def __init__(self,i=0,id=0,l=0,t=0,r=0,b=0):DATA  self.rc = CRect(l,t,r,b)DATA  self.id = idDATAP  self.intensity = iDATA  def SetID(self,id):DATA  self.id = idDATA  def MoveTo(self,x,y):DATAh  ctr = self.rc.Center()DATA  dx = x - ctr[0]DATA  dy = y - ctr[1]DATAH  self.rc.OffsetRect(dx,dy)DATA  del dx,dy,ctrDATAد  def SetIntensity(self,i):DATA(  self.intensity = iDATAp  def Draw(self):DATA  glColor3f(1.0,0.0,0.0)DATA  glBegin(GL_TRIANGLES)DATA(P  glVertex2d(self.rc.L,self.rc.B+15)DATA(  glVertex2d(self.rc.R,self.rc.B+15)DATA0  glVertex2d(self.rc.Center()[0],self.rc.T+5)DATA `  glEnd()DATA  glColor3f(0.0,0.0,0.0)DATA(  glRasterPos2d(self.rc.L,self.rc.B+5)DATAH  Text(str(self.id))DATA  def HitTest(self,x,y):DATA س  return self.rc.PtInRect(x,y)DATA( DATAD` # --------------------------------------------------------------DATAش # DATA # Class CVScrollListDATAX # DATA@ # -------------------------------------------------------------DATA class CVScrollLst:DATA H  "Vertical Scroll List class"DATA<  def __init__(self,l=0,b=0,w=0,h=0,clr = [0.0,0.0,1.0]):DATA  self.selidx = -1DATAP  self.topline = 0DATA  self.datalst = []DATA(  self.color = [clr[0],clr[1],clr[2]]DATA$8  self.wndrc = CRect(l,b+h,l+w,b)DATA  self.fmouse = 0DATAظ  def SetPos(self,l,b,w,h):DATA$(  self.wndrc.SetRect(l,b+h,l+w,b)DATA  def ClearLst(self):DATAȹ  del self.datalstDATA  self.datalst = []DATA X  def AddItem(self,s,tag=""):DATA  self.datalst.append([s,tag])DATA  def DelItem(self,idx):DATA@  del self.datalst[idx]DATA(  if self.selidx==idx: self.selidx=-1DATA  def Sort(self):DATA(  self.datalst.sort()DATAp  def GetSelected(self):DATA8  if (self.selidx>-1): return self.datalst[self.selidx]DATA  else: return NoneDATAh  def Draw(self):DATA  VPort = Buffer(GL_INT,4)DATA$  glGetFloatv(GL_VIEWPORT,VPort)DATAXX  glPushAttrib(GL_LIGHTING_BIT|GL_ENABLE_BIT|GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT)DATA  glColor3f(0.75,0.75,0.75)DATA@0  glRectf(self.wndrc.L,self.wndrc.T,self.wndrc.R,self.wndrc.B)DATA  glColor3f(0.0,0.0,0.0)DATA  glBegin(GL_LINE_LOOP)DATA(8  glVertex2d(self.wndrc.L,self.wndrc.T)DATA(  glVertex2d(self.wndrc.R,self.wndrc.T)DATA(  glVertex2d(self.wndrc.R,self.wndrc.B)DATA(@  glVertex2d(self.wndrc.L,self.wndrc.B)DATA  glEnd() DATA  glLineWidth(2.0)DATA  glColor3f(1.0,1.0,1.0)DATAp  glBegin(GL_LINE_STRIP)DATA,  glVertex2d(self.wndrc.L+2,self.wndrc.B+2)DATA,  glVertex2d(self.wndrc.L+2,self.wndrc.T-2)DATA,  glVertex2d(self.wndrc.R-2,self.wndrc.T-2)DATA  glEnd()DATA  glColor3f(0.45,0.45,0.45)DATAp  glBegin(GL_LINE_STRIP)DATA,  glVertex2d(self.wndrc.L+2,self.wndrc.B+2)DATA,  glVertex2d(self.wndrc.R-2,self.wndrc.B+2)DATA,  glVertex2d(self.wndrc.R-2,self.wndrc.T-2)DATA  glEnd()DATA  glColor3f(0.55,0.55,0.55)DATAHp  glRectd(self.wndrc.L+5,self.wndrc.T-5,self.wndrc.R-27,self.wndrc.B+5)DATA  # Draw ItemsDATA(  VPort = Buffer(GL_INT,4)DATA$x  glGetFloatv(GL_VIEWPORT,VPort)DATA  sz = len(self.datalst)DATA  max = self.wndrc.Height()/15DATA p  strmax = self.wndrc.Width()/8DATA  for i in range(max):DATA$  if self.selidx==i+self.topline:DATA<`  glColor3f(self.color[0],self.color[1],self.color[2])DATA\  glRectf(self.wndrc.L+7,self.wndrc.T-5-(i*15),self.wndrc.R-30,self.wndrc.T-(i*15)-20)DATA`  glColor3d(1,1,1)DATA  else:DATA  glColor3d(0,0,0)DATA80  glRasterPos2d(self.wndrc.L+7,self.wndrc.T-(i*15)-15)DATA  try:DATA,  msg = self.datalst[i+self.topline][0]DATA,0  if len(msg)>strmax: msg = msg[0:strmax]DATA  Text(msg)DATA  except:DATA   passDATAP  #Draw HandleDATA  if sz==0: sz=1DATA  glColor3f(0.75,0.75,0.75)DATAL(  glRectf(self.wndrc.R-27,self.wndrc.T-5,self.wndrc.R-25,self.wndrc.B+5)DATA  glColor3f(0.55,0.55,0.55)DATAH  glRectd(self.wndrc.R-25,self.wndrc.T-5,self.wndrc.R-5,self.wndrc.B+5)DATAp  if sz=self.wndrc.R-27) and (dx<=self.wndrc.R-5) and (dy>=self.wndrc.B+5) and (dy<=self.wndrc.T-5):DATA@H  if (sz>max) and ((self.fmouse == 0) or (self.fmouse == 1)):DATAX  self.topline = int(float(self.wndrc.T-dy)/float(self.wndrc.Height())*float(sz))DATA4@  if self.topline>sz-max: self.topline = sz-maxDATA  self.fmouse = 1DATA8  elif (dy>=self.wndrc.B+5) and (dy<=self.wndrc.T-5):DATA0X  if (self.fmouse == 0) or (self.fmouse ==2):DATAP  nidx = int(float(self.wndrc.T-dy)/float(self.wndrc.Height()-8)*float(max))DATA$8  if nidx>max-1: nidx = max-1DATA$  self.selidx=self.topline+ nidxDATA  rtn=1DATA(  self.fmouse = 2DATA,p  elif (buttons[0] == 0): # Left Button UpDATA  self.fmouse = 0DATA0  elif (buttons[1]==1): # Middle Button DownDATAx  passDATA,  elif (buttons[2]==1): # Right Button DownDATA  passDATA H  Draw()DATA  del ViewPortDATA DATA  return rtnDATA@  DATADx # --------------------------------------------------------------DATA # DATA( # Class CPickPaletteDATAp # DATA@ # -------------------------------------------------------------DATA class CPickPalette:DATA`  "Pick Palette class"DATA  wndrc = CRect()DATA  clientrc = CRect()DATA8  palrc = CRect()DATA  hndlst = []DATA  curidx = 0DATA  vs = 0DATA8  maxcolors = 0DATAx  curHandle = NoneDATA  fmouse = 0DATA  visible=1DATA,@  def __init__(self,l=0,t=0,w=0,h=0,m=32):DATA  self.SetPos(l,t,w,h)DATA  self.maxcolors = mDATA0  self.fmouse = 0DATAx  def SetPos(self,l,t,w,h):DATA  px = l - self.wndrc.LDATA  py = t - self.wndrc.TDATA$X  self.wndrc.SetRect(l,t,l+w,t-h)DATAH  self.clientrc.SetRect(5,5,self.wndrc.Width()-5,self.wndrc.Height()-5)DATA0(  self.vs = float(self.clientrc.Height())/3.0 DATAd  self.palrc.SetRect(self.wndrc.L+5,self.wndrc.T-5-self.vs,self.wndrc.R-5,self.wndrc.B+5+self.vs)DATA  for hnd in self.hndlst:DATAp  hnd.rc.OffsetRect(px,py)DATA  del px,pyDATA  def SetMaxColors(self,m):DATAP  self.mascolors = mDATA  def Draw(self):DATA  if self.visible == 0: returnDATA0  glColor3f(0.75,0.75,0.75)DATA  glBegin(GL_QUADS)DATA(  glVertex2d(self.wndrc.L,self.wndrc.T)DATA(  glVertex2d(self.wndrc.R,self.wndrc.T)DATA(x  glVertex2d(self.wndrc.R,self.wndrc.B)DATA(  glVertex2d(self.wndrc.L,self.wndrc.B)DATA (  glEnd()DATAh  glColor3f(0.0,0.0,0.0)DATA  glBegin(GL_LINE_LOOP)DATA(  glVertex2d(self.wndrc.L,self.wndrc.T)DATA(X  glVertex2d(self.wndrc.R,self.wndrc.T)DATA(  glVertex2d(self.wndrc.R,self.wndrc.B)DATA(  glVertex2d(self.wndrc.L,self.wndrc.B)DATA `  glEnd() DATA  glLineWidth(2.0)DATA  glColor3f(1.0,1.0,1.0)DATA8  glBegin(GL_LINE_STRIP)DATA,  glVertex2d(self.wndrc.L+2,self.wndrc.B+2)DATA,  glVertex2d(self.wndrc.L+2,self.wndrc.T-2)DATA,H  glVertex2d(self.wndrc.R-2,self.wndrc.T-2)DATA  glEnd()DATA  glColor3f(0.45,0.45,0.45)DATA8  glBegin(GL_LINE_STRIP)DATA,  glVertex2d(self.wndrc.L+2,self.wndrc.B+2)DATA,  glVertex2d(self.wndrc.R-2,self.wndrc.B+2)DATA,H  glVertex2d(self.wndrc.R-2,self.wndrc.T-2)DATA  glEnd()DATA  glLineWidth(1.0)DATA0  glBegin(GL_LINES)DATA(x  for i in range(self.clientrc.R-5):DATA,  c = float(i)/float(self.clientrc.R-5)DATA0  glColor3f(c,c,c)DATA8x  glVertex2d(self.wndrc.L+5+i,self.wndrc.B+5+self.vs)DATA8  glVertex2d(self.wndrc.L+5+i,self.wndrc.T-5-self.vs)DATA H  glEnd()DATA  sz = len(self.hndlst)DATA  if (sz>0):DATA   c = (self.clientrc.R-5)/szDATA `  i = 0 DATA  for hnd in self.hndlst:DATA  hnd.Draw()DATA<0  glColor3f(hnd.intensity,hnd.intensity,hnd.intensity)DATA  glBegin(GL_QUADS)DATA4  glVertex2d(self.wndrc.L+5+(i*c),self.wndrc.T-5)DATA8P  glVertex2d(self.wndrc.L+5+(i*c)+c,self.wndrc.T-5)DATA@  glVertex2d(self.wndrc.L+5+(i*c)+c,self.wndrc.T-6-self.vs)DATA<(  glVertex2d(self.wndrc.L+5+(i*c),self.wndrc.T-6-self.vs)DATA  glEnd()DATA  i+=1DATA  del i,c,sz DATAX  DATA  def HitTest(self,x,y):DATA$  return self.wndrc.PtInRect(x,y)DATA0 DATA h  def PaletteHitTest(self,x,y):DATA@  """ Return None if HitTest over the palette of colors failDATA<(  or the created Handle where the user clicks the mouse."""DATA$  if (self.palrc.PtInRect(x,y)):DATA$  if self.curidxhnd.id: h.id-=1DATA  del self.hndlst[i]DATA  self.curidx-=1 DATAX DATA  def HndLstHitTest(self,x,y):DATA  for hnd in self.hndlst:DATA,0  if (hnd.rc.PtInRect(x,y)): return hndDATA  return NoneDATA DATA  def ResetContent(self):DATAX  for hnd in self.hndlst:DATA  c = hndDATA  hnd = NoneDATA (  del cDATAh  self.hndlst = []DATA  self.curidx = 0DATA DATA0  def GetNumColors(self):DATA  return len(self.hndlst)DATA  DATA  def Visible(self,val=1):DATAX  self.visible = valDATA  DATA(  def OnMouseMove(self,dx,dy,buttons):DATA00  """ Mouse Move Rutine for this control."""DATA$  if self.visible == 0: return 0 DATA   rtn = 0DATA$(  if self.HitTest(dx,dy)==0: returnDATA   ViewPort = Buffer(GL_FLOAT,4)DATA$  glGetFloatv(GL_VIEWPORT,ViewPort)DATA( DATA(`  if (buttons[0]): # Left Button DownDATA  self.fmouse = 1DATA  if self.curHandle!=None:DATAP  #Move handleDATA,  if (self.HandlerAreaHitTest(dx,dy)):DATA$  self.curHandle.MoveTo(dx,dy)DATA P  else:DATA  # Create a new handleDATA(  hnd = self.PaletteHitTest(dx,dy)DATA8  if (hnd != None): DATAL  w = CGHandle(hnd.intensity,hnd.id,hnd.rc.L,hnd.rc.T,hnd.rc.R,hnd.rc.B)DATA  self.AddHandle(w)DATAH  del w,hndDATA   else:DATA  # Select handleDATA0  self.curHandle=self.HndLstHitTest(dx,dy)DATADp  elif (buttons[0] == 0) and (self.fmouse ==1): # Left Button UpDATA  if self.curHandle!=None:DATA 8  i = self.GetIntensityAt(dx)DATA<  self.curHandle.SetIntensity(self.GetIntensityAt(dx))DATA  self.curHandle = NoneDATA H  rtn = 1DATA  self.fmouse = 0DATA0  elif (buttons[1]==1): # Middle Button DownDATA0  passDATA,h  elif (buttons[2]==1): # Right Button DownDATA  # Select handleDATA,  self.curHandle=self.HndLstHitTest(dx,dy)DATA(p  if self.curHandle: self.fmouse = 2DATA  DATA,  elif (buttons[2]==0): #Right Button UpDATA4`  if self.curHandle!=None and (self.fmouse == 2):DATA8  if Blender.Draw.PupMenu("Delete?%t|Yes%x1|No%x0"):DATA0  #Delete handleDATA(x  self.RemoveHandle(self.curHandle)DATA  self.curHandle=NoneDATA   self.fmouse = 0DATA h  Draw()DATA  del ViewPortDATA DATA(  return rtnDATAh DATAD # ---------------------------------------------------------------DATA! #DATAP! # Event DefinitionsDATA! #DATAD! # --------------------------------------------------------------- DATAH" EVENT_NONE = 0DATA" EVENT_WIDTH = 1DATA" EVENT_HEIGHT = 2DATA# EVENT_ASPX = 3DATA`# EVENT_ASPY = 4DATA# EVENT_CHANGE_MASK = 5DATA# EVENT_LINE_W = 6DATA8$ EVENT_SIL_W = 7DATAx$ EVENT_LINES = 8 DATA$ EVENT_RENDER_TYPE = 9DATA% EVENT_PIXELATE=10DATAP% EVENT_LEVEL=11DATA% EVENT_SILHOUETTE = 12DATA% EVENT_COLOR = 13DATA & EVENT_STARTFRAME = 14DATAh& EVENT_ENDFRAME = 15DATA& EVENT_STEPFRAME = 16DATA& EVENT_E0 = 17DATA8' EVENT_E1 = 18DATAx' EVENT_E2 = 19DATA' EVENT_E3 = 20DATA' EVENT_CREATE_SWF = 21DATA@( EVENT_CREATE_BMP = 22 DATA( EVENT_FILENAME =23DATA( EVENT_MASK = 24DATA) EVENT_REFRESH=25DATAX) EVENT_QUIT= 26DATA) EVENT_LOOP=27DATA) EVENT_QLTY=28DATA* EVENT_FPS=29DATAX* EVENT_PREVIEW=30DATA* EVENT_CREATE_TIF=31DATA* EVENT_MENU_RENDER=32DATA0+ EVENT_MENU_EXPORT=33DATAx+ EVENT_MENU_SEQUENCE=34DATA+ EVENT_ADD_ITEM = 35DATA, EVENT_DEL_ITEM = 36DATAP, EVENT_REMOVE_ALL = 37DATA, EVENT_ADD_ALL = 38DATA, EVENT_GET_FILE = 39DATA(- EVENT_PATHNAME = 40DATAp- EVENT_SEQUENCE_SWF = 41DATA- EVENT_BROWSE = 42DATA. EVENT_SEQ_FLAG = 43DATAH. EVENT_NUM_SEQ_F = 44DATA. EVENT_PARAMS = 45DATA. EVENT_RESETFRAMES = 46DATA / EVENT_VEC_PREVIEW = 47DATAh/ EVENT_VEC_TYPE = 48DATA/ EVENT_TOLERANCE = 49DATA/ EVENT_SHADOW = 50DATA@0 EVENT_LAMP_SHADOW = 52DATA0 DATA@0 # -------------------------------------------------------------DATA01 #DATA h1 # ConstantsDATA1 #DATA@1 # -------------------------------------------------------------DATAP2 SMALL = 0.000001DATA2 DATA@2 # -------------------------------------------------------------DATA@3 #DATAx3 # Common functionsDATA3 #DATA@3 # -------------------------------------------------------------DATAh4 def sgn(n): DATA4  if (n>=0): return 1DATA4  else: return -1DATA85 def sgn0(n):DATAx5  if (n>SMALL): return 1DATA5  elif (n  """ Calculate the parameter D of the plane with a givenDATA@p>  point p = [x,y,z] that lies in the surface of the plane.""" DATA,>  self.d = -1 * DotVecs(self.vn,Vector(p))DATA@?  def set_from_face(self,f):DATA8?  """ Calculate the normal vector of the plane with theDATA$?  vertices from a given polygon.DATA@P@  face: Polygon face [[x0,y0,z0],[x1,y1,z1],...[xn,yn,zn]]"""DATA@  if (len(f)<3):DATADA  print "Error:The polygon face should have at least 3 points." DATAA  else:DATAA  self.pts = []DATA$B  for i in f: self.pts.append(i)DATADXB  p = Vector([f[1][0]-f[0][0],f[1][1]-f[0][1],f[1][2]-f[0][2]])DATADB  q = Vector([f[2][0]-f[0][0],f[2][1]-f[0][1],f[2][2]-f[0][2]])DATAHC  self.vn = CrossVecs(p,q)DATAC  self.vn.normalize()DATAC  self.set_d_from_pt(f[0])DATAD0D  return _Plane([self.vn.x,self.vn.y,self.vn.z],self.d,self.pts)DATAD  def normalize(self):DATAD  "Normalized plane."DATA 8E  m = 0.0DATAxE  for i in self.vn:DATA E  m = i*iDATAF  m = sqrt(m) DATAHF  self.vn.normalize()DATAF  if (m==0): self.d = 0DATAF  else: self.d = self.d/mDATA (G  returnDATA hG  def intersect_line(self,line):DATAG  """DATAG  Parameters:DATA<0H  line: Line ray [P,Q]; P = initial point, Q = end pointDATA4H  Ray in vector representation: P' = P + t * DDATAPI  P' = point in line, t = float number, D = Direction vector of the line rayDATAI  Return values:DATADI  [[x,y,z],t] The point where the plane and the line intersectDATAPHJ  and the distance from the origin of the line to the intersection point.DATA(J  None - if they don't intersect.DATA K  """DATA4XK  # Obtain Direction of line (D = ray direction)DATATK  D = Vector([line[1][0]-line[0][0],line[1][1]-line[0][1],line[1][2]-line[0][2]])DATAHL  D.normalize()DATA,L  # Obtain the Normal vector of the planeDATAL  norm = self.vnDATA0M  norm.normalize()DATAxM  denom = DotVecs(norm,D)DATA M  if (denom==0): return NoneDATA N  # Obtain a point in the planeDATAhN  if float(norm[2]) == 0:DATAN  if float(norm[0]) == 0:DATAO  if float(norm[1]) == 0:DATAXO  p = line[1]DATA O  else:DATA O  p = [0,-self.d/norm[1],0]DATA 0P  else:DATA pP  p = [-self.d/norm[0],0,0]DATAP  else:DATA P  p = [0,0,-self.d/norm[2]]DATA(HQ  # Find distance to collision pointDATAPQ  t = DotVecs(norm,Vector([p[0]-line[0][0],p[1]-line[0][1],p[2]-line[0][2]]))DATA R  t/=denomDATA`R  # Return P'DATALR  return [[(D[0]*t)+line[0][0],(D[1]*t)+line[0][1],(D[2]*t)+line[0][2]],t]DATA S  DATA XS  def intersect_plane(self,pl):DATAS  """Return:DATA8S  [Xo,D] The line where the two planes intersect in DATAPT  vector representation DATA4T  L = Xo + t * D Xo = Point in the line [x,y,z]DATA U  D = Direction vectorDATAXU  t = scalarDATA U  None If Planes are parallel DATAU  """ DATA<(V  # Compute intersection line L of this Plane and Plane T1DATA8V  D = CrossVecs(self.vn,pl.vn) #Direction of the lineDATA W  # Test if planes are parallelDATA(PW  if (reduce(add,D)==0): return NoneDATA,W  # Compute a point in the intersected lineDATAX  if D[0]>=0: ax = D[0]DATAPX  else: ax = -D[0]DATAX  if D[1]>=0: ay = D[1]DATAX  else: ay = -D[1]DATA(Y  if D[2]>=0: az = D[2]DATApY  else: az = -D[2]DATA(Y  if (ax+ay+az) < SMALL: return NoneDATA Z  maxc = 0DATAPZ  if (ax>ay):DATAZ  if (ax>az): maxc =1DATAZ  else: maxc = 3DATA [  else:DATAX[  if (ay>az): maxc =2DATA[  else: maxc = 3DATA,[  #Zero max coordinate and solve other twoDATA4H\  d1 = -1 * DotVecs(self.vn,Vector(self.pts[1]))DATA0\  d2 = -1 * DotVecs(pl.vn,Vector(pl.pts[1]))DATA]  x = 0DATAH]  y = 0DATA]  z = 0DATA(]  if maxc == 1: # intersect with x=0DATA,^  y = (d2*self.vn[2] - d1*pl.vn[2]) / D[0]DATA,p^  z = (d1*pl.vn[1] - d2*self.vn[1]) / D[0]DATA(^  elif maxc == 2: # intersect with y=0DATA,(_  x = (d1*pl.vn[2] - d2*self.vn[2]) / D[1]DATA,_  z = (d2*self.vn[0] - d1*pl.vn[0]) / D[1]DATA _  else: #intersect with z=0DATA,8`  x = (d2*self.vn[1] - d1*pl.vn[1]) / D[2]DATA,`  y = (d1*pl.vn[0] - d2*self.vn[0]) / D[2]DATA`  D.normalize()DATA$8a  return [[x,y,z],[D.x,D.y,D.z]] DATAa DATA$a  def over_under_face(self,ptslst):DATA( b  u = map(sgn0,map(self.solve,ptslst))DATAxb  count=[0,0,0] #-1,0,1 DATAb  for item in u:DATA c  if (item==-1): count[0]+=1DATA `c  elif (item==0): count[1]+=1DATAc  else: count[2]+=1DATAc  sz = len(ptslst)DATA<@d  if count[0]>0 and count[2]==0: return -1 # poly at backDATA@d  elif count[2]>0 and count[0]== 0: return 1 # poly at frontDATA0 e  elif count[1] == sz: return 0 # poly on planeDATAe  else: return 2DATAe DATA,f  def intersect_face(self,ptslst,bsplit=1):DATA4`f  """Test if the face is intersecting this plane.DATA@f  Parameter: Polygon face [[x0,y0,z0],[x1,y1,z1],...[xn,yn,zn]]DATA8g DATApg  Return values:DATADg  None - If face is on one side of the plane (Not intersection)DATAT0h  [[face]] - List containing one face (original given face) when the plane andDATADh  the face are coplanar (face and plane are the same plane)DATAT0i  [[face],[face]] - List of two faces (original face splitted) one for the face DATADi  infront of the plane and other for the face behind the plane.DATA0j  """DATA(hj  ans = self.over_under_face(ptslst)DATALj  if (ans==-1 or ans == 1): return None #Face is on one side of the planeDATA8@k  elif (ans == 0): return [ptslst] #Coplanar trianglesDATAk  else: # SplitDATAk  #No split if flag offDATA$8l  if bsplit==0: return [ptslst]DATA<l  # Double check the intersection of faces not only planesDATA,m  #npl = _Plane().set_from_face(ptslst)DATA,`m  #ans2 = npl.over_under_face(self.pts)DATA,m  #if ans2==-1 or ans2 == 1: return NoneDATA n  DATA Xn  #Split DATA n  dv1 = map(self.solve,ptslst)DATAn  s1 = map(sgn0,dv1)DATA 0o  f1 = []DATA po  f2 = []DATAo  sz = len(s1)DATAo  for idx in range(sz):DATA@p  i = idx + 1DATAp  if i>=sz: i = 0DATA,p  if (s1[idx]>0): f1.append(ptslst[idx])DATA0(q  elif (s1[idx]<0): f2.append(ptslst[idx])DATA q  else: DATAq  f1.append(ptslst[idx])DATAr  f2.append(ptslst[idx])DATA hr  if s1[i]!=0 and s1[idx]!=0:DATAr  if (s1[i]!=s1[idx]):DATA8s  k = self.intersect_line([ptslst[idx],ptslst[i]])DATAps  f1.append(k[0])DATAs  f2.append(k[0])DATAt  return [f1,f2]DATAHt DATAt #p = _Plane()DATA4t #p = p. set_from_face([[0,0,0],[1,0,0],[1,1,0]])DATA,(u #f = [[1,1,1],[3,1,1],[2,1,-1],[3,1,-1]]DATAu #print p.intersect_face(f)DATAu DATAv DATADHv # --------------------------------------------------------------DATAv # DATAv # Class _FrustumDATA@w # DATA@xw # -------------------------------------------------------------DATAw class _Frustum:DATA(x  "Frustum class"DATA px  val = []DATAx  def calculate(self,m,p):DATA$y  "Calculate frustum bouding box."DATA Xy  c = p * mDATA y  q = c[3]DATAy  self.val[0].set(q+c[0])DATA(z  # self.val[0].normalize()DATAxz  self.val[1].set(q-c[1])DATAz  # self.val[1].normalize()DATA{  self.val[2].set(q-c[0])DATA h{  # self.val[2].normalize() DATA{  self.val[3].set(q+c[1])DATA|  # self.val[3].normalize()DATAX|  self.val[4].set(q-c[2])DATA|  # self.val[4].normalize()DATA|  self.val[5].set(q+c[2])DATAH}  # self.val[5].normalize()DATA }  def __init__(self,model,proj):DATA$}  "Frustum is a vector of planes." DATA@~  pl = _Plane() # LeftDATA~  pt = _Plane() # TopDATA~  pr = _Plane() # RightDATA  pb = _Plane() # BottomDATAh  pk = _Plane() # bacKDATA  pf = _Plane() # ForwardDATA$  self.val = [pl,pt,pr,pb,pk,pf]DATA X  self.calculate(model,proj)DATA  def pt_inside(self,pt):DATA8  """Check if a point [x,y,z] is inside the frustum.DATA `  (1 = inside, 0 = outside)"""DATA  for pl in self.val:DATA$  if (pl.solve(pt)<0): return 0DATA P  return 1DATA$  def sphere_inside(self,center,r):DATA8  """Check if a sphere with the center point at [x,y,z]DATA8P  and with a radius r, is inside the frustum. Return 1DATA  if is inside, 0 if not."""DATA  for pl in self.val:DATA(P  if (pl.solve(center)<=-r): return 0DATA  return 1DATA,  def partial_sphere_inside(self,center,r):DATA8H  """Check if a sphere with the center point at [x,y,z]DATA8  and with a radius r, is partial inside the frustum. DATA   Return: 0 - Totally outsideDATAh  1 - Partially insideDATA  2 - Totally inside"""DATA  p = 0DATA@  for pl in self.val:DATA  d = pl.solve(center)DATAЇ  if (d<=-r): return 0DATA  elif (d>r): p = p + 1DATAh  if (p == 6): return 2DATA  return 1DATA  def box_inside(self,box):DATA8@  """Check if a box is inside the frustum (qFrustum).DATA<  First check if the center of the box is infront of allDATA@  the planes, if true then return 1, if not check every cornerDATA@  to find at least one that is infront of the frustum planes,DATA4  if such case occurs then return 1 else 0."""DATA0`  if (self.pt_inside(box.center)==1): return 1DATA  else:DATA  for pl in self.val:DATA@  found = 0DATA  for pt in box.val:DATAȌ  if (pl.solve(pt)>0):DATA  found = 1DATA X  breakDATA  if (found == 0): return 0DATA  return 1DATA$(  def partial_box_inside(self,box):DATA@  """Check if a box is partial inside the frustum (qFrustum).DATA  Return: 0 - Totally outsideDATA@  1 - Partially insideDATA  2 - Totally inside"""DATA  for pt in box:DATA(  found = 0DATAh  for pl in self.val:DATA$  if (pl.solve(pt))>0: found+=1DATA  if found>=3: return 1DATA X  return 0DATA(  def partial_face_inside(self,face):DATA4  """Check if a face is partial inside the frustum.DATA X  Return: 0 - Totally outsideDATA  1 - Partially insideDATA  2 - Totally inside"""DATA H  p = 0 DATA  sz = len(face)DATAГ  for pl in self.val:DATA  found = 0DATAX  for pt in face:DATA,  if (pl.solve(pt)>=0): found = found + 1DATA  if (found==0): return 0DATA P  if (found == sz): p = p + 1DATA  if (p == 6): return 2DATA  return 1DATA( DATAD` # ---------------------------------------------------------------DATA ؖ # Function : MatrixToBufferDATA ( # Inputs :DATAh # OutPuts :DATA # Description :DATAD # --------------------------------------------------------------- DATA` def MatrixToBuffer(m):DATA@  return Buffer(GL_FLOAT,16,[m[0][0],m[0][1],m[0][2],m[0][3],DATA,  m[1][0],m[1][1],m[1][2],m[1][3],DATA,x  m[2][0],m[2][1],m[2][2],m[2][3],DATA,ؙ  m[3][0],m[3][1],m[3][2],m[3][3]])DATA8 DATADp # ---------------------------------------------------------------DATA # Function : PerspectiveDATA 8 # Inputs :DATAx # OutPuts :DATA # Description :DATAD # --------------------------------------------------------------- DATA,p def Perspective(fovy, aspect, near,far):DATA(М  top = near * tan(fovy * pi / 360.0)DATA(  bottom = -topDATAh  left = bottom*aspectDATA  right= top*aspectDATA$  x = (2.0 * near) / (right-left)DATA$P  y = (2.0 * near) / (top-bottom)DATA$  a = (right+left) / (right-left)DATA$  b = (top+bottom) / (top - bottom)DATA$X  c = - ((far+near) / (far-near))DATA$  d = - ((2*far*near)/(far-near))DATAP  return Matrix([x,0.0,a,0.0],[0.0,y,b,0.0],[0.0,0.0,c,d],[0.0,0.0,-1.0,0.0])DATA  DATAD # ---------------------------------------------------------------DATA 8 # Function : IntersectLinesDATA # Inputs :DATAȡ # OutPuts :DATA # Description :DATADH # --------------------------------------------------------------- DATA$ def IntersectLines(l1,l2,flag = 0):DATA  d = float(l1[2]-l1[0])DATA$`  if d!=0: m1 = float(l1[3]-l1[1])/dDATA  else: m1 = 10000000000.0DATA  d = float(l2[2]-l2[0])DATA$P  if d!=0: m2 = float(l2[3]-l2[1])/dDATA  else: m2 = 10000000000.0DATA  #compute ConstantsDATA0@  a1 = m1;b1 = -1.0;c1 = float(l1[1]-m1*l1[0])DATA0  a2 = m2;b2 = -1.0;c2 = float(l2[1]-m2*l2[0])DATA  if m1 == m2:DATAT@  if abs(a1*l2[0] + b1*l2[1] + c1) < SMALL: return [(l1[0],l1[1]),(l1[2],l1[3])]DATAȦ  else:DATA  #Inverse determinantDATA$H  invdet = 1/((a1*b2) - (a2*b1))DATA  #Kramer's RuleDATAT  pt = (int((((b1*c2)-(b2*c1))*invdet)+0.5),int((((a2*c1)-(a1*c2))*invdet)+0.5))DATAp  if flag: return [pt]DATA  j=0;k=2;i=1;l=3DATA  if l1[0]>l1[2]:DATA H  j = 2DATA  k = 0DATAȩ  if l1[1]>l1[3]:DATA   i = 3DATA P  l = 1DATAH  if (pt[0]>=l1[j] and pt[0]<=l1[k] and pt[1]>=l1[i] and pt[1]<=l1[l]):DATA  return [pt] DATAH  return NoneDATA DATAD # ---------------------------------------------------------------DATA8 # Function : InsideEdgeDATA # Inputs :DATAȬ # OutPuts :DATA # Description :DATADH # --------------------------------------------------------------- DATA def InsideEdge(pt,e):DATAH  if ((e[2]-e[0])*(pt[1]-e[1])) < ((pt[0]-e[0])*(e[3]-e[1])): return 1DATA  return -1DATA DATAD # ---------------------------------------------------------------DATAp # Function : EdgeClipDATA # Inputs :DATA # OutPuts :DATA8 # Description :DATADx # --------------------------------------------------------------- DATA def EdgeClip(inlist,edge):DATA@  outlst = []DATA  sz = len(inlist)DATAȱ  s = inlist[sz-1]DATA  for p in inlist:DATAX  if InsideEdge(p,edge)>0:DATA  if InsideEdge(s,edge)<0:DATA4  i = IntersectLines([s[0],s[1],p[0],p[1]],edge)DATA8`  if i!=None: outlst.append((i[0][0],i[0][1],s[2]))DATAȳ  outlst.append(p)DATA  else:DATAH  if InsideEdge(s,edge)>0:DATA4  i = IntersectLines([s[0],s[1],p[0],p[1]],edge)DATA8  if i!=None: outlst.append((i[0][0],i[0][1],p[2])) DATAh  s = pDATA  return outlstDATA DATAD # ---------------------------------------------------------------DATA # Function :PolyClipDATA ض # Inputs :DATA # OutPuts :DATAX # Description :DATAD # --------------------------------------------------------------- DATA def PolyClip(vertexlst):DATA`  global gW,gHDATAT  ClipRgnEdges = [[0,0,0,gH.val],[0,gH.val,gW.val,gH.val],[gW.val,gH.val,gW.val,0],DATA(  [gW.val,0,0,0]]DATAp  inlist = vertexlstDATA  for edge in ClipRgnEdges:DATA,  if inlist==None or inlist == []: breakDATA$h  inlist = EdgeClip(inlist,edge)DATA  return inlistDATA  DATAD8 # ---------------------------------------------------------------DATA # Function : RenderWireFrameDATA # Inputs :DATA@ # OutPuts :DATA # Description :DATAD # --------------------------------------------------------------- DATA(8 def RenderWireFrame(tofile,w,h,ax,ay):DATA(  global gLineWidth,gbSilhouette,gGenColDATA0  global gMsg,gCurrentFrame,gRendering,buffImageDATAH DATA  gRendering = 1DATA  DATA  mW = w/2DATA 8  mH = h/2DATAx  DATA  # Set Current FrameDATA(  Blender.Set('curframe',gCurrentFrame)DATAP  Blender.Window.RedrawAll()DATA  # Get SceneDATA$  sc = Blender.Scene.getCurrent()DATA8  obList = sc.getChildren()DATA DATA  if tofile:DATA  sh = bShape()DATA@  sh.Reset()DATA  movie = []DATA  placelist = []DATA   gMsg = "Rendering Wireframe"DATAX  oldclr = [-1,-1,-1]DATA  bChgColor = 0DATA  else:DATA   glClearColor(0.0,0.0,0.3,1.0)DATA8h  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)DATA,  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATA0  #Draw BackgroundDATA8x  glColor3f(gGenCol[3][0],gGenCol[3][1],gGenCol[3][2])DATA  glBegin(GL_POLYGON)DATA(  glVertex2d(9,10)DATAp  glVertex2d(w+10,10)DATA  glVertex2d(w+10,h+10)DATA  glVertex2d(9,h+10)DATA H  glEnd()DATA,  glPolygonMode(GL_FRONT_AND_BACK,GL_LINE)DATA DATA  # Get Visible LayersDATA(h  layerslst = Blender.Window.ViewLayer()DATA  layerslst.reverse()DATA  LayerMask = 0DATA0H  for l in layerslst: LayerMask += (2**(l-1))DATA  del layerslstDATA8  # Calculate Perspective Matrix from the current cameraDATA$P  obCamera = sc.getCurrentCamera()DATA  del scDATA$  cam = obCamera.getInverseMatrix()DATA8  cam.transpose() DATA DATA  # Changing the view modeDATA  cmra = obCamera.getData()DATA0X  fovy = (2.0*atan2(34.5/2.0,cmra.lens))*180/piDATAP  m2 = Perspective(fovy,float(w*ax)/float(h*ay),cmra.clipStart, cmra.clipEnd) DATA8  del fovy,cmraDATAx  DATA  #Create Frustum DATA  frustum = _Frustum(cam,m2)DATAH  m1 = Matrix()DATA  mP = Matrix()DATA  numobj = 0DATA  for obMesh in obList:DATAHP  if (type(obMesh.data)==NMeshType) and ((obMesh.Layer & LayerMask)>0):DATA<  mhActual = NMesh.GetRawFromObject(obMesh.name) #GetRawDATA48  #Obtain the colors of the objects in this frameDATA  colors = []DATA$  if len(mhActual.materials)>0:DATA(8  for colsmat in mhActual.materials:DATAD  colors.append([colsmat.R,colsmat.G,colsmat.B,colsmat.alpha])DATA(  else: colors = [[0.7,0.7,0.7,1.0]]DATA `  m1 = obMesh.matrixWorld #matDATA  m1.transpose()DATA  mP = cam * m1DATA@  mP = m2 * mPDATA DATA  b = obMesh.getBoundBox()DATA   bb=[]DATAP  for nb in b:DATA<  nb1 = MatMultVec(m1,Vector([nb[0],nb[1],nb[2],1.0]))DATA(  bb.append([nb1[0],nb1[1],nb1[2]])DATA,X  if (frustum.partial_box_inside(bb)>0):DATA  # Obtain the list of facesDATA   for f in mhActual.faces:DATAX  tf = []DATA  t2 = []DATA  for v in f.v:DATA4  #Transform the vertices to global coordinatesDATA@  p = MatMultVec(mP,Vector([v.co[0],v.co[1],v.co[2],1.0]))DATA  tf.append(p)DATA@@  p = MatMultVec(m1,Vector([v.co[0],v.co[1],v.co[2],1.0]))DATA$  t2.append([p[0],p[1],p[2]])DATA,  if (frustum.partial_face_inside(t2)):DATAh  if tofile:DATAT  # ------------------------------------------------------------- SWF BeginDATAx8  clr = [int(colors[f.mat][0]*255),int(colors[f.mat][1]*255),int(colors[f.mat][2]*255),int(colors[f.mat][3]*255)]DATA  bChgColor = 0DATA`(  if (oldclr[0]!=clr[0] or oldclr[1]!=clr[1] or oldclr[2]!=clr[2] or oldclr[3]!=clr[3] ):DATAD  _fsa = FILLSTYLEARRAY([FILLSTYLE(SOLID_FILL,[0,0,0,255])])DATAL0  _lsa = LINESTYLEARRAY([LINESTYLE(1,[clr[0],clr[1],clr[2],255])])DATA0  oldclr = [clr[0],clr[1],clr[2],clr[3]]DATA  bChgColor = 1DATAPX  # ------------------------------------------------------------- SWF EndDATA  else:DATA$  glLineWidth(gLineWidth.val)DATAHp  glColor3f(colors[f.mat][0],colors[f.mat][1],colors[f.mat][2]) DATA  glBegin(GL_POLYGON)DATA8 DATAp  iu = [] DATA  for p in tf:DATA  # Create PointDATA@  if p[3]<=0:DATA  x = int(p[0]*mW)+mWDATA  y = int(p[1]*mH)+mHDATA(  else:DATA$h  x = int((p[0]/p[3])*mW)+mWDATA$  y = int((p[1]/p[3])*mH)+mHDATA  DATAP  iu.append([x,y,0])DATA  #clippingDATA  iu = PolyClip(iu)DATA0 DATAh  if len(iu)>0:DATA  if not tofile:DATA4  for i in iu: glVertex2d(i[0]+10,i[1]+10)DATA`  glEnd()DATA  else:DATAT  # ------------------------------------------------------------- SWF BeginDATAh  if bChgColor==1:DATAh  sh.SetStyleRecord(SH_MOVE+SH_LINESTYLE+SH_NEWSTYLES,iu[0][0],h-iu[0][1],0,0,1,1,1,_fsa,_lsa)DATA0P  else: sh.MoveTo(iu[0][0],h-iu[0][1])DATA$  for k in range(len(iu)):DATA  i = k+1DATA P  if i>=len(iu): i = 0DATA@  sh.LineTo(iu[i][0]-iu[k][0],(h-iu[i][1])-(h-iu[k][1]))DATAP  # ------------------------------------------------------------- SWF EndDATA  del iuDATA  del tfDATA   numobj+=1DATAP DATA  del LayerMaskDATA DATA  if tofile:DATAL@  # ------------------------------------------------------------- SWF BeginDATA  sh.EndShape()DATA  movie = sh.GetShape()DATAH  gPercentage = 0.0DATA  del shDATA  Draw()DATA  gRendering = 0DATAX  return movieDATAL  # ------------------------------------------------------------- SWF EndDATA  else:DATA,P  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATA  glLineWidth(1.0)DATA$  buffImage = Buffer(GL_BYTE,w*h*3)DATAP  # Viewpoint dataDATA  ViewData = Buffer(GL_INT,4)DATA(  glGetIntegerv(GL_VIEWPORT,ViewData)DATA@  glReadBuffer(GL_BACK)DATAT  glReadPixels(ViewData[0]+10,ViewData[1]+11,w,h,GL_RGB,GL_UNSIGNED_BYTE,buffImage)DATA  gRendering = 0DATA X  return 0DATA DATAD # ---------------------------------------------------------------DATAH # Function : DrawObjectsDATA # Inputs :DATA # OutPuts :DATA # Description :DATADX # --------------------------------------------------------------- DATA def DrawObjects(tofile):DATAD  global gRenderType, buffImage,shadowbuff,gEnableMask,gCurrentFrameDATA<  global gW,gH,gAspX,gAspY, gFX, gFXType,gLevel,gRenderingDATA4  global gLineWidth,gbLines,gbSilhouette,gSilWidthDATA(p  global gGenCol,gPalette,gDoubleSidedDATA  global gShadowDATA  DATA@  gRendering = 1DATA DATA  # Set Current FrameDATA(  Blender.Set('curframe',gCurrentFrame)DATAX  Blender.Window.RedrawAll()DATA  #Get Current SceneDATA$  sc = Blender.Scene.getCurrent()DATAH  # Get Visible LayersDATA(  layerslst = Blender.Window.ViewLayer()DATA  layerslst.reverse()DATA0  LayerMask = 0DATA0p  for l in layerslst: LayerMask += (2**(l-1))DATA  del layerslstDATA  # Get Current cameraDATA$X  obCamera = sc.getCurrentCamera()DATA  cmra = obCamera.getData()DATA  obList = sc.getChildren()DATAP  del scDATA DATA8  # Calculate Perspective Matrix from the current cameraDATA$(  cam = obCamera.getInverseMatrix()DATA  cam.transpose() DATA4  fovy = (2.0*atan2(34.5/2.0,cmra.lens))*180.0/piDATAh0  m3 = Perspective(fovy,float(gW.val*gAspX.val)/float(gH.val*gAspY.val),cmra.clipStart, cmra.clipEnd) DATA  # Create FrustumDATA  frustum = _Frustum(cam,m3)DATA`  LampLst = []DATA  #Get all lamps positionsDATA  for obj in obList:DATA 8  if (obj.getType()=="Lamp"):DATA  lmp = obj.getData()DATA  flags = lmp.getMode()DATA  shdw = 0DATA,`  if flags & lmp.Modes['Shadows']: shdw=1DATA  loc = obj.locDATAD  LampLst.append([loc[0],loc[1],loc[2],shdw,lmp.getClipEnd()]) DATA  del lmp,loc,shdw,flagsDATA  DATA(  numcolors = 64/gPalette.GetNumColors()DATA$`  m = 64 % gPalette.GetNumColors()DATA  vMaskColors = []DATA   for hnd in gPalette.hndlst:DATAP  r = [hnd.intensity]DATA  r *= numcolors DATA  vMaskColors.extend(r)DATA(  del rDATA `  if (m>0):DATA  idx = len(vMaskColors)-1DATA   r = [vMaskColors[idx-1]] * mDATA@  vMaskColors.extend(r)DATA   del r,idxDATA   del hndDATA DATAl@  glPushAttrib(GL_LIGHTING_BIT|GL_ENABLE_BIT|GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT)DATA  glDisable(GL_SCISSOR_TEST)DATA 0  glClearColor(0.0,0.0,0.3,1.0)DATA  glClearStencil(0)DATA4  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)DATA0  glEnable(GL_SCISSOR_TEST)DATA DATA DATA  if gEnableMask.val:DATA88  glColor3f(gGenCol[0][0],gGenCol[0][1],gGenCol[0][2])DATA  else:DATA  #Draw BackgroundDATA8  glColor3f(gGenCol[3][0],gGenCol[3][1],gGenCol[3][2])DATA$  gModelMatrix = Buffer(GL_FLOAT,16)DATA$  gProjMatrix = Buffer(GL_FLOAT,16)DATA08  glGetFloatv(GL_MODELVIEW_MATRIX,gModelMatrix)DATA0  glGetFloatv(GL_PROJECTION_MATRIX,gProjMatrix)DATA  glBegin(GL_POLYGON)DATA@  glVertex2d(9,10)DATA  glVertex2d(gW.val+10,10)DATA$  glVertex2d(gW.val+10,gH.val+10)DATA0  glVertex2d(9,gH.val+10)DATA  glEnd()DATA DATA  Viewport = Buffer(GL_INT, 4)DATA(H  glGetIntegerv(GL_VIEWPORT, Viewport)DATA<  glViewport(Viewport[0]+10, Viewport[1]+10, gW.val, gH.val)DATA DATAH  glEnable(GL_DEPTH_TEST)DATA  glDisable(GL_LIGHTING)DATA  glShadeModel(GL_FLAT)DATA(  glDrawBuffer(GL_BACK)DATAp DATA   glMatrixMode(GL_PROJECTION)DATA  glPushMatrix()DATA8  glLoadIdentity()DATAh  m3 = Perspective(fovy,float(gW.val*gAspX.val)/float(gH.val*gAspY.val), cmra.clipStart, cmra.clipEnd) DATA  del cmra,fovyDATAX DATA  m3.transpose()DATA  proj = MatrixToBuffer(m3)DATA   glMultMatrixf(proj)DATA4h  cam = MatrixToBuffer(obCamera.getInverseMatrix())DATA  glMultMatrixf(cam)DATA DATAP  glMatrixMode(GL_MODELVIEW)DATA  glLoadIdentity()DATA DATA$   glPolygonMode(GL_FRONT,GL_FILL)DATAx  if (gRenderType.val>=2):DATA  glDisable(GL_TEXTURE_2D)DATA@  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT)DATA@  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT)DATAD  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)DATADp  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)DATA<  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_DECAL)DATAX  DATA DATA  width = gW.valDATA  height = gH.valDATAP  bsz = width*height*3DATA$  buffImage = Buffer(GL_BYTE,bsz)DATA$  buff2 = Buffer(GL_BYTE,bsz)DATA,H  shadowbuff= Buffer(GL_BYTE,bsz,[255]*bsz)DATA   del bszDATA(  gBmpTexture = Buffer(GL_BYTE,32*3)DATA@ DATAx  gTextBits=[0]*32DATA4  if (gRenderType.val>3) and (gRenderType.val<7):DATAP(  gTextBits = [1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0]DATA DATA  w3 = width * 3DATA   j3 = height*w3DATA`  bj3 = j3-w3DATA DATA  dictfilter={}DATA  dictfilter[(0,0,0)]=1DATA `  dictfilter[(255,255,255)]=1DATA8  # __________________________________________________DATA8  # Add Background, lines, silhouette, and mask colorsDATA8  # __________________________________________________DATA  for i in [0,1,2,3]:DATA 0  ir = int(gGenCol[i][0]*255)DATA   ig = int(gGenCol[1][1]*255)DATA   ib = int(gGenCol[1][2]*255)DATA (  if (ir,ig,ib) in dictfilter:DATAx  passDATA  else:DATA  dictfilter[(ir,ig,ib)]=1DATA8!  ObjLst = []DATAx!  shadowlines = []DATA!  for obj in obList:DATAD"  if (type(obj.data)==NMeshType) and ((obj.Layer & LayerMask)>0):DATA"  m1 = obj.matrixWorldDATA"  m1.transpose()DATA8#  # ------------------------------------------------DATA x#  # Set Object Bounding BoxDATA8#  # ------------------------------------------------DATA 0$  Box = []DATAp$  b = obj.getBoundBox()DATA $  bb=[]DATA%  for nb in b:DATA<@%  nb1 = MatMultVec(m1,Vector([nb[0],nb[1],nb[2],1.0]))DATA(%  bb.append([nb1[0],nb1[1],nb1[2]])DATA&  Box.extend(bb)DATAP&  DATA&  m1.transpose()DATA&  m2 = CopyMat(m1)DATA'  m2.transpose()DATA`'  DATA,'  if (frustum.partial_box_inside(Box)>0) :DATA8'  # ------------------------------------------------DATA`(  # Set MeshDATA8(  # ------------------------------------------------DATA0)  Mesh = NMesh.GetRawFromObject(obj.name) DATAh)  glPushMatrix()DATA )  mat = MatrixToBuffer(m1)DATA*  glMultMatrixf(mat)DATA$H*  invmat = obj.getInverseMatrix()DATA*  colors = []DATA4*  #Obtain the colors of the objects in this frameDATA H+  if len(Mesh.materials)>0:DATA$+  for colsmat in Mesh.materials:DATAD+  colors.append([colsmat.R,colsmat.G,colsmat.B,colsmat.alpha])DATA(h,  else: colors = [[0.7,0.7,0.7,1.0]]DATA, DATA(,  #Change the colors of the textures DATAP-  textures = []DATA-  for clr in colors:DATA-  tones = []DATA .  for t in range(64):DATA,p.  ir = int((clr[0]*vMaskColors[t])*255)DATA,.  ig = int((clr[1]*vMaskColors[t])*255)DATA,0/  ib = int((clr[2]*vMaskColors[t])*255)DATA$/  if (ir,ig,ib) in dictfilter:DATA /  passDATA (0  else:DATA h0  dictfilter[(ir,ig,ib)]=1DATA80  tones.append(int((clr[0]*vMaskColors[t])*255))DATA8 1  tones.append(int((clr[1]*vMaskColors[t])*255))DATA81  tones.append(int((clr[2]*vMaskColors[t])*255))DATA1  textures.append(tones)DATA@2  del tonesDATA2  glLineWidth(1.0) DATA2  DATA83  if gDoubleSided.val == 0: glEnable(GL_CULL_FACE)DATAh3  DATA3  edgedic = {}DATA3  capnear =[]DATA(4  capfar = []DATAh4  DATA4  for face in Mesh.faces:DATA4  n = face.noDATA(85  n =Vector([n[0],n[1],n[2],1.0])DATA 5  n = MatMultVec(invmat,n)DATA5  n.normalize()DATA(6  DATA`6  if gbSilhouette.val>0:DATA 6  glEnable(GL_CULL_FACE)DATA$7  glLineWidth(gSilWidth.val)DATA(X7  glPolygonMode(GL_BACK,GL_LINE)DATA7  glCullFace(GL_FRONT)DATA8  glBegin(GL_POLYGON)DATA<P8  glColor3f(gGenCol[2][0],gGenCol[2][1],gGenCol[2][2])DATA8  for vertex in face.v:DATA49  glVertex3f(vertex[0], vertex[1], vertex[2])DATAx9  glEnd()DATA9  glCullFace(GL_BACK)DATA:  glLineWidth(1.0) DATA0X:  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATA8:  if gDoubleSided.val == 1: glDisable(GL_CULL_FACE)DATA ;  DATA(X;  clr = colors[face.materialIndex]DATA8;  if (gRenderType.val==2) or (gRenderType.val==3):DATAD<  texbuff = Buffer(GL_BYTE, 64*3,textures[face.materialIndex])DATA <  glDisable(GL_TEXTURE_1D)DATAX<  glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, texbuff)DATA h=  glEnable(GL_TEXTURE_1D)DATA =  elif (gRenderType.val>3):DATAX>  r1,g1,b1 = int(gGenCol[1][0]*255),int(gGenCol[1][1]*255),int(gGenCol[1][2]*255)DATAD>  r2,g2,b2 = int(clr[0]*255),int(clr[1]*255),int(clr[2]*255)DATA?  j,i = 0,0DATA H?  for i in range(0,32*3,3):DATA?  if gTextBits[j]: DATA?  gBmpTexture[i]=r1DATA8@  gBmpTexture[i+1]=g1DATA@  gBmpTexture[i+2]=b1DATA@  else:DATAA  gBmpTexture[i]=r2DATAhA  gBmpTexture[i+1]=g2DATAA  gBmpTexture[i+2]=b2DATA B  j+=1DATA HB  del i,j,r1,g1,b1,r2,b2,g2DATAB  params=[]DATALB  if (gRenderType.val==4): params=Buffer(GL_FLOAT,4,[1.0,0.0,0.0,0.0])DATAPXC  elif (gRenderType.val==5): params=Buffer(GL_FLOAT,4,[0.0,1.0,0.0,0.0])DATAPC  elif (gRenderType.val==6): params=Buffer(GL_FLOAT,4,[0.0,0.0,1.0,0.0])DATA XD  glDisable(GL_TEXTURE_1D)DATA\D  glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, gBmpTexture)DATA 8E  glEnable(GL_TEXTURE_1D)DATA<E  glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR)DATA0E  glTexGenfv(GL_S,GL_OBJECT_PLANE,params)DATA8XF  glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR)DATA,F  glTexGenfv(GL_T,GL_EYE_PLANE,params)DATA$ G  glEnable(GL_TEXTURE_GEN_S)DATAxG  DATAG  del paramsDATA G  else:DATA(8H  glColor3f(clr[0],clr[1],clr[2])DATA(H  glPolygonMode(GL_FRONT,GL_FILL)DATAH  DATA I  p1 = face.v[0]DATA`hI  vCamera = Vector([obCamera.loc[0]-p1[0],obCamera.loc[1]-p1[1],obCamera.loc[2]-p1[2],1.0])DATAI  vCamera.normalize()DATAHJ  DATA@J  #Create the Shadow Volume for the lamps that cast shadowsDATA0J  if (len(LampLst)>0) and (gShadow.val>0):DATAPK  DATAK  numlamp=0DATAK  for lamp in LampLst:DATADL  if lamp[3]==0: continue #Skip lamps that don't cast shadowsDATA0L  infinity=lamp[4] #Lamp's Clip EndDATAL  numlamp+=1DATA8M  p2 = face.v[0]DATA<M  p2 = MatMultVec(m2,Vector([p2[0],p2[1],p2[2],1.0]))DATALM  vLight = Vector([lamp[0]-p2[0],lamp[1]-p2[1],lamp[2]-p2[2],1.0])DATApN  vLight.normalize()DATA(N  if (DotVecs(vLight,n)>-0.001):DATAO  _cn=[] # Near CapDATAhO  _cf=[] # Far CapDATA(O  for iv in range(len(face.v)):DATAP  pt2 = face.v[iv]DATAD`P  vtx2 = MatMultVec(m2,Vector([pt2[0],pt2[1],pt2[2],1.0]))DATA$P  # Find silhuette shadowDATA$0Q  v1 = face.v[iv-1].indexDATA Q  v2 = face.v[iv].indexDATAHQ  if (numlamp,v1,v2) in edgedic: edgedic[(numlamp,v1,v2)]=NoneDATAHPR  elif (numlamp,v2,v1) in edgedic: edgedic[(numlamp,v2,v1)]=NoneDATAR  else:DATA S  pt1 = face.v[iv-1]DATAXS  pt2 = face.v[iv]DATADS  vtx1 = MatMultVec(m2,Vector([pt1[0],pt1[1],pt1[2],1.0]))DATAD T  vtx2 = MatMultVec(m2,Vector([pt2[0],pt2[1],pt2[2],1.0]))DATAPT  _v1 = Vector([vtx1[0]-lamp[0],vtx1[1]-lamp[1],vtx1[2]-lamp[2],1.0])DATAU  _v1.normalize()DATAPhU  _v2 = Vector([vtx2[0]-lamp[0],vtx2[1]-lamp[1],vtx2[2]-lamp[2],1.0])DATAU  _v2.normalize()DATAD8V  edgedic[(numlamp,v1,v2)] = [[vtx2[0],vtx2[1],vtx2[2]],DATA4V  [vtx1[0],vtx1[1],vtx1[2]],DATAhW  [vtx1[0]+(_v1[0]*infinity),vtx1[1]+(_v1[1]*infinity),vtx1[2]+(_v1[2]*infinity)],DATAlW  [vtx2[0]+(_v2[0]*infinity),vtx2[1]+(_v2[1]*infinity),vtx2[2]+(_v2[2]*infinity)]]DATAPX  # Find CapsDATAPX  _v2 = Vector([vtx2[0]-lamp[0],vtx2[1]-lamp[1],vtx2[2]-lamp[2],1.0])DATAY  _v2.normalize()DATA\hY  _cn.append([vtx2[0]+(_v2[0]*0.001),vtx2[1]+(_v2[1]*0.001),vtx2[2]+(_v2[2]*0.001)])DATAhY  _cf.append([vtx2[0]+(_v2[0]*infinity),vtx2[1]+(_v2[1]*infinity),vtx2[2]+(_v2[2]*infinity)])DATAZ  DATAZ  _cf.reverse()DATA[  capnear.append(_cn)DATA`[  capfar.append(_cf) DATA [  DATA[  DATA40\  if gRenderType.val==2 or gRenderType.val>3:DATA\  p1 = face.v[0]DATA<\  p1 = MatMultVec(m2,Vector([p1[0],p1[1],p1[2],1.0]))DATAP]  na = 0.0DATA]  if len(LampLst)>0:DATA<]  # Obtain the Light Vector (Vertex to light source)DATA P^  for lamploc in LampLst:DATAT^  vLight = Vector([lamploc[0]-p1[0],lamploc[1]-p1[1],lamploc[2]-p1[2],1.0])DATA(_  vLight.normalize()DATA x_  _a = DotVecs(vLight,n)DATA_  if _a<0: _a*=-1.0DATA`  na+= _aDATA X`  else:DATA<`  #No lamps, so use camera position as lamp positionDATA`a  vLight = Vector([obCamera.loc[0]-p1[0],obCamera.loc[1]-p1[1],obCamera.loc[2]-p1[2],1.0])DATAa  vLight.normalize()DATA(a  na = max(DotVecs(vLight,n),0.0)DATA@b  if na>=1.0: na = 0.99DATAb  glBegin(GL_POLYGON)DATAb  for v in face.v:DATA(c  glTexCoord1f(na) DATA$xc  glVertex3f(v[0], v[1], v[2])DATAc  glEnd() DATA d  elif gRenderType.val==3:DATA`d  glBegin(GL_POLYGON)DATAd  for v in face.v:DATA d  p2 = Mesh.verts[v.index]DATA<He  p2 = MatMultVec(m2,Vector([p2[0],p2[1],p2[2],1.0]))DATA$e  n = Mesh.verts[v.index].noDATA(f  n =Vector([n[0],n[1],n[2],1.0])DATA hf  n = MatMultVec(invmat,n)DATAf  n.normalize()DATAg  na=0.0DATA@g  if len(LampLst)>0:DATA<g  # Obtain the Light Vector (Vertex to light source)DATA h  for lamploc in LampLst:DATATPh  vLight = Vector([lamploc[0]-p2[0],lamploc[1]-p2[1],lamploc[2]-p2[2],0.0])DATAh  vLight.normalize()DATA0(i  na+= (max(DotVecs(vLight,n),0.0)*1.85)DATAi  else:DATA<i  #No lamps, so use camera position as lamp positionDATAd8j  vLight = Vector([obCamera.loc[0]-p2[0],obCamera.loc[1]-p2[1],obCamera.loc[2]-p2[2],0.0])DATAj  vLight.normalize()DATA0 k  na = (max(DotVecs(vLight,n),0.0)*1.85) DATA k  if na>=1.0: na = 0.99DATAk  glTexCoord1f(na) DATA$ l  glVertex3f(v[0], v[1], v[2])DATAxl  glEnd() DATA l  else:DATAl  glBegin(GL_POLYGON)DATA4Hm  for v in face.v: glVertex3f(v[0], v[1], v[2])DATAm  glEnd() DATA m  glDisable(GL_TEXTURE_1D)DATA@n  glPopMatrix()DATAn  ObjLst.append(1)DATA4n  shadowlines.append([edgedic,capnear,capfar])DATA 8o  else:DATAxo  ObjLst.append(0)DATAo  glReadBuffer(GL_BACK)DATA`p  glReadPixels(Viewport[0]+10, Viewport[1]+11,width,height,GL_RGB,GL_UNSIGNED_BYTE,buffImage)DATAp  glDisable(GL_TEXTURE_1D)DATAp  DATA q  if (gShadow.val>0):DATAhq  glRasterPos2d(10,10)DATA@q  glDrawPixels(width,height,GL_RGB,GL_UNSIGNED_BYTE,shadowbuff)DATA r  DATAXr  glEnable(GL_CULL_FACE)DATAr  glCullFace(GL_BACK)DATAr  glColor3f(1,1,1)DATA8s  numobj = 0DATAxs  for obj in obList:DATADs  if (type(obj.data)==NMeshType) and ((obj.Layer & LayerMask)>0):DATA8t  glPushMatrix()DATA,t  mat = MatrixToBuffer(obj.matrixWorld)DATA0t  Mesh = NMesh.GetRawFromObject(obj.name) DATA@u  glMultMatrixf(mat)DATAu  for face in Mesh.faces:DATAu  glBegin(GL_POLYGON)DATA(v  for v in face.v:DATA$pv  glVertex3f(v[0], v[1], v[2])DATAv  glEnd() DATAw  glPopMatrix()DATAPw  numobj+=1DATAw DATAw  DATA$x  glClear(GL_STENCIL_BUFFER_BIT)DATAXx  glDepthMask(GL_FALSE)DATAx  glColorMask(0,0,0,0)DATAx  glEnable(GL_STENCIL_TEST)DATA$8y  glClear(GL_STENCIL_BUFFER_BIT)DATA$y  glStencilFunc(GL_ALWAYS,128,-1)DATAy  if (gShadow.val==1):DATA0z  glCullFace(GL_BACK)DATA(xz  glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)DATAz  else:DATA{  glCullFace(GL_FRONT)DATA,P{  glStencilOp(GL_KEEP,GL_INCR,GL_KEEP) DATA{ DATA {  for triplet in shadowlines:DATA8|  edgelst= triplet[0]DATA|  for key in edgelst:DATA|  edge = edgelst[key]DATA}  if edge<>None:DATAX}  i = edgeDATA}  glBegin(GL_QUADS)DATA,}  glVertex3f(i[0][0],i[0][1],i[0][2])DATA,@~  glVertex3f(i[1][0],i[1][1],i[1][2])DATA,~  glVertex3f(i[2][0],i[2][1],i[2][2])DATA,  glVertex3f(i[3][0],i[3][1],i[3][2])DATA`  glEnd()DATA  if (gShadow.val>1):DATA  for cap in triplet[1]:DATA8  glBegin(GL_POLYGON)DATA  for i in cap:DATA$Ѐ  glVertex3f(i[0],i[1],i[2])DATA(  glEnd()DATAh  for cap in triplet[2]:DATA  glBegin(GL_POLYGON)DATA  for i in cap:DATA$P  glVertex3f(i[0],i[1],i[2])DATA  glEnd() DATA  DATA  if (gShadow.val==1):DATA(h  glStencilOp(GL_KEEP,GL_KEEP,GL_DECR)DATA  glCullFace(GL_FRONT)DATA  else:DATA@  glCullFace(GL_BACK)DATA(  glStencilOp(GL_KEEP,GL_DECR,GL_KEEP)DATA DATA   for triplet in shadowlines:DATAh  edgelst = triplet[0]DATA  for key in edgelst:DATA  edge = edgelst[key]DATA@  if edge<>None:DATA  i = edgeDATAȆ  glBegin(GL_QUADS)DATA,  glVertex3f(i[0][0],i[0][1],i[0][2])DATA,p  glVertex3f(i[1][0],i[1][1],i[1][2])DATA,Ї  glVertex3f(i[2][0],i[2][1],i[2][2])DATA,0  glVertex3f(i[3][0],i[3][1],i[3][2])DATA  glEnd()DATAЈ  if (gShadow.val>1):DATA  for cap in triplet[1]:DATAh  glBegin(GL_POLYGON)DATA  for i in cap:DATA$  glVertex3f(i[0],i[1],i[2])DATAX  glEnd()DATA  for cap in triplet[2]:DATA  glBegin(GL_POLYGON)DATA8  for i in cap:DATA$  glVertex3f(i[0],i[1],i[2])DATA؋  glEnd() DATA  DATAP  glDisable(GL_CULL_FACE)DATA  glColorMask(1,1,1,1)DATA$  glStencilFunc(GL_NOTEQUAL, 0,-1)DATA4@  glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE)DATA  glColor4f(0,0,0,0.5)DATA  glMatrixMode(GL_PROJECTION)DATA@  glPushMatrix()DATA  glLoadIdentity()DATA Ў  glMultMatrixf(gProjMatrix)DATA  glMatrixMode(GL_MODELVIEW)DATAp  glPushMatrix()DATA  glLoadIdentity()DATA  glMultMatrixf(gModelMatrix)DATAP  glBegin(GL_QUADS)DATA  glVertex2d(0,0)DATA  glVertex2d(width*4,0)DATA (  glVertex2d(width*4,height*2)DATAx  glVertex2d(0,height*2)DATA ȑ  glEnd()DATA  glPopMatrix()DATA H  glMatrixMode(GL_PROJECTION)DATA  glPopMatrix()DATA ؒ  glMatrixMode(GL_MODELVIEW)DATA (  del gProjMatrix,gModelMatrixDATAx  glDisable(GL_BLEND)DATA  glEnable(GL_CULL_FACE)DATA  glDepthMask(GL_TRUE)DATAX  glDepthFunc(GL_LESS)DATA  glDisable(GL_STENCIL_TEST)DATA  glReadBuffer(GL_BACK)DATA`8  glReadPixels(Viewport[0]+10, Viewport[1]+11,width,height,GL_RGB,GL_UNSIGNED_BYTE,shadowbuff)DATAȕ DATA  glRasterPos2d(10,10)DATA@H  glDrawPixels(width,height,GL_RGB,GL_UNSIGNED_BYTE,buffImage)DATA DATA  if (tofile>0): DATA(8  #__________________________________DATA  # Filter image DATA(ؗ  #__________________________________DATA0  for j in range(0,j3,w3):DATA  for i in range(0,w3,3):DATAИ  r = buffImage[j+i]DATA  g = buffImage[j+i+1]DATAh  b = buffImage[j+i+2]DATA  for ci in dictfilter:DATAH  if (abs(ci[0]-r)<=8) and (abs(ci[1]-g)<=8) and (abs(ci[2]-b)<=8):DATA  buffImage[j+i] = ci[0]DATA К  buffImage[j+i+1] = ci[1]DATA  buffImage[j+i+2] = ci[2]DATA p  breakDATA  del dictfilterDATA  DATA(  if gFX.val:DATAh  if gFXType.val == 0:DATA(  #__________________________________DATA  # Pixelate DATA(H  #__________________________________DATA  l1 = width/gLevel.valDATA  l2 = height/gLevel.valDATA@  lw = l2 * w3DATA  l3 = l1 * 3DATA  ll = l1 * l2DATA  for j in range(0,j3,lw):DATA P  for i in range(0,w3,l3):DATA  r = 0DATA  g = 0DATA (  b = 0DATA$h  for bj in range(j,j+lw,w3):DATA$  for bi in range(i,i+l3,3):DATA   try:DATA X  r += buffImage[bj+bi] DATA$  g += buffImage[bj+bi+1] DATA  b += buffImage[bj+bi+2]DATAP  except:DATA  r += 128DATAآ  g += 128DATA  g += 128DATA h  r /=llDATA  g /=llDATA  b /=llDATA$(  for bj in range(j,j+lw,w3):DATA$  for bi in range(i,i+l3,3):DATA ؤ  try:DATA   buffImage[bj+bi] = rDATA h  buffImage[bj+bi+1] = gDATA  buffImage[bj+bi+2] = b DATA  except: passDATAP  elif gFXType.val == 1:DATA(  #__________________________________DATA  # VoronoiDATA(8  #__________________________________DATA  if gEnableMask.val:DATA`ا  r,g,b = int(gGenCol[0][0]*255),int(gGenCol[0][1]*255),int(gGenCol[0][2]*255) #Mask colorDATA h  else:DATA`  r,g,b = int(gGenCol[1][0]*255),int(gGenCol[1][1]*255),int(gGenCol[1][2]*255) #Line colorDATA$8  denom = max(gLevel.val*1.0,10.0)DATA  j,j1,i,i1 = 0,0,0,0DATAة  for j in range(0,j3,w3):DATA (  i1 = 0DATAh  for i in range(0,w3,3):DATAL  if (noise([i1/denom,j1/denom,0.0],NoiseTypes.VORONOI_CRACKLE)<0.5):DATA8  buffImage[j+i] = rDATA  buffImage[j+i+1] = gDATAث  buffImage[j+i+2] = bDATA (  i1+=1DATA h  j1+=1DATA DATA  del j,i,j1,i1DATA( DATA0`  if (gbLines.val>0) or (gbSilhouette.val>0):DATA  numobj = 0DATA  for obj in obList:DATADH  if (type(obj.data)==NMeshType) and ((obj.Layer & LayerMask)>0):DATA DATA  if ObjLst[numobj]:DATA@  glPushMatrix()DATA,  mat = MatrixToBuffer(obj.matrixWorld)DATA0  Mesh = NMesh.GetRawFromObject(obj.name) DATAH  glMultMatrixf(mat)DATA  for face in Mesh.faces:DATA(  glPolygonMode(GL_FRONT,GL_FILL)DATA@  glBegin(GL_POLYGON)DATA<  glColor3f(gGenCol[0][0],gGenCol[0][1],gGenCol[0][2])DATA  for v in face.v:DATA(H  glVertex3f(v[0], v[1], v[2])DATA  glEnd() DATA  if gbSilhouette.val>0:DATA 8  glEnable(GL_CULL_FACE)DATA$  glLineWidth(gSilWidth.val)DATA(  glPolygonMode(GL_BACK,GL_LINE)DATA 8  glCullFace(GL_FRONT)DATA  glBegin(GL_POLYGON)DATA@ش  glColor3f(gGenCol[2][0],gGenCol[2][1],gGenCol[2][2])DATA H  for vertex in face.v:DATA8  glVertex3f(vertex[0], vertex[1], vertex[2])DATA  glEnd()DATA@  glCullFace(GL_BACK)DATA  glLineWidth(1.0) DATA<  if gDoubleSided.val == 1: glDisable(GL_CULL_FACE)DATA4P  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATA  DATA  glPopMatrix()DATA@  numobj+=1DATA DATA  glReadBuffer(GL_BACK)DATA\  glReadPixels(Viewport[0]+10, Viewport[1]+11,width,height,GL_RGB,GL_UNSIGNED_BYTE,buff2)DATA  mr = int(gGenCol[0][0]*255)DATA  mg = int(gGenCol[0][1]*255)DATA 8  mb = int(gGenCol[0][2]*255)DATA  for j in range(0,j3,w3):DATAغ  for i in range(0,w3,3):DATAL(  if (buff2[j+i]==mr) and (buff2[j+i+1]==mg) and (buff2[j+i+2]==mb): DATA  passDATA  else:DATA$(  buffImage[j+i] = buff2[j+i]DATA(  buffImage[j+i+1] = buff2[j+i+1]DATA(ؼ  buffImage[j+i+2] = buff2[j+i+2]DATA0  del mr,mg,mbDATAp DATA(  if (tofile==0) and (gShadow.val>0): DATA  for j in range(0,j3,w3):DATAP  for i in range(0,w3,3):DATA  if (shadowbuff[j+i]==0):DATA4  buffImage[j+i] = int(buffImage[j+i]*0.5)DATA4X  buffImage[j+i+1] = int(buffImage[j+i+1]*0.5)DATA4  buffImage[j+i+2] = int(buffImage[j+i+2]*0.5)DATA(  DATA`  del buff2,w3,j3,bj3DATA  del LayerMaskDATA DATA  glPopAttrib()DATA,`  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)DATA  glMatrixMode(GL_PROJECTION)DATA  glPopMatrix()DATAP DATA  gRendering = 0DATA  return 0 DATA DATAD@ # ---------------------------------------------------------------DATA # Function : linear_aproxDATA  # Inputs :DATAH # OutPuts :DATA # Description :DATAD # --------------------------------------------------------------- DATA@ def linear_aprox(lst):DATA  global gVertexLst, gTolLDATA  pi = gVertexLst[lst[0]][0]DATA (  pf = gVertexLst[lst[-1]][0]DATAx  DATA,  d = float(pf[0]-pi[0]) # x2-x1DATA8  if d!=0: m = float(pf[1]-pi[1])/d # y2-y1/d = slope DATAx  else: m = 10000000000.0DATA@  a = m;b = -1.0;c = float(pi[1]-m*pi[0]) # Compute ConstantsDATA8  denom = sqrt(a*a+b*b+c*c)DATA  DATA  e = 0.0; idxe = 0DATA   for i in range(1,len(lst)-1):DATAX  p = gVertexLst[lst[i]][0]DATA  if denom>0:DATA$  d = ((a*p[0])+(b*p[1])+c)/denomDATA@  else: d = 0.0DATA  if abs(d)>=e:DATA  e = abs(d)DATA  idxe = iDATA@ DATAx  if (e2:DATA  l1 = lst[0:idxe+1]DATA  l2 = lst[idxe:]DATA  l1 = linear_aprox(l1)DATAp  l2 = linear_aprox(l2)DATA  l2 = l2[1:]DATA  l1.extend(l2)DATAH  return l1DATA  else: return lstDATA DATA def bez3(p1,p2,p3,t):DATA P  p = [0,0]DATA  t2 = t*tDATA  ct = 1 - tDATA  ct2 = ct*ctDATA,P  p[0] = p1[0]*ct2 + 2*p2[0]*ct*t + p3[0]*t2DATA,  p[1] = p1[1]*ct2 + 2*p2[1]*ct*t + p3[1]*t2DATA   return pDATAP DATAD # ---------------------------------------------------------------DATA # Function : curve_aproxDATA P # Inputs :DATA # OutPuts :DATA # Description :DATAD # --------------------------------------------------------------- DATA def curve_aprox(lst):DATA  global gVertexLst, gTolCDATA  pi = gVertexLst[lst[0]][0]DATA p  pf = gVertexLst[lst[-1]][0]DATA  sz = len(lst)DATA  if sz>3:DATA @  p2 = gVertexLst[lst[1]][0]DATA  p3 = gVertexLst[lst[-2]][0]DATAP  pw = IntersectLines([pi[0],pi[1],p2[0],p2[1]],[pf[0],pf[1],p3[0],p3[1]],1)DATA`  if pw<>None:DATA  if len(pw)==1:DATA  pt = [pw[0][0],pw[0][1]]DATA 8  d = 0DATA x  di = []DATA  for i in range(sz-1):DATA$  p = gVertexLst[lst[i]][0] DATA$`  q = gVertexLst[lst[i+1]][0] DATAD  v = sqrt(((q[0]-p[0])*(q[0]-p[0]))+((q[1]-p[1])*(q[1]-p[1])))DATA 0  d+=vDATAp  di.append(d)DATA  e = 0.0DATA  me = 0.0DATA8  idxe = 0DATAx  sz1 = len(di)-1DATA  for i in range(sz1):DATA  ti = di[i]/dDATAX  Qn = bez3(pi,pt,pf,ti)DATA$  Pn = gVertexLst[lst[i+1]][0]DATAL  v = sqrt(((Qn[0]-Pn[0])*(Qn[0]-Pn[0]))+((Qn[1]-Pn[1])*(Qn[1]-Pn[1])))DATA  if v>me:DATA  me=vDATA  idxe = iDATA @  e += vDATA  if idxe==0: idxe=sz1/2DATA  if (e2:DATA  l1 = lst[0:idxe+1]DATAP  l2 = lst[idxe:]DATA  l1 = curve_aprox(l1)DATA  l2 = curve_aprox(l2)DATA8  l2 = l2[1:]DATA  l1.extend(l2)DATA  return l1DATA   else:DATAH  return lstDATA$  else: return [lst[0],lst[-1]]DATA  return lstDATA( DATAD` # ---------------------------------------------------------------DATA # Function : ScanImageDATA # Inputs :DATA` # OutPuts :DATA # Description :DATAD # --------------------------------------------------------------- DATA,X def ScanImage(width,height,buff,shflag=0):DATA(  global gVertexLst,gColordic, gColorsDATA DATAH  alpha = 255DATA  if shflag: alpha = 127 DATA(  #__________________________________DATA0  # Scanning image DATA(x  #__________________________________DATA DATA  rb,gb,bb=-10,-10,-10DATAP  oldi,sz = 0,0DATA,  # 0 1 2 3 4 5DATA4  # gVertexLst = ((x,y),clridx,flag,prev,next,vip)DATA X  r0 = []DATA  r1 = []DATA  xi= 0DATA  w3 = width * 3DATA P  top = w3-3DATA  idx = 0DATA  first = 0DATA  skipmask = 0DATAP  fh = float(height)DATA  gPercentage = 0.0DATA  for j in range(0,height,1):DATA 0  flag=0DATAp  rb,gb,bb=-10,-10,-10DATA  jw = j*w3DATA  for i in range(0,w3,3):DATAH  r=buff[jw+i]DATA  g=buff[jw+i+1]DATA  b=buff[jw+i+2]DATAL  if abs(r-rb)>9 or abs(g-gb)>9 or abs(b-bb)>9 or i==top or j==height-1: DATA  if flag==0: flag = 1DATA  else:DATA(0  if (rb,gb,bb,alpha) in gColordic:DATA,  idx = gColordic[(rb,gb,bb,alpha)]DATA  else: DATA (  idx = len(gColordic) DATA(x  gColordic[(rb,gb,bb,alpha)]=idxDATA(  gColors.append([rb,gb,bb,alpha])DATA(  if shflag and rb>0:DATA x  passDATA  else:DATA8  gVertexLst.append([[xi,j],idx,0,-1,-1,0]) #XiDATA<`  gVertexLst.append([[(i/3),j],idx,0,-1,-1,0]) #Xf DATA  sz = len(gVertexLst)-2DATAL  r1.append([sz,sz+1,0,idx]) #(idxXi,idxXf,numintersect,coloridx)DATA  DATA  xi= i/3DATA  rb,gb,bb = r,g,bDATA` DATA  if first == 0:DATA  first = 1DATA  r0 = r1DATA`  for _i in r0:DATA8  gVertexLst[_i[0]][4] = _i[1] # xi.next = xfDATA8  gVertexLst[_i[1]][4] = _i[0] # xf.next = xiDATAx  else:DATA  for _f in r1:DATA$  dyi = gVertexLst[_f[0]][0][0]DATA$P  dyf = gVertexLst[_f[1]][0][0]DATA  for _i in r0:DATA(  # Check intersect range of pairsDATA$H  dxi = gVertexLst[_i[0]][0][0]DATA$  dxf = gVertexLst[_i[1]][0][0]DATA  if (_f[3]==_i[3]):DATA@  if (((dyi<=dxf) and (dyi>=dxi)) or ((dyf<=dxf) and (dyf>=dxi))) or (((dxi>=dyi) and (dxi<=dyf)) or ((dxf>=dyi) and (dxf<=dyf))):DATA  # intersectionDATA8@  gVertexLst[_f[1]][4] = _f[0] # yf.next = yiDATA  if _f[2]>0:DATA8  gVertexLst[gVertexLst[_f[1]][3]][4] = _i[0] DATA,X  # yf.prev.next = xiDATA  else:DATA4  gVertexLst[_f[0]][4] = gVertexLst[_i[1]][4]DATA,`  # yi.next = xf.nextDATA8  gVertexLst[_i[1]][4] = _f[1] # xf.next = yfDATA8(  gVertexLst[_f[1]][3] = _i[1] # yf.prev = xfDATA  _f[2]+=1DATA  # No intersection foundDATA  if _f[2] == 0:DATA8h  gVertexLst[_f[0]][4] = _f[1] # yi.next = yfDATA8  gVertexLst[_f[1]][4] = _f[0] # yf.next = yiDATA8  DATA p  r0 = r1DATA  del r1DATA  r1 = []DATA0  DATAh  del r0,r1,fhDATA  del rb,gb,bb,oldi,xi,idx,szDATA  del w3,top,firstDATA@  DATAx DATAD # ---------------------------------------------------------------DATA( # Function : VectorizeDATA p # Inputs :DATA # OutPuts :DATA # Description :DATAD0 # --------------------------------------------------------------- DATA$ def Vectorize(width,height,colors):DATA@  global gEnableMask,gGenCol,gCurrentFrame,gLineWidth,gVertexLstDATA,p  global gVectFunc,gbLines,gSmoothVertex DATA  DATA  sh = bShape()DATA H  sh.Reset()DATA   movie = []DATA  placelist = []DATA,  mr = int(gGenCol[0][0]*255) # Mask colorDATA h  mg = int(gGenCol[0][1]*255)DATA   mb = int(gGenCol[0][2]*255)DATA DATA@ DATA$x  #_________________________________DATA  # Optimize linksDATA(  #__________________________________ DATAp  RegionVectors=[] DATA  sz = len(gVertexLst)DATA  for numv in range(sz):DATAH  v = gVertexLst[numv]DATA  lstpts = []DATA  idx = numvDATA   while v[2]==0:DATA X   v[2] = 1DATA   lstpts.append(idx) DATA   idx = v[4]DATA   v = gVertexLst[v[4]]DATAh   sz1 = len(lstpts)DATA$   if gVectFunc.val>0 and sz1>3:DATA   sz1 = len(lstpts)DATAP   for j in range(sz1):DATA   j1 = j-1DATA   j2 = j+1DATA   if j==sz1-1: j2=0DATA$`   p1 = gVertexLst[lstpts[j1]][0]DATA$   p2 = gVertexLst[lstpts[j]][0]DATA$   p3 = gVertexLst[lstpts[j2]][0]DATA4h   v1 = Vector([(p2[0]-p1[0]),(p2[1]-p1[1])]) DATA0   v2 = Vector([(p3[0]-p2[0]),(p3[1]-p2[1])]) DATA$0  ang = AngleBetweenVecs(v1,v2)DATA  if ang>22.5:DATA$  gVertexLst[lstpts[j]][5] = 1DATA (  else: DATA h  if gSmoothVertex.val>0:DATA  for o in range(10):DATA(  p2 = gVertexLst[lstpts[j]][0] DATAl`  gVertexLst[lstpts[j]][0] = [int((float(p2[0])*0.34) + (float(p1[0])*0.33) + (float(p3[0])*0.33)),DATAP  int((float(p2[1])*0.34) + (float(p1[1])*0.33) + (float(p3[1])*0.33))]DATA  if len(lstpts)>1:DATA  outlst = []DATA  sz1 = len(lstpts)DATAP  for k in range(sz1):DATA  j = k-1 DATA$  p = gVertexLst[lstpts[k]][0]DATA$8  q = gVertexLst[lstpts[j]][0]DATA8  d = sqrt(((q[0]-p[0]) ** 2)+((q[1]-p[1]) ** 2))DATAL  if d>1.0 or gVertexLst[lstpts[k]][5] == 1: outlst.append(lstpts[k])DATAx  lstpts = outlst DATA8  if gVectFunc.val==2: lstpts = linear_aprox(lstpts)DATA<(  elif gVectFunc.val ==3: lstpts = curve_aprox(lstpts)DATA  del outlstDATA  sz1 = len(lstpts) DATA   DATAX  # Sort by color idx DATA   if sz1>2:DATA   v = gVertexLst[lstpts[0]]DATA(0  RegionVectors.append([v[1],lstpts])DATA  del lstptsDATA  RegionVectors.sort() DATA DATA(H  #__________________________________DATA  # Create SWF fileDATA(  #__________________________________ DATA @  h = heightDATA<  a = FILLSTYLEARRAY([FILLSTYLE(SOLID_FILL,[255,0,0,255])])DATA0  b = LINESTYLEARRAY([LINESTYLE(1,[0,0,0,255])])DATAP DATA  oldcoloridx=-1DATA  coloridx =-1DATA  colorflag=0DATAH  linetrans = 1DATA  for q in RegionVectors:DATA  region = q[1]DATA  sz = len(region)DATA`  if len(region)>0:DATA   v = gVertexLst[region[0]]DATA  coloridx = v[1]DATA@  color=colors[coloridx]DATA   #Skip mask color regionsDATAH  if (color[0]==mr) and (color[1]==mg) and (color[2]==mb): continueDATAX  DATA@  # Set color flag that identify when a color idx has change DATA,  if (coloridx==oldcoloridx): colorflag=0DATA `  else: DATA  colorflag=1DATA  oldcoloridx = coloridxDATA0   DATA(h   # Set Fillstyle and line style DATAX   a = FILLSTYLEARRAY([FILLSTYLE(SOLID_FILL,[color[0],color[1],color[2],color[3]])])DATAH!  if gbLines.val == 1: DATA!  b = LINESTYLEARRAY([LINESTYLE(gLineWidth.val,[int(gGenCol[1][0]*255),int(gGenCol[1][1]*255),int(gGenCol[1][2]*255),255])])DATA H"  else:DATA\"  b = LINESTYLEARRAY([LINESTYLE(gLineWidth.val,[color[0],color[1],color[2],color[3]])])DATA# DATA P#  if color[3]<255: linetrans=0DATA# DATA#  curve = 0DATA$  DATAP$  for numv in range(sz):DATA4$  if str(type(region[numv]))=="":DATA%  curve = 1DATAH%  j = region[numv]DATA(%  j1 = gVertexLst[region[numv+1]][0]DATA,%  else: j = gVertexLst[region[numv]][0]DATAH&  if numv==0:DATA &  i = jDATA&  if colorflag:DATAp'  sh.SetStyleRecord(SH_MOVE+SH_FILL0+SH_FILL1+SH_LINESTYLE+SH_NEWSTYLES,i[0],h-i[1],0,1,linetrans,1,1,a,b)DATA '  else:DATA '  sh.MoveTo(i[0],h-i[1])DATA @(  f = jDATA (  else:DATA(  if curve>0:DATAL)  sh.CurveTo(j[0]-f[0],(h-j[1])-(h-f[1]),j1[0]-j[0],(h-j1[1])-(h-j[1]))DATA)  f = j1DATA)  curve=0DATA*  numv+=1DATA H*  else:DATA0*  sh.LineTo(j[0]-f[0],(h-j[1])-(h-f[1])) DATA *  f = jDATA8(+  if numv>0: sh.LineTo(i[0]-f[0],(h-i[1])-(h-f[1]))DATA+ DATA+  sh.EndShape()DATA,  movie = sh.GetShape()DATAP, DATA ,  del RegionVectors,gVertexLstDATA ,  del colors,sh,numv,sz,mr,mb,mgDATA(- DATA`-  gVertexLst = []DATA-  return movieDATA- DATAD . # ---------------------------------------------------------------DATA. # Function : TGARenderDATA . # Inputs :DATA / # OutPuts :DATA`/ # Description :DATAD/ # --------------------------------------------------------------- DATA0 def TGARender(w,h,ax,ay):DATAh0  global gFilename,gPathnameDATA0  # Viewpoint dataDATA 1  ViewData = Buffer(GL_FLOAT,4)DATA$P1  glGetFloatv(GL_VIEWPORT,ViewData)DATA1  dx = ViewData[0]DATA  dy = ViewData[1]DATA؊ DATA  # write to fileDATA X  size = w*hDATA  ImageR = Buffer(GL_BYTE,size)DATA  ImageG = Buffer(GL_BYTE,size)DATA 8  ImageB = Buffer(GL_BYTE,size)DATA  glReadBuffer(GL_FRONT)DATA@Ќ  glReadPixels(dx+10,dy+11,w,h,GL_RED,GL_UNSIGNED_BYTE,ImageR)DATA@@  glReadPixels(dx+10,dy+11,w,h,GL_GREEN,GL_UNSIGNED_BYTE,ImageG)DATA@  glReadPixels(dx+10,dy+11,w,h,GL_BLUE,GL_UNSIGNED_BYTE,ImageB)DATA DATA X  # Save TGADATA  extname = gFilename.val+".tga"DATA(  name = sys.join(gPathname.val,extname)DATA@  del extnameDATA DATA  Header=[chr(0)]*18DATA,(  Header[2] = chr(2) # Uncompressed RGB DATA$  Header[8] = chr(0) # X Origin LoDATA$  Header[9] = chr(0) # X Origin HiDATA$8  Header[10] = chr(0) # Y Origin LoDATA$  Header[11] = chr(0) # Y Origin HiDATA(  Header[12] = chr(w%256) # Width Hi DATA$@  Header[13] = chr(w/256) # LoDATA(  Header[14] = chr(h%256) # Height HiDATA(  Header[15] = chr(h/256) # LoDATA(H  Header[16] = chr(24) # 24 bits colorDATA$  Header[17] = chr(0) # Down->Top DATA DATA0  try:DATAh  f = open(name,"wb")DATA  # Save HeaderDATA  for byte in Header:DATA8  f.write(byte)DATA   for x in range(h-1,-1,-1):DATA  for y in range(w):DATA  byte = (x * w)+ yDATA `  f.write(chr(ImageB[byte]))DATA   f.write(chr(ImageG[byte]))DATA   f.write(chr(ImageR[byte]))DATA P  f.close()DATA$  print "TGA file:",name," saved!"DATA   del x,y,fDATA$(  except IOError, (errno,strerror):DATA0  print "I/O Error (%s): %s" % (errno,strerror)DATA,  del name,size,ImageR,ImageB,ImageG,HeaderDATA@  del dx,dy,ViewDataDATA DATAD # ---------------------------------------------------------------DATA8 # Function : TIFRenderDATA # Inputs :DATA 2 # OutPuts :DATA`2 # Description :DATAD2 # --------------------------------------------------------------- DATA3 def TIFRender(nx,ny,ax,ay):DATAh3  global gFilename,gPathnameDATA3 DATA3  # Viewpoint dataDATA 84  ViewData = Buffer(GL_FLOAT,4)DATA$4  glGetFloatv(GL_VIEWPORT,ViewData)DATA4  dx = ViewData[0]DATA(5  dy = ViewData[1]DATAp5 DATA5  # write to fileDATA5  size = nx*nyDATA 06  ImageR = Buffer(GL_BYTE,size)DATA 6  ImageG = Buffer(GL_BYTE,size)DATA 6  ImageB = Buffer(GL_BYTE,size)DATA 7  glReadBuffer(GL_FRONT)DATA@h7  glReadPixels(dx+10,dy+11,nx,ny,GL_RED,GL_UNSIGNED_BYTE,ImageR)DATAD7  glReadPixels(dx+10,dy+11,nx,ny,GL_GREEN,GL_UNSIGNED_BYTE,ImageG)DATADP8  glReadPixels(dx+10,dy+11,nx,ny,GL_BLUE,GL_UNSIGNED_BYTE,ImageB)DATA8 DATA(9  extname = str(gFilename.val+".tif")DATA(X9  name = sys.join(gPathname.val,extname)DATA9  del extnameDATA9 DATA(:  try:DATA`:  f = open(name,"wb")DATA:  # Save HeaderDATA,:  header = [chr(77),chr(77),chr(0),chr(42)]DATAH;  offset = size * 3 + 8;DATA;  v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATAP<  header.extend(v)DATA$<  for byte in header: f.write(byte)DATA< DATA(=  # Write the binary data DATA x=  for y in range(ny-1,-1,-1):DATA=  for x in range(nx):DATA>  byte = (y * nx)+ xDATA X>  f.write(chr(ImageR[byte]))DATA >  f.write(chr(ImageG[byte]))DATA >  f.write(chr(ImageB[byte]))DATAH?  DATA?  # Write the footer DATA?  f.write(chr(0))DATA4@  f.write(chr(14)) # Number of directory entries DATAx@  DATA@  # Width tag, short intDATAA  c = [1,0,0,3,0,0,0,1]DATA$HA  for byte in c: f.write(chr(byte))DATA0A  f.write(chr((nx & 65280) / 256)) #Image widthDATAB  f.write(chr(nx & 255))DATAPB  f.write(chr(0))DATAB  f.write(chr(0))DATAB  DATAC  # Height tag, short int DATAhC  c = [1,1,0,3,0,0,0,1]DATA(C  for byte in c: f.write(chr(byte))DATA4D  f.write(chr((ny & 65280) / 256)) #Image heightDATApD  f.write(chr(ny & 255))DATAD  f.write(chr(0))DATAE  f.write(chr(0))DATAPE DATA$E  # Bits per sample tag, short int DATAE  c = [1,2,0,3,0,0,0,3]DATA((F  for byte in c: f.write(chr(byte))DATA F  offset = (size * 3) + 182;DATAF  v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA G  for byte in v: f.write(byte)DATAG DATA$H  # Compression flag, short int DATA hH  c = [1,3,0,3,0,0,0,1,0,1,0,0]DATA(H  for byte in c: f.write(chr(byte))DATA0I  # Photometric interpolation tag, short int DATA pI  c = [1,6,0,3,0,0,0,1,0,2,0,0]DATA(I  for byte in c: f.write(chr(byte))DATA$J  # Strip offset tag, long int DATA$pJ  c = [1,17,0,4,0,0,0,1,0,0,0,8]DATA(J  for byte in c: f.write(chr(byte))DATA$ K  # Orientation flag, short int DATA$xK  c = [1,18,0,3,0,0,0,1,0,1,0,0]DATA(K  for byte in c: f.write(chr(byte))DATA((L  # Sample per pixel tag, short intDATA$L  c = [1,21,0,3,0,0,0,1,0,3,0,0]DATA(L  for byte in c: f.write(chr(byte))DATA(0M  #Rows per strip tag, short int DATAM  c = [1,22,0,3,0,0,0,1]DATA(M  for byte in c: f.write(chr(byte))DATA(0N  f.write(chr((ny & 65280) / 256)) DATAN  f.write(chr(ny & 255))DATAN  f.write(chr(0))DATA O  f.write(chr(0))DATA$hO  #Strip byte count flag, long int DATAO  c = [1,23,0,4,0,0,0,1]DATA(  for byte in c: f.write(chr(byte))DATAX  offset = size * 3DATA  v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA X  for byte in v: f.write(byte)DATA,  # Minimum sample value flag, short int DATA  c = [1,24,0,3,0,0,0,3]DATA(X  for byte in c: f.write(chr(byte))DATA  offset = (size * 3) + 188DATA  v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA  for byte in v: f.write(byte)DATA0  # Maximum sample value tag, short int DATAh  c = [1,25,0,3,0,0,0,3]DATA(  for byte in c: f.write(chr(byte))DATA   offset = (size * 3) + 194DATA`  v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA   for byte in v: f.write(byte)DATA,h  # Planar configuration tag, short int DATA$Ȗ  c = [1,28,0,3,0,0,0,1,0,1,0,0]DATA(  for byte in c: f.write(chr(byte))DATA$x  # Sample format tag, short int DATAЗ  c = [1,83,0,3,0,0,0,3]DATA(  for byte in c: f.write(chr(byte))DATAx  offset = (size * 3) + 200DATAȘ  v = [chr(((offset & 4278190080) / 16777216)),chr(((offset & 16711680) / 65536)),chr(((offset & 65280) / 256)),chr(offset & 255)]DATA  for byte in v: f.write(byte)DATA Й  # End of the directory entry DATA  c = [0,0,0,0]DATA(`  for byte in c: f.write(chr(byte))DATA$  # Bits for each colour channel DATA  c = [0,8,0,8,0,8]DATA(X  for byte in c: f.write(chr(byte))DATA(  # Minimum value for each component DATA  c = [0,0,0,0,0,0]DATA(P  for byte in c: f.write(chr(byte))DATA  # Maximum value per channelDATA  c = [0,255,0,255,0,255]DATA(H  for byte in c: f.write(chr(byte))DATA,  # Samples per pixel for each channelDATA  c = [0,1,0,1,0,1]DATA(H  for byte in c: f.write(chr(byte))DATA  f.close()DATA  del x,y,c,v,fDATA$  print "Tiff file:",name," saved"DATA$x  except IOError, (errno,strerror):DATA0П  print "I/O Error (%s): %s" % (errno,strerror)DATA$0  del name,size,ImageR,ImageB,ImageGDATA  del dx,dy,ViewDataDATAР  DATAD # ---------------------------------------------------------------DATA # Function : SFS2SWF()DATA ȡ # Inputs :DATA # OutPuts :DATAH # Description :DATAD # --------------------------------------------------------------- DATA def SFS2SWF():DATA(@  global gScroll2,gFilename,gPathnameDATA  global gMsg,gPercentageDATA DATA  gMsg = "Converting SFS to SWF"DATAp  gPercentage = 0.6DATA  Draw()DATA DATA (  bkcolor=[]DATAh  w = 0DATA  h = 0DATA إ  fps = 0DATA  maxframes = 0DATAX  fquality = 1DATA  floop = 1DATAئ  frames = [] DATA DATA P  if len(gScroll2.datalst)>0:DATA$  numfiles = len(gScroll2.datalst)DATA  for file in gScroll2.datalst:DATA$H  name = sys.join(file[1],file[0])DATA DATAب  f = open(name,'rb')DATA(  # _________________________________DATAx  # Read headerDATA(  # _________________________________DATA  data = f.read(21)DATA4`  _w = REVUI32([data[0],data[1],data[2],data[3]]) DATA4Ȫ  _h = REVUI32([data[4],data[5],data[6],data[7]])DATA80  _fps = REVUI32([data[8],data[9],data[10],data[11]])DATA@  _numframes = REVUI32([data[12],data[13],data[14],data[15]])DATA8  _color = [ord(data[16]),ord(data[17]),ord(data[18])]DATAp  _qlty = ord(data[19])DATA  _loop = ord(data[20])DATA(  # _________________________________DATAh  # Read DataDATA(  # _________________________________DATA  for i in range(_numframes):DATAP  data = f.read(4)DATA4  sz = REVUI32([data[0],data[1],data[2],data[3]])DATA  data = f.read(sz)DATAH  recbits = []DATA  for byte in data:DATAد  recbits.append(byte)DATA(  frames.append(recbits)DATAx  f.close()DATA(  # _________________________________DATA(  # Save first chunk of information DATA(h  # _________________________________DATA0  if _w>w: w=_w # keep the max size of movie DATA  if _h>h: h=_hDATA<h  fps+=_fps # this will be the average of all chunksDATA4ز  maxframes+=_numframes # number of total framesDATA @  if _qlty==0: fquality = 0DATA  if _loop==0: floop=0DATA(س  bkcolor.append([_numframes,_color])DATA80  del _w,_h,_fps,_numframes,_color,_qlty,_loop,dataDATA  DATAд  fps/=numfilesDATA DATAH  movie = []DATA(  # _________________________________DATA  # Initialize SWF MovieDATA(0  # _________________________________DATA  # HeaderDATA(ȶ  # _________________________________DATA4  movie = swfHeaderBlock(0,[0,0,w,h],fps,maxframes)DATA(  # _________________________________DATA  # QualityDATA(  # _________________________________DATAx  if (not fquality):DATA  # Do some actionsDATA(  actions = swfActionToggleQualty()DATA `  movie+=swfDoAction(actions) DATA(  # _________________________________DATA  # Create framesDATA(P  # _________________________________DATA  id = 0DATA  for item in frames:DATA40  movie+= swfDefineShape3(id,RECT(0,0,w,h),item)DATA  id+=1DATA(ػ  # _________________________________DATA0  # Create SpriteDATA(x  # _________________________________DATA м  oldid = 0DATA  j = 0DATAH  for c in bkcolor:DATA<  movie+=swfSetBackgroundColor(c[1][0],c[1][1],c[1][2])DATA  for i in range(c[0]):DATA8P  if oldid>0: movie.extend(swfRemoveObject2(oldid-1))DATA`  movie.extend(swfPlaceObject2(PO_MATRIX+PO_CHAR_ID,j,[0,0,0,[1.0,1.0,0.0,0.0,0.0,0.0],j]))DATAH  movie+=swfShowFrame()DATA  j+=1DATAؿ  oldid = jDATA8  if oldid>0: movie.extend(swfRemoveObject2(oldid-1))DATA(  # _________________________________DATA  #Loop Animation ?DATA(  # _________________________________DATAx  if (not floop):DATA  # Do some actionsDATA   actions = swfActionStop()DATA X  movie+=swfDoAction(actions)DATA  movie+=swfShowFrame()DATA  movie+=swfEnd()DATA@  a = len(movie)DATA  SetFileLength(movie,a)DATA$  extname = gFilename.val+".swf"DATA0  # write to fileDATA,x  name = sys.join(gPathname.val,extname)DATA  if swfWrite(name,movie):DATA(  gPercentage=1DATA$p  gMsg = "Error: writing file."DATA  Draw()DATA  else:DATA8@  print "Sequece convertion to SWF file completed."DATA  else:DATA<  print "Error: Missing data files. Select at least one."DATAP DATA8  del bkcolor,w,h,fps,maxframes,fquality,floop,framesDATA  gPercentage = 0.0DATA 8  gMsg = ""DATAx  Draw()DATA  returnDATA DATAD # ---------------------------------------------------------------DATA # Function : SWFRenderDATA # Inputs :DATA # OutPuts :DATA` # Description :DATAD # --------------------------------------------------------------- DATA def SWFRender(w,h,ax,ay):DATA$h  global gMsg,gPercentage,gExportingDATA4  global gRenderType,gSequenceFileFlag,gNumSeqFilesDATAH(  global gGenCol,gFilename,gPathname,gStartFrame,gEndFrame,gStepFrameDATA  global gCurrentFrameDATA(  global gLoopAnimation,gFPS,gQlty,gW,gHDATA(@  global gColordic, gColors,gVertexLstDATA  DATA  gMsg = "Rendering SWF"DATA  startime = clock()DATA`  DATA  gExporting = 1DATA DATA   if gSequenceFileFlag.val==0:DATA`  movie = []DATA  #Initialize SWF MovieDATA  # HeaderDATAL(  movie = swfHeaderBlock(0,[0,0,w,h],gFPS.val,gEndFrame.val/gStepFrame.val)DATA  # Set Background colorDATAh  movie+=swfSetBackgroundColor(int(gGenCol[3][0]*255),int(gGenCol[3][1]*255),int(gGenCol[3][2]*255))DATA DATA  # ___________________________DATA  # Start animationDATA `  # ___________________________DATA  placelst = []DATAH  for frame in range(gStartFrame.val,gEndFrame.val+1,gStepFrame.val):DATAh  start = clock()DATA,  print "Rendering Frame:",frame,"...",DATA  gCurrentFrame = frameDATA `  # Initlialize frame variableDATA  recbits = []DATA  gPercentage = 0.6DATA8  # Render frameDATA  if gRenderType.val == 0:DATA  # Render Wire Frame DATA,  recbits = RenderWireFrame(1,w,h,ax,ay)DATA  else:DATA  DrawObjects(1)DATA  gColordic={}DATAP  gColors= []DATA  gVertexLst = []DATA  ScanImage(w,h,buffImage)DATA (  ScanImage(w,h,shadowbuff,1)DATA(x  recbits = Vectorize(w,h,gColors)DATA  #Save Define ObjectsDATA  placelst.append(recbits)DATAh  end = clock()DATA(  print "%.2f %s" % (end-start,"sec.")DATA DATA @  # ___________________________DATA  # QualityDATA  # ___________________________DATA  if (not gQlty.val):DATAh  # Do some actionsDATA(  actions = swfActionToggleQualty()DATA   movie+=swfDoAction(actions) DATA X  # ___________________________DATA  # Create framesDATA  # ___________________________DATA @  id = 0DATA  for item in placelst:DATA4  movie+= swfDefineShape3(id,RECT(0,0,w,h),item)DATA 0  id+=1DATA p  # ___________________________DATA  # Create SpriteDATA   # ___________________________DATA$X  for i in range(len(placelst)):DATA0  if i>0: movie.extend(swfRemoveObject2(i-1))DATA`  movie.extend(swfPlaceObject2(PO_MATRIX+PO_CHAR_ID,i,[0,0,0,[1.0,1.0,0.0,0.0,0.0,0.0],i]))DATA  movie+=swfShowFrame()DATA0  if i>0: movie.extend(swfRemoveObject2(i-1))DATA P  # ___________________________DATA  # Loop Animation ?DATA  # ___________________________DATA 8  if (not gLoopAnimation.val):DATA  # Do some actionsDATA  actions = swfActionStop()DATA  movie+=swfDoAction(actions)DATAp  movie+=swfShowFrame()DATA  movie+=swfEnd()DATA  a = len(movie)DATAP  SetFileLength(movie,a)DATA$  extname = gFilename.val+".swf"DATA  # ___________________________DATAH  # Write to fileDATA  # ___________________________DATA,  name = sys.join(gPathname.val,extname)DATA@  if swfWrite(name,movie):DATA  gPercentage=1DATA$  gMsg = "Error: writing file."DATA 0  Draw()DATAp  else:DATA  print "Export Completed"DATA  del placelst DATA8  else:DATAHp  frames_per_file = (gEndFrame.val-gStartFrame.val+1)/gNumSeqFiles.valDATA,  for numfile in range(gNumSeqFiles.val):DATAH  movie = []DATA$  # ___________________________DATA  # Set Sequence HeaderDATA$0  # ___________________________DATA,  # 21 byte Sflender File Sequence headerDATA$  movie.extend(UI32(w)) #WidthDATA(@  movie.extend(UI32(h)) #HeightDATA8  movie.extend(UI32(gFPS.val)) #Frames per secondDATAH  movie.extend(UI32(frames_per_file/gStepFrame.val)) #Number of framesDATA@x  movie.extend(chr(int(gGenCol[3][0]*255))) #Background RedDATA@  movie.extend(chr(int(gGenCol[3][1]*255))) #Background GreenDATA@X  movie.extend(chr(int(gGenCol[3][2]*255))) #Background BlueDATA0  movie.extend(chr(gQlty.val)) #Quality FlagDATA4(  movie.extend(chr(gLoopAnimation.val)) #Loop FlagDATA$  # ___________________________DATA  # Start animationDATA$0  # ___________________________DATA4  sf = (numfile*frames_per_file)+gStartFrame.valDATA  ef = sf+frames_per_fileDATA@  placelst = []DATA0  for frame in range(sf,ef+1,gStepFrame.val):DATA  start = clock()DATA,0  print "Rendering Frame:",frame,"...",DATA  gCurrentFrame = frameDATA$  # Initlialize frame variableDATA8  recbits = []DATA  gPercentage = 0.6DATA  # Render frameDATA   if gRenderType.val == 0:DATA`  # Render Wire Frame DATA,  recbits = RenderWireFrame(1,w,h,ax,ay)DATA   else:DATAP  DrawObjects(1)DATA  gColordic={}DATA  gColors= []DATA(  gVertexLst = []DATA p  ScanImage(w,h,buffImage,1)DATA$  ScanImage(w,h,shadowbuff,1)DATA(  recbits = Vectorize(w,h,gColors)DATAp  #Save Define ObjectsDATA  placelst.append(recbits)DATA  end = clock()DATA,X  print "%.2f %s" % (end-start,"sec.")DATA DATA  for item in placelst:DATA$@  movie.extend(UI32(len(item))) DATA  movie.extend(item)DATA  fstart = "%d" % sfDATA(  fend = "%d" % efDATADp  extname = gFilename.val+fstart.zfill(3)+"-"+fend.zfill(3)+".sfs"DATA  del fstart,fendDATA$0  # ___________________________DATA  # Write to fileDATA$  # ___________________________DATA,(  name = sys.join(gPathname.val,extname)DATA