gtamsanalyzer.app-0.42/0000755000175000017500000000000010102461365015343 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/.DS_Store0000644000175000017500000001400410102461237017023 0ustar brentbrent00000000000000Bud1cedsclboolSourcedsclboolSourcefwi0blobicnvSourcefwswlongSourceicspblob  @ @ @ @ EDSDB ` @ @ @gtamsanalyzer.app-0.42/changes.html0000644000175000017500000000152310102207413017632 0ustar brentbrent00000000000000 GTAMS Analyzer

Changes

    Changes since .41 release:
  1. Bug fix for export data with scan for line number; tabs were not properly converted
  2. Export option added for column names
    Changes since .40 release:
  1. Select+ button on document window is now working (correctly corrected to the right action)
  2. Rob Burns cleaned up the Gorm files considerably
  3. Copy without tags now added to edit menu

gtamsanalyzer.app-0.42/ReadMe.pdf0000644000175000017500000015243410102460604017177 0ustar brentbrent00000000000000%PDF-1.3 % 2 0 obj << /Length 1 0 R /Filter /FlateDecode >> stream xڭXmo6_q/+ò"v@hK,$e{[dա),Jsn#c`<( iE$$-Ut&n#_yx}4)]SJy?wL( h_@Mg݋JR/.hj<6MO?N>ۢ3mEx-LcjlLy;~ K;gO_\?Γ ˞5VT?5sNC%> ZiRBUfdsI7"-*L~DC;zOVs-a9VBVLu?6,R7 ]|Z)t_eIU$,@ww;R=x}AAm=ot)y_O(wHpg=K0Mh WӆGyq zccMm @Ӳf@-DUM bL ۀq<$duI%UZ6YQ45'#M_-KJ.J~0 ½tmjQT5;L I܍QMƼcu(-Iʞ|VuKO!03Z^ @4tp{jZr))0TQ-tTfC>c/67ᨋ)eaH6ˡ}U{Pٚv j6LRu3g,T 8.`Bjf6תތd֤?^VvC<x 2,W_te/Q(e*I.zX9+S9 AK4}Q&E40TL'TBׅ(ɮkL*553cJ~q nB;q07VYr:Q,'UƵg.I(HKwf>l+j\zk8<. 7a-q@9L}Q-,bQ=+!6g@}L6BHL(J7]UQ  ݧW+drz m[i[k~;N $Q#kG3vJF+F*1R2zs\3Čã|OؘwV?icF?cCpU許Uݙ*Kbꦔ TTBkVA~ITMf܈"2T($ګ" ZqX2as˽O!FEU%߾䞓>-JHc){&Ta؛40ء f Y\ɶ,:}H S<n?d|$G /m Χ;ӄg}/Ł'%7A̭_]!"U+=JzUSSd?M&]>xOn}~ݤm̥,9$;M"9z<ܧ7FsX&,رTܬ*_-LV)7ӦA㊇e /݅)<,mT/i@~44/QB2{C Z7owp`/P *0GIt}"yq7H?ZjPGw+Y endstream endobj 1 0 obj 1666 endobj 4 0 obj << /Type /Page /Parent 5 0 R /Resources 6 0 R /Contents 2 0 R /MediaBox [ 0 0 612 792 ] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 3 0 R >> /Font << /F1.0 7 0 R /F2.0 8 0 R >> >> endobj 10 0 obj << /Length 9 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x}OHQǿ%Be&RNW`oʶkξn%B.A1XI:b]"(73ڃ73{@](mzy(;>7PA+Xf$vlqd}䜛] UƬxiO:bM1Wg>q[ 2M'"()Y'ld4䗉2'&Sg^}8&w֚, \V:kݤ;iR;;\u?V\\C9u(JI]BSs_ QP5Fz׋G%t{3qWD0vz \}\$um+٬C;X9:Y^gB,\ACioci]g(L;z9AnI ꭰ4Iݠx#{zwAj}΅Q=8m (o{1cd5Ugҷtlaȱi"\.5汔^8tph0k!~D Thd6챖:>f&mxA4L&%kiĔ?Cqոm&/By#Ց%i'W:XlErr'=_ܗ)i7Ҭ,F|Nٮͯ6rm^ UHW5;?Ͱh endstream endobj 9 0 obj 706 endobj 3 0 obj [ /ICCBased 10 0 R ] endobj 12 0 obj << /Length 11 0 R /Filter /FlateDecode >> stream xڭY]s۶}xFeHJGq4I[t/ Ih(B!@YP$6%ryg~/Ni4)i2 IRNoLH1 h䮾<<>(Л9}0hJ _|In"_IZҭ.DR X]I)V06ϡOK+ ulH/i'\+3p^bss88q8ZYJ"Ȳ=e*|-H\SQ]Dz+s8 !_EG>B3+:7 dzcN'mE_Os-,)'Y `+b%q8^5l|F"束8 6? tNK]յp" 6t ѺA gA8J~%UO7V}QcM~D# ¢) OǴZ咵 Mb2kHdd2 ۏsZ }~wc?gA|Y_Ajb='`ՂĢR2Gi.ILG*[0 ^/be 梃)362UepL=3ӻ哓/G*!*nZ fI+T?i`1,\ڇ۾ 4ɯFFm*ဂMF]t齥TX {2v !z#]@uRi2 יS"JF~*3MD x,? g&0v z NFXTX`R"ӫ=$輸xgt̎vXf^:Pm f͸X{.{Iw9nIwW>}V;$6 vRxϒ-"s.n{UΛU&R ZzSRtB;;c:DmraɝJ\"y}ģ-a±/Da]Ow_jJ/Cp 5^&VpIjУQ.,c:9y>r LHe p[Ł/SS>a&c0GwQޣ6: S'.B6a܅Ņė9tCxjxm{23 g2AшJj CJ*rdxdc-Oh$V' \i,T7# .㼑ϧט)?=wNCE8x=y6Vi? O,˗jž(~-BURpZk3tC 5 PUµ;W(^ :5'wW> endobj 14 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 3 0 R >> /Font << /F1.0 7 0 R /F3.0 15 0 R /F2.0 8 0 R >> >> endobj 17 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream xڭX[s~ׯU އ,q||\xޭe, 0hhFo?#FIe}=_#|pI ~:4Q%[P;3!dc2<Q>w> d@>_QB?&38z,C.[.װԥew0ps:rL(aV2IgxNOco'δ·pGPٙ. [Ce;%RY2zu?z0\>l ^j˕LuWu#-@`ALAt3XHX6ЦGvY~FAShOL@-{*qM{_*g+ }^qX+f2bd7Mp4 w}.憬hPĵ8<ґ0n9A"or2g# %1%j\F=irhkIM](:yPg_|:8i>tȐR]g{G}Iq0:Q]z#,L55:"ʲZWo3}pbWp˅¦!)çfgHÑcB*oOUuz5#~cL0Ji>FE0Ͼ30iz3Aճ0($LC<$ N: k4N߆ I+L:枷#kش"tMejMYfWz:PRVw&[:իW0~ 7yZҠf8"/~{nY.s&U{/wg}kmoAubds$&uz*nHM56I `q;;hcŒÕI RP-ZҌϚ!;x.G.wCג)-g4"h:8A3h&ikN6e޵DdJ+J+;i,q &fшqGO+$=tf48ب%brHT](ŌKYfnNEN5:}M 57 +s|5H~?z endstream endobj 16 0 obj 1913 endobj 18 0 obj << /Type /Page /Parent 5 0 R /Resources 19 0 R /Contents 17 0 R /MediaBox [ 0 0 612 792 ] >> endobj 19 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 3 0 R >> /Font << /F4.0 20 0 R /F5.0 21 0 R /F1.0 7 0 R /F3.0 15 0 R /F2.0 8 0 R >> >> endobj 22 0 obj << /Length 23 0 R /Length1 11228 /Filter /FlateDecode >> stream xzy|T9ޙ;Kfrgߒsg2{&uBIrgْ@B$,B#P TTJ)À8Q[i 5V[`/Qy{',9Y{9fF D| n'zV;~qO!Iޢ{>qr񲵋E2MYe#G"g/w\п|$UE4sيޞȧCy& Y)k#Cy7,ʮ+nZ"uP> +WLn/ a$GX@@ۇZF&S9R@(1H9-!Ad!ȊP- 1ݕ,G\d ,4%.T¬G`$j-P0-|E-F^Coh+@!T^A<4!mCCt-s6V@wCheN#5AˀđFj0Ԍ&)sBGѫxmiX!  tV .kFr4BzqcfFh CUW'GOQa<,ͬ<0V?B~A"Jv*glDocx->$:㙕;nT #DDAgЫcT<܈!RG$J$ȸ25MftE/W3br\'.a$6C()#|Iy/s P `\=64, . 3ѧ:ll0 A#( 1> Q%咵g` DDpǹЁnķ=a@~?~4 GXC,@C/@4,r-|||丈B~E*AV.镬l<(9,&XZ =DowTflJ@P?1D`{ƫ?Y°6Op!Q$r`+*aǾ {+j'(,.3̙O$%AP>D3s?I79/3ovz.'`y6l2:Ur J(Hxʮ蹦;ဪ$"㻜_Č#BGˑxHH)b~WAGّݎDPfne+B4R8z- %aq5mgabfu ׵ \{`G[snMhAۑ {:D0&0uWs-\Ә ܭ=}[ZbPJf8[bcgGoNB{v}{#!w5,I+omq4w&дP@5ZÙoҿܙ w Fr` G8 :AH&- N Hț0VBf\-_ kwkzkn $dq^hϋI I,,E$RH($ \JYdQt[< N2\NaƢ>:bIqx!%1I?v&<I6iE3y jQb79Zr&U٧d-SbtjK_GmUm:2b)c7UaXR\JaJ]NOi5]Ez*ko.hjvRǾl {e[OWl&OüMϓX$5_$Jb| SqaF1q0ђbm_'&]wyRB$e~5^Tn^8esUpI;ǻ;(gCNϦt! 2r@۝&$aH#6NyY,nw8<߳³CzRc=[+I 6xhXjGV>lZlPaDȯ̀~8UD*#rJR,  $:U5NR_+;|+W^ntWU3>-' .V')O:!LCx`ؖJkr֪֩7iwiyK/KZ\NKlU}@(E*"U<(-6k_-`I/ȸNNqЉ}nذEjOc Wɠ5ZJ8BY&QnQSF%d΍ e3Uzj8ZEbĚ5Vso]Fca'kA E/7Yl9K] oxj|-iV_Iڪ ޳v~XS[wV{jtwt N).?nӣ&s.%q;%6T:.dBɐ~lHQ/Ro(dBjFMkVT9;,,ݖ} t{abp&("E, tΫ}W5kqX;_B{XKioqab2/Zfxttl4 Tm FD<<:N @V#*QyO[?Ysvj$wo~78|J*BII8EHvzQ!z_!vŸ_>Эծ)dLPEFӵZmu[<Zaq[erc t6VVHZ<y+^_d=`[*bStкN#P cU gU*Z-)њ*%L2Bؠ7pNm An%Q#;+ߋSﶤNqjդwMK5Lq?WsE9tyϹ'HScxRw1b|pYAsv_GkGdj2d/^_R xAeRP-+=^j> lqifj=雄m2YZ3f{&uNFcEe7YKglzpP 600room|<Y>ؚr k {Y '0H :~ ͦ;UNg`l g3E??|y9|o6Ɗ.u+Akռ gje,3PX"U5V$3}>c8RAP!? '7h 'Ss1_~ w8gi(! _%4(*%Z&.t_^שּŭ?_x[uޛ3dƟ[#`\oJYėHkS4(v Oq/n0BlSi[*:wI̤tNUn;suo:BΩ.@b8EacU8HoARVZyY 4c}s/Y\.\tW;_?}`W+OVCKKkA!PS,YԎMⷫpz7LȵrAi%yy\37;xw='w hON8V>\9x6G97کVSS}p M8ׄM]],Ct{Z,z֬%Rn7urdDwG4js9g6HN3;|ECc橌yJvߍ jw *ύ^vB;DmխZYCБN NHe趁aqM%Q]Ya7/MYSk'Nܲiê[O'j˱XWVϷ/tvVsN=wmN9>KU]rۦۿk:oj9=VC+9_{CHly^I$A_ RYV >t_gPҨ4r$Hd~e2 L~O?5=a|4l6kyIҙbW֕VJW["+;1y`NIӄ?ku/ЎQArk#T9Le=/Rq 7AIÐz˰'AgSHx+~h haasFaݠqQ{aABfW xcC<:dFZ[+UR~{I\(pj 燹a3ϔQ΃˨u:ue[έ[p{{J5~ZZpKKJ))/QUئj56Ѽ፜7 o(.gWiWYC:PVTS q5`쎈+ZӇ"uHȝPr}Wr~쏙͹\XZ9-vvn޽ݽ-qpom/ *Q!GȾ$κ,8@ W2Dm}eKSwr9LMU +21]eFW`p5ʊ;TWW]XQu:0Xq3Ȝ/LHKh-FtEҝMjnR[A͖ڼҒ6GUۊ?ڵX5D>?!?z_s`Qe"=ע30Gi4-R/3.3=Lύ?7=g|txd1F^/B'.'X}A&m5 j!ȷHP=(GvB> עRd#UPW]']ӧ_d?pk28wξ}G>:E]B*Bo[]AY,l/ro8矷+tZemvX$<| {WCLqE5ZXWC\~sj"YITҙyQTsHLAYk( q}G#"^}gwpU5ߘzB<gAC<Ϝ bLL;;k݉WW[jt7P>$/U?XmLJ#p@3\Lu8sy$9eᐓ.dw\!;b4isXҤ8M`Bcu*6g /vnpuN.<]GE\vL=ΖUS)"6̬kjϨ{DDH0:?pu}JP>BwCχ|f+9Vx/ e* Q׺C/OyON+vP)UG@򧸢mؖGG?r~s+uh]LM: Ihkյ]1} n(?^\9?tbs9PL&<sQfjf!(^~k z {'_S^e?>c5obCwu47/c.X܉#;׶UWz 5--n94mraA) Oy CMGq^BUaCA1D+er)ibs6e NOs2U A]pl[ڗsC@$R?"Ԏ` @tJaeFo=B|V/El%?l,ΒE7t懪J3+n$W_|ys~n PeB9;$ۀW~_R~,cҕˏAZ'ѣBFujZ.9BP.'EEC#'}R. n2C?rūF9rNItD*;'&JR9A8# "^AЎ[*V`j󴩝3j\l!{`_A(QjG$4MChg9O Cؚlc)b nM?vx&E $7ElNwQ;䤈; "El"O?"KSz q+{?l8B5@pcv; 0(*F xrX D4˹]LW VfI87(r< ӃbJAȠAՁAՆAU͠*2jPWg>"}bᕕ+UC*W 4OLMSuSNÝNNUATN1CL׉i^/1>^AjO5zcЦTSyTlg@r:wZ:9 b|oɹn &z ͕><-Jy:K&Cˀ$p0\ 097[s' !| 'qn@Dh~#^*ڗ"[ kho20 LJt$c׳ *< f8(&4-:l%C`S?9zmI(b-r'{d\*qiW ԏxQ*^u >WVd`'.hH@0g7&cZta\znվs/ JdHa7ob? c? B@ط=+Z@!e_vcOv^D`<(a>Ea>=(gaƖOĄ:' wo`ŝ +C)8"T.C6.8Ľwd0m)JKW Xvꦬa[aYö2kVdmؼol6- gbNF:ddlUL,@+'V|,Ssj.htieL-ˑ)d2TFSg襌@R84LlA2Gx; nx[!- o[[1ĺu㹻55ĐKzd"2^q\T6O=>^&H<ߙ(2I a"B4i^ǫ;mȆ H''}Sd,ٶȾ}"d7&lYf{ /`*P@d H(ȇ":y˒ \x%W(vK- ;(6{68yiyiv |=}˶sk߾qt ?)vANl7'6,p8l`&K|kNlv5;l=歮#h̎#V~KS|w|eɏ|OgMƚz4'4OƺO>aTq7]ܼzu60{ endstream endobj 23 0 obj 8252 endobj 24 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ -170 -410 996 1007 ] /FontName /NDPNYU+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 22 0 R >> endobj 25 0 obj [ 250 333 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 333 778 778 778 778 778 778 778 778 778 778 667 778 778 778 778 778 778 778 778 778 778 778 778 778 556 667 778 778 778 778 722 778 778 778 778 778 778 778 500 778 778 556 444 778 500 556 278 778 778 778 833 556 500 556 778 444 389 333 ] endobj 20 0 obj << /Type /Font /Subtype /TrueType /BaseFont /NDPNYU+Times-Bold /FontDescriptor 24 0 R /Widths 25 0 R /FirstChar 32 /LastChar 116 /Encoding /MacRomanEncoding >> endobj 26 0 obj << /Length 27 0 R /Length1 10836 /Filter /FlateDecode >> stream xڕz |UW{gt! @ $ $dG$G (QPQph2M2AE(kGQ ߩ8ܺ۩{s=R@K&4c˛ޝhwsw)MS~U]z:yJg| IP'p6#X߁i [S$ f͙\?f݃+'wv}cۖ^oº4gZ`xy M>#4qp\nGV;["u5}wndX&nI-]+m`jp Xt?)' S6S @4sjkQFe|図A^C$6m/A"j S^,S(iva !Lj-(h#ȞhS\(po쭅lͰXHTVr(Lk4:?fn򑃱s% ""ځ$8V5F^ _P@9T.5FGFZ=!džĞ=Rh^nHtȀ\(RmD S`JVO/NR]\?drO&_J!Gr'_N0uYz->IH:"0]7 y Pc:.K\!41 yp!7W)$w24"7ed=iCI;\T%ZOH!Ot)F_C^J*E42+f;s]~I pݶ6w6Ԏ턧i;Љ)dI$T!|D055REP}+Dye7U(T2-x۵Ϯѩ?>a (.xrCrs=23zR)>q*[$hDX,WyÁ0Tzl.Ŧi:{;e)2 ݤ$=~o27BˏkN`p`pϖ}Eѽ)GĎ!ad/2PG2/ᯆ,&-W.MjQUMpVV835Zj@e!k%ZCApI*UOA}>Uqk"!;u/LJhPNVMS{^c,s:?>-T?䰖O&Ow֯Ea\Ԉ{5ByH$°I4!B2':O#\EBI#K]]-/7X|ٍZ"hZ&c BsfNR\Cp:X4A,oøhN"Z TAoCm2dr_EW?~~:ޮ]$x:V~ 9K&]w[ȏE,-Dh%#U+wQwqjAȏ|gy꺝'+F[P*R7;yWI𥗢7D/,m9O_QP$a٥vA˵сɎh<2$AߐB|0Q?\Kf|X7lIJu. V]Y0.LK9Fvv3EE5(H-_}UvK%XSlVLL CIP(֣OZ+BFfxSUHU+QF(v. *u,\$YPcCh1i@J&:Kh7,!ɒ[K@٬.SBSR %DbH֍2R sk->o2Qa㙟G|{%WaAlEvb98pFsxNYv董{rl07ik.`cqYV̞u-UGbB-=0j>Bt:QXp=BB İȈ3R9}*M +z Մŗ5MNz]صzwNN][9 6yb!{/NΪK89xxU:p",媣[W/Ǔ+4uv36`2پL_S[ fci',˸t66F22%01Qn1cd0ɬ6q IHRDK&S\047#d_He&ԱkS< F6S|F@WT B-eZ1aaԪC,`+솣 Gguq߱uojIZYBD, ŖUl,תův o߼\32moIoi?w~B`ٞN~βt?^gի'!Jm /j5>ky+{JW+Z40V85m6uj:%xy]G8P9_5sCW+0IF9 = ,<,L:C8(IEl__mԒZ Oww/cv9ovbOuOes);kXЄxSq1/u;j8{?9T*zu_/=O6B_J`Fo1)S'sm;YUcѫO&<{y^;׿6A&.)韻}ѨW=^dy(&à/*a~A v1p0Ad%Ԙdlf~rmqz𙖀RhI, {pTcgMbZ}ok^ ˸u::i}#A|wvrQܛk⛆7??65~F]>rW !AեH n /C0MMgCPXQ)B%3D v|fa.BQuݦM㴫ۄFMյkQXb5ee,n0f 5ͧ>x}&ֶ-ae >C1rfzg~$nr킪ި'Q 11Y,9A5sK:vJ[٭s fT#JB ! sChd}@Jl^0g -'E!EVlR NL% DV?w=m/o2G1?ÕrN.ݬ.7W5h*&v3p'Ѳ% 6#JzWI$LpHEYpj8##[>[2ՇpK})䏏nz~Kþ]n*pg+gl$έO=Rwy>7<0cJf>*pxI"a46[㦜 ܮQqѻZc(X;ж",hys@ Jpb(.oi׹7+nC70+a٣jV==uPڮqBCup 窹E,}}{};~ s78$G}iaw;CNSvƭhfx^A˞iZtc:FtiBTV 7R[,Hj<,VZIfIb 8S< SQPX?t}Nbuخk];_PV|x8 04pl9K 0>3~{Fk'5tFz S}훮hi7ښZwn,n-h5tFV=Nm7o77F%σo#&n ke,*jb& 3^^P0}"+H=<%l1q8s=NNOONH',ǭxvwvN-`N]99$56񪩷3xG\ECYPި8Jʈ8u( +eAvGG6JRum:1^:a͌5R%[UwCoN js- {s15%of;PW RC@ɡr2uɅʽ)M|47?e~c֧ww뾌?]/.uU_UɊb&e'3NIafȐ#ӽ[~B+],: fa'Jsat;ʕABb{q)҅m۵+[}mJkgܶ6Gb-~񖚚MlBm!Axꁼ{&&̫ ӿl4튶SSzUMJzΛP|O|},j8 8>+@N^D3(''o((4K=Ƒ?Av)Q07@ӀQp>7hA+!ԋ3qU&ikm'aڴgv1„m)*Lsv0xDs" ڿb" zDv2o>^Z*FoaL1g";0߅04?SoLS06Loaj.W:L6LaZk)%=_(臙-\;ۅ Bܢ[GaQ$H;J` ^d9Mj[NN; 5bs4_l/7_|ES"nLӮel%`}懻-Sr%Sva~}voWcu/٧kOF=#}!tBx ^ծcUiU{Z[=c/&Մ{XR1 \yATvz{YM2lAPTd[U24NJW !HRݡ[LR(F $f3N#iF&hz-^K55I5rֆO4q4BS4YagnP7` Y4^:3sqIy}Cx,<_3`/toP{6jfz\9Wը_l:X:W_螪vgsMU皪Ε*>fпzo* endstream endobj 27 0 obj 7939 endobj 28 0 obj << /Type /FontDescriptor /Ascent 1000 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ -39 -425 1067 1000 ] /FontName /VLBHNW+Monaco /ItalicAngle 0 /StemV 0 /Leading 83 /MaxWidth 600 /FontFile2 26 0 R >> endobj 29 0 obj [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj 21 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VLBHNW+Monaco /FontDescriptor 28 0 R /Widths 29 0 R /FirstChar 32 /LastChar 125 /Encoding /MacRomanEncoding >> endobj 30 0 obj << /Length 31 0 R /Length1 26960 /Filter /FlateDecode >> stream xڬ?|͌ꨏFu$HZ]Vkl_^a] .l lJLMKl6k6!!qf;#m|;Y)=# p /\`Umנ+GkCwYPU筸w< v7G|(}/Y`џW"fh\.yytɊYס3K\ Y\`* W,P]`;Q߿jk髙mt~p՚ū6*]9{]@:"ub(&.7>C@G'jtF{{j bRKk7;7LFr-ȱ^~0z J){|`#A|go80B|kQ`lQ{9 `%z ]O 5 8-`ÇNnx BO3)Bw33U0ZAp+R=(.pXV ޳GCI0\n=%_e`2hV<|y7wx}w4/.Ku$e}T8æy BMF:cvpѷa#WZ2ց 0|%nAD QOh{!֎mƎV\&&× ~nw"$0#ǢmX փߛ~x )B7^!KO{ __&sCܢܧ|>|ׇF a5hT0,BX/< G @,8^ #_X}gۂ@A~0v2(x.XZPжi do?cN" !EX cD8 g&ep#?G/.4h;79mH8,IEL-bK hۍq=?ƿ'xb-q q_8ɒ9r:9C銺='ԣQ8BlzkXF!u/z}6mhӣ !cP0yyv9vMF)IHiBta K=?~fOhXOsI|IȆJN#=튄ɳP]١=CZ{ަM- nnIWh3]0}:!aP?x\q {HWOK 4yVwWfS{`9{@c%Y}zt,R:Ȣep|Y{`&#]{>iu_=س`=*ճףSCcf](G+0ȒkG)e;k0i٣SMʁt{]=M_~RC)p7EFn -Ծ$ڤ7k6lFt9Zk)еDз?zE'G6Qb!;#йI !AƁ$F83:j4F%ƗKlJ{ jsy`@ þA"b 2_ï%W`n^f[H_< STlGp]A[˶!57"6eW!ac;lNȭtPcrTx5)W)? Z􊅊C3eSr< OZk65mcZc5 ]2:'xg'F zjhq/Tu=B/?5j.'T_F0[mb1[h(k86 Yz)(46KpBtzQ3OABƤXDXR.+_Wh,Q]mVY7笞qS֝.]u^a-kLarݯ5u) ^:Fix~ʎ/ ݉؂yys^m߉_ds&<"wHKK܏ڃ۞zw^y&L&i3esB"ǝ؍-ѳJrf"ur3 eD&h' v'~MY=6 41{mmhpE*jmfGx 榤f_wuoL!|.v#lerA彛Q@?\!ҡ`,:֪P}_[цa $S~3sKDoIndQaHu.U_9yp~~c/^ Ȣ GvHN j'B F= f >>ڐ:7Mo8!ѢObEB2 8HQcnЎvWq+%џ]WZ"aI?jP$ ևj.[z˶uɰܶ o϶*X~yaĞ*8ɹVʞLr4:0c09''Axspl5q$M9DW }F极~PhT\jCl5d=iE)4 jj9pʪ c8?5 W$sb5Yj[P_'/lj6x>.㋰[--i9A$i Рq zHf鸇5[xhdd>e|?˷ ÄTUŢTAH?GH@Zi J^ĖFH@k4IDBS/+M&v̓o}\ _?_ynx)\-w-*a|;QT.6*e(>.F{΢0*&"5ZF-7Pz^ǹaĹ1.!MA2L֎t녲Kf&L|g1\dl)y6$!PmY F[Absb<5FK%{UɜjTFBE󼻯MY2 ︿;6e~ K KϑGw%k,l$ j[T\(ּ3bXlt{Ķʓ^< _Ѹ}k22oȱv8!nv8 FYB{Q AX'D==Sv\4w:81@ܟIWѵU1}ib9$h摮jFtvu*3n㴾1SZL?y@|M~ 0nfJc ?T޳'A>GG<"mr, BѻE똸 =^L މĭ (썱jbCBOo-يYZM_HGb`@\" *>Up嗫>C$ (G΃*5RL"æ?3{!l"7kMO'kz+uCV9 @\P~[pOhd }pGn+׷VIH5~05WZK_K]4CC3(F -U㌂bf `DgFr0H0&4:u2Sq+V<$f EQoS&\ +Lo=Xsٝc;4~Vr!?8Ik;ۅےlx0y_?&2JcIh56uz=޺9x?q>8`u"nx=qy6qO>))~Ɖ(׀zB<,bsȳCqxKʮnW^3yk{?orq;Сx5HܠAa54eqȂs/P\%X(4 g*!pUƳ4B?XX~W83zy]0:rv~`{QѩT> zq^˝dj-Q xFyhza|5c/r?"V}'믇z -HN&CtI;D{,= 4QMe6.hiĪ2B}''whH2hk++Z76=+>򅌦`J+P2>S@8zA|[ED+{JALHgd;G],./rJm$.?xZnd4iz+~g--cok[̘?.uwgZi,xNbn U+j̮ E}CZՅ;@ Fm1kca"@WG3kK55Ịٗ_.χq{Y{ a-xC?A蚷K[?{gח#ה@,~m;Eӑo9 Z:&ᩁpcW38fk" JCg=Yl7 %$"QԕttVj'b {}Нͦ7[nf vE:v q@‹߯c ,!p\fBN>aCyp =.BX 鲑C3NG丛ac\TO|ƴ .V4xi&cŢY0j-%7*maK[Bs ) d X0qqjMC_+ 'NC%WלzmzI03V_>R_9S|ĺ(e\WgNDBt@,~|~ghV0yt*x?`X#%tew$$Iљ mkD"y晅MCCχP}IXA >J~ϔX\TQxTAOsdSqs&r'C.=B8ͨ92"KV 8 +h9V-uZ f=|iEKGk=5?}壋./ž֩ʁ\#5EB:llqdKw=)G\JG$` _Kg>[aq&M2(dT0:vI.rܖ2hZwnE'$˴ F>&Ӣj| x8eU ~Q>Khl` #ZGESVPU_=;ԵW/<˰"vJ5VQUG90.9S~^Q|Fēfr^=Hd#m,hW.B9*ma} S\݅@[\ٹQ囻Q4]$e5q}r6dvUe*+ ac0KêYD]F;\h2cF"p Y-}rcp q̘\u_%̊Lq]fI'W+2&8Ž6.xttt'hca602fܧ11ZPusU4}Y b'9$![ҸZK3GR-1w›/4pL|]VfXhVc%gW[{.\׳ϣ; ??‹ 7.aݎ (Ӏ q8SuO#sPUUt:@~FH4u=zpNV`ܓpı9_+4i_ b1} C;c3z!ez}zIGq hH ^I'-3n[]q>q1H>UX [KjjT~~ߢ@mR٭I`brsI6ҥJ42 Oh\]}Y_ϥp;< ttANYK\ Ti/qyeN:/Uw_~b 1 FQ_ Pn;Y% _v~@<4HXx4z` )פ|`⡸N$R[з׷#FQ5'U\ʥ'bH%,QD, UhNB"H|68w /99Eh`I {$]'^#TCBr wS{+׿d{k;8㯛]sww\sD'Mg|CRyiЎ'o3o Ӽ UCZIL#:%d!g(E"ʌZhtE@/a-_Z7<[Jle)5E>Ƴ(u>۷S|ou jוg`KV'ye؄X ~&kg ^_a=1$i76{L KRҘDޜw# W=Dt7MYd3Bɪ~ x" ~tyOǧ3fFO 3Lh*$@mzQ3P lAj< @4R<|3jO'|ዚ/|/<_$n<$ u˻{zW_[b49kQn&+8XΊ}//^V|61\OcdZz { Aet*#`?o}NDaZ\庚D5\A:hZ<ڎ 40KpI11*?F ?F>͑(T'lG_xTpIrJ*>U۔_gS.}B?'+blCl,4$? #(ijP.b1߁ SDvFj|bc1FhE+Eְ!'l~? a/jLdRt~tstOFv81Mi?ARi2/TOkQy<<(h3HicJHɢ ۰-*s$׈fsq-΅(6u~f~Ղ0$P Upl_41e@sJ'/? MhQ+ܚ嗱R#Bz6d︇/KDlTVik>} |z#(,Y#5\kK KO1_c"[Ր԰I]ݕx+A~J%%34ovv{O2"%FC7m/./ <0`D2碰%l>W X+#LhI qfSsd !A ؏Ȫ*1dV#PM~`'53rVFW({׷wŐ/m˫w͹灹0 dosUmTYox"r:O=Prແw?p0qxGwh̀рikc + xzZ8'eCNHyyE rB a,]czF;+եnB.b}aڃٌ2*P1pȰ9F9aĹ753aȷ:Jkz&2CzmZH^"耷m7)OuO0u!tt(WU IS62:zT u4єˤ=ֈ|CQ[]kKj3iAس7x? fd}4mnše0gV::9j  RJ5|[mFؠR%S:-jUUn ݥ$$b7R/Ĭk:'3 p9:2(vزބCo{y!_NI.Ui6kfooSQ"sx-RBpƔr-˖0\|Zx1t +otk@4՜CHwq)S67)*aF#QtM"\oc1o ݌h$H> ~/3 Kgđ8 eY-/Vյޭ-فCܰ Ng>@j=3[gt͐u)o|uʱVMUXH)72mJz(JΫ"x[><'a >$ 녽jtibZmEBρc_E1 ڑtB¨X3FY|P3ks0~ ,3TmtAbubmʢ:ȋT@کb5dk lfyD<:;pXY-H,}.>W*CSm:^+9b֏i~ֶH&$dA(ԳKlHlsNPsaG)4}cC(VRA*pLcYYV:6(ggC#+S\ts㝼7k,M.ӨhTV6bfo}#j5ndž*yjx\ 8TuFx Fhx9 ඈN"W4@h5PޅVCC9"TUV~lEIQ|d$I^X_Y [v XB&Ia59`H dfc+#}\h45x%3;bۆ?;Խw_>^(2{o{Wlu};X32?6c_,u,+2fܕy8Hә&d^j ~&3"(1I3lBI~_&6%D8Vq>[c1&UЂB5F4J{T {E*˪ 5㩆TA85&%ؔh>ٴJGȢVꋝ*5`1.X]eZ7oYQA u\u?οco 9Eڒpi䍤[Z0!&`Q%-|R N>pv>z$ҽCR?ܿ^f\i;y ظzmc4>o=Dl{B1FP`C| v&/udsȱCʽA}V>\ڊdž;Tկ W*L\c҉#MӨ^#͸\VjC#,:Z{%vE+%GR?6>Y޴QWQ_@ 0)/y]5yI2NNع ?>}ng3}$OƱu :3(fxwb~&PXkדi۔{9a̸ݫK V#? u(4mr#sE'<Ϝ Y]w?shw(9u_m_@9ˮn 7xsX'Qas( "6_6QH2V\bN*EF4U':6JBA3fOF\y[Qrq+NtpdVժ3Vr6sҫz6%o28M=YrTv2qf] 7OWz}Qp,jU/\wd ֯*UMF_ņ!Gqe)b}b( ;n򅂬v (1igȰCU%m񭖙kyS~XmvZpmpIQ>2JdKK2Uڼ κn(<ڢ=a7\?l$s\)\iZEicʀe)EBI^&h2d!yaܜtɡ1DZ8F*#sgπXc"*KhIƌ\bF }'=RW׃"Y&W&{y':+4yQI!Ih َٹBrw8B8\9#SmBYsHX@:И%_S!w֢?buͱ1<\Pe6 G" TsQY>&4WE@qd+ L?Y>ɳ%tX)ӜpZ^IZWjc#s\9/Ep 8pתumΈէgъ_J㼜dN>y2G}(އA`7ەy EM.nuE]!(l٬N.GA-DqrЪ(B݈w-f9 /U|>8S ђqb<kԇ0k~3611 x[!K<O _j8.L4߄P4싇"6ߨPdto|(b Аnt}r1:H=nnu׵n 5a|iT"*̍7X_zʦmQ~Sdt%5T&f532A B@m>!V1}P>u* +\iɤE͒hu,TNzI^ܓX&*̍ ud5ǒ*V5zd?Q189 9|̓8mW۠Jq\qwC;ŻAFnS/1_0حî 8{~K6\ރQ4SkHK8A8ݼh׍6y^VBxwY?yGa]I!FFEٍLp!b^$ccD(0v|LjNhd$ը'nP^ [0dIYȪlTY7&)iWc 80^`q(1L:`5UZ8\Tjy=߱c阋żnG"Ɏ9}orcJźRúqIaj+Sfgr`qT߯P "-y>' I|{̟́̑2SlNQث (N&:w+ 92bbЫ9iVNs^?HD1RRvҒ4IE;ƪ @Üb%`v}@[WMUh-DTHL &Gr.-l:>һAfO[Mobj7=v$ >6/ 9`! j2_26Ć<1N8f? s~̿2Vy'h%ػ1XMHfi??2 Ϩ\;Wٯ:{S`.zV\kpykEi+r~.е a윞gLguIiщ ^[2['A4z:u4IO|"5: Cׁ\ Ã2 b,;--CuYK\CCpPj.{bnWʾ+ 3%;TC'B2U5T NS)#ZrG# <.ܱ-cgֵd 6VQAGI^c7n7m$E8jM˪5DVm _4.|v_;n[ěDQ.Z͔k+1V uAR Q9 0ux9ٚr+-8|jh+^l; X}\sO+xs3q=ц0_8P^A ݲDwuEWyiq16בz{;a:>[0 )G e+,ft&J-0jJԟ"M|{1CY0LLl<&`& rƜl@KʲשCo |NSP%_8 IP}i5XCV׭NWZVg^C!JE nQFMΤ;?B)WPguJu4>Xj6?neR'W:TH#S5'ً%|¯3PD,~R= C,[I7$)DDO¿_^atH#DA60 PZ\ ,YYb ߷XeCY^7P4iAәС g |oFYw%[7=؜}Vsrf>KY5!|w~D:)nSadfots<һxM"5I.ImoMݞ:cܗ>VmrOf-JA謈ٜxg3ȽQ܌XHY?V)TP #b?UbS,x_ћ~7E}AhO$,)^tΨ4R mAH$_3Mzð`$N> M-< @R RيU`& l~l7 6R "-3 kChV^1XiH:λO{,YH%? aɖ_϶d#812Ip8J3Ij"#`L@L&M-ɤ6@NoW6>ͷ}~mJ2@cIis9{e؅MSrt+ϫ*0VC@ ]xoM U㉕81//$SUA9iZEԓ$KV1{~dq_c!d?0=pQV9t](3D2s%vT%e5t(1W̺[ ć:,Oh?9it c4{&: \:.H` J?_S_T%8m0,Ѭv+X% 2mi]N_*w2_HFc3ΜX2|NjZaoʂAY Kk<':+47??!'9N -*t5$|˶kA-GJ{Lfƭw"hYSe;ߓS{ʂ-,s8r' C3S&iW@ -ޝ˒`TDŽHD_ߥ֖byXqV5n9TWZ^>nȶ⏩_",Qf;XK=v&S5tԛT5|'c:u*g`|OI&k⢜ukȱѣm#9~ǧMc2nUdҴX暬9gliט{'ٳ&•_4g 0!>$p͢e-ȺM}yM](ݨ{M@S# ҧz^K55o(ZL>9F>*\oE @AT꩟LO-hBYF-(@m9us"ޒI`mWօOETod m4y*Bf1anb@#&CvI C<t!@bv3shC(spzE: %tPM"6єRUєiJ` Op#_ ?M BΏ 4 yyOێA#H)^i\ǐI<1еxr_2U+SJSg=в<:bmȤ!ZD_O+AOaJZ[M EAp]뺢a>BTR"T@BL-  !MFQ(h?ٯhD}50*TJ>Zo*JY"D*Ddsp춧lo}:> l.{@vtF5EFښ swuGO8ѽm,쓄ѓRw &э . OE QK)+H Z-ocm}}G|m endstream endobj 31 0 obj 20118 endobj 32 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ -167 -414 967 969 ] /FontName /JRBLWS+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 30 0 R >> endobj 33 0 obj [ 250 333 722 722 722 722 778 722 333 333 722 722 250 722 250 278 500 500 500 500 500 500 500 500 500 500 278 278 722 564 722 444 921 722 667 667 722 611 722 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 722 722 722 722 722 500 722 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 722 722 722 541 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 1000 722 722 722 722 722 722 722 722 444 444 722 333 ] endobj 7 0 obj << /Type /Font /Subtype /TrueType /BaseFont /JRBLWS+Times-Roman /FontDescriptor 32 0 R /Widths 33 0 R /FirstChar 32 /LastChar 213 /Encoding /MacRomanEncoding >> endobj 34 0 obj << /Length 35 0 R /Length1 3308 /Filter /FlateDecode >> stream xՖXǿ{ 5bB 1Spư94GS+KC{EkZû̽]b`h2$}/MUhJJ|E*ք ׈"oxfe!%'mM)֩`c{OP!LF S0](WЮ`&ND/orI>A8(^%[$U:ХѥtZG0ÝlIyef7BQ|K7VjPY -E1"6g|(RRz MzSQ{1.+jSUJ_۱G4L1N<>ÎFI[6y؊D*3-1rW7ʴ6OF=y;e$fvAog+Y1^96Փ1܁}QR Ix$A-rKmBL|ˌ w/T96ظ/3:ћ9գz^jw{5Р|M$Gcg]6 7\h1κiq4s3s|2(Jʜ4wnԽ*jQ'k<3,CŋHebZOdѧQTNaX0v0xwGv 9$A_I;K=:L\>!+Fb)\nuzy7ꑑHڧ~n~6./vZyI)fz.7{_{y[eq"B>yk: (mI-Ia0dfMg׆V/yxl|#PE?rH;"aO~Hȋ{y_?9BwhX Wֳ#Oȷȿ'q? nKmcxQ{MliU^;<—iD eCErE>Ovϑϒ&WYڵw*[I $ҁ%rh6bAѬbK}n c%r%gtlkOK|YzH1B[S({(5IՌD=~k^ endstream endobj 35 0 obj 1793 endobj 36 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ -167 -299 1063 828 ] /FontName /FXPLRI+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 34 0 R >> endobj 37 0 obj [ 460 ] endobj 15 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FXPLRI+Symbol /FontDescriptor 36 0 R /Widths 37 0 R /FirstChar 165 /LastChar 165 /Encoding /MacRomanEncoding >> endobj 38 0 obj << /Length 39 0 R /Length1 5484 /Filter /FlateDecode >> stream xڍW \Tǹ^ \ٳTDQvQ@EkQF#MM4Yl*?Z7K/i~6Bb)l-j $(:Xp84x1݂8Ȅ&*?~P>8O$ jKPvxb`:~[^Cڏ e 'df74hӵӐJc^AP qi׮ATO7~>pk@%Vi4L" wCa+ ">8KѾJ-oT6JZ5 uXm |X3qV*|j;Y#tbgg+!+ȁ 0z#x^w0f*c~ ?߳=>HI25Ҭr&c o`+nm܇^fU=ĮV̑: Ov/~<ˁZ$̢|L^Yy èhǹM*q5Q')W YQT=žaϳTαؗs?_AQmOQ9?2F\dk8`8h8d8af7} nr+G0m`@@1wI`rRz{)ނ_c<]&aNYKq%|cJs1aY5Ie!ka+Si>`&'^O&Ml(!9"itIdh0kcqIc~S4˴cz< GGp׃fG`7/e3 "he*;cr e g5AkSv}tXEz3H+N UctSLK;~*>!Q7u@aaҮ 몪rUVT"5?R+HSYJ]W E]gC-Q1r(d0[VN5/O)X ׆[db|PGk/- vbR,_DaqV ~g\ 6(jjv -=*wKxgɞP !Z_2JbQeqKI0/^rgԓ9l2SVkUK`JdvMٝf0RPl>$[??T 85(gkTK_f.Z %ʿ)fEe?="; ki j65bE(^v{'RkwiZ:) /Ma5 E&"Bh1HwZ(U>ʡdMƍ'ٓrB).|z 8q΢ {|ltF=L3l40 3BYIm#2hNu vIw{\ 3͘6Yqzv~NdVަlTU$ZDfmUq(X|fp-5S\D{**I㉝$fDX$Q9$*E$1$g+UK"#ٮ$\I@?T;x BPwmMWe=:ZolQJ[mRrgY= ];Slp\e?Ja^uo,gB$ttO;렇L׈ΎCW wj7ǫVґd"k@LI-m(bCRa|(l_5+ѕlo=>zC&؁N endstream endobj 39 0 obj 3704 endobj 40 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -212 /Flags 32 /FontBBox [ -223 -211 1000 913 ] /FontName /NTLNLO+ArialMT /ItalicAngle 0 /StemV 0 /Leading 33 /MaxWidth 1015 /FontFile2 38 0 R >> endobj 41 0 obj [ 278 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /NTLNLO+ArialMT /FontDescriptor 40 0 R /Widths 41 0 R /FirstChar 32 /LastChar 32 /Encoding /MacRomanEncoding >> endobj 5 0 obj << /Type /Pages /Count 3 /Kids [ 4 0 R 13 0 R 18 0 R ] >> endobj 42 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 43 0 obj << /CreationDate (D:20040730105604-04'00') /Creator (Word) /ModDate (D:20040730105604-04'00') /Producer (Mac OS X 10.3.4 Quartz PDFContext) >> endobj 44 0 obj [ <54edc17ddd97af8013288a92efe1305a> <54edc17ddd97af8013288a92efe1305a> ] endobj xref 0 45 0000000000 65535 f 0000001762 00000 n 0000000022 00000 n 0000002825 00000 n 0000001782 00000 n 0000053192 00000 n 0000001888 00000 n 0000046476 00000 n 0000053021 00000 n 0000002806 00000 n 0000001998 00000 n 0000004810 00000 n 0000002861 00000 n 0000004831 00000 n 0000004940 00000 n 0000048788 00000 n 0000007053 00000 n 0000005064 00000 n 0000007074 00000 n 0000007183 00000 n 0000016269 00000 n 0000025112 00000 n 0000007333 00000 n 0000015676 00000 n 0000015697 00000 n 0000015909 00000 n 0000016445 00000 n 0000024475 00000 n 0000024496 00000 n 0000024716 00000 n 0000025284 00000 n 0000045493 00000 n 0000045515 00000 n 0000045727 00000 n 0000046652 00000 n 0000048535 00000 n 0000048556 00000 n 0000048764 00000 n 0000048961 00000 n 0000052755 00000 n 0000052776 00000 n 0000052997 00000 n 0000053265 00000 n 0000053315 00000 n 0000053474 00000 n trailer << /Size 45 /Root 42 0 R /Info 43 0 R /ID 44 0 R >> startxref 53564 %%EOF gtamsanalyzer.app-0.42/ReadMe.rtf0000644000175000017500000007564410102460417017232 0ustar brentbrent00000000000000{\rtf1\mac\ansicpg10000\uc1 \deff4\deflang1033\deflangfe1033{\upr{\fonttbl{\f0\fnil\fcharset256\fprq2{\*\panose 00020206030504050203}Times New Roman;}{\f2\fnil\fcharset256\fprq2{\*\panose 00020703090202050204}Courier New;} {\f3\fnil\fcharset2\fprq2{\*\panose 00020005000000000000}Symbol;}{\f4\fnil\fcharset256\fprq2{\*\panose 00020005000000000000}Times;}{\f14\fnil\fcharset2\fprq2{\*\panose 00050201020108040807}Wingdings;} {\f18\fnil\fcharset256\fprq2{\*\panose 00020005000000000000}Monaco;}}{\*\ud{\fonttbl{\f0\fnil\fcharset256\fprq2{\*\panose 00020206030504050203}Times New Roman;}{\f2\fnil\fcharset256\fprq2{\*\panose 00020703090202050204}Courier New;} {\f3\fnil\fcharset2\fprq2{\*\panose 00020005000000000000}Symbol;}{\f4\fnil\fcharset256\fprq2{\*\panose 00020005000000000000}Times;}{\f14\fnil\fcharset2\fprq2{\*\panose 00050201020108040807}Wingdings;} {\f18\fnil\fcharset256\fprq2{\*\panose 00020005000000000000}Monaco;}}}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; \red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{ \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f4\lang1033\cgrid \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}{\*\cs15 \additive \ul\cf2 \sbasedon10 Hyperlink;}{ \s16\li1440\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1440\itap0 \f4\lang1033\cgrid \sbasedon0 \snext16 Body Text 2;}}{\*\listtable{\list\listtemplateid-2118736586{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 \levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \levelspace360\levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 \levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \levelspace360\levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 \levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \levelspace360\levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid97265010}{\list\listtemplateid-1945595618{\listlevel\levelnfc23 \levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li720\jclisttab\tx720 } {\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel \levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel \levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li2880 \jclisttab\tx2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li4320\jclisttab\tx4320 } {\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li5040 \jclisttab\tx5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li6480\jclisttab\tx6480 } {\listname ;}\listid330573444}{\list\listtemplateid-1486749646{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\chbrdr \brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-180\li2160\jclisttab\tx2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-180\li4320\jclisttab\tx4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-180\li6480\jclisttab\tx6480 }{\listname ;}\listid803349072}{\list\listtemplateid-1486749646{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext \'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360 \levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1 \levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-180\li2160\jclisttab\tx2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 \levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext \'02\'04.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext \'02\'05.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-180\li4320\jclisttab\tx4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext \'02\'06.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext \'02\'07.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext \'02\'08.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-180\li6480\jclisttab\tx6480 }{\listname ;}\listid1449663483}{\list\listtemplateid617645280{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 \levelstartat0\levelspace0\levelindent0{\leveltext\'01-;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 \levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 \levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 \levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 \levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 \levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 \levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid1630823891}{\list\listtemplateid-1323557306{\listlevel\levelnfc23\levelnfcn23 \leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23 \levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\levelnfcn23 \leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 \leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23 \levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\levelnfcn23 \leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 \leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 _;}{\levelnumbers;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \loch\af3\dbch\af0\hich\f3 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23 \levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\levelnfcn23 \leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 _;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid1677534909}} {\*\listoverridetable{\listoverride\listid803349072\listoverridecount0\ls1}{\listoverride\listid1677534909\listoverridecount0\ls2}{\listoverride\listid1449663483\listoverridecount0\ls3}{\listoverride\listid330573444\listoverridecount0\ls4} {\listoverride\listid97265010\listoverridecount0\ls5}{\listoverride\listid1630823891\listoverridecount0\ls6}}{\info{\title GTAMSAnalyzer Q&A}{\author Matthew Weinstein}{\operator Matthew Weinstein}{\creatim\yr2004\mo6\dy12\hr16\min55} {\revtim\yr2004\mo7\dy30\hr10\min54}{\version41}{\edmins82}{\nofpages3}{\nofwords945}{\nofchars5388}{\*\company KSU}{\nofcharsws6616}{\vern16521}}\margl1440\margr1440 \ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow0\dgvshow0 \jexpand\viewkind1\viewscale106\viewzk2\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule \fet0\sectd \linex0\sectdefaultcl {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}} {\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}} {\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9 \pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \qc\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f4\lang1033\cgrid {GTAMSAnalyzer Q&A \par \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 1.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {What is GTAMSAnalyzer (GTA)? \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par GTAMSAnalyzer stands for GNUstep TAMS Analyzer. It is a \ldblquote port\rdblquote (v ersion) of the Macintosh OS X program TAMS Analyzer for the GNUstep environment. TAMS Analyzer is a qualitative research/discourse analysis program for Macintosh OSX (and soon GNUstep) environments. TAMS stands for Text Analysis Markup System \par \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 2.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {What is the current version of GTAMSAnalyzer? \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par This is version .42. This version contains all of the text manipulation features of TAMS Analyzer, including support for coding, analysis and reanalysis, however, it lacks support for transcription. \par \par \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 3.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {What is qualitative research? What is qualitative research software? \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par Qualitative research involves, at least in part, the analysis of the meanings of texts, situations, institutions, and cultures. It is a body of research carried out in a wide variety of fields including sociology, anthropology, educatio n, medicine, and media studies (among others). Qualitative research software helps the qualitative research process by managing the tracking of themes (indicated by codes) in the material typically used to answer these questions regarding meaning (intervi ews, field notes, documents). \par \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 4.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {What is TAMS? \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par TAMS is a system of marking and analyzing patterns of themes within textual documents. It is similar (and totally dissimilar) to XML. Elsewhere in the documentation I discuss why XML is not appropriate for this kind of work (others are free to disagree). \par \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 5.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {Why not XML? \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par XML has the following rule: tags cannot overlap they must be nested. That does not describe qualitative data in situ. You can, however, save results of analysis as an xml file. \par \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 6.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {What do I need to run GTAMSAnalyzer? \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par You need to have a version of GNUstep core code produced after July 5, 2004. If a new release has not come out after that date, install GNUstep from CVS code. There are important bug fixes made after this date. See: }{\field{\*\fldinst { HYPERLINK "http://savannah.gnu.org/cvs/?group_id=99" }{{\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b02000000170000002900000068007400740070003a002f002f0073006100760061006e006e00610068002e0067006e0075002e006f00720067002f006300760073002f003f00670072006f00750070005f00690064003d00390039000000e0c9ea79f9bace118c8200aa004ba90b 5200000068007400740070003a002f002f0073006100760061006e006e00610068002e0067006e0075002e006f00720067002f006300760073002f003f00670072006f00750070005f00690064003d00390039000000000000}}}{\fldrslt {\cs15\ul\cf2 http://savannah.gnu.org/cvs/?group_id=99}}}{ for instructions on getting the CVS code. GNUstep has its own dependencies such as libxml2, libxslt, libpng, etc. You should also have gv (ghostview) and graphviz software installed to fully take advantage of TAMS Analyzer. \par \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 7.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {How do I build GTAMSAnalyzer? \par }\pard \li360\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 { \par Change to the Source directory and type \ldblquote make\rdblquote . After 1000\rquote s of warnings, the program should actually link. Then type \ldblquote make install.\rdblquote To run the program type \ldblquote openapp GTAMSAnalyzer.app\rdblquote \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 8.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {What is included in this package? \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin720\itap0 {Documentation for TAMS Analyzer \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}Source code for GTA \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}Binary GTAMS Analyzer application created on a i586 machine. This still requires a RECENT build of GNUstep. \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 9.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {What is the difference between GTAMSAnalyzer and TAMSAnalyzer \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par GTA is missing the multimedia functionality of TA. \par GTA at this point GTA has implemented ALL of the text handling procedures of TAMS Analyzer including those for coding, analysis, and reanalysis. It does not have any support for sound or video files. Also, because of differences betw een Cocoa and GNUstep, cocoa does not support save to text, xml, or other formats. Use the Export data dialogue to achieve text/xml/or other formatting exports of results to programs for further analysis (Ooo, Gnumeric, etc.). Note that GTA is also wildly unstable next to TA (partially due to feedback from installed base partly due to the more incipient nature of GNUstep compared to Cocoa). \par \par Several operating differences to note: \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0 { When GTA opens it does not provide a new project window. You have to pick New project from the Document menu item. \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}The buttons over the file list menu in TA have been replaced with a pull down menu in GTA. \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}Graphviz needs to have preferences set to be operational (the location of \ldblquote dot\rdblquote and \ldblquote gv\rdblquote commands). \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}Various menu options with complex panels (dot graph, autosets) have very different layouts. Better layouts under GNUstep IMHO. \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}At this point you can\rquote t configure the toolbar; I\rquote ve tried to provide a rich working set of icons however. \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par What GTA is missing (a partial list): \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 { Color codes (that work). You can set the base color for tags and metatags but if you try (at least in the cur rent version of GNUstep) to set the color of an individual code you will see that you cannot actually select the color (though the picker will be there). Actually, they have a passable fix for this, which hopefully will be in CVS soon. Otherwise see 14. below. \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}Rulers \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}Support for multimedia \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}Portability to TA (See below) \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 10.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {Are files portable between GTAMSAnalyzer and TAMSAnalyzer? \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par Data files are completely portable to TA. Codes and definitions can also be exported to the other pl atform by using the export codes and definitions function. Projects themselves are potentially portable (not fully tested) if saved as xml projects (xtprj extension), same with results (xrslt). GNUstep\rquote s version of NSArchiver is steadily improving. At some point the two should be able to exchange all files without problem, You may need to use a bleeding edge version of GNUstep from CVS to have this functionality though. My tests indicate that Cocoa projects can be opened on GNUstep but not vice versa. \par \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 11.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {What is the next phase \par }\pard \li360\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 { \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0 {Multimedia (next summer maybe) \par }\pard \li360\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 { \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 12.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {What is GTA\rquote s license? \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par GPL. However, parts of TA including the search box, the regular expression engine, and the interface to the regular expression engine carry their own licenses (Text search box and code is APSL (?), AGREGEX and PCRE I believe are BSD license). \par \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 13.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 { How do I contact you? \par }\pard \li360\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 {Matthew Weinstein: }{\field{\*\fldinst { HYPERLINK "mailto:mweinste@kent.edu" }{{\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b0200000017000000120000006d007700650069006e0073007400650040006b0065006e0074002e006500640075000000e0c9ea79f9bace118c8200aa004ba90b320000006d00610069006c0074006f003a006d007700650069006e0073007400650040006b0065006e0074002e00 6500640075000000000000000000000000}}}{\fldrslt {\cs15\ul\cf2 mweinste@kent.edu}}}{ \par \par }{\field{\*\fldinst { HYPERLINK "http://educ.kent.edu/~mweinste/tams/" }{{\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b02000000170000002500000068007400740070003a002f002f0065006400750063002e006b0065006e0074002e006500640075002f007e006d007700650069006e007300740065002f00740061006d0073002f000000e0c9ea79f9bace118c8200aa004ba90b4a00000068007400 740070003a002f002f0065006400750063002e006b0065006e0074002e006500640075002f007e006d007700650069006e007300740065002f00740061006d0073002f000000000000000000000000}}}{\fldrslt {\cs15\ul\cf2 http://educ.kent.edu/~mweinste/tams/}}}{ \par }\pard \widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 { \par {\listtext\pard\plain\hich\af4\dbch\af0\loch\f4 14.\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {Is there anything else I should know? }{\b YES!!! This is important reading:}{ \par }\pard \li360\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 { \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}}\pard \fi-360\li1440\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls1\ilvl1\adjustright\rin0\lin1440\itap0 {This is highly unstable\u8230\'c9 It will crash. It wont behave consistently. It probably wont do what you want. Act accordingly. \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}NSTableViews don\rquote t change their headers so you wont know the name of the current code sets, file sets, etc. \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}Color pickers don\rquote t seem to come in front of dialogue. You can set your basic tag colors in the program preferences, but until this is resolved you wont be able to set the color of individual code families. A kludge for this (which may already be in the CVS version) is to add the following method to the @implementation section of the NSColorPanel.m file (for the NSColorPanel class): \par }\pard \li360\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 { \par }\pard \li2160\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 {\f18 -(BOOL) worksWhenModal\{ return YES;\} \par }\pard \li360\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 { \par }\pard\plain \s16\li1440\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1440\itap0 \f4\lang1033\cgrid {Adding this line will allow you to drag colors to the color well, and with a lot of extra clicking select colors from the color wheel as well. Note: at least on my set up I can\rquote t close the color panel til I close the calling dialogue. Doesn\rquote t crash, does pick the colors, but it\rquote s weird. \par {\listtext\pard\plain\f3 \loch\af3\dbch\af0\hich\f3 \u-3913\'b7\tab}}\pard\plain \fi-360\li1440\widctlpar\jclisttab\tx1440\aspalpha\aspnum\faauto\ls1\ilvl1\adjustright\rin0\lin1440\itap0 \f4\lang1033\cgrid { Quit seems to bail without asking if you want to save your work: BEWARE! I\rquote ve put in a warning in this version but you still have to save (and ideally close) your documents/projects/results yourself individually. \par }}gtamsanalyzer.app-0.42/ReadMe.txt0000644000175000017500000001520710102460534017243 0ustar brentbrent00000000000000GTAMSAnalyzer Q&A 1. What is GTAMSAnalyzer (GTA)? GTAMSAnalyzer stands for GNUstep TAMS Analyzer. It is a "port" (version) of the Macintosh OS X program TAMS Analyzer for the GNUstep environment. TAMS Analyzer is a qualitative research/discourse analysis program for Macintosh OSX (and soon GNUstep) environments. TAMS stands for Text Analysis Markup System 2. What is the current version of GTAMSAnalyzer? This is version .42. This version contains all of the text manipulation features of TAMS Analyzer, including support for coding, analysis and reanalysis, however, it lacks support for transcription. 3. What is qualitative research? What is qualitative research software? Qualitative research involves, at least in part, the analysis of the meanings of texts, situations, institutions, and cultures. It is a body of research carried out in a wide variety of fields including sociology, anthropology, education, medicine, and media studies (among others). Qualitative research software helps the qualitative research process by managing the tracking of themes (indicated by codes) in the material typically used to answer these questions regarding meaning (interviews, field notes, documents). 4. What is TAMS? TAMS is a system of marking and analyzing patterns of themes within textual documents. It is similar (and totally dissimilar) to XML. Elsewhere in the documentation I discuss why XML is not appropriate for this kind of work (others are free to disagree). 5. Why not XML? XML has the following rule: tags cannot overlap they must be nested. That does not describe qualitative data in situ. You can, however, save results of analysis as an xml file. 6. What do I need to run GTAMSAnalyzer? You need to have a version of GNUstep core code produced after July 5, 2004. If a new release has not come out after that date, install GNUstep from CVS code. There are important bug fixes made after this date. See: http://savannah.gnu.org/cvs/?group_id=99 for instructions on getting the CVS code. GNUstep has its own dependencies such as libxml2, libxslt, libpng, etc. You should also have gv (ghostview) and graphviz software installed to fully take advantage of TAMS Analyzer. 7. How do I build GTAMSAnalyzer? Change to the Source directory and type "make". After 1000's of warnings, the program should actually link. Then type "make install." To run the program type "openapp GTAMSAnalyzer.app" 8. What is included in this package? * Documentation for TAMS Analyzer * Source code for GTA * Binary GTAMS Analyzer application created on a i586 machine. This still requires a RECENT build of GNUstep. 9. What is the difference between GTAMSAnalyzer and TAMSAnalyzer GTA is missing the multimedia functionality of TA. GTA at this point GTA has implemented ALL of the text handling procedures of TAMS Analyzer including those for coding, analysis, and reanalysis. It does not have any support for sound or video files. Also, because of differences between Cocoa and GNUstep, cocoa does not support save to text, xml, or other formats. Use the Export data dialogue to achieve text/xml/or other formatting exports of results to programs for further analysis (Ooo, Gnumeric, etc.). Note that GTA is also wildly unstable next to TA (partially due to feedback from installed base partly due to the more incipient nature of GNUstep compared to Cocoa). Several operating differences to note: * When GTA opens it does not provide a new project window. You have to pick New project from the Document menu item. * The buttons over the file list menu in TA have been replaced with a pull down menu in GTA. * Graphviz needs to have preferences set to be operational (the location of "dot" and "gv" commands). * Various menu options with complex panels (dot graph, autosets) have very different layouts. Better layouts under GNUstep IMHO. * At this point you can't configure the toolbar; I've tried to provide a rich working set of icons however. What GTA is missing (a partial list): * Color codes (that work). You can set the base color for tags and metatags but if you try (at least in the current version of GNUstep) to set the color of an individual code you will see that you cannot actually select the color (though the picker will be there). Actually, they have a passable fix for this, which hopefully will be in CVS soon. Otherwise see 14. below. * Rulers * Support for multimedia * Portability to TA (See below) 10. Are files portable between GTAMSAnalyzer and TAMSAnalyzer? Data files are completely portable to TA. Codes and definitions can also be exported to the other platform by using the export codes and definitions function. Projects themselves are potentially portable (not fully tested) if saved as xml projects (xtprj extension), same with results (xrslt). GNUstep's version of NSArchiver is steadily improving. At some point the two should be able to exchange all files without problem, You may need to use a bleeding edge version of GNUstep from CVS to have this functionality though. My tests indicate that Cocoa projects can be opened on GNUstep but not vice versa. 11. What is the next phase * Multimedia (next summer maybe) 12. What is GTA's license? GPL. However, parts of TA including the search box, the regular expression engine, and the interface to the regular expression engine carry their own licenses (Text search box and code is APSL (?), AGREGEX and PCRE I believe are BSD license). 13. How do I contact you? Matthew Weinstein: mweinste@kent.edu http://educ.kent.edu/~mweinste/tams/ 14. Is there anything else I should know? YES!!! This is important reading: * This is highly unstable... It will crash. It wont behave consistently. It probably wont do what you want. Act accordingly. * NSTableViews don't change their headers so you wont know the name of the current code sets, file sets, etc. * Color pickers don't seem to come in front of dialogue. You can set your basic tag colors in the program preferences, but until this is resolved you wont be able to set the color of individual code families. A kludge for this (which may already be in the CVS version) is to add the following method to the @implementation section of the NSColorPanel.m file (for the NSColorPanel class): -(BOOL) worksWhenModal{ return YES;} Adding this line will allow you to drag colors to the color well, and with a lot of extra clicking select colors from the color wheel as well. Note: at least on my set up I can't close the color panel til I close the calling dialogue. Doesn't crash, does pick the colors, but it's weird. * Quit seems to bail without asking if you want to save your work: BEWARE! I've put in a warning in this version but you still have to save (and ideally close) your documents/projects/results yourself individually. gtamsanalyzer.app-0.42/ReleaseNotes.html0000644000175000017500000000744310102461153020625 0ustar brentbrent00000000000000 GTAMS Analyzer

GTAMS Analyzer

Qualitative Research Software for the Free World


GTAMS Analyzer is a complete coding and analysis package. It is a "port" of TAMS Analyzer for Macintosh OS X. Note, at some point the two projects will have identical file formats, at which point  the initial G (for GNUstep) will be dropped. GTAMS stands for GNUstep Text Analysis Markup System, it is a convention for identifying themes in text. The software offers a wide range of tools for applying themes to texts and identifying patterns of themes within and between texts.

Version .42 features:

  1. Currently implemented (at least partially) features
    • Creation of projects, data documents, and results files
    • Creation of new codes
    • Applying existing codes by double clicking
    • Move from code to code through document
    • Delete code pairs
    • Move to paired code
    • Enter codes through the new button or through the code browser
    • Modify, delete, and add codes through code browser window
    • Select hot code lists
    • Execute simple, non-simple, string, section, and regex searches
    • Search (select) within searches using multiple criteria.
    • Export search results to text (multiple options on the specific formatting).
    • Code sets
    • File sets
    • Recoding from results
    • Add coding from results
    • Delete coding from results
    • Add comments from results
    • Preferences
    • Set date format and code level for sorting
    • Split view on document window
    • Correct resizing on project window
    • Saved search lists
    • Saved search criteria
    • Code counts
    • Co-coding frequency
    • Data summaries
    • Named result sets
    • Auto result sets
    • Graphviz report for projects (not for results): preference options for setting location of dot and gv
  2. Unimplemented features
    • IRR calculation
    • Graphviz integration in results files
  3. Features requiring work on the part of GNUstep and other open source developers
    • Multimedia support
    • Portability/transparency between OSX and GNUstep (much improved! Thanks, gang. OSX can't read GNUstep files however)

You must have a version of the GNUstep code newer than July 5, 2004. Update from CVS. See the Savannah site below.

Visit the TAMS website at sourceforge.net: http://tamsys.sourceforge.net/


Important links:

For older versions click here.


Contact me at mweinste AT kent DOT edu

gtamsanalyzer.app-0.42/Source/0000755000175000017500000000000010162465511016606 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/.DS_Store0000644000175000017500000006000410102204177020262 0ustar brentbrent00000000000000Bud1PP  0 ormousenormous icon2b.tifIlocblob MWSummaryReport.gormIlocblob_ sortCode.tifIlocblobMWTAMSStringCate  @ @ @ @AsortCodeWithin.tifIlocblob_stringCategories.hIlocblobstringCategories.mIlocblobstudy.cIlocblob_ summary.pngIlocblobsummaryWatcher.hIlocblobsummaryWatcher.mIlocblob_ ta-rslt.tiffIlocblob TA2_prefix.hIlocblobtableBrowser.hIlocblob_atableBrowser.mIlocblobatag2.tifIlocblobatag3.tifIlocblob_tag4.tifIlocblobtags.tifIlocblobtams app small.tifIlocblob_ 9tams app tiny.tifIlocblob 9tams result icon large.tifIlocblob 9tams result icon large.xcfIlocblob_ tams result icon small.tifIlocblob tams result icon small.xcfIlocblob tams.hIlocblob_!tamsanalysis-1.tiffIlocblob!tamsanalysis-2.tiffIlocblob!tamsanalysis-3.tifIlocblob_!}tamsanalysis-3.tiffIlocblob!}tamsanalysis-4.tifIlocblob!}tamsanalysis-proj.tiffIlocblob_!TAMSCharEngine.hIlocblob!TAMSCharEngine.mIlocblob! tamsutils.hIlocblob_"U tamsutils.mIlocblob"UtaSmallestProj.tiffIlocblob"UtaSmallProj.tiffIlocblob_"template.plistIlocblob" testdat.rtfIlocblob"testdatproj.xtprjIlocblob_#- testLarge.xcfIlocblob#- testProject.hIlocblob#- testProject.mIlocblob_# testres.xtrsIlocblob# TextFinder.hIlocblob# TextFinder.mIlocblob_$TextFinderSemi.mIlocblob$toolBarDelagate.hIlocblob$toolBarDelagate.mIlocblob_$qtproj large icon.tifIlocblob$qtproj small icon.tifIlocblob$qtproj tiny icon.tifIlocblob_$tproj2 icon.tifIlocblob$twoTagBasic.tifIlocblob$twoTagBasicNot.tifIlocblob_%Itxt2Button.tifIlocblob%I unmarkRec.tifIlocblob%IunmarkRec2.tifIlocblob_%utils.hIlocblob%utils.mIlocblob% varRegistry.hIlocblob_&! varRegistry.mIlocblob&! wbicn.tifIlocblob&! workbench.pngIlocblob_&xrefTableColumn.hIlocblob&xrefTableColumn.mIlocblob&xrefTableInfo.hIlocblob_&xrefTableInfo.mIlocblob&F _myResults.hIlocblob_) addCode.tifIlocblob)addcomment.tifIlocblob)addmarkedcomment.tifIlocblob_ addRoot.tifIlocblob addRoot3.tifIlocblob addRoot4.tifIlocblob_ addRoot6.tifIlocblob addRoot7.tifIlocblob AGRegex.hIlocblob_m AGRegex.mIlocblobmAppController.hIlocblobmAppController.mIlocblob_ appDelegate.hIlocblob appDelegate.mIlocblob autoset.pngIlocblob_E autoSet.tifIlocblobEbackground.tifIlocblobE basicTag.tifIlocblob_ basicTag2.tifIlocblobbookmarkInfo.hIlocblobbookmarkInfo.mIlocblob_ chartables.cIlocblobcodeBrowser.gormIlocblob codeBrowser.hIlocblob_ codeBrowser.mIlocblobcodeBrowser.tifIlocblob codeicn.tifIlocblob_ codeLevel.tifIlocblobcodeListSearchWatcher.hIlocblobcodeListSearchWatcher.mIlocblob_acodeListWatcher.hIlocblobacodeListWatcher.mIlocbloba coderec.hIlocblob_ coderec.mIlocblobcodeset2sel.tifIlocblobcollapseDown.tifIlocblob_9collapseUp.tifIlocblob9 colorTags.tifIlocblob9 column.tifIlocblob_ comment.tifIlocblobconfig.hIlocblob ctLimitCrit.hIlocblob_ ctLimitCrit.mIlocblob ctLimitFunc.hIlocblob ctLimitFunc.mIlocblob_} ctQChar.hIlocblob} ctQChar.mIlocblob} ctReadChar.hIlocblob_ ctTagInfo.hIlocblob ctTagInfo.mIlocblobctUnlimitedRuns.hIlocblob_UctUnlimitedRuns.mIlocblobU dataSumm2.tifIlocblobUdataSummary.tifIlocblob_decolorTags.tifIlocblobdef.tifIlocblobdefFromSel.tifIlocblob_- delRoot.tifIlocblob- delRoot2.tifIlocblob- delRoot3.tifIlocblob_ dftables.cIlocblob docback.tifIlocblob docDelegate.hIlocblob_  docDelegate.mIlocblob docTemplate.tifIlocblob  document.pngIlocblob_ q DocumentationIlocblob qdotGraphWatcher.hIlocblob qdotGraphWatcher.mIlocblob_ Benormous icon2b.xcfIlocblob enormous proj icon2d.tifIlocblob_ Ienormous result icon2b.tifIlocblob Ienormous result icon2b.xcfIlocblob Ienormous result icon2c.tifIlocblob_ enormous result icon2d .xcfIlocblob enormous result icon2e .tifIlocblob export.tifIlocblob_ !FileIcon_rtf.tiffIlocblob !FileIcon_txt.tiffIlocblob ! fileListMgr.hIlocblob_ fileListMgr.mIlocblob FindPanel.gormIlocblob FindPanel.stringsIlocblob_ findRecord.tifIlocblob FreqCount.gormIlocblob get.cIlocblob_ eglobalCodeMgr.hIlocblob eglobalCodeMgr.mIlocblob e GNUmakefileIlocblob_ GNUmakefileXMLIlocblob GNUStepPatches.mIlocblob gogormIlocblob_ =GTAMSAnalyzer.gormIlocblob GTAMSAnalyzerInfo.plistIlocblob info.plistIlocblob internal.hIlocblob kappa.gormIlocblob_ largeApp.tifIlocblobmain.mIlocblob maketables.cIlocblob_ markRec.tifIlocblob metaicn.tifIlocblobMGWColorPanel.hIlocblob_YMGWColorPanel.mIlocblobYMGWMyDocumentToolbar.hIlocblobYMGWMyDocumentToolbar.mIlocblob_MGWPopUpButton.hIlocblobMGWPopUpButton.mIlocblob MGWScanner.hIlocblob_1 MGWScanner.mIlocblob1MListIlocblob1MWDoubleDictionary.hIlocblob_MWDoubleDictionary.mIlocblobMWExportWatcher.hIlocblobMWExportWatcher.mIlocblob_ MWFakeDoc.hIlocblob MWFakeDoc.mIlocblob MWFakeFile.hIlocblob_u MWFakeFile.mIlocblobuMWFile.hIlocblobuMWFile.mIlocblob_ MWKappa.hIlocblob MWKappa.mIlocblobMWKeyedProject.hIlocblob_MMWKeyedProject.mIlocblobMMWKeyedResult.hIlocblobMMWKeyedResult.mIlocblob_MWPath.hIlocblobMWPath.mIlocblob MWRange.hIlocblob_% MWRange.mIlocblob%MWResultToolbarDelegate.hIlocblob%MWResultToolbarDelegate.mIlocblob_MWSortStackItem.hIlocblobMWSortStackItem.mIlocblobDMWSummaryReport.hIlocblobMWSummaryReport.mIlocblobMWTAMSStringCategories.hIlocblob_iMWTAMSStringCategories.mIlocblobi MyDocument.hIlocblobi MyDocument.mIlocblob_MyDocumentSimple.hIlocblobMyPanedDocument.gormIlocblobmyPanedResults.gormIlocblob_A myProject.bkIlocblobAmyProject.gormIlocblobA myProject.hIlocblob_ myProject.mIlocblobmyProject_h.bkIlocblob myResult.gormIlocblob_ myResults.hIlocblob myResults.mIlocblobmyResultsOld.mIlocblob_ newline.cIlocblob_ newline.hIlocblob nextTag.tifIlocblob NoXML.tar.gzIlocblob_]NSMutableNumber.hIlocblob]NSMutableNumber.mIlocblob]NSRecordData.hIlocblob_NSRecordData.mIlocblobobjIlocblobpcre.cIlocblob_5pcre.hIlocblob5 pcredemo.cIlocblob5 pcregrep.cIlocblob_ pcreposix.cIlocblob pcreposix.hIlocblob pcretest.cIlocblob_ playMedia.tifIlocblob prefBoss.hIlocblob prefBoss.mIlocblob_ypreference.gormIlocbloby prevTag.tifIlocbloby prevTag3.tifIlocblob_ printint.cIlocblob reCode.tifIlocblob reCode2.tifIlocblob_Q reColor.tifIlocblobQ refresh.tifIlocblobQ RegexTest.mIlocblob_removeFrom.tifIlocblobresult tiny icon.tifIlocblob result.pngIlocblob_)Save.tifIlocblob)searchListMgr.hIlocblob)searchListMgr.mIlocblob_sel2codeset.tifIlocblobselCodeSet.tifIlocblobselCodeSet2.tifIlocblob_ selectAll.tifIlocblobselectAll2.tifIlocblobselectAll3.tifIlocblob_mselectReverse.tifIlocblobmselectSome.tifIlocblobmselOtherTag.tifIlocblob_setMacroWatcher.hIlocblobsetMacroWatcher.mIlocblob smartSort.tifIlocblob_E sort09.tifIlocblobEsort09Within.tifIlocblobE sortAZ.tifIlocblob_sortAZWithin.tifIlocblobortStackItem.hIlocblobMWSortStackItem.mIlocblobP E  0 @ DSDB `X` @ @ NoXML.tar.gzIlocblob_]NSMutableNumber.hIlocblob]NSMutableNumber.mIlocblob]NSRecordData.hIlocblob_NSRecordData.mIlocblobobjIlocblobpcre.cIlocblob_5pcre.hIlocblob5 pcredemo.cIlocblob5 pcregrep.cIlocblob_ pcreposix.cIlocblob pcreposix.hIlocblob pcretest.cIlocblob_ playMedia.tifIlocblob pgtamsanalyzer.app-0.42/Source/.thumbnails/0000755000175000017500000000000011062075653021036 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/.thumbnails/enormous icon2b.tif.png0000644000175000017500000001231611062075653025334 0ustar brentbrent00000000000000PNG  IHDR``w8QtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/enormous icon2b.tif.pngO4tEXtSoftwareEel ThumbnailmIDATxyeW]?soug$81 FR ID*QR*BpaAb$$dLfz{_/o9=ttA޷{s9 0 0 0 0 0 0 0 0:x>7CwlF` p])`f?/lދEӦj_F7! 4 vB4: ٌ!N? \LOsK7G8Qt+1;pth3:kEiJt3 7 o6H6>Tb.NU`PB*? 4`uF7E_Kl,t&>mfyOwc?:pJ8%H1"Q| .5N>m}} oatDGkhѩ>5ϲzJTZnnU֫G7~ mG`ڽ^y x+ d~-P*{}ڎ_rI;[Z倻&h-/ .C?UuTwQMgfQOmBgB1_)^ie~ 8`MWCOA^X@ZvJ}kZtAл>*tmA{ߺ2:v==HYJHTFMNwq?)GѪC '+zup:Rkaܣ<jɉQkc3sh}&5ۣ]?kX &vAɼ=c/>J-5BPZBp&G}FLG=o]]fp*> MV}6D,E<5f_ay^ v1dOmh=n]zjA]͜|NIEM񱠻#uq>@U7@#h4O.̱XHO71}VvGyT %,-](KxT߂Ny2O5"7<Ѩh1ot|݁f'Qhrt®Jyt@ٌ i- mP87D*%tŦ,nECng@(N񲸾&U"@2ȒG,mʱPA$@!|m8lLpv%;rSv4k5]6^],뺯՛+C;_]xI6m 3;ޥ 1ȲiԽdIGz .k9[xL@[pSrӠDЊgqvbUFC'w\pmhl cCDdĞ)x{Kɒ:ibalXdYLҜ8EsiV}j>yO7N 3ގx>Jgmb Jf;^q _uN^5YN vDCb!o ֖DLDgDxW߽}vΥiէ}q } cCD=e1I&)\8sTw>Di,1]rgǦQIt2DѽoWx]x"&a~40jC j_iRE{OL{hH̎I)>ei GsRn#lLmkk㲄$C{ KcjDH%/N>~'3O_v[SnCevWE7_Ewe(ai4B a bBTiD])ex)! KnM1~Ÿs1xtBsmsҘ?RI1A4 +ؠ Q0FxƋR$ձL'o|da#TwbB{?_wߴ.ɒ:.{1&HDjJ.5VĴ/]/;KpiSҴNZ i$i7HZsI%\|KH6 -IEf9+iFqS HMB1,mHܜ#i҆x-xAe"bTM(xGҪ7Ļ4מHOD&/z\p/097N>^67Ÿ`l|{o "Kdi,m] LVs/*um^#,!K9h5f3č)qs5 /"1IiI4^ n7gYj$,m\1Qi,7EeKH[ I`m1IR&]ӜC<,7F/[v_ظ>WuQea[e1Yĥ \e1\m˹0Nar,m愚S7fI\~ei .CDTl۱jIҚ'iHEkiR ˣU*,Yg Ɔ]Mt,&>#*Qn{D"m8ײ0=؁n?jG_~Y K%KdiXLP"͏sG?OH[ ͚$y ދ!616([mkܨà` 6ŹTo#j@؜",@*(4ŻAXkK`c8Ql!& duVJ4=m ͥčS>j~O2#},t0kߖ4X;mztҡ!l8Ť"YxZdIgQ ʈ xQ?aL(JSwtAMA8,Qy2NXV 'ZB8M.11j5S;+m-\v+:G%gxPoz;O>Y2'WEaZQ }%bv\m۾kyT2m+ׁ2M|A$PLKG; չP^ E1Gc~'EҪu7K~C,._ hlЎ=QysF_n2[pjN";yFDī3q\r=1Ocw̑$͹=[-:3]>QF?="1"켜ylw ƄyInqutH|kicwИ?a#čS+܃oy2ć[ E+е+Ab hm/;y9TF`l Tu"~'yZK$"YD6h-MZ:w8 4'sT1z2f=+RvjrB>7k9OY)˙QM=K|Ɩ`Hc; DC2VEQe>+)U'g~4Nx3*û8VQ5hcC5O\:!ͅc~iQ%%>_XIxPgzN.:>Vf2"Q[LlApn:OJC(ODF3JZY ~fhRo**(By(c(ռzVw%lT~_?<'pnxClp<``K+.^IENDB`gtamsanalyzer.app-0.42/Source/.thumbnails/enormous icon2b.xcf.png.x0000644000175000017500000000000011062075653025563 0ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/.thumbnails/enormous proj icon2d.tif.png0000644000175000017500000001150411062075653026327 0ustar brentbrent00000000000000PNG  IHDR``w8WtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/enormous proj icon2d.tif.png\MtEXtSoftwareEel ThumbnailmIDATxk\Ut]ʲ˒cv|j=^ɲY_ҙӣ4H#4RLz7܊oȁ{~ x3MAdV*}ͫ\3ov^Ϟ?~MEw 0DMGCb✉ O[q?TiyGuRW~ߎlC"">Ϻ=1 `Co%sa?;nΩ|[|Wl٧?fz]<6dmdP7Rjb7v'_ؕK.:K\J}.nNba9ftixSqI5uގG4 `³'3#}b@Q,;XQpOKu< o=E޹UͻAkUZmc|DBE2E*[,4Ѥ*|aA\A9VRr;]μ<3 4%Yt3sW?d Ӣc?ѹOqдVCȥ-@CB ai{ƮKqG'>C 7 o2AY}2_%eɶhXaf \ X UCRgc(G#C2LKc Q*3s3zkOvg/Wh5u {=Ę9}">ip? ;^F>o}ߝa Bħ |4B@,Ka¬0S@3ggtgpb[SssD!wmA?L]Pt\n-&{ǟN#ǥZk;4&wc/WΧtߝYHaQOw9vWJޛ޺+2{9%N*ɝ$$A1ECoo%u1r?%ɧ"Q%V!B5Y fEVDS 5WCܴsB%Zm+ᰚUEg$HG8~UǪT'v?= Q~/\u .TiyF A5%-&\F,2)ͭY?OQO!h:YX #>E b Dq3B8B~ѻ6sֈ!;8 ǯ:>ix?66cX)4P-$gѤ8kO18@S :Q Uڤ-"{ b2CdQŲN,9P"X,,R#l˟TV#%?!BW(&DMѬ "XAzrq.5+Pjɩ_V4\AR6[$%5z`WI,1Db̨.g; c,Çy6o 7~YrtKuEoF8;k3z;sj"]18HVؑ<ңYaLM\Ҕ}fS*v@F$DŽ:O8_\JgO U\!p̝<dbi%:=k3}I7I^~R=HU⭘phZ U?\<LZQ5$hಊOQ"L)mC(Rb*QG}b7_?z`W o} ¬"uD=HÍym>c`X\ GKY!'wf:Bu9nPEY//j\gEM7 a~ػ(r`ҥ$E} :Ar3t +#Z Dž;8uY6vc_Do lXdE ) bV`1b1 & < /18U$TQҳST/h $h~t@k \;E՗i޲:?B{ jꓳ) f 6yX{\ -=DTzS6",>ą,ܛ?!f1'\,V6dϳf[{B>/mɩQ/S@%Bj9]B:&iӬ?a[dS8aQy:)Z7[G\b"ayEQ[i\ s2R>V45EYoXdŹ8v#v-V>nq#NY$lXZY'V9V7/Ed9ՃY5d-DBI2zc5,>$ʳs'[ V'8 gY_\$QƠ CmY)eU ZpFu)S+ %2nܶKR,8@f$"N9UFx-Gl:BX _k ADΦyep:q>5d)G|ET`/;u IXb4QE]"WV>1l^߶k_<~cؖ*Ip_dDj"-&-b\:R;/EWQT)>8Z-Guበ113,/_FS\R`$3FU[wNO{ T')A1qfoE|gIDp!5itV ˆ>YO9U5O([yzU&޹Ԫ)@O[4bg>Hʸ^nEEym-ub890&iu EC&ImQ:`iΕy}QuaiPUq68;nܧzNAφ5uBA]b>m?b'.-~˿kܷy(( rW Szn|ҷ'EPPQA`U~Q^_5zCrIQ֊ًvF:GWE#6=4>CFP!h oAFP!h oAFP!h oAFP!h oAFP!h oAFP!h oAFP!h oAFPm|R7?_s.-"ko_Y<~eY_m5nC+-77Zuq҈ë>O]x^z7`Fi?nKۈIENDB`gtamsanalyzer.app-0.42/Source/.thumbnails/enormous result icon2b.tif.png0000644000175000017500000001102211062075653026664 0ustar brentbrent00000000000000PNG  IHDR``w8YtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/enormous result icon2b.tif.pngi{tEXtSoftwareEel ThumbnailmRIDATx{p\Wy޻oi,Y[_11 y$P@L(40P haNa) ڡS U $i 8 㗬/eI}:l)ceVZjj{η;|PJ*UTXn4M@ P ʡD `נ>JAQ h+<:$iWb1G%^G(20 \<*)# _(cWб喚ZZZT*ui"_L]}(CY(/.JW_ݶ }XgG.C !͛7jh4Z|S,UR\ nʲ;;;l)+]7>rȑ6!ehooo^:+&J]jjj~].hLL }7xՎw/E]U4mL$>/vڻK^U4RԞ={NRCH`0RQuAEgϞ>|8u5r_voDibJ5*2000PoY"XQTb.hG͛o۶m[sW$e ܍W\}O2qP+E>_\,i - xWƫX/nHLcgOCQ!c39&>.Qɸ)Bf RJ_@rAe>W_y;r-5|ӻpG?0硃LR(⢠Cvp,ɗ/#|J.;Ft# u{wK$3'Lů}rgr󧅦uGe^*a 6uDZ.D@Pz^'wO𷿦[tm=z?N\\7"-OO80pS'.t9ȗɌ\ErAW ʝ%~q{'܅{E0>MŹ  tC2F Bˆ+db2a.}ΛsAV&C7#Ì۽o%̈́9刂@)fD/Vj\J)|4̈j<&vwN!th~|QXSM%uA6@ ,йs^7)+>\RfO;"/Iϱ~e]Sx /B$%vA6@5YX8 qGfrӧ膏!4|[rmf =_gR4#@uw U/,<"vn(TrlĴ׹k///M %>MNr6' 7uԮ0kBͼc ??ū]sϢl{PC]MQYeΑ7B%"-fV˂HhBr5]o7{lS#pkf pI[P(KB" "n|xr䋝XZ|5(Nqr[_4\B f2YJLr2YJLJ4*>Q1 4栚}O-3UDGMX8Txrwn)SQ,h$F悦L-%p#r@ W2p52RJ*UTRRYٓE4y'sɡN V\̤|~lk6B.9H+;[`Or P׻/͛ FgғFd|'v]hwe |뚻/U]WuRrW$6ґ(=Q'4J6@#now6ohoVA)H$H)=bbz?cu샨}Ac`tᶝ[^ I+Ch.+ @ eƥjRh:V.&2>7[+4'ӱ|όR{m3S!ro |.\m~rH"Tۆ1#$6P p N>E}xAmS7u 6 '1#Xf|c'ˍkKJ1@xuoЪ w|#F(ځ/PO19G&5~1a=nEiWv(ffqt_?PyOO:ڳ~{c 4һux%f !'^aGڀ\`@hemF[PCMHJ'Ņt"Rm??|vi,nb qp[ (P#`=fXiR_ 1vی#bg 5Qߺ+kF \X1#q<D?j $iA7  ԉg~gx2-XY@|n躝Ny#Vt#ɥG%5*v>YXlI WL{)2!RE}6-FV:&8g5i"Xmn {xojmr`'e_5n5w^!&6R:V3="ұc2'B+,LRshz@FHjM3BHRzR}C "XZCMBWR%+kgB"-֊Pmu@Y5 !fzמCGN<{6 I>;e&?P?ܠOB 8V+Ǒn15xq vj֬&Xӊ?Ԁn4t8Vұcd'HO#65Ka VnՍۛ2/IFP͐C³Mi[)+#tn15Bj x%;'];!tCFݧ,h%/]<GJW͐D7g+3H'.ҕ ^d2?gcGq܎*<~v+jS+p?pkMq| JHsA/MM7 gT !BGtbA~+`B sN?TOOݏ.g0㘩^Be[_^A5,oMMi_/ҹ3m&O01|lx>EzQilE,:9W|Shz_#Tۦu+#5K&G6Gb c}:&VnR5zPHxIV@CŹlхZ[{Smӆt,Z.'];O 9rrdɱ";*㽘a̎M5*?=̥jprԡ+lp]t_v7yO)ұH:똜:V.NfDsVn+j==Gq$id1{]k6̖km;Bpi28v3}cI`Ou݅DE*]T\o>2z]_vf+%\LNL>;.2'e>;槻iΠ*>S,4E5 \f]7̌rfH݃ G Z 2+2X^ ۞Be(PQH*UTR?fyIENDB`gtamsanalyzer.app-0.42/Source/.thumbnails/enormous result icon2b.xcf.png.x0000644000175000017500000000000011062075653027122 0ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/.thumbnails/enormous result icon2c.tif.png0000644000175000017500000001317211062075653026675 0ustar brentbrent00000000000000PNG  IHDR``w8YtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/enormous result icon2c.tif.png~֛8tEXtSoftwareEel ThumbnailmIDATx{%wu?>%! a BmOI`?¦\NʔS$8)*;T 좨]m&a8lkٝ}tNw<̽h=ߪL_s]>)CH [ 4:]1[}3@;&g KVG."({d"@,y&U,pjv a;#[YV!U`0@H'Vl3vu]g _)W6/׊heWtO.mЁ2HVa}{ϳJ1{I W{ rk(QmOp caa}ct%#g)bV;b^!n chSlj/_nnNg?{UZN~|}_s^sw3]^t&J4 d55>R1U广c WmWΖ3qhlx@s"bY򝏾oUͿߞL/ S>r kn&% Av~ǏKE?wٯea,`}ϻZj__-΂獕6DcD#D M [*H<6)U\Įm_&N7<2 u'@F ">~ @y_-/m{oWFs IIMĘ9f tdBʰDP">_ӵdB|2,7뉗K$KejPFзT3LB#TYAꟑK>#vk`Š 7Дb,=kĝ `D,[q+N%O"1֫AU{Di1ƊkY-/{qޫ^8`T*:5Πq%~F\dCsm,ޗx+k9S/oMvwU]ktT;_/?vm'oO ]_^uӋelGA8 $ϫDsƈh.0?dic#sD  gu?i{1iK3u9&w4vfh(0^rst* g ykz,/,ܧ tU R J,uDI-EU5!AɠiH6ͬ ݥ,@}ϲ.W3qظTY],3s+R|>Ϸc#;rBADRyBִzUͶ<;m Iv`$IÛPSw}eǿk^vxݿ|cG)N=yg2u _[+N`]c7C^B#*&qq kc0Ќ3Z>Kuea uf tp1y!=o&Ņ_㯬\m5L({іHH@U;|TC ..շ2vͭ#ЋJ65ZIY- 3Af&!MPjK\n*kjdpgD9Q"guobWm3w1YV1 z7*ܳ|Coօ :%? \~(:*az UUCQ1x}Ҷr3VAh]7jg "6j-b8)/7M=s}!*E)DS4{ܲE4?Gi&>@̳88OO>i^3:}ֽXOD | @5' ֗0#d䨛1H~Q5E0aW'Kj?Hߔ-/|i0ﱋ'6"ܒsRFd}{c#:+8{ǿ19qurǿݰi;"F|/Q2qy4&֕(qU+! ("L HTܬHz=UdRSuQUڝu[Ɛe kcUD1dL/$i88".*3vfn,zL!6m:_ƺK|IC}2OɘdQJXcUYܑ<1v UTWkq1JǴ4}M rQ &6'__OD~Kj=ub=xĸuG+RнgeJw ZҸr*SM \ٸ}j %ڳ]#QKĕu4#Fv^9v*պ=k1 …ӏ0ٴY! ~Ob7ĵ 2.`]L9?Ӻ@9׀傎v>I4:'Y(?=vq:Þ YK ؘ sq!mVKn_Em?LKcfD>iࢊ㕾\sG9/ikAM4tv5-"XKԘPc{i1 6"tڄ!K7 BCo|nkA5d*j@CJ:emB,kSnsSQO0 u~=6e]\TH?Ư?7._Q:y˟`ă_Ʊ[I\TARI|1&wv4_S yp .mq9[Y@|IX=uJG)׏Iw6-L#?x7s'nzlkyN$Qi4!qezR툔(T?JH[elTHn4@lyhWN=8TxEa}B/!WБѣcp?`'pj83c\Dzq=ڡs7He^zc,7X?o<bw@2ƋQH5 ĶƠ ؊216_rDe ӎ]mcNo^nށ:]fBu^Sk(Ws]v &@oޟJ詵uAs'9;ǖX i{cYVN [Qou_^ yu5T/,$.Oiq2->}uAs'S[vπ 0׿q;ƺr*-ՏBa#u+zc̉FCigYAl *jxAM@ go7>rZ\PP.qf^^iODX/PB hq ӭQM N>HyH󺠽}sC?t:dˋt,YBC&zMe 1:QATC"BQ:D)pd5AA/dM.H:!i[cfUm[3~IN{Q]\ͷѾ 6-UYYJQ2N\Fb!]P:|F' 2ApQL,"#.qNhX 3zM"F5uA'% M;kKUQ JSHA 1"ԏ R Q9%WdlW@D]\%븸EZ"u>!kXW#;@UCV+j}< PC)!%d-:E:y2"6b~ب_PP4AUBYRb ٲ軉, uH-tACHq*NrQR2nĘHq%Ռ,kte>DBZ A Lx/s*) ʕ",XogD "%b[a]ICT)r;)k2@?䅱bҗyD1.:⺓սݖVW@9jLDG9[Y5`~x_e3s:*]j-MxGYeUl`+ '~ÙK\"eE"b|AAVDݓVXduYz{eVsSCc@'>#QbŽ{u)0U=B;%כa)=|uKH/5  "S)} ا} "塱OAOAW<4)2c)芔>]fS>]اˌ} ڧ+RtOAtECc.3)hHyh\Tmhh kWB}gpQ&0.ti_;O؈.w}cHX3PIENDB`gtamsanalyzer.app-0.42/Source/.thumbnails/enormous result icon2d .xcf.png.x0000644000175000017500000000000011062075653027164 0ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/.thumbnails/enormous result icon2e .tif.png0000644000175000017500000001220511062075653026733 0ustar brentbrent00000000000000PNG  IHDR``w8ZtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/enormous result icon2e .tif.png[ YtEXtSoftwareEel ThumbnailmIDATxk]uk}ι;3$CRC#aRNؖm)Cp8A6i@Zm*)~IѦc4 ֣$q"ɢLY2)5$^pH;"E?05gYܽ@ 4@ 4{Q'k._IO;_=N_8`ןn)#iO=zPqY p >w=g;?*qwZS__0U%|W@gP.Gzb3uUسnNJHvC fU cjd 91i PBѴ#]Iwݑr-v1"3S:tAVdjwBStPNJbn M^F]~DA7J$sUW"pb@#P0 B|̙Ő+ L@?2~z?>W~qq)(i%THu-jiEgXQ#/G>8trp#yAۂEo(*ɂD'Ւ n #MȲO!Ke'+GϾsW/p1/۟SC =Pp&]`rtQ^W {s,r@OlԷYuOԬQjxv3~gzJ#_Pl H 3]9jDo9@>XOB}d/;k\o Y":#bT̪!Rt7osTMVQslbo_&ٟC*|鲣 de;cjL\W$!_=ԏi'I=pop?fi2y_SڅkDJu ^xl%9% @1I_{E#{7 ѿ},!IN  [;bɋܙ-$8RN&-i6[zi˔BOPo Soƹ"Q*N1$cQ [;B/kd&GԋP(Q2,ɐY:j]*g8X=2FYQ:D<׻T3@UHDqUOh:#Z섯5 tࣚH}D)R9AsQ|Lo؇^ %"8_!BOqCiM䋜y/evI(R9?uqfc'8s2yVd˜})in0CԉhdAzjsduG5kEBnQ2拔r>(o?Lyk}:jQ%i >u#Jj[Cf'_䖃f\TEpbeޠZy:OY@]YាH[3yvxX=[b!(JC@(늮 D{3y@.bf8 =+6 Aj#E6 ۋǹřȭ3/"j&f&ftj/wS\-6n?u+=񔅼CgE2>~ deĬm pjfEyY{qi\\OSkj? o=);#L|OԆo%4d.Zywu%*5+wYw]ikVuQ>#mѵa i{ H"Nk>"/24!y3}dY#t.2J33t<]*g qquȺVc3bւۺĕQ Eǒ8{ּŊCQx<[=:fA|0̘:,OYڞZ|b],͞Wlt'bV#hygq^TY,e|z$o;Ľ DL:U?>PX|2jT`yT]ٲeyl33u*C,͞3Odq"k|VFfV-l -"+!FFJꍿav]+ WF*%r:qҤ[kđՈkc$8`!BZ*2EQ("p.QBPB6DjrY(sei喟~۶>Duy^# qCʈd !ܪO'jjDIS%*Y3|!bjunf.Vdl50 2 2nx |>+OZ|[.Aۘ:o..&m(i [;Up^}!d׻u1wؾ<ٷG{QEff:4,,|k5Ԧ? Wq )O)Fa88Im+Qeq~2E]T&\.gq̟;~<+K᳓/["9~3b))Y{,,tv4WMΞx~%DQ`+K|T q|@]ET"k Rւ.!73e۞ʭwx#rM\L֞ E|b!7 DEW&Tee",7 ZP&boMyMUƖ-&+.q"S)mYmE|-q&峃#JQ[W}"YŖuIc!ZVy TKPM}s FYښ[3ٺƍ}싌qCT~i{9 "*m|3Ouh2ye݉cD>npLJ9?ԩHsTzc:)B"Ox].Oy%C 㧬 X\QQQ X( ()ѼRF[S+.Z֞; BȘ<<)7wl|뿳("[,BK0 9eQa$RQࢀr2, 0)UPW Q2j.#z,a%f|B.oYQN,N#̼|tDe5T\{=hjA "N +Cϲt*nqMv "qR"Yb bA͹59놺bEf֍zÜz+rēv;LgLv?2jY{qZֲ网ZUҍ.ʰpcǯ10Aigʻpeplyo*"UP˺rpG_Yn{2huY)ܠꪼC׍XYYzc䢿W|$k~.y80ʼn\X1~qܹT;!BbEx_D0ُA٢DM\2 K{ـ2ݸgQ/v},/s"-QՈ*Mfl .h}3Gg]aʨZyNAT`&quŕ&>!FDЍ,w\+V9 9Q2L\-|f{1W֣bQ¬ղZ룆jt^ kњGę !(ըA9]k$%z"hDJJ|5Z-6׵꽍 .DD Kף*We{AQV"+ˮnS/n} :knz h 覷{j :knz}V1?^@m|?[C]SdEqwS+ ܑwMƌ0V4PW__7/`2>?IENDB`gtamsanalyzer.app-0.42/Source/.thumbnails/ta-rslt.tiff.png0000644000175000017500000000530111062075653024060 0ustar brentbrent00000000000000PNG  IHDR`D~0JtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/ta-rslt.tiff.pngh\tEXtSoftwareEel Thumbnailm IDATx\[l\GfΞ={Y;M4&QNI@ @@BU!%BDHH)MH%BEI I/e{pַ${fYm>^??{ԁR1`=<Fx}~p/2Gbvb^{7zZzݻEe0*%\2x=R@-# $N8д t_U@Ui"5Y|uig@E] jb4D~]΋f@1 {A$\ O!_C qWВ6+?c+^#00fpiܸ 'M1%rD{[B00_}XH{+|=Ǚ?ącޏ-ȐzC'@HR? foϯqKO]#CR{Î?ALb Ħ\|FVLe vx@Z%BSd\R Po/FGg4|?.tT=6ҙ^NIC὿%ZƔI$,JQ{/ҙ>T*./@A08riT@Ly}͏8'zΏL\7ޥe9ó4`||~0Z5lci&r\B5fj(S@C ;@kljeHgll (4nOUr,9(${0wSc{"f9IB0KTؾe )D#"b͗4G@F2#}%LP:ư 1"4lɫdд2l"fՄ9W4| w1TS2ya$Q.ǐđY C)@t|vت |(`(`Y+{JMW EI X_ 拗'OUFgEN<ͷ."`ɣhkRu. e mR^:bMcxl; .`b K+M$J?< (WbAA1&Pyss2~\lN a0,DkEuUZLmey2V$,$o<[7 8)POx!U<~;gꮐVW|~>tvb=*~,8SSHx @R.ILl?& ;G`fDX3c w{BnQHNA@IxڈFAh{vo v(j҈D;4Jz6(q%p:F&$+7~{~ *۟3-F0tb؊t&9JJMlr\cns?F1G8 BӃxe _', &TeM06>lۛmW`/W5-%M@>X '_h]Jho*CCZq+~~|3sI撏 r0z+HXCmHUHKr]?m`lʅB0و̶XK==aJM|ٗܔ%[Ty84\Bl<ٗm\D݂`Vf@r0dmK1LK !ElCQlWi ]pa[X\׫2QVl;~>SFض)p=PPLL =K/>L` !1rYJdsq|py^08{{H (S|)b 0 U}2\iFp;߄ވZ,;\np119b */nm)B7NyW}]aa9(k{#1)`J޵IENDB`gtamsanalyzer.app-0.42/Source/.thumbnails/tamsanalysis-1.tiff.png0000644000175000017500000000236011062075653025342 0ustar brentbrent00000000000000PNG  IHDRE`K쿬QtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/tamsanalysis-1.tiff.png|btEXtSoftwareEel Thumbnailm8IDATxOHw$%qKlU*"LAiЛ ; \maв]`=v鹠n"Cj_WcפMj;Ѱ'mx>B7y~c{y*<aQQEQh6,kk3gxH$y>2/^  ><,/f;Bhm=wt@=ϫ. z5H4:D,6X ;N|짪$)_ Lq/f}ƭ<27[,z7YCi}ez:Zz\6ʞ_X]]]xX\u+~SioҶw;;?gj*e܉8g01^uopMU#.m[Z2|yB!իwinvyGDoP+s~ gϦF8x>8[7L ek33 LMm\;\=cAA4n܈0>nrڏ$ض R6)gKkx<9qNظB6ch(N6…49\$z6M=z{ʎbwX'ːwܜ*ms yY :;Cebecx4w]H&ioO{;>ԟ˗m'O"U>[˪wsPiqpo}fS,/VVԩI cWVoql]]_fq0hk bD":>XFI448eEX\4nSϳ.qƍ7nܸqƍ7nܸq[P\p.oEӓߟ)°x YYrz6of,TgipWFj4dth~#5qD2pvR>߿eeev'] aFj*CoԂ'aX,laFletT?o3Z 4>Yqqgfc0@Vsk55,)PuPrdn-fڇ"7rkXV#W ᙙ,_G^[y8گ/2{Ʊb^'^ⸯ//™_·'snss)*.v=Vƚśy s0ͮxO*d6f*krju"_ِ),#Vowk̘WA"ٲrho! rS^8\.E-SAb6G'vXQEI3x ^/~~~2kVŷِʕOͻdIz(&ݻ>NݸR Y×8X|%/oʙ3s4&^Ȟ= Vzrsc}&?5omm\!c%77^9vlS~oD23x$'7d]]ʐ!ԧKBhZK~p=c CsFTTaދ@ f8݇Z{477sm|at/g͚dΝIUU,yti .·͛obcpĝ;an`&#W*3fHaVpB}e4BәיWkyVz̙3<. ooo|8r-[I[NdR|~ paݺRƌq jj얯 ڵ֯ҥ/0aV,kh4jg yt2'لFo;QY|<թү_Hmml6lr!$==Z;?O7ŋzY2U*F7R% {l>}%::Z˥^+3gqjpaXޝn[[۽bK@V+{vot:?X,lbXdʔ)Ȓ%=DTrf̟"r޽hcy^y%K:u("gϞ"SNpݺO%^^^(^kWl-HQ:0#%e !!!~nd"77Z 9pAAA aMg?FX)|6(EARa0hnb6ǵ޽pL&H;NHVGJ].2pDEEIuul69uQ(lkQQ,Y2]BC{Fѣd۶Xճ]w ~͕懷ŋKp̓ڕ{뭖ѹvmCǶf _}[6xT{hty?ԪihIv(9s 999M̝EDDO_-(UiWinHN>!]*|||Xl:Ecc+<&%G3:. {ګWqz؈(o/W_a4y8}4&M fןEQv6ܽۇn$Ç+L%gT+i\_Zر;$ӦW;v`kwըT*ӱy8xuή9|}}L&SwDII ǏKSX=fΝ}g g8G +BKQj5ݻh4t(}]oFף;ۻ+gδ_tD|}nqȶm)>,Bz@j,Y2L,;F X'4-'O"3VS,3gV@EiQ\F,v}~2`)+s|fC\AFdCKNfٳ4:g(#'NΔKaȯ=Z7**KFFzQN4kj+g)zy^$@#W_*/,ň!)RW7aȯ~'@C8 94)g.>*WM{睴#G N8tFh|2UDj;Nɕ$'!"›ɓ+8_<~*Wѻwݴ(L&o,Hbb#P&?|bQ4=+8b4&٧R?f hZ-;o%((ub8~eu7@m(*`Pv!d%KH*RY* Ls{{ @ @ A|݋A d#^2u?Nk}˗L򺗹"k W+J X/ěQ)O{WƥOG5FohzLi݉_tV?Kgoitp"5IYreȼHøl]l ڸ~q\螊ݯ<+!Ime;L H^@=9:顺Cn&Nq;[akYc5 A0LvC ' _3W3%6o:ʦ3%ecfS+1k1IԩcooTڲn9{{Va$ŤLې=wa|ƯC4MәKt;-[rw HIА=oa|ƌMTeIc)[$do2>}"[ݸP)2ut|8ơOncךh%6kwiE#G%&{i!(XĎd2F^UκN$''#S%eC'q/Mr\Rg(/]_Jvv6'ފ&* ̼;*AUŨa6r'eǏRض\9'φviP(larUm.=@lvl6:[?T9seͬ]H+HNip 4{ ~FķUS)b!fCMĪzeǙ6m>,ā}刢5!k"ݗ q:,_4* n8N}Z$ENƍի @TRXX>aU-^mlшyUD <8Y]oaHZ݊*A…f[I&d#/ʕ+h4yeXB ڐSf'm-5<K.`hˑgJ3E 1J>}"Y3kJ"??{q~>{mRjwٷ?,~O{菱2rї.0(1v/JDŽ(&܌VeL>ōwQmbc[9}np0"oSgOs4X%J٩,/^Ry#=F Drs WG\?o>S[q _=b8Q+6򑼫b](**?-%d2 yH*[6*f֭M=g &a : uuu|WjwRݥԂ  5xT mǥ徼n+/s e(,, ׋Rg6TVVRPPdbֿpUv7Xj4zΦ!Nwfs5z&=%YE[ !7aӦM,\'III GC]}}=m\N퉍K.vfPiaǖ7ebB^4O0nB*b5"y'ABdT4ΖLZL3³$MMf-H>t945ԠVw7缆`ti95&t~-<'7.})KJ7'޺NQu\Ӿغe=vw~9~%BLDz[(111Lm5BM~ۨ;ES={rYwJ06ۑ^~E<&gJB?ANlD!(uIcH~%jOG:Z>NG999A!ç<6sȕ]U|Rw?=\ͪz&#lbAPF$IRwvp5W}͇^ztrfm:SRR?7XcH Ѧ C[|z꾴J`ZV(TЈtEdZSy`JVY_:(bccK,)$)3"!хi7 oTwSژ)c gG~.M&Ϙ#sj5/*c0N'b3 Ys AO79يs V D`S$f{J9r腃ci9EwS}|JK󉿺 wȗ|\TĄG KB&MKuWaV{RK~c7mN+qWD$7tڂ 1>cRD~j$qq;ڤ^'v X eu7@m(*`Pv!d%KH*RY* Ls{{ @ @ A|݋A d#^2u?Nk}˗L򺗹"k W+J X/ěQ)O{WƥOG5FohzLi݉_tV?Kgoitp"5IYreȼHøl]l ڸ~q\螊ݯ<+!Ime;L H^@=9:顺Cn&Nq;[akYc5 A0LvC ' _3W3%6o:ʦ3%ecfS+1k1IԩcooTڲn9{{Va$ŤLې=wa|ƯC4MәKt;-[rw HIА=oa|ƌMTeIc)[$do2>}"[ݸP)2ut|8ơOncךh%6kwiE#G%&{i!(XĎd2F^UκN$''#S%eC'q/Mr\Rg(/]_Jvv6'ފ&* ̼;*AUŨa6r'eǏRض\9'φviP(larUm.=@lvl6:[?T9seͬ]H+HNip 4{ ~FķUS)b!fCMĪzeǙ6m>,ā}刢5!k"ݗ q:,_4* n8N}Z$ENƍի @TRXX>aU-^mlшyUD <8Y]oaHZ݊*A…f[I&d#/ʕ+h4yeXB ڐSf'm-5<K.`hˑgJ3E 1J>}"Y3kJ"??{q~>{mRjwٷ?,~O{菱2rї.0(1v/JDŽ(&܌VeL>ōwQmbc[9}np0"oSgOs4X%J٩,/^Ry#=F Drs WG\?o>S[q _=b8Q+6򑼫b](**?-%d2 yH*[6*f֭M=g &a : uuu|WjwRݥԂ  5xT mǥ徼n+/s e(,, ׋Rg6TVVRPPdbֿpUv7Xj4zΦ!Nwfs5z&=%YE[ !7aӦM,\'III GC]}}=m\N퉍K.vfPiaǖ7ebB^4O0nB*b5"y'ABdT4ΖLZL3³$MMf-H>t945ԠVw7缆`ti95&t~-<'7.})KJ7'޺NQu\Ӿغe=vw~9~%BLDz[(111Lm5BM~ۨ;ES={rYwJ06ۑ^~E<&gJB?ANlD!(uIcH~%jOG:Z>NG999A!ç<6sȕ]U|Rw?=\ͪz&#lbAPF$IRwvp5W}͇^ztrfm:SRR?7XcH Ѧ C[|z꾴J`ZV(TЈtEdZSy`JVY_:(bccK,)$)3"!хi7 oTwSژ)c gG~.M&Ϙ#sj5/*c0N'b3 Ys AO79يs V D`S$f{J9r腃ci9EwS}|JK󉿺 wȗ|\TĄG KB&MKuWaV{RK~c7mN+qWD$7tڂ 1>cRD~j$qq;ڤ^'v X eu7@m(*`Pv!d%KH*RY* Ls{{ @ @ A|݋A d#^2u?Nk}˗L򺗹"k W+J X/ěQ)O{WƥOG5FohzLi݉_tV?Kgoitp"5IYreȼHøl]l ڸ~q\螊ݯ<+!Ime;L H^@=9:顺Cn&Nq;[akYc5 A0LvC ' _3W3%6o:ʦ3%ecfS+1k1IԩcooTڲn9{{Va$ŤLې=wa|ƯC4MәKt;-[rw HIА=oa|ƌMTeIc)[$do2>}"[ݸP)2ut|8ơOncךh%6kwiE#G%&{i!(XĎd2F^UκN$''#S%eC'q/Mr\Rg(/]_Jvv6'ފ&* ̼;*AUŨa6r'eǏRض\9'φviP(larUm.=@lvl6:[?T9seͬ]H+HNip 4{ ~FķUS)b!fCMĪzeǙ6m>,ā}刢5!k"ݗ q:,_4* n8N}Z$ENƍի @TRXX>aU-^mlшyUD <8Y]oaHZ݊*A…f[I&d#/ʕ+h4yeXB ڐSf'm-5<K.`hˑgJ3E 1J>}"Y3kJ"??{q~>{mRjwٷ?,~O{菱2rї.0(1v/JDŽ(&܌VeL>ōwQmbc[9}np0"oSgOs4X%J٩,/^Ry#=F Drs WG\?o>S[q _=b8Q+6򑼫b](**?-%d2 yH*[6*f֭M=g &a : uuu|WjwRݥԂ  5xT mǥ徼n+/s e(,, ׋Rg6TVVRPPdbֿpUv7Xj4zΦ!Nwfs5z&=%YE[ !7aӦM,\'III GC]}}=m\N퉍K.vfPiaǖ7ebB^4O0nB*b5"y'ABdT4ΖLZL3³$MMf-H>t945ԠVw7缆`ti95&t~-<'7.})KJ7'޺NQu\Ӿغe=vw~9~%BLDz[(111Lm5BM~ۨ;ES={rYwJ06ۑ^~E<&gJB?ANlD!(uIcH~%jOG:Z>NG999A!ç<6sȕ]U|Rw?=\ͪz&#lbAPF$IRwvp5W}͇^ztrfm:SRR?7XcH Ѧ C[|z꾴J`ZV(TЈtEdZSy`JVY_:(bccK,)$)3"!хi7 oTwSژ)c gG~.M&Ϙ#sj5/*c0N'b3 Ys AO79يs V D`S$f{J9r腃ci9EwS}|JK󉿺 wȗ|\TĄG KB&MKuWaV{RK~c7mN+qWD$7tڂ 1>cRD~j$qq;ڤ^'v X G?x%cFKFkb`o~ FG18c]w盏SjZ?}j!&ڇi_0XưWl^KT]@4ez .:nVhuavaT4ktшꍏ1;Cdv-Bzގ po(YՂki=b`.꿺i/cXe_܌bd\Do-:3[\b+mD4&RpT5SݴsQF ^C=shK*MjokhA'/K4FKՒ T?+͊={1-j'^D'K3C<}L\;Q\  w7#=oR%e0(R+6 GEƢE6[^>b _]h+_D#^ۆ``도4؏j+ɸg,5;H&[LHDVL/wgU"yf mlxGCflոbXUo P`*eö|=?2FSLv~yF[Qr~.M q_z+1{ĪT*'#/~Aƕ&p>Ebiz\\ކLƍ(̟ak);:37rʘ2<'@l[{AWŒg~%;h45aPlbˬX|I*H %ޝ<viѷ O;s}DbHh!KSEF"͜6\~j{hk:Hirې"GHhq{9ӷkDFGVHRw{\کrFȪ{_¨5V;%Ydh9`=KpήvJȪT_r3ᨅl^@ pZFpZ\V:B J@<'krb1xɄWr*P9꺆=V9+yd -vK( S[ڥvZ*gйv)-ZzuJu@/\FJҐ2E֭$I /{t;}j#;vnBROhitp"'@erT&'@erT&'@erT&'@erT?SnIENDB`gtamsanalyzer.app-0.42/Source/.thumbnails/taSmallestProj.tiff.png0000644000175000017500000000512311062075653025440 0ustar brentbrent00000000000000PNG  IHDR`D~0QtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/taSmallestProj.tiff.pngNtEXtSoftwareEel Thumbnailm IDATx[lmv.) TD TJEҪKՇJUZЋxSjJK!!( BH${k63s$dg{gg ?i_̞sMP=aV _ܗlV7"VWXZM 0-KXxX&_oz܍*&K i^}#tDi B)A%]l!_R4mLέe6߁Q Sx%eJɄqIE{t7ͽoyv_DZ?7msvFS75ZĴf ̂FLu5|GvMoI'.f4I{$_+6Qdf>Lndsbj B(.=ו\fp,C}%Z|Iڛ&Y-kp;yCLc+w>YH͕s6ug{np4޽9j .t#o7!mi<|Sģ@uW&rnsEQ꣟4ꎟT'Bnv+yr#*4|1́Sw`>h`p9$''G {-I 5orߖ_/sRs`4y5Q4L&VB%plO_\ EJ5{x背$7-Ki `+^ϴ @!l9S2kHfyz3ox/GS(E<:qƩ;ȶW iEizNT!;x$Bm";]E3m#_j&_jf*P|޽2:t&olӴG'dӕɹ~~I8Fx`W# @ȟ𖻅/63ZhM.S3P/EۢZvj; 9iҼ+IUft서' .JP)nOPJ#gD/RHa_@a<]a\_P(DR K!爅fף*^P/8&*z^PuΘR0|ZɃPźܸeǴjET?M,<^Yf;ϗMb.ʕSZB3ײU!my+=ҧ>SzaVS3b];sݟ*.wľ{w 0_h%[(K)I:VE슮yd/Ҏo/yìuOtsh䳎˷_9&<\Gِj|, cb^<Wx +:ˆJPvN!O+ ĂTE$0GOvgdž*L]rf<@ :\\)ͮhRun!O[v"ԳHYJa?m&f׹QU4 eBysI!lz?Jx{˝!vG ͡YCƫ^<Ey]4^p wa:/՛R`cK]]T! P ,[c,}ã5d>+Jr+iJI=LVo!]MM Ji̪iʲ[Dbdf#Ék-(%Ba|;$3]f[ixѾPUCc`.F,@)|3N~Dɹ>NfFBB S'DBܩ>΁S0Cg}A(eMX@F`*$^KZTIoZ)x*1cV@ϟW Ot@-W 023@BQ#ƱmeÄPvᱹ! @ָXs{iR)sW" h_f^f!X~18Lyb//pB ,y7"Ҙ<pRRX=dz.@Cq>0WG(G&h `A|XW"5 gk_}9Z#SضH J3)R3|a !]~Ü);}'#sLe{ 1+Ǟwbcy_mW5kך4irɱڞl]+55h8^ڭWRڬ_;550C|5o__rc7c,˖U +FeAjf\׳xtW'KuIENDB`gtamsanalyzer.app-0.42/Source/.thumbnails/taSmallProj.tiff.png0000644000175000017500000000421611062075653024726 0ustar brentbrent00000000000000PNG  IHDR`D~0NtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/taSmallProj.tiff.pngUtEXtSoftwareEel ThumbnailmIDATxMlof^c'q-' 4ڢ"5JTPHTCRHR5 J6TT'8=1;3 ^x;c{Jof}̛T^Tc1peۏ~w{:鯿m8Yi@OۿD+-:S#gg8+)I {>;l6La~fpʎX5B iGU!lTJEı#fDJ)툳{A/MЧ(O؟ZeIOsm{iS;J[u0lƏP[ڱ,bDe)EL`Z ВߪTYxn1M>D,sw)ax+VKͭ|wS5[zW_c[8QrN#%t3bFt+[]%WEN`,D n"9OXRu Qb 2hX^'z>0,3ԚvC覟sO#0Ff:u_C0=|Kuvp8@/Ms:oi۰<϶Ë)jvUT$dwS?j9O48K$&ZBay$R;ByBxtQL@s:%]-Fqn_?d`k lPŠKQH`HE"$Idŵ]Cb}ϲQdQʝOcdֆ+I\sJ{@sBfb%"${3ܩTP$^?" ,Ѭ4(Vl&;l$&,U_H9:?{w%.I{l7KV (dI|KLTIݓHq~GۏE ^UGk0WBHoV8G$(~ڃnVWl;s;.Ȋ` oHe\5ݽN@cD/i XglxRBaJtb (BUS $_9XXWm %;ts<ߓQX4EopMzZϠ*&RD{A:%bZ@ȗtkT eWCm?%s_Ɖ{+ŵTE]9qo;b\yӗO" 7W>X@}p+%2 .\;LRktRVG-h4kI{ۅq}zT Y(k8UVb;t>C.o-E շmI'VǮͭN^Uy,/bf |u)[05۫אJiG*^!bQ?_JA2dS|8Bt1 [".hBrׂ]359֑Bb Ç=#O9]*;xwLpݸ/38_~NV/hB\+>F:u=`Q)`Iu]-%WW\kD@'",C6\E]o|ӪTdh xD MR+S)|-hg7uB^ju\h-u%F92ZuɾS<!߼-hW% 8Z.ONO}tTNu.خ:_U q*%U$31rzKa"ݺ:7S !H}h.YV͐/Nu:w)0ſka668LM8LM8LM8LM-,EIENDB`gtamsanalyzer.app-0.42/Source/.thumbnails/tproj2 icon.tif.png0000644000175000017500000000712611062075653024464 0ustar brentbrent00000000000000PNG  IHDR`^MtEXtTitle/root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/.thumbnails/tproj2 icon.tif.pngtEXtSoftwareEel Thumbnailm IDATx{y3IwBtPbA)JBeʏ@bPlL eB\ &e[ƎA12ƅJH.d z!K$IB{LwfV{{ͯjkgwz螙19g8LyEb%$`XW)2օ_< qXp|o x4Cw@}x4!A iN xJf1|ƛh`9&cmO S9" 5/ 4#6~7RZak]`.p |x E.u8 t9*F9 2:> "w鈏#*a3Hm);s|\w ^9~k*J9 S p [uidtgfr_B1, |8S8pW4g72t@U^r4N\T豔¼--d0{Go TJtsar 1$TN!> 4gԈLyf44-dR~qRj!\nAfOQuqhܒuQ >~cgzr;Nۉvb~mg71ꌖj&LYxӜw=:VO+ИaO+r][:뙭^+} nR&z:k&k欗r;$Bm46,ߚ &o`%%k'^P ;УFE5fB-X-Kū0)T7=7vP\ PA) JX,61YBFiWҢ:5۱JR(`߇5>pڍXB)ES^~:wX@e韻ZK#t;M:y HF;( 2~&H%FiN ǑQLb4h 'N 0Ac2Br<7Jzk$ÍUpj "l¡O?ATg̿m?cLOw᧻=2‘iOdz1p$0Bik 6Njjqi,=n ]Pӓn7Vr\lgz >zոzb:Ǎ [Ã۞Z}rߓT`,?y苗_s%@hk ҘPխ(QZ5~ '1IΎ%'f!mxTk>'CRLŪ&}y֢8ݟh+s ǚ0 aNѢv7 J nX/@ω_u̫o8G-k?޾G0>HV]5f7(l-;p?BoLC%l777س0֬@* |XV ]3 lN.>3oڃlP$+N34L9t53Yq]˜pUz}^l=< @j&>8uWf/ !\ LdW3|t+d(4%n|m>ܶs5^0BЎGQMA]}bț%׀óMӯK6J9۷t}/[!bK%&k Fsc+~{͎A6'vB䈅Oq`/8k; p(% q{ZuΕ}'u|oo>O=k1\+&/1aeԫ{?nnr}sj?s>zΟ!{ҕ\*$屪ƿ>N="8￷}kFlpo3;r&k'( #import "MyDocumentSimple.h" #import "varRegistry.h" #import "ctQChar.h" #import "TAMSCharEngine.h" #import "AGRegex.h" #import "MWFile.h" #define SELECT 1 #define SELECTADDITIONAL 2 #define SELECTREVERSE 3 #define SELECTFEWER 4 #define SELECTCODESET 5 #define SELALPHA 1 #define SELALPHACASE 2 #define SELEQUAL 3 #define SELGT 4 #define SELGTE 5 #define SELLT 6 #define SELLTE 7 #define SELDATE 8 #define SELBEFOREDATE 9 #define SELAFTERDATE 10 #define SELBEFOREEQDATE 11 #define SELAFTEREQDATE 12 #define SELEXACT 13 #define CODEMODENEW 0 #define CODEMODEOLD 1 #define AUTOSETBASE 8 #define SUMMREPORTBASE 1 int nsStringComp(id first, id second, void *key); int nsMWFileComp(id first, id second, void *key); @interface myResults : NSDocument { int myDocType; TAMSCharEngine *tce; BOOL closePermission; BOOL stripTags; IBOutlet NSTableView *theResults; IBOutlet NSTextView *thisCell; IBOutlet id addCodeName; IBOutlet id recodeName; IBOutlet id myColorWell; IBOutlet id inheritedColorSwitch; IBOutlet id newCodeName; IBOutlet id newCodeDef; IBOutlet id codePrompt; IBOutlet id dirtySourceFlag; IBOutlet id recCount; IBOutlet id selectSheet; IBOutlet id selectMenu; IBOutlet id selectField; IBOutlet id selectFloat; IBOutlet id selectRegexFlag; IBOutlet id dateFormatSheet; IBOutlet id dateFormatOther; IBOutlet id dateFormatMenu; IBOutlet id namedSelSheet; IBOutlet id namedSelField; IBOutlet id commentSheet; IBOutlet id commentField; IBOutlet id setMathOpMenu; IBOutlet id setMathSetMenu; IBOutlet id setMathSheet; IBOutlet id limitField; IBOutlet id codeColorMenu; IBOutlet id dotGraphWatcher; IBOutlet id exportWatcher; MWFile *myMWFID; id arBossWindow; id gWorkBench; int recodeFlag; int selectMode; NSMutableString *dfString; int dfIndex; BOOL caseSortFlag; BOOL firstUpdateFlag; //kludge so that first time it updates it wont be dirty NSMutableDictionary *univVault, *repVault, *normVault; NSMutableArray *univList, *repList, *blockList, *fileList, *colList; NSMutableString *limitString; NSData *mySavedData; NSString *savedDataType; //NSArray *rootArray; varRegistry *myGlobals; NSMutableArray *myData; NSMutableString *fmode; NSMutableArray *markedList; MyDocument *dataSource; NSMutableString *lgNewCodeName, *lgNewCodeDef; int lgNewCodeColor, lgNewCodeMode; NSColor *lgNewRealColor; NSMutableArray *codersList; NSMutableArray *sortStack; NSMutableArray *backData; NSMutableArray *setStack; NSMutableArray *fwdSetStack; NSMutableArray *lastRepList; NSMutableArray *innerRepList; NSMutableString *extraComment; NSMutableArray *commentArray; IBOutlet id backButton; IBOutlet id fwdButton; NSMutableDictionary *namedSelDict, *fieldMap; NSMutableString *namedSelSelected; NSMutableString *codersString, *innerRepeat; NSMutableDictionary *repCont; //has the contingencies for the repeats IBOutlet id sel2CodeSetSheet; IBOutlet id sel2CodeSetName; IBOutlet id selCSExactSwitch; IBOutlet id selCSMenu; IBOutlet id selCSSheet; BOOL exactCodeSetFlag; IBOutlet NSWindow *myWindow; IBOutlet NSWindow *addCodeWindow; IBOutlet NSWindow *recodeWindow; IBOutlet NSWindow *newCodeWindow; int innerRFlag; BOOL savedNamedSel; //autoSet IBOutlet id autoSetWatcher; NSMutableDictionary *autoSets; NSMutableArray *autoHistory; NSMutableString *autoHistoryStart; //summary report IBOutlet id summWatcher; NSMutableDictionary *summReports; int aCodeLevel; IBOutlet id codeLevelPane; IBOutlet id codeLevelField; int commentMode; NSMutableString *browseField; IBOutlet id browseFieldSheet; IBOutlet id browseFieldMenu; IBOutlet id addRootName; IBOutlet id addRootColor; IBOutlet id addRootInherited; IBOutlet id addRootPane; IBOutlet id delRootLevels; IBOutlet id delRootPane; //for movies NSMutableDictionary *mediaDict; #ifdef MULTIMEDIA IBOutlet id mediaSheet; IBOutlet id myMovieView; NSMovie *myMovie; IBOutlet id mediaFileName; IBOutlet id mediaTimeCode; #else id myMovie; #endif MWFile *currMWFile; NSTimer *myTimer; BOOL jagFlag; int mediaRow; } -(MWFile *) currMWFile; -(void) setCurrMWFile: (MWFile *) who; -(void) addAutoSet: (NSMutableDictionary *) what withName: (NSString *) who; -(NSMutableDictionary *) autoSetForName: (NSString *) who; -(void) removeAutoSetForName: (NSString *) who; -(BOOL) validAutoSetName: (NSString *) who; -(NSArray *) allAutoSetNames; -(IBAction) doAutoSet: (id) sender; -(void) rebuildAutoSetMenu; -(IBAction) createAutoSet: (id) sender; -(IBAction) removeAllAutoSets: (id) sender; -(NSMutableDictionary *) autoSets; -(NSArray *) allSetNames; -(NSMutableArray*) getSetWithName: (NSString*) who; -(NSMutableArray*) autoHistory; -(NSMutableString*) autoHistoryStart; -(NSWindow *) myWindow; -(NSArray *) columns; -(void) handleSelect: (int) selectMode selectType: (int) st withString: (NSString *) compValue withCol: (NSString *) colName floatV: (int) fp regexV: (int) rf startArray: (NSMutableArray*) a1 endArray: (NSMutableArray*) a2; -(void) handleSet: (int) opType withSet: (NSArray *) mm startArray: (NSMutableArray*) a1 endArray: (NSMutableArray*) a2; -(NSMutableArray*) getAutoSetWithName: (NSString *) who; -(BOOL) validSetName: (NSString *) who; -(IBAction) selectFewerRecs: (id) Sender; -(void) displaySelData: (int) row; -(IBAction) doAddCodeOK: (id) sender; -(IBAction) doAddCodeCancel: (id) sender; -(IBAction) doNewCode: (id) sender; -(void) handleDirtySourceFlag: (NSNotification *) notification; -(void) executeTAMS; -(int) getDocType; -(NSString *) getTitle; -(void) clearTable; -(BOOL) isRepeat: (NSString *) name; -(int) global: (NSString *) name; -(void) setGlobal: (NSString *) name to: (int) val; -(void) setCharEngine: (TAMSCharEngine *) who; -(void) handlemeta: (ctQChar *) myc; - (void) doTamsSearch: (NSString *) aLimString; -(void) handleUniversal: (NSString *) namelist; -(void) handleEnd: (BOOL) section flush: (BOOL) f; //- (BOOL)readFromFile:(NSString *)fileName ofType:(NSString *)type; //-(BOOL) writeToFile: (NSString *) filename ofType: (NSString *) type; -(void) addToList: (NSMutableArray *) aList usingString: (NSString *) aString; -(NSMutableArray *) convertString: (NSString *) theString onChar: (unichar) breakChar; -(void) adjustBy: (int) amt startingAt: (int) loc for: (id) who; //-(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(BOOL) isInnerRepeat: (NSString *) name; -(NSMutableArray *) sortStackCopy; -(NSMutableString *) getComment; -(void) setComment: (NSString *) what; -(void) appendComment: (NSString *) what; -(void) endComment: (NSString *) what; -(void) endLastComment; -(void) clearComments; -(NSMutableString *) limString; -(void) setGlobalInt: (id) key value: (int) v; -(IBAction) sortColumn: (id) Sender; -(IBAction) fetchRow: (id) Sender; -(IBAction) refreshResults: (id) Sender; -(IBAction) doMarkAll: (id) sender; -(IBAction) doUnmarkAll: (id) sender; -(IBAction) doDeleteMarked: (id) sender; -(IBAction) doReverseMarked: (id) sender; -(IBAction) doMark: (id) sender; -(IBAction) doUnmark: (id) sender; -(IBAction) doRecode: (id) sender; -(IBAction) doAddCode: (id) sender; -(IBAction) doShowComment: (id) sender; -(BOOL) isMarked: (int) row; -(IBAction) selectAllRecs: (id) Sender; -(IBAction) selectAdditionalRecs: (id) Sender; -(IBAction) selectRecs: (id) Sender; -(IBAction) doSelect: (id) Sender; -(IBAction) cancelSelect: (id) Sender; -(IBAction) cancelSetDateFmt: (id) Sender; -(IBAction) okSetDateFmt: (id) Sender; -(IBAction) doSetDateFmt: (id) Sender; -(void) doContWithDict: (NSMutableDictionary *) theVault; -(IBAction) clearNamedSelMenu: (id) Sender; -(void) setupTables; -(void) setDataSource: (NSString *) theData; //-(BOOL) writeToFile: (NSString *) filename ofType: (NSString *) type; -(BOOL)tableView: (NSTableView *) aTable shouldEditTableColumn: (NSTableColumn *) aCol row: (unsigned) arow; - (void)tableViewSelectionDidChange:(NSNotification *)aNotification; - (void)tableView:(NSTableView*)tableView didClickTableColumn:(NSTableColumn *)tableColumn; -(void) displaySelData; -(id) getGWorkBench: (id) who; -(void) setGWorkBench: (id) who; -(void) setMWFile: (MWFile *) who; -(MWFile *) getMWFile; -(IBAction) moveWorkBenchForward: (id) sender; - (void) moveForward; -(IBAction) showCodeBrowser: (id) Sender; -(void) setOriginalStateString; -(void) addStateString: (NSString *) what; -(void) setStateString: (NSString *) what; -(BOOL) isBlocked: (NSString *) name; -(void) setCharEngineWithSource: (id) src andFileList: (NSArray *) myList; -(BOOL) isAutoSet: (NSString *) who; -(IBAction) okNamedSelection: (id) Sender; -(IBAction) cancelNamedSelection: (id) Sender; -(IBAction) okCodeLevel: (id) sender; -(IBAction) cancelCodeLevel: (id) sender; -(NSArray *) allSummReports; -(NSArray *) mySummReports; -(void) delSummReport:(NSString *) who; -(void) addSummReport:(NSString *) who report: (NSDictionary *) r global: (BOOL) g; -(BOOL) isSummReport: (NSString *) who; -(NSDictionary *) summReport: (NSString *) who; -(int) reportScope: (NSString *) who; // 1 = local 2 = global 0 = nonexistant -(NSMutableString *) dateFormat; -(NSMutableArray *) hotData; -(NSMutableArray *) allData; -(void) rebuildSummReportMenu; -(IBAction) doFillName: (id) sender; -(NSArray *) tableColumns; -(int) fieldType: (NSString *) name; -(int) codeLevel; -(void) zeroSetStack; -(IBAction) popSetStack: (id) sender; -(void) pushSetStack; -(IBAction) popFwdSetStack: (id) sender; -(IBAction) doBrowseField: (id) sender; -(IBAction) okBrowseField: (id) sender; -(IBAction) cancelBrowseField: (id) sender; -(IBAction) selectColorFromWell:(id)Sender; -(IBAction) selectColorFromSwitch:(id) sender; -(IBAction) okSetMath: (id) Sender; -(IBAction) cancelSetMath: (id) Sender; -(IBAction) doAppendCommentToMarked: (id) sender; -(IBAction) doAddComment: (id) sender; -(IBAction) okAddComment: (id) sender; -(IBAction) cancelAddComment: (id) sender; -(IBAction) cancelSel2CodeSet: (id) Sender; -(IBAction) okSel2CodeSet: (id) Sender; -(IBAction) doSelectCodeSetDialogue: (id) Sender; -(IBAction) selCSSelect: (id) Sender; -(IBAction) selCSSelectMore: (id) Sender; -(IBAction) selCSSelectLess: (id) Sender; -(IBAction) selCSCancel: (id) Sender; -(BOOL) selectCodeSetWithName:(NSString *) who withWarnings: (BOOL) w pushStack: (BOOL) ps type: (int) tp exact: (BOOL) ex; -(IBAction) okAddRoot: (id) sender; -(IBAction) cancelAddRoot: (id) sender; -(IBAction) doAddRootCode: (id) sender; -(IBAction) toggleAddRootColor: (id) sender; -(IBAction) okDelRoot: (id) sender; -(IBAction) cancelDelRoot: (id) sender; #ifdef MULTIMEDIA -(IBAction) doMediaPlayer: (id) sender; -(IBAction) exitMediaPlayer: (id) Sender; -(IBAction) jumpMediaForward: (id) sender; -(IBAction) jumpMediaBack: (id) sender; -(IBAction) restartMedia: (id) sender; #endif @end //extern myResults *gCurrentTAMS; gtamsanalyzer.app-0.42/Source/addCode.tif0000555000175000017500000000642210162465511020642 0ustar brentbrent00000000000000MM* ǞՔ666 RRR򗗗)))444888SSS;;;%%%񸸸]]] |||666CCC휧ᝨ᰹籺簹瓚=AQ>ARµ<<=,,,???444疢ߖߪ垩ᔠv%'5'*6䫵𘞺445888eee皥ڈxr|\c((dj坣999///:::oooz+.@*-? ,&  ($&3$&3.1?օ777}}}CCC唠x+.@*-? ,&  (#&3#&3+/?׮ω'''$$$'''֏zxr|\c((_fxxᥫvz556$$$KKK۔ޔޔޔu!%2!%2t~ޗߞᶾ鋐()0aaalll 444㔠ޔޔޔޔy(+=(+=uݙ࣭㶿鋐"#)EEE'''444䔠ޔތҔޔޏtuטߞᡫ⵽誱ot $///......TTT痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱쪰hku../888TTTddd瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳{::;铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵尶KN\ 򆆆kkkߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶曡,.6++/򚚚???FFFꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決瘞+-5238::::::풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾蓚+-5-.3444???哞ܔޔޔަ䧱䩳媴孶氹絾ꚡ68B&',...GGGgggnnnꓟےۖޔޫ媳嫵孶殸沺坣kn...GGG***菛׈ͩ갹籺糼跿簶טhhhMMM@@@      @   (addCode.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/addcomment.tif0000555000175000017500000000647610162465511021443 0ustar brentbrent00000000000000MM* 88휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/addcomment.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/addmarkedcomment.tif0000555000175000017500000000650410162465511022617 0ustar brentbrent00000000000000MM* 88#########################휧ᝨ############疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪ################ت铞ܔު################تߔު################تꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ################ت################ت################ت    >  @  4 <(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/addmarkedcomment.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/addRoot.tif0000555000175000017500000000647410162465511020722 0ustar brentbrent00000000000000MM* 휧ᝨ簹氹疢ߖ䧱444矪᥯㔠ޔޖڟƭãݡ444ᖡޔޔޗׯuE\F\444ﴻ 唠ޔޔޕۯv$/;M44444dd֔ޔޟ #define SUPPORT_UTF8 #define POSIX_MALLOC_THRESHOLD 10 @class AGRegex, NSArray, NSString; /*! @enum Options Options defined for -initWithPattern:options:. Two or more options can be combined with the bitwise OR operator. @constant AGRegexCaseInsensitive Matching is case insensitive. Equivalent to /i in Perl. @constant AGRegexDotAll Dot metacharacter matches any character including newline. Equivalent to /s in Perl. @constant AGRegexExtended Allow whitespace and comments in the pattern. Equivalent to /x in Perl. @constant AGRegexLazy Makes greedy quantifiers lazy and lazy quantifiers greedy. No equivalent in Perl. @constant AGRegexMultiline Caret and dollar anchors match at newline. Equivalent to /m in Perl. */ enum { AGRegexCaseInsensitive = 1, AGRegexDotAll = 2, AGRegexExtended = 4, AGRegexLazy = 8, AGRegexMultiline = 16 }; /*! @class AGRegexMatch @abstract A single occurence of a regular expression. @discussion An AGRegexMatch represents a single occurence of a regular expression within the target string. The range of each subpattern within the target string is returned by -range, -rangeAtIndex:, or -rangeNamed:. The part of the target string that matched each subpattern is returned by -group, -groupAtIndex:, or -groupNamed:. */ @interface AGRegexMatch : NSObject { AGRegex *regex; NSString *string; int *matchv; int count; } /*! @method count The number of capturing subpatterns, including the pattern itself. */ - (int)count; /*! @method group Returns the part of the target string that matched the pattern. */ - (NSString *)group; /*! @method groupAtIndex: Returns the part of the target string that matched the subpattern at the given index or nil if it wasn't matched. The subpatterns are indexed in order of their opening parentheses, 0 is the entire pattern, 1 is the first capturing subpattern, and so on. */ - (NSString *)groupAtIndex:(int)idx; /*! @method groupNamed: Returns the part of the target string that matched the subpattern of the given name or nil if it wasn't matched. */ - (NSString *)groupNamed:(NSString *)name; /*! @method range Returns the range of the target string that matched the pattern. */ - (NSRange)range; /*! @method rangeAtIndex: Returns the range of the target string that matched the subpattern at the given index or {NSNotFound, 0} if it wasn't matched. The subpatterns are indexed in order of their opening parentheses, 0 is the entire pattern, 1 is the first capturing subpattern, and so on. */ - (NSRange)rangeAtIndex:(int)idx; /*! @method rangeNamed: Returns the range of the target string that matched the subpattern of the given name or {NSNotFound, 0} if it wasn't matched. */ - (NSRange)rangeNamed:(NSString *)name; /*! @method string Returns the target string. */ - (NSString *)string; @end /*! @class AGRegex @abstract An Perl-compatible regular expression class. @discussion An AGRegex is created with -initWithPattern: or -initWithPattern:options: or the corresponding class methods +regexWithPattern: or +regexWithPattern:options:. These take a regular expression pattern string and the bitwise OR of zero or more option flags. For example:     AGRegex *regex = [[AGRegex alloc] initWithPattern:@"(paran|andr)oid" options:AGRegexCaseInsensitive]; Matching is done with -findInString: or -findInString:range: which look for the first occurrence of the pattern in the target string and return an AGRegexMatch or nil if the pattern was not found.     AGRegexMatch *match = [regex findInString:@"paranoid android"]; A match object returns a captured subpattern by -group, -groupAtIndex:, or -groupNamed:, or the range of a captured subpattern by -range, -rangeAtIndex:, or -rangeNamed:. The subpatterns are indexed in order of their opening parentheses, 0 is the entire pattern, 1 is the first capturing subpattern, and so on. -count returns the total number of subpatterns, including the pattern itself. The following prints the result of our last match case:     for (i = 0; i < [match count]; i++)
        NSLog(@"%d %@ %@", i, NSStringFromRange([match rangeAtIndex:i]), [match groupAtIndex:i]);
    0 {0, 8} paranoid
    1 {0, 5} paran
If any of the subpatterns didn't match, -groupAtIndex: will return nil, and -rangeAtIndex: will return {NSNotFound, 0}. For example, if we change our original pattern to "(?:(paran)|(andr))oid" we will get the following output:     0 {0, 8} paranoid
    1 {0, 5} paran
    2 {2147483647, 0} (null)
-findAllInString: and -findAllInString:range: return an NSArray of all non-overlapping occurrences of the pattern in the target string. -findEnumeratorInString: and -findEnumeratorInString:range: return an NSEnumerator for all non-overlapping occurrences of the pattern in the target string. For example,     NSArray *all = [regex findAllInString:@"paranoid android"]; The first object in the returned array is the match case for "paranoid" and the second object is the match case for "android". AGRegex provides the methods -replaceWithString:inString: and -replaceWithString:inString:limit: to perform substitution on strings.     AGRegex *regex = [AGRegex regexWithPattern:@"remote"];
    NSString *result = [regex replaceWithString:@"complete" inString:@"remote control"]; // result is "complete control"
Captured subpatterns can be interpolated into the replacement string using the syntax $x or ${x} where x is the index or name of the subpattern. $0 and $& both refer to the entire pattern. Additionally, the case modifier sequences \U...\E, \L...\E, \u, and \l are allowed in the replacement string. All other escape sequences are handled literally.     AGRegex *regex = [AGRegex regexWithPattern:@"[usr]"];
    NSString *result = [regex replaceWithString:@"\\u$&." inString:@"Back in the ussr"]; // result is "Back in the U.S.S.R."
Note that you have to escape a backslash to get it into an NSString literal. Named subpatterns may also be used in the pattern and replacement strings, like in Python.     AGRegex *regex = [AGRegex regexWithPattern:@"(?P<who>\\w+) is a (?P<what>\\w+)"];
    NSString *result = [regex replaceWithString:@"Jackie is a $what, $who is a runt" inString:@"Judy is a punk"]); // result is "Jackie is a punk, Judy is a runt"
Finally, AGRegex provides -splitString: and -splitString:limit: which return an NSArray created by splitting the target string at each occurrence of the pattern. For example:     AGRegex *regex = [AGRegex regexWithPattern:@"ea?"];
    NSArray *result = [regex splitString:@"Repeater"]; // result is "R", "p", "t", "r"
If there are captured subpatterns, they are returned in the array.     AGRegex *regex = [AGRegex regexWithPattern:@"e(a)?"];
    NSArray *result = [regex splitString:@"Repeater"]; // result is "R", "p", "a", "t", "r"
In Perl, this would return "R", undef, "p", "a", "t", undef, "r". Unfortunately, there is no convenient way to represent this in an NSArray. (NSNull could be used in place of undef, but then all members of the array couldn't be expected to be NSStrings.) */ @interface AGRegex : NSObject { void *regex; void *extra; int groupCount; } /*! @method regexWithPattern: Creates a new regex using the given pattern string. Returns nil if the pattern string is invalid. */ + (id)regexWithPattern:(NSString *)pat; /*! @method regexWithPattern:options: Creates a new regex using the given pattern string and option flags. Returns nil if the pattern string is invalid. */ + (id)regexWithPattern:(NSString *)pat options:(int)opts; /*! @method initWithPattern: Initializes the regex using the given pattern string. Returns nil if the pattern string is invalid. */ - (id)initWithPattern:(NSString *)pat; /*! @method initWithPattern:options: Initializes the regex using the given pattern string and option flags. Returns nil if the pattern string is invalid. */ - (id)initWithPattern:(NSString *)pat options:(int)opts; /*! @method findInString: Calls findInString:range: using the full range of the target string. */ - (AGRegexMatch *)findInString:(NSString *)str; /*! @method findInString:range: Returns an AGRegexMatch for the first occurrence of the regex in the given range of the target string or nil if none is found. */ - (AGRegexMatch *)findInString:(NSString *)str range:(NSRange)r; /*! @method findAllInString: Calls findAllInString:range: using the full range of the target string. */ - (NSArray *)findAllInString:(NSString *)str; /*! @method findAllInString:range: Returns an array of all non-overlapping occurrences of the regex in the given range of the target string. The members of the array are AGRegexMatches. */ - (NSArray *)findAllInString:(NSString *)str range:(NSRange)r; /*! @method findEnumeratorInString: Calls findEnumeratorInString:range: using the full range of the target string. */ - (NSEnumerator *)findEnumeratorInString:(NSString *)str; /*! @method findEnumeratorInString:range: Returns an enumerator for all non-overlapping occurrences of the regex in the given range of the target string. The objects returned by the enumerator are AGRegexMatches. */ - (NSEnumerator *)findEnumeratorInString:(NSString *)str range:(NSRange)r; /*! @method replaceWithString:inString: Calls replaceWithString:inString:limit: with no limit. */ - (NSString *)replaceWithString:(NSString *)rep inString:(NSString *)str; /*! @method replaceWithString:inString:limit: Returns the string created by replacing occurrences of the regex in the target string with the replacement string. If the limit is positive, no more than that many replacements will be made. Captured subpatterns can be interpolated into the replacement string using the syntax $x or ${x} where x is the index or name of the subpattern. $0 and $& both refer to the entire pattern. Additionally, the case modifier sequences \U...\E, \L...\E, \u, and \l are allowed in the replacement string. All other escape sequences are handled literally. */ - (NSString *)replaceWithString:(NSString *)rep inString:(NSString *)str limit:(int)limit; /*! @method splitString: Call splitString:limit: with no limit. */ - (NSArray *)splitString:(NSString *)str; /*! @method splitString:limit: Returns an array of strings created by splitting the target string at each occurrence of the pattern. If the limit is positive, no more than that many splits will be made. If there are captured subpatterns, they are returned in the array. */ - (NSArray *)splitString:(NSString *)str limit:(int)lim; @end gtamsanalyzer.app-0.42/Source/AGRegex.m0000555000175000017500000004136010162465511020253 0ustar brentbrent00000000000000// AGRegex.m // // Copyright (c) 2002 Aram Greenman. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. // 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import "pcre.h" #import "AGRegex.h" #import // for finding backrefs and escape sequences in replacement string passed to -replaceWithString:inString:... #define BACKREF_PATTERN \ @"(? length) [NSException raise:NSRangeException format:@"range %@ out of bounds", NSStringFromRange(range)]; // don't match $ anchor if range is before end of string if (range.location + range.length < length) options |= PCRE_NOTEOL; // allocate match vector NSAssert1(matchv = malloc(sizeof(int) * groupCount * 3), @"couldn't allocate match vector for %d items", groupCount * 3); // convert character range to byte range range.length = strlen([[str substringWithRange:range] UTF8String]); range.location = strlen([[str substringToIndex:range.location] UTF8String]); // try match if ((error = pcre_exec(regex, extra, [str UTF8String], range.location + range.length, range.location, options, matchv, groupCount * 3)) == PCRE_ERROR_NOMATCH) { free(matchv); return nil; } // should not get any error besides PCRE_ERROR_NOMATCH NSAssert1(error > 0, @"unexpected error pcre_exec(): %d", error); // return the match, match object takes ownership of matchv return [[[AGRegexMatch alloc] initWithRegex:self string:str vector:matchv count:groupCount] autorelease]; } - (NSArray *)findAllInString:(NSString *)str { return [self findAllInString:str range:NSMakeRange(0, [str length])]; } - (NSArray *)findAllInString:(NSString *)str range:(NSRange)range { return [[self findEnumeratorInString:str range:range] allObjects]; } - (NSEnumerator *)findEnumeratorInString:(NSString *)str { return [self findEnumeratorInString:str range:NSMakeRange(0, [str length])]; } - (NSEnumerator *)findEnumeratorInString:(NSString *)str range:(NSRange)r { return [[[AGRegexMatchEnumerator alloc] initWithRegex:self string:str range:r] autorelease]; } - (NSString *)replaceWithString:(NSString *)rep inString:(NSString *)str { return [self replaceWithString:rep inString:str limit:0]; } - (NSString *)replaceWithString:(NSString *)rep inString:(NSString *)str limit:(int)lim { NSMutableString *repBuffer, *result = [NSMutableString string]; AGRegexMatch *match, *backref; NSArray *allMatches, *allBackrefs; NSRange remainRange, matchRange, backrefRemainRange, backrefMatchRange; case_modifier_t *caseModVector; int i, j, k, l, length, repLength, allCount, allBackrefsCount, caseModIdx; // set remaining range to full range of receiver length = [str length]; remainRange = NSMakeRange(0, length); // find all matches of pattern allMatches = [self findAllInString:str]; allCount = [allMatches count]; // find all backrefs/escapes in replacement string allBackrefs = [backrefPattern findAllInString:rep]; allBackrefsCount = [allBackrefs count]; repLength = [rep length]; // create case mod list caseModVector = malloc(sizeof(case_modifier_t) * allCount * allBackrefsCount); NSAssert1(caseModVector, @"couldn't allocate memory for %d case modifiers", allCount * allBackrefsCount); // while limit is not reached and there are more matches to replace for (i = 0; (lim < 1 || i < lim) && i < allCount; i++) { // get the the next match match = [allMatches objectAtIndex:i]; // build the replacement string repBuffer = [NSMutableString string]; backrefRemainRange = NSMakeRange(0, repLength); caseModIdx = 0; for (j = 0; j < allBackrefsCount; j++) { // get the next backref backref = [allBackrefs objectAtIndex:j]; backrefMatchRange = [backref range]; // append the part before the backref [repBuffer appendString:[rep substringWithRange:NSMakeRange(backrefRemainRange.location, backrefMatchRange.location - backrefRemainRange.location)]]; // interpret backref if (IS_BACKREF(backref)) { NSString *captured; int idx; if (IS_NAMED_BACKREF(backref)) { NSString *backrefName = BACKREF_NAME(backref); while ((idx = pcre_get_stringnumber(regex, [backrefName UTF8String])) == PCRE_ERROR_NOSUBSTRING && !BACKREF_IS_PARENTHESIZED(backref)) { if (backrefMatchRange.length < 3) // need at least one letter [NSException raise:NSInvalidArgumentException format:@"no backreference named %@ in pattern", backrefName]; backrefName = [backrefName substringToIndex:[backrefName length] - 1]; backrefMatchRange.length--; } } else { idx = BACKREF_INDEX(backref); // in the case of multiple digits after $, chop it down to the highest valid index while (idx >= [match count] && !BACKREF_IS_PARENTHESIZED(backref)) { if (backrefMatchRange.length < 3) // need at least one digit [NSException raise:NSInvalidArgumentException format:@"no such backreference %d in pattern", idx]; idx /= 10; backrefMatchRange.length--; } } // append the captured subpattern to ther replacement string captured = [match groupAtIndex:idx]; [repBuffer appendString:captured ? captured : @""]; // handle case modifier } else if (IS_CASE_MODIFIER(backref)) { case_modifier_t caseMod; caseMod.location = [repBuffer length]; caseMod.type = [CASE_MODIFIER_STRING(backref) UTF8String][0]; caseModVector[caseModIdx] = caseMod; caseModIdx++; // handle literal escape } else { NSAssert1(IS_LITERAL_ESCAPE(backref), @"%@ isn't a backref, case modifier, or literal escape!", backref); [repBuffer appendString:LITERAL_ESCAPE_STRING(backref)]; } // set the remaining range to the part after the match backrefRemainRange.location = backrefMatchRange.location + backrefMatchRange.length; backrefRemainRange.length = repLength - backrefRemainRange.location; } // append the remaining replacement string to repBuffer [repBuffer appendString:[rep substringWithRange:backrefRemainRange]]; // interpret case modifiers for (k = 0; k < caseModIdx; k++) { NSRange caseModRange; char caseModType = caseModVector[k].type; switch (caseModType) { case 'u': case 'l': caseModRange = NSMakeRange(caseModVector[k].location, 1); break; case 'U': case 'L': // assume case modifier applies to rest of string unless we find a terminator caseModRange = NSMakeRange(caseModVector[k].location, [repBuffer length] - caseModVector[k].location); for (l = k + 1; l < caseModIdx; l++) if (caseModVector[l].type == 'E') { caseModRange = NSMakeRange(caseModVector[k].location, caseModVector[l].location - caseModVector[k].location); break; } break; case 'E': break; } if (caseModRange.location + caseModRange.length > [repBuffer length]) continue; if (caseModType == 'u' || caseModType == 'U') [repBuffer replaceCharactersInRange:caseModRange withString:[[repBuffer substringWithRange:caseModRange] uppercaseString]]; else if (caseModType == 'l' || caseModType == 'L') [repBuffer replaceCharactersInRange:caseModRange withString:[[repBuffer substringWithRange:caseModRange] lowercaseString]]; } // append the part of the target string before the match matchRange = [match range]; [result appendString:[str substringWithRange:NSMakeRange(remainRange.location, matchRange.location - remainRange.location)]]; // append repBuffer [result appendString:repBuffer]; // set the remaining range to the part after the match remainRange.location = matchRange.location + matchRange.length; remainRange.length = length - remainRange.location; } free(caseModVector); // append the remaining string [result appendString:[str substringWithRange:remainRange]]; return result; } - (NSArray *)splitString:(NSString *)str { return [self splitString:str limit:0]; } - (NSArray *)splitString:(NSString *)str limit:(int)lim { NSMutableArray *result = [NSMutableArray array]; AGRegexMatch *match; NSArray *allMatches; NSString *group; NSRange remainRange, matchRange; int i, j, count, allCount, length = [str length]; // find all matches allMatches = [self findAllInString:str]; allCount = [allMatches count]; remainRange = NSMakeRange(0, length); // while limit is not reached and there are more matches for (i = 0; (lim < 1 || i < lim) && i < allCount; i++) { // get next match match = [allMatches objectAtIndex:i]; matchRange = [match range]; // add substring from last split to this split [result addObject:[str substringWithRange:NSMakeRange(remainRange.location, matchRange.location - remainRange.location)]]; // add captured subpatterns if any count = [match count]; for (j = 1; j < count; j++) if (group = [match groupAtIndex:j]) [result addObject:group]; // set remaining range to the part after the split remainRange.location = matchRange.location + matchRange.length; remainRange.length = length - remainRange.location; } // add rest of the string [result addObject:[str substringWithRange:remainRange]]; return result; } - (const pcre *)pcre { return regex; } @end @implementation AGRegexMatch // takes ownership of the passed match vector, free on dealloc - (id)initWithRegex:(AGRegex *)re string:(NSString *)str vector:(int *)mv count:(int)c { if (self = [super init]) { regex = [re retain]; string = [str copy]; // really only copies if the string is mutable, immutable strings are just retained matchv = mv; count = c; } return self; } - (void)dealloc { free(matchv); [regex release]; [string release]; [super dealloc]; } - (int)count { return count; } - (NSString *)group { return [self groupAtIndex:0]; } - (NSString *)groupAtIndex:(int)idx { NSRange r = [self rangeAtIndex:idx]; return r.location == NSNotFound ? nil : [string substringWithRange:r]; } - (NSString *)groupNamed:(NSString *)name { int idx = pcre_get_stringnumber([regex pcre], [name UTF8String]); if (idx == PCRE_ERROR_NOSUBSTRING) [NSException raise:NSInvalidArgumentException format:@"no group named %@", name]; return [self groupAtIndex:idx]; } - (NSRange)range { return [self rangeAtIndex:0]; } - (NSRange)rangeAtIndex:(int)idx { int start, end; if (idx >= count) [NSException raise:NSRangeException format:@"index %d out of bounds", idx]; start = matchv[2 * idx]; end = matchv[2 * idx + 1]; if (start < 0) return NSMakeRange(NSNotFound, 0); // convert byte locations to character locations return NSMakeRange(utf8charcount([string UTF8String], start), utf8charcount([string UTF8String] + start, end - start)); } - (NSRange)rangeNamed:(NSString *)name { int idx = pcre_get_stringnumber([regex pcre], [name UTF8String]); if (idx == PCRE_ERROR_NOSUBSTRING) [NSException raise:NSInvalidArgumentException format:@"no group named %@", name]; return [self rangeAtIndex:idx]; } - (NSString *)string { return string; } - (NSString *)description { NSMutableString *desc = [NSMutableString stringWithFormat:@"%@ {\n", [super description]]; int i; for (i = 0; i < count; i++) [desc appendFormat:@"\t%d %@ %@\n", i, NSStringFromRange([self rangeAtIndex:i]), [self groupAtIndex:i]]; [desc appendString:@"}"]; return desc; } @end @implementation AGRegexMatchEnumerator - (id)initWithRegex:(AGRegex *)re string:(NSString *)s range:(NSRange)r { if (self = [super init]) { regex = [re retain]; string = [s copy]; // create one immutable copy of the string so we don't copy it over and over when the matches are created range = r; end = range.location + range.length; } return self; } - (void)dealloc { [regex release]; [string release]; [super dealloc]; } - (id)nextObject { AGRegexMatch *next; if (next = [regex findInString:string range:range]) { range.location = [next range].location + [next range].length; if ([next range].length == 0) range.location++; range.length = end - range.location; if (range.location > end) return nil; } return next; } - (NSArray *)allObjects { NSMutableArray *all = [NSMutableArray array]; AGRegexMatch *next; while (next = [self nextObject]) [all addObject:next]; return all; } @endgtamsanalyzer.app-0.42/Source/AppController.h0000555000175000017500000000130410162465511021542 0ustar brentbrent00000000000000/* * AppController.h created by phr on 2000-08-27 11:38:59 +0000 * * GNUstep Application Controller * * Created with ProjectCenter - http://www.gnustep.org * * $Id: AppController.h,v 1.9 2002/01/02 12:13:06 probert Exp $ */ #import @interface AppController : NSObject { } + (void)initialize; - (id)init; - (void)dealloc; - (void)awakeFromNib; - (void)applicationDidFinishLaunching:(NSNotification *)notif; - (BOOL)applicationShouldTerminate:(id)sender; - (void)applicationWillTerminate:(NSNotification *)notification; - (BOOL)application:(NSApplication *)application openFile:(NSString *)fileName; - (void)showPrefPanel:(id)sender; - (void)showInfoPanel:(id)sender; @end gtamsanalyzer.app-0.42/Source/AppController.m0000555000175000017500000000241010162465511021546 0ustar brentbrent00000000000000/* * AppController.m created by phr on 2000-08-27 11:38:58 +0000 * * GNUstep Application Controller * * Created with ProjectCenter - http://www.gnustep.org * * $Id: AppController.m,v 1.10 2002/01/02 12:13:06 probert Exp $ */ #import "AppController.h" @implementation AppController static NSDictionary *infoDict = nil; + (void)initialize { NSMutableDictionary *defaults = [NSMutableDictionary dictionary]; /* * Register your app's defaults here by adding objects to the * dictionary, eg * * [defaults setObject:anObject forKey:keyForThatObject]; * */ [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; [[NSUserDefaults standardUserDefaults] synchronize]; } - (id)init { if ((self = [super init])) { } return self; } - (void)dealloc { [super dealloc]; } - (void)awakeFromNib { } - (void)applicationDidFinishLaunching:(NSNotification *)notif { } - (BOOL)applicationShouldTerminate:(id)sender { return YES; } - (void)applicationWillTerminate:(NSNotification *)notification { } - (BOOL)application:(NSApplication *)application openFile:(NSString *)fileName { } - (void)showPrefPanel:(id)sender { } - (void)showInfoPanel:(id)sender { [[NSApplication sharedApplication] orderFrontStandardInfoPanel:sender]; } @end gtamsanalyzer.app-0.42/Source/appDelegate.h0000555000175000017500000000317010162465511021174 0ustar brentbrent00000000000000/* appDelegate */ #import #import #import "prefBoss.h" #import "codeBrowser.h" #import "myProject.h" @interface appDelegate : NSObject { prefBoss* pb; codeBrowser *cd; IBOutlet NSMenuItem *codeSetMenu; IBOutlet NSMenuItem *rsltCodeSetMenu; IBOutlet NSMenuItem *rebuildMenuItem; IBOutlet NSMenuItem *namedSelectionMenu; IBOutlet NSMenuItem *autoSetMenu; IBOutlet NSMenuItem *reanalysisMenu; IBOutlet NSMenuItem *fileSetMenu; IBOutlet NSMenuItem *summReportMenu; IBOutlet NSMenuItem *docMacroMenu; IBOutlet NSMenuItem *workMenu; IBOutlet NSMenuItem *caseMenuItem; IBOutlet NSMenuItem *toggleShowTagsMenuItem; IBOutlet id delWorkMenu; IBOutlet id delWorkPanel; } //- (void)applicationDidFinishLaunching:(NSNotification *)aNotification; - (void)applicationWillFinishLaunching:(NSNotification *)aNotification; - (NSMenuItem *) rebuildMenuItem; - (void) doPreference: (id) sender; - (NSMenuItem *) namedSelectionMenu; - (NSMenuItem *) autoSetMenu; -(NSMenuItem *) reanalysisMenu; -(NSMenuItem *) codeSetMenu; -(NSMenuItem *) fileSetMenu; -(NSMenuItem *) summReportMenu; -(NSMenuItem *) rsltCodeSetMenu; - (void) doCodeDictionary: (NSMutableDictionary *) cl from: (myProject *) who; -(NSMenuItem *) docMacroMenu; -(NSMenuItem *) caseMenuItem; -(NSMenuItem *) toggleShowTagsMenuItem; -(IBAction) clearAllWorkItems: (id) sender; -(IBAction) okRemoveWorkItem: (id) sender; -(IBAction) removeWorkItem: (id) sender; -(IBAction) cancelRemoveWorkItem: (id) sender; -(IBAction) deleteAllWorkItems: (id) sender; -(IBAction) addWorkItem: (NSString *) path; @end gtamsanalyzer.app-0.42/Source/appDelegate.m0000555000175000017500000003354110162465511021206 0ustar brentbrent00000000000000#import "appDelegate.h" #import "myProject.h" #import "utils.h" #import "TAMSCharEngine.h" NSString * TAWorkItems = @"The items that appear in the work menu"; #define WORKBASE 4 int pathNameComp(id first, id second, NSString *key) { return [[first lastPathComponent] compare: [second lastPathComponent] options: NSCaseInsensitiveSearch]; } @implementation appDelegate //- (void)applicationDidFinishLaunching:(NSNotification *)aNotification - (id) init { [super init]; return self; } - (NSMenuItem *) reanalysisMenu { return reanalysisMenu; } - (NSMenuItem *) docMacroMenu { return docMacroMenu; } - (NSMenuItem *) toggleShowTagsMenuItem { return toggleShowTagsMenuItem; } - (NSMenuItem *) codeSetMenu { return codeSetMenu; } - (NSMenuItem *) summReportMenu { return summReportMenu; } - (NSMenuItem *) rebuildMenuItem { return rebuildMenuItem; } - (NSMenuItem *) autoSetMenu { return autoSetMenu; } - (NSMenuItem *) fileSetMenu { return fileSetMenu; } -(NSMenuItem *) rsltCodeSetMenu { return rsltCodeSetMenu;} -(NSMenuItem *) caseMenuItem {return caseMenuItem;} - (NSMenuItem *) namedSelectionMenu {return namedSelectionMenu;} - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { //Must replace this with unsaved files.... [gWorkBench back]; // return NSTerminateLater; if(NSYESNOQUESTION(@"Have you saved all your documents? Should I quit?\n(Yes means unsaved changes will be lost)")) return NSTerminateNow; else return NSTerminateLater; } #define NSDEF [NSUserDefaults standardUserDefaults] - (void)applicationWillFinishLaunching:(NSNotification *)aNotification { //handle user defaults if(!pb) pb = [[prefBoss alloc] init]; if([NSDEF objectForKey: TADateStampKey] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TADateStampKey]; if([NSDEF objectForKey: TAPromptKey] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAPromptKey]; if([NSDEF objectForKey: TAMacNLKey] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TAMacNLKey]; if([NSDEF objectForKey: TAAutoReloadKey] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAAutoReloadKey]; if([NSDEF objectForKey: TACodeFromList] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TACodeFromList ]; if([NSDEF objectForKey: TACheckCodeDefinition] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TACheckCodeDefinition ]; if([NSDEF objectForKey: TAUseToolTip] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TAUseToolTip ]; if([NSDEF objectForKey: TACountSections] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TACountSections ]; if([NSDEF objectForKey: TAHCLStackSize] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 6 forKey: TAHCLStackSize ]; if([NSDEF objectForKey: TAUseCoder] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TAUseCoder ]; if([NSDEF objectForKey: TAAutoBackspace] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TAAutoBackspace ]; if([NSDEF objectForKey: TACoderID] == nil) [[NSUserDefaults standardUserDefaults] setObject: @"" forKey: TACoderID ]; if([NSDEF objectForKey: TAGGVDir] == nil) [[NSUserDefaults standardUserDefaults] setObject: @"/usr/X11R6/bin/gv" forKey: TAGGVDir ]; if([NSDEF objectForKey: TAGDotDir] == nil) [[NSUserDefaults standardUserDefaults] setObject: @"/usr/bin/dot" forKey: TAGDotDir ]; if([NSDEF objectForKey: TAGUseGV] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAGUseGV ]; if([NSDEF objectForKey: TAAVCode] == nil) [[NSUserDefaults standardUserDefaults] setObject: @"_time" forKey: TAAVCode ]; if([NSDEF objectForKey: TAShowCoder] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAShowCoder ]; if([NSDEF objectForKey: TAEOFIsEnd] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAEOFIsEnd]; if([NSDEF objectForKey: TACommentForCode] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TACommentForCode]; if([NSDEF objectForKey: TAZapUnivAtEOF] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAZapUnivAtEOF]; if([NSDEF objectForKey: TASaveGraphviz] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TASaveGraphviz]; if([NSDEF objectForKey: TAMetaColor] == nil && [NSDEF objectForKey: TADefaultUnstruct] == nil) //this is basically checking for a previous install { [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TADefaultUnstruct]; } else { if([NSDEF objectForKey: TADefaultUnstruct] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TADefaultUnstruct]; } if([NSDEF objectForKey: TAScanInit] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAScanInit]; if([NSDEF objectForKey: TATimeFormatHHMMSS] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TATimeFormatHHMMSS]; if([NSDEF objectForKey: TACodeAV] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TACodeAV]; if([NSDEF objectForKey: TAAVBackspace] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 3 forKey: TAAVBackspace]; if([NSDEF objectForKey: TAMetaColor] == nil) { NSData *dd; dd = [NSArchiver archivedDataWithRootObject: [NSColor blackColor]]; [[NSUserDefaults standardUserDefaults] setObject: dd forKey: TAMetaColor]; } if([NSDEF objectForKey: TARealColor] == nil) { NSData *dd; if([NSDEF objectForKey: TATagColor] == nil) { dd = [NSArchiver archivedDataWithRootObject: [NSColor blackColor]]; [[NSUserDefaults standardUserDefaults] setObject: dd forKey: TARealColor]; } else { dd = [NSArchiver archivedDataWithRootObject: getColorForInt([gPrefBoss tagColorValue])]; [[NSUserDefaults standardUserDefaults] setObject: dd forKey: TARealColor]; } } if([NSDEF objectForKey: TAAutoColor] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAAutoColor]; if([NSDEF objectForKey: TAEscapeBraces] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAEscapeBraces]; if([NSDEF objectForKey: TANonSimpleRepeat] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TANonSimpleRepeat]; if([NSDEF objectForKey: TABatchOpenFiles] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TABatchOpenFiles]; if([NSDEF objectForKey: TAEnableBack] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAEnableBack]; if([NSDEF objectForKey: TAGuessUpdate] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TAGuessUpdate]; if([NSDEF objectForKey: TADetachedSheet] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TADetachedSheet]; if([NSDEF objectForKey: TAZoomFactor] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 25 forKey: TAZoomFactor]; if([NSDEF objectForKey: TAUnichar] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 608 forKey: TAUnichar]; if([NSDEF objectForKey: TATagColor] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 0 forKey: TATagColor]; if([NSDEF objectForKey: TAScanForLN] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TAScanForLN]; if([NSDEF objectForKey: TACancelAfterAddCode] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TACancelAfterAddCode]; if([NSDEF objectForKey: TACancelAfterRecode] == nil) [[NSUserDefaults standardUserDefaults] setInteger: 1 forKey: TACancelAfterRecode]; if([NSDEF objectForKey: TAWorkItems] == nil) { NSData *dd; dd = [NSArchiver archivedDataWithRootObject: [NSMutableArray array]]; [[NSUserDefaults standardUserDefaults] setObject: dd forKey: TAWorkItems]; } [[NSWorkspace sharedWorkspace] findApplications]; //initSearchListSystem(); //if([NSDEF objectForKey:TASavedState] == nil) [wb zapStates: self]; } - (void) doCodeDictionary: (NSMutableDictionary *) cl from: (myProject *) who { NSModalSession td; if(!cd) cd = [[codeBrowser alloc] init]; [cd setDict: cl from: who]; td = [NSApp beginModalSessionForWindow:[cd window]]; while([NSApp runModalSession: td] == NSRunContinuesResponse) ; [NSApp endModalSession: td]; //[cd showWindow: self]; } -(NSMutableArray *) getWorkItems { NSMutableArray *swi=[NSMutableArray array];; NSData *dd = [[NSUserDefaults standardUserDefaults] objectForKey: TAWorkItems]; NSArray *wh = [NSUnarchiver unarchiveObjectWithData:dd]; FORALL(wh) { if([[NSFileManager defaultManager] fileExistsAtPath: temp] == YES) [swi addObject: temp]; } ENDFORALL; //swi = [NSMutableArray arrayWithArray: wh]; [swi sortUsingFunction: pathNameComp context: nil]; return swi; } -(void) setWorkItems: (NSArray *) xwi { NSMutableArray *wi; NSData *dd; wi = [NSMutableArray arrayWithArray: xwi]; [wi sortUsingFunction: pathNameComp context: nil]; dd= [NSArchiver archivedDataWithRootObject: wi]; [[NSUserDefaults standardUserDefaults] setObject: dd forKey: TAWorkItems]; } -(void) rebuildWorkMenu: (NSMenu *) myMen atBase: (int) nn withAction: (BOOL) act withExistCheck: (BOOL) exist { int n,i; NSMutableArray *wiArray; n = [myMen numberOfItems]; for(i = n-1; i >= nn; i--) { [myMen removeItemAtIndex: i]; } wiArray = [NSMutableArray arrayWithArray: [self getWorkItems]]; [wiArray sortUsingFunction: pathNameComp context: nil]; FORALL(wiArray) { NSMenuItem *mm; if(exist) if([[NSFileManager defaultManager] fileExistsAtPath: temp] == NO) continue; mm = [[NSMenuItem alloc] init]; [mm setTitle: [temp lastPathComponent]]; if(act) { [mm setTarget: self]; [mm setAction: @selector(loadWorkItem:)]; } [mm setTag: __i]; [myMen addItem: mm]; } ENDFORALL; } -(IBAction) clearAllWorkItems: (id) sender { if(NSYESNOQUESTION(@"Remove all work items?") == NO) return; [self setWorkItems: [NSMutableArray array]]; [self rebuildWorkMenu: [workMenu submenu] atBase: WORKBASE withAction: YES withExistCheck: YES]; } -(void) delWorkDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSMutableArray *wi = [self getWorkItems]; int m; switch(returnCode) { case 1: //delete the selected item; m = [[delWorkMenu selectedItem] tag]; [wi removeObjectAtIndex: m]; [self setWorkItems: wi]; [self rebuildWorkMenu: [workMenu submenu] atBase: WORKBASE withAction: YES withExistCheck: YES]; break; case 2: //delete all items; [self setWorkItems: [NSMutableArray array]]; [self rebuildWorkMenu: [workMenu submenu] atBase: WORKBASE withAction: YES withExistCheck: YES]; break; default: ; } } -(IBAction) loadWorkItem: (id) sender { [[NSDocumentController sharedDocumentController] openDocumentWithContentsOfFile: [[self getWorkItems] objectAtIndex: [sender tag]] display: YES]; } -(IBAction) cancelRemoveWorkItem: (id) sender { [delWorkPanel orderOut: sender]; [NSApp endSheet: delWorkPanel returnCode: 0]; } -(IBAction) okRemoveWorkItem: (id) sender { [delWorkPanel orderOut: sender]; [NSApp endSheet: delWorkPanel returnCode: 1]; } -(IBAction) deleteAllWorkItems: (id) sender { if(NSYESNOQUESTION(@"Remove all work items?") == NO) return; [delWorkPanel orderOut: sender]; [NSApp endSheet: delWorkPanel returnCode: 2]; } -(IBAction) removeWorkItem: (id) sender { if([[self getWorkItems] count] == 0) return; [self rebuildWorkMenu: [delWorkMenu menu] atBase: 0 withAction: NO withExistCheck: NO]; [NSApp beginSheet: delWorkPanel modalForWindow: nil modalDelegate: self didEndSelector: @selector(delWorkDidEnd:returnCode:contextInfo:) contextInfo: nil];} -(IBAction) addWorkItem: (NSString *) path { NSMutableArray *wi; wi = [self getWorkItems]; if(addUniqueToArray(wi, path) == YES) { [self setWorkItems: wi]; [self rebuildWorkMenu: [workMenu submenu] atBase: WORKBASE withAction: YES withExistCheck: YES]; } } - (void) doPreference: (id) sender { if(!pb) pb = [[prefBoss alloc] init]; [pb showWindow: self]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [self rebuildWorkMenu: [workMenu submenu] atBase: WORKBASE withAction: YES withExistCheck: YES]; } -(IBAction) aboutApp: (id) sender { NSMESSAGE(@"GTAMSAnalyzer version .42\n(c) 2004 by Matthew Weinstein\nIncludes:\nAGRegex (c) Aram Greenman\nPCRE (c) Philip Hazel\nGorm fixes by Rob Burns"); } @end gtamsanalyzer.app-0.42/Source/autoset.png0000644000175000017500000004623310162465511021010 0ustar brentbrent00000000000000PNG  IHDR3$LbIDATx-xW0lfxQ2h-f2͇$6Zf$6f#e2lF #aY2hLf@E>?uNWwu߹Zo~NUWy9OO:N~G;FOW4;Jrs5=ysi8ϻoLn4hj4t5m[u_O3T)ofwyɒs4[[Rkў~ۧ;7WnO%?Cγ=Us4W{mfx~Χ}[OWѣG;nr/윚o¹׶ifgw;7WwNgl_~f!p=pT [ؾާwGrfj/_Gv5ħfLO;n^nn4K|ӟ%\Ե}_m]QU>Mg/s޵NM{jGgB4}oMx5Zd5(~:Z9~r~M%|n}xx'֙3{3/n[m}sw޵7We?n}5߾C%-9v^b{}v}3uu ڹy~{"?]͞bk5w|n_xM^+<=˟?5{7Z?ӯ^xr/]sxMM^&S7%ZO1~ZrTs)95O4iTǾ5߭n15t-/vyc?P'Nps~תwݗ 5Ob_ {-za6e{{K~apgy~]{[>OMujε9JvWI]Tu);RK}n0-6m|װӵR%rR[׻lSg.Ζ]t^u%_ujS۞?s/3/ xhI̻Ato^zjLşƂ%1]I~s;(}ȵx;1yt sy]^IP>_{!\__F}߉vy}ߖnnlj`IWojSgkiI|SNq}G>^s L'u r].wM(YOpp\:I~j!Oֻ`D؅[3;l*lj9ۑݶ撖D٥,&((%7'tzTA*0vdLԜ>Cz vOSԯ=ܢ\dl0E}[5gTDz]يeWvM uuJDaO/=ڱOo;0vKc=.=}o?2JAVswWH}ˎԀGéˌ :6n?IeteGA\@!\f(v%_֣۟B0%֘|UyFFAjv%w[%CR%#LJ.3N/RJ?qKu}eŻPMvs] kt--쮎P2SН)3H_n+I%Ƕ8:AP\ҘtY9=rg J3Exk;C_baxdl|.C:@@@gW%٥MwN{;!ha`tQ錀;k͇o~i{RlA{ٹuzć.=?=G7;?=col+}Ił [khjce+:c5%Eùc&+u.v?]QJձnzI/unύSB>`[>'kK˓Sokjuụow?OݙPR_Sjr%`jt?+ =Zϟ?x<?]q8υd(\`V%v|Z͝؅&}"'H1ϩ!6&. >.7FJ wOkòN|y_r_Xl d<5!]cs cPB/E]bMg>%5e(,_fL'Iw욧Ķbv83_ Ez>|mwx׆t=N{bx;} a۔3cy?^`>/3r7&Įo-=EKf5ݹ'~ ϛe}_?+Ƕ=ިJY|ȩd}R `A %ɺPV?_!uLtו/_#Z*,kunNQ Mn>Cۣ;,U27? V~ϟ?Y*L%N9}}B|[w'ezY~^.N<ݗ /?Z2]h*6t=Mwx^"7QeEVQ#s0{Άɛ k8a`||{,G$ +DH?{rrAB}ѕ0=h4槛nnnnܿ{{| =fy4lDt 7P4q7͇oRW7/މ5HajCQlS+VO(}YZ돻"B7 Cv=2I]/^f]3CA|[5zvwѥ u. jgը~Aꪓ]WF 3R Wp>%]eIȮ\X`{rOwaw0 ]e\ ]+~Bw˯ּFGZSu!\vLɷď̗RȩB*A "]!%Y 'J'7Kwإ0ܗߎe4NdSO 5R!؅,{#Il ば9նl/3b4;bDtMc.|0w=o!vM_iksښn<·o~ _l RAy{G j"PhPmplro* afA wpk#OrHy3,J͗eC:#lz52]ReW;Ԡ+{nG׃Dxg%ϥ[ReEOfz}<=<) ~uJkRbν26좬g}B:O!m (ljBxc1{Pӑ+Ua"H}믩ht%Z^6j/|hkؒqeaM^l(N_ gT<.UN;@x!~d͆?R{;}i$`z;DEg5w0%Ɗ)tŇ!ljla:?~02W v,x!?!\n, v䤆H Bk" H+(GU",8[0_6u$yѕw/ڥoKrëv~cp R.L9L;NB]?.ri]W|.\RRx4Pc61N_U.]>aG|+}!0sna{ MmcX{.h޻>[tC:Ж4딡uSwBGggϥ?GE8Xn@W/?W}J{/9Һo5ҥk]_1~t{IX1钊e%tqbUS܅H%'nwM RsK +Lk ? Ê @C;!?f.a-5$!5d(B 6j0tOa| =7Tnٓz|\2?Rk|q> aGYK+,H+Kj)Xte7 a8]oFH].Y|%/̿uXS= O-_za:k`t̺つ:k\܇y 1 yw=! P~e[Rէڪ(|Rg{->!UR*yr1\7c* aYtܓ҂'\,uA%]C;!=7wJeG֥ٓvg. S>KoE:&;Nz&t$&ta!a|??Tm !F W򖇶y6R.|8[A?\(c'^_ܵ mnBm%{khk+$DzBUL]5JUJA+\R G<ί [_+n((ܾ!wtOUUx ,(X0"0|^ks_g7A3^W*nůXؔO%'P^_R{5ST+sI 1W,70Pruբk{]|}D13OmjܐPTٙ$~~gؙg_闛JH .>gb-oy/|=7BIBIC%J[G7߱([뾡 ׫?NvcGTj|:RzCܾ=/N)̧o+s oR-i8U%߮ggNKr ʟlB Fѓӻr]GM0D}*{#t,[*g!z9V !~ [vU !#xt^C{YV?"D濲ubjbח`v2{eEKB "DgpztY큮+Y\40'u^j2u%SV?>]eRWf#J:%5>Rs㿉D+r/uƶ122 [oymy Cp?L'XdNձNi*$zW2!aNZ,B?ꦗ\{Z6bJg/*hw>!r~wKNeS_v|g 1 ]GWz JҲ>糨5y8LW=Vρ9Q7_m~<߯ryU{5Ybx|Gw_|Y{cXY5ζWi.o)k;VѦڛiڽc!gs]geo2濎U^绞Mu/C2888r Z @5PM@&TP (j_he8::\\\wwwPk'?:yOOg_>Lhty_?*ɫ?>=}ūZaҪK<;?y6%0hGGG(?e4*[~|O:|m&"i WdyO?qǗk>xuqч_V ?쵎#dyF/FM~o;k: F .0;0]kh_>o}t>Tϟ޽xqɲ[&wOO^N޿x4ί}amՒcc]:k_^w .0tj(5&+vzz:m}/\G;l{IMW|y-mz|ǗO~gçjQZ&h2Am~9yCn 2SNXG>=`t6tv[]M)-nɷӴ_/>忟lMÃi~?_G_qE-SOO>=}O/O?<DVyT,UkLk_*[o)0d<ДKMY,ps(O֔f㿜\M磝W{~~d)_/s/G_,_ImE\jꏊjOYʯjZ/_r/ O'eDyKS7ϟ?ޤes>cɷ>w200O==ۣO?_F~[&oѷ_83OIsjմL}Zf-n?<javT(o~kFӞ|Jڊ܆-jM8o?~7OGGoFoFol~U3B~-aʖI~zwFߍ'/뿾ϯ*)1j\AW6-(*/oHL2(L f=BeomJ ^+ϔ̜~uW&Mί'p-/'ɇv k W;{W˷E0,KP>.ϬEkڟ2 nI}gpj5z _7!#^+ON-eQs.7{绣7\_NwwvFOW25?>^N>>~|Z^*齶 UKּdK˷7?z_|?l=z7z72YzQƒa ۲;uVލoJ>O_k x8Ğome3}_?߶ǗMa’.#6wrL{z:zwm}ﶾӧk2y>{ݽ>_>=5>};UWm眶o[?lg?SOYb@$Jaĺl y{k@|7ONF?'~)r4h|mv.GǗ_?t]{Vok f \MnBmYEI ،LmJ n}r7?vxh/=Oߏuꚶ se8::j}qtqtqMZhllwjʒikۓ8eګlD(_OF_O~~vΓ';OQ<Mf ` -JSaaA < 9Z2Z#&BVM@`C 䠵M@`5Z`šv䵑@5 Kwwwx8$[ mWy$C&DCP[BkoFkkU l]P`NkwO P͐ fՌZvt@HuSOCS2h:Ps%Mvԩ볽m@@Hjü܌ut|"rT~=KtL2{,2 nI}gpt-~~{u{/JT}7?e~` 3ee y@ɿCS׶=ږoJ桙hs+n~`y97ӷ[ԷӄaG>!C3ea{yh䷇#x,KڤϓU{!l|vY<%s j2~Ie#dAvd3./-V,巛%|3tJZ;{ 6|R~k0 (ܛػ=eg9V um~}Q=LiP4PK)PX /wO20 l @5OPVJrֶA@XɱZ[l`E$jmm IMj @5PM@&TB,vhr5` (,xr<9жzkzvX888\Ͳ%@ ۍ!nVdQmqteh(La5e (j 0hx<o޲u(#eϴ_-Wzizoj:?sS `-C M_8MչrPB ˇ-C];  sR||nk Mk.H7?ey%KϹI˗^_!,,h&y)S׶vJࡑvAy=J(tS0d=owS ;9Jr1J\;|"Yvw-/w|ڶZ&`-`3/T3nͳ[meI#0L%4 yXI^@m;'iv@8MZCgCD،@!)g t!0WǻBwɐ`-6ւLе.S𐥆:굟LΌH RUsJ Z Cy_n8q)0O,P>K鳽C/ /d)YPfjؗ|KWpʒⅵ[6<Ȳ5x,m)|w_2hXPL>A j0ܯewp}p}p=9M@@! ^ PXէIX,Y !5j2nxMnŸOI0PFF4;yw/7^z1us v`PM@"[O斮~ ږ]$@w)oAC=}[l5etPu& H;G|+?M>-dM(Y2y^(22.q|G|[c֗ :%]4˿U2M~>ەZY2e~mK|p΋ZVQj) `P_Z-{ۇ:R/wcGۡeن0 t)|!?Mu57)6Zj(P}꟮KױSMz^)Z@H9/c~Y>|MjZ:@Zr7f!_^^j:::ߚO'M {廗[W/^xf?}p4暵www69M>Kikm<zThve(V>p@F yܗ[C@4a&Ej H 6!4EץY$foi==j ** ()1m֥@:*)"gR .1l2zDH-)rQYͶ,o==>T>2γd˳lky`S ()JMS,O_R氼mY^ܫ:J$5քEk0 (,@g_z.cmKbiŮbmyJ4E$0Ηm)O_}wm J1nsy a!TGqe&lKXMOem*׭ryxd(̩{|y|yNDodޮ>ۻu?E8Z;0ceh&Ǔq^{ՋW/^5]o˽7g)YCY G!@5PMQF$/ix<(Dyyj(j @5PM@&TP (j @5PM@&TP} B{g{g{glx<_^^j j ($M&G#l-@<j @5567o[U[ VEVI@`J *Q&CfXA08|ɯm{e/M%0T)KV4X  @/aO;ːs~iJܗȢv`T;pvRJ.hB)042̩Eon9OjUzH-B2ꢧ)TRTpv`8z)~LfO/PM@` `%m"1v O PM@&TP (j @5PM@&TP (j @5 www9\\\kg֗@hr49Zηηη&Ǔ`}TP7)w=7g\^^ b(D g8kxjCPMK%)ӄ󟴿[,jSnK}Rk^>׳v//{`S ( Hyg8>pΒj~霗ȯykٖeO$3_K<aP:f^|eyz.cMjsyGyTjN#)fz|o/\eHyK. 5vRXxrܴ^{%xՋWIo0|rlllr49-oY}5 w%h1Ҿ3#:2 y';XG gggMJX>AP8>>>8<8<Љ5j @5PM@&TP (j @/4@hllls???;>>/hroooM'ǓÃÃC- 2&C`B^ 0 AtV` yPXc@0!?=}~n|fP*||^([{% 6Pcnb;BS`dL25B<42R32O[(/JKF@`Jj\2eꯂ!+S`PH:::Z8Y@ gggxݷEeP8>>>8<8<5j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5PM@&TP (j @5P M/^xv`3(,{Gף*K(,3 (,hr49l*Ej @5PMQƥ;;x<888604 K~puuemmxoq^`PM@&TP (g7\Zݒ);7!P&y#J ]`(aZ7`jgR`5g|@!kV2ee΢!Ki^f0ؐ> %^NrV2e^sh]S 5ZpusDC#0[1h.60Mj 0Q iɫ-9*P*4"6C"6 @5!Ktuuemz-PB@a)xJHuSUvWi]LPHE4Y>'߽Iu#J՞OeK ;-Jul",@j( N~CI. /+쮗,k۾m9'€-j:.wQv l6C'54||~h8OSOuY /Pփw}h@*Dd5"VC@a@J:%R+/ j<X65g5Uvt  R25{R/P@_-j7qp}p}p`y:9www69MC O'Ι^`Ɔ<j @5E i<cP2zQ E@a@R<tXEj 7oO$K72m].I@(#gJ3spSIZv_Ԯ[Z-j{,?@C@ %[w,R?ɷI׿<5'塄m_91ӧ6CV|˺^/c KZE)ϏX~< T(O5_'%/[`o (!CwJ>o,qnp:YgkX\+ *Q9?̷ܿ,j=+ʘ7?ڵ@cy&GѢyuu59Oee\a!k4 y0 MG;0| $h O@aT:` TP (j fyeۿЌ///Y5!hry6U2 +8, Y)Cax<JaPϟ?y>9}r'zRom&D} < 0_BJyt?OyϧOOϡy.6/۹ɇ9/Y 0L P%l~[dPaB A>mJI %,)nةk/1 *,sK?/$SV?ϷR\^$0MB2B |1.vKO ZvSTW׼I@aR mJXT'-Oy-۩קd[]%OvuJaP|BUpXږp!lcj XԞä( 0PBg]lzz.q0"QFM 2q!]҃n|y’喬s~9׮-%XI2(Y5 0LcC.xr<9^9`%=MCPB d 45^{ۨ[|0P&$,R];ZAáPjP0{Є}*5X ,bohX_V,X<[>qC@5PM@&s_9,vʇ[`pJn_{b3g/kۼ 2n8y 1.€P`mC-0RԖo0E@X"uk~|Ur}2|`ʛ.sh2@N P7%PB Y? U!d k琿 0@S>`j^e(2Ů0PW>&K-P$>OYݒ)WC@*SrSV`j|ϔ}s5KY%7+:PC&6̌BPMQFvXG Pͭ7vX_ P,W;(#PM@&TP (j @/4ηηη,x< ݽݽ(77g u_||vaTP (j @k~uIENDB`gtamsanalyzer.app-0.42/Source/autoSet.tif0000555000175000017500000000642210162465511020743 0ustar brentbrent00000000000000MM* _^^xww휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰>==ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު4P۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪p{瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ      @   (autoSet.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/background.tif0000555000175000017500000000647610162465511021447 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻唠ޔޔޔޔޔޜᛦꮵ׺֔ޔޔޔޔޙߘߘߘߜᴽ誱ҳ۔ޔޔޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔޔޔޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔތҔޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵ߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾哞ܔޔޔަ䧱䩳媴孶氹絾ꓟےۖޔޫ媳嫵孶殸沺菛׈ͩ갹籺糼跿    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/background.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/basicTag.tif0000555000175000017500000000647410162465511021043 0ustar brentbrent00000000000000MM* 瓓wwwOOO휧ᝨ᰹籺簹篸殸氹簹絾===ZZZ瓓qqq:::疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵777)))WWW磣ooo矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰Ԥ444999999ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻ݼӅkkk唠ޔޔޔޔޔޜᛦꮵטCCC111֔ޔޔޔޔޙߘߘߘߜᴽ誱ҒBBC111ppp۔ޔޔޔޔޔޔޓޓޗߞᶾ骰ѵܑ VVV(((㔠ޔޔޔޔޔސݏݐݑݙ࣭㶿骰Ѽ||} ggg666䔠ޔތҔޔޔޏݐݔޘߞᡫ⵽谷حmmmddd痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱jjjggg瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳춽ߒ**+... &&&铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵얛'(+ hhhKKKߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶} fffSSS }}}ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決챸܍def 풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾\\^ZZZ򅅅"""哞ܔޔޔަ䧱䩳媴孶氹絾뷾kn|%%%333&&&ꓟےۖޔޫ媳嫵孶殸沺 000444菛׈ͩ갹籺糼跿찷WZj Y[b///jjjvvv666nnn}}}[[[111 ttt└...{{{ɯ    6  @  , 4(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/basicTag.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/basicTag2.tif0000555000175000017500000000647610162465511021127 0ustar brentbrent00000000000000MM* 瓓wwwOOO휧ᝨ᰹籺簹篸殸氹簹絾===ZZZ瓓qqq:::疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵777)))WWW磣ooo矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰Ԥ444999999ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻ݼӅkkk唠ޔޔޔޔޔޜᛦꮵטCCC111֔ޔޔޔޔޙߘߘߘߜᴽ誱ҒBBC111ppp۔ޔޔޔޔޔޔޓޓޗߞᶾ骰ѵܑ VVV(((㔠ޔޔޔޔޔސݏݐݑݙ࣭㶿骰Ѽ||} ggg666䔠ޔތҔޔޔޏݐݔޘߞᡫ⵽谷حmmmddd痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱jjjggg瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳춽ߒ**+... &&&铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵얛'(+ hhhKKKߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶} fffSSS }}}ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決챸܍def 풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾\\^ZZZ򅅅"""哞ܔޔޔަ䧱䩳媴孶氹絾뷾kn|%%%333&&&ꓟےۖޔޫ媳嫵孶殸沺 000444菛׈ͩ갹籺糼跿찷WZj Y[b///jjjvvv666nnn}}}[[[111 ttt└...{{{ɯ    7  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/basicTag2.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/bookmarkInfo.h0000555000175000017500000000061510162465511021403 0ustar brentbrent00000000000000// // bookmarkInfo.h // TamsAnalyzer // // Created by matthew on Sun May 12 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import @interface bookmarkInfo : NSObject { NSMutableString *identifier; int location; } -(void) setLocation: (int) l; -(void) setIdentifier: (NSString *) s; -(int) bmLocation; -(NSString *) identifier; @end gtamsanalyzer.app-0.42/Source/bookmarkInfo.m0000555000175000017500000000103610162465511021406 0ustar brentbrent00000000000000// // bookmarkInfo.m // TamsAnalyzer // // Created by matthew on Sun May 12 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import "bookmarkInfo.h" @implementation bookmarkInfo -(id) init { self = [super init]; identifier = [[NSMutableString alloc] init]; return self; } -(void) setLocation: (int) l { location = l; } -(void) setIdentifier: (NSString *) s { [identifier setString: s]; } -(int) bmLocation { return location; } -(NSString *) identifier { return identifier; } @end gtamsanalyzer.app-0.42/Source/chartables.c0000555000175000017500000001555510162465511021076 0ustar brentbrent00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This file is automatically written by the dftables auxiliary program. If you edit it by hand, you might like to edit the Makefile to prevent its ever being regenerated. This file is #included in the compilation of pcre.c to build the default character tables which are used when no tables are passed to the compile function. */ static unsigned char pcre_default_tables[] = { /* This table is a lower casing table. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122,123,124,125,126,127, 128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151, 152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167, 168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183, 184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199, 200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231, 232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247, 248,249,250,251,252,253,254,255, /* This table is a case flipping table. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122, 91, 92, 93, 94, 95, 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, 128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151, 152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167, 168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183, 184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199, 200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231, 232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247, 248,249,250,251,252,253,254,255, /* This table contains bit maps for various character classes. Each map is 32 bytes long and the bits run from the least significant end of each byte. The classes that have their own maps are: space, xdigit, digit, upper, lower, word, graph print, punct, and cntrl. Other classes are built from combinations. */ 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* This table identifies various classes of character by individual bits: 0x01 white space character 0x02 letter 0x04 decimal digit 0x08 hexadecimal digit 0x10 alphanumeric or '_' 0x80 regular expression metacharacter or binary zero */ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ 0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ 0x12,0x12,0x12,0x80,0x00,0x00,0x80,0x10, /* X - _ */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ /* End of chartables.c */ gtamsanalyzer.app-0.42/Source/codeBrowser.gorm/0000755000175000017500000000000010162465511022027 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/codeBrowser.gorm/data.classes0000644000175000017500000000754011062075652024330 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "doClearDef:", "doSaveDef:", "doRestoreDef:", "doDeleteDef:", "doCloseDef:", "selectColorFromWell:", "selectColorFromSwitch:", "removeAllColors:" ); Super = NSObject; }; codeBrowser = { Actions = ( "doClearDef:", "doSaveDef:", "doRestoreDef:", "doDeleteDef:", "doCloseDef:", "selectColorFromWell:", "selectColorFromSwitch:", "removeAllColors:" ); Outlets = ( codeActive, codeDef, codeList, codeName, codeColorMenu, codeColorWell, inheritedColorSwitch ); Super = NSWindowController; }; }gtamsanalyzer.app-0.42/Source/codeBrowser.gorm/objects.gorm0000644000175000017500000002025711062075652024357 0ustar brentbrent00000000000000GNUstep archive00002a96:00000027:000000d7:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%NSOwner0& %  codeBrowser0& %  GormNSPanel01NSPanel1NSWindow1 NSResponder% ? A D C& % Cv DL01 NSView% ? A D C  D C&01 NSMutableArray1 NSArray&  0 1 NSScrollView% A A  C7 C}  C7 C}&0 &0 1 NSClipView% A A C Cc  C Cc&0 &0 1 NSTableView1 NSControl%  C C!  C C!&0 &%01NSCell0&01NSFont%&&&&&&&&0 &01 NSTableColumn0&% column1 C A GP01NSTableHeaderCell1NSTextFieldCell1 NSActionCell0&% Codes0% &&&&&&&&%01NSColor0&%NSNamedColorSpace0&%System0&%controlShadowColor00&% System0&% windowFrameTextColor00 &%neuf &&&&&&&&%0!0"&% textBackgroundColor0#0$& %  textColor0%0&& %  gridColor0'0(&%NSCalibratedWhiteColorSpace ?W = ?0)1NSTableHeaderView%  C A  C A&0* &0+1GSTableCornerView% @ @ A A  A A&0, &%% A @ @@'0-1 NSScroller% @ A A Cc  A Cc&0. &%0/&&&&&&&&& 2 _doScroll:v12@0:4@8+00 % A @ C A  C A&01 &)0203& %  controlColor % A A A A -0041 NSTextField% Cz Cr C A  C A& 05 &%0607&% Text&&&&&&&&%0809&% System0:&% textBackgroundColor0;90<& %  textColor0=% CI Cu B0 A  B0 A& 0> &%0?0@&% Name0A% A`&&&&&&&&%0B0C&% System0D&% textBackgroundColor0EC0F& %  textColor0G1 NSColorWell% CI CO BT A  BT A& 0H &%0I0J&&&&&&&&&0K( ?0L1NSButton% C CO C A  C A& 0M &%0N1 NSButtonCell0O&% Use inherited color0P1NSImage0Q1NSMutableString&% common_SwitchOff&&&&&&&&%0R&0S&0T0U&% common_SwitchOn&&&0V % CI B C C#  C C#&0W &0X % A @ C C A @ C C&0Y &0Z1 NSTextView1!NSText% A @ C C  C C&0[ &0\0]&% System0^&% textBackgroundColor  K K0_]0`& %  textColor C K\0a% @ @ A C  A C&0b &%0c0d&&&&&&&&&&VX% A A A A a0e% Ci A  B A  B A&!0f &%0g0h& %  Delete colors&&&&&&&&%0i&0j&&&&0k% C A  B A  B A&!0l &%0m0n& %  Save/clear&&&&&&&&%0o&0p&&&&0q% C A  B` A  B` A&!0r &%0s0t&% Delete&&&&&&&&%0u&0v&&&&0w% C A  B` A  B` A&!0x &%0y0z&% Exit&&&&&&&&%0{&0|&&&&0}% C CR B A  B A& 0~ &%00&% ActiveP&&&&&&&&%0&0&T&&&00&% System0&% windowBackgroundColor0&% Window0& %  Code browser A A F@ F@%00&%NSApplicationIcon0&% Button5}0& %  TextField40&% ButtonL0&% TextViewZ0&% GSCustomClassMap0&0& %  ScrollView 0& %  ScrollView1V0& %  ColorWellG0& %  TableColumn100&% column2 BT A GP00&%  &&&&&&&&%00&% controlShadowColor00&% three&&&&&&&&%!#0& %  TableColumn0& %  TextField2=0&% Button1e0&% GormNSTableView 0&% Button2k0&% Button3q0&% Button4w0 &!!01"NSNibConnector0&%NSOwner0"0"0"0"0"0"0"0"0"0"0"0"0"0"0"01#NSNibOutletConnector0&% windowController0#0&% delegate0#0& %  dataSource0#0&% delegate0#0&% codeList0#0&% codeName0#0±&% codeDef0ñ#0ı&% inheritedColorSwitch0ű#0Ʊ& %  codeColorWell0DZ#0ȱ& %  codeActive0ɱ#0ʱ&% window01$NSNibControlConnector0̱&% removeAllColors:0ͱ$0α& %  doClearDef:0ϱ$0б& %  doDeleteDef:0ѱ$0ұ& %  doCloseDef:0ӱ$0Ա&% selectColorFromSwitch:0ձ$0ֱ&% selectColorFromWell:01% GSMutableSet1& NSMutableSet1'NSSet&gtamsanalyzer.app-0.42/Source/codeBrowser.h0000555000175000017500000000153110162465511021236 0ustar brentbrent00000000000000/* codeBrowser */ #import #import #import "myProject.h" @interface codeBrowser : NSWindowController { NSMutableDictionary *cl, *backCL; myProject *codeSource; IBOutlet id codeActive; IBOutlet id codeDef; IBOutlet id codeList; IBOutlet id codeName; IBOutlet id codeColorMenu; IBOutlet id codeColorWell; IBOutlet id inheritedColorSwitch; } -(void) blank; -(void) setDict: (NSMutableDictionary *) aCL from: (myProject *) who ; -(IBAction) doClearDef: (id) sender; -(IBAction) doSaveDef: (id) sender; -(IBAction) doRestoreDef: (id) sender; -(IBAction) doDeleteDef: (id) sender; -(IBAction) doCloseDef: (id) sender; -(int) doSaveDefinition; -(IBAction) selectColorFromWell:(id)Sender; -(IBAction) selectColorFromSwitch:(id) sender; -(IBAction) removeAllColors: (id) sender; @end gtamsanalyzer.app-0.42/Source/codeBrowser.m0000555000175000017500000002202010162465511021237 0ustar brentbrent00000000000000#import "codeBrowser.h" #import "tamsutils.h" #import "prefBoss.h" #define SELECTALL(X) [X setSelectedRange: NSMakeRange(0, [[X string] length])] int codeCompare(id first, id second, void* context) { return [(NSString *)first compare: second]; } @implementation codeBrowser -(IBAction) doInsertDate: (id) sender { [codeDef insertText: [[NSDate date] description]]; } -(void) loadData { if(![self doSaveDefinition]) { //[codeDef deselectRow: [codeDef selectedRow]]; return; } [self blank]; return; } -(id) init { self = [super initWithWindowNibName: @"codeBrowser"]; backCL = [[NSMutableDictionary alloc] init]; cl = nil; return self; } -(void) setDict: (NSMutableDictionary *) aCL from: (myProject *) who { codeSource = who; if(cl) { [self doSaveDef: nil]; } cl = aCL; [backCL setDictionary: aCL ]; [codeName setStringValue: @""]; SELECTALL(codeDef); [codeDef insertText: @""]; //[codeDef setString: @""]; [codeActive setState: NSOnState]; //[codeList reloadData]; [self blank]; } -(void) windowDidLoad { [codeList setTarget: self]; [codeList setAction: @selector(loadData)]; [self blank]; } - (int)numberOfRowsInTableView:(NSTableView *)aTableView { NSMutableArray *mykeys; mykeys = [NSMutableArray arrayWithArray: [cl allKeys]]; return [mykeys count]; } -(NSString *) codeN: (int) n { NSMutableArray *mykeys; if([[cl allKeys] count] == 0) return nil; mykeys = [NSMutableArray arrayWithArray: [cl allKeys]]; [mykeys sortUsingFunction: codeCompare context: nil]; return [mykeys objectAtIndex: n]; } - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { [self doSaveDefinition]; [self blank]; } - (void)tableView:(NSTableView*)tableView didClickTableColumn:(NSTableColumn *)tableColumn { [self tableViewSelectionDidChange: nil]; } /* - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { } */ - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { NSMutableArray *mykeys; mykeys = [NSMutableArray arrayWithArray: [cl allKeys]]; [mykeys sortUsingFunction: codeCompare context: nil]; return [mykeys objectAtIndex: rowIndex]; } /* the buttons */ -(void) blank { int n; NSDictionary *who; NSString *myDef; NSString *tc; NSNumber *nn; [codeName setStringValue: @""]; SELECTALL(codeDef); [codeDef insertText: @""]; [codeColorWell setColor: [gPrefBoss realColor]]; [inheritedColorSwitch setState: NSOnState]; [codeActive setState: NSOnState]; [codeList reloadData]; n = [codeList selectedRow]; if(n >=0) { NSColor *mycolor; tc = [self codeN: n]; if(!tc) return; who = [cl objectForKey: tc]; if (who) { [codeName setStringValue: tc]; if([[who objectForKey: @"active"] isEqualToString: @"YES"] == YES) [codeActive setState: NSOnState]; else [codeActive setState: NSOffState]; myDef = [who objectForKey: @"definition"]; nn = [who objectForKey: @"color"]; mycolor = [codeSource colorForCode: tc]; [codeColorWell setColor: mycolor]; if(nn == nil) { [inheritedColorSwitch setState: NSOnState]; //[codeColorMenu selectItemAtIndex: [codeColorMenu indexOfItemWithTag: inheritedColor]]; } else { int n; n = [nn intValue]; switch(n) { case inheritedColor: [inheritedColorSwitch setState: NSOnState]; break; case otherColor: [inheritedColorSwitch setState: NSOffState]; if([who objectForKey: @"realColor"] != nil) [codeColorWell setColor: [who objectForKey: @"realColor"]]; break; default: [inheritedColorSwitch setState: NSOffState]; [codeColorWell setColor: getColorForInt(n)]; break; }; } //look up color //[codeColorMenu selectItemAtIndex: [codeColorMenu indexOfItemWithTag: [nn intValue]]]; [codeDef setString: myDef]; [codeDef display]; } } else if([gPrefBoss dateTimeValue]) [self doInsertDate: self]; } -(IBAction) doClearDef: (id) sender { if(![self doSaveDefinition]) return; [codeName setStringValue: @""]; [codeDef setString: @""]; [codeColorWell setColor: [gPrefBoss realColor]]; if([gPrefBoss dateTimeValue]) [self doInsertDate: self]; [codeActive setState: NSOnState]; [inheritedColorSwitch setState: NSOnState]; //[codeColorMenu selectItemAtIndex: [codeColorMenu indexOfItemWithTag: inheritedColor]]; [codeList deselectRow: [codeList selectedRow]]; [codeList reloadData]; [codeList deselectRow: [codeList selectedRow]]; } -(IBAction) doSaveDef: (id) sender { [self doSaveDefinition]; } -(int) doSaveDefinition { NSMutableDictionary *myEntry; int new; if([[codeName stringValue] isEqualToString: @""] == YES) return 1; /* rr = [[[codeName stringValue] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet] ] rangeOfCharacterFromSet: [NSCharacterSet whitespaceCharacterSet]]; if(rr.location != NSNotFound) { NSWARNING(@"Illegal space character found in code name."); return 0; } */ if(!isCodeNameLegal([[codeName stringValue] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]])) { NSWARNING(@"Illegal character found in code name."); return 0; } myEntry = [cl objectForKey: [codeName stringValue]]; if(myEntry) { new = 0; } else { myEntry = [NSMutableDictionary dictionary]; new = 1; } [myEntry setObject: [[[codeDef string] copy] autorelease] forKey: @"definition"]; if([codeActive state] == NSOnState) [myEntry setObject: @"YES" forKey: @"active"]; else [myEntry setObject: @"NO" forKey: @"active"]; if([inheritedColorSwitch state] == NSOnState) [myEntry setObject: [NSNumber numberWithInt: inheritedColor] forKey: @"color"]; else { [myEntry setObject: [NSNumber numberWithInt: otherColor] forKey: @"color"]; [myEntry setObject: [[[codeColorWell color] copy] autorelease] forKey: @"realColor"]; } //[myEntry setObject: [NSNumber numberWithInt: [[codeColorMenu selectedItem] tag]] forKey: @"color"]; //if ( [[codeColorMenu selectedItem] tag] == otherColor) // [myEntry setObject: [[[codeColorWell color] copy] autorelease] forKey: @"realColor"]; if(new) [cl setObject: myEntry forKey: [codeName stringValue]]; [codeList reloadData]; return 2; } -(IBAction) selectColorFromWell:(id)Sender { [inheritedColorSwitch setState: NSOffState]; } -(IBAction) selectColorFromSwitch:(id) sender { if([inheritedColorSwitch state] == NSOnState) [codeColorWell setColor: [codeSource colorForCode: [codeName stringValue]]]; } -(BOOL) windowShouldClose: (NSNotification *)aNotification { if([self doSaveDefinition]) return YES; else return NO; } - (void)windowWillClose:(NSNotification *)aNotification { //[self doSaveDef: nil]; cl = nil; [codeSource setCodeListDirty]; [codeSource broadcastCodeChange: YES]; } -(IBAction) doCloseDef: (id) sender { if(![self doSaveDefinition]) return; [NSApp stopModal]; [self close]; } -(IBAction) doDeleteDef: (id) sender { int n; n = [codeList selectedRow]; if(n>=0) { [cl removeObjectForKey: [self codeN: n]]; [self blank]; } } -(IBAction) doRestoreDef: (id) sender { [cl removeAllObjects]; [cl setDictionary: backCL]; [self blank]; } -(IBAction) removeAllColors: (id) sender { NSArray *codes; if(NSYESNOQUESTION(@"Should I proceed to make every color \"inherited color\"?") == YES) { //get the list codes = [cl allKeys]; FORALL(codes) { //for each NSMutableDictionary *entry; entry = [NSMutableDictionary dictionaryWithDictionary: [cl objectForKey: temp]]; [entry setObject: [NSNumber numberWithInt: inheritedColor] forKey: @"color"]; [entry removeObjectForKey: @"realColor"]; [cl setObject: entry forKey: temp]; } ENDFORALL; //set color to inheritedColor [inheritedColorSwitch setState: NSOnState]; [codeColorWell setColor: [gPrefBoss realColor]]; //remove entry for realColor //flip switch //set color } } @end gtamsanalyzer.app-0.42/Source/codeBrowser.tif0000555000175000017500000000650010162465511021572 0ustar brentbrent00000000000000MM* WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW휧ᝨ᰹籺簹疢ߖߪ垩ᔠ矪᥯㔠ޔޜ࡫⡬⢭⦰*ᖡޔޔޔߝᝩᝩᝩᦰ촻唠ޔޔޔޔꮵ׺֔ޔޔޔߘ誱ҳ۔ޔޔޔޔߞѻ㔠ޔޔޔޔ࣭㶿䔠ޔތҔޔᡫح痢ߒ۔ޔޔ瑝ړݔޔޔឩᡫ⡫⡬⤮㪳铞ܔޔޔޔ⡫⡫⡬⣮㧱䫵ߔޔޔޔ⡫⢭⤮㦱䪴孶춽*ꕡޔޔޔ㣮㤮㦱䪳孶決풞ڔޔޔ㥯㧱䪳孶氹絾哞ܔޔޔ䩳媴孶氹絾ꓟےۖޔޫ孶殸沺菛׈ͩ糼跿    9  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/codeBrowser.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/codeicn.tif0000555000175000017500000000647410162465511020732 0ustar brentbrent00000000000000MM* (  (贽豺簹篸殸氹簹絾%%篸歶!&7 1䦱䦱䧱䫵u|npx欵'T[{⡬⡫⡬x /2;69B#Za➩ᝩᝩJQp [a~ms<>G  0bjᝨᜧᛦ"㰹簹碪jlt ~bjᛧߘ 氹簹碪#%/?BJ*,5"W_ޔޔޓޓޗߠ⫴尹篸,/8XZa #7 ݐݏݐݑݙ࣭㫵尹簹}  nx  ݏݐݔޘߞᡫ⨲䯸歶  6;W ٔޖߗߛᡫ⢭⧱䰹癡  (ۛឩᡫ⡫⡬⤮㪳ls  % )ݠ⡫⡫⡫⡬⣮㧱PVr 03<;>F?Ea+⡫⡫⢭⤮㦱䪴 %mnu &+@).D⣭㣮㤮㦱䪳孶38L ;>F9?X9?X㤮㤮㥯㧱䪳孶氹/flmnu  1㦰䦱䧱䩳媴孶氹絾acj媳媳嫵孶殸沺# $'7豺簹簹籺糼跿롧Ǩݰ篸58A#%/ #@CK&&&)3 @CK}~:=E~qrynovfhnpqx    5  @  , 4(/Users/matthew/Documents/tams documents/codeicn2.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/codeLevel.tif0000555000175000017500000000647610162465511021232 0ustar brentbrent00000000000000MM* 휧ឦ߶Կహ絾|bNj-D'@'@0Iyѧ䫵muBL=G=GHQCS(<!$;'@'@'@.EOn⢭⦰MV6A#7B=G=G=GBLt{M`:VZn}n*@!ᝩᦰ촻]eW_=G#򿂪uӔޔޔޔޟX}ޜꮵ׺疗Εܔޔޔޔޚ޼h ߣ誱ҳ"۔ޔޔޔޗخx:Y$޵rѻ\d'㔠ޔޔޗة[%=Qx`:D䔠ޕܙZ$< $ #import #import "codeListWatcher.h" @interface codeListSearchWatcher : codeListWatcher { IBOutlet NSTextField *searchString; IBOutlet NSTableView *myOwnCodeList; } -(IBAction) doRefresh: (id) Sender; -(BOOL)tableView: (NSTableView *) aTable shouldEditTableColumn: (NSTableColumn *) aCol row: (unsigned) arow; -(void) displaySelData; -(IBAction) clearSearch: (id) Sender; @end gtamsanalyzer.app-0.42/Source/codeListSearchWatcher.m0000555000175000017500000000241510162465511023201 0ustar brentbrent00000000000000#import "codeListSearchWatcher.h" #import "myProject.h" @implementation codeListSearchWatcher -(BOOL)tableView: (NSTableView *) aTable shouldEditTableColumn: (NSTableColumn *) aCol row: (unsigned) arow { return NO; } -(IBAction) doRefresh: (id) sender { [myOwnCodeList reloadData]; } - (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem { if([[tabViewItem label] isEqualToString: @"Search"]) { [myOwnCodeList reloadData]; [myOwnCodeList setTarget: self]; [myOwnCodeList setDoubleAction: @selector(displaySelData)]; } } -(void) displaySelData { int row; NSMutableString *ss; ss = [[NSMutableString alloc] init]; [ss setString: [searchString stringValue]]; row = [myOwnCodeList selectedRow]; [ss appendString: [[(myProject *)[myOwner getGWorkBench] hotCodeList] objectAtIndex: row]]; [searchString setStringValue: ss]; //get the selected row /* tt = [[myOwner hotCodeList] objectAtIndex: row]; row = [theResults selectedRow]; //get the appropriate data if(row >= 0) { ss = [[myData objectAtIndex: row] objectForKey: @"_data"]; //set it to the textview [thisCell setString: ss]; }*/ } -(IBAction) clearSearch: (id) Sender { [searchString setStringValue: @""]; } @end gtamsanalyzer.app-0.42/Source/codeListWatcher.h0000555000175000017500000000060710162465511022047 0ustar brentbrent00000000000000/* codeListWatcher */ #import #import #import "MyDocument.h" @interface codeListWatcher : NSObject { IBOutlet id myCodeList; IBOutlet MyDocument *myOwner; } - (int) numberOfRowsInTableView: (NSTableView*) tableView; - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) tableColumn row:(int) row; @end gtamsanalyzer.app-0.42/Source/codeListWatcher.m0000555000175000017500000000115010162465511022046 0ustar brentbrent00000000000000#import "codeListWatcher.h" #import "MyDocument.h" #import "myProject.h" @implementation codeListWatcher - (int) numberOfRowsInTableView: (NSTableView*) tableView { int n; if((n = [[[myOwner getGWorkBench] hotCodeList] count]) > 0) NSLog(@"Count = %d\n",n); if([myOwner hotCodeList] == nil)NSLog(@"found a hotCodeList: %d\n", [[myOwner hotCodeList] count]); else NSLog(@"No hot codelist"); return [[myOwner hotCodeList] count]; } - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) tableColumn row:(int) row { return [[myOwner hotCodeList] objectAtIndex: row]; } @end gtamsanalyzer.app-0.42/Source/coderec.h0000555000175000017500000000330010162465511020360 0ustar brentbrent00000000000000// // coderec.h // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import #import "MyDocument.h" #import "MWFile.h" #define DATARUN 0 #define REPEATRUN 1 #define SECTIONRUN 2 @interface coderec : NSObject { NSMutableString *theName; NSMutableString *theCoder; NSMutableString *record; NSMutableString *comment; NSMutableDictionary *affiliatedInfo; NSMutableArray *sectionCodes; BOOL openRun; BOOL hasInfo; unsigned long bloc, eloc, lineloc; unsigned lineStart, lineEnd; MWFile *doc; int runType; } - (id) init; - (void) dealloc; - (void) setName: (NSString *) myname; - (void) setCoder: (NSString *) myname; - (void) setRecord: (NSString *) acode; - (void) setComment: (NSString *) acomment; -(void) setAffiliatedInfo: (NSMutableDictionary *) ai; -(void) addAffiliatedInfo: (NSMutableDictionary *) ai; -(NSMutableDictionary *) affiliatedInfo; -(void) addSectionCodes: (NSArray *) who; - (void) setOpen: (BOOL) isopen; -(BOOL) hasInfo; - (NSMutableString *) theName; - (NSMutableString *) theCoder; - (NSMutableString *) record; - (NSMutableString *) comment; -(NSMutableArray *) sectionCodes; - (MWFile *) doc; - (void) setDoc: (MWFile *) who; - (int) runType; - (void) setRunType: (int) what; - (BOOL) openRun; - (void) addChar: (unichar) c; - (void) addString: (NSString *) ss; - (void) appendString: (NSString *) ss; - (void) setBegin: (unsigned long) b; -(void) setEnd: (unsigned long) e; - (unsigned long) beginLoc; -(unsigned long) endLoc; -(void) setLineStart: (unsigned) what; -(void) setLineEnd: (unsigned) what; -(unsigned) lineStart; -(unsigned) lineEnd; @end gtamsanalyzer.app-0.42/Source/coderec.m0000555000175000017500000000521410162465511020373 0ustar brentbrent00000000000000// // coderec.mm // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "coderec.h" #import "utils.h" @implementation coderec - (id) init { [super init]; theName = [[NSMutableString alloc] init]; theCoder = [[NSMutableString alloc] init]; record = [[NSMutableString alloc] init]; comment = [[NSMutableString alloc] init]; affiliatedInfo = [[NSMutableDictionary alloc] init]; sectionCodes = [[NSMutableArray alloc] init]; openRun = YES; lineStart = lineEnd = 0; hasInfo = NO; runType = DATARUN; return self; } -(void) dealloc { [theName release]; [record release]; [comment release]; [affiliatedInfo release]; [sectionCodes release]; [super dealloc]; } -(void) setAffiliatedInfo: (NSMutableDictionary *) ai { [affiliatedInfo setDictionary: ai]; hasInfo = YES; } -(NSMutableArray *) sectionCodes { return sectionCodes; } -(void) addSectionCodes: (NSArray *) who { [sectionCodes addObjectsFromArray: who]; } -(void) addAffiliatedInfo: (NSMutableDictionary *) ai { [affiliatedInfo addEntriesFromDictionary: ai]; hasInfo = YES; } -(NSMutableDictionary *) affiliatedInfo {return affiliatedInfo;} -(BOOL) hasInfo {return hasInfo;} - (MWFile *) doc { return doc; } - (void) setDoc: (MWFile *) who { doc = who; } -(int) runType {return runType;} -(void) setRunType: (int) type {runType = type;} - (void) setName: (NSString *) myname { [theName setString: myname]; } - (void) setCoder: (NSString *) myname { [theCoder setString: myname]; } - (void) setRecord: (NSString *) acode { [record setString: acode]; } - (void) setComment: (NSString *) acomment { [comment setString: acomment]; } - (void) setopen: (BOOL) isopen { openRun = isopen; } - (NSMutableString *) theCoder {return theCoder;} - (NSMutableString *) theName { return theName;} - (NSMutableString *) record {return record;} - (NSMutableString *) comment {return comment;} - (BOOL) openRun {return openRun;} - (void) addChar: (unichar) c; { [record ADDCHAR(c)]; } -(void) addString: (NSString *)s { [record appendString: s]; } -(void) appendString: (NSString *)s { [record appendString: s]; } -(void) setBegin: (unsigned long) b {bloc = b;} -(void) setEnd: (unsigned long) e {eloc = e;} -(unsigned long) beginLoc {return bloc;} -(unsigned long) endLoc {return eloc;} - (void) setOpen: (BOOL) isopen{openRun = isopen;} -(void) setLineStart:(unsigned) what {lineStart = what;} -(void) setLineEnd:(unsigned) what {lineEnd = what;} -(unsigned) lineStart {return lineStart;} -(unsigned) lineEnd {return lineEnd;} @end gtamsanalyzer.app-0.42/Source/codeset2sel.tif0000555000175000017500000000650010162465511021530 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪7777777777777777Ѫᖡު7777777777777777Ѫ唠ޔު7777777777777777Ѫ֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪ7777777777777777Ѫ铞ܔު7777777777777777Ѫߔު7777777777777777Ѫꕡު풞ڪ7777777777777777Ѫ哞ܪ7777777777777777Ѫꓟے۪7777777777777777Ѫ菛׈ͪ    9  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/selCodeSet4.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/collapseDown.tif0000555000175000017500000000650010162465511021746 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻唠ޔޔޔޔޔޜᛦꮵ׺֔ޔޔޔޔޙߘߘߘߜᴽ誱ҳ۔ޔޔޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔޔޔޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔތҔޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵ߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾哞ܔޔޔަ䧱䩳媴孶氹絾ꓟےۖޔޫ媳嫵孶殸沺菛׈ͩ갹籺糼跿    :  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/collapseDown.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/collapseUp.tif0000555000175000017500000000647610162465511021437 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻唠ޔޔޔޔޔޜᛦꮵ׺֔ޔޔޔޔޙߘߘߘߜᴽ誱ҳ۔ޔޔޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔޔޔޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔތҔޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵ߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾哞ܔޔޔަ䧱䩳媴孶氹絾ꓟےۖޔޫ媳嫵孶殸沺菛׈ͩ갹籺糼跿    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/collapseUp.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/colorTags.tif0000555000175000017500000000647610162465511021265 0ustar brentbrent00000000000000MM* 77..JJcc??WW??휧ᝨ᰹籺簹篸9D ;;JJJJcc疢ߖߪ垩ᔠޯu#!ܑbS,)矪᥯㔠ޯu&.ըR&%ᖡޔޯu#EXŗx.*L^Lo唠ޔ޾\}.:N[j2I....asֳoCX^kv.......&@?S\9N.....79+D萝㔠F]&"{5...+D[n뷿䔠ީ~AVݚ/s3....Tg୴痢ߒ۔4N=Q3...0{瑝ړݔ޼~7M../.9[n䪳铞ܔޔޔޔ6..:Q䡬⣮㧱䫵ߔޔޔޔF[07l~㤮㦱䪴孶춽ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾哞ܔޔޔަ䧱䩳媴孶氹絾ꓟےۖޔޫ媳嫵孶殸沺菛׈ͩ갹籺糼跿    7  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/colorTags.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/column.tif0000555000175000017500000000647210162465511020621 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ唠ޔުޔޔޜᛦ֔ު۔ުޔޔޔޔޓޓޗߞᶾ㔠ޔުޔޔސݏݐݑݙ࣭㶿䔠ޔުޔޔޏݐݔޘߞᡫ⵽痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߇ꓟے۪ߘߘߘߘߘߘߘߘߘ߇菛׈ͪ    4  @  * 2(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/column.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/comment.tif0000555000175000017500000000647410162465511020770 0ustar brentbrent00000000000000MM* 88휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ    5  @  , 4(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/comment.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/config.h0000555000175000017500000001072210162465511020227 0ustar brentbrent00000000000000/* config.h. Generated by configure. */ /* On Unix systems config.in is converted by configure into config.h. PCRE is written in Standard C, but there are a few non-standard things it can cope with, allowing it to run on SunOS4 and other "close to standard" systems. On a non-Unix system you should just copy this file into config.h, and set up the macros the way you need them. You should normally change the definitions of HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because of the way autoconf works, these cannot be made the defaults. If your system has bcopy() and not memmove(), change the definition of HAVE_BCOPY instead of HAVE_MEMMOVE. If your system has neither bcopy() nor memmove(), leave them both as 0; an emulation function will be used. */ /* If you are compiling for a system that uses EBCDIC instead of ASCII character codes, define this macro as 1. On systems that can use "configure", this can be done via --enable-ebcdic. */ #ifndef EBCDIC #define EBCDIC 0 #endif /* If you are compiling for a system that needs some magic to be inserted before the definition of an exported function, define this macro to contain the relevant magic. It apears at the start of every exported function. */ #define EXPORT /* Define to empty if the "const" keyword does not work. */ /* #undef const */ /* Define to "unsigned" if doesn't define size_t. */ /* #undef size_t */ /* The following two definitions are mainly for the benefit of SunOS4, which doesn't have the strerror() or memmove() functions that should be present in all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should normally be defined with the value 1 for other systems, but unfortunately we can't make this the default because "configure" files generated by autoconf will only change 0 to 1; they won't change 1 to 0 if the functions are not found. */ #define HAVE_STRERROR 1 #define HAVE_MEMMOVE 1 /* There are some non-Unix systems that don't even have bcopy(). If this macro is false, an emulation is used. If HAVE_MEMMOVE is set to 1, the value of HAVE_BCOPY is not relevant. */ #define HAVE_BCOPY 1 /* The value of NEWLINE determines the newline character. The default is to leave it up to the compiler, but some sites want to force a particular value. On Unix systems, "configure" can be used to override this default. */ #ifndef NEWLINE #define NEWLINE '\n' #endif /* The value of LINK_SIZE determines the number of bytes used to store links as offsets within the compiled regex. The default is 2, which allows for compiled patterns up to 64K long. This covers the vast majority of cases. However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for longer patterns in extreme cases. On Unix systems, "configure" can be used to override this default. */ #ifndef LINK_SIZE #define LINK_SIZE 2 #endif /* The value of MATCH_LIMIT determines the default number of times the match() function can be called during a single execution of pcre_exec(). (There is a runtime method of setting a different limit.) The limit exists in order to catch runaway regular expressions that take for ever to determine that they do not match. The default is set very large so that it does not accidentally catch legitimate cases. On Unix systems, "configure" can be used to override this default default. */ #ifndef MATCH_LIMIT #define MATCH_LIMIT 10000000 #endif /* When calling PCRE via the POSIX interface, additional working storage is required for holding the pointers to capturing substrings because PCRE requires three integers per substring, whereas the POSIX interface provides only two. If the number of expected substrings is small, the wrapper function uses space on the stack, because this is faster than using malloc() for each call. The threshold above which the stack is no longer use is defined by POSIX_MALLOC_ THRESHOLD. On Unix systems, "configure" can be used to override this default. */ #ifndef POSIX_MALLOC_THRESHOLD #define POSIX_MALLOC_THRESHOLD 10 #endif /* PCRE uses recursive function calls to handle backtracking while matching. This can sometimes be a problem on systems that have stacks of limited size. Define NO_RECURSE to get a version that doesn't use recursion in the match() function; instead it creates its own stack by steam using pcre_recurse_malloc to get memory. For more detail, see comments and other stuff just above the match() function. On Unix systems, "configure" can be used to set this in the Makefile (use --disable-recursion). */ /* #define NO_RECURSE */ /* End */ gtamsanalyzer.app-0.42/Source/ctLimitCrit.h0000555000175000017500000000116010162465511021205 0ustar brentbrent00000000000000// // ctLimitCrit.h // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import #import "utils.h" @interface ctLimitCrit : NSObject { NSMutableString *name; char modif; int isnot; NSMutableArray *coders; } -(id) initWithString: (NSString *) who; -(id) init; -(void) dealloc; -(NSMutableString *) name; -(void) addCoder: (NSString *) who modifier: (NSString *) how; -(NSMutableArray *) getCoders; -(BOOL) areCoders; -(void) setName: (NSMutableString *) n; -(NSMutableString *) getName; -(char) modif; @end gtamsanalyzer.app-0.42/Source/ctLimitCrit.m0000555000175000017500000000565410162465511021226 0ustar brentbrent00000000000000// // ctLimitCrit.m // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "ctLimitCrit.h" #import "tams.h" @implementation ctLimitCrit -(NSMutableString *) name { return name; } -(void) parseCoders: (NSMutableString *) someName { NSMutableString *myName, *aName, *aBuff; MWCHAR ch; int i,l; l = [someName length]; if(l == 0) return; aName = [[NSMutableString alloc] init]; aBuff = [[NSMutableString alloc] init]; myName = [[NSMutableString alloc] init]; i = 0; while( i < l) { ch = [someName characterAtIndex: i]; if(ch == '[') {i++; break;} if(ch == ' ') {i++; continue;} [myName ADDCHAR(ch)]; i++; } if(i >= l - 1) { [self setName: myName]; [myName release]; [aBuff release]; [aName release]; return; } //copy the string into buffer while(((ch = [someName characterAtIndex: i]) != ']') && i < l) { [aBuff ADDCHAR(ch)]; i++; } //break up the buffer i = 0; l = [aBuff length]; for(i = 0; i < l; i++) { ch = [aBuff characterAtIndex: i]; if(ch == ' ') continue; if(ch == ';' || i == l-1) { if(i == l-1) [aName ADDCHAR(ch)]; trimNSS(aName); if([aName length]) { if([aName characterAtIndex: 0] == '~') { [self addCoder: [aName substringFromIndex: 1] modifier: @"~"]; } else { [self addCoder: aName modifier: @""]; } [aName setString: @""]; } } else [aName ADDCHAR(ch)]; } [self setName: myName]; [myName release]; [aBuff release]; [aName release]; } -(id) initWithString: (NSString *) who { MWCHAR c; [super init]; if([who length] == 0) return self; c = [who characterAtIndex: 0]; if(c == '>' || c == '*'|| c== '\'') { modif = c; name = [[NSMutableString alloc] initWithString: [who substringFromIndex: 1]]; coders = [[NSMutableArray alloc] init]; [self parseCoders: name]; } else { modif = ' '; name = [[NSMutableString alloc] initWithString: who]; coders = [[NSMutableArray alloc] init]; [self parseCoders: name]; } return self; } -(id) init { [super init]; name = [[NSMutableString alloc] init]; coders = [[NSMutableArray alloc] init]; modif = ' '; return self; } -(void) dealloc { [name release]; [coders release]; } -(void) setName: (NSMutableString *) n { [name setString: n]; } -(NSMutableString *) getName; { return name; } -(char) modif{ return modif;} -(NSMutableArray *) getCoders { return coders; } -(BOOL) areCoders { if([coders count]) return YES; else return NO; } -(void) addCoder: (NSString *) who modifier: (NSString *) how { NSMutableDictionary *rr; rr = [[NSMutableDictionary alloc] init]; [rr setObject: [who copy] forKey: @"coderName"]; [rr setObject: [how copy] forKey: @"modifier"]; [coders addObject: rr]; } @end gtamsanalyzer.app-0.42/Source/ctLimitFunc.h0000555000175000017500000000144310162465511021203 0ustar brentbrent00000000000000// // ctLimitFunc.h // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import #import "ctQChar.h" #import "ctLimitCrit.h" #define STARTLIM 1 #define ENDLIM 2 #define INLIM 3 #define OUTLIM 4 extern NSMutableArray *ctZoneVault; int isStringTrue(ctLimitCrit *elem, NSString *code, NSString *coder); void zeroRuns(); void handlelimit(NSString *buff); int isinlimit() ; void ctAddZone(ctQChar *who) ; void ctAddLimChar(ctQChar *qq) ; void ctOpenLimRun(ctQChar *qq) ; void ctCloseLimRun(ctQChar *qq) ; void ctDelZone(ctQChar *who); int handleLimChar(ctQChar *qq); void initLimit(); int isCurrTrue(ctLimitCrit *elem); int isTagTrue(ctQChar *s); void handlelimit(NSString *buff); void ctDelAllZones(); gtamsanalyzer.app-0.42/Source/ctLimitFunc.m0000555000175000017500000002756310162465511021223 0ustar brentbrent00000000000000// // ctLimitFunc.m // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "ctLimitFunc.h" #import "ctLimitCrit.h" #import "tams.h" #import "utils.h" #import "ctQChar.h" #import "ctReadChar.h" #import "ctUnlimitedRuns.h" #import "coderec.h" #import "myResults.h" #import "prefBoss.h" #define PRINTCODER(X, Y) {if([gPrefBoss showCoder] && [(NSString *)Y length]){[X appendString:@" ["]; [X appendString: Y]; [X appendString: @"]"];}} NSMutableString *ctLimString; NSMutableArray *ctLimitVault; NSMutableArray *ctZoneVault; int inLimFlag = 0; int singleLimFlag; //zone management void ctAddZone(ctQChar *who) { NSMutableDictionary *dd; dd = [[NSMutableDictionary alloc] init]; [dd setObject: [[who buff] copy] forKey: @"codeName"]; [dd setObject: [[who coder] copy] forKey: @"coderName"]; [ctZoneVault addObject:dd]; } void ctAddLimChar(ctQChar *qq) { FORALL(ctRunVault) { if(([temp openRun] == YES) /*&& !isrepeat(qq)*/) { switch([qq tokentype]) { case CHAR: [(coderec *)temp addString: [qq buff]]; break; case TOKEN: if(israw() && ([gCurrentTAMS isRepeat: [temp theName]] == NO)) { [(coderec *)temp addString: @"{"]; [(coderec *)temp addString: [qq buff]]; //add coder PRINTCODER((coderec *)temp, [qq coder]); if([[qq coder] length]) {[(coderec *)temp appendString:@"["]; [(coderec *)temp appendString: [qq coder]]; [(coderec *)temp appendString: @"]"];} [(coderec *)temp addString: @"}"]; } break; case ENDTOKEN: if(israw() && ([gCurrentTAMS isRepeat: [temp theName]] == NO)) { [(coderec *)temp addString: @"{/"]; [(coderec *)temp addString: [qq buff]]; //add coder PRINTCODER((coderec *)temp, [qq coder]); [(coderec *)temp addString: @"}"]; } default:; }; } } ENDFORALL; } void ctOpenLimRun(ctQChar *qq) { coderec *cr; cr = [[coderec alloc] init]; if(israw() && !isrepeat(qq)) { FORALL(ctZoneVault) { [[cr record] appendString: @"{"]; [[cr record] appendString: [temp objectForKey: @"codeName"]]; if([[temp objectForKey: @"coderName"] isEqualToString: @""] == YES) ; else //add coder { PRINTCODER([cr record], [temp objectForKey: @"coderName"]); } /* old code { [[cr record] appendString: @"["]; [[cr record] appendString: [temp objectForKey: @"coderName"]]; [[cr record] appendString: @"]"]; } */ [[cr record] appendString: @"}"]; }ENDFORALL; } if(singleLimFlag) { NSMutableString *sss = [[NSMutableString alloc] init]; [sss setString: @"+"]; [sss appendString: [qq buff]]; [cr setName: sss]; } else { NSMutableString *sss = [[NSMutableString alloc] init]; [sss setString: @"-"]; [sss appendString: [gCurrentTAMS limString]]; [cr setName: sss]; } [cr setBegin: [qq where]]; [cr setDoc: hotSearchDocument]; [cr setOpen: YES]; [cr retain]; [ctRunVault addObject: cr]; //need to add current state at this point! //need to add self tothe current state } void ctCloseLimRun(ctQChar *qq) { if(israw()) { FORALL(ctRunVault) { if([temp openRun] == YES && ([gCurrentTAMS isRepeat: [temp theName]] == NO)) { [[temp record] appendString: @"{/"]; [[temp record] appendString: [qq buff]]; //add coder PRINTCODER([temp record], [qq coder]); [[temp record] appendString: @"}"]; } } ENDFORALL; } FORALL(ctRunVault) { if([temp openRun] == YES && ([gCurrentTAMS isRepeat: [temp theName]] == NO) ) { [temp setOpen: NO]; [temp setEnd: [qq where]]; [temp setComment: [qq extra]]; return; } } ENDFORALL; //need to check out of the current state } void checkZones(void) { if([ctZoneVault count]) NSWARNING(@"There are passages missing a close tag; run \"check code pairs\" on your files"); } void ctDelAllZones() { [ctZoneVault removeAllObjects]; } void ctDelZone(ctQChar *who) { id theOne; FORALL(ctZoneVault) { theOne = nil; if([[temp objectForKey: @"codeName"] isEqualToString: [who buff]] && [[temp objectForKey: @"coderName"] isEqualToString: [who coder]]) { theOne = temp; break; } } ENDFORALL; if (theOne != nil) [ctZoneVault removeObject: theOne]; else NSWARNING(@"There are formatting errors in your file; run check code pairs"); //[theOne release]; } int handleLimChar(ctQChar *qq) { if([qq tokentype] == META) [gCurrentTAMS handlemeta: qq]; if([qq tokentype] == TOKEN) { ctAddZone(qq); if([gCurrentTAMS isRepeat: [qq buff]]) { ctOpenRun(qq); } } else if([qq tokentype ] == ENDTOKEN) { ctDelZone(qq); if([gCurrentTAMS isRepeat: [qq buff]]) { ctCloseRun(qq); } } else if([qq tokentype] == CHAR) { if(inLimFlag) return INLIM; else { ctAddOpenChar(qq); //cludge for repeats return OUTLIM; } } if(inLimFlag == 0 && isinlimit()) { inLimFlag = 1; return STARTLIM; } else if(inLimFlag == 1 && isinlimit()) { return INLIM; } else if (inLimFlag == 0 && !isinlimit()) { return OUTLIM; } else if (inLimFlag == 1 && !isinlimit()) { inLimFlag = 0; return ENDLIM; } return OUTLIM; } void zeroRuns() { ctLimitVault = nil; ctZoneVault = nil; ctLimString = nil; } void initLimit() { if(ctLimitVault) [ctLimitVault release]; ctLimitVault = [[NSMutableArray alloc] init]; //[ctLimitVault retain]; if(ctLimString) [ctLimString release]; ctLimString = [[NSMutableString alloc] init]; if(ctZoneVault) [ctZoneVault release]; ctZoneVault = [[NSMutableArray alloc] init]; inLimFlag = 0; } int isStringTrue(ctLimitCrit *elem, NSString *code, NSString *coder) { NSMutableArray *aa; NSRange rr; //get help from the current tams object NSMutableArray *bb; int matchflag; int lcnt; int ii, jj; int ncnt,tcnt; //first find out if we match the coder if([elem areCoders]==YES) //check coder against everyone { int foundFlag; NSRange r; foundFlag = 0; FORALL([elem getCoders]) { NSString *s1 = [NSString stringWithString: [temp objectForKey: @"coderName"]]; if([s1 isEqualToString: coder]) ii++; if([[temp objectForKey: @"modifier"] isEqualToString: @"~"] == YES) { //just check out the front part r = [coder rangeOfString: [temp objectForKey: @"coderName"]]; if(r.location == 0) { foundFlag = 1; break; } } else { //check out the rest, but make sure to do a null string check if([[temp objectForKey: @"coderName"] isEqualToString: @"*"] == YES) { if([coder isEqualToString: @""] == YES) { foundFlag = 1; break; } } else { if([coder isEqualToString: [temp objectForKey: @"coderName"]]) { foundFlag = 1; break; } } } } ENDFORALL; if(!foundFlag) return 0; } if([[elem name] isEqualToString: @""] == YES) return 1; switch([elem modif]) { case '>': //get help from the current tams object matchflag = 1; aa = convertStringToArray(code, '>'); bb = convertStringToArray([elem name], '>'); [aa retain]; [bb retain]; ncnt = [bb count]; tcnt = [aa count]; if(ncnt > tcnt) //the string must be equal at least to the test name { matchflag = 0; } else { for(ii = 0; ii <= tcnt - ncnt; ii++) { matchflag = 1; for(lcnt = 0, jj = ii; lcnt < ncnt; lcnt++, jj++) { if([[bb objectAtIndex: lcnt] isEqualToString: [aa objectAtIndex: jj]] == NO) { matchflag = 0; break; } } if(matchflag == 1) return matchflag; } } if(matchflag) return matchflag; //loop on bb, aa can be longer //if ([[aa objectAtIndex: 0] isEqualToString: [elem name]]) //return 1; break; case '*': rr = [code rangeOfString: [elem name]]; if(rr.location != NSNotFound) return 1; break; case '\'': if([code isEqualToString: [elem name]] == YES) return 1; break; default: if([gCurrentTAMS global: @"exactflag"]) { if([code isEqualToString: [elem name]] == YES) return 1; } else { NSMutableArray *bb; int matchflag; int lcnt; int ncnt,tcnt; matchflag = 1; aa = convertStringToArray(code, '>'); bb = convertStringToArray([elem name], '>'); [aa retain]; [bb retain]; ncnt = [bb count]; tcnt = [aa count]; if(ncnt > tcnt) //the zone must be equal at least to the test name { matchflag = 0; } else { for(lcnt = 0; lcnt < ncnt; lcnt++) { if([[bb objectAtIndex: lcnt] isEqualToString: [aa objectAtIndex: lcnt]] == NO) { matchflag = 0; break; } } } if(matchflag) return matchflag; //loop on bb, aa can be longer //if ([[aa objectAtIndex: 0] isEqualToString: [elem name]]) //return 1; } break; } ; return 0; } //compare this andgroup with the current zone int isCurrTrue(ctLimitCrit *elem) { FORALL(ctZoneVault) { if(isStringTrue(elem, [temp objectForKey: @"codeName"], [temp objectForKey: @"coderName"])) return 1; } ENDFORALL; return 0; } int isTagTrue(ctQChar *who) { int i,j, c1, c2; ctLimitCrit *elem; NSArray *andList; c1 = [ctLimitVault count]; for(i = 0; i< c1; i++) { andList = [ctLimitVault objectAtIndex: i] ; c2 = [andList count]; for(j = 0; j < c2; j++) { elem = [andList objectAtIndex: j]; if(isStringTrue(elem, [who buff], [who coder])) return 1; } } return 0; } int checkand(NSArray *a) { int r, oldr; oldr = 1; FORALL(a) { r = isCurrTrue(temp); oldr *= r; //and is like times if any are 0 it goes to 0 } ENDFORALL; return oldr ; } int isinlimit() { int rslt; int trslt; trslt = 0; if([ctZoneVault count] == 0) return 0; FORALL(ctLimitVault) { rslt = checkand(temp); trslt += rslt; if(trslt) { return 1;} } ENDFORALL; return 0; } /* handlers */ void parseand(NSString *nsbuff) { int i, j; MWCHAR c; NSMutableString *b; ctLimitCrit *elem; NSMutableArray *agp; #ifdef ldebug printf("in parseand: %s\n", buff); #endif agp = [[NSMutableArray alloc] init]; //agp = (andgroup *) new andgroup; b = [[NSMutableString alloc] init]; [b retain]; i = j = 0; for(;;) { if(i >= [nsbuff length]) c = '\0'; else c = [nsbuff characterAtIndex: i]; if(c == ' ') {i++; continue;} if(c == '+' || c == '\0') { if([b length]) { elem = [[ctLimitCrit alloc] initWithString: b]; [elem retain]; [agp addObject: elem]; //[elem release]; } j = 0; [b setString: @""]; if (c == '\0') break; } else [b ADDCHAR(c)]; i++; } [ctLimitVault addObject: agp]; //[agp release]; [b release]; } void handlelimit(NSString *buff) { int j, i; MWCHAR c; int n; NSMutableString *b; singleLimFlag = 0; [ctLimString setString: buff]; b = [[NSMutableString alloc] init]; [b retain]; n = [buff length]; if(n) { [gCurrentTAMS setGlobal: @"limitflag" to: 1]; i = 0; j = 0; for(;;) { if(i >= [buff length]) c = '\0'; else c = [buff characterAtIndex: i]; if(c == ' ') { i++; if(i >= [buff length]) break; c = [buff characterAtIndex: i]; } if(i >= n) break; while(c != ',' && i < n) { [b ADDCHAR(c)]; i++; j++; if(i < n) c = [buff characterAtIndex: i]; else break; } if ([b length]) {parseand(b); [b setString: @""];} if (c == '\0') break; i++; } } if([ctLimitVault count] == 1) { NSArray *theOne; //may be a single name search theOne = [ctLimitVault objectAtIndex: 0]; //passes test 1 if([theOne count] == 1) { if([[theOne objectAtIndex: 0] modif] == ' ') { singleLimFlag = 1; } } } } gtamsanalyzer.app-0.42/Source/ctQChar.h0000555000175000017500000000171210162465511020306 0ustar brentbrent00000000000000// // ctQChar.h // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import #import "MWFile.h" //#import "tams.h" @interface ctQChar : NSObject { int tokentype; unsigned long where, whend; unsigned line; NSMutableString *buff, *extra, *coder; MWFile *source; } - (id) init; - (void) clean; - (void) setWhere: (long) w; - (long) where; -(long) end; -(void) setEnd: (long) w; -(NSRange) range; -(unsigned) line; -(void) setLine: (unsigned) what; - (void) dealloc; - (NSMutableString *) buff; - (NSMutableString *) extra; - (NSMutableString *) coder; - (int) tokentype; - (void) setTokenType: (int) tt; - (void) setBuff: (NSString *) ss; -(void) addBuff: (NSString *)ss; - (void) setExtra: (NSString *) ss; -(void) addExtra: (NSString *) ss; - (void) setCoder: (NSString *) ss; -(void) setSource: (MWFile *) who; -(MWFile *) source; -(id) copy; @end gtamsanalyzer.app-0.42/Source/ctQChar.m0000555000175000017500000000407010162465511020313 0ustar brentbrent00000000000000// // ctQChar.m // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "ctQChar.h" @implementation ctQChar - (id) init { [super init]; buff = [[NSMutableString alloc] init]; extra = [[NSMutableString alloc] init] ; coder = [[NSMutableString alloc] init] ; source = nil; line = 0; whend=where=0L; return self; } -(void) clean { [buff setString: @""]; [extra setString: @""]; [coder setString: @""]; line = 0; source = nil; line = 0; whend=where = 0L; source = nil; } - (void) setWhere:(long) w { where = w; } - (long) where {return where;} - (void) dealloc; { [buff release]; [extra release]; [coder release]; [super dealloc]; } - (NSMutableString *) buff { return buff; } - (NSMutableString *) extra; { return extra;} - (NSMutableString *) coder; { return coder;} - (int) tokentype; {return tokentype;} -(void) setEnd: (long) w { whend = w; } -(long) end { return whend; } -(NSRange) range { NSRange r; r.location = where; r.length = whend - where; return r; } - (void) setTokenType: (int) tt; { tokentype = tt;} - (void) setBuff: (NSString *) ss; { [buff setString: ss]; } -(void) addBuff: (NSString *) ss { [buff appendString: ss]; } - (void) setCoder: (NSString *) ss; { [coder setString: ss]; } - (void) setExtra: (NSString *) ss; { if([ss length] == 0) return; [extra setString: ss]; } - (void) addExtra: (NSString *) ss; { [extra appendString: ss]; } -(void) setSource: (MWFile *) who { source = who; } -(MWFile *) source {return source;} -(unsigned) line{ return line;} -(void) setLine: (unsigned) what {line = what;} - (id) copy { id mycopy = [[ctQChar alloc] init]; [mycopy setTokenType: [self tokentype]]; [mycopy setBuff: [self buff]]; [mycopy setCoder: [self coder]]; [mycopy setExtra: [self extra]]; [mycopy setSource: [self source]]; [mycopy setWhere: [self where]]; [mycopy setLine: [self line]]; return mycopy; } @end gtamsanalyzer.app-0.42/Source/ctReadChar.h0000555000175000017500000000116210162465511020760 0ustar brentbrent00000000000000/* * ctReadChar.h * CocoaTams * * Created by matthew on Mon Apr 15 2002. * Copyright (c) 2001 Matthew Weinstein. All rights reserved. * */ #import #import "ctQChar.h" #import "utils.h" #import "MyDocument.h" int readnext(ctQChar *qc); void resetDataStream(); extern NSString *gTheData; NSArray *hotFileList(); void addArrayToSearchList(NSArray *who); void initSearchListSystem(); void addFileToSearchList(MyDocument *who); void clearSearchList(); void startSearch(); void resetDataStream(); extern MyDocument *hotSearchDocument; void setCharLocation(int loc); int getCharLocation(); gtamsanalyzer.app-0.42/Source/ctTagInfo.h0000555000175000017500000000123610162465511020640 0ustar brentbrent00000000000000// // ctTagInfo.h // TamsAnalyzer // // Created by matthew on Wed May 15 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import #import "MWFile.h" @interface ctTagInfo : NSObject { NSMutableString *name; NSMutableString *coder; int location; MWFile *doc; } -(void) setLocation: (int) l; -(int) location; -(id) initWithName: (NSString *) aName; -(id) initWithName: (NSString *) aName location: (int) l coder: (NSString *) who; -(MWFile *) document; -(id) initWithName: (NSString *) aName location: (int) l coder: (NSString *) who doc: (MWFile *) which; -(NSString *) name; -(NSString *) coder; @end gtamsanalyzer.app-0.42/Source/ctTagInfo.m0000555000175000017500000000241610162465511020646 0ustar brentbrent00000000000000// // ctTagInfo.m // TamsAnalyzer // // Created by matthew on Wed May 15 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import "ctTagInfo.h" @implementation ctTagInfo -(void) setLocation: (int) l { location = l; } -(int) location {return location;} -(id) initWithName: (NSString *) aName { self = [super init]; name = [[NSMutableString alloc] init]; coder = [[NSMutableString alloc] init]; [name setString: aName]; return self; } -(NSString *) name{return name;} -(id) initWithName: (NSString *) aName location: (int) l coder: (NSString *) who { self = [super init]; name = [[NSMutableString alloc] init]; [name setString: aName]; coder = [[NSMutableString alloc] init]; [coder setString: who]; location = l; doc = nil; return self; } -(id) initWithName: (NSString *) aName location: (int) l coder: (NSString *) who doc: (MWFile *) which { self = [super init]; name = [[NSMutableString alloc] init]; [name setString: aName]; coder = [[NSMutableString alloc] init]; [coder setString: who]; location = l; doc = which; return self; } -(MWFile *) document { return doc; } -(NSString *) coder {return coder;} -(void) dealloc { [name release]; [coder release]; } @end gtamsanalyzer.app-0.42/Source/ctUnlimitedRuns.h0000555000175000017500000000065210162465511022114 0ustar brentbrent00000000000000// // ctUnlimitedRuns.h // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import #import "tams.h" #import "ctQChar.h" void ctInitRV(); void ctAddOpenChar(ctQChar *); void ctOpenRun(ctQChar *); void ctCloseRun(ctQChar *); void ctCloseAllOpenRuns(); extern NSMutableArray *ctRunVault; int israw(); int isrepeat(ctQChar *);gtamsanalyzer.app-0.42/Source/ctUnlimitedRuns.m0000555000175000017500000000703710162465511022125 0ustar brentbrent00000000000000// // ctUnlimitedRuns.m // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "utils.h" #import "ctUnlimitedRuns.h" #import "ctReadChar.h" #import "coderec.h" #import "myResults.h" #import "ctLimitFunc.h" #import "prefBoss.h" #define PRINTCODER(X, Y) {if([gPrefBoss showCoder] && [(NSString *)Y length]){[X appendString:@" ["]; [X appendString: Y]; [X appendString: @"]"];}} NSMutableArray *ctRunVault; void ctInitRV() { if(ctRunVault) { if(ctRunVault) [ctRunVault release]; //we may need to get rid of this stuff // [ctRunVault removeAllObjects]; } ctRunVault = [[NSMutableArray alloc] init]; [ctRunVault retain]; } void ctAddOpenChar(ctQChar *qq) { FORALL(ctRunVault) { if(([temp openRun] == YES) /*&& !isrepeat(qq)*/) { switch([qq tokentype]) { case CHAR: [(coderec *)temp addString: [qq buff]]; break; case TOKEN: if(israw() && ( [gCurrentTAMS isRepeat: [temp theName]] == NO)) { [(coderec *)temp addString: @"{"]; [(coderec *)temp addString: [qq buff]]; //add coder PRINTCODER((coderec *)temp, [qq coder]); [(coderec *)temp addString: @"}"]; } break; case ENDTOKEN: if(israw() && ( [gCurrentTAMS isRepeat: [temp theName]] == NO)) { [(coderec *)temp addString: @"{/"]; [(coderec *)temp addString: [qq buff]]; //add coder PRINTCODER((coderec *)temp, [qq coder]); [(coderec *)temp addString: @"}"]; } default:; }; } } ENDFORALL; } int isrepeat (ctQChar *qq) { if(gCurrentTAMS) return [gCurrentTAMS isRepeat: [qq buff]]; else return 0; } void ctOpenRun(ctQChar *qq) { coderec *cr; cr = [[coderec alloc] init]; if(israw() && !isrepeat(qq)) { FORALL(ctZoneVault) { [[cr record] appendString: @"{"]; [[cr record] appendString: [temp objectForKey: @"codeName"]]; //add coder PRINTCODER([cr record], [temp objectForKey:@"coderName"]); [[cr record] appendString: @"}"]; }ENDFORALL; } [cr setName: [qq buff]]; [cr setBegin: [qq where]]; [cr setCoder: [qq coder]]; [cr setDoc: hotSearchDocument]; [cr setOpen: YES]; [cr retain]; if(isrepeat(qq)) [cr setRunType: REPEATRUN]; [ctRunVault addObject: cr]; //need to add current state at this point! //need to add self tothe current state } void ctCloseAllOpenRuns() { FORALL(ctRunVault) { if([temp openRun] == YES) { if(israw()) { [[temp record] appendString: @"{/EOF}"]; } [temp setOpen: NO]; [temp setComment: @"End of file found without close tag"]; [temp setEnd: getCharLocation()]; } } ENDFORALL; //need to check out of the current state } void ctCloseRun(ctQChar *qq) { FORALL(ctRunVault) { if(([[(coderec *)temp theName] isEqualToString: [qq buff]] == YES) &&( [temp openRun] == YES) && ([[(coderec *) temp theCoder] isEqualToString: [qq coder]])) //add coder here too { if(israw() && ( [gCurrentTAMS isRepeat: [temp theName]] == NO)) { [[temp record] appendString: @"{/"]; [[temp record] appendString: [qq buff]]; //add coder PRINTCODER([temp record], [qq coder]); [[temp record] appendString: @"}"]; } [temp setOpen: NO]; [temp setComment: [qq extra]]; [temp setEnd: [qq where]]; return; } } ENDFORALL; //need to check out of the current state } int israw() { if (gCurrentTAMS) return [gCurrentTAMS global: @"rawflag"]; else return 0; } gtamsanalyzer.app-0.42/Source/dataSumm2.tif0000555000175000017500000000642410162465511021156 0ustar brentbrent00000000000000MM* FF22bbqqww11 hh AAyyqqwwmm::{{ [[44qq""휧ᝨ᰹籺絮_vh۵疢ߖߪ垩ᔠޟF^Qgۻ矪᥯㔠ޔޕۥ>Q "hᖡޔޔޔޔޙܪMf *fý഻唠ޔޔޔޔޔޜᛦࠞe&2_qʺ,,,,66֔ޔޔޔޔޙߘߛUsu66۔ޔޔޔޔޔޔޓޓޫ%0 sBB㔠ޔޔޔޔޔސݏݐݚD\  kBB䔠ޔތҔޔޔޏݐݗRn #^sǭBB痢ߒ۔ޔޔޔޖߗ߯ )[v,,BB瑝ړݔޔޔޖߝᥛG^LcҪ铞ܔޔޔޔޘߥQj )䫵66ߔޔޔޔޞc*6wݪ孶춽OOꕡޔޔޔް",Skߪ孶決풞ڔޔޜYs&1#,孶氹絾哞ܔޙLh '1|ޭ氹絾ꓟےۙ׼c.:{߮沺菛ב^x4>1;ƃ⳼跿ɛ6:;<q{ 11//dd--**뽾<<$$xx""??77{{qqqqqqqqqqqqqqqqqqqqqqww      @   (dataSumm2.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/dataSummary.tif0000555000175000017500000000642610162465511021612 0ustar brentbrent00000000000000MM* jjOOzzttttttrrtt33 pukkUUɽH_ )2i߮氹簹絾fkw(5'/ '3\Ӧ䦱䧱䫵ӾLYௌh! Olۡ⢭⦰ľӃJJᖡޙӯuRp 0>tڦ긱ɭ唠ޔޔޔޚѺeKd-;"+2Aꮵ׺֔ޔޔޔޕۡQl $/_Ӵ誱ҳ۔ޔޔޔޔޔޝ˾]Ts p骰ѻ]]AA //||||㔠ޔޔޔޔޔސݏݐݶf _{⪰Ѽ//881177䔠ޔތҔޔޔޏݐݚXv!):KŰح55;;DDDD痢ߒ۔ޔޔޔޖߗ߻o d<<@@""瑝ړݔޔޔޖߞިVp Qiժaa zz铞ܔޔޔޔޛضEY#]xէ䫵RR ߔޔޔޗ׻n"* \wئ䪴孶춽..UU__ꕡޔޔި"* FYզ䪳孶決779955]]풞ڔޗ[|")䪳孶氹絾载Ȣ۳66bbBB哞ܔި$/ a|ު孶氹絾Ǣ>HBI YY99MMꓟےۜPm(2殸沺˟5=6=ZZ菛׈v)1uιսŝǜɝ̠}*0+2㱾rt YYzzttttjjFFAAAAAA66UU1188;;AAAAAA??66AAVV      @   (dataSummary.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/decolorTags.tif0000555000175000017500000000647410162465511021574 0ustar brentbrent00000000000000MM* ҩiiiiiiooo$$$333鐐DDD휧ᝨ᰹籺簹篸殸桩:=L 疢ߖߪ垩ᔠޔ| +++矪᥯㔠އMSs&&&ᖡޔޔMSt唠ޔޔޔVYj֔ޔއ$'5Ǵ誱ҳ۔ޏBGb&̞ᶾ骰ѻ㔠ޔdl z࣭㶿骰Ѽ䔠ޏPVwߞᡫ⵽谷ح痢|͞ᡫ⢭⧱瑝v⡫⡬⤮㪳铞~⡬⣮㧱䫵ߏSXt⤮㦱䪴孶춽ꕡqzHMeϤ㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾哞ܔޔޔަ䧱䩳媴孶氹絾ꓟےۖޔޫ媳嫵孶殸沺菛׈ͩ갹籺糼跿    5  @  , 4(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/deColor.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/def.tif0000555000175000017500000000647010162465511020060 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻唠ޔޔޔޔޔޜᛦꮵ׺֔ޔޔޔޔޙߘߘߘߜᴽ誱ҳ۔ޔޔޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔޔޔޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔތҔޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱瑝ړߝឩᡫ⡫⡬⤮㪳铞ܔޔޔޔ⡫⡫㧱䫵ߔޔޔޔ⡫⢭⤮孶ꕡ㣮㤮㦱䪳ޔޔ㥯㧱䪳絾媴絾ꓟےۖޔޫ媳嫵孶殸沺菛׈ͩ갹籺糼跿    1  @  ( 0(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/def.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/defFromSel.tif0000555000175000017500000000647610162465511021356 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻唠ޔޔޔޔޔޜᛦꮵ׺֔ޔޔޔޔޙߘߘߘߜᴽ誱ҳ۔ޔޔޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔޔޔޔޔސݏݐݑݙ࣭㶿骰Ѽyvvpvvvvvvwxx{sr{wuvvvvwwwxxxy}y{tvl l l wxxxxxyzl l |uvvvvl xxxl yyz}l 쀷wvvvvl xxxyl zz}l l l |vl l l l yyyyzl {}l l l ~l vvvl yyyzl {{|l l zl l l l l l zzl {{|l l l l l |uuvvzzzzz{||}}~~菛׈ͩ갹籺糼跿    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/defFromSel.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/delRoot.tif0000555000175000017500000000647410162465511020736 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᧬ߟƢٔޡ⡫⡬⢭⦰ ᙜׯuD\C[ߝᝩᝩᝩᦰ촻dd啞ۯv$/9Mޜᛦꮵ׺XX𝌿 Copyright (c) 1997-2003 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- See the file Tech.Notes for some information on the internals. */ /* This is a support program to generate the file chartables.c, containing character tables of various kinds. They are built according to the default C locale and used as the default tables by PCRE. Now that pcre_maketables is a function visible to the outside world, we make use of its code from here in order to be consistent. */ #include #include #include #include "internal.h" #define DFTABLES /* maketables.c notices this */ #include "maketables.c" int main(int argc, char **argv) { int i; FILE *f; const unsigned char *tables = pcre_maketables(); if (argc != 2) { fprintf(stderr, "dftables: one filename argument is required\n"); return 1; } f = fopen(argv[1], "w"); if (f == NULL) { fprintf(stderr, "dftables: failed to open %s for writing\n", argv[1]); return 1; } /* There are two fprintf() calls here, because gcc in pedantic mode complains about the very long string otherwise. */ fprintf(f, "/*************************************************\n" "* Perl-Compatible Regular Expressions *\n" "*************************************************/\n\n" "/* This file is automatically written by the dftables auxiliary \n" "program. If you edit it by hand, you might like to edit the Makefile to \n" "prevent its ever being regenerated.\n\n"); fprintf(f, "This file is #included in the compilation of pcre.c to build the default\n" "character tables which are used when no tables are passed to the compile\n" "function. */\n\n" "static unsigned char pcre_default_tables[] = {\n\n" "/* This table is a lower casing table. */\n\n"); fprintf(f, " "); for (i = 0; i < 256; i++) { if ((i & 7) == 0 && i != 0) fprintf(f, "\n "); fprintf(f, "%3d", *tables++); if (i != 255) fprintf(f, ","); } fprintf(f, ",\n\n"); fprintf(f, "/* This table is a case flipping table. */\n\n"); fprintf(f, " "); for (i = 0; i < 256; i++) { if ((i & 7) == 0 && i != 0) fprintf(f, "\n "); fprintf(f, "%3d", *tables++); if (i != 255) fprintf(f, ","); } fprintf(f, ",\n\n"); fprintf(f, "/* This table contains bit maps for various character classes.\n" "Each map is 32 bytes long and the bits run from the least\n" "significant end of each byte. The classes that have their own\n" "maps are: space, xdigit, digit, upper, lower, word, graph\n" "print, punct, and cntrl. Other classes are built from combinations. */\n\n"); fprintf(f, " "); for (i = 0; i < cbit_length; i++) { if ((i & 7) == 0 && i != 0) { if ((i & 31) == 0) fprintf(f, "\n"); fprintf(f, "\n "); } fprintf(f, "0x%02x", *tables++); if (i != cbit_length - 1) fprintf(f, ","); } fprintf(f, ",\n\n"); fprintf(f, "/* This table identifies various classes of character by individual bits:\n" " 0x%02x white space character\n" " 0x%02x letter\n" " 0x%02x decimal digit\n" " 0x%02x hexadecimal digit\n" " 0x%02x alphanumeric or '_'\n" " 0x%02x regular expression metacharacter or binary zero\n*/\n\n", ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word, ctype_meta); fprintf(f, " "); for (i = 0; i < 256; i++) { if ((i & 7) == 0 && i != 0) { fprintf(f, " /* "); if (isprint(i-8)) fprintf(f, " %c -", i-8); else fprintf(f, "%3d-", i-8); if (isprint(i-1)) fprintf(f, " %c ", i-1); else fprintf(f, "%3d", i-1); fprintf(f, " */\n "); } fprintf(f, "0x%02x", *tables++); if (i != 255) fprintf(f, ","); } fprintf(f, "};/* "); if (isprint(i-8)) fprintf(f, " %c -", i-8); else fprintf(f, "%3d-", i-8); if (isprint(i-1)) fprintf(f, " %c ", i-1); else fprintf(f, "%3d", i-1); fprintf(f, " */\n\n/* End of chartables.c */\n"); fclose(f); return 0; } /* End of dftables.c */ gtamsanalyzer.app-0.42/Source/docback.tif0000555000175000017500000000647410162465511020714 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪᔠޔޜ঱䦱䧱䫵矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ުޔޔޙߘߘߘߜᴽ誱ҳ۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪ޔޔޖߗߛᡫ⢭⧱瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡުޔޠ⣭㣮㤮㦱䪳孶決풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪޔަ䧱䩳媴孶氹絾ꓟے۪ޫ媳嫵孶殸沺菛׈ͪ갹籺糼跿    5  @  , 4(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/docback.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/docDelegate.h0000555000175000017500000000053710162465511021165 0ustar brentbrent00000000000000/* docDelegate */ #import #import #define TAMSDocDidChange @"TAMSDocDidChange" /* Delegate for both the NSText and the doc */ @interface docDelegate : NSObject { IBOutlet id myBoss; } - (void)windowWillClose:(NSNotification *)aNotification; - (void)textDidChange:(NSNotification *)aNotification; @end gtamsanalyzer.app-0.42/Source/docDelegate.m0000555000175000017500000000352110162465511021166 0ustar brentbrent00000000000000#import "docDelegate.h" #import "myProject.h" #import "MyDocument.h" #define NOTIFICATIONDIRTY 1 #import "tams.h" //#define jagDBG 1 @implementation docDelegate - (void)windowWillClose:(NSNotification *)aNotification { MWFile *mw; mw = [myBoss getMyMWFile]; if(mw) { [[NSNotificationCenter defaultCenter] removeObserver: myBoss name: @"TAGoReanalysisMode" object: nil]; [mw setOpenFile: myBoss]; //reset the path [mw setOpenFile: nil]; //close it [mw setOpen: NO]; if([mw hasFile] == NO) { [[myBoss getGWorkBench] dropMWFile: mw]; } } [myBoss endTimer]; /* if([myBoss getGWorkBench]) { [[myBoss getGWorkBench] unregisterWindow: [[[aNotification object] windowController] owner]]; #ifdef jagDBG //jaguar debug: [[[[aNotification object] windowController] owner] close]; #endif } */ } - (void)textDidChange:(NSNotification *)aNotification { #ifdef TEXTKLUDGE if([myBoss isDocumentEdited] == NO) [myBoss updateChangeCount: NSChangeDone]; #endif #ifdef NOTIFICATIONDIRTY [[NSNotificationCenter defaultCenter] postNotificationName: TAMSDocDidChange object: [myBoss getMyMWFile]]; #else [myBoss setDirty: YES]; #endif } - (BOOL)textShouldBeginEditing:(NSText *)aTextObject { return YES; } - (void)windowDidBecomeKey:(NSNotification *)aNotification { if([myBoss getGWorkBench] == nil) return; [myBoss rebuildDocMacros: nil]; [myBoss renewBookmarkMenu]; [[myBoss getGWorkBench] rebuildAutoSetMenu]; [[myBoss getGWorkBench] rebuildCodeSetMenu]; [[myBoss getGWorkBench] rebuildSummReportMenu]; if([[myBoss getGWorkBench] reanalysisMode] == YES) { [[[NSApp delegate] reanalysisMenu] setState: NSOnState]; } else { [[[NSApp delegate] reanalysisMenu] setState: NSOffState]; } } @end gtamsanalyzer.app-0.42/Source/docTemplate.tif0000555000175000017500000000650010162465511021555 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ    9  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/docTemplate.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/document.png0000644000175000017500000005565210162465511021147 0ustar brentbrent00000000000000PNG  IHDR9x'[qIDATx=\FкTʸ Tg _$MP\"lWvJ:TST\ [eeG2qde4_/{kqIdGq&rwoe!9o]?査Y^/[QKH|ͦO}ο_.r>l-'yzsˣϋ|-%Yg|f8!Ҥdg^I/q͕K8Mjq1Y_=uVo|<[dvL걨{e=[(\;zԳ^[s4Gqq }QV[^^3"ݶYϾmVKAR2RW_iV\rYiŜ+?ǰ?95ۖotϘ}\gǴ?w6s[*M9wSU/K5i=*_/t7]++ ;^R^VMu Sm}//]5;v(%!?3mߝ@#} 5^Q`۟'Դ?˓X}ɼ܍b[VBeHJ,[.Mu ne+IV--ezѺh]v^A-.47xxd|yAi;5EuJ!_N|nNw⾐l{ %]Xwq_ ڴǦvL޿6'Hp,_o[?z>X.\R~ קɶ*\^*R-VMV6b[y*m >야,+2#*^sy^Q*vuT[F#*XĝwHI<_k΋''J,N<,ᇽxʞ,H_N]LW !2Q^ 0]~Ps?SU.VlQ~.P=uD(1_>x2#/uۓ}[Um2a+aLJ|VN{gŊm j]_>Vq[y``.M-?%Wwkmw]\tTAZ{gN\CLO妹5?[ mKTo,ٿ_Y(pb+Cq `ܻj)t4]V]w/{ˮ8f ,m{fAә}-iAv:??7ܙez۸7j7'?g񽙙;4rT{h~o pҗ(nY/x{`^}ߙj\Ә i{8STm)ң]~ӳ?EM}.#YuѼ%#=TC;yc^B `lK쥤oyٿ)m`=-4/VBݭPx06:Obn\ޑxζ~sT=1QK,Wxi8V[K'jvºs~Ò7b[JXZwoj[)7G-M'^ [55-M)V]lsr{o1 =lG>进.1j.Nj5 @6E}}}O.AAM *:_W>LL*DΦi 5 !DgS_y?l\ykJ).}lD> ˏêG؞0D:;y ?nnnnnn 5^\~aaaA_hwmn)iLUlfTx٭3?"g1#׷+3I՟=S_:=˖/ [QV3x^뷷⾘gyp/SUͯϸ3_|Q[USRG-xy"X@g^ݶ&z@aۣ?8bOm>-)VMWglSצٜoN9[oٷ]v#7|, 2`2XyvQ&÷WطbKeQ 7f9k|DUSBjn^z^R,ղt٪*VJK6veU_-X)im+XK$,tN=wUoάZʫgO-+eP\[PRc7b~ˇ}}Ad)?p=>T),|o./i ʹzM'puGۯpq?wmOcgЛ-}؟po^ѻbiQ.x} ZCϛ=2aorT(LoܽW6sˆmV;2tRKbSVk~xFkqjjrfgWuJփڃڃj>"|y +o}Z?YfezU~*kIzn]--c9LW>d39U:li;X[k}Uۦ0OWQ+iOmC;͹gLg%|;xj{;V de_˟'r|L3C -j[ $-[kXgߞ}~.[WnK,gbW<5;n|=q~}um5{P">qζ.fv 弡z33i* }=dMO}eC K=ĸŖ(R1(҃5S'+sޭ+iIS.=(~~湡xdB_nAw)vR|}̉aOzCh~+#<6ZCX2gK5xǖb%YW=~~Ѫwow9s>}\'Cv˙j~_pQ<4jyKsW?)gއFhs˷2BLjkշcHʝqI;?r!U̠G S?RSqyn@ےt\YO=P TWaMk,ݓϙVcirHWA& T;){࡮AM e8n6TW%òoUԪFewBr5sg-{7-_+|idWGO)MnŁ|)0*_sZR-{\e;hfOSWzGXJ0=RoF;z;sߋk7w6\$hwz˹h]}lc@B3dgm;uӯ|l;pEW_ԗ;zg4]k}0]৸ozWXskz=UWM=ٵX S[ѣǦB_uQ}sM }mr]SlEϻJ/H=7~tc(0[ ԋ_-5U;@k.ozj*g:~4}nFqJ善^=OQi((jTTW_s^IF[TʃԳ;}7oLvaeʶioX"^̏ft6eh!LZ,lefyp/)WjZH])Qʘνb9+V"=;ҨT\Y/\wms*"[w**W}R[mSEY- Mp- \>]W{7=wk=>ROOsOSKOc̨[!c vS wpc뇹\(}{nPCfSek?;XiQ ̭}ګlŀ,[0oȖ$gUݫ>#֠r8Q,(OԊJf&z+^mf/V?)u7I %W.ĸyK[K6bdϾ[nK#<Ve{ɠ-0}.g| {i25#@l8|p 0l3eg>,uVS7*S5إfF-'mU)S؝ޙ}Ĥkpwg)d+w.۝<;%Գbe-\4DRo'xZnmn*Vt'P?z5jV{YͶ˕o$@U9A=.'1OcJg+ n_q`3 {Ƕ[?onZ?Qi+Ej]_[h[,L)lm=.X7nEP};9A߾@)'_b6q5y?]UAې z\&isr6iR"ճtPAy*E?*>l\[N@H`Eu|E>;ձrl4T!6oZ:Uܻ,gAځX0򮣎y#ߢk [W,{AP^zU픕WU]~el#͏\/I-u~6kغr[#{ybжLj5Gs޻"kϝ)Luwra[_s~S ܉\r(`]0--;%5?,44H{ qs#g?W^3_eMOX*=?;|ϿnTees~6]g*;#057 aT?ΐ5~Squ.0F|5υޫ* ԶavW"MgK-}}mv,łW@E/GeuِQrG6d\Hz0SZ~rG6s?%L Eśyl9+էEyH3kFد~me ۝ݓ؏M>퇹{*{yگzO<}HD;>s<ڦ1\r޷w2]ޏۻW^3_ VX֒z%D\տ}x?93_~*ϔb6{F yſoqȶ|_0;G4ѿ*veΥl!p\.nm5M_(W _5h~*m*/ošOcJ Q.+MLymMr{y*oFYB>Tp/񹿸^垆6l!T?g~o bGs{mYF2dT5Q~=Pt9"[ɓ.kbo p𳦯ߣ~[ {զvMk~@`5-+bq[Zk~.ew뇍ohqvn+͍UE7U6}oU,S$翛z7M{d*6O +au+28 Vy-w\ir{rr1V˽)ȱMkc;[^c6R-_˽6k^;wyQBr#<~-j遜̹ZAi!{?ݑ֧B\՟KO̗XsŸaJj~m }=\x2R/iY״3pyt0M\O^^Em:\R:eab^e'0m;*v+d߷=Y.ׅw;z (lumzZmW瞵z0`!,ߖLiݦܢ}߄t#q3҇lh:ݞ>ݟUn t}@"D-SRUzn$W~KϪ8#y]_/N\CR t͈hRUe+k:qmCyxyغb^/Cg[Rgij;b1KbLwޚm5t;~_uz$هrUKr4\ M)뙮s4:w_MG?_fÜa a& +}Dۓ(& KM~r\?~v+(=MO-҂3!V~[MgτX|>>]TdR[RfM{$$ lȬ!WW ouU!Mc ?ۇ@ɛӫM!ҮBu?F+^r%Kr╶o%(>Y{Zuݝ.RR[KNEMߥRS'J{mII\jF[׍4IOWkoT'!wE+MB/nQsu K{xξY ooG['~~9-NzN ѩwiҽjZ/׶7W8i^.^_O^J{CJOĽqr}i;/P_<|ON|V>KmrvR^iߖbK+4Jhѫ˳")zU, <D }w\zW놚a;!۳7HݿNo1cOe BZʒ_Ys'3_ACoY`ϲjIW<۸h]m[ 3`C(ښ=dqWY Ӌ_zf_7N]^ҩmMږv�^?;~rSٓ4=Uv%mFh]8kqJQ$?KODdB\7d?o7nD[_-m~y6ߙhm[T։I7VjGqm'ݣyqъw_;}xߩFTucɔYl72nPsJu.yj;oK+vjYtUϾmRICY:GRSM׎\(x_,!r2=;xp-Foonx߻#m0`mȱ#+K2nj!BIOm^4!&o~Bs{<xڏڣ.A&WŵfNEWtRZiW\|\gY G!MmlRgY"w֕Znb"\7EB+q6`ZmYl.6 bӕO/vHzrҼxxsX^>BĦԎi"Dz&CR#M_^7Q#! &0mQ<Լ-6S!^.InTIm[vǚV])D!BڵQ%Xr,! ey䣻hT6CbeC[\ϲmo YwPdxi[jF0M~u[iA T_կ{j’7:;[?c;_]X:XmC eT/ZHe;HT;XnBX|n=>΂V~3~Ԏ(^?ϖ W/S%e*;b[BWY,URV65o[쁇!?io\wC6 ~dy%Òr{m۶ui )Wkʌy(Kdr ~.~b|;$h]CUD ZmE9@ަ!啁GmD[;/v^de(2;-bWx4KXi_gA$$M.΋2im zekA3y.<|ÝIMmxbS^S{c6@S6:60>o|Ƿq&|_C->]n[|)aG! '~ݦU鯶A䷟GYY *d,!PNu#MZ|}&]Fg;_-_ˇ0Dqީ3эt͕4աizBD۸n\Xʮyl0mٍ'm}>u?t>WD}cS{ݦykKRnrIkBD-DԌfu9Zݾ-cwj; ?Z'o|SwEZf/P*a#.bk{l⧣OϾnW\O.~i،w df~k~^v;oA> '{=~lr߽۵+a0׍J;jwZvv:f-D$[=Z?ZJQkqti׍N]vZnoNN^jU=Km9#{+|Gr f)\&mlj9;~j$}(o:G^v,5} jIqG Q۪me弝F7{ŋWlm3x́6A3_jv !DKeB~Ů3#ӿSn cV54SXp,M8x22?oxE뢕xrj_dNYӝ沫Uz;\4Yi$]9U&N+AzƛG;_-_{߾N,eL9~ރ~y[}ol8&qvwt!xwXi 9MO6nx1NrOU<{TTwJ\U(?⏅J|.~0w{a?|{]?;uNmg8I mv"p~.Zq!%dFQܩ_ճӇm~nd#8ׯ/BԿ![YF'BD$֣G;B|W_*S2ҥfwۈ],/흯'!h޶]?|"D$Dr8;xyEXk"8Mi"Ŷ=Y~z6s弭VBg_sW3!Ķs[ֽތ`yF{?kޞǧ7w6C>\U/7}^iD~|:1qs aF+hFK.ezm)'xc!8~I/(hk A+=MI7ڒsa¨,kq;z%j_뇗;_v~Y?KͥےX߮u돾^Ih}yj7WҳN=!n[>d7hޞSmn}soپ-6l>K2>pm#e|mHv+e=oh$W[}CѪ9nY"G·g)eV!F]i/5;jY;/Myy?ޑ!EkVRtW_O\9DxQN[,}xy;u^?ޑ#jV7WKN+|P U'o[޶i>w= Urj[bDOm Ė<0vqPl۝ϮO+؏nq.6Wګ+~KQ6jF̳bsi!>Șœb\/58ރelOțԷ7Wڋrmq5ϞYb!ľZlK~p#ZVBmml'ggBttdwwJJ}q8ޏ7بo^}}Xio,F./wQԩw~BE=JӤuCtQB((aFo{'Rj{t6 2m|7??am{5Zj󭏳?R[q__Bl|翇TEFjc훧{Y|x.}dOqj\<|W'=M#!(M从d Kddjr BlKo~C_m^mrAIB4geﲷZJg96->r{\֢(-H ѩwQ|xGB?F[/kbMdt~B,՗LWk_vvYQXI!DQl?^'!֖)sFu!Vc(im{M<|=eH]&ώlٰ'N>Q?t a EO>j]=Ɵ RsuYu?/>w&66poߚphw+vPf}2𘟔|#au:le#7Ζϖ嘇kNƽƽ,n\7o]IfÇߴ^$嗗Ii*Yi^!;8V5ՙ`Vw4μ @0rdx|,o{܆@sCZVn=x(τHߧ/? .>>KOe+q%s!6?TYl6R;Md~/eYǣJuvnO{CN[j|猚aгxTSRLgF}`V ?>9mz*lfUʙesY%~P?"~"ZK g;m)#}rχ*ef|yۭw;v2 zy[OImS UoٞBw-]~+Ķ')3QBUwٺc _u.0| ܺ4g`P~0SܡH5h~0$L'OHa~@ !@v_R?ej)M7uc!|999kWRxܩ:ڜu1= )w>} 2X IZfTZ?{"2Kզ0UP5+('xmJϴ\U+ʃRe6R{k^ x*|%'E5-E&IO^YӘzw59t4>'ԚVYmрѺw 1v2A*qT&ymwn^On4+ N{kU%7gܘL;1P*::E]cAݟ=Q؞ 埗IRnj?ny=&3sQy,3L21LFIjÛw4SL>Z?$0?B ,<{$qhpp㐄0nt@?B ~#֏֏I ;;;}j g'OO<f |iJǿ:;8;8;ߞ#G$AH O?!5g˝Xق# ~ 29[‚zw,5-ssn~*HCR F@ J'jˉe~֞<.pE%bܽ^^7⳷?`\?̭qh"F>ä8ŽQ5l7|)L\ p1|nU$7eJh+>OmG4펪{8ŽFo[?lkT0" #G:Ig1o>ֿ4VY{:wuN'JmM񥌻m)IC`ɛ iQ$vY-܍;]M,Q]M>garR `dbXO,92U)d%9oQ`)\u#}>̒çϒ_}Rv,Q>YܝbJ=W]FWͳ@WχQG9yFr/鳶[t/3OpB]R*;tglS{oq T.Ũyu0RVbۖ_{!Fζ#ܩMޞ^Uݶfx8ko5:Vdj(? gv` =QL?qti = Ƅwr6<0sх'ԱQTݢՂ0pN?UFem6U܎fMNrCgW'%Ӟ`?G `Xմq(>}95u]5lU1@qaϫ|E gjgJ/niYrV}`ŵ7@U''f{r߀mqc'}6G5}tÏ p^9z DOCG?W1gg\|K~Om?KܕZ\tAħ zz ֱge{:^l[G{oeχOvǛF0m˸Ǜ N=Gʟ;5lh%3}F[p8i Dyt]=U׀Iy>;>m ck8Pޔ܅L1R{r`7sb>ֱֽGrUi*jwIaZ98#çA&9q s1WNA۫䮞NZٖ 烝#m' a|mÿYMm_ G|)& o!Ӂ6eHs?`fU>zQ7SL ѾQj%GVƭ6-oi,Y ֶci Txw V!8Z?Z?Z'YU>˨M_rAQuAzJS{յ0!MʽO2Q, 7Wq)gIW}ô?؂ے#R5Ʊ>F ;~|5,%ܼ&9FoUuJE6XBn7,Lc?"#1ivw(0uoI+Uq0w7c{!iiX@G`tyUu 2N׿VWfUg'Q*M}^ƿ ٸf #-3<}V*j=UWvGh6fcL"7f90xb=g'i?=~J:㣾{D ̞̆'OO ~$P1;zC ?vA@+|f3^R]֖n%NuOOƱ~}=Gs> {lѮ_ N<0&:jO{IUǽ~`MA1T)z>L8QZ?lݢl˸cU8>~W>i2ݻ:.`{?l(ty&[?\`GȪ?a0F~<=yzd0]dt=>o{ke&'yf ifC^:Aq1!4ϕ7&Ӟ>ߐ-y}0 F~F'|j+N 0 W"ף?}_re{f ?OX4c1-&;Ἇ6mm{8cqaG_g ï߶̸J9צ>)FuUSwiQhhh=΅"H~K%}Vueѧ),q+ U {?vs0Ksmcu6FK*f۟*[wä]hw7Xn!60)٨F>wu~9:f c_Z+ߨwBa{F[ ]s19ggT?̩7}*:[mŧj[f꠻Z~JW^OqZYZy9JwN3іEguNy9ޝc7[ճ|*-t~=}Ī2%GuwUF_fC8*#O|$LjGwK=Pj7Q=whqnTj ?lZOi}bȶQ}w3-?=-/w_$}`v[f'U?vN?z>3yy}:Yw[jvaĿ3WsD ,^ yb+[Т!m̓ ݤxrǑJaJVbZYLZDZt.c!ӂc>-$2] yo^B7-/ 0-h >#+|Fz$06dsrKm== `1Gd٩Wk~O|>?ej~|``|.Lj;޶YiU]Js[n}4i[ Hl!mڷJ*봽;mï__ACV}B6u=>c :F%T]fW02f&fq[1խ6~aYV}~7g,,` ) ?Ssm߇Y,2>YuT 25CeEJ\Iުk??.l{Yg=QOܟLM1c3}֫UŝzE߽6$Z<&ߔ~تh6 v 0iUŴuwǑ>B[2̱ ) ?{WLݣlRѫOUege c$-QvGhxpW͌TE>30*~s0Gs\$wqٸl\`Tz ) ?&tS~pCE+LĻ^R]֖n%NuOOƱ~}=m.S)lI;@we^;W}K?!󡌻OPY2GCχiǒ: `ZL}뇭[mowwq\ï +3ʧ2m[6c{W( Դ~ ]h=15GȪ?a0~4.KN0&:}b' +c6~a~@ Ss7gߜ}^qﭺL) ?s>kE2?0CSMwoW_OS~TTu:V|`_tpp$0&m?9~r^)%t@?B 흝$q[ߛ-GN?9~rhh5N4֐ ~@ @}OybIENDB`gtamsanalyzer.app-0.42/Source/Documentation/0000755000175000017500000000000010162465511021417 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/dotGraphWatcher.h0000555000175000017500000000504010162465511022045 0ustar brentbrent00000000000000/* dotGraphWatcher */ #import #import #import "MWDoubleDictionary.h" @interface dotGraphWatcher : NSObject { IBOutlet id arrowDirMenu; IBOutlet id nBorderMenu; IBOutlet id nShapeMenu; IBOutlet id nGroupMenu; IBOutlet id dgMenu; IBOutlet id fieldList; IBOutlet id levelMenu; IBOutlet id lineTypeMenu; IBOutlet id nameField; IBOutlet id theBoss; IBOutlet id thePane; IBOutlet id typeMenu; IBOutlet id saveButton; IBOutlet id attribTable; IBOutlet id edgeAttribTable; IBOutlet id fromMenu; IBOutlet id toMenu; IBOutlet id ftStyleMenu; IBOutlet id ftDirMenu; IBOutlet id ftTypeMenu; IBOutlet id countSwitch; IBOutlet id codeLevelSwitch; //----- Specific node IBOutlet id snVarMenu; IBOutlet id snValMenu; IBOutlet id snShapeMenu; IBOutlet id snStyleMenu; IBOutlet id snTable; NSMutableDictionary *snDict; //----- Specific edges IBOutlet id seVarMenu; IBOutlet id seValMenu; IBOutlet id seShapeMenu; IBOutlet id seStyleMenu; IBOutlet id seTable; MWDoubleDictionary *seDict; IBOutlet id seDirMenu; IBOutlet id overrideSwitch; IBOutlet id codeLevel; NSMutableArray *colList; NSMutableArray *dndList; int dndNdx; MWDoubleDictionary *pairCount; MWDoubleDictionary *pairAttribs; MWDoubleDictionary *edgeAttribs; NSMutableArray *pairList; NSMutableArray *colPool; NSMutableArray *attribs; BOOL graphvizInstalled, saveFlag; } - (void) doDotGraph; - (IBAction)addDotGraph:(id)sender; - (IBAction)cancel:(id)sender; - (IBAction)delAllDotGraph:(id)sender; - (IBAction)delDotGraph:(id)sender; - (IBAction)writeDotGraph:(id)sender; -(void) doDotGraph; -(IBAction) addAttrib:(id)sender; -(IBAction) delAttrib: (id) sender; -(IBAction) delAllAttrib: (id) sender; -(NSString *) attribNdx: (int) rowIndex; -(NSString *) findAttrib: (NSString *) who forWhat: (NSString *) what; -(IBAction) addEdgeAttrib: (id)sender; -(IBAction) delEdgeAttrib: (id) sender; -(IBAction) delAllEdgeAttrib: (id) sender; //-(NSString *) edgeAttribsForFrom: (NSString *) from To: (NSString *) to; -(void) openGraphviz: (NSString *) theName; -(IBAction) snValHandler: (id) sender; -(IBAction) snAdd: (id) sender; -(IBAction) snDel: (id) sender; -(IBAction) snDelAll: (id) sender; -(IBAction) seValHandler: (id) sender; -(IBAction) seAdd: (id) sender; -(IBAction) seDel: (id) sender; -(IBAction) seDelAll: (id) sender; -(IBAction) override:(id) sender; -(int) codeLevel; @end gtamsanalyzer.app-0.42/Source/dotGraphWatcher.m0000555000175000017500000006531310162465511022063 0ustar brentbrent00000000000000#import "dotGraphWatcher.h" #import "utils.h" #import "tamsutils.h" #import "prefBoss.h" #import "MGWPopUpButton.h" int moveInArray(id who, NSMutableArray *theArray, int row) { int dndNdx; dndNdx = [theArray indexOfObject: who]; if(row > dndNdx) { [theArray insertObject: who atIndex: row]; [theArray removeObjectAtIndex: dndNdx]; return row; } else if (row < dndNdx) { [theArray removeObject: who]; [theArray insertObject: who atIndex: row]; return row +1; } return row; } NSString *seDirNames [] = { @"Both", @"Forward", @"Backward" }; NSString *nodeShapes[]={ @"plaintext", @"box", @"ellipse", @"hexagon", @"house", @"point"}; NSString *edgeType[]={ @"both", @"forward", @"back", @"none"}; NSString *edgeStyle[]= { @"solid", @"dotted", @"dashed", @"invis"}; NSString *borderStyle[] = { @"solid", @"bold", @"dotted", @"filled"}; @implementation dotGraphWatcher -(id) init { [super init]; dndList = [[NSMutableArray alloc] init]; colList = [[NSMutableArray alloc] init]; pairList = [[NSMutableArray alloc] init]; pairCount = [[MWDoubleDictionary alloc] init]; return self; } -(void) onExit { [colList release]; [pairList release]; [pairCount release]; [attribs release]; [pairAttribs release]; [edgeAttribs release]; [seDict release]; [snDict release]; } -(void) dealloc { [dndList release]; [super dealloc]; } - (IBAction)addDotGraph:(id)sender { } -(int) codeLevel { return [codeLevel intValue]; } //NSPRINTF(X) appendString: [NSString stringWithFormat: X] -(NSString *) properNameForVariable: (NSString *) X Value: (NSString *) Y { //is this _code? if([X isEqualToString: @"_code"] && [codeLevelSwitch state] == NSOnState) { int lvl; NSString *nc; lvl = [self codeLevel]; nc = codeToLevel(Y, lvl); return nc; } else return Y; } -(NSString *) nodeNameForVariable: (NSString *) X Value: (NSString *) Y { //is this _code? if([X isEqualToString: @"_code"] && [codeLevelSwitch state] == NSOnState) { int lvl; NSString *nc; lvl = [self codeLevel]; nc = codeToLevel(Y, lvl); return [NSString stringWithFormat: @"%@:%@",X, nc]; } else return [NSString stringWithFormat: @"%@:%@",X, Y]; } #define NODENAME(X,Y) [self nodeNameForVariable: X Value: Y] #define PROPERNAME(X,Y) [self properNameForVariable: X Value: Y] -(void) savePanelDidEnd: (NSSavePanel *) sheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == NSOKButton) { [self openGraphviz: [sheet filename]]; } else { } } -(void) projectGraphviz: (NSString *) theName { NSTask *mytask; mytask = [[NSTask alloc] init]; [mytask setLaunchPath: [gPrefBoss dotDir]]; [mytask setArguments: [NSArray arrayWithObjects: @"-Tps", [NSString stringWithFormat: @"-o%@.ps",theName],theName, nil]]; /* [[NSFileManager defaultManager] createFileAtPath: [NSString stringWithFormat: @"%@.ps", theName] contents: @"" attributes: [NSDictionary dictionary]]; [mytask setStandardOutput: [NSFileHandle fileHandleForWritingAtPath: [NSString stringWithFormat: @"%@.ps", theName]]]; */ [mytask launch]; //[mytask waitUntilExit]; if([gPrefBoss useGV] == 1) { NSLog(@"Using gv\n"); [NSTask launchedTaskWithLaunchPath: [gPrefBoss gvDir] arguments: [NSArray arrayWithObjects: [NSString stringWithFormat: @"%@.ps",theName], nil]]; } else if([[NSWorkspace sharedWorkspace] openFile: [NSString stringWithFormat: @"%@.ps", theName]] == NO) { NSString *mywarn, *mygraphfile; mygraphfile = [NSString stringWithFormat: @"%@.ps", theName]; mywarn = [NSString stringWithFormat: @"Could not open application for file \"%@\"", mygraphfile]; NSWARNING(mywarn); } } -(void) openGraphviz: (NSString *) theName { { // NSString *theName = [NSString stringWithFormat: @"/tmp/tams %@%@.dot", [nameField stringValue], uniqueFileName()]; //NSString *theName = @"/Users/Matthew/out.dot" NSMutableString *ans = [[NSMutableString alloc] init]; NSArray *data; int i,j, k,cnt, cnt2, cnt3; NSMutableArray *fieldValues = [[NSMutableArray alloc] init]; //set the open [ans setString: [NSString stringWithFormat: @"digraph \"%@\" {\ngraph[overlap=no]\n", [nameField stringValue]]]; [ans appendString: [NSString stringWithFormat: @"edge[dir=%@ style=%@]\n", edgeType[[[arrowDirMenu selectedItem] tag]], edgeStyle[[[lineTypeMenu selectedItem] tag]]]]; //get the selected cols //assemble the scale { if([[levelMenu selectedItem] tag] == 0) { [ans appendString: [NSString stringWithFormat: @"{\nedge[color=white]\nnode[shape=plaintext]\n"]]; cnt = [colList count]; for(i = 0; i < cnt; i++) { if(i == 0)[ans appendString: [NSString stringWithFormat: @"\"%@\"",[colList objectAtIndex: i]]]; else [ans appendString: [NSString stringWithFormat:@"->\"%@\"", [colList objectAtIndex: i]]]; } [ans appendString: @"\n}\n\n"]; } } //get the data data = [theBoss hotData]; //go through and for each column assemble the data and { cnt = [colList count]; cnt2 = [data count]; for(i = 0; i < cnt; i++) { for(j = 0; j < cnt2; j++) { id thisRec; thisRec = [data objectAtIndex: j]; addUniqueToArray(fieldValues, PROPERNAME([colList objectAtIndex: i], [thisRec objectForKey: [colList objectAtIndex: i]])); } //then create a "same" if([[levelMenu selectedItem] tag] == 0) { [ans appendString: [NSString stringWithFormat: @"{rank=same; \"%@\";", [colList objectAtIndex: i]]]; cnt3 = [fieldValues count]; for(j=0; j < cnt3; j++) { [ans appendString: [NSString stringWithFormat: @" \"%@\"", NODENAME([colList objectAtIndex: i], [fieldValues objectAtIndex: j])]]; } [ans appendString: @"}\n"]; } //at the same time we should do the boxes!! FORALL(fieldValues) { NSString *a;//, *aa; a = [self findAttrib: [colList objectAtIndex: i] forWhat: temp]; [ans appendString: [NSString stringWithFormat: @"\"%@\"[label=\"%@\"]\n", NODENAME([colList objectAtIndex: i], temp), PROPERNAME([colList objectAtIndex:i], temp)]]; /* if((aa = [nsDict objectForKey: NODENAME([colList objectAtIndex: i], temp)]) != nil) { [ans appendString: [NSString stringWithFormat: @"\"%@\"%@\n", NODENAME([colList objectAtIndex: i], temp), aa]]; } */ if([a isEqualToString: @""] == NO) { [ans appendString: a]; [ans appendString: @"\n"]; } } ENDFORALL; [fieldValues removeAllObjects]; } } [fieldValues release]; //go through and count the # of maps { NSArray *fk, *sk; NSString *ea; int xcnt; int ycnt; ycnt = xcnt = cnt; if([[typeMenu selectedItem] tag] == 0) xcnt = 1; [edgeAttribs removeAllObjects]; [pairCount removeAllObjects]; for(i = 0; i < xcnt; i++) { if([[typeMenu selectedItem] tag] == 2) { ycnt = i+2; //kludge to make the this for loop only go one time if( ycnt > cnt) continue; } for(j=i+1; j < ycnt; j++) { for(k=0; k\"%@\"[label=\"%d\"]", temp, currVal, [pairCount intForKey1: temp key2: currVal]]]; else [ans appendString: [NSString stringWithFormat: @"\"%@\"->\"%@\"", temp, currVal]]; if((eans = [seDict objectForKey1: temp key2: @"Backward"]) != nil) { //first [ans appendString: eans]; } else if((eans = [seDict objectForKey1: temp key2: @"Both"]) != nil) { //first [ans appendString: eans]; } else if((eans = [seDict objectForKey1: currVal key2: @"Forward"]) != nil) [ans appendString: eans]; else if((eans = [seDict objectForKey1: currVal key2: @"Forward"]) != nil) [ans appendString: eans]; else if([edgeAttribs objectExistsForKey1: temp key2: currVal]) { [ans appendString: [edgeAttribs objectForKey1: temp key2: [sk objectAtIndex: i]]]; } [ans appendString: @"\n"]; } } ENDFORALL; } [ans appendString: @"}\n"]; [ans writeToFile: theName atomically: YES]; if(saveFlag == NO) [self projectGraphviz: theName]; // [[NSWorkspace sharedWorkspace] openFile:theName withApplication: @"Graphviz.app"]; } } - (IBAction)cancel:(id)sender { [thePane orderOut: sender]; [NSApp endSheet: thePane returnCode: 0]; } - (IBAction)delAllDotGraph:(id)sender { } - (IBAction)delDotGraph:(id)sender { } -(void) dotGraphDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode) { } [self onExit]; } - (IBAction)writeDotGraph:(id)sender { NSSavePanel *msp; NSEnumerator *nnn; NSNumber *ndx; nnn = [fieldList selectedRowEnumerator]; [colList removeAllObjects]; while((ndx = [nnn nextObject]) != nil) { [colList addObject: [colPool objectAtIndex: [ndx intValue]]]; } if([colList count] <= 1) { NSWARNING(@"Select fields for graphing"); return; } if(saveFlag == YES) { msp = [NSSavePanel savePanel]; [msp setDelegate: self]; [msp setRequiredFileType: @"dot"]; [msp beginSheetForDirectory: nil file: nil modalForWindow: thePane modalDelegate: self didEndSelector: @selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo: nil]; } else { NSString *theName = [NSString stringWithFormat: @"/tmp/tams %@ %@.dot", [nameField stringValue], uniqueFileName()]; [self openGraphviz: theName]; } //[thePane orderOut: sender]; //[NSApp endSheet: thePane returnCode: 1]; } -(IBAction) override: (id) sender { if([overrideSwitch state] == NSOffState) { saveFlag = NO; /* if(graphvizInstalled == NO) { NSWARNING(@"Graphviz is not properly installed, will prompt for file to save"); [overrideSwitch setState: NSOnState]; saveFlag = YES; } else saveFlag = NO; */ } else { saveFlag = YES; } if(saveFlag == YES) [saveButton setTitle: @"Save graph"]; else [saveButton setTitle: @"Show graph"]; } -(void) doDotGraph { id columns; int n; /* if([[NSWorkspace sharedWorkspace] fullPathForApplication: @"Graphviz"] == nil) graphvizInstalled = NO; else graphvizInstalled = YES; */ graphvizInstalled = YES; if([gPrefBoss saveGraphviz] == 0 && graphvizInstalled ==NO) { // NSWARNING(@"Graphviz is not properly installed, will prompt for file to save"); // saveFlag = YES; saveFlag = NO; } else if (graphvizInstalled == NO) { saveFlag = YES; } else if ([gPrefBoss saveGraphviz] == 1) saveFlag = YES; else saveFlag = NO; [codeLevel setIntValue: [theBoss codeLevel]]; if(saveFlag == YES) [overrideSwitch setState: NSOnState]; else [overrideSwitch setState: NSOffState]; [dndList removeAllObjects]; // [fieldList setVerticalMotionCanBeginDrag: YES]; [fieldList registerForDraggedTypes: [NSArray arrayWithObjects: NSStringPboardType, nil]]; NSLog(@"register drags\n"); attribs = [[NSMutableArray alloc] init]; colList = [[NSMutableArray alloc] init]; colPool = [[NSMutableArray alloc] init]; pairList = [[NSMutableArray alloc] init]; pairCount = [[MWDoubleDictionary alloc] init]; pairAttribs = [[MWDoubleDictionary alloc] init]; edgeAttribs = [[MWDoubleDictionary alloc] init]; snDict = [[NSMutableDictionary alloc] init]; seDict = [[MWDoubleDictionary alloc] init]; columns = [theBoss tableColumns]; [nGroupMenu removeAllItems]; [fromMenu removeAllItems]; [toMenu removeAllItems]; [snVarMenu removeAllItems]; [snValMenu removeAllItems]; [seVarMenu removeAllItems]; [seValMenu removeAllItems]; FORALL(columns) { NSString *idfr = [temp identifier]; if([idfr isEqualToString: @"#"]) continue; else if([idfr isEqualToString: @"_code"]) [colPool addObject: [[idfr copy] autorelease]]; else if([idfr characterAtIndex: 0] == '_') continue; else [colPool addObject: [[idfr copy] autorelease]]; /* OLD code if([theBoss fieldType: [temp identifier]] > 0) { [colPool addObject: [temp identifier]]; } else { if([[temp identifier] isEqualToString: @"_code"] || [[temp identifier] isEqualToString: @"_doc"] ) [colPool addObject: [temp identifier]]; } */ } ENDFORALL; n = [colPool count]; //[snVarMenu setDelegate: self]; //[seVarMenu setDelegate: self]; /* for(i = 0 ; i < n; i++) { [ snVarMenu addItemWithTitle: [colPool objectAtIndex: i] action: @selector(snValHandler) keyEquivalent: @""]; [ seVarMenu addItemWithTitle: [colPool objectAtIndex: i] action: @selector(seValHandler) keyEquivalent: @""]; } */ [snVarMenu addItemsWithTitles: colPool]; [snVarMenu setAction: @selector(snValHandler:)]; [snVarMenu setEnabled: YES]; NSLog(@"added snVal\n"); [seVarMenu addItemsWithTitles: colPool]; [seVarMenu setAction: @selector(seValHandler:)]; [seVarMenu setEnabled: YES]; NSLog(@"added seVal\n"); [self seValHandler: nil]; [self snValHandler: nil]; [nGroupMenu addItemsWithTitles: colPool]; NSLog(@"ngroupmenu\n"); [fromMenu addItemsWithTitles: colPool]; NSLog(@"fromMenu \n"); [toMenu addItemsWithTitles: colPool]; NSLog(@"added menus\n"); [fieldList reloadData]; [attribTable reloadData]; [edgeAttribTable reloadData]; [seTable reloadData]; [snTable reloadData]; NSLog(@"tables reloaded\n"); if([gPrefBoss saveGraphviz]) [saveButton setTitle: @"Save graph"]; else [saveButton setTitle: @"Show graph"]; [NSApp beginSheet: thePane modalForWindow: nil modalDelegate: self didEndSelector: @selector(dotGraphDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(IBAction) addAttrib:(id)sender { NSMutableDictionary *tmp; int n; NSString *wh; n = [[nShapeMenu selectedItem] tag]; wh =nodeShapes[n]; tmp = [[NSMutableDictionary alloc] init]; [tmp setObject: [[[nGroupMenu titleOfSelectedItem] copy] autorelease] forKey: @"name"]; [tmp setObject: [[wh copy] autorelease] forKey: @"shape"]; [tmp setObject: [[borderStyle[[[nBorderMenu selectedItem] tag]] copy] autorelease] forKey: @"border"]; [attribs addObject: [tmp autorelease]]; [attribTable reloadData]; } - (int)numberOfRowsInTableView:(NSTableView *) tt { if(tt == fieldList) return [colPool count]; if(tt == attribTable) return [attribs count]; if(tt == edgeAttribTable) return [pairAttribs count]; if(tt == snTable) return [[snDict allKeys] count]; if(tt == seTable) return [seDict count]; } -(IBAction) delAttrib: (id) sender { int n; n = [attribTable selectedRow]; if( n >= 0) [attribs removeObjectAtIndex: n]; [attribTable reloadData]; } -(IBAction) delAllAttrib: (id) sender { [attribs removeAllObjects]; [attribTable reloadData]; } -(NSString *) attribNdx: (int) rowIndex { NSDictionary *who = [attribs objectAtIndex: rowIndex]; return [NSString stringWithFormat: @"\"%@\"[shape=%@ style=%@]", [who objectForKey: @"name"], [who objectForKey: @"shape"], [who objectForKey: @"border"]]; } -(NSString *) findAttrib: (NSString *) who forWhat: (NSString *) what { NSString *pn; NSString *ans; NSString *nn; pn = PROPERNAME(who, what); nn = NODENAME(who, pn); if((ans = [snDict objectForKey: nn]) != nil) return ans; FORALL(attribs) { if([[temp objectForKey: @"name"] isEqualToString: who]) return [NSString stringWithFormat: @"\"%@:%@\"[shape=%@ style=%@]", who,pn, [temp objectForKey: @"shape"], [temp objectForKey: @"border"]]; } ENDFORALL; return @""; } - (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id)info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)operation { if(tableView == fieldList) return NSDragOperationMove;//NSDragOperationEvery else return NSDragOperationNone ; } - (BOOL)tableView:(NSTableView *)tableView acceptDrop:(id )info row:(int)row dropOperation:(NSTableViewDropOperation)operation { int n; if(tableView == fieldList) { int currSpot; /* [colPool removeObjectsInArray: dndList]; FORALL(dndList) { [colPool insertObject: temp atIndex: row + __i]; } ENDFORALL; return YES; */ #ifdef SINGLEDRAG if(row > dndNdx) { NSString *tmp; tmp = [colPool objectAtIndex: dndNdx]; [colPool insertObject: tmp atIndex: row]; [colPool removeObjectAtIndex: dndNdx]; } else if (row < dndNdx) { NSString *tmp; tmp = [colPool objectAtIndex: dndNdx]; [colPool insertObject: tmp atIndex: row]; [colPool removeObjectAtIndex: dndNdx + 1]; } [tableView reloadData]; return YES; #else n = [dndList count]; currSpot = row; FORALL(dndList) { currSpot = moveInArray(temp, colPool, currSpot); } ENDFORALL; [tableView reloadData]; [tableView deselectAll: nil]; FORALL(dndList) { [tableView selectRow: [colPool indexOfObject: temp] byExtendingSelection: YES]; } ENDFORALL; [dndList removeAllObjects]; return YES; #endif } else return NO; } - (BOOL)tableView:(NSTableView *)tableView writeRows:(NSArray *)rows toPasteboard:(NSPasteboard *)pboard { id testid; testid = fieldList; if(tableView == fieldList) { /* [dndList removeAllObjects]; FORALL(rows) { [dndList addObject: [colPool objectAtIndex: [temp intValue]]]; } ENDFORALL; [pboard setString: [dndList objectAtIndex: 0] forType: NSStringPboardType]; return YES; */ #ifdef SINGLEDRAG if([rows count] != 1) return NO; dndNdx = [[rows objectAtIndex: 0] intValue]; [pboard setString: [colPool objectAtIndex: [[rows objectAtIndex: 0] intValue]] forType: NSStringPboardType]; return YES; #else [dndList removeAllObjects]; FORALL(rows) { [dndList addObject: [colPool objectAtIndex: [temp intValue]]]; } ENDFORALL; [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; [pboard setString: [colPool objectAtIndex: [[rows objectAtIndex: 0] intValue]] forType: NSStringPboardType]; return YES; #endif } else return NO; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { if(aTableView == fieldList) return [colPool objectAtIndex: rowIndex]; if(aTableView == attribTable) { return [self attribNdx: rowIndex]; } if(aTableView == edgeAttribTable) { NSArray *aa; NSDictionary *dd; aa = [pairAttribs toArray]; dd = [aa objectAtIndex: rowIndex]; return [NSString stringWithFormat: @"%@->%@%@", [dd objectForKey: @"key1"], [dd objectForKey: @"key2"], [dd objectForKey: @"object"]]; } if(aTableView == snTable) { NSString *who; who = [[snDict allKeys] objectAtIndex: rowIndex]; return [NSString stringWithFormat: @"%@%@", who, [snDict objectForKey: who]]; } if(aTableView == seTable) { NSArray *aa; NSDictionary *rr; aa = [seDict toArray]; rr = [aa objectAtIndex: rowIndex]; return [NSString stringWithFormat: @"%@%@ %@", [rr objectForKey: @"key1"], [rr objectForKey: @"object"], [rr objectForKey: @"key2"]]; } } /* -(NSString *) edgeAttribsForFrom: (NSString *) from To: (NSString *) to { NSString *ans; if((ans = [seDict objectForKey: from]) != nil) return ans; else if((ans = [seDict objectForKey: to]) != nil) return ans; else return [pairAttribs objectForKey1: from key2: to]; } */ -(IBAction) addEdgeAttrib: (id)sender { NSString *sss; sss = [NSString stringWithFormat: @"[dir=%@ style=%@]", edgeType[[[ftDirMenu selectedItem] tag]], edgeStyle[[[ftStyleMenu selectedItem] tag]]]; [pairAttribs setObject: sss forKey1: [fromMenu titleOfSelectedItem] key2: [toMenu titleOfSelectedItem]]; [edgeAttribTable reloadData]; } -(IBAction) delEdgeAttrib: (id) sender { NSArray *aa; NSDictionary *dd; int n; n = [edgeAttribTable selectedRow]; if(n < 0) return; aa = [pairAttribs toArray]; dd = [aa objectAtIndex: n]; [pairAttribs removeObjectForKey1: [dd objectForKey: @"key1"] key2: [dd objectForKey: @"key2"]]; [edgeAttribTable reloadData]; } -(IBAction) delAllEdgeAttrib: (id) sender { [pairAttribs removeAllObjects]; [edgeAttribTable reloadData]; } -(void) buildVarMenuFrom: (NSPopUpButton *) varMenu to: (NSPopUpButton *) valMenu { NSMutableArray *vals = [NSMutableArray array]; NSArray *arr = [theBoss hotData]; NSString *varName; if([varMenu indexOfSelectedItem] < 0) return; varName = [varMenu titleOfSelectedItem]; [valMenu removeAllItems]; FORALL(arr) { NSString *rn = PROPERNAME(varName, [temp objectForKey: varName]); addUniqueToArray(vals, rn); } ENDFORALL; [valMenu addItemsWithTitles: vals]; } -(IBAction) snValHandler: (id) sender { [self buildVarMenuFrom: snVarMenu to: snValMenu]; } -(IBAction) snAdd: (id) sender { if([snValMenu count] == 0) return; [snDict setObject: [NSString stringWithFormat: @"[shape=%@ style=%@]", nodeShapes[[[snShapeMenu selectedItem] tag]], borderStyle[[[snStyleMenu selectedItem] tag]]] forKey: NODENAME([snVarMenu titleOfSelectedItem], [snValMenu titleOfSelectedItem])]; [snTable reloadData]; } -(IBAction) snDel: (id) sender{ int n; NSString *who; n = [snTable selectedRow]; who = [[snDict allKeys] objectAtIndex: n]; [snDict removeObjectForKey: who]; [snTable reloadData]; } -(IBAction) snDelAll: (id) sender{ [snDict removeAllObjects]; [snTable reloadData]; } -(IBAction) seValHandler: (id) sender { [self buildVarMenuFrom: seVarMenu to: seValMenu]; } -(IBAction) seAdd: (id) sender { if([seValMenu count] == 0) return; [seDict setObject: [NSString stringWithFormat: @"[dir=%@ style=%@]", edgeType[[[seShapeMenu selectedItem] tag]], edgeStyle[[[seStyleMenu selectedItem] tag]]] forKey1: NODENAME([seVarMenu titleOfSelectedItem], [seValMenu titleOfSelectedItem]) key2: seDirNames[[[seDirMenu selectedItem] tag]]]; [seTable reloadData]; } -(IBAction) seDel: (id) sender{ int n; NSDictionary *dd; NSArray *aa; aa = [seDict toArray]; n = [seTable selectedRow]; dd = [aa objectAtIndex: n]; [seDict removeObjectForKey1: [dd objectForKey: @"key1"] key2: [dd objectForKey: @"key2"]]; [seTable reloadData]; } -(IBAction) seDelAll: (id) sender { [seDict removeAllObjects]; [seTable reloadData]; } @end gtamsanalyzer.app-0.42/Source/enormous icon2b.tif0000555000175000017500000100057410162465511022326 0ustar brentbrent00000000000000MM*(}{z|&+QS*yGHwmyuv53;l;@hh>x$"u%#9GE6usxyAA 3}8Xe!c=8Vr4S6: CN V *,*f U)(v(RyBF%\a(eJZ8&F:Ov/ h2=s$//\ZeHYg[Xe u- _SR \(N/*b,[ ^[kF0;qhuxh;t}K#}CP>3D; ){ 9a`Z#@*%X>}ME=1!z'"0S a B Q>GxZ&LOi+"j#M3*fJ9 ].8{E45tDy_F7rX_w6F-BzuwI6Z!{F'2cXs0 @t:  =2s=g,tg w4ya[kFRvAwL-7rn'PGRLP-K~~wKJu%#|FDcaHedE64?>#>="@43?imk1o)$5hMrGiWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWT|Fg=Z5N-B$6i#D+WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:S?s #3dWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~V~V~V~V~V~VVVWWWWWWWWWW7Q+U*i @_WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVV~V~U~U~U}U}U}U~V~V~VVVWWWWWWWWWWWWWWU}Gi=Z8]@   RyWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~U}U}T|T|T{S{T{T{T|T|U}U~V~VVWWWWWWWWWWWWWWWWWVV~U}T|Mr3~"   LqVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|T{SzRyRxQxQwQxRxSzS{T|U}U~V~VWWWWWWWWWWWWWWWWVV~U~T|SzQwOtLpJmHj?^)/ HkT|T|U}U~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~V~U}T|T{SzQxPvOtNsNsNsOtPuQwRySzT|U}V~V~WWWWWWWWWWWWWWWWVV~U}S{RxOuLpJlFhCcBaA_A`Bb7Q %S  "#$$$#"[;W;V;W>[BaGhKnOtRyT|U~V~WT|De6P(;s  0 "&+04$4gA_@^@^@^A_A`BbCcEeFgHjJlKnLpNsOuPvRxSzT{T|U}U~V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVVVVVVVWWWWWWWWWWWWWWWWWWWVV~U}T|SzQxOtLpIlFgCcA`@^@^A_CbEfIkLoNsPvRySzT|T|U}U~U~V~V~V~VVWWWWWWWVV~V~U}T{RyPvMrJmFgBa>\[BaFhKnOtRyT|U~VWWWWWWDe$F% #(.%7kA_@^?\>[>[>[>[?\?]A_BaCcEfGhIkJmLpNrOtPvRxSzS{T|U}U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWVVVVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWVVVV~V~V~V~V~V~V~V~V~V~V~V~VVWWWWWWWWWWWWWWWV~V~U}T{RxPuMqJlFgCb@^>[=Z=Z?]A`DdGiKnMqOtPvRxRySzSzT{T|U}U}U~V~V~VWWWWWWWVV~U~T|SzQwOtKnGiCb?][BaGhKoOuRyT|V~VWWWWWWWW/Ep! # CcA`@^?\=Z=Y[?\@^A`CcEfGhIkKnLpNsOuQwRxSzS{T|U}U~V~V~VVWWWWWWWWWWWWWWWWWWVVVVV~V~V~V~V~V~V~V~V~V~U~V~V~V~V~V~V~V~VVVVWWWWWWWWWWWWWWWVVV~V~V~U~U}U}T|T|T|T|U}U}U}U}U~V~V~VVVWWWWWWWWWWWVV~U}T|SzQwNsKnGiDd@^=Z\CbGiLpPuSzT|V~VWWWWWWWWWVEe&8n  % ':rEfCcA`@^>\=Z[;W9T9T:U[A_CcEfGhHjIlJmKnLpMqNsOuQwRxSzT|U}V~V~VWWWWWWVV~U}T|RyOuLpHjCc?\\=Z[@^A`CcEfGhIkKnLpNsOuQwRxSzT{T|U}U}V~V~VVWWWWWWWWWWWWWWVVVV~V~U~U}U}U}T|T|T{S{SzSzSzSzRyRyRySzSzSzSzSzS{T|T|T|U}U}U~V~V~VVWWWWWWWWVVV~V~U~U}T|S{SzRyRxQwQwPvPvQwQwRxRySzS{T|T|U}U~V~V~VVWWWWWWWVV~U}T|SzPvNrKnGhCb?\;W8S7Q7Q7R9T;W=Z?]A_BbCcDdEfFgGiIkJmLpNsPuQxSzT|U}V~VVWWWWWWV~U}T|RxOuLoGhBb?\\?]@^A`BbDdFgIkKnMrOuRxSzT|U}V~V~WWWWWWV~U}T{RxOtKnFgBa>[;W;V[@^BaDdFgHjJlLoMrOtPvQxRySzT|T|U}U~V~VVVWWWWWWWWWWWVVVV~V~U}U}T|T|SzSzRyQxQwPvOuOtNsNrMqMqLpLpLpLpLpMqMqNrNsOtPvPvRxRySzT{T|U}U~V~V~VVWWWWVV~V~U}T|T{SzRxQwOtNrMqKoKnJmJlJmJmKnLpMrOtPvQwRxSzT{T|U}U~V~V~VWWWWVV~U}T|SzQwNsKnGhBb>[:U6P4L2J2J2J3L5N6P8R9T:U;V;W\=Z[=Y[?]A`CcEfHjJlLpNrOtPvRxSzT{T|U}U~V~V~VVWWWWWWWWWWVVV~V~U~U}T|T|SzSzRxQwPuOtMrLpKnJlHjGiFgEfDeDdCcCcCbCbCbCcDdDeEfGhHjJlKoMqNsPuQwRySzT|U}U~V~VVVWVVV~U~U}T{SzQxPvNsLpJmHjFgDeCcCbBbBbCcDdEfGiIkKnLpNsOuQwRyS{T|U}U~V~VVVVV~U~T|SzQwOtKnGiCb>[:U5O2J1H0F0G1I3K5N6P8R9T9T:U9T9T:U:V[=Y\@^BaDdFgHjKnLpNsPuQwRySzT|T|U}V~V~VVWWWWWWWWWWVVV~V~U~U}T|T{SzRyQwPvOtMrLpKnIkGiFgDeCcBaA`@^@^?\?\>\>[>\?\?]@^A`BbDdEfGiJlKoMrOtPvRxSzT|T|U~V~V~VVVV~V~U~U}T|SzRxPvOtLpJmHjEfCcBa@_@^?]?]@^A`BaDdFgHjJlLoNrOuQwRyS{T|U}U~V~VVV~V~U}T{RyPvMrJlEfA_[=Y\@^BaDdFhIkKnMqOtPvQxSzS{T|U}U~V~V~VWWWWWWWWWWVVV~V~U}U}T|S{SzRxPvOuNrLpKnIkGiEfDdBbA`@^>\=Z=Y[@^A`CcEfHjJmLpNsPvRxSzT|U}U~V~VVVVVV~U}T|T{SzQwOuNrKnIkFhDdBa@^>\=Z\A`EfIlMqPuRyT|U}V~VWWWWV~U~T|RyPuLpHjCb>[:U7Q6P8S[[[@^BbEeGiJmLpNsPvRxSzT|U}V~V~VVVVV~V~U}T|SzRyQwOtMqKnHjEfCcA_?\=Y;W:V:U:U;V[@^BaEeGiJmLpOtQwRyS{T|U}V~V~V~V~U}T|RyPvNrJmFhBa>[:U7Q5N4M5N7Q:U=Z@^BbDdEeEeDdBa@^=Z[A`EfIlMqPvRyT|U}V~VWWWWV~U}T{RxOtKnGhA`=Z9T7Q7Q9T=YA`GhKoOtRyT|U~V~WWWWWWWWWWWWWWWWWWWWWWWA`)O? /\T|SzRyQwPvOtMqKnIlGhEfCbA`?]=Z[\BaDeGhHjIkHjFgDdA_>[\BaEfJlNrPvSzT|U~V~VWWWVV~U}S{QxNsJmEf@_\@^BbDdFhIkKnMqOtPvRxSzS{T|U}U~V~VVWWWWWWWWVV~V~V~U}T|T{SzRxPvOtMrKoJlGiEfCbA`?]=Z[\=Y;W;V:V:V;V;W=Y>\@^BaDdFhIkKnMqOtPvRxSzS{T|U}U~V~VVWWWWWWWVVV~V~U}T|T|SzRyQwOuNrLpJlGiEfCcA`?\=Z[;W9T7Q5O5N5N6O7R:U=Z@^CcGhJmMqPuRxSzT|U}V~V~V~V~U}T{RyPvMrJlFgBb?\\A`EfHjJmLpLpKnJlGhCc@^=Z;W:V;W=Z@_DdHjLpOuRxT|U}V~VWWWWV~U}T|RxOtKoGhBb>[;V9T:U[@^BaDdFhIkKnMqNsPvQxSzS{T|U}U~V~VVWWWWWWWVVV~V~U}T|S{SzQxPvNsLpKnHjFgDdA`?]=Z[;W:U:U;V=Y@^CcFgIkKnLoKoJmHjEeA`?\\CbGiLpPuRyT|U~V~WWWWWWWWWWWWWWWWWWWWWWWWWW=Z%I8RSzRyRxPvOtNrLpJmHjFgDdBa@^>\=Y;W:U9T9T9T:U;V[@^BaDdFhIkKnMqNsPvQxSzS{T|U}U~V~V~VWWWWWWVVV~V~U~U}T|SzRyQwOtNrLoJlGhDeBb@^>[[>\?\?\?\>[=Z[;W8S7Q5O5N5O7Q9T[@^BaDdFhIkKnMqOtPvQxSzT{T|U}U~V~V~VWWWWWWVVV~U~U}T|T{SzRxPvOtMqKnHjFgDdA`?]=Z\=Z\A_CcFgIkKoNrPvRxSzT|U}V~V~VVVVV~V~U~U}T|SzRxPvNsLpJlGhDdA`>\\;W9T8S9T;V=Z@^BaDdFgGhFhEfCcA`?\\\BbGhLoOuRyT|U~VWWWWWWWWWWWWWWWWWWWWWWWWWWLp)=x  0_RyQwPuNsMqKoJlGiEfCcA`?]=Z[@^BaDeGhIkKnMqOtPvRxSzS{T|U}U~V~V~VVWWWWWVVV~U~U}T|T{SzQxPvNsLpJmHjEfCb@_>\=Y;W:V:U:U:U;W[?]A_BaCcDdDdDdCcBaA_?]=Z[@^BaEeGiJmMqOtQwRyT{T|U}V~V~VVVV~V~U~U}T{SzQxPuNrLoIlFhDdA`?\[@^A`CbCbBaA`?]=Z[[@^BaDeGhIlKnMqOtPvRxSzT{T|U}U~V~VVWWWWWWVVV~U~U}T|S{RyQwPuNrLpJlGiEfBb@^>[\;W8S7Q6P6P8R9T;W=Z>[?\?\>[=Z[A`FgKnOtRxT{U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWW=Y(N QwOuNsLpKnIkGhDeBb@^>\[@^BbEeGhIlKoMrOtPvRxSzT{T|U}U~V~VWWWWWWVVVV~U~U}T|SzRyQwOuNrLoJlGiEeBb@^>[[=Y;W;V;V;W[@^BbEfHjKnMqOtQwRyS{T|U}V~V~V~V~V~V~U}T|S{RyQwOuNrKoIkFhDdBa@^>\=Z\@^A`DdFgIkKnMrOtQwRyS{T|U}V~V~VWVVV~U}T|SzQxOtLpIkEeA`=Z:U7R6O5N5N6P7Q9T:U;V;W;W;V:V:U:U;V[@^CcGhKnNrPvRyT|U}V~VWWWVVV~U}S{RxOtLpHjDd@^=Y;V;V[@^BbEeGiJlLoMrOtPvRxSzT{T|U}V~V~VVWWWWWWVV~V~U~U}T|S{RyQwPuNrLpJlGiEeBb@^>[[BaFgKnOtRxT{U}V~VWWWWWWWWWWWWWWWWWWWWWWWW=[*R+@|LpKnIkGhDeBb@^>[[@^BbEeGiJlLoNrOtQwRxSzT{T|U}V~V~VVWWWWWWVV~V~U~U}T|S{RyQxPuNsLpJmGiEfCb@^>[[@^BbEeGiJlKoNrOtPvRxSzT{T|U}U~V~V~VWWWWWWVVV~U~U}T|S{SzQxPvNsLpJmHjEfCcA`?\=Z;W:V:U:U:V;W=Y>[@^A`CbDdEfFgFgEfDeCcA`@^>[\\@^A`CcFgIkKnNrPuRxSzT|U~V~VWWWVVV~U}T{RyPvMrJmFhCb@^=Z[@^BbEeGhIlKoMrOtPvRxSzS{T|U}U~V~V~VWWWWWWVVV~V~U}T|T{SzRxPvOtMqKnIkFhDdA`?]=Z\@^A`BbCcDdDdDdCbBa@^?\=Y;W9T8R7R7Q7R8S:U\A`DdGhJlLpNsPvRxSzT|U}U~V~V~V~V~U}U}T|SzRyQwPuNsMqKoJmIlIkHjHjIkJlKnLpMrOtPuQwRyS{T|U}U~V~V~VWWWWWWWVV~V~U~T|SzRxPvNrKoIkFgCbA_?]>[=Z[?\?]@_BaCcEeGhIkKnMqOtQwRyT{T|U~V~VWWWWVV~U}T|SzQwNsKoHjDeA`?\=Z=Z>\A_DdHjLpOtRxT{U}V~VWWWWWWWWWWWWWWWWWWWWWWWWEf%6jEeFhDdBa@^>[\[?\@^A_A`A`A`A_@^?\=Z;W:U8S7Q6P6P6P7Q8S;V=Z?]BbEfHjKnMrOtQwRyT{T|U}U~V~V~V~U~U}T|T|SzRyQxPvOtNrMqLpLoLoLoLpMqMrNsOuPvRxSzS{T|U}U~V~V~VWWWWWWWWWWVV~U}T|S{RyPvOtLpJmHjFgDeCcBaA`A`A`BaBbCbDdEeFgGhIkJmLoNrOtQwRySzT|U}V~VVWWWWWVV~U}S{RxPuMqJmGhDdA`@^@^@_BbEfHjLpOtRxS{U}V~VWWWWWWWWWWWWWWWWWWWWWWWV6P!A X(;tEfCbA_?\=Z;W9T8R7Q6P6O6O6P7Q8S:U;W=Z@^BaDdFhIkKnLpNsPvQwRySzT|T|U}V~V~VVWWWWWWVV~V~U~U}T|S{SzRxPvNsMqKnHjFgDdA`?]=Z\?\?\?\>\=Z\A`DdGhJlLpNsPvRxSzT|U}U~V~V~V~V~V~U}T|T|S{SzRxQwPvPuOtOtOtOtOtOtPvQwQxRySzT{T|U}U~V~V~VWWWWWWWWWWWWVV~U~T|T{SzQxPuNsLpKnJlHjGiGhGhGhGhGiHjHjIlJmKnLpMrOtPvQwRySzT|U}V~V~VWWWWWWVV~U~T|SzQxOtMqJmGiEfDdCcCcEeGiJlMqOuRxS{T|U~VWWWWWWWWWWWWWWWWWWWWWWWGi':r  .4LBa@^>[[@_CcFgIkKoNrOuQwSzT{T|U}V~V~V~V~V~U~U}U}T|T{SzSzRyRxQxQwQwQwQxRxRySzSzT{T|U}U}V~V~VVWWWWWWWWWWWWWVVV~U~U}T|SzRyQwPvOtNrMqLpLpLoKoLoLpLpMqMrNrOtOuPvQwRxSzT{T|U}V~V~VVWWWWWWWVV~U}T|SzQxOuNrKnIlHjGiGiHjJlLpNsPvRyS{U}V~V~WWWWWWWWWWWWWWWWWWWWWWW8S%H-X@^@^>[[@_CbEfHjKnMqOtQwRyS{T|U}U~V~V~V~V~V~V~V~U~U}T|T|T{S{SzSzSzSzSzSzT{T|T|U}U}U~V~V~VVWWWWWWWWWWWWWWWWVV~V~U}T|T|S{SzRxQwPvPvPuOuOuOuPuPuPvPvQwQxRxRySzT{T|U}U}V~V~VVWWWWWWWWWVV~U}T|S{RxPvOtNrLpKoKnLoMqNsPuQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWPv0G2  " %.D?]=Z[[@^A`CcEfGiJlKoMqOtPvQxRySzT|T|U}U~V~V~VVWWWWWVVV~V~U~U}T|T{SzRxQwOuNsLpKnIkGiEfDdBa@_?]>[=Z[?\@^A`CcEeGhIkKnLpNsPvQwRyS{T|U}U~V~VVWWWWWVVVVV~V~V~V~V~V~V~VVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVV~V~V~V~U~V~U~U~U~V~V~U~V~V~V~V~VVVVWWWWWWWWWWWWWWWWWVVV~U~U}U}T|T|T|T{T{T|T|U}U~V~V~VWWWWWWWWWWWWWWWWNsHjNsA`#3d + &8o;V:V:V:U;V;W[?]A`CbEeGhIkKnLpNsOuQwRxSzS{T|T|U}U~V~VVVWWWWWVV~V~V~U~U}T|S{SzRxQwPuNsMqKoJlHjFhEeCcBaA_@^?\>[=Z=Z=Y[>[>\?\?]@^A`BaCbCcEeFgHjIlKnLpNsOuQwRxSzT{T|U}V~V~VVWWWWWWWWWVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVV~VVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~U~U~U}U}U}U~U~V~V~VVWWWWWWWWWWWWWWWWV~7Q$Gw *R9T;V;W[@^A`CbEeGhIkJmLpNrOtPvQwRySzS{T|T|U}U~V~V~VVVWWVVVV~V~V~U~U}T|T|SzRyRxPvOuOtMrLpKnJlIkGiFhEfEeDdDdCcCcCcCcCcDdDdDdEeEfFgFhGhHjHjIlJmKnLoLpMrNsOtPvQwRxSzS{T|T|U}V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVWWWWWWWWWWWWWWWWWWW;W*R4++@}=Z?\@^BaDdEfGiIlKnLpNrOtPvQxRySzS{T|T|U}U~V~V~V~VVVVVVVV~V~V~U~U}T|T|S{SzRyQxPvPuOtNrMqLoKnJmIlIkHjGiGiGhGhGhGiGiHjHjIkIlJlJmKnKoLpLpMrNrNsOtPuPvQwRxRySzS{T|U}U}U~V~VVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWNr/E0 \J %7kA_BbDdFgGiIlKnLpNrOtPvQwRxSzS{T|T|U}U}V~V~V~V~VVVVVVVV~V~U~U}U}T|T{SzSzRyRxQwPvOtNsNrMqLpLpKoKnKnKnKnKnKnKnKoLoLpLpMqMrNrNsOtOuPuPvQwQwRxRySzSzS{T|T|U}U}V~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWDd5N3K/F-WBNQ.Z?]FgGiIlKnLpNrOtPuQwRxRySzT{T|U}U}V~V~V~VVVVVVVVV~V~V~U~U}T|T|T{S{SzRyRxQxQwPvPuOtOtNsNsNrNrNrNrNrNsNsOtOtOtPuPvPvQwQxRxRyRySzSzSzS{T|T|T|U}U}U~V~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~U}WNs0G3s R#F8SIkKnLpMrNsOuPvRxRySzT{T|T|U}U~V~V~V~VVVWVVVVV~V~V~U~U}U}T|T|T{S{SzRyRyRxQxQwQwPvPvPvPvPvPvQwQwQwQxRxRxRySzSzSzSzS{T{T|T|T|U}U}U}U~U~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOuLpVA`#3d KPu ([1H#4f%7k-W ` !zSK "2b%I &,A~=Z':q0GNsWWU~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWIl.D&8m':q&J %< "  -1`T, *S#3d ,V;W9T(;s;WWHjA`VWRyU}WWVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWS{WRxJmV~Dd;WFgWWNsQwS{A`A`Bb/E,A*>z$F >#E M6T R $G!@%H4M.D*S /\1*)=w=[,A$5g#4g '(O5OCc/E,A':q:$4g=ZJn4M4L.D)Q-X"B )P5N7R%7k$5h /\ 4*  o Eh> *69iAvYeO00+jh(hT"@fcV}ZSW()m|xtA=G" #  1$  H6L@\lt(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/enormous icon2b.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/enormous icon2b.xcf0000555000175000017500000012767010162465511022332 0ustar brentbrent00000000000000gimp xcf fileBB)/ gimp-commentCreated with The GIMPS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  `Gpx%Transformation     )% z %E z<:875 3 V1FWW0W. W, W W+#W W)*WW'+WW&WW$TWW" FWW! 5WW WW7WW%VW WW W&6W W W WIQWW#6DWW'$+9WW,(( 0 2 4 579;<}<:875 3 1g0. , +4 )>'@&'$|" g! N )Q6  8O  kx#Pd'6@T,";< 0 2 4 579;<}<:875 3 10. , +e )y'}&M$" !  Pj  n % #'i},Ctu 0 2 4 579;<}=;7552 / .,*( '<&]&%w%%%%&&(t)K*#,w/ 1q 4<6 ;i?[-W- GW,W8W4WWW,,RW9W7GW4W GG/W+W##BWW' EE9[CCi,S4#AAx9Qh4 -ii/  +.44a'/eeT[!,4D)94 Y/ +Zff'\  ,/4Z;<9<<5 ,7HH$!=#!W!W8WT W W"W%W5(W*WR ,W -WK .WJ0W0W*0W: W/W= 0W4 /WC .WR -WF1-W )WUI(W7)%WA++"WJ((WU,,W7WG$W,)W;##q#!1S|  ""%N(*y , -n .m00?0V /Z 0L /c .y  -gH- )~k#(Q=%_@@"m;;}AAQ#i*$A  )W44'q#!`  C"%(* , - .00z0 / 0 / . -Ɍ-)E(w%}}"tt 1DQ$~(ffLq?7f.'"=#.&),.0 2g 4 56X78D889868O75٠ 4:3l1 .ܡ +4*[&{i` ˆg<<;P# HH!'a8&%#!      !#%''&%#!      !#%''&%#!      !#%''t: u{a > b}     !"gimp-text-layer(text "{a > b}") (font "Comic Sans MS") (font-size 83.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "c") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) `u|HTu49(}{3+Q0yG. .y -5 , ;,@ͧh-x$1%49G5u5x6A66 668888888!c޴= r 4 CN U)(v\aJ:O v2= \ZeH e u  3}786654S4 !  ! "* #,* $(R %Z&8/' ( s*Y +- `m8u77l78888888888888888Xɠe$8 V!6: V !yBF (e & h $g @ @ @z|&S*Hw  v 3; h>"u#E6syA f%F//[X _ @ @ @SR /*[ kF0u}CP; )aZ#>1!zS a>GOi+f.8Ey_F 6F- BZ!Xs0 @t =2g,t wy a[L-7r߮n'~65wK5%55F2c.H e/ / 06 1?2#>3@ۨ4g @ @ @- .-^,;*xh)K(>3&{% $@!}M   ' B xZ"j #3J9{457rz;;:::9s999k9P @ @ @\q;#*E&* X u w {F'2c 4!FRv A$GRLݺP(Nb,[ht}D 9`%X="0QLM]tD_wI6 =gw-K~Ju#|Dad E   4>="3ٝ?]r:9UDrop-Shadow#1      U &GGU R*4<FFGcG +!      !!    #%(*,--,+)&#   #'+.2589:;:9641-)%   "',16:>BEFGGFEB>:61,&!  %*066/'!  !(/6>EMTZ_cefeb^YSLD<4,%  ")/7>FMU[_cefdb^YRKC;3+$  #)08?GNU[`cefdb^XRKC;3+#  $*19@HOV\adfgeb^XRJC;2+#  %,3:BIPW]beggec_YRJC;3+$  !'-57/)#   ?FLSY^bfhhigda[VOHA:3,%  AHOU[_cfghgea]XRKD=6/)#  KQW\`dfhgec_ZTNHA:3-'!  TY^beggfda\WRLE>81,&   \`dfggec_[VPJC=71+%  befgfeb^ZUOIC=71+&! gda^YTOIC=72,'" d`]YTNIC>83-(# XTNIC>82-(# HC=72-'"'99:;;<>>'==;;;          !#$&&'&%$#!   #&)-024566530-)%!  "'+048:5/)#  "',2780)"   &,28>DJOTY\_befggfec_ZTMF>5-&  "(/64*!  !'/7?GOW]bgjlnnlkmnprttrniaXOD:0&  %,4=EMU\bgjllkifdcbbcegknpqqnjd]SI?4+"  !(09BJRZafiklkieb_[YWWX[]bfilmmjf_WMC8.%  $+4=>@DJPV]begfc^WNE;1'   (08AJS[aehjifa\UNHB=:99;@ELSZ_dggea[SJ@6,#   '/8AJRZ`eijifa\UNHA=977:>CJQX^cgihe_XOF;1(   '.7@IRZ`ehjigc]WPIC>;99;?DJQX_eikkid]UKA8.$  %-6>GOW^dhiihd_ZTNHC?==?BGMTZbhloonic\RH>4*!  #*2;DMU\bfikigc^YTOJGEDEHLRX_ekprsroibYOD:0&   (08@IQY`ehkkjgd_[WSPNMNPTX^djosvwvtog^UJ@5+"  $,44+# %,3;BJQW^cfilmnnmmlmoprsttutrpke_WOF=3+# %,3:AHOU[`dgikllmlmmnmlifb]WPHA91)! %+28?EKQV[^bdfghhgfedca^[WRMGA93,% #)/5;AFKPTWZ\^_``_^][ZYWUROLIFA<61+% !&+05;?DHKNPRTTSRPOMKIGDA?<840,(#  "&+/37;>ACEFFGGFEDCA?=;9641.+(&"  !$(+.135789986531/-+)'%"    #%')*,,+*)('%$"                     78888995~60)"")~60)"")~60)"")$2. +  *  ( $),-+(! ' #+39;;81)! % &09BGIGA9/$  &13(  #/82,%  *8IZjy{uplkjkkjh %-5>FLQTVVSOKE=6/(!  "0?P`p}wphca`aehj !*2;DLSY]``_\WQJB80(   '6EVes}ypf]VQQRV\b #+5>GPX_dhiifb[SKA7.%   -;KZitz}zsi^SJDAAELT $-6?IR\cjnqqokd\RG<1'  %2AP^irutndYLB9435IT_iqw||{vndXK>2&  &4AO[djjg_TG<2+(). '1;EP[entyzytmcXL@3(   ,9GT_hkkf]RG<40/2 '0:DOYcjptusoh_UI=2'  %1?MYdknlg^TKC<:;  (1;ENX`glnomgaXNC9.$  *7ER_iprqkd[SMIH !)27/)"   ,8ER^hpuxxwur &,28<@AA?<72,&   ",7COYbhmoonl $)-135430,'"   )3=HPV[^``_  #&(('$"  %-5=92(' %0;FLPOJA5) & *7DOX]]XM@1#&*8ER\cd_VG7(& '3AO[dgdZL:* & ".P^gidXH7( TJ?2'  !0AR`jmg\L;+ c\QF9,   #2CUcmpl`Q?. jg`WK=0# $4EWfpsncTA/  gigbYM?1# &6IZisuocR?. \chhcZN?1$  *:M^lttm_M:)PZbggbYL>/! .?QbnspfVD2" COZcgfaVH9*  #3EVenoj]L:) :FR]ehe]QC4&  )9J[fljaRA/  6AMXbggbXK<-    .?P^gidYI7'8AKV`fhd]PB3& %4DTagf_P@/  ?FOX`fhf_TF8)  *:JYcgdYJ9(KOU\bghf_UH:-  "1AQ]ef_SC2# XZ]bfihe^TH;-!  +:JXbgd[M<, efhiigb[RF9,!  '5DS_ff`UE4%nlkkjhd^VLA6*   %2AO\dgcZL<+  pmkigc]WOE;0&  $0>LXbfd]PA1#  jgea^YTMF=3*!  "-;HT]bb\RD4&  ][XUQLGA:2*#  )6BNW\]YPC5'  LJHEA=93.(!  #-9DMSTQJ?4'  98641.*&"  $.7@EGFA8/$  ('&$"   !*16885/'    !&)*($             27E{3 -& %+ 2{3 -& %+ 2{3 -& %+ 2>==<<4/0 55 .(!#* 17>5 .(!#* 17>5 .(!#* 17>578:=/6/6/6@++++*?O Drop-Shadow     +hHaOH}p`plOHU`%mmnopX5/+( &  $  #  !  "$$#  ! !%)+,,+($  #).25653/+%  #*16;>?>;71*$  ")18?CFGEB<6.'  '08@FKMMKGA91)!  #,5>FMQSROJC;2)!   '1:CKRUWUQKC;2)    !*4>GOUXXVQJB90'  #-7AKRWYYUOH?6-$    &0:DMTXYXSME;2)     '1; #-8AJPTTQLC:0&  &,39>CGJLLJG %/9CKQTTQKB8.$   (/6=DJOSVXYXWT '1;EMSUUQJA7-#   (08@HOUZ^acdcb_  )4>GOTVUPI@6,"  '09BJRY_dgjllkh #-7AJQVXVQI@5+!  %.8AKT[bgknprrqo &0:EMTYYWQI?5*   "+5?JS\chmprsuus  *4?IQX[\XRI?4*   '12'  #.:FQ[djmmlieb``adgk %02'  &1=IT^fkmlie`\ZY[^cg &1=JU_gkkg`WK?2'  (3?LWahkljfa\WTTVZ_d '2>KV`hllhaWK?2'  )5ANYbhllid^XSQPRW\b &1>JV`gklhaWL?3'   *6COZcillhc\VQNNQU[a %0IR[bgjmnnoop  *5?IRX[[WQI?5+"  $-7AJRZ_dgijjkji (2=GPVZ[XSKB8/%  '/8AIPV[^`bbccba` %/:DNUZ[ZUOF=3)!   '/7>EKPSVWXXWVU #-7AKSX[ZWQJA7.%   '.4:@DGJLLKJH  )4>GPVYZXSLD;1(  $*/48;>?@@??=< &0:DLSWYXTNF=4+"  !%)-/13321/ ",5?GNTVVSNG?6-$  "$&'((''&$ '09BIORRQLF?6-$   "*3;BHLMLIC<5,$   %,4;@DFFC?92*"    %,38<>><83-&   75432 1 1 0 /  ""! #'))(  $*-00/   #*/4776  '.5:=><  #+3:@CDC    %.7?EIJI    (1:CJNPO     )4>GNSUU"  !!   !+6@JRX[[,($  !%())(&"  "-8CMV]`a73.("  "',/121.+&!  #.9EPZafhC>82+#   &,269::74/)$  $/;GS]eknOJC;3+#  ")17<@BBA=82,&  %0EKOQQOKE?7/'   %1>KYeov{ke^UK@5+!  $,6?GNTWXWTNH@7/&  &2?LZfpx}pkd[QF:/%  "+5?HPW[^^\WQI@6-$  &2?LZfpx}rnh`VJ>3(  !*4>HQY_bdb_YQH>4*!  &2?LZfow{spjcYNB5*   (2LXdntxrpke[PD8,!  '0;FPZbhlmje]TI>3(  %1>JWbkqspoke]RF:.#  &0:EP[cjnomiaXMA5*!  %0=IU`hmnmmkf^SG;/$  &/:EQ[dkoqojcYNB7+!  %02&  %.8BKU\cfhgc]UKA6,#  #.9DNV[]\gijf`VK?2'  '0:CLU[`bc`\UMD:0'  #.9DNV[]\hkkgaWL@3(  !)2;DLSY\]\YTME<3*!  #.9DNV\^^kmmibYMA4)  "*3;DKQTVVTPJC;3+#  #.9DOW]``npokdZNB5)  "*2:AGLOONKF@:2+#  #.9DOX_bcqrqle[OB6*  !(07=CFHGEB=70)#  #.9EPYaegturmf[PC6*   &,38<83-'!  #-9EPZbhjvvsnf[OC6*   "(-256652.*$  ",8DOZcimvuqlcYNA5*   "'*,--+)%!  !+6BNYbintrnh`VK?3(   #$%$#   )4@KV`gmomhbZQF;0&    &1?>;60*#    '.65,# 2-'!   )2;CKQUVUQKC:0' 83,%  '09BJQVXXUOG>4*! ?92+$  $-6?HOUYYWRJA7-# E?81*#   )2;DMSXYXSMD:/% KF?81*$  %.7@IPVXXTNF<1' RMF@92-($   !)34*  `\WRLFA<840,($  "+5?HOTUTOH?5+! gd`[VQLHC?;72-("  (24*  ~|yuroljhgeb^YRJA8.%   *4?HPUWVQJA6," }|yuqmjhgfedc`\VOG=3*!  )3>HPVXWSLD9/% ywtokfca`aabba^YSKB8.$  (3>HPVZYVOG=2( sqlgb^[YXY[]__^[VNE;1'  '2=GPW[[XRJ@5*! >mje_YTQPPRUX[]][WQH?4*!  '1@CGMRWZ[XSLC9.$  &0;GQY^_^XQG<1& ]WPIB=98:=CIOUYZXTMD:0%  %0;FPX^`^YQG<1' ZTLE>8546:?FMSWYXTNE;0&  %0;FPX^`^YQH=1' XRKC<73348>ELRWYXTNE;0&  %0;FPX]_]XPF<0& XRKC<74359?FMSWYXTME:0&  %0;FOW\^\WOE:/% ZTMF@;879=BIOTXYXSLD9/%  %0;FOW[\ZUMC8-# ]XRKE@==>BGMRWZZXSKB8.$  &0;EOVZ[XRJ@5+! a]WQLGEDFIMRVZ[ZWQI@6,"  &1;FNUYYVPH>3) fc^YTPNMNPTWZ\\ZVOG=3)   '1GOTVUQJA7,# pqomjhfeddcca^ZTLD:1(  !+5?HPTVTPH?5+! pqqpnljigfeb_[VOG>5,#  $-7AJQUVTOG>4)  mppomkjhfc`\VPIA8/&  '0:DLRVWTNF=2( hklljigeb_[VPIA91(!  !*4>GOTWWTME;1' `ceedca^[WSNGA91*"  %.8AJQVXWSMD:/% VY[\\[ZXURNID>70)"  !)3@BCDCBA>;84/*%   (1:DLSWYXUNF=2( 146776420-)%!  "+4=FNTWXVRKC9/% &(*++*)'%"  $,6?GNSVVSNG>5+"     $-6>FLPRQNIA90'   $,4CEFD@:4,$     &-38<>=;72,%   %*/35541-'"   "&)+,+)&!   !##!     $  $  ' )+05"+/6 "'-14552/*%    !%)+,+)&"   !##"! "  #  %  & )+/6a'0 Empty Layer     + q q<gsqqrsqsvww^zb? ?BW W/W)W%W!W!W$W'W*W,W/W 1W 3W 5W7W9W;WW:WVW:W:W:W HW:W"W:WW:W W:WW9W0W8WMW7WFW6WSW5W1W4W BW2W 'UW0W >W/W*W.WNW*W 8W)W*UW%W!KW$W?W!W 3WW (PWW$DWW).SWW-"GWJW W2,PWW61TWTWW+W,WW:W9 W4W2 W3 W4 W5 W6W8W9W("_y r ocF,"F%H(+G- r/ 1 394779{8192:[::U:j:2:::&9G8'q7g6 z5I4 a2 :}0 [/>.'s*R)>}%1n$!]!L $ # (OcEA:4ZnMLD)-")NR75/3]: 8U* 7̰8 67<4 tf-҄mqJ%<" ©ﻻzF>E 'O‡q:g֗QXB Pkh\4*  3](ƧS4h;P15٣#Tߟ˓ZSW()m|xtA=G" #  1$ ],W,W,W&W!WWF WWJ W WS" WWTD6( WWD WW/ WWVE& WWOWVD$ #W5 &WF'WVD$ )WVL/-W/ .WM' 0WA 2W7 1WTE)3WA5W=5WO;6WL)6WTE)8W=7WN, 7W=9WC"8WT48WE%7WV67WG'7W83WP03W@!2WP1/WNHNA#.WV7 +WOEGF( +W;'WN/$WD53/ WVUWN0WOLVA#WD?D3WI5./"!W:"% WP3&& (WH3--/WC5605%WWW6WWW0 W1 W2 W4 W5,,,&!g m  {3 |eP; e$ E e8 u+d6#N&g)'d5)pE-E.r: 0`) 2R 1|e<3`*5Z%5tW) 6p= 6{f=8Y(7sA7[*9c38|L8f67P!7i: 7S%3vG 3_12vI/sjs`3.~Q$ +ueig: +W*'rE $dNKF- ~}sGup`3d]eLlNEE2 !V2),% vK890(jKBB.#/cNPH.)*57- 60 1 2 4 5,,,&!- 7  c ěs F  n Ui!#&Q'h!)ڈ--.q 0O 26 1v+3S5I5Q6x6x-8N7߀ 7R9c898j7A7r7H32 3`26/d .G +r +R'߇0$ĘW 3d õŔ<Ҙb!aQV3% lo]#+1(ϒZ2E3/ZQS*5kW60 1 2 4 5͙z8/3 S.y!(nF#"0%"p!&%(: ,/b 1{'3M 6Y8V:H -vYeO004:W<W=W@:<=@:<=@WW=WWW W 1'$).1 5 8;>  1'$).1 5 8;> @W=W;W8W6 W4 W2W0W.W,W+W)W'W&W%W#W"W!W W!W"W#W$W%W&W&W'W(W)W)W*W+W+W,W,W-W-W.W.W.W/W/W/W@=;86 4 20.,+)'&%#"! !"#$%&&'())*++,,--...///@=;86 4 20.,+)'&%#"! !"#$%&&'())*++,,--...///*W+W+W+W+W+W+W*W*W*W*W)W)W)W(W(W'W'W&W&W%W$W$W#W"W!W!W WW W!W"W#W$W&W'W(W*W+W,W.W0W1 W3 W5 W7W9W;W=W*++++++****)))((''&&%$$#"!!  !"#$&'(*+,.01 3 5 79;=*++++++****)))((''&&%$$#"!!  !"#$&'(*+,.01 3 5 79;= @WW=WWW W 1'$).1 5 8;>  1'$).1 5 8;> +!%*/4 7;> @W=W;W8W6 W4 W2W0W.W,W+W)W'W&W%W#W"W!W W!W"W#W$W%W&W&W'W(W)W)W*W+W+W,W,W-W-W.W.W.W/W/W/W@=;86 4 20.,+)'&%#"! !"#$%&&'())*++,,--...///@=;86 4 20.,+)'&%#"! !"#$%&&'())*++,,--...///@=:7 5 20.,*(&%#! !"#%&'()*+,,-.//01 1 2 2 3 3 4 4 4 5 5 5 5 66666*W+W+W+W+W+W+W*W*W*W*W)W)W)W(W(W'W'W&W&W%W$W$W#W"W!W!W WW W!W"W#W$W&W'W(W*W+W,W.W0W1 W3 W5 W7W9W;W=W*++++++****)))((''&&%$$#"!!  !"#$&'(*+,.01 3 5 79;=*++++++****)))((''&&%$$#"!!  !"#$&'(*+,.01 3 5 79;= 1 1 1 1 1 1 1 1 1 1 1 1 10000///..--,,+**)(''&%$#"! !"$%&(*+-/1 3 5 7:< @WW=W[@_CcFgIlLoNsPvRxSzT|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|S{RyQwOtMrLoJmIkHjHjHjIkJmLoMrOtQwRyS{T|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWLPTVVUSQNLKKKKKKKKKKKA.|.}/1358:=?BDFGHIJJJJKKKKKKKJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJIIHFEDBA?>===>?ABDEFHIIJJJKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWLOSVVVURPNLK^-z,v+t*s+u,v-y.|.}/-{-z-{.}/1368;>ACEFHHIJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJIIHFECB@?>===>?@BCEFHIIJJJKKKKKKKKUWWWWWWWWWWWWWWWWWWWWWWLORUVVUTROMLK_-y+v+u+u,v-y.}/01+u-z-y-z.}/1479===>?ABCEFHIIJJJKKKKKKKKKVQWWWWWWWWWWWWWWWWWWWWWKNRTVVVUSQOMLKa-y+v+v,v-y.}0134(l.|-z-y-{.}0258;>ACEFGHIII<(k?L '  9D8IIHHHHIIIIIJJJJJJKKKKJJJJJJJJJJJJJJJJJJJJKKKKKKJJJIIHGEDCA?>>=>>?ABDEFHIIJJJKKKKKKKKKKTUNWWWWWWWWWWWWWWWWWWWWKNQTVVVUTRPNMKKa-y,w,w-y.}02456HW #+/.|-y-y.|/,x*3 !Zm?BDEFHE)p !'0HGGGGHHHHIIIJJJJJJJJJJJJJJIIIIIIIIIJJJJJJJKKKKJJJIIHGFDCB@?>>>?@ACDFGHIIJJJKKKKKKKKKKKRVSMWWWWWWWWWWWWWWWWWWWKNQSUVVVUSQPNLKKa-y-y-y.|/24678@L0/~-{-y-z.},6+uACDF+u BFFFFFFGGHHIIJJJC-{HV&.7B(nBHHHHHHHIIIIJJJJJJJJJJJJI(n"]pBBA@???@ABCEFGHIIJJJKKKKKKKKKKKKPVUQLWWWWWWWWWWWWWWWWWWKMPSUVVVUTSQONLKKa-z-y-{/~13>[A_Cb';s,A9T7Q5N4M4M5N  ?JlLpEf:.DNsNsNsOtOtPuPvQwRxSzS{T|T|Hj,V'9pOuRyRyRyRySzSzS{T{T|T|U}U~V~V~V~VVVVV~U~=Z(ONsMqLoKnKnKnKnLpMrOtPvRxSzT{T|U~V~VVWWWWWWWWWWWWWOUVTOLWWWWWWWWWWWWWWWWWKMPRTVVVVUSRPOMLKK`-{-z.|/24@^Bb:V =Y;V8R6O4M4L4M Hj8R #EKoKoKoLpLpMqNsOtPvQxRyRy*>y.IlPvPvPvQwQxRxRySzS{T|T|U}U~V~V~VVVV~V~!AOtNrMqLpKoKoLpMqNrOtPvRxSzT{T|U~V~VVWWWWWWWWWWWWWWNTVURNKWWWWWWWWWWWWWWWWKMORTUVVVUTSQPNMLKK-{-{.}025A_7Q !1`?]P`6A,VEfCb?][@^A`Dd-C  ,AA`ImHj=Y"3c "DdDeEfGhHjJlLoMrOtPvRxSzT{T|U}U~V~V~OtNrLpKnJmJmJmKnLoMqNsPuQxSzT{T|U}V~VVWWWWWWWWWWWWWWWWWLPTVVUSQNLKWWWWWWWWWWWWKLNPRTUVVVVUTSRQPNMLKK#EEgDdA`?\;W8S6P4M4L4L2JA_@^?]?\>\>[=Z=Z8S8S8S9T;V\=ZzMqLpKnJlHjFgDdBbA_3L6=Z>\@^A`CcEfHjJmLpOtPvRxSzT|U}U}U}MrKoJlHjGhFgFgGhHjJlLoNrOuQwSzT{T|U~V~VWWWWWWWWWWWWWWWWWWWLORUVVUTROMLKWWWWWWWWWWKLMOQSTVVVVVUUTRQPONMLKK *?{DeDdBb@^>[;W9T6P5N4M4L5N1I=Z[@^BbEfGiJmMqOtPvRyS{T|T|U}LpJmHjFgDeDdDdDeFgHjJmLpNsPvRxSzT|U}V~VVWWWWWWWWWWWWWWWWWWWKNRTVVVUSQOMLKWWWWWWWWWKLMOQSTUVVVVVUTSRQPONMLKK!@:VBaA`A`@^>[[[?\?\>[=Y;W9T7R6P5N4M4M5N6P  \=Z=Z>\@^BbEfHjKoNsPvRyS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWKMPSUVVVUTSQONLKKWWWWWWKKMNPRSTUVVVVVUUTS!@91*K(n(l(n)p+t3L5N6P8R8S8S8R7R6P5O5N4M4M5N6P7R9T>\\[A`DeHjKnNrPvRxSzSzGiDdA`?\=Y\A`DdGiKnMrPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWKMPRTVVVVUSRPOMLKKWWWWWWKMNPQSTUVVVVVV /\+T'M#E=6/)K(k'i~'j(l)o1H2J4L5N5O6O6O5N5N5N4M4M5N6P7R9T!2aBaBaA`@^>[[?][\@_@^\\;W9T8R8R9T;W>\BaEfIkLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWKLOQSUVVVVUTSRPONMLKWWWWKLNOQRSTU3K0F-B*>y'9p$5h!1`.Y*R&K#D=6'/ "(K&f{%dy%cx%dy&f{-B/E0G1I2J3L4M5N6O6P8R9T;W=Z?]A`Cc@_=Z9T5O2J0F.D.C.D0F2J5N7R;V=Z?\@^A_A`A_@^?]>\>[ ;Y@^?\=Z;W9T7R6P5O5O6P7R9T;V\BaFgIlLpOtPvRxEfA`>[;V8S7R7R8S;V>[A`EfIkLpOtQwSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWKLNPRTUVVVVUTSQPOMLLKWWWKLMOPRST7Q4L1H.D+?|(;t%7l#3d 0],U(O%H!A0:*3&-K&g|%dy%cx%ey&g|.C/E1H2J3L4M5O6P8R9T;V\@^BaDdFgA`=Z:U6O3K0G/E/E0F1I4L7Q:V=Z@^BaCcDdDeDdCcCbBaA`@]@^>[\ 9T7Q5O4M4M5N7Q:U=ZA`EeHjLoNsPvQxEeA`=Z;V8R7Q7Q8R;V=ZA`EeHjLpOtQwSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLNPRTUVVVVUTSRQPNMLKKWWKLMOPQ>\;W8R5N2I/E,A~)=w'9p$5h!1`.Y*S'L8C3=.8)1K&h}%fz%fz&f{'i~/E0G2J4L5N7Q8R9T;V[@^A`CcEfGiIkBa>[:V6P3L1H0G0G1H3L6P9T=Y@^CbEeFhGiGiGiGhFgEfDd=Z@^>[\@^A`CcEeGhHjJmKoBb?\;V7Q4M2J1H1I3K5N8SK9E5?K(l(k(l)n*r3K5N7R:U[A`DeGiJmLoMqMqMqLpLpKnJm)-C@^=Z;V8S6P5O5N6P8R;V=Z@_CcEf%6k#5g>\;W8S6P5N5N6P8Sy':r%7kQbL[FTAO[;W8S5O3K0G.C+?|([@^BbDdFgGiIkJmLoMqNsOtPvPvQwDd@^[A_CcEfGiIlKnLpMrNsOuPvQwRxRyRyDd@^[BaEfIlLpNsPvQxRyRyRyRxQxQwEg"3c=Z;V8R6P5N6O7Q:U=Y@^Cc>\ !1`DdA_=Z:V8R6P5O6P8S;W?\BbFgJlLpOtPv%7m@_=Z:U7Q6P6P7Q9T=Y@^DdHjKoNsQwSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKMNPRSTUVVVVVUUTS!@91* $ HjEeBa?][;W8S6O,x*r(m&g|$cw"]p-{-{.}025A`DdGiKnMqOtPvQxRySzT{T|T|U}U}T|T|Dd@_=Y:U7Q6O6O7Q9T\\y'9p$5h!1`.Y*R&K#D=6'/ !( !JlGhDdA`?\[;W9T7Q6P6O6P8S;W>\BaEfIkLpNsPvQx;W\;W8R5N2I/E,A~)=w'9p$5h!1`.Y*S'L8C3=.8(0 ")PuMqJmGiEeBb7531/~-y` X001258EeHjLoNsQwRyT{U}U~V~VVVVV~V~U}  EeA`=Z:V8R7Q7Q8R:V=ZA`EeHjLoOtQwSzT|U}V~V~V~V~U~U}T|SzQwOt=Z %8mBaBaA`@^>[\BaFgJmMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLMNPBa?][;V8S7Q7Q8S;V>[A`EfIkLpOtQwSzT|U}V~V~VV~V~U}T|SzQxOtLpGh%6j 94N>\?\?\>[=Z;W:U8R6P6O5O6P8R:V=Z@_DdGiKnNrPuQwRx.C[BaEfJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLMNFgCb@^=Y:U6P4L1H.D,@})K9E5?V~SzPvMrKnHj<:8642R223479FhJlMqOuRxSzT|U~V~VWWWWVV~U}Ko$H  +UDdEfA`>\;W9T8R8R9T;W>\A`EfIkLpOtQxSzT|U}V~V~VVV~U~T|S{RxPuMrJmGh?^+?|!@  .,X1H9T;V;Wy':r%7kQbL[FTAO<:864N33468;GiKnMrPuRxS{T|U~V~VWWWWVV~U}T|SzQxOtLpIlFgBa?\[;W8S6P5N5N5N5N6P7Q8R8S9T8S8S7R6P6O5N5N5N6P8R:V=Z@^CcGhJmMqOtQwRxRy /][;W8S5O3K0G.C+?|(\\A`DdGiKnMrPuRxS{T|U~V~VVVVV~U~T|S{RyPvNsKoHjEfBa?\[A_DdGhJlLpOtPvRxRySz6;W7R4M3K2J3K5N8RKnMrOuQxSzT|U}V~V~VWWWWVV~U~T|S{RyPvNrKnHjEfBb@^>[=Z=Z>[@^BbEfHjKoNsPvRyS{T|U~V~VVVVV~U~U}T|SzQwOtMqJmGiDdA`>\ 5;;;<>@LpNsPvRyS{T|U}V~VVWWWWVV~U~U}T{RyQwOtLpJlGhDdA`@^?]?]@^A`DdGhJlLpOtQwRyT{U}U~V~VWWVVV~U}T|S{RyPvNsLpJlFhDdA_>\[;W8S6O,x*r(m&g|$cw"]pWWWWWJHFDB@ .===>@ANrPuQxSzT{U}U~V~VWWWWWVV~V~U}T|SzQxOuMrKnHjFgDdBaA`A`BbDdFgHjKnMrOuQxSzT|U}V~V~VWWWVV~U~U}T|SzRxPuNrKoIkFgDdA`?\\CbGhKnNrPvRyT{U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWU}RyOtLpIlFgCcA_>\[[BbFhJmNrPvRyT{U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWU}RyOuLpJlGhDdA`?\\=Z[?]@_Ba /\ &LqNsNsNsNs;W ;X9T5O3K1H0G1H3K5O9T>[BaFgJmNrPvRyT{U}U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWU}RyOuMqJmGiDeBa?]420.},x*rWWWWWKKKKHF CCDDEFRxSzT{T|U}V~V~VWWWWWWWVV~V~U}T|SzRyQwOtNrLpKnJlJlJlJlKnLpNrOtQwRySzT|U}V~V~VWWWWWWVV~U~U}T|SzRyQwOuNrLpJmHjFhEeCcBaA`@^@^@^@^@^A_A`CbDdEf@_(;sMrMqLpLp#3d'9p[BaFgJmMrPvRyT{U}U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~SzPvMrKnHj<:8642WWWWWKKKKKK HHHHHIU}U}V~V~V~VWWWWWWWWWWVVV~U~U}T|T{SzRyRxQwPvPvPvPvQwRxRySzT{T|U}U~V~VVWWWWWWWWWVV~V~U~U}T|T{SzRyQwPvOtNsMrLpLoKoKnKnKnKnLoLpMqNrNsOtOu2I%H=Z;V8R5N3K1H0F0F1H3K6O:U>[BbFhJmNrPvRyT{U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~SzPvNrKo><:864WWWWWKKKKKKIIIIIIU~V~V~VVWWWWWWWWWWWWVV~V~U~U}T|T|S{SzRyRyRxRxRyRySzS{T|T|U}U~V~VVWWWWWWWWWWWVV~V~U~U}T|T|S{SzRxQxPvPuOtOtNsNsNrNrNsNsOtOuPvPvQwQwQw(O8S;V9T6P4M2J0G0F0F1H3L6P;V?\CbGhKnNrPvRyT{U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~SzQwNsA?=;97WWWWWKKKKKKIIIJJJV~V~VVWWWWWWWWWWWWWWVV~V~U~U}U}T|T|T{S{SzSzS{T{T|T|U}U}U~V~V~VWWWWWWWWWWWWWVVV~V~U~U}T|T|S{SzRyRxQxQwPvPvPvPvPvQwQwRxRxRyRyRyRxLp.*>y:U8S6P5N3K1H0F0F0F1I4L7R;W?]DdHjKoNsQwSzT|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~S{QwCA?=;9WWWWWKKKKKKJJJJJJVVVWWWWWWWWWWWWWWWWVV~V~V~U~U}U}T|T|T|T|T|T|U}U}U~V~V~VVWWWWWWWWWWWWWWWVVV~V~U~U}U}T|T|T{S{SzSzSzRyRyRyRySzSzSzSzSzSzSzRyQxJm. 0^8R7Q6O4M3K2I0G0F0F1H2J5N8S[BaFgJlMqOuRxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVHFDB@>WWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWVVVV~V~V~V~V~V~V~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWVVVV~V~V~U~U~U}U}U}U}U}U}U}U}U}U}U}U}U}T|S{RyPvOtLp=[-X  (P0G5N4L3K2J2I1H0G0F0F0F1H2J5N8R\;W8S6O4L2J1H0G0F0F0G1H2I3K5N8R;W>\BaEfIkLoNsPvRyT{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKHFWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~U~U}T{SzQwOtLpJlGhCc@^=Z:U7R5N3L2J1I1H1H1I2J4L5N8R;V=ZA_DdGiKnMrPuRxSzT|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKHWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|SzRxPvNrKoHjEfBb?][\=Z=Z=Z>[?\@_BaDdFhIkKnMrOtQwRyS{T|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~U~T|T{SzRxPvNsLpKnIkGhEeCcBbA`A`A`BaCbDdEfGiJlLoNrOtQwRyS{T|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|T{SzRxPvOtMqKoJmHjGiFgEfEfEfFgGhHjIlKnLpNrOuQwRySzT|U}U~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|T{SzRxPvOuNsMqLoKnJlIlIkIkJlJmKnLpMrOtPvQxRySzT|U}U~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~U}T|T|SzRyQxPvOtNsNrMqLpLpLpLpMqNrOtPuQwRxSzS{T|U}U~V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~U}U}T|S{SzRyQxPvPvOuOtOtOtOtPuPvQwRxRySzT{T|U}U~V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~U~U}T|T|S{SzRyRxRxQxQxQxRxRxRySzSzT{T|U}U}V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~V~U~U}T|T|T{S{SzSzSzSzSzSzS{T|T|T|U}U~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~V~U~U}U}T|T|T|T|T|T|T|U}U}U}U~V~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~V~V~U~U~U}U}U}U~U~U~V~V~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVV~V~V~V~V~V~V~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK P>T@dt|(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/enormous result icon2d.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/enormous result icon2b.tif0000555000175000017500000100060410162465511023657 0ustar brentbrent00000000000000MM* (2=HT`lx (3>JVbn{(3?KWdq~@???+9GVfvjjj444 +:IXiyUUU ,;K[l}Wxzzz???,<L]o=F_ddd)))-nRA>LiLLL666dddjN?@Rvuuu444666ffffK=C[\\\666hhhbG=GfBBB666kkk]D=Ntooo&&& 666mmmYA?WRRR 666ppp{T?Cb444 666sssvO=Hrggg666wwwqK=QEEE666{{{lF?]###666րfBCn\\\666օ`?J///666֋Y=W^^^ 666֑R>rrr:::666֙KfffSSS666֢fffGGGJJJ666ppp>>>OOO,,,111RRR<<rWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW%EkUWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQBy2\,E+DRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#6WWWWWWWWWP0Y.OWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW8WWWWWWWWWWWWT0X "5SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW,P}TWWWWWWWWWWWWL)@0LWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW9i9jWWWWWWWWWWWWWV,P}4`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWD~4RWWWWWWWWWWWWWWW7e NWWWWWWWWWWWWWWWWWWWWWWWWWWWWNWWWWWWWWWWWWWWWW4`&GoWWWWWWWWWWWWWWWWWWWWWWWWWWWWTWWWWWWWWWWWWWWWWW!>` RWWWWWWWWWWWWWWWWWWWWWWWWWWWVWWWWWWWWWWWWWWWWWQ 8hWWWWWWWWWWWWWWWWWWWWWWWWWWWT WWWWWWWWWWWWWWWWWW'Ir">aWWWWWWWWWWWWWWWWWWWWWWWWWWWP WWWWWWWWWWWWWWWWWWC{-WWWWWWWWWWWWWWWWWWWWWWWWWWWL/WWWWWWWWWWWWWWWWWWQWWWWWWWWWWWWWWWWWWWWWWWWWWWF+DWWWWWWWWWWWWWWWWWWRWWWWWWWWWWWWWWWWWWWWWWWWWWWAw ;\WWWWWWWWWWWWWWWWWW4a WWWWWWWWWWWWWWWWWWWWWWWWWWW:k(KuWWWWWWWWWWWWWWWWWK .WWWWWWWWWWWWWWWWWWWWWWWWWWW3^1[WWWWWWWWWWWWWWWWL %%EkWWWWWWWWWWWWWWWWWWWWWWWWWWW,Q~:kWWWWWWWWWWWWWWWF D~WWWWWWWWWWWWWWWWWWWWWWWWWWW%DjC|WWWWWWWWWWWWWT,P}+DWWWWWWWWWWWWWWWWWWWWWWWWWWWW6TLWWWWWWWWWWWI+O| JWWWWWWWWWWWWWWWWWWWWWWWWWWWW*BTWWVTPKC|:k-S5S :kWWWWWWWWWWWWWWWWWWWWWWWWWWWWW06cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW   >sWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +CMWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW ":kWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#69jUWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW5SKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW&GoRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+O| ' ?tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWG&Fn "?bSWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWS4` ' &FWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWU7e #5cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWU2\ $CiVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWO!>`0LSWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW?t (>RWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQ6T%:SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW1[/IUWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBz%EkWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWL ';mWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWP#7 2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWS,E WWWWWWWWWWWWWWWWWWWWWWWWW  WWWWWWWWWWWWWWWWWWWWT+C+WWWWWWWWWWWWWWWWWWWWWWWWW+O|,RWWWWWWWWWWWWWWWWWWWWWT+C8gWWWWWWWWWWWWWWWWWWWWWWWWWU(Ku)KvUWWWWWWWWWWWWWWWWWWWWWWT$Ch 1ZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW@@[%7l5O$GA-:VWWWVMsy^7IkWWWWWWWWBb ?h| "WWWWWWWWWWWWWWJn(;tX%IWWWWWWWWWWWWWWWWWWRy 2*>yWWWWWWWWWWWWWWWWWWWWWWWKn*SW "4MWWWWWWWWWWWWWWWWWWWWWWWWWWWCd%I^L;EfWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWU~Mr 0RyWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW,B%X-WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOu3L06PWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW-Yhi.CWWWWWWWWWWWWWWWWWWWWWWVVV~V~V~U~U}T|T|T{SzRyRxQwPvOtNsMqKoJlHjGiFgEfDdBbA`@^8S&JB J4LPvWWWWV~U}SzRxPuOtMrLpKnJlHjFgDdBa@_@^?]?\>[=Z[=Zz&8n$6i%6j&8n(;t)\;V7R6P8R\6P1I1H4M7Q9T;V;W;V:U8R4L.D':r"2a,U(O'L&J%I$G#E"C"B!@ ?<:8777777666679=#D(N.Z&8n.D7RA_HjNrQwSzT{T|T|S{RyOuKnEf@^]OuNrGh@^$G*S#3d*>z3Lz/F4L6P8S:U;V;W;W;W;W;W:V9T7R5N3L2I1H3K6P;WA`GhLpPvSzT|V~VWWIl%8mI)RFhDd=Z7R4M4M6P9T[?\?]?\>[=Z;W8R3K-B&9o 0](N"B:53222111111111111111111122222336;"C(N /[&8m-B2J8S=Z@^CbDdEfFgFhGhGhFhFgDeBb?]z2J:VA`HjMqPvSzT|U}V~V~V~U~U}T|SzPvMqIlEe@_=Z;W;W=Z@_DdIkMqPvRyT|U~V~WWWWWWW@^#DO+;W>\;V:U[BaFgKnNsQwSzT|U~V~WWWWWWWWWWW-B sy\BbGhJmMrOtPvPvPvPvOtNrKoHjCb=Z6O.D':r!1_)Q$F >:77666666777777776777789:;;;;<<== > > ? ? ?!A"C$G'M+T!0^%6j)=w.D2J6P:U[?\@^@^@^@^@^?]?]?\>[=Z\CbGiKoOtQxS{T|U~V~VWWWWWWWWWWWWU}2J _%7l7Q7R8R:U=Y@^CbEfGhHjHjHjHjGiFgDeBa>\:U4M.D(z.C1H4L6P8R9T:V;V;W;W;W;W;W;W;V:U9T8S7Q5N4L2J1H1H1H3K5N9T=ZBaFgJmNrPvSzT|U}V~VWWWWWWWWWWWWWWW+@~ XJ (\?\?\?\>\>[y*>y*>y*>y)=w)[>[>[>[>[>[=Zy+?|,A~-B-C.D.D/E/E/E/E.D.C-B+@|)=x(;s&9o&8m&8m&8n':r*>y,@}.D0G2J4L5N6O6P7Q7R8R8R8R8R7R6P5O4L2J0G/E-B-B-B.D0F2J5O8S;W=Z?]A`BaCbCcDdDdDdDeDeDdDdCcBbA`@^>[[>[>[>[=Z=Y\@^A_BaBbCbCcCcCcCcCbBaA`?]=Z;V8R5O4L2J2I2J4L6P9T\@^BaCbDdDdDdDeDdCcBb@_?\[@_BaDdDeEfEfFgFgFgEfEfDdCbA`?\[A_CcEfFhGiHjIkJlJlJlIlIkHjGhEfDdA`?\[;V8R5N4L4L5N6P:U=Z@^CbEeGhHjIkJlJlJlJmJlIlIkGiFgDdBa?\\;W9T6P4M4L3L4M5O8R:V=Y?]A`CbDeEfFgFhGhGhGhGhGhFhFgEfEeDdCbA`@^>[[A_CcEfGiHjIlJlJlJlJlIkHjGhEeBb@^[;W8S6O4L3K3K3L5N7Q:U[?]@^A`A`A`A`A`A`A`A`A`A_@^@^?\>[=Zz%6j%6j9  c/E:U\@_CbDdEfFgFhFhFhFgEfEeDdBb@_>\[?\?]@^@^@^@^@^@^?]?\>\>[=Y;W:U8R6P4M3K2I1H0G1H1I2J4L5O7Q8S:U;V\A`DdGiJmMqOtQxSzT{U}U~V~VVWWW>\!1_991 T u 0G6Q9T;V[?]@^A_A`A`A`A`A_@^?]?\=Z;W9T7Q5N3K1I1H1H1H2J4M6P8R:U;W[>\>\?\>\>\>\>[=Z=Z\A_CcFgIkLoNrPuQxSzT|U}Gh%6l    G  /\6O6P8R9T:V;W[?]A_BbDdFhHkDe,AJ h*S6P7Q7Q8S9T9T:U;V;V;W;W;W;W;V;V:V:U9T8S7R6P6O5N4M4L4L4L4M5N6P7Q8R9T:U:V;V;W;W;W[>\?\?\?]@^@^@^@^@^@^@^@^@_@_@_A_A_@_A_A_A_A_A_@^>[;X0H z n%7l:U:U;V;V;W[>[>\>\?\?\?\?\?\?\?\?\?\?\>\>[>[=Z=Z=Z=Z=Z=Z=Z=Z>[>\?\?]@^@^@^A_A`A`A`A`A`A`A`BaBaBaBaBaBaBaBaA`A`A`A`A`A`A`A`A`A`A`A`BaBbCbCbCcCcDdDdDdDdDeDeEeEeEeEfEfEfEfEfEfDeAaBa!2c 9 r$5i9T?\?\?\?]?]@^@^@^@^@^@^@_@_@_@_@_@^@^@^@^?]?]?]?]?]?]?]@^@^@_A`A`A`BaBbCbCbCbCbCbCcCcCcCcCcCcDdDdCcCcCcCcCcCcCbCbCbCcCcCcDdDdDdDeEeEfEfEfFgFgFgFgFhFhFhGhGhGhGhGhGiGiGiGiGiGiGiGiGhGhGhGiGiGiGiGiHjHjHjHjIkIkIkIlIlJlJlJlJlJlIlIlIl"3dU P !0`?]DdDdDdDdDeDeEeEeEfEfEfEfEfEfEfEfEfEfEfEfEfEfEfEfEfEfEfFgFgFhGhGhGiGiHjHjHjHjHjHjHjHjHjHjIkIkIkIkIkIkIkIkIkIkIkIkIkIkIlIlIlJlJlJlJmJmJmKnKnKnKnKnKnKnKnKnKoKoKoKoLoLoLoLpLpLpLpLpLpLpLpLpLpLpLpLpLpLpMqMqMqMrMrMrNrNrNr=Y"D%  G %JJlJlJlJlJlJlJlJlJlJmJmJmJmJmJmJmKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnLoLoLoLpLpLpLpLpLpLpLpMqMqMqMqMqMqMqMrMrMrMrNrNrNrNrNrNrNrNrNrNrNrNsNsNsNsNsOtOtOtOtOtOtOtOtOtOtOtOtOtOuOuOuOuOuPuPuPuPuPvPvPvPvPvPvPvPvPvPvPvKo6Q11 F77  L>9UNrNrNrNrNrNrNrNsNsNsNsNsNsNsNsOtOtOtOtOtOtOtOtOtOtOtOtOtOtOuOuOuPuPuPuPuPuPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvQwQwQwQwQwQwQwQwQwQwQwQwQxQxQxQxQxQxRxRxRxRxRxRxRxRxRxRxRxRxRxRyRyRyRyRyRyRyRyRyRyRyHj.[.[.[.[5ccS)5':sJoQwQwQwQwQwQwQwQwQwQwQxQxQxQxQxQxRxRxRxRxRxRxRxRxRxRxRxRxRyRyRyRyRyRyRyRyRyRyRyRyRyRySzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzSzS{S{S{S{S{S{S{S{S{T{T{T{T{T{T{T{T{T{T{T{T{T|T|T|S{Rz5N2I2I"2c #k(:sIjSzS{S{S{SzSzSzSzS{S{S{S{S{S{S{S{S{T{T{T{T{T{T{T{T{T{T{T{T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}T}S{ImGjGjGj4L $ )PJlS{U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U}U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~@_   N( U,XV~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~VVVVVVVVVRy@_&9p&9p&9p&9p4 vuud5&"2cVVVVWWWWWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWWSzHjFgFg>\9E**>zWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW,B!A221 #644+=9T@dt|(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/enormous result icon2b.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/enormous result icon2b.xcf0000555000175000017500000046770510162465511023677 0ustar brentbrent00000000000000gimp xcf fileBB`/ gimp-commentCreated with The GIMPS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) = b}     !"gimp-text-layer(text "{a > b}") (font "Comic Sans MS") (font-size 83.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "c") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels)  u'uSj R3q(}{3+Q0yG. .y -5 , ;,@ͧh-x$1%49G5u5x6A66 668888888!c޴= r 4 CN U)(v\aJ:O v2= \ZeH e u  3}786654S4 !  ! "* #,* $(R %Z&8/' ( s*Y +- `m8u77l78888888888888888Xɠe$8 V!6: V !yBF (e & h $g @ @ @z|&S*Hw  v 3; h>"u#E6syA f%F//[X _ @ @ @SR /*[ kF0u}CP; )aZ#>1!zS a>GOi+f.8Ey_F 6F- BZ!Xs0 @t =2g,t wy a[L-7r߮n'~65wK5%55F2c.H e/ / 06 1?2#>3@ۨ4g @ @ @- .-^,;*xh)K(>3&{% $@!}M   ' B xZ"j #3J9{457rz;;:::9s999k9P @ @ @\q;#*E&* X u w {F'2c 4!FRv A$GRLݺP(Nb,[ht}D 9`%X="0QLM]tD_wI6 =gw-K~Ju#|Dad E   4>="3ٝ?]r:9UDrop-Shadow#1      UBEFGGFEB>:61,&!  %*066/'!  !(/6>EMTZ_cefeb^YSLD<4,%  ")/7>FMU[_cefdb^YRKC;3+$  #)08?GNU[`cefdb^XRKC;3+#  $*19@HOV\adfgeb^XRJC;2+#  %,3:BIPW]beggec_YRJC;3+$  !'-57/)#   ?FLSY^bfhhigda[VOHA:3,%  AHOU[_cfghgea]XRKD=6/)#  KQW\`dfhgec_ZTNHA:3-'!  TY^beggfda\WRLE>81,&   \`dfggec_[VPJC=71+%  befgfeb^ZUOIC=71+&! gda^YTOIC=72,'" d`]YTNIC>83-(# XTNIC>82-(# HC=72-'"'99:;;<>>'==;;;          !#$&&'&%$#!   #&)-024566530-)%!  "'+048:5/)#  "',2780)"   &,28>DJOTY\_befggfec_ZTMF>5-&  "(/64*!  !'/7?GOW]bgjlnnlkmnprttrniaXOD:0&  %,4=EMU\bgjllkifdcbbcegknpqqnjd]SI?4+"  !(09BJRZafiklkieb_[YWWX[]bfilmmjf_WMC8.%  $+4=>@DJPV]begfc^WNE;1'   (08AJS[aehjifa\UNHB=:99;@ELSZ_dggea[SJ@6,#   '/8AJRZ`eijifa\UNHA=977:>CJQX^cgihe_XOF;1(   '.7@IRZ`ehjigc]WPIC>;99;?DJQX_eikkid]UKA8.$  %-6>GOW^dhiihd_ZTNHC?==?BGMTZbhloonic\RH>4*!  #*2;DMU\bfikigc^YTOJGEDEHLRX_ekprsroibYOD:0&   (08@IQY`ehkkjgd_[WSPNMNPTX^djosvwvtog^UJ@5+"  $,44+# %,3;BJQW^cfilmnnmmlmoprsttutrpke_WOF=3+# %,3:AHOU[`dgikllmlmmnmlifb]WPHA91)! %+28?EKQV[^bdfghhgfedca^[WRMGA93,% #)/5;AFKPTWZ\^_``_^][ZYWUROLIFA<61+% !&+05;?DHKNPRTTSRPOMKIGDA?<840,(#  "&+/37;>ACEFFGGFEDCA?=;9641.+(&"  !$(+.135789986531/-+)'%"    #%')*,,+*)('%$"                     78888995~60)"")~60)"")~60)"")$2. +  *  ( $),-+(! ' #+39;;81)! % &09BGIGA9/$  &13(  #/82,%  *8IZjy{uplkjkkjh %-5>FLQTVVSOKE=6/(!  "0?P`p}wphca`aehj !*2;DLSY]``_\WQJB80(   '6EVes}ypf]VQQRV\b #+5>GPX_dhiifb[SKA7.%   -;KZitz}zsi^SJDAAELT $-6?IR\cjnqqokd\RG<1'  %2AP^irutndYLB9435IT_iqw||{vndXK>2&  &4AO[djjg_TG<2+(). '1;EP[entyzytmcXL@3(   ,9GT_hkkf]RG<40/2 '0:DOYcjptusoh_UI=2'  %1?MYdknlg^TKC<:;  (1;ENX`glnomgaXNC9.$  *7ER_iprqkd[SMIH !)27/)"   ,8ER^hpuxxwur &,28<@AA?<72,&   ",7COYbhmoonl $)-135430,'"   )3=HPV[^``_  #&(('$"  %-5=92(' %0;FLPOJA5) & *7DOX]]XM@1#&*8ER\cd_VG7(& '3AO[dgdZL:* & ".P^gidXH7( TJ?2'  !0AR`jmg\L;+ c\QF9,   #2CUcmpl`Q?. jg`WK=0# $4EWfpsncTA/  gigbYM?1# &6IZisuocR?. \chhcZN?1$  *:M^lttm_M:)PZbggbYL>/! .?QbnspfVD2" COZcgfaVH9*  #3EVenoj]L:) :FR]ehe]QC4&  )9J[fljaRA/  6AMXbggbXK<-    .?P^gidYI7'8AKV`fhd]PB3& %4DTagf_P@/  ?FOX`fhf_TF8)  *:JYcgdYJ9(KOU\bghf_UH:-  "1AQ]ef_SC2# XZ]bfihe^TH;-!  +:JXbgd[M<, efhiigb[RF9,!  '5DS_ff`UE4%nlkkjhd^VLA6*   %2AO\dgcZL<+  pmkigc]WOE;0&  $0>LXbfd]PA1#  jgea^YTMF=3*!  "-;HT]bb\RD4&  ][XUQLGA:2*#  )6BNW\]YPC5'  LJHEA=93.(!  #-9DMSTQJ?4'  98641.*&"  $.7@EGFA8/$  ('&$"   !*16885/'    !&)*($             27E{3 -& %+ 2{3 -& %+ 2{3 -& %+ 2>==<<4/0 55 .(!#* 17>5 .(!#* 17>5 .(!#* 17>578:=/6/6/6@++++*?O Drop-Shadow     +h= O=(e eO=TITbEbUcce5/+( &  $  #  !  "$$#  ! !%)+,,+($  #).25653/+%  #*16;>?>;71*$  ")18?CFGEB<6.'  '08@FKMMKGA91)!  #,5>FMQSROJC;2)!   '1:CKRUWUQKC;2)    !*4>GOUXXVQJB90'  #-7AKRWYYUOH?6-$    &0:DMTXYXSME;2)     '1; #-8AJPTTQLC:0&  &,39>CGJLLJG %/9CKQTTQKB8.$   (/6=DJOSVXYXWT '1;EMSUUQJA7-#   (08@HOUZ^acdcb_  )4>GOTVUPI@6,"  '09BJRY_dgjllkh #-7AJQVXVQI@5+!  %.8AKT[bgknprrqo &0:EMTYYWQI?5*   "+5?JS\chmprsuus  *4?IQX[\XRI?4*   '12'  #.:FQ[djmmlieb``adgk %02'  &1=IT^fkmlie`\ZY[^cg &1=JU_gkkg`WK?2'  (3?LWahkljfa\WTTVZ_d '2>KV`hllhaWK?2'  )5ANYbhllid^XSQPRW\b &1>JV`gklhaWL?3'   *6COZcillhc\VQNNQU[a %0IR[bgjmnnoop  *5?IRX[[WQI?5+"  $-7AJRZ_dgijjkji (2=GPVZ[XSKB8/%  '/8AIPV[^`bbccba` %/:DNUZ[ZUOF=3)!   '/7>EKPSVWXXWVU #-7AKSX[ZWQJA7.%   '.4:@DGJLLKJH  )4>GPVYZXSLD;1(  $*/48;>?@@??=< &0:DLSWYXTNF=4+"  !%)-/13321/ ",5?GNTVVSNG?6-$  "$&'((''&$ '09BIORRQLF?6-$   "*3;BHLMLIC<5,$   %,4;@DFFC?92*"    %,38<>><83-&   75432 1 1 0 /  ""! #'))(  $*-00/   #*/4776  '.5:=><  #+3:@CDC    %.7?EIJI    (1:CJNPO     )4>GNSUU"  !!   !+6@JRX[[,($  !%())(&"  "-8CMV]`a73.("  "',/121.+&!  #.9EPZafhC>82+#   &,269::74/)$  $/;GS]eknOJC;3+#  ")17<@BBA=82,&  %0EKOQQOKE?7/'   %1>KYeov{ke^UK@5+!  $,6?GNTWXWTNH@7/&  &2?LZfpx}pkd[QF:/%  "+5?HPW[^^\WQI@6-$  &2?LZfpx}rnh`VJ>3(  !*4>HQY_bdb_YQH>4*!  &2?LZfow{spjcYNB5*   (2LXdntxrpke[PD8,!  '0;FPZbhlmje]TI>3(  %1>JWbkqspoke]RF:.#  &0:EP[cjnomiaXMA5*!  %0=IU`hmnmmkf^SG;/$  &/:EQ[dkoqojcYNB7+!  %02&  %.8BKU\cfhgc]UKA6,#  #.9DNV[]\gijf`VK?2'  '0:CLU[`bc`\UMD:0'  #.9DNV[]\hkkgaWL@3(  !)2;DLSY\]\YTME<3*!  #.9DNV\^^kmmibYMA4)  "*3;DKQTVVTPJC;3+#  #.9DOW]``npokdZNB5)  "*2:AGLOONKF@:2+#  #.9DOX_bcqrqle[OB6*  !(07=CFHGEB=70)#  #.9EPYaegturmf[PC6*   &,38<83-'!  #-9EPZbhjvvsnf[OC6*   "(-256652.*$  ",8DOZcimvuqlcYNA5*   "'*,--+)%!  !+6BNYbintrnh`VK?3(   #$%$#   )4@KV`gmomhbZQF;0&    &1?>;60*#    '.65,# 2-'!   )2;CKQUVUQKC:0' 83,%  '09BJQVXXUOG>4*! ?92+$  $-6?HOUYYWRJA7-# E?81*#   )2;DMSXYXSMD:/% KF?81*$  %.7@IPVXXTNF<1' RMF@92-($   !)34*  `\WRLFA<840,($  "+5?HOTUTOH?5+! gd`[VQLHC?;72-("  (24*  ~|yuroljhgeb^YRJA8.%   *4?HPUWVQJA6," }|yuqmjhgfedc`\VOG=3*!  )3>HPVXWSLD9/% ywtokfca`aabba^YSKB8.$  (3>HPVZYVOG=2( sqlgb^[YXY[]__^[VNE;1'  '2=GPW[[XRJ@5*! >mje_YTQPPRUX[]][WQH?4*!  '1@CGMRWZ[XSLC9.$  &0;GQY^_^XQG<1& ]WPIB=98:=CIOUYZXTMD:0%  %0;FPX^`^YQG<1' ZTLE>8546:?FMSWYXTNE;0&  %0;FPX^`^YQH=1' XRKC<73348>ELRWYXTNE;0&  %0;FPX]_]XPF<0& XRKC<74359?FMSWYXTME:0&  %0;FOW\^\WOE:/% ZTMF@;879=BIOTXYXSLD9/%  %0;FOW[\ZUMC8-# ]XRKE@==>BGMRWZZXSKB8.$  &0;EOVZ[XRJ@5+! a]WQLGEDFIMRVZ[ZWQI@6,"  &1;FNUYYVPH>3) fc^YTPNMNPTWZ\\ZVOG=3)   '1GOTVUQJA7,# pqomjhfeddcca^ZTLD:1(  !+5?HPTVTPH?5+! pqqpnljigfeb_[VOG>5,#  $-7AJQUVTOG>4)  mppomkjhfc`\VPIA8/&  '0:DLRVWTNF=2( hklljigeb_[VPIA91(!  !*4>GOTWWTME;1' `ceedca^[WSNGA91*"  %.8AJQVXWSMD:/% VY[\\[ZXURNID>70)"  !)3@BCDCBA>;84/*%   (1:DLSWYXUNF=2( 146776420-)%!  "+4=FNTWXVRKC9/% &(*++*)'%"  $,6?GNSVVSNG>5+"     $-6>FLPRQNIA90'   $,4CEFD@:4,$     &-38<>=;72,%   %*/35541-'"   "&)+,+)&!   !##!     $  $  ' )+05"+/6 "'-14552/*%    !%)+,+)&"   !##"! "  #  %  & )+/6a'0Empty Layer#7     Ieef5fEhjlUleu~CS&i((((p+ 3. i((((p+ 3. i((((p+ 3. @8888888888@####;l"N%<@####;l"N%<@####;l"N%<?d###### @3 3 3 3 3888888888888888888888888883 3 3 3 3 88888883( (/ / / ( 8( Z( ' ' T' ' ' ' ' ' 1' F' _' x' ' ' m' W' D' 2/ !/ / / / 1 1 (( ' ( ( ( ( ( ( ( ( ( ( (  ( ( xy(((((((( (/ / / ( 8( Z( ' ' T' ' ' ' ' ' 1' F' _' x' ' ' m' W' D' 2/ !/ / / / 1 1 (( ' ( ( ( ( ( ( ( ( ( ( (  ( ( xy(((((((( (/ / / ( 8( Z( ' ' T' ' ' ' ' ' 1' F' _' x' ' ' m' W' D' 2/ !/ / / / 1 1 (( ' ( ( ( ( ( ( ( ( ( ( (  ( ( xy(((((((8888888888 e()n“GF0 7 BN     r c  ud /    0  &n    F  ǫV -,+E)#'8%V%r'q e( '$lcN @  W<  K  n  ( 94 G E- E k  ####### e()n“GF0 7 BN     r c  ud /    0  &n    F  ǫV -,+E)#'8%V%r'q e( '$lcN @  W<  K  n  ( 94 G E- E k  ####### e()n“GF0 7 BN     r c  ud /    0  &n    F  ǫV -,+E)#'8%V%r'q e( '$lcN @  W<  K  n  ( 94 G E- E k  ####################))(((((((i((((((((((((((((((((((((@8888888888888888888883 3 3 3 3 88888888888888888888888883 3 3 3 3 888888838888@8 @? @888833 3 3 3 3 @ t@@Empty Layer#6     Ffh] N^2 W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W*WiWW WWWWWWWWWW ==<:986 5 4 20/.-**i  ==<:986 5 4 20/.-**i E@8888888888@?@@ @3 3 3 3 3888888888888888888888888883 3 3 3 3 8888883W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  WWW WW WW WW WW WWWWWWWWWWW WW WW WW WW WW WW WW WW WWWWWWWWWWWW<W=W=W<W<WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:W:W:W:W:WWWWWWWWWWWWW               <==<<:::::               <==<<:::::8888888888W=W<W;W;W;W;W;W|WW0WW/WW.WW-W W,W W+W W*W W)W W(WW'WW%WW%WW$WW#WW"WW WWWWWWWWWWWWWWWWWW\WWWWWWWWWWWW WWW WW W =<;;;;;|0/.- , + * ) ('%%$#" \   =<;;;;;|0/.- , + * ) ('%%$#" \   @@88888888888888888888883 3 3 3 3 88888888888888888888888883 3 3 3 3 88888835 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWWWWWWWWWWWWW:W:W:W:W:W:WW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W::::::)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C}::::::)jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}8888@8[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>WW W WW W WW WWW WWWWWWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR*     ;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?    ;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{?A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m-8888833 3 3 3 3 @4I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@(]R     >Cgimp-text-layer(text "R") (font "Comic Sans MS") (font-size 65.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "c") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) (]c(]   ēU B|2H =l q  r ~  WV ~e6 ]eX:/ @dS!hm}S 069 ~ (%!8TzS` G  T V#  F.  f 1 ]a k    E   m<P |Zo.Empty Layer#4     B5 aqȁȑȡȱiW(W(W(W(W(W(Wi((((((i((((((i((((((@#W#W#W#W#W#W#W@#######@#######@#######(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W###############################################################################################################################################################@@Empty Layer#9     Wɳ+&Pt؄7ٜ٬ټA@<<<<<<<<<<@?F@@777778888888888888888888888888877777888888888888888888888876<<<<<<<<<<F8888877777788888888888888888888888887777788888888888888888888887<<<<@< ? 888777777@ @@Drop-Shadow#3      _ڞں((Y +&$         $ ,! 503. =@E=<=a^u{{umd[SKEA=;987VME>941/.--.0365-'" $*1:DOZdlqsqldZOD:1*$ C9/' #+4?JU_hmomh_UJ?4+#*"  &/:EQ\djljd\QE:/& '  ",7BNYbgigbYNB7," $  )4@LW`ege`WL@4) "  '3?KV^dfd^VK?3' "  '2>JU^dfd^UJ>2' "  '2>JU^dfd^UJ>2' "  '2>JU^dfd^UJ>2' "  '2>JU^dfd^UJ>2' #  (4@LW_ege_WL@4( %   *5AMXafhfaXMA5*   gd)   $-8DP[cikic[PD8-$ ,# '1HS]gotvtog]SH>5-($  " :4/,)(''(*-17>FPZdnvz|zvndZPF>71-*('&D>:64322358>?ACGLRZblu}}ulbZRLGCA?>=ZUQOMKKLNPSX^emu~~ume^XSPMLKJd_\YWVVWX[^bgnv~~vngb^[XWVU lhdb`__^_`acfjov}}vojfca`_^ pligeddcdefhkotzztokhfddcrnkigffefghjmqv||vqmjhffeupligeddcdefhkotzztokhfddcqlhdb`__^_`acfjov}}vojfca`_^id_\YWVVWX[^bgnv~~vngb^[XWVU  `ZUQOMKKLNPSX^emu~~ume^XSPMLKJ " UNIEB@>>?ACGLRZblu}}ulbZRLGCA?>=KD>:64322358FPZdnvz|zvndZPF>71-*('&91+&"!$(-5>HS]gotvtog]SH>5-($ 2*# &.7AMXbjpqpjbXMA7.&  ! ,# '1JU^dfd^UJ>2' ????+ 77+JK D?789;=AFLT^hr;987789,-.0372'  '1=KXepx||xpeXK=1'  #.:HUbnvzzvncUH:.$  #.:HUbnvzzvnbUH:.#  !+8ESaltyytlaSE8,!  !+8ES`ltxxtl`SE8+!  *6DR_kswwsk_RD6*  *6DR_kswwsk_RD6*  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)   +7ES`ltxxtl`SE7+    +7ES`ltxxtl`SE7+   ",9FTamuyyumaTF9,"  ",9FTamuyyumaTF9,"  %0?ADGMS\epzzpe\SMGDA?>==>?ADGMS\epzzpe\SMGDA?>JJKLNPTY_foyyof_YTPNLKJJKLNPTY_foyyof_YTPNLKUUVWX[^chpxxphc^[XWVUUVWX[^chpxxphc^[XWV^^_`acgkpwwpkgca`_^^_`acgkpwwpkgca`_ccddfhkou{{uokhfedccdefhkou{{uokhfedeeffhjmqw}}wqmjhgfeefghjmqw}}wqmjhgfccddfhkou{{uokhfedccdefhkou{{uokhfed^^_`acgkpwwpkgca`_^^_`acgkpwwpkgca`_UUVWX[^chpxxphc^[XWVUUVWX[^chpxxphc^[XWVJJKLNPTY_foyyof_YTPNLKJJKLNPTY_foyyof_YTPNLK==>?ADGMS\epzzpe\SMGDA?>==>?ADGMS\epzzpe\SMGDA?>112358EMV_flppmf]QE8+! !"#$'*/5HS\dikjd\QD8,!  '/9CNXagihc[PD8,!  "*4?KU^ehgbZPD8,!  '1IT^dggbZPD8,!  #,6ALW`fihc[PD8,! #*2DKS[dlruuqj`TG:-" =>@BEINU\dlsxzyumbVH:-" JKMOQUZ`gnuz~~xpdWI;." UVWY\`dipv|{rfXJ;." ^_`behlqw}~tgYJ<.# cdegimqv{uhZK?@CFJPW^gov{}|wodWI;." 12347:?EMU^gouxxtmbVH:." &'(*,05JV`gjie]RF9-"  %0JU^dfd^UJ>2' #  (4@LW_ege_WL@4( %   *5AMXafhfaXMA5*   ! (   $-8DP[cikic[PD8-$  ! ,$!(2IS^hpuwuph^SI>6.)$!B;51-+*))*,/39?HQ\fow|}|wof\QH?93/,*)(MFA=:86679IS^hpuwuph^SI>6.)$!4,%!'/8BMXckprpkcXMB8/'!.&!(2JU^dfd^UJ>2'   (3?KV_ege_VK?3( $   (4@LW_ege_WL@4( $    *5AMXafhfaXMA5*  " $-8DP[cikic[PD8-$ & '1HS]gotvtog]SH>5-($ % <60-*(''(*-17>FPZdnvz|zvndZPF>71-*('&% F@;75322358>?ACGLRZblu}}ulbZRLGCA?>=WROMLKKLNPSX^emu~~ume^XSPMLKJa]ZXWVVWX[^bgnv~~vngb^[XWVUieca__`acfjov}}vojfca`_^njgfddcdefhkotzztokhfddcoligffefghjmqv||vqmjhffenjgfddcdefhkotzztokhfddcieca__`acfjov}}vojfca`_^a]ZXVVWX[^bgnv~~vngb^[XWVUVROMLKKLNPSX^emu~~ume^XSPMLKJJFC@?>>?ACGLRZblu}}ulbZRLGCA?>=?:74322358FPZdnvz|zvndZPF>71-*('&&" !$(-5>HS]gotvtog]SH>5-($  &.7AMXbjpqpjbXMA7.&  '1JU^dfd^UJ>2'  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)   +7ES`ltxxtl`SE7+    +7ES`ltxxtl`SE7+   ",9FTamuyyumaTF9,"  ",9FTamuyyumaTF9,"  %0JWblsvuph]QD9.%!)3>JWblsvuph]QD9.% %/:GT`jqtsof[OB6+! %/:GT`jqtsof[OB6+!  !,8DR^hpssneZM@3(  !,8DR^hpssneZM@3(   *6CQ]hpssnfZM@3'   *6CQ]hpssnfZM@3'  )6CQ]hptsof[N@3'  )6CQ]hptsof[N@3'  )5CP]hpttog[N@3'  )5CP]hpttog[N@3'  *6CQ^jrvuqh]PB5(  *6CQ^jrvuqh]PB5(   +7DR_kswwrj^QC6*   +7DR_kswwrj^QC6*  ",9FTaltxxtl`SE8,!  ",9FTaltxxtl`SE8,!  %0?ADGMS\epzzpe[SMGDA?>==>?ADGMS\epzzpe[SMGDA?>JJKLNPTY_foyyof_XTPNLKJJKLNPTY_foyyof_XTPNLKUUVWX[^chpxxphc^[XWVUUVWX[^chpxxphc^[XWV^^_`acgkpwwpkgca`_^^_`acgkpwwpkgca`_ccddfhkou{{uokhfedccdefhkou{{uokhfedeeffhjmqw}}wqmjhgfeefghjmqw}}wqmjhgfccddfhkou{{uokhfedccdefhkou{{uokhfed^^_`acgkpwwpkgca`_^^_`acgkpwwpkgca`_UUVWX[^chpxxphc^[XWVUUVWX[^chpxxphc^[XWVJJKLNPTY_foyyof_YTPNLKJJKLNPTY_foyyof_YTPNLK==>?ADGMS\epzzpe\SMGDA?>==>?ADGMS\epzzpe\SMGDA?>112358JV`gjie]RF9-"  (3?LWahkje]RF9-"  ",6BNYcilkf]RF9-" '0:FQ\eknlg^SF9-"  &-6@KV`inpnh_TG:-" !$(-4FOXbkrvvslbUH:." 5678;>CIPYbjrx{zvncWI;." CDEFHLPU\dlsz~yqeXJ;.# QRTVY]bhov|}sgYJBHOW`hpvyxumcVI;.# ()*+.26=DMW`ipturkaUH;.# !#',3;EOZckprpjaUH;.#  %,5?JU_hnpni`UH;.# &/:EQ\elomh`UH;.#  "+6BNZdjnmh`UH;/#  (4@LXcjmmh`UI;/#  '3?LXbjnmiaVI1%  $-9ER^horqldXK>1%  '11%  &-7AMYdmsvtoeZL>1%  #'-4=HS^hqvxvpfZM?1% &'(*-16=FOZdnvz{yrh[M?2% 12357;@GOXbkt{{ti\N?2& =>?ACGKQYajsz~vk]O@2& JKLMPSW]cks{xl^O@2& UVXZ]afls{zn_PA3& ^_acfintz|o`QA3& cdfhjnrx~|o`QA3& efhilptz|o`QA3& cdfhjnrx~|o`PA3& ^_aceinszzn_PA2& UVXZ]aflryxl^O@2% JKMORV\biqy~vj]N?1% =>?@CFJPW_hpw}{sh[M>1% 12347:?EMU^hpwz{wpfYK=0$ &'(*,05;CLV`iquvtmdWJJU^dfd^UJ>2'   '2>JU^dfd^UJ>2'   '2>JU^dfd^UJ>2'   (3?KV_ege_VK?3(   )4@LW`ege`WL@4)   ",7BNYbgigbYNB7,"   &/:EQ\djljd\QE:/&  #+4?JU_hmomh_UJ?4+#'" $*1:DOZdlqsqldZOD:1*$ 5/*'$#""#%(,29AKU_iquwuqi_UKA92,(%#"!>941/.--.0362'  '1=KXepx||xpeXK=1' $,6BO\hs{{si\OB6,$$,6BO\hs{{sh\OB6,$ $*2;987789;=AFMU^hr||rh^UMFA=;98DDEFGJMQW^gpyzpg_XRMJGFEDDEFGJMQW^gpyypg^WQMJGFEOOPPRTW[`fnv~wnga[WTRQPOOPPRTW[`fnv~~vnf`[WTRPPYYZ[]`chmsz{tnhd`]\ZZYYZ[]`chmszzsmhc`][ZYaabcdfimrw}}wrmjgecbaabcdfimqw||wqmifdcbaddeghknqv{{vrnkigfeddeghknqvzzvqnkhgeeddefgilnrvy}~zvrolihfeddefgiknruy}}yurnkigfeddaabcegiknqtvxyyxvtqnligedbbaabcefiknqsvwxxwvsqnkifecbbaaYYZ[\]_acegijkkjigeca_]\[ZYYZ[\]_`ceghjjhgec`_]\[ZYYOPQRSTVWYZ[[ZYXVTSRQPPOOPQRSTVWYZ[[ZYWVTSRQPOODEFGHIJKLLKJIHGGFEEDDEFGHIJKLLKJIHGFFEEDD789::;<<;:99887 789::;<<;::98877,-./.-,-./.-, ! "! "!,?? ???? "-9EPZbeeaZPD8,!  "-8EPZaeeaZPD8,!  "-8DPZaeeaZPD8,!  #-9EPZbeeaZOD8,!  $/:FQ[bfeaZOD7,!  '1HS\dikjd\QD8,! !"#$'*/5EMV_flppmf]QE8+! 78:3) abccdefggfd`[TKB8.$ YZ[\]\[YUPIB91(  OPQPOLID>81)! DEDCB@=94.("  76430-)$  ,+*)'%"  !           RQ)(+Drop-Shadow#2     N)p+)<<+),4;;964 2 /-*(&#!"$&)+-0 2 479;};964 2 /-*(&#!"$&)+-0 2 479;};964 2 /-*(&#!"$&)+-0 2 479;}}97*<5 ,?Th2 .AUhx0  0ATes{~|. "0ARbmtvqi^+ #1BR`kqrmf[PG) $2BR`kqtqjbYQID' %3BQ_kswvsmf`ZURP% $1?N\hqwyxuqlhdb`_^" "-:GT`iptutsomkigfee" '2>IS[afhiigfeccbaa``   )2:BIOSVWXWWUUTSRRQ %,28<@BCDDCBBAA@@?> #'*,./00/.-,              / "%'),.0 3 57:<6/ "%'),.0 3 57:<6/ "%'),.0 3 57:<6t  "',05'  &Af  &=Ufj`O<,#"*7Kg  *C]r}~vkaZWVWZ^eq .Gby|rjda__`cjv/G^pxvk\NA930..18CVn0EYfjcUB0! "3Jh  2EWce]N<) "7Qp  "3GXce^P>-  /Ea  $6HYeidYJ:-" )6H^x'8L^krqj_SH?:65568=<=>@CHOWblwzqfZPG@;74200SIA;53110148>EOZfqz|uj^SIA:620//./137=CLWcmv}zqg]RIB;742112>841//025:AJT`ku|{sh^SJC=97554567:=BIQZeox{sj`XPJFCA@??@A@=;;<>ADJQYcmvxof^VQLIGGFFGHIKNRW^emv~xqjd^ZWUTSSTNNOPRUX]dks{~wpje`][YYXYY[\^aeiotz{vqlifdcbaab^_`bdgkpv{zupligfeddegiknquy|~zwspmjhgfeefhiknrux|~}{wtpmjhfeddccdfgikmprstutsqoligdca`_^]]\`abcdfhjlmmljhfda_^\[ZYYXXWXYZ[\]^^]\[YWVTSRPONNMLQRSSTUVVUTRQONMLJIIHHGFEFGHGFEDCBA@?>=<<;:9>?>??@??>=<;:98766543232210/..-,,+*),+*('&&%$#"!      (8 ! "#%&(*+-/02 3 5 78:<=@?! "#%&(*+-/02 3 5 78:<=@?! "#%&(*+-/02 3 5 78:<=@?(#)/48<@EJNRW]bd^N7 "^XTQRXev}kS=-$#0E[hbN3   1LadU;" %>VedS:" *9Og{ziXJCBCGLR\ixzbF+ ݪĺ~l_VQMJIJOYfrwq`H0ʲrP5!  +@Tbe\J4! ˴uR5 )=Qae^N:' Ծ`C, ):L]ileTA,ζjWJD@?@BEINT^ius`J4" ˸unigeddehlrzwdO9' ɳo^RID@=;::;=BJU`krsm`O<+ տlR=-! *8GVbgf]O?. ԾhM5#  #1AQ]de]QC2$©pU<)  &5DS_ef`UF7( Ȳ}dM8*"+6CQ]glleZL<,  Ͻ{fUG=62//./0247;AIR]gqwyvnaRB2$  Ʒwja[WTSSTUVWZ^bipwwiYH7)  úwpkhfeddeegikotzzl]L<-  覧unhc`^][[ZZ[]`dinu{wk]N?0# pruyyoe\UOKHFDCCBBCDFJNT[ckrwywri]OA3& GIKOU]fpywmbVLD>9531001236:@FNWaiossog]PC6) 1359>EMXbmu|~zsi_TKB;630/.-../136;@GOXaiorroh^SF8,! 358;AGPYdmv}~yqh_VNHB?<;:9::;<>ACHMSZaiptutqi_TG;.# BDFJOU\dmu}}unf_ZURONMMNOPRTWZ^cimrvxxuph^SG:/$ UWY[_djpv}ysnifb`_^]]^_`abegjmpsvwwuqkcYNC8-# cdegilpty}{wspmjigffeefghiklnoppnkf`YPF<2(  efggikmprtwyzzywuroljgfdcbbaa`_`aba`^ZVPJB:2*# \\]^^_`bcdeffedb`^\[YXWUTSSRQPQPPONMJGC?94.'! LKKLMNONMMKJIHFFECCBA@?>=<;:87! 998898765443221100/.-,+* )(('&%$##""!          _h      76h      76h      76n7 Empty Layer#8     V==mm>>,?ACASBHQQUB]gajefjkmw W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W*WiWW WWWWWWWWWW ==<:986 5 4 20/.-**i  ==<:986 5 4 20/.-**i $$$$$#$̮̮#̮̮#̮̮#̮̮̮̮3ffLf3ffLTTLffLffLff#3ffLf3ffLTTLffLffLff$3ffLff3ffLTTLffLffLffLf#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTLffLffLffLfLW=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  WWW WW WW WW WW WWWWWWWWWWW WW WW WW WW WW WW WW WW WWWWWWWWWW6W<W=W=W<W<WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:W:W:W:W:WWWWWWWWWWWWW               6<==<<:::::               6<==<<::::: $$$$$$$$$$$$$$WWWWWWWWW0WW/WW.WW-W W,W W+W W*W W)W W(WW'WW%WW%WW$WW#WW"WW WWWWWWWWWWWWWWWWWW\WWWWWWWWWWWW WWW WW W ̮̮̮̮#̮̮̮#̮̮#̮̮̙$̮̮̙$̮̮̙$̮̮̙$̮̮̙̙#̮̮̙̙#̮̮̙̙f#̮̮̙̙f#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̮̮̮̮̮̮̮̮̮0/.- , + * ) ('%%$#" \   3ffLff3ffLTLffLffLffLfL#3ffLff3ffLTLffLfLffL3L#3ffLff3ffLTLffLfLffL3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3ff$3ffLff3ffLTLffLfLff3f33#3ffLff3ffLTLffLfLf33f33#3ffLff3ffLTLffLfLf3f33$3ffLff3ffLTLffLfLf3f3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTTLfLffLf3f3L$3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f333ffLff3ffLTTLfLffLff3f33ffLff3ffLTTLfLffLff3ff3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLffLffLff30/.- , + * ) ('%%$#" \   5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWWWWWWWWWWWWW:W:W:W:W:W:WW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W::::::)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C}::::::)jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>WW W WW W WW WWW WWWWWWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR*     ;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?    ;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m- I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@Empty Layer#5     UncnnnpPr rsyua. W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W*WiWW WWWWWWWWWW ==<:986 5 4 20/.-**i  ==<:986 5 4 20/.-**i $$$$$#$̮̮#̮̮#̮̮#̮̮̮̮3ffLf3ffLTTLffLffLff#3ffLf3ffLTTLffLffLff$3ffLff3ffLTTLffLffLffLf#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTLffLffLffLfL$$$$$W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  WWW WW WW WW WW WWWWWWWWWWW WW WW WW WW WW WW WW WW WWWWWWWWWW6W<W=W=W<W<WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:W:W:W:W:WWWWWWWWWWWWW               6<==<<:::::               6<==<<::::: $$$$$$$$$$$$$$WWWWWWWWW0WW/WW.WW-W W,W W+W W*W W)W W(WW'WW%WW%WW$WW#WW"WW WWWWWWWWWWWWWWWWWW\WWWWWWWWWWWW WWW WW W ̮̮̮̮#̮̮̮#̮̮#̮̮̙$̮̮̙$̮̮̙$̮̮̙$̮̮̙̙#̮̮̙̙#̮̮̙̙f#̮̮̙̙f#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̮̮̮̮̮̮̮̮̮0/.- , + * ) ('%%$#" \   3ffLff3ffLTLffLffLffLfL#3ffLff3ffLTLffLfLffL3L#3ffLff3ffLTLffLfLffL3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3ff$3ffLff3ffLTLffLfLff3f33#3ffLff3ffLTLffLfLf33f33#3ffLff3ffLTLffLfLf3f33$3ffLff3ffLTLffLfLf3f3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTTLfLffLf3f3L$3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f333ffLff3ffLTTLfLffLff3f33ffLff3ffLTTLfLffLff3ff3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLffLffLff30/.- , + * ) ('%%$#" \   $$$$$$$$$$$$$$%%%%%%% 5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWWWWWWWWWWWWW:W:W:W:W:W:WW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W::::::)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C}::::::)jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>WW W WW W WW WWW WWWWWWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR*     ;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?    ;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m- I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@Empty Layer#3     Ao)9èǤM!ϵ W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W*WiWW WWWWWWWWWW ==<:986 5 4 20/.-**i  ==<:986 5 4 20/.-**i $$$$$#$̮̮#̮̮#̮̮#̮̮̮̮3ffLf3ffLTTLffLffLff#3ffLf3ffLTTLffLffLff$3ffLff3ffLTTLffLffLffLf#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTLffLffLffLfL$$$$$W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  WWW WW WW WW WW WWWWWWWWWWW WW WW WW WW WW WW WW WW WWWWWWWWWW6W<W=W=W<W<WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:W:W:W:W:WWWWWWWWWWWWW               6<==<<:::::               6<==<<::::: $$$$$$$$$$$$$$WWWWWWWWW0WW/WW.WW-W W,W W+W W*W W)W W(WW'WW%WW%WW$WW#WW"WW WWWWWWWWWWWWWWWWWW\WWWWWWWWWWWW WWW WW W ̮̮̮̮#̮̮̮#̮̮#̮̮̙$̮̮̙$̮̮̙$̮̮̙$̮̮̙̙#̮̮̙̙#̮̮̙̙f#̮̮̙̙f#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̮̮̮̮̮̮̮̮̮0/.- , + * ) ('%%$#" \   3ffLff3ffLTLffLffLffLfL#3ffLff3ffLTLffLfLffL3L#3ffLff3ffLTLffLfLffL3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3ff$3ffLff3ffLTLffLfLff3f33#3ffLff3ffLTLffLfLf33f33#3ffLff3ffLTLffLfLf3f33$3ffLff3ffLTLffLfLf3f3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTTLfLffLf3f3L$3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f333ffLff3ffLTTLfLffLff3f33ffLff3ffLTTLfLffLff3ff3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLffLffLff30/.- , + * ) ('%%$#" \   $$$$$$$$$$$$$$%%%%%%% 5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWWWWWWWWWWWWW:W:W:W:W:W:WW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W::::::)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C}::::::)jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>WW W WW W WW WWW WWWWWWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR*     ;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?    ;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m- I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@Empty Layer#2     ;Сн |ҌҜ՞ ۏ9  W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W)W)W(W&W$W#W!W W W"W#W%W ==<:986 5 4 20/.-*))(&$#!  "#% ==<:986 5 4 20/.-*))(&$#!  "#%W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  &W'W)W*W+W,W.W/W0W 2W 4W 4W 6W7W8W9W9W:W:W:W;W;W;W;WW &')*+,./0 2 4 4 67899:::;;;;<<<====> &')*+,./0 2 4 4 67899:::;;;;<<<====>W=W<W;W:W9W8W7W6 W5 W4 W3 W2 W1W0W/W.W-W,W+W*W)W(W'W%W%W$W#W"W W W!W"W#W$W%W&W'W(W)W*W+W,W-W.W/W1W 1W 2W =<;:9876 5 4 3 2 10/.-,+*)('%%$#"  !"#$%&'()*+,-./1 1 2 =<;:9876 5 4 3 2 10/.-,+*)('%%$#"  !"#$%&'()*+,-./1 1 2 5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C})jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>3W 4W 6W6W7W8W9W;WWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR* 3 4 66789;<<=>;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?3 4 66789;<<=>;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m- I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@?= Curl Layer     `?=?=@U=VQ<TUN;RVSM:PVUQL9OUVTOL8NTVURNK7MSVVTQNK6MRUVUSPMK5LQUVVTROMK4LPTVVUSQNLK3LOSVVURPNLK2LORUVVUTROMLK1KNRTVVUSQOMLK0KNQTVVUTRPNMKK/KNQSUVVUSQPNLKK.KMPSUVVUTSQONLKK-KMPRTVVUSRPOMLKK,KMORTUVVUTSQPNMLKK+KMOQSUVVUTRQONMLKK*KLOQSUVVUTSRPONMLK*KLNPRTUVVUTSQPOMLLK)KLNPRTUVVUTSRQPNMLKK(KLNPRSUVVUTSRPONMLKK'KLMOQSTVVUTRQPONMLKK&KLMOQSTUVVUTSRQPONMLKK%KLMOQRTUVVUTSRQONMMLKK$KMOPRSUVVUTSRQPO)KMNPRSTUVVUTS-KMNPQSTUVV1KLNPQSTUVV3KLNOQRSUUVV3KLNOQRSTU5KLMOPRST6KLMOPQ8KLMNP9KLMN:KLM;KL<KL<K@=<;:9876543«2ï1IJ0Ŵ/ƶ.Ǹ-Ǻ,ȼ+Ƚ*Ⱦ*ɿ)('·&ø%ú$Ļ)ļ-Ž0Ž2ƾ3ƿ5689:»;<<@=<;:9876543210//.-,+**)('&%*.1345689;;==@==<;:9876 5 4 3 2 10/.-,++*)('&%## 򠨰# # ~#ir{#]fow$GQZclt}%FOW_gnv})"+4FMT\cipw. %-5=DKSZagn/ $,4;CJQX_e0 #+2:AHOV]1 "*19@GMT2 !)07>EL3 !(/6=D4  '.5<5 &-46%,7$9:;<=Empty Layer#10     ]r%6%B|Z   z  @ l K"K"K"K"K"K"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""KW @KW#%')+-/1 3 5 79;=!K!K!K!K!K!KWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK!!!!!!!!!!!! =;97 5 3 20.,*(&$"!     "KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""WWWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""WWWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"K"K"K"K"K"K@"""""""""""""""""""""""""""""""""""""""""""""""""""""""@"""""""""""""""""""""""""""""""""""""""""""""""""""""""@"""""""""""""""""""""""""""""""""""""""""""""""""""""""@ @WK@ @@ @@ @ @WK@ @@ @@ @WKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK!K!K!K!K!K!K^!!!!!!^!!!!!!^!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^@@Empty Layer#1     *%&:w:&`&p(c(s(*,z//34(58 9:P:g W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W)W)W(W&W$W#W!W W W"W#W%W ==<:986 5 4 20/.-*))(&$#!  "#% ==<:986 5 4 20/.-*))(&$#!  "#%976 4 3 2 0.-++*(&%$"! !"$%&()*+-/0 2 2 4 6W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5 =<==<<<;;;;:::9988877766665 5 5 4 4 3 3 3 2 2 2 1 1 1 1 000//... &W'W)W*W+W,W.W/W0W 2W 4W 4W 6W7W8W9W9W:W:W:W;W;W;W;WW &')*+,./0 2 4 4 67899:::;;;;<<<====> &')*+,./0 2 4 4 67899:::;;;;<<<====>799:====== ~W=W<W;W:W9W8W7W6 W5 W4 W3 W2 W1W0W/W.W-W,W+W*W)W(W'W%W%W$W#W"W W W!W"W#W$W%W&W'W(W)W*W+W,W-W.W/W1W 1W 2W =<;:9876 5 4 3 2 10/.-,+*)('%%$#"  !"#$%&'()*+,-./1 1 2 =<;:9876 5 4 3 2 10/.-,+*)('%%$#"  !"#$%&'()*+,-./1 1 2 @==<<:9876 5 4 3 2 10/.,+**)'&%%$"! !"#$%&'()*+,-/01 1 2 4 5 6779:;<5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W#W"W"W"W!W!W W W W5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$###"""!!   5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$###"""!!   ---,,,,+++**)))(((''''&&&%%$$$###"""!!!!      !!!""""###$$%%%&WW:W6W3W /W*W:63 /*:63 /*3W 4W 6W6W7W8W9W;WWWW8W5W 1W ,W)W%W"WW!W$W(W-W0 W4W9W3 4 66789;<<=>85 1 ,)%"!$(-0 493 4 66789;<<=>85 1 ,)%"!$(-0 49<> 863 .*'# #',/ 27W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W==<;:9876 5 4 3 200/.-+**)(&). 2 5:==<;:9876 5 4 3 200/.-+**)(&). 2 5:==<;:976 5 5 4 2 100/-,+**('&%$#"!  !"""! !$(-0 49WWWW W W W!W!W!W"WWW#W&W)W, W1 W4W7W #   !!!"#&), 1 47 #   !!!"#&), 1 47 #&&''''((())***+++,+&" "&), 37'W#WW W#W'W*W/ W2W6W;W ~'# #'*/ 26; ~'# #'*/ 26; ~74 0+(% "%). 1 5: ;@@ Empty Layer     + ;7;S[~[;;<==@AAuDyKVMPY"YVZY[)W W/W)W%W!W!W$W'W*W,W/W 1W 3W 5W7W9W;WW:WVW:W:W:W HW:W"W:WW:W W:WW9W0W8WMW7WFW6WSW5W1W4W BW2W 'UW0W >W/W*W.WNW*W 8W)W*UW%W!KW$W?W!W 3WW (PWW$DWW).SWW-"GWJW W2,PWW61TWTWW+W,WW:W9 W4W2 W3 W4 W5 W6W8W9W("_y r ocF,"F%H(+G- r/ 1 394779{8192:[::U:j:2:::&9G8'q7g6 z5I4 a2 :}0 [/>.'s*R)>}%1n$!]!L $ # (OcEA:4ZnMLD)-")NR75/3]: 8U* 7̰8 67<4 tf-҄mqJ%<" ©ﻻzF>E 'O‡q:g֗QXB Pkh\4*  3](ƧS4h;P15٣#Tߟ˓ZSW()m|xtA=G" #  1$ ],W,W,W&W!WWF WWJ W WS" WWTD6( WWD WW/ WWVE& WWOWVD$ #W5 &WF'WVD$ )WVL/-W/ .WM' 0WA 2W7 1WTE)3WA5W=5WO;6WL)6WTE)8W=7WN, 7W=9WC"8WT48WE%7WV67WG'7W83WP03W@!2WP1/WNHNA#.WV7 +WOEGF( +W;'WN/$WD53/ WVUWN0WOLVA#WD?D3WI5./"!W:"% WP3&& (WH3--/WC5605%WWW6WWW0 W1 W2 W4 W5,,,&!g m  {3 |eP; e$ E e8 u+d6#N&g)'d5)pE-E.r: 0`) 2R 1|e<3`*5Z%5tW) 6p= 6{f=8Y(7sA7[*9c38|L8f67P!7i: 7S%3vG 3_12vI/sjs`3.~Q$ +ueig: +W*'rE $dNKF- ~}sGup`3d]eLlNEE2 !V2),% vK890(jKBB.#/cNPH.)*57- 60 1 2 4 5,,,&!- 7  c ěs F  n Ui!#&Q'h!)ڈ--.q 0O 26 1v+3S5I5Q6x6x-8N7߀ 7R9c898j7A7r7H32 3`26/d .G +r +R'߇0$ĘW 3d õŔ<Ҙb!aQV3% lo]#+1(ϒZ2E3/ZQS*5kW60 1 2 4 5͙z8/3 S.y!(nF#"0%"p!&%(: ,/b 1{'3M 6Y8V:H -vYeO004:W<W=W@:<=@:<=@WW=WWW W 1'$).1 5 8;>  1'$).1 5 8;> +!%*/4 7;> @W=W;W8W6 W4 W2W0W.W,W+W)W'W&W%W#W"W!W W!W"W#W$W%W&W&W'W(W)W)W*W+W+W,W,W-W-W.W.W.W/W/W/W@=;86 4 20.,+)'&%#"! !"#$%&&'())*++,,--...///@=;86 4 20.,+)'&%#"! !"#$%&&'())*++,,--...///@=:7 5 20.,*(&%#! !"#%&'()*+,,-.//01 1 2 2 3 3 4 4 4 5 5 5 5 66666*W+W+W+W+W+W+W*W*W*W*W)W)W)W(W(W'W'W&W&W%W$W$W#W"W!W!W WW W!W"W#W$W&W'W(W*W+W,W.W0W1 W3 W5 W7W9W;W=W*++++++****)))((''&&%$$#"!!  !"#$&'(*+,.01 3 5 79;=*++++++****)))((''&&%$$#"!!  !"#$&'(*+,.01 3 5 79;= 1 1 1 1 1 1 1 1 1 1 1 1 10000///..--,,+**)(''&%$#"! !"$%&(*+-/1 3 5 7:< @WW=W7<=>??@@@@@?>520/.|-z.|/02579;<>>?@@@@@@@?>1/~,x+t*r*r+t,x.}1469;<>>?@@@@@@?>1/~-y+t*r*r+t-y/~1KKKKKKKKKKKKKKKK?SdIX421001257:=ACE >70>?AABBCCCBBA7420//~/02479;=?@ABBCCCCCBBA20.|,v+u+u,v-{0258;=>@ABBCCCCBBA20.|,w+u+u,w.|0258;=?@ABBCCCCCBBA WhK[642111357:=@CEGR:2*@ACCDDEEEDDC85310/01358;=?ABCDDEEEEEDDC41/~-y,w,v-y/~1479ABDEEFFFFFFFEE52/.|-y-y.|/258;>@BCEEFFFFFFEE52/.|-y-y.|/258;>@BCEEFFFFFFFFE![nO_864222358;=@CEGHISTM"CDFFGHHHHGGF:753212357:=?BCEFGGHHHHHGGF630.}-{-{.}0369@CDFGHHIIIIIHHG741/.|.|/1379=@BDFGHHIIIIHHG741/.|.|/1479=@BDFGHHIIIIIHHG"^rQb975322458;>@CEGHIJJOVUQLDFGHIIU}U}U}T|T|SzEfBa?\[\A`DdGiKnNrPvRyS{T|U~V~VOUVTOLDFHHIJV~V~U~U}T|T{EfBa?]=Z;W;V;W=Z?]BaEfIkLpNsQwRyT{T|U}V~V~V~V~V~U}T|S{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKnNsPvRyS{T|U}V~V~V~V~U}T|S{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKnNsPvRyS{T|U}V~V~V~V~V~U~U}T|)[\A`DdGiKnNrPvRyS{T|U~V~VWNTVURNKEFHIIJV~V~V~U~U}T|EfBb?]=Z;W;V;W=Z?]BbEfIkLpOtQwSzT|U}U~V~VVVV~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~V~V~V~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~VVVV~V~U}T|)[\A`DdGiKnNrPvRxS{T|U~V~VWWMSVVTQNKEFHIIJV~V~V~U~U}T|EfBb?]=Z;W;V;W=Z?]BbEfIkLpOtQwSzT|U}U~V~VVVV~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~V~V~V~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~VVVV~V~U}T|)[\A`DdGiKnNrPvRxS{T|U~V~VWWWMRUVUSPMKEFHIIJV~V~V~U~U}T|EfBb?]=Z;W;V;W=Z?]BbEfIkLpOtQwSzT|U}U~V~VVVV~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~V~V~V~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~VVVV~V~U}T|)[\A`DdGiKnNrPvRxS{T|U~V~VWWWWLQUVVTROMKEFHIIJV~V~V~U~U}T|EfBb?]=Z;W;V;W=Z?]BbEfIkLpOtQwSzT|U}U~V~VVVV~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~V~V~V~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~VVVV~V~U}T|)[\A`DdGiKnNrPvRxS{T|U~V~VWWWWWLPTVVUSQNLKDFGHIIU~U~U}U}T|S{EfBa?\=Y;W;V;W=Y?\BaEfHjLoNsPvRyS{T|U}U~V~V~V~U~U}T|Sz@^[[A`DdGiKnNrPvRxS{T|U~V~VWWWWWWLOSVVVURPNLKDFGHHIU}U}T|T|T{SzEeA`?\[A_DdGiKnNrPvRxS{T|U~V~VWWWWWWWLORUVVUTROMLKRP!CEFGHHT{T{T{SzSzRxDdA_>[[A_DdGiJmMqOtPvRxSzSzT{T|T|T|T{SzSzRx?\;W8S6P5N5N6P8S;W?\CbFgJlLpOtPvRxSzSzT{T{T{T{SzSzRx?\;W8S6P5N5N6P8S;W?\CbFgJlLpOtPvRxSzSzT{T|T|T|T{S{SzRy(;t"2cCb@^=Z;W;V;V[A_DdGiKnNrPvRxS{T|U~V~VWWWWWWWWKNRTVVVUSQOMLK"2bBa?\[A_DdGiKnNrPvRxS{T|U~V~VWWWWWWWWWKNQTVVVUTRPNMKK!1`@_>[\@^A_A`BaBaBbBbBbBbBaA`A`/\)Q6P5N4M4L4M6O8R;W?\CbFhJmMrPuRxS{T|U~V~VWWWWWWWWWWWWWWWKLOQSUVVVVUTSRPONMLK345666?]?]?]?\?\>[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW1H.D,A*?{*>y*>y*?{,A.D1H3L6O8R:V[?\?\?]?]?]?]?]?]?\>\+'N5N3L2J2J3L5N7R;V?\BbFhJmMrPuRxS{T|U~V~VWWWWWWWWWWWWWWWWKLNPRTUVVVVUTSQPOMLLK123444=Y=Z=Y\BbFgJmMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWKLNPRTUVVVVUTSRQPNMLKK012233;Wy(y,@}.D0G3K5N6P8S9T:V;V;W;W[BaFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWKLNPRSUVVVVVUTSRPONMLKK011222;V;W;V;V:V:UWWWWWWWWWWWWWWWR&Fm  %9$Ci:jQWWWWWWWWWWWWWWWWWWWWWWWWWWWW.C,@})=x(;t':r':r(;t)=x,@}.C0G2J4M6P8R9T:U:V;V;V;W;W;W;W;V;V:U(%I2I1H0G0G2I4L6P:U>[BaFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWKLMOQSTVVVVVUUTRQPONMLKK^012233;Wy(y,@}.D0G3K5N6P8S9T:V;V;W;W[BaFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWKLMOQSTUVVVVVUTSRQPONMLKKZ123444=Y=Z=Y[BaFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWKLMOQRTUVVVVVUUTSRQONMMLKKT345666?]?]?]?\?\>[WWWWWWWWWWWWWW '"?bPWWWWWWWWWWWWWWWWWWWWWW1H.D,A*?{*>y*>y*?{,A.D1H3L6O8R:V[?\?\?]?]?]?]?]?]?\>[+'M4M3K2J2J3K4M7Q;V>\BbFgJmMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWKKMOPRSUVVVVVVUTSRQPO %    M577889BaBaBaBaA`A_WWWWWWWWWWWWWW>rWWWWWWWWWWWWWWWWWWWWW3K0G.D,A,@},@},A.D0G3K5O8S;V=Y>\@^A_A`BaBaBbBbBbBaBaA`A`-(P6P4M3L3K4L5N8R;V?\BbFhJmMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWKKMNPRSTUVVVVVUUTS!@91* $   D89:;<>>IkIkIkIkHjGiWWWWWWWWWWWWWWWWWWWQBy2\,E+DRWWWWWWWWWWWWWWWWWW7R4M2J0G/E/E0G2J4M7R;V=Z@_CbDeFgGiHjIkIkIlIlIlIkIkHjGi2,W;V8S6P6O6O7Q9T?@AALpLpLpLoKnJmWWWWWWWWWWWWWW#6WWWWWWWWWP0Y.OWWWWWWWWWWWWWWWWW9T6P4L2I1H1H2I4L6P9T=Y@^CbEfGiIkJmKnLoLpLpLpLpLpLoKnKn4.Z[y'9p$5h!1`.Y*R&K#D=6'/ "( # (ABCDEEQwQwQwPvPuOtWWWWWWWWWWWWWW,P}TWWWWWWWWWWWWL)@0LWWWWWWWWWWWWWWWW=Z9T6P4M3L3L4M6P9T=Z@_DdGhJlLpNrOtPuPvQwQwQwQwQwPvPvOt7 0_?]=Y:V9T8S9T:V=Y@^CcGhJmMrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLMOPRST7Q4L1H.D+?|(;t%7l#3d 0],U(O%H!A0:*3&- !( "#BDEFFGSzSzSzRyRxQwWWWWWWWWWWWWWW9i9jWWWWWWWWWWWWWV,P}4`WWWWWWWWWWWWWWW>[;V7R5N4M4M5N7R;V>[BaEfIkKoNrOuQwRxRySzSzSzSzSzRyRxQw8!1aA_>[;W:U9T9T;V=Z@^CcGhJmMrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLMOPQ>\;W8R5N2I/E,A~)=w'9p$5h!1`.Y*S'L8C3=.8)1 $+!CEFGHHT{T{T{SzSzRxWWWWWWWWWWWWWWD~4RWWWWWWWWWWWWWWW7e NWWWWWWWWWWWWWW?\;W8S6P5N5N6P8S;W?\CbFgJlLpOtPvRxSzSzT{T|T|T|T{S{SzRy9!2bA`>\K9E5?DFGHIIU~U~U}U}T|S{WWWWWWWWWWWWWWTWWWWWWWWWWWWWWWWW!>` RWWWWWWWWWWWWW@^y':r%7kQbL[FTAO[;W8S5O3K0G.C+?|(aWWWWWWWWWWWWW@_=Z:U7R6P6P7R:U=Z@_DdHjLoOtQwSzT|U}V~VWWWVV~U}T|;"3dCb@^=Z;V:U:U;W=Z@^DdGhKnMrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLNrKnGiDeA`?\[;W8S6O,x*r(m&g|$cw"]pEFHIIJV~V~V~U~U}T|WWWWWWWWWWWWWWAw ;\WWWWWWWWWWWWWWWWWW4a WWWWWWWWWWWWW@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~VVVV~V~U}T|;"3dCb?]=Y;V:U:U;W=Z@^DdGhJmMrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWU}RyOtLpIlFgCcA_>\\[;W9T8R7R8R:U<:864WWWWWWWWWWWWWW06cWWWWWWWWWWWWWWWW-YsWWWWWWWWWWWWWWWWW+U:U7R6O5N5N6P8S[?\@^@^@^@_@_@_@^@^@^?]-Y'N5N3K2J2J3K4M7Q;V>\BbFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVHFDB@>Y123444=Z=Z=Yy+@|-B0F2J4M6P8R:U;V[BaFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWJHFDB@a/00111:U:U9T9T9T8SWWWWWWWWWWWWWW5SKWWWWWWWWWWWWWWWWWWWWWWWW/F-B+?|)=w(;s':r':r(;t)=x,@}-C0F2I4L5N6P8R8S9T9T:U:U:U:U:U9T9T8S(P$G0G0F/E0F1H3K6O:U>[BaFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKHFDBf-{.}/~///7R7R7Q7Q6P6PWWWWWWWWWWWWWW&GoRWWWWWWWWWWWWWWWWWWWWWWW.C,@}*>y(;t':q&9o&9o':r(z,A.D0G2J4L5N6O6P7Q7Q7R7R7R7R7R7Q7Q6P'M#D/E.D.D/E0G2J5O9T=ZBaFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKHFDj,x-y-{.|.}.}6P6P6O6O5O5NWWWWWWWWWWWWWW+O| ' ?tWWWWWWWWWWWWWWWWWWWWWW-B+?|)y,@}.C/F1H2J4L4M5N5O6O6P6P6P6P6P6O5O5N&K"C.D.C.C.D0F2J5N9T=ZA`FgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKHFj,x-y-{.|.}.}6P6P6O6O5O5NWWWWWWWWWWWWWWWWG&Fn "?bSWWWWWWWWWWWWWWWWWWWW-B+?|)=w':r'9p&8n&9o':q(z,A~.D0F1H2J4L4M5N5O6O6P6P6P6P6P6O5O5N&K"C.D.C.C.D0F2J5N9T=ZA`FgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKHg-z.|/~///7R7R7Q7Q6P6PWWWWWWWWWWWWWWWWWWS4` ' &FWWWWWWWWWWWWWWWWWWW.D,A~*>z)z)=w)y+@|-B/E1H3K5N6P7Q8R9T9T9T:U:U:U:U:U9T9T8S(P$G1H0F0F0F1H3K6P:U>[BaFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKZ123444=Y=Z=Y[BaFgJlMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKR456777@^@^@^@^@^?\WWWWWWWWWWWWWWWWWWWWWWWWO!>`0LSWWWWWWWWWWWWWWW2J0G/E-C-B-C.D0F2J4M6P9T;V[?\?]@^@^@_@_@_@_@_@^@^?]  '5N4L3K2J3L5N7R;V>\BbFgJmMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKH7899:;DdDdDdDdCcCbWWWWWWWWWWWWWWWWWWWWWWWWWW?t (>RWWWWWWWWWWWWWW5N3K1H0F/F0F1H2J5N7Q:U\@^A`BbCcDdDdDdDdDdDdDdDdCcCb )8R6O5N4M4M6O8S;W?\CbFhJmMqPuRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK>:;<==>HjHjHjGiGhFgWWWWWWWWWWWWWWWWWWWWWWWWWWWQ6T%:SWWWWWWWWWWWWW8R5N3L2I1H2I3K5N7Q:U=Y?]A`CcEeFgGhGiHjHjHjHjHjHjGiGiFh *:V8R6P5O6O6P9T?@AAKoKoKoKnKnJlWWWWWWWWWWWWWWWWWWWWWWWWWWWWW1[/IUWWWWWWWWWWWW:V7R5N4L3K4L5N6P9T@ABCCNsNsNsNrMrMqWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBz%EkWWWWWWWWWWWW\A`DdGhIlKnLpMqNrNsNsOtOtOtNsNsNrMq .>[[;V8R6P5O6O7Q9T[A`DeHjKnNrOuQwRySzS{T{T|T|T|T{S{SzRy 0A`>[;W:U8S9T:V[A`EfIkLoNsPvRxSzT|T|U}U}U}U}U}T|T|Sz 1Ba?\[A`EfIkLpOtQwRyS{T|U}U~V~V~V~U~U}T|S{ 1Ba?\[A`EfIkLpOtQwSzT{T|U~V~V~V~V~V~U~T|T{ 1Ba?\[A`EfIkLpOtQwSzT|U}U~V~VVVV~V~U}T| 1Ba?\\;W9T8S8S:U[;W9T8R8R9T[;V9T8R8R9T\BaEfIlLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK.>\;W9T7Q6P7Q8S;W>[BaEfIlLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK-=Z:V8R6P6O6P8R;V>[A`EfIlLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK+;W8S6P5N5N5O7R:V>[A`EfIkLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK*9T7Q5N4L4L5N7Q:U=ZA`EfIkLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK79:;<[@^BaCcDdEeEfEfFgFgFgEfEfEeDd5N2J0G.D-C-C.D0G2J5N8R;W>[@^A`CcDdEeEfEfFgFgEfEfEeDd5N2J0G.D-C-C.D0G2J5N8R;W>[@^A`CcDdEeEfEfFgFgFgEfEfEeDd/)7Q5N4L3K3K4M6P9T=ZA`EfIkLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKK67889BaBaBaBaA`A_6P4M2J0G/F/E/F0G2J4M6P9T;W=Z?\@^A_A`BaBaBbBbBbBaBaA`A_3K0G.D,A,@},@},A.D0G3K5O8S;V=Y?\@^A_A`BaBaBbBbBaBaA`A_3K0G.D,A,@},@},A.D0G3K5O8S;V=Y?\@^A_A`BaBaBbBbBbBaBaA`A_- '5N3L2J1I2J3L6O9T=ZA`EfIkLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKK45566?]?]?]?\?\>[4M2J0G.D-C-B-C.D0G2J4M6P8S;V[?\?\?]?]?]?]?]?\?\>[1H.D,A*?{*>y*>y*?{,A.D1H3L6O8R:V[?\?\?]?]?]?]?\?\>[1H.D,A*?{*>y*>y*?{,A.D1H3L6O8R:V[?\?\?]?]?]?]?]?]?\>[+ %3K2I1H0G1H2J5N8S=YA_EeIkLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKK23344=Y=Y=Yy(y,@}.D0G3K5N6P8S9T:V;V;W;Wy(y,@}.D0G3K5N6P8S9T:V;V;W;Wz*?{,@}-B/E1H3K5N6P8R9T:U:V;V;V;W;W;W;V;V:V:U.C,@})=x(;t':r':r(;t)=x,@}.C0G2J4M6P8R9T:U:V;V;V;W;W;V;V:V:U.C,@})=x(;t':r':r(;t)=x,@}.C0G2J4M6P8R9T:U:V;V;V;W;W;W;W;V:V:U( #1H/F/E/E0F2I5N8Sy(y,@}.D0G3K5N6P8S9T:V;V;W;Wy(y,@}.D0G3K5N6P8S9T:V;V;W;W[4M2J0G.D-C-B-C.D0G2J4M6P8S;V[?\?\?]?]?]?]?]?\?\>[1H.D,A*?{*>y*>y*?{,A.D1H3L6O8R:V[?\?\?]?]?]?]?\?\>[1H.D,A*?{*>y*>y*?{,A.D1H3L6O8R:V[?\?\?]?]?]?]?]?]?\>[,W'L4L2J1H1H1I3K6O9T=ZA`EfIkLpOtQxSzT|U}V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKK67889BaBaBaBaA`A_6P4M2J0G/F/E/F0G2J4M6P9T;W=Z?\@^A_A`BaBaBbBbBbBaBaA`A_3K0G.D,A,@},@},A.D0G3K5O8S;V=Y>\@^A_A`BaBaBbBbBaBaA`A_3K0G.D,A,@},@},A.D0G3K5O8S;V=Y>\@^A_A`BaBaBbBbBbBaBaA`A`.[(P5O4L2J2J2J4M6P:U=ZA`EfIlLpOtQxSzT|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKK9:;<[@^BaCcDdEeEfEfFgFgFgEfEfEeDd5N2J0G.D-C-C.D0G2J5N8R;W=Z@^A`CcDdEeEfEfFgFgEfEfEeDd5N2J0G.D-C-C.D0G2J5N8R;W=Z@^A`CcDdEeEfEfFgFgFgEfEfEfDd!1`*S8R6P4M4L4L5N7Q:V>[A`EfIlLpOtRxSzT|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKK<=>>>IkIkIkIkHjGi\A`CcEeFgGiHjIkIkIlIlIlIkIkHjGi7R4M2J0G/E/E0G2J4M7R;V=Z@_CbDeFgGiHjIkIkIkIkIkIkHjGi7R4M2J0G/E/E0G2J4M7R;V=Z@_CbDeFgGiHjIkIkIlIlIlIkIkHjGi#3e,W:V8R6P5N5N6P8R;V>\BaFgJlMqOuRxSzT|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKK>?@AALpLpLpLoKnJm>[;W8S6P5N5N5N6P8S;W>[A_CcEfGiIlJmKnLoLpLpLpLpLpLoKnJm9T6P4L2I1H1H2I4L6P9T=Y@^CbEfGiIkJmKnLoLpLpLpLpLoKnJm9T6P4L2I1H1H2I4L6P9T=Y@^CbEfGiIkJmKnLoLpLpLpLpLpLoKnKn$5i.Z\[;V7R5N4M4M5N7R;V>[BaEfIkKoNrOuQwRxRySzSzSzSzRyRxQw>[;V7R5N4M4M5N7R;V>[BaEfIkKoNrOuQwRxRySzSzSzSzSzRyRxQw':r!1aA`>\[[A_DdGiJmMqOtPvRxSzSzT{T|T|T|T{SzSzRx?\;W8S6P5N5N6P8S;W?\CbFgJlLpOtPvRxSzSzT{T{T{T{SzSzRx?\;W8S6P5N5N6P8S;W?\CbFgJlLpOtPvRxSzSzT{T|T|T|T{S{SzRy(;t"2cBa?][@_DdGiKnMrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKHIIJV~V~V~U~U}T|EfBb?]=Z;W;V;W=Z?]BbEfIkLpOtQwSzT|U}U~V~VVVV~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~V~V~V~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~VVVV~V~U}T|)[[A_DdGiKnNrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKHIIJV~V~V~U~U}T|EfBb?]=Z;W;V;W=Z?]BbEfIkLpOtQwSzT|U}U~V~VVVV~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~V~V~V~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~VVVV~V~U}T|)[[A_DdGiKnNrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKHIIJV~V~V~U~U}T|EfBb?]=Z;W;V;W=Z?]BbEfIkLpOtQwSzT|U}U~V~VVVV~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~V~V~V~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~VVVV~V~U}T|)[[A_DdGiKnNrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKHIIJV~V~V~U~U}T|EfBb?]=Z;W;V;W=Z?]BbEfIkLpOtQwSzT|U}U~V~VVVV~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~V~V~V~U~U}T{@^=Y9T7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{U}U~V~VVVV~V~U}T|)[[A_DdGiKnNrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKFHHIJV~V~U~U}T|T{EfBa?]=Y;W;V;W=Y?]BaEfIkLoNsPvRyT{T|U}V~V~V~V~V~U}T|S{@^[[A`DdGiKnNrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKFGHIIU}U}U}T|T|SzEfBa?\[[A`DdGiKnNrPvRyS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKEFGHHT|T|T|T{SzRyDeA`>\\A`DeGiKnMrOuQwRySzT{T|T|T|T|T|T{SzRy?][A_DdGiKnNrPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK%dy![n"]p"^r#_s#`t)[A_DdGiKnNrPvRyS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK!1aA`?\[A_DdGiKnNrPvRyS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK!0_@^=Z;W:U9T:U;W=Z@_DdGiKnNrPvRyS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK /]?\[=Y;W9T7Q5N4L2J1H1H1H2J4L5N7Q9T;W=Y>[?\@^@^A_A_A`A`A`A_A_@^@^?\>[[?\@^@^@_A_A`A`A_A_@^@^?\>[[?\@^@^A_A_A`A`A`A`A_@_@^?]?\=Z[A`DeHjKoNsPvRyT{U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK344555>\>\>[>[>[=Z=Y[>[>\>\>\>\>\>[>[=Z[>[>\>\>\>[>[=Z[>[>\>\>\>\>\>[>[=Z=Z\A`EfIkLoNsQwSzT|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK223344[A_DdGhJmMqOuRxSzT|U}V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK 222333;W;W;W;W;W;V;V:U9T8S8R7Q6P5N4M4M4L4M4M5N6P7Q8R8S9T:U;V;V;W;W;W;W;W;W;W;W;W;V;V:U9T8S7R6P5O4M4L3K2J2J3K3L4M5N6P7R8S9T:U:V;V;W;W;W;W;W;W;W;W;V;V:U9T8S7R6P5O4M4L3K3K3K3K4L4M5O6P7R8S9T:U;V;V;W;W;W;W;W;W;W;W;W;W;V:V:U9T9T8S8S8S9T:U;W=Z@^CbEfIkKoNsPvRxS{T|U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK 333444[@^BaDeGiJmMqOtQwRyT{U}U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK 555666>\>\>\>\>\>[>[=Z=Z=Z[>[>\>\>\>\>\>\>\>\>\>[>[=Z=Z=Y[>[>\>\>\>\>\>\>\>\>[>[=Z=Z=Y[>[>\>\>\>\>\>\>\>\>\>[>[>[>[=Z=Z=Z=Z>[>\?]A_CbDeGhIlLoNrPvRxSzT|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK 888888A`A`A`A`A`A`A_@_@^@^@^?]?]?\?\>\>\>\?\?\?]?]@^@^@^@_A_A`A`A`A`A`A`A`A`A`A`A`A_@_@^@^@^?]?\>\>[>[>[>[>[>[>\?\?]@^@^@^@_A_A_A`A`A`A`A`A`A`A`A`A_@_@^@^@^?]?\>\>[>[>[>[>[>[>\?\?]@^@^@^@_A_A`A`A`A`A`A`A`A`A`A`A`A_A_A_@_@_@_A_A`BaCbDdEfGiIlKoNrOuQwRyT{T|U~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK 7:;;;;;DdDdDdDdDdDdDdDdCcCcCcCbCbBbBbBaBaBaBbBbCbCbCcCcCcDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdCcCcCcCbCbBbBaBaBaBaBaBaBbCbCbCcCcCcDdDdDdDdDdDdDdDdDdDdDdDdDdDdCcCcCcCbCbBbBaBaBaBaBaBaBbCbCbCcCcCcDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDeEfFgGhHjJmLoMrOtPvRySzT|U}U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK ,>>>>>>GiGiGiGiGiGiGiGiGiGiGhGhGhFhFhFhFhFhFhFhGhGhGhGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGhGhGhFhFgFgFgFgFgFgFhFhGhGhGhGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGhGhGhFhFgFgFgFgFgFgFhGhGhGhGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiGiHjHjIkJlJmKoMqNsOuQwRxSzT|U}U~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK #@@@@@@KnKnKnKnKnKnKnKnKnJmJmJmJmJmJmJmJmJmJmJmJmJmJmJmKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnJmJmJmJmJmJmJlJlJlJlJlJmJmJmJmJmKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnJmJmJmJmJmJmJlJlJlJlJmJmJmJmJmJmKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKnKoLpLpMrNsOtPvQwRySzT{T|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK CCCCCCNrNrNrNrNrNrNrNrNrNrNrNrMrMrMrMrMrMrMrMrMrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrMrMrMrMrMrMrMrMrMrMrMrMrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrMrMrMrMrMrMrMrMrMrMrMrMrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNsNsOtOtPuPvQwRxRySzT|T|U}V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK EEEEEEPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPuPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvPvQwQxRxRySzSzT{T|U}U}V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKK GGGFFFRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRxRyRyRyRyRyRyRyRySzSzSzS{T{T|T|U}U~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKHHHHHHS{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{S{T{T{T{T{T{T{T{T|T|T|T|U}U}U~V~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKIIIIIIT|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|T|U}U}U}U}U}U}U}U}U}U}U}U}U}U~U~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKJJJJJJU~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~U~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKJJJJJJV~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~VVVVVVVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK P>T@dt|(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/enormous result icon2c.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/enormous result icon2d .xcf0000555000175000017500000055276410162465511023741 0ustar brentbrent00000000000000gimp xcf fileBBz/ gimp-commentCreated with The GIMPS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) I b}     !"gimp-text-layer(text "{a > b}") (font "Comic Sans MS") (font-size 83.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "c") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) u3 u_v ^?}(}{3+Q0yG. .y -5 , ;,@ͧh-x$1%49G5u5x6A66 668888888!c޴= r 4 CN U)(v\aJ:O v2= \ZeH e u  3}786654S4 !  ! "* #,* $(R %Z&8/' ( s*Y +- `m8u77l78888888888888888Xɠe$8 V!6: V !yBF (e & h $g @ @ @z|&S*Hw  v 3; h>"u#E6syA f%F//[X _ @ @ @SR /*[ kF0u}CP; )aZ#>1!zS a>GOi+f.8Ey_F 6F- BZ!Xs0 @t =2g,t wy a[L-7r߮n'~65wK5%55F2c.H e/ / 06 1?2#>3@ۨ4g @ @ @- .-^,;*xh)K(>3&{% $@!}M   ' B xZ"j #3J9{457rz;;:::9s999k9P @ @ @\q;#*E&* X u w {F'2c 4!FRv A$GRLݺP(Nb,[ht}D 9`%X="0QLM]tD_wI6 =gw-K~Ju#|Dad E   4>="3ٝ?]r:9UDrop-Shadow#1      UBEFGGFEB>:61,&!  %*066/'!  !(/6>EMTZ_cefeb^YSLD<4,%  ")/7>FMU[_cefdb^YRKC;3+$  #)08?GNU[`cefdb^XRKC;3+#  $*19@HOV\adfgeb^XRJC;2+#  %,3:BIPW]beggec_YRJC;3+$  !'-57/)#   ?FLSY^bfhhigda[VOHA:3,%  AHOU[_cfghgea]XRKD=6/)#  KQW\`dfhgec_ZTNHA:3-'!  TY^beggfda\WRLE>81,&   \`dfggec_[VPJC=71+%  befgfeb^ZUOIC=71+&! gda^YTOIC=72,'" d`]YTNIC>83-(# XTNIC>82-(# HC=72-'"'99:;;<>>'==;;;          !#$&&'&%$#!   #&)-024566530-)%!  "'+048:5/)#  "',2780)"   &,28>DJOTY\_befggfec_ZTMF>5-&  "(/64*!  !'/7?GOW]bgjlnnlkmnprttrniaXOD:0&  %,4=EMU\bgjllkifdcbbcegknpqqnjd]SI?4+"  !(09BJRZafiklkieb_[YWWX[]bfilmmjf_WMC8.%  $+4=>@DJPV]begfc^WNE;1'   (08AJS[aehjifa\UNHB=:99;@ELSZ_dggea[SJ@6,#   '/8AJRZ`eijifa\UNHA=977:>CJQX^cgihe_XOF;1(   '.7@IRZ`ehjigc]WPIC>;99;?DJQX_eikkid]UKA8.$  %-6>GOW^dhiihd_ZTNHC?==?BGMTZbhloonic\RH>4*!  #*2;DMU\bfikigc^YTOJGEDEHLRX_ekprsroibYOD:0&   (08@IQY`ehkkjgd_[WSPNMNPTX^djosvwvtog^UJ@5+"  $,44+# %,3;BJQW^cfilmnnmmlmoprsttutrpke_WOF=3+# %,3:AHOU[`dgikllmlmmnmlifb]WPHA91)! %+28?EKQV[^bdfghhgfedca^[WRMGA93,% #)/5;AFKPTWZ\^_``_^][ZYWUROLIFA<61+% !&+05;?DHKNPRTTSRPOMKIGDA?<840,(#  "&+/37;>ACEFFGGFEDCA?=;9641.+(&"  !$(+.135789986531/-+)'%"    #%')*,,+*)('%$"                     78888995~60)"")~60)"")~60)"")$2. +  *  ( $),-+(! ' #+39;;81)! % &09BGIGA9/$  &13(  #/82,%  *8IZjy{uplkjkkjh %-5>FLQTVVSOKE=6/(!  "0?P`p}wphca`aehj !*2;DLSY]``_\WQJB80(   '6EVes}ypf]VQQRV\b #+5>GPX_dhiifb[SKA7.%   -;KZitz}zsi^SJDAAELT $-6?IR\cjnqqokd\RG<1'  %2AP^irutndYLB9435IT_iqw||{vndXK>2&  &4AO[djjg_TG<2+(). '1;EP[entyzytmcXL@3(   ,9GT_hkkf]RG<40/2 '0:DOYcjptusoh_UI=2'  %1?MYdknlg^TKC<:;  (1;ENX`glnomgaXNC9.$  *7ER_iprqkd[SMIH !)27/)"   ,8ER^hpuxxwur &,28<@AA?<72,&   ",7COYbhmoonl $)-135430,'"   )3=HPV[^``_  #&(('$"  %-5=92(' %0;FLPOJA5) & *7DOX]]XM@1#&*8ER\cd_VG7(& '3AO[dgdZL:* & ".P^gidXH7( TJ?2'  !0AR`jmg\L;+ c\QF9,   #2CUcmpl`Q?. jg`WK=0# $4EWfpsncTA/  gigbYM?1# &6IZisuocR?. \chhcZN?1$  *:M^lttm_M:)PZbggbYL>/! .?QbnspfVD2" COZcgfaVH9*  #3EVenoj]L:) :FR]ehe]QC4&  )9J[fljaRA/  6AMXbggbXK<-    .?P^gidYI7'8AKV`fhd]PB3& %4DTagf_P@/  ?FOX`fhf_TF8)  *:JYcgdYJ9(KOU\bghf_UH:-  "1AQ]ef_SC2# XZ]bfihe^TH;-!  +:JXbgd[M<, efhiigb[RF9,!  '5DS_ff`UE4%nlkkjhd^VLA6*   %2AO\dgcZL<+  pmkigc]WOE;0&  $0>LXbfd]PA1#  jgea^YTMF=3*!  "-;HT]bb\RD4&  ][XUQLGA:2*#  )6BNW\]YPC5'  LJHEA=93.(!  #-9DMSTQJ?4'  98641.*&"  $.7@EGFA8/$  ('&$"   !*16885/'    !&)*($             27E{3 -& %+ 2{3 -& %+ 2{3 -& %+ 2>==<<4/0 55 .(!#* 17>5 .(!#* 17>5 .(!#* 17>578:=/6/6/6@++++*?O Drop-Shadow     +h=O=4ee#O=`ITbQbacce5/+( &  $  #  !  "$$#  ! !%)+,,+($  #).25653/+%  #*16;>?>;71*$  ")18?CFGEB<6.'  '08@FKMMKGA91)!  #,5>FMQSROJC;2)!   '1:CKRUWUQKC;2)    !*4>GOUXXVQJB90'  #-7AKRWYYUOH?6-$    &0:DMTXYXSME;2)     '1; #-8AJPTTQLC:0&  &,39>CGJLLJG %/9CKQTTQKB8.$   (/6=DJOSVXYXWT '1;EMSUUQJA7-#   (08@HOUZ^acdcb_  )4>GOTVUPI@6,"  '09BJRY_dgjllkh #-7AJQVXVQI@5+!  %.8AKT[bgknprrqo &0:EMTYYWQI?5*   "+5?JS\chmprsuus  *4?IQX[\XRI?4*   '12'  #.:FQ[djmmlieb``adgk %02'  &1=IT^fkmlie`\ZY[^cg &1=JU_gkkg`WK?2'  (3?LWahkljfa\WTTVZ_d '2>KV`hllhaWK?2'  )5ANYbhllid^XSQPRW\b &1>JV`gklhaWL?3'   *6COZcillhc\VQNNQU[a %0IR[bgjmnnoop  *5?IRX[[WQI?5+"  $-7AJRZ_dgijjkji (2=GPVZ[XSKB8/%  '/8AIPV[^`bbccba` %/:DNUZ[ZUOF=3)!   '/7>EKPSVWXXWVU #-7AKSX[ZWQJA7.%   '.4:@DGJLLKJH  )4>GPVYZXSLD;1(  $*/48;>?@@??=< &0:DLSWYXTNF=4+"  !%)-/13321/ ",5?GNTVVSNG?6-$  "$&'((''&$ '09BIORRQLF?6-$   "*3;BHLMLIC<5,$   %,4;@DFFC?92*"    %,38<>><83-&   75432 1 1 0 /  ""! #'))(  $*-00/   #*/4776  '.5:=><  #+3:@CDC    %.7?EIJI    (1:CJNPO     )4>GNSUU"  !!   !+6@JRX[[,($  !%())(&"  "-8CMV]`a73.("  "',/121.+&!  #.9EPZafhC>82+#   &,269::74/)$  $/;GS]eknOJC;3+#  ")17<@BBA=82,&  %0EKOQQOKE?7/'   %1>KYeov{ke^UK@5+!  $,6?GNTWXWTNH@7/&  &2?LZfpx}pkd[QF:/%  "+5?HPW[^^\WQI@6-$  &2?LZfpx}rnh`VJ>3(  !*4>HQY_bdb_YQH>4*!  &2?LZfow{spjcYNB5*   (2LXdntxrpke[PD8,!  '0;FPZbhlmje]TI>3(  %1>JWbkqspoke]RF:.#  &0:EP[cjnomiaXMA5*!  %0=IU`hmnmmkf^SG;/$  &/:EQ[dkoqojcYNB7+!  %02&  %.8BKU\cfhgc]UKA6,#  #.9DNV[]\gijf`VK?2'  '0:CLU[`bc`\UMD:0'  #.9DNV[]\hkkgaWL@3(  !)2;DLSY\]\YTME<3*!  #.9DNV\^^kmmibYMA4)  "*3;DKQTVVTPJC;3+#  #.9DOW]``npokdZNB5)  "*2:AGLOONKF@:2+#  #.9DOX_bcqrqle[OB6*  !(07=CFHGEB=70)#  #.9EPYaegturmf[PC6*   &,38<83-'!  #-9EPZbhjvvsnf[OC6*   "(-256652.*$  ",8DOZcimvuqlcYNA5*   "'*,--+)%!  !+6BNYbintrnh`VK?3(   #$%$#   )4@KV`gmomhbZQF;0&    &1?>;60*#    '.65,# 2-'!   )2;CKQUVUQKC:0' 83,%  '09BJQVXXUOG>4*! ?92+$  $-6?HOUYYWRJA7-# E?81*#   )2;DMSXYXSMD:/% KF?81*$  %.7@IPVXXTNF<1' RMF@92-($   !)34*  `\WRLFA<840,($  "+5?HOTUTOH?5+! gd`[VQLHC?;72-("  (24*  ~|yuroljhgeb^YRJA8.%   *4?HPUWVQJA6," }|yuqmjhgfedc`\VOG=3*!  )3>HPVXWSLD9/% ywtokfca`aabba^YSKB8.$  (3>HPVZYVOG=2( sqlgb^[YXY[]__^[VNE;1'  '2=GPW[[XRJ@5*! >mje_YTQPPRUX[]][WQH?4*!  '1@CGMRWZ[XSLC9.$  &0;GQY^_^XQG<1& ]WPIB=98:=CIOUYZXTMD:0%  %0;FPX^`^YQG<1' ZTLE>8546:?FMSWYXTNE;0&  %0;FPX^`^YQH=1' XRKC<73348>ELRWYXTNE;0&  %0;FPX]_]XPF<0& XRKC<74359?FMSWYXTME:0&  %0;FOW\^\WOE:/% ZTMF@;879=BIOTXYXSLD9/%  %0;FOW[\ZUMC8-# ]XRKE@==>BGMRWZZXSKB8.$  &0;EOVZ[XRJ@5+! a]WQLGEDFIMRVZ[ZWQI@6,"  &1;FNUYYVPH>3) fc^YTPNMNPTWZ\\ZVOG=3)   '1GOTVUQJA7,# pqomjhfeddcca^ZTLD:1(  !+5?HPTVTPH?5+! pqqpnljigfeb_[VOG>5,#  $-7AJQUVTOG>4)  mppomkjhfc`\VPIA8/&  '0:DLRVWTNF=2( hklljigeb_[VPIA91(!  !*4>GOTWWTME;1' `ceedca^[WSNGA91*"  %.8AJQVXWSMD:/% VY[\\[ZXURNID>70)"  !)3@BCDCBA>;84/*%   (1:DLSWYXUNF=2( 146776420-)%!  "+4=FNTWXVRKC9/% &(*++*)'%"  $,6?GNSVVSNG>5+"     $-6>FLPRQNIA90'   $,4CEFD@:4,$     &-38<>=;72,%   %*/35541-'"   "&)+,+)&!   !##!     $  $  ' )+05"+/6 "'-14552/*%    !%)+,+)&"   !##"! "  #  %  & )+/6a'0Empty Layer#7     IeefAfQhjlalqu~O_2i((((p+ 3. i((((p+ 3. i((((p+ 3. @8888888888@####;l"N%<@####;l"N%<@####;l"N%<?d###### @3 3 3 3 3888888888888888888888888883 3 3 3 3 88888883( (/ / / ( 8( Z( ' ' T' ' ' ' ' ' 1' F' _' x' ' ' m' W' D' 2/ !/ / / / 1 1 (( ' ( ( ( ( ( ( ( ( ( ( (  ( ( xy(((((((( (/ / / ( 8( Z( ' ' T' ' ' ' ' ' 1' F' _' x' ' ' m' W' D' 2/ !/ / / / 1 1 (( ' ( ( ( ( ( ( ( ( ( ( (  ( ( xy(((((((( (/ / / ( 8( Z( ' ' T' ' ' ' ' ' 1' F' _' x' ' ' m' W' D' 2/ !/ / / / 1 1 (( ' ( ( ( ( ( ( ( ( ( ( (  ( ( xy(((((((8888888888 e()n“GF0 7 BN     r c  ud /    0  &n    F  ǫV -,+E)#'8%V%r'q e( '$lcN @  W<  K  n  ( 94 G E- E k  ####### e()n“GF0 7 BN     r c  ud /    0  &n    F  ǫV -,+E)#'8%V%r'q e( '$lcN @  W<  K  n  ( 94 G E- E k  ####### e()n“GF0 7 BN     r c  ud /    0  &n    F  ǫV -,+E)#'8%V%r'q e( '$lcN @  W<  K  n  ( 94 G E- E k  ####################))(((((((i((((((((((((((((((((((((@8888888888888888888883 3 3 3 3 88888888888888888888888883 3 3 3 3 888888838888@8 @? @888833 3 3 3 3 @ t@@Empty Layer#6     F rtiZj> W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W*WiWW WWWWWWWWWW ==<:986 5 4 20/.-**i  ==<:986 5 4 20/.-**i E@8888888888@?@@ @3 3 3 3 3888888888888888888888888883 3 3 3 3 8888883W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  WWW WW WW WW WW WWWWWWWWWWW WW WW WW WW WW WW WW WW WWWWWWWWWWWW<W=W=W<W<WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:W:W:W:W:WWWWWWWWWWWWW               <==<<:::::               <==<<:::::8888888888W=W<W;W;W;W;W;W|WW0WW/WW.WW-W W,W W+W W*W W)W W(WW'WW%WW%WW$WW#WW"WW WWWWWWWWWWWWWWWWWW\WWWWWWWWWWWW WWW WW W =<;;;;;|0/.- , + * ) ('%%$#" \   =<;;;;;|0/.- , + * ) ('%%$#" \   @@88888888888888888888883 3 3 3 3 88888888888888888888888883 3 3 3 3 88888835 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWWWWWWWWWWWWW:W:W:W:W:W:WW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W::::::)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C}::::::)jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}8888@8[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>WW W WW W WW WWW WWWWWWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR*     ;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?    ;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{?A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m-8888833 3 3 3 3 @4I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@]!Proj     7Ft gimp-text-layer(text "!Proj") (font "Comic Sans MS") (font-size 65.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "c") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) ]ź]2³À8 !\bČF~ 9y%BG-b/ n   l  ~^Z!:q L jB %@ .~V \ DT W5*Y #_ 3 s( Ա@HX<X<<<<X=Y/u;2mR0a  ap h & ~    ݛnE&Q Yp+ /9 &Hr. us H |") "b ]"z <"J "! " " " " 6"O zr" :@@@RRRSSpoF!;@@@d` ))@@@k T" v $:"$QJ6&KP&$W(M*P,0 j. x"1 Sܱp j8 77>0<0{111@ 2^ 44 568(΀>yyyVq-Gb}ib<GkU F.#dDrop-Shadow#4     4Uz|dƘdƼߋRM                 "##$##"   #&),-/00//-+)'$   #&(('$! %).269;<==<:863/+'"  !',/110-)%! $)/5:?CGIKLLKJIFC@<72-'"  !(/49;;:61,($""$'-3:AGMQUXYZZYWUQNID?92,&  &/6=BEEC?:4/+))+06=EMTZ_cfhhfeb_\WRLE>70(!  #,5>FKOOMHB<62/028?GPY`glprsttsrpnkhd_YRKC:2*"  &0;EMSWWUPJC<856:@HQZckrwz|}}|{zywuroje^WNF<3*"   *5@KT[__]WPIB>;<@GPYcmu{~|{ywsoibZQG=3*!  "-8DPZaefc^VOHC@BFMVakt|~~}}|zvrld[QG<1(  $/;HT^fkkhc[SLGEFKR\fqz~|{{|}}{xsme[PE9/% %1>KWbjoolg_WOJHJOV`ku}{xvttuwz|}}|ytmcYMA6+! &2?MZemrroibYRMKMRZcnw~ytolkkmpswz}~}yskaUI<1& '3@N[goturld[TOMOT\fpy~xqkea``bfkpuz}~|xqg\PC7+! '4AO\hpuvsme]UPNPU]gqyyqia[VTTW[ahou{~~{vmbVI<0& (4BP]iqvwtnf^VQOQV^hqy~zsjaXQLIILQW_hpw|~}yqg[NA5+" (4BP^irwxuog^WRPRW_hqy}|wndZPHB??BGNWaksz~~{uk`SF:/& (5BP^irwxuog_WRPRW_hqx|}ztj_TJA;779?GP[fpx}}wodWK?4, (5BQ^jrwxuog_WRQRX_hqx||xqg\PE<51139AKVbmv|~yqf[OC91 (5BQ^jrwxuog_WRQSX_hqw{{wpfZNB92.-06>HT`ku|~zsi]RG>7 (5BQ^jrwxuog_WSQSX_hqw{{woeYMB81-,/5=GS_kt{{tj`UKC> (5CQ^jswxuog_XSQSX`hqx{{xpfZNC93/.17?IUalu|{tkaWOHD (5CQ^jswxuog_XSQSX`iry|}yrh]QF=7335;CMXdnw}ztkbYRMJ (5CQ^jsxyvph_XSQSY`jrz~|ulaVLC=99JX &2?MZemrspjc[UQPSZdo{zrjc]WQLF@;5/)%! #(0;HV %1>KWbjopmhaYSOORYbnyypg^WPJD?94/)$ %.:GU $/71+&"!+7ES !+6BMV]ab`[UPKIINU^is{{sh\QF<3,&!  *6DR (3=HQW[\ZVPKGEGLS]gqy~}vmaUI=3+# )6CQ %/9CKQTUSPKFCBDIQ[fow||yrh\OC7,$  )5CQ #,5=EKNNMIEA??BGOYdnuyzvodXJ=1'  (5CQ  (19@EHHGD@=;?=;8556:@IS^gnrrmf[NA4(  '4AO #*16:<<;853247>GQ[dknnjbWK>1&  '3@N #*059;;9741025:4.(!  #&(*++*(%" :87789:;<>@BEHLNQRSRPLG@91)""&*.24688641-)$ BABCEGHIKMOQTWZ]`aba^ZTMD;2*""',16;?BDFFDB>94/(" JKMPSUWYZ\^`behkmoonkg`XOE;1)#!&+17>CHMPSTUTROKF@:3+$ RUY]adfhijlmortwyz{zwrkcYNC90)%##%*/66-% Y^cinrtvwxxyz|}{tkaVK@70,*+.39AHOV\bfjlnnmjfaZRJ@7-$ _fmtz~ͅ{rh]QG>73237=DLS[bhlpsvwxxwtqlf^UK@6," emv~ڋ~vlaVLC=:9;@GNV^ekptxz|}~~|zuph_UJ>3)  is|~wndZPHC@ADIPX`gnswz|}~h|wqh^SG;/%kw~}~{une[SLHFHLRYahotwz{||}}~}wpf[OB6* my}xuttvwyzyvqkc[TOLLNSZahotwyzzyxwxy{}|umbVI<0%mz{tnkiijlnppokf`ZUQPQTZahotxyyxusqooqswz~~yrh\OA5)mz{rjc_]\^`cefec`[WSRRUY`gnswyywsokgeegjnty}|vlaTG9-"ly|rg^WRPOPSVYZ[ZXUSQQTX^elrwyywrmga]ZZ\_ekrx|~}xpeYK=1%jxth]SLFCBDFILNPPONN6PTZahouxyxsmf^XRONPU[cksy}}zsi\OA4(hvwk_SIA;878:=@CEFFGHKOT[ckrwyyuog^VNHDDFKR[dnuz|ztk_RD7+!ft~zobVJ?71-,-.147:<>@CGMT\emtxzxskbXNE?;:=BJT^irx{zvmbUG9-"er|~th[NB7.($##%'*-/259=CJS\fouyzvpg\QG>7325;CMYdnvzzvncVH;.#cpzyobUG;0'!!$'*.28?HR]gpvzyuncXLA81-,/5>IUaktyzvodWJ1&!(/9DP\gpwzxsj_RF:1*&&)/8DP]hqwyvoeXJ=0%`luz{wodWI;.# #,6BN[gqwzxsj_RE:0)&&)/8DP]hqwxuodXJ<0%_ktyyumbTF8,!   )4@MZfpwzxsj_RF;1+''+1:ER^irwxuncWI;/$_jsxxtl`SE7*  '2>LYepwzytlaUI>4.++.5>IT`jrwwtlbUG:-#^jswwsk_RD6)  $/3*"           "$$"   $(*+*($   $*.11.*$  "(.25652.("  $+169:961+$  %,27:;:72,%  $+169;:61+$  ")/478740*#   &,03441-'!  #(,/00-)$  $(+,+*&"  !$'))'$   "%''&#  !%''&$!  #&)*)'$   &*-..,(#  $*/3542.)#  ")06:<<:5/(!  &.6=BDDB=6.&  "+4=DJMMJE=4+"  %/:CLRUURLD:0&  )4?IRY]]YSJ?4)  ",7CNX_cc`YOD8,"  $.:GS]eiie^SG;/$ %0=JVaimmiaWJ=0% '2?LYdlppldYL?2& (3@N[fnrrnf[N@3' (4AO\gpttpg\OA4' )5BP]hquuqi]PB4( )5BP^iqvvri^PB5(  )5CQ^irvvrj^QC5(  )5CQ^jrwwrj^QC5(  *5CQ^jrwwsj_QC5)  *6CQ^jswwsk_RD6)  *6CQ_ksxxtl`RD6)  *6CR_ktxyulaSE7*  *6CR_ktyyumbTF8+  *6DR`luzzvncUG9+   *6DR`lv{{wodVH9,!  *6DSamv|}yqeXI;-" *6DSanw}~zrgYK<.# *6ESbox~|ti[L>0$ *7ETcoy~vk]N?1%  *7ETcpzxm_PA2&  +8FUdq|znaRB4' !+8GVer}|pcTD5( ",9GWfs~}reUF7*     $+169;:850,)((*.39>BDDA<5.&  &0: ")/478862.*&$$%(-159::83.'   "+5  &+03442.*&#  "&)-/00.+&   &. "'+.//-*&"!$&''%"   ( "%()('$!  ! !""                     $   DMSVVSMD:0&  '0;EPYbjptxz{|}||zxuqle]TJ@7.&=EKMMJE=4+"   )293-)%"! !"#%#&''&#  $*/5:>ADEFFDB?;72.)&#! "$'*-   $)-146788642/+($!!%).26  "%()++*(&$!#(.4:?     $+3:BH   &.7@IQ    '0:EOX    '1HTao{yk\L<." /1369>ENYer}yk\L<." 9<>@CGMU_jvyk[K<." DGIKNQV]fpzxiZJ;-! NRUWY\`fmv~vgXH9+  W\`bdgjou|rdUE6) `ejmoqtx}{n`PA3' fmrvx{}vi[L=0$ iqx||pcUF8,! kt{ui\N@3' is{ynbTG:.# eoxzpeYL?3( ^irzzqg\PC7," V`jry~|wpg]RF;0& LV_hnswxxvrld\RG=2( AKT[bgjkkie_XOF=3*! 7?GNTY\]]ZWQKC;2*" ,3:AFJMNNLHD>70(! #).48<>??=:61,&  $(,/1220.+&" !$%&&%#           Q2((]R     >Cgimp-text-layer(text "R") (font "Comic Sans MS") (font-size 65.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "c") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) (]W(]   ēU B|2H =l q  r ~  WV ~e6 ]eX:/ @dS!hm}S 069 ~ (%!8TzS` G  T V#  F.  f 1 ]a k    E   m<P |Zo.Empty Layer#4     B )u}UeuiW(W(W(W(W(W(Wi((((((i((((((i((((((@#W#W#W#W#W#W#W@#######@#######@#######(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(W(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W#W###############################################################################################################################################################@@Empty Layer#9     W  D hx+A@<<<<<<<<<<@?F@@777778888888888888888888888888877777888888888888888888888876<<<<<<<<<<F8888877777788888888888888888888888887777788888888888888888888887<<<<@< ? 888777777@ @@Drop-Shadow#3      ___$+M7HQV[         $ ,! 503. =@E=<=a^u{{umd[SKEA=;987VME>941/.--.0365-'" $*1:DOZdlqsqldZOD:1*$ C9/' #+4?JU_hmomh_UJ?4+#*"  &/:EQ\djljd\QE:/& '  ",7BNYbgigbYNB7," $  )4@LW`ege`WL@4) "  '3?KV^dfd^VK?3' "  '2>JU^dfd^UJ>2' "  '2>JU^dfd^UJ>2' "  '2>JU^dfd^UJ>2' "  '2>JU^dfd^UJ>2' #  (4@LW_ege_WL@4( %   *5AMXafhfaXMA5*   gd)   $-8DP[cikic[PD8-$ ,# '1HS]gotvtog]SH>5-($  " :4/,)(''(*-17>FPZdnvz|zvndZPF>71-*('&D>:64322358>?ACGLRZblu}}ulbZRLGCA?>=ZUQOMKKLNPSX^emu~~ume^XSPMLKJd_\YWVVWX[^bgnv~~vngb^[XWVU lhdb`__^_`acfjov}}vojfca`_^ pligeddcdefhkotzztokhfddcrnkigffefghjmqv||vqmjhffeupligeddcdefhkotzztokhfddcqlhdb`__^_`acfjov}}vojfca`_^id_\YWVVWX[^bgnv~~vngb^[XWVU  `ZUQOMKKLNPSX^emu~~ume^XSPMLKJ " UNIEB@>>?ACGLRZblu}}ulbZRLGCA?>=KD>:64322358FPZdnvz|zvndZPF>71-*('&91+&"!$(-5>HS]gotvtog]SH>5-($ 2*# &.7AMXbjpqpjbXMA7.&  ! ,# '1JU^dfd^UJ>2' ????+ 77+JK D?789;=AFLT^hr;987789,-.0372'  '1=KXepx||xpeXK=1'  #.:HUbnvzzvncUH:.$  #.:HUbnvzzvnbUH:.#  !+8ESaltyytlaSE8,!  !+8ES`ltxxtl`SE8+!  *6DR_kswwsk_RD6*  *6DR_kswwsk_RD6*  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)   +7ES`ltxxtl`SE7+    +7ES`ltxxtl`SE7+   ",9FTamuyyumaTF9,"  ",9FTamuyyumaTF9,"  %0?ADGMS\epzzpe\SMGDA?>==>?ADGMS\epzzpe\SMGDA?>JJKLNPTY_foyyof_YTPNLKJJKLNPTY_foyyof_YTPNLKUUVWX[^chpxxphc^[XWVUUVWX[^chpxxphc^[XWV^^_`acgkpwwpkgca`_^^_`acgkpwwpkgca`_ccddfhkou{{uokhfedccdefhkou{{uokhfedeeffhjmqw}}wqmjhgfeefghjmqw}}wqmjhgfccddfhkou{{uokhfedccdefhkou{{uokhfed^^_`acgkpwwpkgca`_^^_`acgkpwwpkgca`_UUVWX[^chpxxphc^[XWVUUVWX[^chpxxphc^[XWVJJKLNPTY_foyyof_YTPNLKJJKLNPTY_foyyof_YTPNLK==>?ADGMS\epzzpe\SMGDA?>==>?ADGMS\epzzpe\SMGDA?>112358EMV_flppmf]QE8+! !"#$'*/5HS\dikjd\QD8,!  '/9CNXagihc[PD8,!  "*4?KU^ehgbZPD8,!  '1IT^dggbZPD8,!  #,6ALW`fihc[PD8,! #*2DKS[dlruuqj`TG:-" =>@BEINU\dlsxzyumbVH:-" JKMOQUZ`gnuz~~xpdWI;." UVWY\`dipv|{rfXJ;." ^_`behlqw}~tgYJ<.# cdegimqv{uhZK?@CFJPW^gov{}|wodWI;." 12347:?EMU^gouxxtmbVH:." &'(*,05JV`gjie]RF9-"  %0JU^dfd^UJ>2' #  (4@LW_ege_WL@4( %   *5AMXafhfaXMA5*   ! (   $-8DP[cikic[PD8-$  ! ,$!(2IS^hpuwuph^SI>6.)$!B;51-+*))*,/39?HQ\fow|}|wof\QH?93/,*)(MFA=:86679IS^hpuwuph^SI>6.)$!4,%!'/8BMXckprpkcXMB8/'!.&!(2JU^dfd^UJ>2'   (3?KV_ege_VK?3( $   (4@LW_ege_WL@4( $    *5AMXafhfaXMA5*  " $-8DP[cikic[PD8-$ & '1HS]gotvtog]SH>5-($ % <60-*(''(*-17>FPZdnvz|zvndZPF>71-*('&% F@;75322358>?ACGLRZblu}}ulbZRLGCA?>=WROMLKKLNPSX^emu~~ume^XSPMLKJa]ZXWVVWX[^bgnv~~vngb^[XWVUieca__`acfjov}}vojfca`_^njgfddcdefhkotzztokhfddcoligffefghjmqv||vqmjhffenjgfddcdefhkotzztokhfddcieca__`acfjov}}vojfca`_^a]ZXVVWX[^bgnv~~vngb^[XWVUVROMLKKLNPSX^emu~~ume^XSPMLKJJFC@?>>?ACGLRZblu}}ulbZRLGCA?>=?:74322358FPZdnvz|zvndZPF>71-*('&&" !$(-5>HS]gotvtog]SH>5-($  &.7AMXbjpqpjbXMA7.&  '1JU^dfd^UJ>2'  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  (5CQ^jrwwrj^QC5(  )6CR_kswwsk_RC6)  )6CR_kswwsk_RC6)   +7ES`ltxxtl`SE7+    +7ES`ltxxtl`SE7+   ",9FTamuyyumaTF9,"  ",9FTamuyyumaTF9,"  %0JWblsvuph]QD9.%!)3>JWblsvuph]QD9.% %/:GT`jqtsof[OB6+! %/:GT`jqtsof[OB6+!  !,8DR^hpssneZM@3(  !,8DR^hpssneZM@3(   *6CQ]hpssnfZM@3'   *6CQ]hpssnfZM@3'  )6CQ]hptsof[N@3'  )6CQ]hptsof[N@3'  )5CP]hpttog[N@3'  )5CP]hpttog[N@3'  *6CQ^jrvuqh]PB5(  *6CQ^jrvuqh]PB5(   +7DR_kswwrj^QC6*   +7DR_kswwrj^QC6*  ",9FTaltxxtl`SE8,!  ",9FTaltxxtl`SE8,!  %0?ADGMS\epzzpe[SMGDA?>==>?ADGMS\epzzpe[SMGDA?>JJKLNPTY_foyyof_XTPNLKJJKLNPTY_foyyof_XTPNLKUUVWX[^chpxxphc^[XWVUUVWX[^chpxxphc^[XWV^^_`acgkpwwpkgca`_^^_`acgkpwwpkgca`_ccddfhkou{{uokhfedccdefhkou{{uokhfedeeffhjmqw}}wqmjhgfeefghjmqw}}wqmjhgfccddfhkou{{uokhfedccdefhkou{{uokhfed^^_`acgkpwwpkgca`_^^_`acgkpwwpkgca`_UUVWX[^chpxxphc^[XWVUUVWX[^chpxxphc^[XWVJJKLNPTY_foyyof_YTPNLKJJKLNPTY_foyyof_YTPNLK==>?ADGMS\epzzpe\SMGDA?>==>?ADGMS\epzzpe\SMGDA?>112358JV`gjie]RF9-"  (3?LWahkje]RF9-"  ",6BNYcilkf]RF9-" '0:FQ\eknlg^SF9-"  &-6@KV`inpnh_TG:-" !$(-4FOXbkrvvslbUH:." 5678;>CIPYbjrx{zvncWI;." CDEFHLPU\dlsz~yqeXJ;.# QRTVY]bhov|}sgYJBHOW`hpvyxumcVI;.# ()*+.26=DMW`ipturkaUH;.# !#',3;EOZckprpjaUH;.#  %,5?JU_hnpni`UH;.# &/:EQ\elomh`UH;.#  "+6BNZdjnmh`UH;/#  (4@LXcjmmh`UI;/#  '3?LXbjnmiaVI1%  $-9ER^horqldXK>1%  '11%  &-7AMYdmsvtoeZL>1%  #'-4=HS^hqvxvpfZM?1% &'(*-16=FOZdnvz{yrh[M?2% 12357;@GOXbkt{{ti\N?2& =>?ACGKQYajsz~vk]O@2& JKLMPSW]cks{xl^O@2& UVXZ]afls{zn_PA3& ^_acfintz|o`QA3& cdfhjnrx~|o`QA3& efhilptz|o`QA3& cdfhjnrx~|o`PA3& ^_aceinszzn_PA2& UVXZ]aflryxl^O@2% JKMORV\biqy~vj]N?1% =>?@CFJPW_hpw}{sh[M>1% 12347:?EMU^hpwz{wpfYK=0$ &'(*,05;CLV`iquvtmdWJJU^dfd^UJ>2'   '2>JU^dfd^UJ>2'   '2>JU^dfd^UJ>2'   (3?KV_ege_VK?3(   )4@LW`ege`WL@4)   ",7BNYbgigbYNB7,"   &/:EQ\djljd\QE:/&  #+4?JU_hmomh_UJ?4+#'" $*1:DOZdlqsqldZOD:1*$ 5/*'$#""#%(,29AKU_iquwuqi_UKA92,(%#"!>941/.--.0362'  '1=KXepx||xpeXK=1' $,6BO\hs{{si\OB6,$$,6BO\hs{{sh\OB6,$ $*2;987789;=AFMU^hr||rh^UMFA=;98DDEFGJMQW^gpyzpg_XRMJGFEDDEFGJMQW^gpyypg^WQMJGFEOOPPRTW[`fnv~wnga[WTRQPOOPPRTW[`fnv~~vnf`[WTRPPYYZ[]`chmsz{tnhd`]\ZZYYZ[]`chmszzsmhc`][ZYaabcdfimrw}}wrmjgecbaabcdfimqw||wqmifdcbaddeghknqv{{vrnkigfeddeghknqvzzvqnkhgeeddefgilnrvy}~zvrolihfeddefgiknruy}}yurnkigfeddaabcegiknqtvxyyxvtqnligedbbaabcefiknqsvwxxwvsqnkifecbbaaYYZ[\]_acegijkkjigeca_]\[ZYYZ[\]_`ceghjjhgec`_]\[ZYYOPQRSTVWYZ[[ZYXVTSRQPPOOPQRSTVWYZ[[ZYWVTSRQPOODEFGHIJKLLKJIHGGFEEDDEFGHIJKLLKJIHGFFEEDD789::;<<;:99887 789::;<<;::98877,-./.-,-./.-, ! "! "!,?? ???? "-9EPZbeeaZPD8,!  "-8EPZaeeaZPD8,!  "-8DPZaeeaZPD8,!  #-9EPZbeeaZOD8,!  $/:FQ[bfeaZOD7,!  '1HS\dikjd\QD8,! !"#$'*/5EMV_flppmf]QE8+! 78:3) abccdefggfd`[TKB8.$ YZ[\]\[YUPIB91(  OPQPOLID>81)! DEDCB@=94.("  76430-)$  ,+*)'%"  !           RQ)(+Drop-Shadow#2     N`d+`ss+`ckr;964 2 /-*(&#!"$&)+-0 2 479;};964 2 /-*(&#!"$&)+-0 2 479;};964 2 /-*(&#!"$&)+-0 2 479;}}97*<5 ,?Th2 .AUhx0  0ATes{~|. "0ARbmtvqi^+ #1BR`kqrmf[PG) $2BR`kqtqjbYQID' %3BQ_kswvsmf`ZURP% $1?N\hqwyxuqlhdb`_^" "-:GT`iptutsomkigfee" '2>IS[afhiigfeccbaa``   )2:BIOSVWXWWUUTSRRQ %,28<@BCDDCBBAA@@?> #'*,./00/.-,              / "%'),.0 3 57:<6/ "%'),.0 3 57:<6/ "%'),.0 3 57:<6t  "',05'  &Af  &=Ufj`O<,#"*7Kg  *C]r}~vkaZWVWZ^eq .Gby|rjda__`cjv/G^pxvk\NA930..18CVn0EYfjcUB0! "3Jh  2EWce]N<) "7Qp  "3GXce^P>-  /Ea  $6HYeidYJ:-" )6H^x'8L^krqj_SH?:65568=<=>@CHOWblwzqfZPG@;74200SIA;53110148>EOZfqz|uj^SIA:620//./137=CLWcmv}zqg]RIB;742112>841//025:AJT`ku|{sh^SJC=97554567:=BIQZeox{sj`XPJFCA@??@A@=;;<>ADJQYcmvxof^VQLIGGFFGHIKNRW^emv~xqjd^ZWUTSSTNNOPRUX]dks{~wpje`][YYXYY[\^aeiotz{vqlifdcbaab^_`bdgkpv{zupligfeddegiknquy|~zwspmjhgfeefhiknrux|~}{wtpmjhfeddccdfgikmprstutsqoligdca`_^]]\`abcdfhjlmmljhfda_^\[ZYYXXWXYZ[\]^^]\[YWVTSRPONNMLQRSSTUVVUTRQONMLJIIHHGFEFGHGFEDCBA@?>=<<;:9>?>??@??>=<;:98766543232210/..-,,+*),+*('&&%$#"!      (8 ! "#%&(*+-/02 3 5 78:<=@?! "#%&(*+-/02 3 5 78:<=@?! "#%&(*+-/02 3 5 78:<=@?(#)/48<@EJNRW]bd^N7 "^XTQRXev}kS=-$#0E[hbN3   1LadU;" %>VedS:" *9Og{ziXJCBCGLR\ixzbF+ ݪĺ~l_VQMJIJOYfrwq`H0ʲrP5!  +@Tbe\J4! ˴uR5 )=Qae^N:' Ծ`C, ):L]ileTA,ζjWJD@?@BEINT^ius`J4" ˸unigeddehlrzwdO9' ɳo^RID@=;::;=BJU`krsm`O<+ տlR=-! *8GVbgf]O?. ԾhM5#  #1AQ]de]QC2$©pU<)  &5DS_ef`UF7( Ȳ}dM8*"+6CQ]glleZL<,  Ͻ{fUG=62//./0247;AIR]gqwyvnaRB2$  Ʒwja[WTSSTUVWZ^bipwwiYH7)  úwpkhfeddeegikotzzl]L<-  覧unhc`^][[ZZ[]`dinu{wk]N?0# pruyyoe\UOKHFDCCBBCDFJNT[ckrwywri]OA3& GIKOU]fpywmbVLD>9531001236:@FNWaiossog]PC6) 1359>EMXbmu|~zsi_TKB;630/.-../136;@GOXaiorroh^SF8,! 358;AGPYdmv}~yqh_VNHB?<;:9::;<>ACHMSZaiptutqi_TG;.# BDFJOU\dmu}}unf_ZURONMMNOPRTWZ^cimrvxxuph^SG:/$ UWY[_djpv}ysnifb`_^]]^_`abegjmpsvwwuqkcYNC8-# cdegilpty}{wspmjigffeefghiklnoppnkf`YPF<2(  efggikmprtwyzzywuroljgfdcbbaa`_`aba`^ZVPJB:2*# \\]^^_`bcdeffedb`^\[YXWUTSSRQPQPPONMJGC?94.'! LKKLMNONMMKJIHFFECCBA@?>=<;:87! 998898765443221100/.-,+* )(('&%$##""!          _h      76h      76h      76n7 Empty Layer#8     Vttuu vx7xGy6[^Zk W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W*WiWW WWWWWWWWWW ==<:986 5 4 20/.-**i  ==<:986 5 4 20/.-**i $$$$$#$̮̮#̮̮#̮̮#̮̮̮̮3ffLf3ffLTTLffLffLff#3ffLf3ffLTTLffLffLff$3ffLff3ffLTTLffLffLffLf#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTLffLffLffLfLW=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  WWW WW WW WW WW WWWWWWWWWWW WW WW WW WW WW WW WW WW WWWWWWWWWW6W<W=W=W<W<WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:W:W:W:W:WWWWWWWWWWWWW               6<==<<:::::               6<==<<::::: $$$$$$$$$$$$$$WWWWWWWWW0WW/WW.WW-W W,W W+W W*W W)W W(WW'WW%WW%WW$WW#WW"WW WWWWWWWWWWWWWWWWWW\WWWWWWWWWWWW WWW WW W ̮̮̮̮#̮̮̮#̮̮#̮̮̙$̮̮̙$̮̮̙$̮̮̙$̮̮̙̙#̮̮̙̙#̮̮̙̙f#̮̮̙̙f#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̮̮̮̮̮̮̮̮̮0/.- , + * ) ('%%$#" \   3ffLff3ffLTLffLffLffLfL#3ffLff3ffLTLffLfLffL3L#3ffLff3ffLTLffLfLffL3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3ff$3ffLff3ffLTLffLfLff3f33#3ffLff3ffLTLffLfLf33f33#3ffLff3ffLTLffLfLf3f33$3ffLff3ffLTLffLfLf3f3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTTLfLffLf3f3L$3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f333ffLff3ffLTTLfLffLff3f33ffLff3ffLTTLfLffLff3ff3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLffLffLff30/.- , + * ) ('%%$#" \   5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWWWWWWWWWWWWW:W:W:W:W:W:WW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W::::::)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C}::::::)jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>WW W WW W WW WWW WWWWWWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR*     ;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?    ;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m- I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@Empty Layer#5     UWsմDiUz}y"Պ W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W*WiWW WWWWWWWWWW ==<:986 5 4 20/.-**i  ==<:986 5 4 20/.-**i $$$$$#$̮̮#̮̮#̮̮#̮̮̮̮3ffLf3ffLTTLffLffLff#3ffLf3ffLTTLffLffLff$3ffLff3ffLTTLffLffLffLf#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTLffLffLffLfL$$$$$W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  WWW WW WW WW WW WWWWWWWWWWW WW WW WW WW WW WW WW WW WWWWWWWWWW6W<W=W=W<W<WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:W:W:W:W:WWWWWWWWWWWWW               6<==<<:::::               6<==<<::::: $$$$$$$$$$$$$$WWWWWWWWW0WW/WW.WW-W W,W W+W W*W W)W W(WW'WW%WW%WW$WW#WW"WW WWWWWWWWWWWWWWWWWW\WWWWWWWWWWWW WWW WW W ̮̮̮̮#̮̮̮#̮̮#̮̮̙$̮̮̙$̮̮̙$̮̮̙$̮̮̙̙#̮̮̙̙#̮̮̙̙f#̮̮̙̙f#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̮̮̮̮̮̮̮̮̮0/.- , + * ) ('%%$#" \   3ffLff3ffLTLffLffLffLfL#3ffLff3ffLTLffLfLffL3L#3ffLff3ffLTLffLfLffL3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3ff$3ffLff3ffLTLffLfLff3f33#3ffLff3ffLTLffLfLf33f33#3ffLff3ffLTLffLfLf3f33$3ffLff3ffLTLffLfLf3f3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTTLfLffLf3f3L$3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f333ffLff3ffLTTLfLffLff3f33ffLff3ffLTTLfLffLff3ff3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLffLffLff30/.- , + * ) ('%%$#" \   $$$$$$$$$$$$$$%%%%%%% 5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWWWWWWWWWWWWW:W:W:W:W:W:WW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W::::::)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C}::::::)jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>WW W WW W WW WWW WWWWWWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR*     ;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?    ;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m- I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@Empty Layer#3     Av֒c-۟tA W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W*WiWW WWWWWWWWWW ==<:986 5 4 20/.-**i  ==<:986 5 4 20/.-**i $$$$$#$̮̮#̮̮#̮̮#̮̮̮̮3ffLf3ffLTTLffLffLff#3ffLf3ffLTTLffLffLff$3ffLff3ffLTTLffLffLffLf#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTTLffLffLffLL#3ffLff3ffLTLffLffLffLfL$$$$$W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  WWW WW WW WW WW WWWWWWWWWWW WW WW WW WW WW WW WW WW WWWWWWWWWW6W<W=W=W<W<WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:W:W:W:W:WWWWWWWWWWWWW               6<==<<:::::               6<==<<::::: $$$$$$$$$$$$$$WWWWWWWWW0WW/WW.WW-W W,W W+W W*W W)W W(WW'WW%WW%WW$WW#WW"WW WWWWWWWWWWWWWWWWWW\WWWWWWWWWWWW WWW WW W ̮̮̮̮#̮̮̮#̮̮#̮̮̙$̮̮̙$̮̮̙$̮̮̙$̮̮̙̙#̮̮̙̙#̮̮̙̙f#̮̮̙̙f#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙#̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̙̮̮̮̙̮̮̮̮̮̮̮̮̮0/.- , + * ) ('%%$#" \   3ffLff3ffLTLffLffLffLfL#3ffLff3ffLTLffLfLffL3L#3ffLff3ffLTLffLfLffL3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3f3f#3ffLff3ffLTLffLfLff3ff$3ffLff3ffLTLffLfLff3f33#3ffLff3ffLTLffLfLf33f33#3ffLff3ffLTLffLfLf3f33$3ffLff3ffLTLffLfLf3f3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTLffLffLf3f3L3#3ffLff3ffLTTLfLffLf3f3L$3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f3L3ffLff3ffLTTLfLffLf3f333ffLff3ffLTTLfLffLff3f33ffLff3ffLTTLfLffLff3ff3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLfLffLff3f3ffLff3ffLTTLffLffLff30/.- , + * ) ('%%$#" \   $$$$$$$$$$$$$$%%%%%%% 5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWWWWWWWWWWWWW:W:W:W:W:W:WW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W::::::)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C}::::::)jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>WW W WW W WW WWW WWWWWWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR*     ;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?    ;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m- I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@Empty Layer#2     ;))  p    !&-() W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W)W)W(W&W$W#W!W W W"W#W%W ==<:986 5 4 20/.-*))(&$#!  "#% ==<:986 5 4 20/.-*))(&$#!  "#%W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5  &W'W)W*W+W,W.W/W0W 2W 4W 4W 6W7W8W9W9W:W:W:W;W;W;W;WW &')*+,./0 2 4 4 67899:::;;;;<<<====> &')*+,./0 2 4 4 67899:::;;;;<<<====>W=W<W;W:W9W8W7W6 W5 W4 W3 W2 W1W0W/W.W-W,W+W*W)W(W'W%W%W$W#W"W W W!W"W#W$W%W&W'W(W)W*W+W,W-W.W/W1W 1W 2W =<;:9876 5 4 3 2 10/.-,+*)('%%$#"  !"#$%&'()*+,-./1 1 2 =<;:9876 5 4 3 2 10/.-,+*)('%%$#"  !"#$%&'()*+,-./1 1 2 5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W$W%W'W(WH W "WM"W,WW 85 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(j  "q", R5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$##$%'(/ "", O;Z8&8O6ZWW)WC%W%5W'WWV:WWVW&WWW<IW*W W W*WWWW*WW*W+WW4W+WWWEW*WWRW*WWW+W)WW6W*WW.W+WEWW4PW+WWLW+WW VW+WGWWJW+WW'W,W&WWBW+WPWW@TW*WWPW+W(WW /W,WPWWQW+WW+W,W2WW$HW+WWWLW,W&WW*UW+WWW-WWW 1W-WQWW5TW,WNW@SW-WTWW TVW/WM!NW1W %W3WJ+PW4W 7PW5WIW7W MVW8W4W;W.W}W)c67O$'V&Xk* *%*>+M+$f*y*+<P*C+eLv+p++h#m+:,9'a+v_|*v+;E,v-x+@,J6k+p,8 =}+(- I-wN{,s^{-||/r 2s173m@v4Qv5 k7q8L;C})jlG'&=7* "*I*y++G;**-+u0*++++E+r,oL+* +s,Y+|,i+53,ny+N-?"-,0*-/;b1l3}4&57%8+;}[55-4^3| 0 .2 -" ,L*(X'$i#J"u {E!d" #%'\)9*O,. x/ _1 [3F46 7b:(;}<>3W 4W 6W6W7W8W9W;WWWW;WM;WB:WJ(:WR;WK:WC9WUM;W,:WO3;W:WN$:WF;W9WU-9WS=:W+ 9W38WO(W5WRL8WI%;WNW=WHWWURO?W1WVURR* 3 4 66789;<<=>;s;b :n;:y ;n*:d%9~r ;B:uL;-:s6:g;9}C9zZ:?9L8t;5yp+8l8;s=i}yu^ 1~yy?3 4 66789;<<=>;;?:t:;S:I9;:;Y:i:<;699:{98s5U8m;==1{A:y7h3 X0 .W *^'0$%! g",&)-,/ 3w679<W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W>,<W@:WT: 6W- 3 WS91 WU2-W+*WB(WV$WG"!WJ%WSA;+ WV*%%!W>!' WH&-WVVO2==<;:9876 5 4 3 200/.-+**)(&). 2 5:>A<^#:|W6B3 {T1 }J -@ *b(+$i2!m6zaV@>66!\1 ' j7 -uJ==<;:9876 5 4 3 200/.-+**)(&). 2 5:>*<D:53 1 -~*(U$b!j} zjj9 !_991' m- I;8!5 1 .s+/)%X"-"E%'? * )T $Jz# 9*W 2OW W +QWW W WW W @WW W *PWWW *LWWW LUWWW W WW #W WW *WWW w , #_ >w =o *o~ -  3  > Z| Qw &d| O% /a$Z" jwtzb55,-x/ "8 f__6*B^=995,Mw\    { W E { x R Y  d  z 9  L (%\$;"@:hhVX\ "n Ȼk*xooh,1++ 5]2>16 0B .. ,+(T'&%*$=#D H[1!*"b% ;&5(E) a"K x*){{i.=VKGp:!! ,nڍ(1V WSA'W4WSHFF>0W, (WH:66($WHWN611 WN! WVJ:6&+W6/HE: z`:4zjgg\0B!(jWPP; $j sPHHt% ! mUO8+Q/keU' q4ʵ90A221#(Щs$?H ! զo*+500//ŦK :K4+֟w (X2' khS^ " ⿿,-rrX1D,, ,WV( (WD WQ;WL!!WVU744# &WVUKII5 -WA 2':,< (d&  xX p11~QLL4&}ollN-` 2::,u (L 55``8f$&%-! 2q5 :F75ccS).֪k %"N( uttc4ϡE%644+(ˠI1O 6Q247|@@?= Curl Layer     `*~?=*?=*@U=VQ<TUN;RVSM:PVUQL9OUVTOL8NTVURNK7MSVVTQNK6MRUVUSPMK5LQUVVTROMK4LPTVVUSQNLK3LOSVVURPNLK2LORUVVUTROMLK1KNRTVVUSQOMLK0KNQTVVUTRPNMKK/KNQSUVVUSQPNLKK.KMPSUVVUTSQONLKK-KMPRTVVUSRPOMLKK,KMORTUVVUTSQPNMLKK+KMOQSUVVUTRQONMLKK*KLOQSUVVUTSRPONMLK*KLNPRTUVVUTSQPOMLLK)KLNPRTUVVUTSRQPNMLKK(KLNPRSUVVUTSRPONMLKK'KLMOQSTVVUTRQPONMLKK&KLMOQSTUVVUTSRQPONMLKK%KLMOQRTUVVUTSRQONMMLKK$KMOPRSUVVUTSRQPO)KMNPRSTUVVUTS-KMNPQSTUVV1KLNPQSTUVV3KLNOQRSUUVV3KLNOQRSTU5KLMOPRST6KLMOPQ8KLMNP9KLMN:KLM;KL<KL<K@=<;:9876543«2ï1IJ0Ŵ/ƶ.Ǹ-Ǻ,ȼ+Ƚ*Ⱦ*ɿ)('·&ø%ú$Ļ)ļ-Ž0Ž2ƾ3ƿ5689:»;<<@=<;:9876543210//.-,+**)('&%*.1345689;;==@==<;:9876 5 4 3 2 10/.-,++*)('&%## 򠨰# # ~#ir{#]fow$GQZclt}%FOW_gnv})"+4FMT\cipw. %-5=DKSZagn/ $,4;CJQX_e0 #+2:AHOV]1 "*19@GMT2 !)07>EL3 !(/6=D4  '.5<5 &-46%,7$9:;<=?=Curl Layer copy     x5_?=5s?=5@U=VQ<TUN;RVSM:PVUQL9OUVTOL8NTVURNK7MSVVTQNK6MRUVUSPMK5LQUVVTROMK4LPTVVUSQNLK3LOSVVURPNLK2LORUVVUTROMLK1KNRTVVUSQOMLK0KNQTVVUTRPNMKK/KNQSUVVUSQPNLKK.KMPSUVVUTSQONLKK-KMPRTVVUSRPOMLKK,KMORTUVVUTSQPNMLKK+KMOQSUVVUTRQONMLKK*KLOQSUVVUTSRPONMLK*KLNPRTUVVUTSQPOMLLK)KLNPRTUVVUTSRQPNMLKK(KLNPRSUVVUTSRPONMLKK'KLMOQSTVVUTRQPONMLKK&KLMOQSTUVVUTSRQPONMLKK%KLMOQRTUVVUTSRQONMMLKK$KMOPRSUVVUTSRQPO)KMNPRSTUVVUTS-KMNPQSTUVV1KLNPQSTUVV3KLNOQRSUUVV3KLNOQRSTU5KLMOPRST6KLMOPQ8KLMNP9KLMN:KLM;KL<KL<K@=<;:9876543«2ï1IJ0Ŵ/ƶ.Ǹ-Ǻ,ȼ+Ƚ*Ⱦ*ɿ)('·&ø%ú$Ļ)ļ-Ž0Ž2ƾ3ƿ5689:»;<<@=<;:9876543210//.-,+**)('&%*.1345689;;==@==<;:9876 5 4 3 2 10/.-,++*)('&%## 򠨰# # ~#ir{#]fow$GQZclt}%FOW_gnv})"+4FMT\cipw. %-5=DKSZagn/ $,4;CJQX_e0 #+2:AHOV]1 "*19@GMT2 !)07>EL3 !(/6=D4  '.5<5 &-46%,7$9:;<=Empty Layer#10     ]@4@Pfg@CCD>GLLLR<WWW]\bb.bZK"K"K"K"K"K"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""KW @KW#%')+-/1 3 5 79;=!K!K!K!K!K!KWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK!!!!!!!!!!!! =;97 5 3 20.,*(&$"!     "KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""WWWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""WWWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"K"K"K"K"K"K@"""""""""""""""""""""""""""""""""""""""""""""""""""""""@"""""""""""""""""""""""""""""""""""""""""""""""""""""""@"""""""""""""""""""""""""""""""""""""""""""""""""""""""@ @WK@ @@ @@ @ @WK@ @@ @@ @WKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK!K!K!K!K!K!K^!!!!!!^!!!!!!^!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^@@Empty Layer#11      wggh#k5kaknt#t3tCyCScK"K"K"K"K"K"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""KW @KW#%')+-/1 3 5 79;=!K!K!K!K!K!KWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK!!!!!!!!!!!! =;97 5 3 20.,*(&$"!     "KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""WWWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""WWWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"KW"K"K"K"K"K"K@"""""""""""""""""""""""""""""""""""""""""""""""""""""""@"""""""""""""""""""""""""""""""""""""""""""""""""""""""@"""""""""""""""""""""""""""""""""""""""""""""""""""""""@ @WK@ @@ @@ @ @WK@ @@ @@ @WKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWKWK!K!K!K!K!K!K^!!!!!!^!!!!!!^!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^@@Empty Layer#1     *A] qT W=W=W<W:W9W8W6 W5 W4 W2W0W/W.W-W*W)W)W(W&W$W#W!W W W"W#W%W ==<:986 5 4 20/.-*))(&$#!  "#% ==<:986 5 4 20/.-*))(&$#!  "#%976 4 3 2 0.-++*(&%$"! !"$%&()*+-/0 2 2 4 6W=W=W=W<W=W=W<W<W<W;W;W:W:W:W9W9W9W9W8W8W8W7W7W7W6W6W5 W5 W===<==<<<;;:::9999888777665 5 ===<==<<<;;:::9999888777665 5 =<==<<<;;;;:::9988877766665 5 5 4 4 3 3 3 2 2 2 1 1 1 1 000//... &W'W)W*W+W,W.W/W0W 2W 4W 4W 6W7W8W9W9W:W:W:W;W;W;W;WW &')*+,./0 2 4 4 67899:::;;;;<<<====> &')*+,./0 2 4 4 67899:::;;;;<<<====>799:====== ~W=W<W;W:W9W8W7W6 W5 W4 W3 W2 W1W0W/W.W-W,W+W*W)W(W'W%W%W$W#W"W W W!W"W#W$W%W&W'W(W)W*W+W,W-W.W/W1W 1W 2W =<;:9876 5 4 3 2 10/.-,+*)('%%$#"  !"#$%&'()*+,-./1 1 2 =<;:9876 5 4 3 2 10/.-,+*)('%%$#"  !"#$%&'()*+,-./1 1 2 @==<<:9876 5 4 3 2 10/.,+**)'&%%$"! !"#$%&'()*+,-/01 1 2 4 5 6779:;<5 W4 W4 W4 W4 W3 W3 W3 W2 W2 W2 W1 W1 W0W0W0W/W/W/W/W.W.W.W-W-W-W,W,W+W+W+W*W*W*W)W)W)W)W(W(W(W'W'W'W&W&W%W%W%W$W$W$W$W#W#W#W"W"W"W!W!W W W W5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$###"""!!   5 4 4 4 4 3 3 3 2 2 2 1 1 000////...---,,+++***))))((('''&&%%%$$$$###"""!!   ---,,,,+++**)))(((''''&&&%%$$$###"""!!!!      !!!""""###$$%%%&WW:W6W3W /W*W:63 /*:63 /*3W 4W 6W6W7W8W9W;WWWW8W5W 1W ,W)W%W"WW!W$W(W-W0 W4W9W3 4 66789;<<=>85 1 ,)%"!$(-0 493 4 66789;<<=>85 1 ,)%"!$(-0 49<> 863 .*'# #',/ 27W=W=W<W;W:W9W8W7W6 W5 W4 W3 W2W0W0W/W.W-W+W*W*W)W(W&W)W. W2 W5W:W==<;:9876 5 4 3 200/.-+**)(&). 2 5:==<;:9876 5 4 3 200/.-+**)(&). 2 5:==<;:976 5 5 4 2 100/-,+**('&%$#"!  !"""! !$(-0 49WWWW W W W!W!W!W"WWW#W&W)W, W1 W4W7W #   !!!"#&), 1 47 #   !!!"#&), 1 47 #&&''''((())***+++,+&" "&), 37'W#WW W#W'W*W/ W2W6W;W ~'# #'*/ 26; ~'# #'*/ 26; ~74 0+(% "%). 1 5: ;@@ Empty Layer     + d kŸârW W/W)W%W!W!W$W'W*W,W/W 1W 3W 5W7W9W;WW:WVW:W:W:W HW:W"W:WW:W W:WW9W0W8WMW7WFW6WSW5W1W4W BW2W 'UW0W >W/W*W.WNW*W 8W)W*UW%W!KW$W?W!W 3WW (PWW$DWW).SWW-"GWJW W2,PWW61TWTWW+W,WW:W9 W4W2 W3 W4 W5 W6W8W9W("_y r ocF,"F%H(+G- r/ 1 394779{8192:[::U:j:2:::&9G8'q7g6 z5I4 a2 :}0 [/>.'s*R)>}%1n$!]!L $ # (OcEA:4ZnMLD)-")NR75/3]: 8U* 7̰8 67<4 tf-҄mqJ%<" ©ﻻzF>E 'O‡q:g֗QXB Pkh\4*  3](ƧS4h;P15٣#Tߟ˓ZSW()m|xtA=G" #  1$ ],W,W,W&W!WWF WWJ W WS" WWTD6( WWD WW/ WWVE& WWOWVD$ #W5 &WF'WVD$ )WVL/-W/ .WM' 0WA 2W7 1WTE)3WA5W=5WO;6WL)6WTE)8W=7WN, 7W=9WC"8WT48WE%7WV67WG'7W83WP03W@!2WP1/WNHNA#.WV7 +WOEGF( +W;'WN/$WD53/ WVUWN0WOLVA#WD?D3WI5./"!W:"% WP3&& (WH3--/WC5605%WWW6WWW0 W1 W2 W4 W5,,,&!g m  {3 |eP; e$ E e8 u+d6#N&g)'d5)pE-E.r: 0`) 2R 1|e<3`*5Z%5tW) 6p= 6{f=8Y(7sA7[*9c38|L8f67P!7i: 7S%3vG 3_12vI/sjs`3.~Q$ +ueig: +W*'rE $dNKF- ~}sGup`3d]eLlNEE2 !V2),% vK890(jKBB.#/cNPH.)*57- 60 1 2 4 5,,,&!- 7  c ěs F  n Ui!#&Q'h!)ڈ--.q 0O 26 1v+3S5I5Q6x6x-8N7߀ 7R9c898j7A7r7H32 3`26/d .G +r +R'߇0$ĘW 3d õŔ<Ҙb!aQV3% lo]#+1(ϒZ2E3/ZQS*5kW60 1 2 4 5͙z8/3 S.y!(nF#"0%"p!&%(: ,/b 1{'3M 6Y8V:H -vYeO004:W<W=W@:<=@:<=@WW=WWW W 1'$).1 5 8;>  1'$).1 5 8;> +!%*/4 7;> @W=W;W8W6 W4 W2W0W.W,W+W)W'W&W%W#W"W!W W!W"W#W$W%W&W&W'W(W)W)W*W+W+W,W,W-W-W.W.W.W/W/W/W@=;86 4 20.,+)'&%#"! !"#$%&&'())*++,,--...///@=;86 4 20.,+)'&%#"! !"#$%&&'())*++,,--...///@=:7 5 20.,*(&%#! !"#%&'()*+,,-.//01 1 2 2 3 3 4 4 4 5 5 5 5 66666*W+W+W+W+W+W+W*W*W*W*W)W)W)W(W(W'W'W&W&W%W$W$W#W"W!W!W WW W!W"W#W$W&W'W(W*W+W,W.W0W1 W3 W5 W7W9W;W=W*++++++****)))((''&&%$$#"!!  !"#$&'(*+,.01 3 5 79;=*++++++****)))((''&&%$$#"!!  !"#$&'(*+,.01 3 5 79;= 1 1 1 1 1 1 1 1 1 1 1 1 10000///..--,,+**)(''&%$#"! !"$%&(*+-/1 3 5 7:< @WW=Wy'9p$5h!1`.Y*R&K#D=6'/ "(KKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLNPRTUVVVVUTSQPOMLLKWWWKLMOPRST7Q4L1H.D+?|(;t%7l#3d 0],U(O%H!A0:*3&-KKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLNPRTUVVVVUTSRQPNMLKKWWKLMOPQ>\;W8R5N2I/E,A~)=w'9p$5h!1`.Y*S'L8C3=.8)1KKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLNPRSUVVVVVUTSRPONMLKKWKLMNPBa?]K9E5?KKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLMOQSTUVVVVVUTSRQPONMLKKWWWFhCc@_=Z:V7R4M2I/E-B*>y':r%7kQbL[FTAO[;W8S5O3K0G.C+?|([;W8S6O,x*r(m&g|$cw"]pKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLNOQRSUUVV,@}(\y'9p$5h!1`.Y*R&K#D=6'/ !( !JlGhDdA`?\\;W8R5N2I/E,A~)=w'9p$5h!1`.Y*S'L8C3=.8(0 ")PuMqJmGiEeBb7531/~-yKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLMNPBa?]K9E5?V~SzPvMrKnHj<:8642KKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLMJmFhCc@_=Z:V7R4M2I/E-B*>y':r%7kQbL[FTAO<:864KKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKLMrJmGhDdA_>[;W8S5O3K0G.C+?|(KKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWU}RxOtLoIkFgCc@_>[;W8S6O,x*r(m&g|$cw"]pWWWWWJHFDB@KKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWU}RyOtLpIlFgCcA_>\<:864WWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~SzQwNsA?=;97WWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~S{QwCA?=;9WWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVS{FCA?=;WWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVHFDB@>WWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWJHFDB@WWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKHFDBWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKHFDWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKHFWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKHWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWVVVVVVVVVVVVWWWWWWWVVVVVV~V~V~V~V~V~V~V~VVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWVVVV~V~V~V~V~V~V~V~V~V~V~VVVVVVVV~V~V~V~V~V~U~U~U~U~U~U~V~V~V~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWMq'M&JKoV~U~U~U}U}U}U}U~U~V~V~V~V~V~V~V~V~V~V~U~U}U}U}U}U}T|T|T|T|T|U}U}U}U}U~U~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWW$G$FU}U}T|T|T|T|T|T|U}U}U}Jm6P4M%6k"C '   !7%7lz':rKnRxRyRySzSzSzS{T|T|U}U}U~V~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVVVV~V~V~VVVVWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWVS{SzRyRyRxRxRxRySz@^*=xOtPvQwQwRxRySzSzT{T|T|U}U~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~V~V~V~V~V~V~V~V~V~VVWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWVVRyQxQwPvPvPvPvQwQx-X1BaNsOtOuPvQwRxRySzT{T|U}U~V~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW8S '):UV~U~U~U}U}U}U}U}U~U~V~V~V~VVWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWVV~QwPuOtNsNsNsNsOtOu) 7RLpMqNrOtPuPvRxRySzT|T|U}U~V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW8S9TU}T|T|T|T|T|T|T|U}U}U~V~V~VVWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWVVV~OtNsMqLpLoLoLpMqNr4MJlKnLpMrNsPuQwRxSzS{T|U}U~V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW '(T|T{S{SzSzSzS{T{T|T|U}U~V~V~VVWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWVV~V~NrLpKnJlIlIlJlJmKoEeKoKoJlGhA_8T)=x$F9TGiIkJmLpMrOtPvQxRyS{T|U}U~V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVSzSzRyRyRxRyRySzSzT{T|U}U}V~V~VVWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWVV~U~LoJlHjGhFhFhGhHjIlLpJmIkGhEeCcA`@_?];W#4e A`EfGhIkKnLpNsOuQwRySzT|U}U~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV & 'RxQxQwPvPvPvQwQxRxSzS{T|U}U~V~V~VWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWVV~U}JlHjFgDeDdDdDdEfGhJlHjFgDdA`@^>[=Y.[BaDdEfGiJlLoNrOtQwRySzT|U}U~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV8R7PPvPuOtOtOtOtOtPuQwRxSzS{T|U}U~V~VVWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~V~U}HjEfCcBaA`A`A`CbDeGiEfCcA_>\[[=Y=Y=Z?\A_CcA_>\[@_CcFgIkKnNrPuQxSzT|U}U~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~U~T|T{SzQxPuNsMqKnJmIlIlIlJmKnMqNsPuQxSzT{T|U~V~VVWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U~T|DdA_>[[@_CcFgIlLoNsPvRxSzT|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|S{RyQwOtMrLoJmIkHjHjHjIkJmLoMrOtQwRyS{T|U}V~V~VWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|Cb@^=Z;V9T9T:V[@^=Z;V8R5N3L2J1I1I2J2J3L4M5N5N.C6O7Q9T;W>[A_DdGhJlLpOtQwRyT{T|U~V~VVWWWWWWWVVVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|SzRxPvOtMqKnIlHjGhGhGhHjIlKnMqOtPvRxSzT|U}V~V~VWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|Ba?\\A`EeHjKnNrPuRxSzT|U}U~V~V~VVVVVVVV~V~V~V~V~V~V~V~V~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|SzRxPvNsLpKnIkGiGhFhGhGiIkKnLpNsPvRxSzT|U}V~V~VWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|A`>[;W9T7R7R8S:U[[;V8S7Q6P7R9T;W=Z;V8R5O4L2J2J3K4M6O8R9T;W[?]@^.Y+5N4M4M5N6P9T6O7  )[A_CbDe(;t*>z7Q5N4M4M5N6P !ALpNsFh:.DNsNsOtOtPuPvQwRxSzS{T|T|U}Hk,V&8oOuRyRyRySzSzS{T{T|T|U}U~V~V~V~VVVVV~U~U}z.IlPvPvQwQxRxRySzS{T|T|U}U~V~V~VVVV~V~U}!@NrMqLpKoKoLpMqNrOtPvRxSzT{T|U~V~VVWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|@_=Z:U7R6P6O6P8S;V=Y:V8R6O5N5N6O8R;V=ZA_Dd9T /[[A`+@} [@^A`DdFh/E  ,A~@^IkGh;X"2b #DeEfGhHjJlLoMrOtPvRxSzT{T|U}U~V~V~U~NrLpKnJmJmJmKnLoMqNsPuQxSzT{T|U}V~VVWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|@_=Z:U7Q6P6O6P8S;V"CCcA`?\;W8S6P4M4L4L5N2I@^?]?\>\>[=Z=Z\+T*>zLpKnJlHjFgDdBbA_?]2J7>\@^A`CcEfHjJmLpOtPvRxSzT|U}U}U}U}KoJlHjGhFgFgGhHjJlLoNrOuQwSzT{T|U~V~VWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|@_=Z:U7Q6O5O6P8R:V *?{DdBb@^>[;W9T6P5N4M4L5N6P0H[@^BbEfGiJmMqOtPvRyS{T|T|U}T|JmHjFgDeDdDdDeFgHjJmLpNsPvRxSzT|U}V~VVWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|@_=Z:U7Q6O5O6P8R:V!B;WA`A`@^>[[[?\?\>[=Y;W9T7R6P5N4M4M5N6P8R  :V9T6P4M2J1H0G0G0G1H1H2I,B+!A0G1H1H2I2J4M6P !1`GhFhEfCcA`?]=Z;W9T8R7Q6O5N (N6P8R:V=Y?]BbEfIkKoNrPvRxSzT{T|T|GhDdBa@^?]?]@^BaDdGhJlLpOtQwRyT{U}U~V~VWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|@_=Z:U7Q6O6O6P8S;V9 !   *$G&8o4N8R:U;V;W;W;V:U8S7Q6P5N4M4M5N6P8R:U+?|:U7Q5N2J0G/E.D.D/E/F0G1H2J2J3K3K2J2J2I2I2J3K4M-C>\EeDdCbA_?\\=Z=Z>\@^BbEfHjKoNsPvRyS{T|U~V~VWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|@_=Z:U7Q6O6O6P8S:V;W8S5N2J0G/E.D/E0G2I3L5N6P8R8S8S8R7R6P5O5N4M4M5N6P7R9T\[A`DeHjKnNrPvRxSzSzSzDdA`?\=Y\A`DdGiKnMrPuRxS{T|U~V~VWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|@_=Z:U7R6P6O6P8S;V;W8R5N2J0F.D-B-C.D0F1H2J4L5N5O6O6O5N5N5N4M4M5N6P7R9T[[@^[\@_Bb\\;W9T8R8R9T;W>\BaEfIkLpOtQxSzT|U}V~VWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|A_=Z:U7R6P6O6P8S;V;V7R4M1H.D,A~+?|*?{+?|,A~-B/E0G1I2J3L4M5N6O6P8R9T;W=Z?]A`CcEf=Z9T5O2J0F.D.C.D0F2J5N7R;V=Z?\@^A_A`A_@^?]>\>[>[ ;X?\=Z;W9T7R6P5O5O6P7R9T;V\BaFgIlLpOtPvRxRxA`>[;V8S7R7R8S;V>[A`EfIkLpOtQwSzT|U}V~VWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U}T|A_=Z:U8R6P6P7Q8S;V;V7R4M1H.D,A+?|*?{+@|,A.C/E1H2J3L4M5O6P8R9T;V\@^BaDdFgGi=Z:U6O3K0G/E/E0F1I4L7Q:V=Z@^BaCcDdDeDdCcCbBaA`A_?\>[[@^A`CcEfGiIkJm>[:V6P3L1H0G0G1H3L6P9T=Y@^CbEeFhGiGiGiGhFgEfDdDd[[;V8S7Q6P7R9T;W;W8R5N1I/E-C-B-B-C/E1H2J4M6P8R:U;W=Y>\@^A`CcEeGhHjJmKoLp?\;V7Q4M2J1H1I3K5N8S[;W9T7R7Q8R:U[A`DeGiJmLoMqMqMqLpLpKnJmJl(,@~=Z;V8S6P5O5N6P8R;V=Z@_CcEfGi&7l"2b;W8S6P5N5N6P8S[@^BbDdFgGiIkJmLoMqNsOtPvPvQwQw@^\=Z:U7R6O5O6P8S;W?\BbFgJlLpOtPvQw*>z=Z:U7R6P6P7Q:U=Y@_DdHjKoNsQwSzT|U}V~VWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U~T|SzRxPuMrJmGhDd@_>[[[A_CcEfGiIlKnLpMrNsOuPvQwRxRyRyRx@^[BaEfIlLpNsPvQxRyRyRyRxQxQwPvEe 0^;V8R6P5N6O7Q:U=Y@^CcGh@_  /\A_=Z:V8R6P5O6P8S;W?\BbFgJlLpOtPvQw#4g=Z:U7Q6P6P7Q9T=Y@^DdHjKoNsQwSzT|U}V~VWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~U~T|S{RxPvNrKnHjDeA`?]=Z[?]=Z:U7Q5N3L3K3L5N7Q:V=Z@_CcFgIkKnLpNrOtPuPvQxRySzSzSzSzSz@^[=Z>[?]A_=Z;V8R5O4M4L4M6P9T[;V8S6P5N5N5O7R:V=ZA`DdGiKnMqOtPvQxRySzT{T|T|U}U}T|T|S{@_=Y:U7Q6O6O7Q9T\;W8S6P5O5N6P8S;W?\BbFgIlLpNsPvRxSzS{T|U}U}U~U~U~U}T|T{@_=Z:U7Q6P6P7Q9T=Y@^DdHjKoNsPvRyT{T|U}U~U~U}T|T{SzQwCc .DDdA`>\[;W9T7Q6P6O6P8S;W>\BaEfIkLpNsPvQxRx7Q9T6P5N4M5O8R;W?\CbFhJmMrPvRyS{U}U~V~VWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVVV~5M KnIkGiFgEfEfFgFhGiEf-Y ,V@^@^=Z;V8S7R7R9T;V>[A`EeHjLoNsQwRyT{U}U~V~VVVVV~V~U}T|  A`=Z:V8R7Q7Q8R:V=ZA`EeHjLoOtQwSzT|U}V~V~V~V~U~U}T|SzQwOtLo:V &8nBaA`@^>[\BaFgJmMqPuRxS{T|U~V~VWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVVV~U} /] .[KnIlHjGhFgFgFhGiHjIkIkHjGiEfCc@_>[;W9T8S8S:U[;V8S7Q7Q8S;V>[A`EfIkLpOtQwSzT|U}V~V~VV~V~U}T|SzQxOtLpJlCc"3e :5O?\?\>[=Z;W:U8R6P6O5O6P8R:V=Z@_DdGiKnNrPuQwRxRy+?|8S6O4M4L5N7Q:U>[BaEfJlMqPuRxS{T|U~V~VWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVVV~U}Sz)=w %6jKnKnJlHjGhFhFhGhGiHjIlJlIkHjFgDdA`?\\;W9T8R8R9T;W>\A`EfIkLpOtQxSzT|U}V~V~VVV~U~T|S{RxPuMrJmGhCc[\A`DdGiKnMrPuRxS{T|U~V~VWWWWVV~U}T|SzQxOtLpIlFgBa?\[;W8S6P5N5N5N5N6P7Q8R8S9T8S8S7R6P6O5N5N5N6P8R:V=Z@^CcGhJmMqOtQwRxRyRy,W8R5N3L3K4L6O9T=YA_EeIkLpOtQxSzT|U}V~VWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVV~V~U}T|SzRxPvOtMqKnIlHjGhFhFhGhHjIkJlJmJmIlHjFgDdA`?]>[=Z=Z>[@^BbEfHjKoNsPvRyS{T|U~V~VWWWWVV~U}T|SzRxOuMqJlFhCb@^=Z;V:U:U;V=Z@^CbFhJlMqOuRxSzT|U}V~VVVV~V~U}T|SzQxOtMqJlGhCc@^=Y:U8R6P5N4M4M5N5N6O6P6P6P6P5O5N5N5N5N6O7R9T\\A`DdGiKnMrPuRxS{T|U~V~VVVVV~U~T|S{RyPvNsKoHjEfBa?\[A_DdGhJlLpOtPvRxRySzRy37R4M3K2J3K5N8R[=Z=Z>[@^BbEfHjKoNsPvRyS{T|U~V~VVVVV~U~U}T|SzQwOtMqJmGiDdA`>\\[ ,WNsOuPvQwQwQwPv 6P4L2I1H1I3L6P:V>\CbGhKnNrPvRyT{U}V~V~VWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWVVV~U~T|T{RyQwOuNrLpKnJlIkHjHjIkJmKnLpMqNrNsNrMrLpKoJmJlJlJlJmKnLpNrOtQwRyS{T|U}V~V~VWWWWWWVV~U}T|SzRxPvNsLpJmHjFgDeDdDdEeFgHjJmLpNsPvRyS{T|U}V~VVWWWVVV~U~T|T{SzQwOuNrKoIkFhDdBa@^>[[BbFhJmNrPvRyT{U}V~V~VWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWVV~U~U}T|SzRxPvOtMrLpKnJmJlJlJmKnLpMrNsOtOtOtOtNsNrMqLpLpLpLpMrNsOuQwRxSzT|U}U~V~VVWWWWWWVV~U~U}T{SzQxOuNrLoJmHjGiGhGhGiHjJmLpNrPuQxSzT{U}U~V~VWWWWWVV~V~U}T|S{RyQwOtNrKoIlGhEfCbA`@^>\=Z[?]@_BaDd 0^ &LqNsNsNsNr:W 7R5O3K1H0G1H3K5O9T>[BaFgJmNrPvRyT{U}U~V~VWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWVV~V~U}T|S{RyQwPvOtMrLpLoKoLoLpMqNrOtOuPvPvPvPvPuOtOtNsNsNsOtOtPvQwRxSzT{T|U}V~V~VWWWWWWWVV~V~U}T|SzRyQwOtNrLpKnJlJlJlJlKnLpNrOtQwRySzT|U}V~V~VWWWWWWVV~U~U}T|SzRyQwOuNrLpJmHjFhEeCcBaA`@^@^@^@^@^A_A`CbDdEfGhBa';rMqLpLpLo"2c$6i8S5N2J1H0F1H2J5O9T=ZBaFgJmMrPvRyT{U}U~V~VWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWVVV~U~U}T|SzRyQwPvOtNsNrMrMrNrNsOtPvQwQxRxRxRxQxQwQwPvPvPvPvQwRxRySzT{T|U}V~V~VVWWWWWWWVVV~U~U}T|SzRxPvOtNsMqLpLpLpLpMqNsOuPvRxSzT|U}U~V~VVWWWWWWVVV~U~U}T|SzRyQwPuNsMqKnJlHjGhEfEeDdDdCcCcDdDeEfFhGiIkJmKo!1a[BaFgJmMrPvRyT{U}U~V~VWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWVVV~U~U}T|T{SzRyRxQxQwQwQwQwQxRxRySzS{T{T|T|T{T{S{S{SzS{S{T{T|T|U}U}V~V~V~VWWWWWWWWWWVVV~U~U}T|T{SzRyRxQwPvPvPvPvQwRxRySzT{T|U}U~V~VVWWWWWWWWWVV~V~U~U}T|T{SzRyQwPvOtNsMrLpLoKoKnKnKnKnLoLpMqNrNsOtOuPu1I$F;V8R5N3K1H0F0F1H3K6O:U>[BbFhJmNrPvRyT{U}V~V~VWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWVV~V~U~U}T|T|S{SzSzRyRyRyRySzSzS{T|T|T|T|U}T|T|T|T|T|T|T|T|U}U}U~V~V~VVWWWWWWWWWWWWVV~V~U~U}T|T|S{SzRyRyRxRxRyRySzS{T|T|U}U~V~VVWWWWWWWWWWWVV~V~U~U}T|T|S{SzRxQxPvPuOtOtNsNsNrNrNsNsOtOuPvPvQwQwQwPv(N7P9T6P4M2J0G0F0F1H3L6P;V?\CbGhKnNrPvRyT{U}V~V~VWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWVV~V~U~U}U}T|T|T{S{S{S{T{T{T|T|U}U}U}U~U~U~U~U}U}U}U}U}U~U~V~V~V~VVWWWWWWWWWWWWWWVV~V~U~U}U}T|T|T{S{SzSzS{T{T|T|U}U}U~V~V~VWWWWWWWWWWWWWVVV~V~U~U}T|T|S{SzRyRxQxQwPvPvPvPvPvQwQwRxRxRyRyRyRxQwKo-)=w8S6P5N3K1H0F0F0F1I4L7R;W?]DdHjKoNsQwSzT|U}V~V~VWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWVVV~V~V~U~U}U}T|T|T|T|T|T|U}U}U~U~V~V~V~V~V~V~V~V~V~V~V~V~V~VVVWWWWWWWWWWWWWWWWVV~V~V~U~U}U}T|T|T|T|T|T|U}U}U~V~V~VVWWWWWWWWWWWWWWWVVV~V~U~U}U}T|T|T{S{SzSzSzRyRyRyRySzSzSzSzSzSzSzRyQxPvHj- /]7Q6O4M3K2I0G0F0F1H2J5N8S[BaFgJlMqOuRxSzT|U}V~VWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWVVVV~V~V~V~V~V~V~V~V~V~VVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVV~V~V~V~V~V~V~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWVVVV~V~V~U~U~U}U}U}U}U}U}U}U}U}U}U}U}U}T|S{RyPvOtLpIl;V+T  'M0F4L3K2J2I1H0G0F0F0F1H2J5N8R\;W8S6O4L2J1H0G0F0F0G1H2I3K5N8R;W>\BaEfIkLoNsPvRyT{T|U~V~VWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~U~U}T{SzQwOtLpJlGhCc@^=Z:U7R5N3L2J1I1H1H1I2J4L5N8R;V=ZA_DdGiKnMrPuRxSzT|U}V~V~VWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|SzRxPvNrKoHjEfBb?][\=Z=Z=Z>[?\@_BaDdFhIkKnMrOtQwRyS{T|U}V~V~VWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~U~T|T{SzRxPvNsLpKnIkGhEeCcBbA`A`A`BaCbDdEfGiJlLoNrOtQwRyS{T|U}V~V~VWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|T{SzRxPvOtMqKoJmHjGiFgEfEfEfFgGhHjIlKnLpNrOuQwRySzT|U}U~V~VVWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~U}T|T{SzRxPvOuNsMqLoKnJlIlIkIkJlJmKnLpMrOtPvQxRySzT|U}U~V~VVWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~U}T|T|SzRyQxPvOtNsNrMqLpLpLpLpMqNrOtPuQwRxSzS{T|U}U~V~V~VWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~U}U}T|S{SzRyQxPvPvOuOtOtOtOtPuPvQwRxRySzT{T|U}U~V~V~VWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~U~U}T|T|S{SzRyRxRxQxQxQxRxRxRySzSzT{T|U}U}V~V~VVWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVV~V~V~U~U}T|T|T{S{SzSzSzSzSzSzS{T|T|T|U}U~V~V~VVWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~V~U~U}U}T|T|T|T|T|T|T|U}U}U}U~V~V~V~VVWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~V~V~U~U~U}U}U}U~U~U~V~V~V~V~VVWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVV~V~V~V~V~V~V~V~V~V~VVVWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK Q@V@fv~(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/enormous result icon2e .tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/export.tif0000555000175000017500000000642210162465511020640 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻 唠ޔުޔޔޜᛦꮵ׺ ֔ު ۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ 㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ 䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح 痢ߒ۪ 瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳 铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵 ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ      @   (export.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/FileIcon_rtf.tiff0000644000175000017500000000434410162465511022030 0ustar brentbrent00000000000000II* P8$ BaPd6DbQ8qV,cr5 AJdIPG@G@|$y@tB*NSļ; D٘o \뺱^Quq(@I@ G*(JavH%d66\60H)r".M~έz8_8([6Jső–2QќϭR+ESJL}s+4;DRZ;֌9@(oѣ0֕GFzHYgy(L>KrͺI& b0)SڡWCm4nγ4lұl-4 )QsGaӝdBD$]Mj ).N|*wڮV9m9g^e虽TgzuZlFŸjYd..Ufy[)Y%bSelն;ǸoT5͚u,2Fa} ;,N oyy>)Yϻ+-|\jg[T)ܓAaE!4S[>QaFҐl'rkc9\q-'D,@g D4IE8i+:~A혘I[xrd`c)hK뒆QjB@C ܫ;yrÖ<. a$ z ? tqoD/yEVv2<]U4 ]i$b̝&=}%K)Hz""YU D͹+&*l5᛾웝&^|XJy͙7gޔo"WJ#g#3B3_Kh$-7eT??3'<=nD9is*=7rL|=)QK)Y^$R:kFzRP/t(5lQbNJfYC5:۪u?PD WЌB/;k>cV9}WgĬLj:B3SEFNap3#@De GV(mN:l@CY`Q1RֹPd͝Ť\bkܑkGV9Xj((IƆR Ph R; #I1u;ht6P-18Zk08"3[ɎJ9d2V\+dlrƀ{NXMW4_Sz0TZH##k'/ "H9\g{2)vp}#xḾL @,m}c& SV7ƪ|O+ۍ;=gz &aOhXfhک r혻7OIfQؼ7 hroO;_ot_v{_o?TguQ)j/(_c76}i4( \6.0ܷD,$ j1[D1+9α;lwuz|)H#猕$oy Bj)) AItd&/96Mg3p2δr)J3<*)S_6#JRPyꤼQʈ)N͒9S=09O#0 UP[t޷ %S=sѱ!\^3-y2r>g%L6l8mmɬͬzGo9HRQ<5jM`;ޕQn|U B0E[[w^:yA&4Zy/'@(_K SV drwʬPgן7k[5  e3ڋ@*pJK)bݤk;&̻0RUX߶;0N)㛆mZsnƻTyG.v˛[D+z>ݷ-ŵD8UaD//R>9aУb G͌{A_n$75 M2F ;CDAO ܉:J%\+3<:;0"7)à )Wep[-X.'RC*2Bi'18?\G bLupA⊉X8" |]h)A,Oה(D}F)`IzP4?))fmaH2Mză,rQJo-&ёCB)ģm2T|;HćJ+_ w~UQGC 4Hr&".ePI"$Tw`Bz?䔔WT7._$MD]5uNx݌7!%M92Pƒq dB p3VJ&BR(MsVП'~F7lQ3F8҆[v^0ָcohN3UJ#_n4B$ PKJJ^lJҫG%.kUC8WM L%X"5n&/U֦ ji/FP.0QX7#}W7/ew^ڊf,E6jZ+μW`J%ֶ#q[Ņ%y[`Qݲ _w 1/^-6 U~:PX9b kX:fmUƨ^o屨ˏoJ-ɭ2bmDUlCq4SI9v Z A ]wD1 V[_wW,2X3/IjE̹ə29ٖe)F[_s ~Z*K[˗[3XU>ǘ4|PnuzG!Hpz'($vVkx=w[}}ǁS> G\pnx OqN% 4A #import @interface fileListMgr : NSObject { IBOutlet id myProj; } - (int)numberOfRowsInTableView:(NSTableView *)aTableView; - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; @end gtamsanalyzer.app-0.42/Source/fileListMgr.m0000555000175000017500000000160510162465511021210 0ustar brentbrent00000000000000#import "fileListMgr.h" #import "myProject.h" @implementation fileListMgr - (int)numberOfRowsInTableView:(NSTableView *)aTableView { if([[myProj getHotFileList] count] > 0) NSLog(@"Filelstmgr: %d objects, 1st name: %@\n", [[myProj getHotFileList] count], [[[myProj getHotFileList] objectAtIndex: 0] name]); else NSLog(@"Filelstmgr: %d objects", [[myProj getHotFileList] count]); return [[myProj getHotFileList] count]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { NSLog(@"Filelstmgr: %d objects, 1st name: %@\n", [[myProj getHotFileList] count], [[[myProj getHotFileList] objectAtIndex: rowIndex] name]); return [[[myProj getHotFileList] objectAtIndex: rowIndex] name]; } - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { return NO; } @end gtamsanalyzer.app-0.42/Source/FindPanel.gorm/0000755000175000017500000000000010162465511021411 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/FindPanel.gorm/data.classes0000644000175000017500000001001511062075660023700 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "findNext:", "findPrevious:", "findNextAndOrderFindPanelOut:", "replace:", "replaceAndFind:", "replaceAll:", "orderFrontFindPanel:", "takeFindStringFromSelection:", "jumpToSelection:" ); Super = NSObject; }; TextFinder = { Actions = ( "findNext:", "findPrevious:", "findNextAndOrderFindPanelOut:", "replace:", "replaceAndFind:", "replaceAll:", "orderFrontFindPanel:", "takeFindStringFromSelection:", "jumpToSelection:" ); Outlets = ( findTextField, rawButton, regexButton, multilineButton, replaceTextField, ignoreCaseButton, findNextButton, findPrevButton, replaceAllScopeMatrix, statusField, scopeFlag ); Super = NSObject; }; }gtamsanalyzer.app-0.42/Source/FindPanel.gorm/data.info0000644000175000017500000000027011062075660023200 0ustar brentbrent00000000000000GNUstep archive00002a96:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed Streamgtamsanalyzer.app-0.42/Source/FindPanel.gorm/objects.gorm0000644000175000017500000001732611062075660023743 0ustar brentbrent00000000000000GNUstep archive00002a96:0000001d:000000d2:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%NSOwner0& %  TextFinder0& %  GormNSPanel01NSPanel1NSWindow1 NSResponder%  C C@& % C@ D01 NSView%  C C@  C C@&01 NSMutableArray1 NSArray&  0 1 NSTextField1 NSControl% A C$ B A  B A&0 &%0 1NSTextFieldCell1 NSActionCell1NSCell0 &% Find:0 1NSFont% A`&&&&&&&&%01NSColor0&%NSNamedColorSpace0&% System0&% textBackgroundColor00& %  textColor0 % A C  B A  B A&0 &%00& %  Replace with: &&&&&&&&%00&% System0&% textBackgroundColor00& %  textColor0 % B C! C A  C A&0 &%00 &0!%&&&&&&&&%0"0#&% System0$&% textBackgroundColor0%#0&& %  textColor0' % B C C A  C A&0( &%0)0*&!&&&&&&&&%0+0,&% System0-&% textBackgroundColor0.,0/& %  textColor001NSBox% CW B C% B  C% B&01 &02 % @ @ C B  C B&03 &041NSButton%  B A  B A&05 &%061 NSButtonCell07& %  Multiline081NSImage091NSMutableString&% common_SwitchOff!&&&&&&&&%0:&0;&0<0=&% common_SwitchOn&&&0>% A B A  B A&0? &%0@0A&% Regex8!&&&&&&&&%0B&0C&<&&&0D% B( B A  B A&0E &%0F0G& %  Ignore case8!&&&&&&&&%0H&0I&<&&&0J0K& %  Find options!&&&&&&&& @ @%%0L% C A  B A  B A&0M &%0N0O&% Replace & find!&&&&&&&&%0P&0Q&&&&0R% C~ A  B A  B A&0S &%0T0U&% Previous!&&&&&&&&%0V&0W&&&&0X% B A  Bl A  Bl A&0Y &%0Z0[&% Replace!&&&&&&&&%0\&0]&&&&0^% A A  B A  B A&0_ &%0`0a& %  Replace all!&&&&&&&&%0b&0c&&&&0d% C A  B` A  B` A&0e &%0f0g&% Next!&&&&&&&&%0h&0i&&&&0j % A BD CH A  CH A&0k &%0l0m& &&&&&&&&%0n0o&% System0p&% textBackgroundColor0qo0r& %  textColor0s% A B CH B  CH B&0t &0u % @ @ C: B  C: B&0v &0w% B$ B A  B A&0x &%0y0z& %  Entire file8!&&&&&&&&%0{&0|&<&&&0} % A C4 A  C4 A&0~ &%00&%(Unchecked = selection only) &&&&&&&&%00&%System0&%textBackgroundColor00& % textColor00&% Find/Replace scope!&&&&&&&& @ @%%00&% System0&% windowBackgroundColor0&% Window0& %  Find/Replace ? A F@ F@%00&%NSApplicationIcon0&% Button5L0& %  TextField 0&% Button6R0&% Button7X0&% Button8^0&% Buttonw0&% Button9d0&% GSCustomClassMap0&0&% Boxs0& %  TextField10& %  TextField20& %  TextField3'0& %  TextField4j0&% Button2D0& %  TextField5}0&% Box100&% Button3>0&% Button440 &  01NSNibConnector0&%NSOwner000000000000001NSNibOutletConnector0&% ignoreCaseButton00& %  regexButton00&% multilineButton00& %  findTextField00&% replaceTextField00&% findPrevButton00&% findNextButton01NSNibControlConnector0& %  replaceAll:0±0ñ&% replace:0ı0ű&% replaceAndFind:0Ʊ0DZ& %  findPrevious:0ȱ0ɱ& %  findNext:0ʱ0˱0̱0ͱ& %  statusField0α0ϱ& %  scopeFlag0б0ѱ01 GSMutableSet1 NSMutableSet1NSSet&gtamsanalyzer.app-0.42/Source/FindPanel.strings0000755000175000017500000000066210162465511022070 0ustar brentbrent00000000000000/* Status displayed in find panel when the find string is not found. */ "Not found" = "Not found"; /* Status displayed in find panel when indicated number of matches are replaced. */ "%d replaced" = "%d replaced"; gtamsanalyzer.app-0.42/Source/findRecord.tif0000555000175000017500000000647610162465511021407 0ustar brentbrent00000000000000MM* ᝨ簹篸殸氹簹絾ߖߪᔠ矪ޔ⡫⡬ᖡުޔޔޘߝᝩᝩᝩޔުޔޔޜᛦꮵ׺֔ުޔޔޙߘߘߘߜᴽ誱ҳ۔ުޔޗߞᶾ骰ѻޔުޔݐݑݙޔުޔޔޏݐݔޘߞᡫ⵽谷حߒ۪ޔޔޖߗߛᡫ⢭⧱ړݪޔޖߝ⡬⤮㪳ܔުޔޘ⡫ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡުޔ㣮䪳풞ڪޔ㧱哞ܪޔަ䧱䩳媴孶氹絾ے۪ޫ媳嫵孶殸沺׈ͪߗߗߗߗߗߗߗߗߗߗߗߗߗߗ    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/findRecord.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/FreqCount.gorm/0000755000175000017500000000000010162465511021457 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/FreqCount.gorm/data.classes0000644000175000017500000000674711062075653023771 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:" ); Super = NSObject; }; MWSummaryReport = { Actions = ( ); Outlets = ( dataTable ); Super = NSDocument; }; tableBrowser = { Actions = ( ); Outlets = ( myWindow, theTable ); Super = NSDocument; }; }gtamsanalyzer.app-0.42/Source/FreqCount.gorm/objects.gorm0000644000175000017500000000751411062075653024011 0ustar brentbrent00000000000000GNUstep archive00002a96:0000001e:00000060:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%NSOwner0& %  tableBrowser0&% GSCustomClassMap0&0& %  TableColumn101 NSTableColumn0 &% column2 Co A GP0 1NSTableHeaderCell1NSTextFieldCell1 NSActionCell1 NSCell0 &%  0 1 NSFont% &&&&&&&&%0 1 NSColor0&%NSNamedColorSpace0&%System0&%controlShadowColor0 0&% System0&% windowFrameTextColor00&%nine0 %&&&&&&&&%0 0&% textBackgroundColor0 0& %  textColor0& %  ScrollView01 NSScrollView1NSView1 NSResponder%  C C  C C&01NSMutableArray1NSArray&01 NSClipView% A A C Cu  C Cu&0&0 1 NSTableView1 NSControl%  C C!  C C!&0!&%0" 0#&&&&&&&&&0$&0%0&&% column1 Cn A GP0'0(&%  &&&&&&&&% 0)0*&%neuf*&&&&&&&&%0+ 0,& %  gridColor0- 0.&% System0/&% controlBackgroundColor001NSTableHeaderView%  C A  C A&01&021GSTableCornerView% @ @ A A  A A&03&%% A @ @@04 05&%NSCalibratedWhiteColorSpace ? ?061 NSScroller% @ A A Cu  A Cu&07&%08 #&&&&&&&&&2 _doScroll:v12@0:4@8209% A @ C A  C A&0:&00; 0<& %  controlColor% A A A A 690=& %  GormNSWindow0>1NSWindow% ? A C Co&% CM D6@0?% ? A C Co  C Co&0@&0A 0B&% System0C&% windowBackgroundColor0D&% Window0E&% Window0F&%Window ? A F@ F@%0G1NSImage0H&%NSApplicationIcon0I& %  TableColumn%0J&% GormNSTableView 0K&  0L1NSNibConnector=0M&%NSOwner0N0OJ0PI0Q0R1NSNibOutletConnectorM=0S&% _window0TJM0U& %  dataSource0VJM0W&% delegate0XM=0Y&% myWindow0ZMJ0[&% theTable0\=M0]&% delegate0^=M0_&% windowController0`1 GSMutableSet1 NSMutableSet1NSSet&>gtamsanalyzer.app-0.42/Source/get.c0000555000175000017500000002621610162465511017541 0ustar brentbrent00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2003 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* This module contains some convenience functions for extracting substrings from the subject string after a regex match has succeeded. The original idea for these functions came from Scott Wimer . */ /* Include the internals header, which itself includes Standard C headers plus the external pcre header. */ #include "internal.h" /************************************************* * Find number for named string * *************************************************/ /* This function is used by the two extraction functions below, as well as being generally available. Arguments: code the compiled regex stringname the name whose number is required Returns: the number of the named parentheses, or a negative number (PCRE_ERROR_NOSUBSTRING) if not found */ int pcre_get_stringnumber(const pcre *code, const char *stringname) { int rc; int entrysize; int top, bot; uschar *nametable; if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) return rc; if (top <= 0) return PCRE_ERROR_NOSUBSTRING; if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) return rc; if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) return rc; bot = 0; while (top > bot) { int mid = (top + bot) / 2; uschar *entry = nametable + entrysize*mid; int c = strcmp(stringname, (char *)(entry + 2)); if (c == 0) return (entry[0] << 8) + entry[1]; if (c > 0) bot = mid + 1; else top = mid; } return PCRE_ERROR_NOSUBSTRING; } /************************************************* * Copy captured string to given buffer * *************************************************/ /* This function copies a single captured substring into a given buffer. Note that we use memcpy() rather than strncpy() in case there are binary zeros in the string. Arguments: subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringnumber the number of the required substring buffer where to put the substring size the size of the buffer Returns: if successful: the length of the copied string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) buffer too small PCRE_ERROR_NOSUBSTRING (-7) no such captured substring */ int pcre_copy_substring(const char *subject, int *ovector, int stringcount, int stringnumber, char *buffer, int size) { int yield; if (stringnumber < 0 || stringnumber >= stringcount) return PCRE_ERROR_NOSUBSTRING; stringnumber *= 2; yield = ovector[stringnumber+1] - ovector[stringnumber]; if (size < yield + 1) return PCRE_ERROR_NOMEMORY; memcpy(buffer, subject + ovector[stringnumber], yield); buffer[yield] = 0; return yield; } /************************************************* * Copy named captured string to given buffer * *************************************************/ /* This function copies a single captured substring into a given buffer, identifying it by name. Arguments: code the compiled regex subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringname the name of the required substring buffer where to put the substring size the size of the buffer Returns: if successful: the length of the copied string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) buffer too small PCRE_ERROR_NOSUBSTRING (-7) no such captured substring */ int pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, char *buffer, int size) { int n = pcre_get_stringnumber(code, stringname); if (n <= 0) return n; return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); } /************************************************* * Copy all captured strings to new store * *************************************************/ /* This function gets one chunk of store and builds a list of pointers and all of the captured substrings in it. A NULL pointer is put on the end of the list. Arguments: subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) listptr set to point to the list of pointers Returns: if successful: 0 if not successful: PCRE_ERROR_NOMEMORY (-6) failed to get store */ int pcre_get_substring_list(const char *subject, int *ovector, int stringcount, const char ***listptr) { int i; int size = sizeof(char *); int double_count = stringcount * 2; char **stringlist; char *p; for (i = 0; i < double_count; i += 2) size += sizeof(char *) + ovector[i+1] - ovector[i] + 1; stringlist = (char **)(pcre_malloc)(size); if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; *listptr = (const char **)stringlist; p = (char *)(stringlist + stringcount + 1); for (i = 0; i < double_count; i += 2) { int len = ovector[i+1] - ovector[i]; memcpy(p, subject + ovector[i], len); *stringlist++ = p; p += len; *p++ = 0; } *stringlist = NULL; return 0; } /************************************************* * Free store obtained by get_substring_list * *************************************************/ /* This function exists for the benefit of people calling PCRE from non-C programs that can call its functions, but not free() or (pcre_free)() directly. Argument: the result of a previous pcre_get_substring_list() Returns: nothing */ void pcre_free_substring_list(const char **pointer) { (pcre_free)((void *)pointer); } /************************************************* * Copy captured string to new store * *************************************************/ /* This function copies a single captured substring into a piece of new store Arguments: subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringnumber the number of the required substring stringptr where to put a pointer to the substring Returns: if successful: the length of the string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) failed to get store PCRE_ERROR_NOSUBSTRING (-7) substring not present */ int pcre_get_substring(const char *subject, int *ovector, int stringcount, int stringnumber, const char **stringptr) { int yield; char *substring; if (stringnumber < 0 || stringnumber >= stringcount) return PCRE_ERROR_NOSUBSTRING; stringnumber *= 2; yield = ovector[stringnumber+1] - ovector[stringnumber]; substring = (char *)(pcre_malloc)(yield + 1); if (substring == NULL) return PCRE_ERROR_NOMEMORY; memcpy(substring, subject + ovector[stringnumber], yield); substring[yield] = 0; *stringptr = substring; return yield; } /************************************************* * Copy named captured string to new store * *************************************************/ /* This function copies a single captured substring, identified by name, into new store. Arguments: code the compiled regex subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringname the name of the required substring stringptr where to put the pointer Returns: if successful: the length of the copied string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) couldn't get memory PCRE_ERROR_NOSUBSTRING (-7) no such captured substring */ int pcre_get_named_substring(const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, const char **stringptr) { int n = pcre_get_stringnumber(code, stringname); if (n <= 0) return n; return pcre_get_substring(subject, ovector, stringcount, n, stringptr); } /************************************************* * Free store obtained by get_substring * *************************************************/ /* This function exists for the benefit of people calling PCRE from non-C programs that can call its functions, but not free() or (pcre_free)() directly. Argument: the result of a previous pcre_get_substring() Returns: nothing */ void pcre_free_substring(const char *pointer) { (pcre_free)((void *)pointer); } /* End of get.c */ gtamsanalyzer.app-0.42/Source/globalCodeMgr.h0000555000175000017500000000072310162465511021463 0ustar brentbrent00000000000000/* globalCodeMgr */ #import #import @interface globalCodeMgr : NSObject { IBOutlet id codeView; IBOutlet id myProj; } - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; - (int)numberOfRowsInTableView:(NSTableView *)aTableView; - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; @end gtamsanalyzer.app-0.42/Source/globalCodeMgr.m0000555000175000017500000000077210162465511021474 0ustar brentbrent00000000000000#import "globalCodeMgr.h" #import "myProject.h" @implementation globalCodeMgr - (int)numberOfRowsInTableView:(NSTableView *)aTableView { return [[myProj getHotCodeList] count]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { return [[myProj getHotCodeList] objectAtIndex: rowIndex]; } - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { return NO; } @end gtamsanalyzer.app-0.42/Source/GNUmakefile0000644000175000017500000000622010162465511020660 0ustar brentbrent00000000000000# # GNUmakefile - Generated by ProjectCenter # Written by Philippe C.D. Robert # # NOTE: Do NOT change this file -- ProjectCenter maintains it! # # Put all of your customisations in GNUmakefile.preamble and # GNUmakefile.postamble # include $(GNUSTEP_MAKEFILES)/common.make # # Subprojects # # # Main application # PACKAGE_NAME=GTAMSAnalyzer APP_NAME=GTAMSAnalyzer GNUSTEP_INSTALLATION_DIR=$(GNUSTEP_LOCAL_ROOT)/ GTAMSAnalyzer_APPLICATION_ICON=largeApp.tif GTAMSAnalyzer_MAIN_MODEL_FILE=GTAMSAnalyzer.gorm # #Additionallibraries # ADDITIONAL_GUI_LIBS+= # #Resourcefiles # GTAMSAnalyzer_RESOURCE_FILES= \ GTAMSAnalyzer.gorm \ MyPanedDocument.gorm \ myPanedResults.gorm \ myProject.gorm \ codeBrowser.gorm \ preference.gorm \ MWSummaryReport.gorm \ FreqCount.gorm \ kappa.gorm \ FindPanel.gorm \ FindPanel.strings \ codeicn.tif \ column.tif \ comment.tif \ dataSumm2.tif \ dataSummary.tif \ decolorTags.tif \ defFromSel.tif \ def.tif \ delRoot2.tif \ delRoot3.tif \ delRoot.tif \ docback.tif \ docTemplate.tif \ export.tif \ findRecord.tif \ markRec.tif \ metaicn.tif \ nextTag.tif \ playMedia.tif \ prevTag3.tif \ prevTag.tif \ reCode2.tif \ reCode.tif \ reColor.tif \ refresh.tif \ removeFrom.tif \ Save.tif \ sel2codeset.tif \ selCodeSet2.tif \ selCodeSet.tif \ selectAll2.tif \ selectAll3.tif \ selectAll.tif \ selectReverse.tif \ selectSome.tif \ selOtherTag.tif \ smartSort.tif \ sort09.tif \ sort09Within.tif \ sortAZ.tif \ sortAZWithin.tif \ sortCode.tif \ sortCodeWithin.tif \ tag2.tif \ tag3.tif \ tag4.tif \ tags.tif \ tamsanalysis-3.tif \ tamsanalysis-4.tif \ twoTagBasicNot.tif \ twoTagBasic.tif \ txt2Button.tif \ unmarkRec2.tif \ unmarkRec.tif \ wbicn.tif \ FileIcon_rtf.tiff \ FileIcon_txt.tiff \ tamsanalysis-1.tiff \ tamsanalysis-2.tiff \ tamsanalysis-3.tiff \ tamsanalysis-proj.tiff \ largeApp.tif \ ta-rslt.tiff \ taSmallestProj.tiff \ taSmallProj.tiff \ GTAMSAnalyzerInfo.plist # #Headerfiles # GTAMSAnalyzer_HEADER_FILES= \ myProject.h \ MyDocument.h # #Classfiles # GTAMSAnalyzer_OBJC_FILES= \ AGRegex.m \ appDelegate.m \ bookmarkInfo.m \ codeBrowser.m \ codeListSearchWatcher.m \ codeListWatcher.m \ coderec.m \ ctLimitCrit.m \ ctQChar.m \ ctTagInfo.m \ docDelegate.m \ dotGraphWatcher.m \ fileListMgr.m \ globalCodeMgr.m \ GNUStepPatches.m \ main.m \ MGWPopUpButton.m \ MGWScanner.m \ MWDoubleDictionary.m \ MWExportWatcher.m \ MWFakeDoc.m \ MWFakeFile.m \ MWFile.m \ MWKappa.m \ MWKeyedProject.m \ MWKeyedResult.m \ MWPath.m \ MWRange.m \ MWResultToolbarDelegate.m \ MWSortStackItem.m \ MWSummaryReport.m \ MWTAMSStringCategories.m \ MyDocument.m \ myProject.m \ myResults.m \ NSMutableNumber.m \ NSRecordData.m \ prefBoss.m \ searchListMgr.m \ setMacroWatcher.m \ stringCategories.m \ summaryWatcher.m \ tableBrowser.m \ TAMSCharEngine.m \ tamsutils.m \ TextFinder.m \ toolBarDelagate.m \ utils.m \ varRegistry.m \ xrefTableColumn.m \ xrefTableInfo.m \ # #Cfiles # GTAMSAnalyzer_C_FILES= \ chartables.c \ get.c \ maketables.c \ newline.c \ pcre.c \ pcreposix.c \ study.c -include GNUmakefile.preamble -include GNUmakefile.local include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/application.make -include GNUmakefile.postamble gtamsanalyzer.app-0.42/Source/GNUmakefileXML0000644000175000017500000000605310162465511021245 0ustar brentbrent00000000000000# # GNUmakefile - Generated by ProjectCenter # Written by Philippe C.D. Robert # # NOTE: Do NOT change this file -- ProjectCenter maintains it! # # Put all of your customisations in GNUmakefile.preamble and # GNUmakefile.postamble # include $(GNUSTEP_MAKEFILES)/common.make # # Subprojects # # # Main application # PACKAGE_NAME=GTAMSAnalyzer APP_NAME=GTAMSAnalyzer GNUSTEP_INSTALLATION_DIR=$(GNUSTEP_LOCAL_ROOT)/ GTAMSAnalyzer_APPLICATION_ICON=largeApp.tif GTAMSAnalyzer_MAIN_MODEL_FILE=GTAMSAnalyzer.gorm # #Additionallibraries # ADDITIONAL_GUI_LIBS+= # #Resourcefiles # GTAMSAnalyzer_RESOURCE_FILES= \ GTAMSAnalyzer.gorm \ MyPanedDocument.gorm \ myPanedResults.gorm \ myProject.gorm \ codeBrowser.gorm \ preference.gorm \ MWSummaryReport.gorm \ FreqCount.gorm \ column.tif \ comment.tif \ dataSumm2.tif \ dataSummary.tif \ decolorTags.tif \ defFromSel.tif \ def.tif \ delRoot2.tif \ delRoot3.tif \ delRoot.tif \ docback.tif \ docTemplate.tif \ export.tif \ findRecord.tif \ markRec.tif \ metaicn.tif \ nextTag.tif \ playMedia.tif \ prevTag3.tif \ prevTag.tif \ reCode2.tif \ reCode.tif \ reColor.tif \ refresh.tif \ removeFrom.tif \ Save.tif \ sel2codeset.tif \ selCodeSet2.tif \ selCodeSet.tif \ selectAll2.tif \ selectAll3.tif \ selectAll.tif \ selectReverse.tif \ selectSome.tif \ selOtherTag.tif \ smartSort.tif \ sort09.tif \ sort09Within.tif \ sortAZ.tif \ sortAZWithin.tif \ sortCode.tif \ sortCodeWithin.tif \ tag2.tif \ tag3.tif \ tag4.tif \ tags.tif \ tamsanalysis-3.tif \ tamsanalysis-4.tif \ twoTagBasicNot.tif \ twoTagBasic.tif \ txt2Button.tif \ unmarkRec2.tif \ unmarkRec.tif \ wbicn.tif \ FileIcon_rtf.tiff \ FileIcon_txt.tiff \ tamsanalysis-1.tiff \ tamsanalysis-2.tiff \ tamsanalysis-3.tiff \ tamsanalysis-proj.tiff \ largeApp.tif \ ta-rslt.tiff \ taSmallestProj.tiff \ taSmallProj.tiff \ GTAMSAnalyzerInfo.plist # #Headerfiles # GTAMSAnalyzer_HEADER_FILES= \ myProject.h \ MyDocument.h # #Classfiles # GTAMSAnalyzer_OBJC_FILES= \ AGRegex.m \ appDelegate.m \ bookmarkInfo.m \ codeBrowser.m \ codeListSearchWatcher.m \ codeListWatcher.m \ coderec.m \ ctLimitCrit.m \ ctQChar.m \ ctTagInfo.m \ docDelegate.m \ dotGraphWatcher.m \ fileListMgr.m \ globalCodeMgr.m \ GNUStepPatches.m \ main.m \ MGWPopUpButton.m \ MGWScanner.m \ MWDoubleDictionary.m \ MWExportWatcher.m \ MWFakeDoc.m \ MWFakeFile.m \ MWFile.m \ MWKappa.m \ MWPath.m \ MWRange.m \ MWResultToolbarDelegate.m \ MWSortStackItem.m \ MWSummaryReport.m \ MWTAMSStringCategories.m \ MyDocument.m \ myProject.m \ myResults.m \ NSMutableNumber.m \ NSRecordData.m \ prefBoss.m \ searchListMgr.m \ setMacroWatcher.m \ stringCategories.m \ summaryWatcher.m \ tableBrowser.m \ TAMSCharEngine.m \ tamsutils.m \ TextFinder.m \ toolBarDelagate.m \ utils.m \ varRegistry.m \ xrefTableColumn.m \ xrefTableInfo.m \ # #Cfiles # GTAMSAnalyzer_C_FILES= \ chartables.c \ get.c \ maketables.c \ newline.c \ pcre.c \ pcreposix.c \ study.c -include GNUmakefile.preamble -include GNUmakefile.local include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/application.make -include GNUmakefile.postamble gtamsanalyzer.app-0.42/Source/GNUStepPatches.m0000644000175000017500000000114310162465511021560 0ustar brentbrent00000000000000#import "MyDocument.h" #import "myProject.h" #import "myResults.h" @interface MyDocument (GSMyDocument) -(IBAction) close: (id) sender; @end @implementation MyDocument(GSMyDocument) -(IBAction) close: (id) sender { [self niceClose: sender]; } @end @interface myProject (GSMyProject) -(IBAction) close: (id) sender; @end @implementation myProject(GSMyProject) -(IBAction) close: (id) sender { [self niceClose: sender]; } @end @interface myResults (GSMyResults) -(IBAction) close: (id) sender; @end @implementation myResults (GSMyResults) -(IBAction) close: (id) sender { [self niceClose: sender]; } @endgtamsanalyzer.app-0.42/Source/gogorm0000755000175000017500000000003610162465511020025 0ustar brentbrent00000000000000cp -r $1 .. openapp Gorm.app& gtamsanalyzer.app-0.42/Source/GTAMSAnalyzer.gorm/0000755000175000017500000000000010162465511022132 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/GTAMSAnalyzer.gorm/data.classes0000644000175000017500000001550411062075645024434 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "changeFont:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontFontPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "doFindCurrentCode:", "doFindNextCode:", "doFindMate:", "doRemoveCodesFromSelection:", "doDeleteCodePair:", "requestCodeDefinition:", "requestCodeDefinitionOfSelection:", "popHotCodeStack:", "refreshCodeList:", "selectWithinCodeList:", "selectMoreCodeList:", "selectFewerCodeList:", "selectAllCodeList:", "doNameCodeSet:", "sortUp:", "sortDown:", "toggleCaseSensitive:", "selectRecs:", "selectAdditionalRecs:", "selectFewerRecs:", "selectReverseRecs:", "selectAllRecs:", "doMark:", "doUnmark:", "doMarkAll:", "doUnmarkAll:", "doReverseMarked:", "removeSelected:", "removeUnselected:", "selectMarked:", "selectUnmarked:", "addMarkedToSelected:", "addUnmarkedToSelected:", "removeMarkedFromSelected:", "removeUnmarkedFromSelected:", "doCollapseUp:", "doCollapseDown:", "doShowComment:", "doSetStripTags:", "undo:", "exportData:", "insertTAMSText:", "rebuildBookmarks:", "doRemoveBookmarks:", "exportCodesAndDefs:", "importCodes:", "importCodesAndDefs:", "integrateCodes:", "showCodeBrowser:", "newAction:", "loadAllCodes:", "editCodeSet:", "turnSelectionIntoCodeSet:", "doSelectCodeSetDialogue:", "doAddCode:", "doRecode:", "deleteSourceCodes:", "doDeleteMarked:", "doAddComment:", "doAppendCommentToMarked:", "doToggleReanalysisMode:", "doAddRootCode:", "doDelRootCode:", "doProjPrefPanel:", "doCodeLevel:", "doSetDateFmt:", "recolorTags:", "doColorOn:", "doColorOff:", "generateCount:", "generateCrossReference:", "runSummaryReport:", "addNamedSelection:", "doSetMath:", "createAutoSet:", "newFileToProj:", "addFileToProj:", "openSelectedFile:", "removeFileFromProj:", "closeProjFile:", "removeAllFiles:", "closeAllFiles:", "emptyCodeBook:", "removeAllAutoSets:", "clearNamedSelMenu:", "doDotGraph:", "generateKappa:", "editFileSet:", "loadAllFiles:", "doFindButtons:", "doTurnTextToButton:", "addItemToToolbar:", "addSelfToWorkMenu:", "findNext:", "findPrevious:", "findNextAndOrderFindPanelOut:", "replace:", "replaceAndFind:", "replaceAll:", "orderFrontFindPanel:", "takeFindStringFromSelection:", "jumpToSelection:", "copyWithoutTags:" ); Super = NSObject; }; TextFinder = { Actions = ( "findNext:", "findPrevious:", "findNextAndOrderFindPanelOut:", "replace:", "replaceAndFind:", "replaceAll:", "orderFrontFindPanel:", "takeFindStringFromSelection:", "jumpToSelection:" ); Outlets = ( findTextField, rawButton, regexButton, multilineButton, replaceTextField, ignoreCaseButton, findNextButton, findPrevButton, replaceAllScopeMatrix, statusField, scopeFlag ); Super = NSObject; }; appDelegate = { Actions = ( "doPreference:", "clearAllWorkItems:", "okRemoveWorkItem:", "removeWorkItem:", "cancelRemoveWorkItem:", "deleteAllWorkItems:", "aboutApp:" ); Outlets = ( delWorkMenu, codeSetMenu, autoSetMenu, caseMenuItem, delWorkPanel, docMacroMenu, rebuildMenuItem, workMenu, summReportMenu, toggleShowTagsMenuItem, fileSetMenu, reanalysisMenu ); Super = NSObject; }; }gtamsanalyzer.app-0.42/Source/GTAMSAnalyzer.gorm/data.info0000644000175000017500000000027011062075646023725 0ustar brentbrent00000000000000GNUstep archive00002a96:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed Streamgtamsanalyzer.app-0.42/Source/GTAMSAnalyzer.gorm/objects.gorm0000644000175000017500000034457411062075645024477 0ustar brentbrent00000000000000GNUstep archive00002a96:00000022:00000d24:00000002:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&S01NSString& %  MenuItem82301 NSMenuItem0&% Hide0&% h&&%01NSImage01NSMutableString&% common_2DCheckMark0 0 & %  common_2DDash%0 & %  MenuItem8240 0 &% Remove line numbers0&&&% %0& %  MenuItem82500& %  Code definition of selected text0&&&% %0& %  MenuItem82600& %  Set comment for selected text...0&&&% %0& %  MenuItem82700&0&&&% %0& %  MenuItem82800&0&&&% %0& %  MenuItem8290 0!& %  {!bookmark X}0"&&&% %0#& %  MenuItem2700$0%& %  {!button X}0&&&&% %0'& %  MenuItem2710(0)& %  {!bookmark X}0*&&&% %0+& %  MenuItem2720,0-& %  {!noheader}0.&&&% %0/& %  MenuItem2730001& %  {!name "X"}02&&&% %03& %  MenuItem2740405& %  {!noquote}06&&&% %07& %  GormNSMenu300081 NSMenu09&% Sort up0:1 NSMutableArray1 NSArray&  0;0<&% alpha0=&&&% %0>0?&% code0@&&&% %0A0B&% integer0C&&&% %0D0E&% float0F&&&% %0G0H&% date0I&&&% %0J0K&0L&&&% %0M0N& %  alpha within0O&&&% % 0P0Q& %  code within0R&&&% %0S0T&% integer within0U&&&% %0V0W& %  float within0X&&&% % 0Y0Z& %  date within0[&&&% % 0\& %  MenuItem2750]0^&% {!dirty}0_&&&% %0`& %  GormNSMenu3010a 0b& %  Sort down0c &  0d0e&% alpha0f&&&% %0g0h&% code0i&&&% %0j0k&% integer0l&&&% %0m0n&% float0o&&&% %0p0q&% date0r&&&% %0s0t&0u&&&% %0v0w& %  alpha within0x&&&% % 0y0z& %  code within0{&&&% %0|0}&% integer within0~&&&% %00& %  float within0&&&% % 00& %  date within0&&&% % 0& %  MenuItem27600&% {!clean}0&&&% %0& %  MenuItem55000&% Arrange In Front0&&&% %0& %  GormNSMenu3020 0& %  Selections0 &00& %  Select...0&&&% %00&% Select additional...0&&&% %00&% Remove from selection...0&&&% %00&% Select reverse0&&&% %00& %  Select all0&&&% %00&0&&&% %00&% Remove selected0&&&% %00&% Remove unselected0&&&% %00&0&&&% %00& %  Select marked0&&&% %00&% Select unmarked0&&&% %00&0&&&% %00& %  Add marked0&&&% %00& %  Add unmarked0&&&% %00&% Subtraced marked0&&&% %00&% Subtract unmarked0&&&% %0& %  MenuItem2770±0ñ&% {!emptysection}0ı&&&% %0ű& %  MenuItem5510Ʊ0DZ&% Miniaturize Window0ȱ&% m&&% %0ɱ& %  GormNSMenu3030ʱ 0˱& %  Results sets0̱ &0ͱ0α&% Create auto set...0ϱ&&&% %0б0ѱ&% Create named set...0ұ&&&% %0ӱ0Ա&0ձ&&&% %0ֱ0ױ&% Set operations0ر&&&% %0ٱ0ڱ&0۱&&&% %0ܱ0ݱ&% Remove auto sets0ޱ&&&% %0߱0&% Remove named sets0&&&% %00&0&&&% %0& %  MenuItem27800& %  {!name "X"}0&&&% %0& %  MenuItem55200& %  Close Window0&% w&&% %0& %  GormNSMenu3040 0&% Project0 &00&% Project0&&&% %00&0&&&% %00&% New file0&&&% %00&% Add file0&&&% %00& %  Open file0&&&% %PP& %  Remove fileP&&&% %PP& %  Close fileP&&&% %PP&% Close all filesP&&&% %P P &% Remove all filesP &&&% %P P & %  Code browserP&&&% %PP&% Delete all codesP&&&% %PP&% Named searchesP&&&% 2submenuAction:%P P &PP&% Save search criteriaP&&&% %PP& %  Remove searchP&&&% %PP&% Remove all searchesP&&&% %P P!&% Named search listsP"&&&% %P# !P$ &P%P&& %  Save listP'&&&% %P(P)& %  Remove listP*&&&% %P+P,&% Remove all listsP-&&&% %P.P/& %  Code setsP0&&&% %P1 /P2 &P3P4&% Manage code sets...P5&&&% %P6P7&% View all codesP8&&&% %P9P:& %  File setsP;&&&% %P< :P= &P>P?&% Manage file setsP@&&&% %PAPB&% View all filesPC&&&% %PDPE&$% $Import codes and defs from code filePF&&&% %PGPH&% Improt codes from code filePI&&&% %PJPK&% Export codes to code filePL&&&% %PMPN&PO&&&% %PPPQ&% Reanalysis modePR&&&% %PSPT& %  PreferencesPU&&&% %PV& %  MenuItem279PWPX& %  {!noquote}PY&&&% %PZ& %  MenuItem553P[P\&% FontP]&&&% %P^ \P_ &  P`Pa& %  Font Panel...Pb&% t&&% %PcPd&% BoldPe&% b&&% %PfPg&% ItalicPh&% i&&% %PiPj& %  UnderlinePk&&&% %PlPm& %  SuperscriptPn&&&% %PoPp& %  SubscriptPq&&&% %PrPs&% UnscriptPt&&&% %PuPv& %  Copy FontPw&% 3&&% %PxPy& %  Paste FontPz&% 4&&% %P{ P|&% TAMSP} &P~P&% InfoP&&&% %P P &PP&% About GTAMSAnalyzer...P&&&% %PP&% Preferences...P&&&% %{PP&% DocumentP&&&% %P P &PP&% Open project...P&% o&&% %PP& %  New projectP&% n&&% %PP&% Save...P&% s&&% %PP& %  Save As...P&% S&&% %PP& %  Save To...P&&&% %PP&% Save AllP&&&% %PP&% revert To SavedP&&&% %PP&% CloseP&&&% %{PP&% EditP&&&% %P P &PP&% UndoP&% z&&% %PP&% CutP&% x&&% %PP&% CopyP&% c&&% %PP&%Copy without tagsP&&&% %PP&% PasteP&% v&&% %PP& %  Select AllP&% a&&% %{PP&% FindP&&&% %P P &P±Pñ& %  Find Panel...Pı&% f&&% %PűPƱ& %  Find NextPDZ&% g&&% %PȱPɱ& %  Find PreviousPʱ&% d&&% %P˱P̱&% Enter SelectionPͱ&% e&&% %PαPϱ&% Jump To SelectionPб&% j&&% %{[PѱPұ&% TextPӱ&&&% %PԱ Pձ &PֱPױ& %  Align LeftPر&&&% %PٱPڱ&% CenterP۱&&&% %PܱPݱ& %  Align RightPޱ&&&% %P߱P& %  Show RulerP&&&% %PP& %  Copy RulerP&% 1&&% %PP& %  Paste RulerP&% 2&&% %{PP&% CodingP&&&% %P P &PP&% Check for pairsP&&&% %PP&% Check for nestedP&&&% %PP& %  Color tagsP&&&% %P P &PP& %  Recolor tagsP&&&% %PP& %  Decolor tagsP&&&% %PP& %  Color tagsP&&&% %PP&% Color all tagsP&&&% %P P &PP&% RedP&&&% %P P &% YellowP &&&% %P P &% GreenP&&&% %PP&% BlueP&&&% %PP&P&&&% %PP& %  Light grayP&&&% %PP&% GrayP&&&% %PP& %  Dark grayP&&&% %PP& %  Escape bracesP &&&% %P!P"&% Wrap and line numberP#&&&% % P$P%&% Find selected rangeP&&&&% %P'P(&% TagsP)&&&% %P* (P+ &P,P-&% Find current codeP.&&&% %P/P0&% Find next codeP1&&&% %P2P3&% Find paired codeP4&&&% %P5P6&% Remove codes from selectionP7&&&% %P8P9&% Delete code pairP:&&&% %P;P<&% Code definitionP=&&&% %P>P?& %  Hot code setP@&&&% %PA ?PB &PCPD&% BackPE&&&% %PFPG&% SelectPH&&&% %PIPJ& %  Select withinPK&&&% %PLPM& %  Select morePN&&&% %POPP&% RemovePQ&&&% %PRPS& %  Select allPT&&&% %PUPV&% Turn to code setPW&&&% %PXPY&% Integrate with code dictionaryPZ&&&% %P[P\&% Generate code listP]&&&% %P^P_& %  BookmarksP`&&&% %Pa _Pb & PcPd& %  Rebuild menuPe&&&% %PfPg&% Remove all bookmarksPh&&&% %PiPj&Pk&&&% %PlPm&% ToolbarPn&&&% %Po mPp &PqPr& %  {!button X}Ps&&&% %PtPu&% CommandsPv&&&% %Pw uPx &PyPz&% Forthcoming...P{&&&% %oP|P}& %  Build toolbarP~&&&% %PP&% Add selection to toolbarP&&&% %PP&% Add code to toolbarP&&&% %PP&P&&&% %PP&% Insert date-timeP&&&% %{PP&% ResultsP&&&% %P P &  PP& %  Hide tagsP&&&% %PP& %  Show commentP&&&% %PP&% RecodeP&&&% %P P &PP&% MarkP&&&% %PP&% UnmarkP&&&% %PP&% Mark allP&&&% %PP& %  Unmark allP&&&% %PP&% Reverse makred and unmarkedP&&&% %PP&% RecodeP&&&% %PP&% Add codeP&&&% %PP& %  Add root codeP&&&% %PP&% Delete root codesP&&&% %PP&% Add comment to current rowP&&&% %PP&% Append comment to marked rowP&&&% %PP&% Delete codes in sourceP&&&% %PP&% Delete marked recordsP&&&% %P±Pñ&% Reanalysis modePı&&&% %PűPƱ&% SortPDZ&&&% %Pȱ Pɱ &PʱP˱& %  Sort optionsP̱&&&% %Pͱ Pα &PϱPб&% Case sensitivePѱ&&&% %PұPӱ&% Date format...PԱ&&&% %PձPֱ& %  Code level...Pױ&&&% %Pر9Pٱ&&&% %8PڱbP۱&&&% %aPܱPݱ&&&% %PޱP߱&&&% %PP&% Turn selection to code set...P&&&% %PP&% Data summary...P&&&% %P P &PP&% Data summary report...P&&&% %PP&% Select code set...P&&&% %PP& %  Collapse upP&&&% %PP& %  Collapse downP&&&% %PP&% Export data...P&&&% %{PP&&&% %{PP&% MetatagsP&&&% %P P &PP&% CodingP&&&% %P P &PP& %  {!repeat X}P&&&% %PP& %  {!context X}P&&&% %P P &% {!contextcode x}P &&&% %P P &% {!setrepeat X="Y"}P&&&% %PP&% {!universal X="Y"}P&&&% %PP&% {!if X=""=>Y=""}P&&&% %PP& %  {!name "X"}P&&&% %PP& %  {!map X->Y}P&&&% %PP& %  {!zapmap}P&&&% %PP&% {!setcomment --X}P &&&% %P!P"&% {!appendcomment --X}P#&&&% %P$P%&% {!endcomment --X}P&&&&% %P'P(&% {!endlastcomment}P)&&&% %P*P+&% {!clearcomments}P,&&&% %P-P.& %  StructureP/&&&% %P0 .P1 &P2P3&% {!end}P4&&&% %P5P6& %  {!endsection}P7&&&% %P8P9& %  {!struct}P:&&&% %P;P<& %  {!unstruct}P=&&&% %P>P?&% {!inner}P@&&&% %PAPB&% {!first}PC&&&% %PDPE&% {!firstrepeat X}PF&&&% %PGPH&% {!innerrepeat X}PI&&&% %PJPK& %  {!last X}PL&&&% %PMPN&% {!lastrepeat X}PO&&&% %PPPQ& %  {!eofisend}PR&&&% %PSPT&% {!eofisnotend}PU&&&% %PVPW&% {!noskipinnertopofdoc}PX&&&% %PYPZ&% {!skipinneratend}P[&&&% %P\P]&% {!skipinnertopofdoc}P^&&&% %P_P`&% {!noskipinneratend}Pa&&&% %PbPc& %  FormattingPd&&&% %Pe cPf &PgPh& %  {!noheader}Pi&&&% %PjPk& %  {!noquote}Pl&&&% %PmPn& %  {!escapeon}Po&&&% %PpPq& %  {!escapeoff}Pr&&&% %PsPt& %  SearchingPu&&&% %Pv tPw &  PxPy&% {!block}Pz&&&% %P{P|&% {!frontloadrepeat}P}&&&% %P~P&% {!backloadrepeat}P&&&% %PP&% {!clean}P&&&% %PP&% {!dirty}P&&&% %PP&% {!zapuniversal}P&&&% %PP&% {!nozapuniversal}P&&&% %PP&% {!emptysection}P&&&% %PP&% {!noemptysection}P&&&% %PP&% Misc.P&&&% %P P &PP& %  {!dummy X}P&&&% %PP& %  {!comment X}P&&&% %PP& %  {!button X}P&&&% %PP& %  {!bookmark X}P&&&% %{PP&% ReportsP&&&% %P P &PP&% CountP&&&% %PP&% Co-coding frequencyP&&&% %PP&% Inter-rater reliabilityP&&&% %PP& %  Data summaryP&&&% %PP&% GraphvizP&&&% %{PP&% WindowsP&&&% %P P &ư{PP&% WorkP&&&% %P P &P±Pñ&% Add project to work menu...Pı&&&% %PűPƱ& %  Remove project from work menu...PDZ&&&% %PȱPɱ&% Clear work menu...Pʱ&&&% %P˱P̱&Pͱ&&&% %{PαPϱ&% ServicesPб&&&% %Pѱ Pұ &{PӱPԱ&% QuitPձ&% q&&% %Pֱ& %  GormNSMenu305Pױ& %  MenuItem554`Pر& %  GormNSMenu306#Pٱ& %  MenuItem555cPڱ& %  GormNSMenu307^P۱& %  MenuItem556fPܱ& %  GormNSMenu308Pݱ Pޱ&% Insert metatagP߱ &PP&% {!end}P&&&% %PP& %  {!endsection}P&&&% %PP& %  {!repeat X}P&&&% %PP& %  {!inner X}P&&&% %PP&% {!universal X="Y"}P&&&% %PP& %  {!button X}P&&&% %PP& %  {!bookmark X}P&&&% %PP& %  {!noheader}P&&&% %WPP&% {!dirty}P&&&% %PP&% {!clean}P&&&% %PP&% {!emptysection}P&&&% %PP&% {!noemptysection}P&&&% %PP&% {!zapuniversal}P&&&% %PP&% {!nozapuniversal}P &&&% %P P & %  {!escapeon}P &&&% %P P& %  {!escapeoff}P&&&% %PP& %  {!eofisend}P&&&% %PP&% {!eofisnotend}P&&&% %PP&% {!frontloadrepeat}P&&&% %PP&% {!backloadrepeat}P&&&% %PP&% {!if X="" => Y=""}P&&&% %PP & %  {!block X}P!&&&% %P"P#& %  {!dummy X}P$&&&% %P%& %  MenuItem557iP&& %  GormNSMenu309P'& %  MenuItem830cP(& %  MenuItem558lP)& %  MenuItem831fP*& %  MenuItem559oP+& %  MenuItem832iP,& %  MenuItem833lP-& %  MenuItem834qP.& %  MenuItem835tP/& %  MenuItem836yP0& %  MenuItem837|P1& %  MenuItem838P2& %  MenuItem839P3& %  MenuItem280P4& %  MenuItem281P5& %  MenuItem282P6& %  MenuItem283P7& %  MenuItem284P8& %  GormNSMenu310P9& %  MenuItem285P:& %  GormNSMenu3110P;& %  MenuItem286 P<& %  MenuItem560rP=& %  GormNSMenu312vP>& %  MenuItem287 P?& %  MenuItem561uP@& %  GormNSMenu313ePA& %  MenuItem288PB& %  MenuItem562xPC& %  GormNSMenu314PD& %  MenuItem289PE& %  MenuItem563PFPG&&&% 2 submenuAction:v12@0:4@8%ݐPH& %  GormNSMenu315PI& %  MenuItem564PJ& %  GormNSMenu316PK& %  MenuItem565PL& %  GormNSMenu317APM& %  MenuItem566PN& %  GormNSMenu318PO& %  MenuItem567PP& %  GormNSMenu319PQ& %  MenuItem840PR& %  MenuItem568PS& %  MenuItem841PT& %  MenuItem569PU& %  MenuItem842PV& %  MenuItem843PW& %  MenuItem844PX& %  MenuItem845 PY& %  MenuItem846%PZ& %  MenuItem847(P[& %  MenuItem848+P\& %  MenuItem849DP]& %  MenuItem290FP^& %  MenuItem291P_& %  MenuItem292P`& %  MenuItem293Pa& %  MenuItem294Pb& %  GormNSMenu3208Pc& %  MenuItem295Pd& %  GormNSMenu321aPe& %  MenuItem296Pf& %  MenuItem570Pg& %  GormNSMenu322Ph& %  MenuItem297Pi& %  MenuItem571Pj& %  GormNSMenu323Pk& %  MenuItem298Pl& %  MenuItem572Pm& %  GormNSMenu324Pn& %  MenuItem299Po& %  MenuItem573WPp& %  GormNSMenu325Pq& %  MenuItem574Pr& %  GormNSMenu326#Ps& %  MenuItem575Pt& %  GormNSMenu327^Pu& %  MenuItem576Pv& %  GormNSMenu328Pw& %  MenuItem577Px& %  GormNSMenu329Py& %  MenuItem850GPz& %  MenuItem578P{& %  MenuItem851JP|& %  MenuItem579P}& %  MenuItem852MP~& %  MenuItem853PP& %  MenuItem854SP& %  MenuItem855P& %  MenuItem856WP& %  MenuItem857P& %  MenuItem858P& %  MenuItem859P& %  GormNSMenu330P& %  GormNSMenu3310P& %  MenuItem580 P& %  GormNSMenu332vP& %  MenuItem581 P& %  GormNSMenu333eP& %  MenuItem582P& %  GormNSMenu334P& %  MenuItem583P& %  GormNSMenu335P& %  MenuItem584P& %  GormNSMenu336P& %  MenuItem585P& %  GormNSMenu337AP& %  MenuItem586P& %  GormNSMenu338P& %  MenuItem587P& %  GormNSMenu339P& %  MenuItem860P& %  MenuItem588"P& %  MenuItem861P& %  MenuItem589P& %  MenuItem862P& %  MenuItem863 P& %  MenuItem864 P& %  MenuItem865P& %  MenuItem866P& %  MenuItem867P& %  TextFieldP1 NSTextField1 NSControl1NSView1 NSResponder% A Bp C# A  C# A&P &%P1NSTextFieldCell1 NSActionCell1NSCellP&% Remove from work menu:P1NSFont% A`&&&&&&&&%P1NSColorP&%NSNamedColorSpaceP&% SystemP&% textBackgroundColorPP& %  textColorP& %  MenuItem868P& %  MenuItem869P& %  GormNSMenu3408P& %  GormNSMenu341aP& %  MenuItem590DP& %  GormNSMenu342P& %  MenuItem591GP& %  GormNSMenu343P& %  MenuItem592JP& %  GormNSMenu344P& %  MenuItem593MP& %  GormNSMenu345P& %  MenuItem594PP& %  GormNSMenu346#P& %  MenuItem595SP& %  GormNSMenu347^P& %  MenuItem596VP& %  GormNSMenu348P& %  MenuItem597YP& %  GormNSMenu349P& %  MenuItem870P±& %  MenuItem598Pñ& %  MenuItem871"Pı& %  MenuItem599Pű& %  MenuItem872PƱ& %  MenuItem873PDZ& %  MenuItem874Pȱ& %  MenuItem875Pɱ& %  MenuItem876Pʱ& %  MenuItem877>P˱& %  MenuItem878FP̱& %  MenuItem879IPͱ& %  GormNSMenu350Pα& %  GormNSMenu3510Pϱ& %  GormNSMenu352ePб& %  GormNSMenu353vPѱ& %  GormNSMenu354Pұ& %  GormNSMenu355Pӱ& %  GormNSMenu3561PԱ& %  GormNSMenu357Pձ& %  GormNSMenu358Pֱ& %  GormNSMenu359Pױ& %  MenuItem880LPر& %  MenuItem881CPٱ& %  MenuItem882OPڱ& %  MenuItem883RP۱& %  MenuItem884UPܱ& %  MenuItem885Pݱ& %  MenuItem886 Pޱ& %  MenuItem887P߱& %  MenuItem888PP&P&&&% %P& %  MenuItem889P& %  GormNSMenu360^P& %  GormNSMenu361AP& %  GormNSMenu362P& %  GormNSMenu363P& %  GormNSMenu3648P& %  GormNSMenu365aP& %  GormNSMenu366P& %  GormNSMenu367P& %  GormNSMenu368P& %  GormNSMenu369P& %  MenuItem890dP& %  MenuItem891gP& %  MenuItem892mP& %  MenuItem893jP& %  MenuItem894|P& %  MenuItem895pP& %  MenuItem896P& %  MenuItem897sP& %  MenuItem898vP& %  MenuItem899P& %  MenuItem10P& %  MenuItem11P& %  MenuItem12P& %  MenuItem13P& %  GormNSMenu370#P& %  MenuItem14P& %  GormNSMenu3711P& %  MenuItem15P& %  GormNSMenu372P& %  MenuItem16P& %  GormNSMenu373P& %  MenuItem17P& %  GormNSMenu3740P& %  MenuItem18P& %  GormNSMenu375eP& %  MenuItem19P& %  GormNSMenu376vP & %  GormNSMenu377P & %  GormNSMenu378P & %  GormNSMenu379P & %  MenuItem20P & %  MenuItem21P& %  MenuItem22P& %  MenuItem23P& %  GormNSMenu380& %  {!escapeoff}P?&&&% %P@& %  MenuItem115PAPB& %  {!eofisend}PC&&&% %PD& %  MenuItem116PEPF&% {!eofisnotend}PG&&&% %PH& %  MenuItem117PIPJ&% {!frontloadrepeat}PK&&&% %PL& %  MenuItem118PMPN&% {!backloadrepeat}PO&&&% %PP& %  MenuItem119PQPR&% {!if X="" => Y=""}PS&&&% %PT& %  MenuItem40oPU& %  MenuItem41rPV& %  MenuItem42uPW& %  MenuItem43xPX& %  MenuItem44PY& %  MenuItem45PZ& %  MenuItem46P[& %  MenuItem47P\P]&P^&&&% %P_& %  MenuItem48P`Pa&Pb&&&% %Pc& %  MenuItem49Pd& %  MenuItem120PePf& %  {!dummy X}Pg&&&% %Ph& %  MenuItem121PiPj& %  {!block X}Pk&&&% %Pl& %  MenuItem122PmPn&% CountPo&&&% %Pp& %  MenuItem123PqPr&% Inter-rater reliabilityPs&&&% %Pt& %  MenuItem124Pu& %  MenuItem125Pv& %  MenuItem126Pw& %  MenuItem400Px& %  MenuItem127PyPz&P{&&&% %P|& %  MenuItem401P}& %  MenuItem128P~P&P&&&% %P& %  MenuItem402P& %  MenuItem129PP&P&&&% %P& %  MenuItem403P& %  MenuItem404P& %  MenuItem405P& %  MenuItem406P& %  MenuItem407P& %  MenuItem408P& %  MenuItem409P& %  MenuItem50!P& %  MenuItem51PP&P&&&% %P&% NSFontP1 GSNibItemP& %  NSFontManager  &P& %  MenuItem52$P& %  MenuItem53PP&P&&&% %P& %  MenuItem54PP&P&&&% %P& %  MenuItem55;P& %  MenuItem56[P& %  MenuItem57XP& %  MenuItem58PP&% Build button barP&&&% %P& %  MenuItem59PP&% Turn selection into buttonP&&&% %P&%NSOwnerP& %  NSApplicationP&% GormNSPopUpButtonP1 NSPopUpButton1NSButton% C2 Bh C5 A  C5 A&P &%P1NSPopUpButtonCell1NSMenuItemCell1 NSButtonCellP&P%&&&&&&&&P P&P &PP&% Item 1P&&&%PP& % common_Nibble%PP&% Item 2&&%%PP&% Item 3&&%%%P&P&&&&%%%%%P& %  MenuItem130P& %  MenuItem131P& %  MenuItem132P±& %  MenuItem133Pñ& %  MenuItem134Pı& %  MenuItem135Pű& %  MenuItem136PƱPDZ&Pȱ&&&% %Pɱ& %  MenuItem410Pʱ& %  MenuItem137P˱& %  MenuItem411WP̱& %  MenuItem138Pͱ& %  MenuItem412Pα& %  MenuItem139Pϱ& %  MenuItem413Pб& %  MenuItem414Pѱ& %  MenuItem415Pұ& %  MenuItem416Pӱ& %  MenuItem417PԱ& %  MenuItem418 Pձ& %  MenuItem419 Pֱ& %  MenuItem60PױPر&Pٱ&&&% %Pڱ& %  MenuItem61P۱& %  MenuItem62^Pܱ& %  MenuItem63Pݱ& %  MenuItem64Pޱ& %  MenuItem65P߱& %  MenuItem66P& %  MenuItem67P& %  MenuItem68 P& %  MenuItem69 P& %  MenuItem140P& %  MenuItem141P& %  MenuItem142P& %  MenuItem143P& %  MenuItem144P& %  MenuItem145PP&P&&&% %P& %  MenuItem146P& %  MenuItem420P& %  MenuItem147P& %  NSWindowsMenuP& %  MenuItem421P& %  MenuItem148P& %  MenuItem422P& %  MenuItem149P& %  MenuItem423P& %  MenuItem424P& %  MenuItem425P& %  MenuItem426"P& %  MenuItem700P& %  MenuItem427P& %  MenuItem701WP& %  MenuItem428P& %  MenuItem702P& %  MenuItem429P& %  MenuItem703~P& %  MenuItem704P& %  MenuItem705P& %  MenuItem706P& %  MenuItem707P& %  MenuItem70P& %  MenuItem708.P& %  MenuItem71P& %  MenuItem7093P& %  MenuItem72P& %  MenuItem73P & %  MenuItem74P & %  MenuItem75'P & %  MenuItem76,P & %  MenuItem77/P & %  MenuItem782P& %  MenuItem795P& %  MenuItem150P& %  MenuItem151P& %  MenuItem152P& %  MenuItem153P& %  MenuItem154P& %  MenuItem155P& %  MenuItem156P& %  MenuItem430P& %  MenuItem157P& %  MenuItem431"P& %  MenuItem158P& %  MenuItem432lP& %  MenuItem159P& %  MenuItem433qP& %  GormNSMenu1P& %  MenuItem434|P& %  GormNSMenu2P & %  MenuItem435P!& %  GormNSMenu3P"& %  MenuItem436P#& %  GormNSMenu4P$& %  MenuItem7106P%& %  MenuItem437P&& %  GormNSMenu5P'& %  MenuItem711P(& %  MenuItem438tP)& %  GormNSMenu6^P*& %  MenuItem712P+& %  MenuItem439yP,& %  GormNSMenu7P-& %  MenuItem713P.& %  GormNSMenu8P/& %  MenuItem714P0& %  GormNSMenu9P1& %  MenuItem7159P2& %  MenuItem716>P3& %  MenuItem717P4& %  MenuItem808P5& %  MenuItem718P6& %  MenuItem81 P7& %  MenuItem719P8& %  MenuItem82P9& %  MenuItem83P:& %  MenuItem84P;P<&% ReportsP=&&&% %P> P& %  GormNSMenu202#P& %  MenuItem177P& %  MenuItem451AP& %  GormNSMenu203^P& %  MenuItem178 P& %  MenuItem452P& %  GormNSMenu204P& %  MenuItem179PP&P&&&% %P& %  MenuItem453P& %  GormNSMenu205P& %  MenuItem454P& %  GormNSMenu206P& %  MenuItem455P& %  GormNSMenu207AP& %  MenuItem456P& %  GormNSMenu208P& %  MenuItem730P& %  MenuItem457P& %  GormNSMenu209P& %  MenuItem731 P& %  MenuItem458P& %  MenuItem732 P& %  MenuItem459P& %  MenuItem733P& %  MenuItem734P& %  MenuItem735P& %  MenuItem736P& %  MenuItem737P& %  MenuItem738`P& %  MenuItem739P& %  MenuItem180 P& %  MenuItem181PP&P&&&% %P& %  MenuItem182P& %  MenuItem183PP&P&&&% %P& %  MenuItem184P& %  GormNSMenu210P& %  MenuItem185DP& %  GormNSMenu2118P& %  MenuItem186GP& %  MenuItem460P& %  GormNSMenu212aP& %  MenuItem187JP& %  MenuItem461 P& %  GormNSMenu213P& %  MenuItem188MP& %  MenuItem462 P& %  GormNSMenu214P& %  MenuItem189PP& %  MenuItem463P& %  GormNSMenu215P& %  MenuItem464P& %  GormNSMenu216#P& %  MenuItem465P& %  GormNSMenu217^P& %  MenuItem466P& %  GormNSMenu218P& %  MenuItem740P& %  MenuItem467P±& %  GormNSMenu219Pñ& %  MenuItem741Pı& %  MenuItem468`Pű& %  MenuItem742PƱ& %  MenuItem469PDZ& %  MenuItem743Pȱ& %  MenuItem744Pɱ& %  MenuItem745Pʱ& %  MenuItem746P˱& %  MenuItem747P̱& %  MenuItem748Pͱ& %  MenuItem749Pα& %  MenuItem190SPϱ& %  MenuItem191Pб& %  MenuItem192Pѱ& %  MenuItem193Pұ& %  MenuItem194Pӱ& %  GormNSMenu220PԱ& %  MenuItem195 Pձ& %  GormNSMenu221APֱ& %  MenuItem196%Pױ& %  MenuItem470!Pر& %  GormNSMenu222Pٱ& %  MenuItem197(Pڱ& %  MenuItem471 P۱& %  GormNSMenu223Pܱ& %  MenuItem198+Pݱ& %  MenuItem472Pޱ& %  GormNSMenu2248P߱& %  MenuItem199P& %  MenuItem473$P& %  GormNSMenu225aP& %  MenuItem474P& %  GormNSMenu226P& %  MenuItem475'P& %  GormNSMenu227P& %  MenuItem476,P& %  GormNSMenu228P& %  MenuItem750P& %  MenuItem477/P& %  GormNSMenu229P& %  MenuItem751P& %  MenuItem4782P& %  MenuItem752P& %  MenuItem4795P& %  MenuItem753P& %  MenuItem754P& %  MenuItem755P& %  MenuItem756P& %  MenuItem757P& %  MenuItem758P& %  MenuItem759yP& %  GormNSMenu230#P& %  GormNSMenu231^P& %  MenuItem4808P& %  GormNSMenu232P& %  MenuItem481P& %  GormNSMenu233P& %  MenuItem482;P& %  GormNSMenu234P& %  MenuItem483P& %  GormNSMenu235AP& %  MenuItem484P& %  GormNSMenu236P& %  MenuItem485P& %  GormNSMenu237P& %  MenuItem486XP& %  GormNSMenu2388P& %  MenuItem487[P& %  GormNSMenu239aP& %  MenuItem760P & %  MenuItem488P & %  MenuItem761P & %  MenuItem489^P & %  MenuItem762P & %  MenuItem763P& %  MenuItem764P& %  MenuItem765P& %  MenuItem766;P& %  MenuItem767>P& %  MenuItem768AP& %  MenuItem769DP& %  GormNSMenu240P& %  GormNSMenu241P& %  MenuItem490 P& %  GormNSMenu242P& %  MenuItem491cP& %  GormNSMenu243P& %  MenuItem492fP& %  GormNSMenu244#P& %  MenuItem493iP& %  GormNSMenu245^P& %  MenuItem494lP& %  GormNSMenu246P & %  MenuItem495qP!& %  GormNSMenu247P"& %  MenuItem496tP#& %  GormNSMenu248P$& %  MenuItem497yP%& %  GormNSMenu249AP&& %  MenuItem770GP'& %  MenuItem498|P(& %  MenuItem771JP)& %  MenuItem499P*& %  MenuItem772MP+& %  MenuItem773PP,& %  MenuItem774SP-& %  MenuItem775VP.& %  MenuItem776YP/& %  MenuItem777XP0& %  MenuItem778P1& %  MenuItem779P2& %  GormNSMenu250P3& %  GormNSMenu251P4& %  GormNSMenu2528P5& %  GormNSMenu253aP6& %  GormNSMenu254P7& %  GormNSMenu255P8& %  GormNSMenu256P9& %  GormNSMenu257P:& %  GormNSMenu258#P;& %  GormNSMenu259^P<& %  MenuItem780P=& %  MenuItem781P>& %  MenuItem782P?& %  MenuItem783P@& %  MenuItem784PA& %  MenuItem785PB& %  MenuItem786PC& %  MenuItem787PD& %  MenuItem788PE& %  MenuItem789PF& %  GormNSMenu260PG& %  GormNSMenu261PH& %  GormNSMenu262PI& %  GormNSMenu263APJ& %  GormNSMenu264PK&% ButtonPL% Ci A  B A  B A&PM &%PNPO& %  Delete all&&&&&&&&%PP&PQ&&&&PR& %  GormNSMenu265PS& %  GormNSMenu2668PT& %  GormNSMenu267aPU& %  GormNSMenu268PV& %  GormNSMenu269PW& %  MenuItem790PX& %  MenuItem791PY& %  MenuItem792PZ& %  MenuItem793P[& %  MenuItem794P\& %  MenuItem795~P]& %  MenuItem796P^& %  MenuItem797P_&% GSCustomClassMapP`&Pa& %  MenuItem798Pb& %  MenuItem799Pc& %  GormNSMenu270Pd& %  GormNSMenu271Pe& %  GormNSMenu272#Pf& %  GormNSMenu273^Pg& %  GormNSMenu274Ph& %  GormNSMenu275Pi& %  GormNSMenu276Pj& %  GormNSMenu277APk& %  GormNSMenu278Pl& %  GormNSMenu279Pm& %  GormNSMenu2808Pn& %  GormNSMenu281aPo& %  GormNSMenu282Pp& %  GormNSMenu283Pq& %  GormNSMenu284Pr& %  GormNSMenu285Ps& %  GormNSMenu286#Pt& %  GormNSMenu287^Pu& %  GormNSMenu288Pv& %  GormNSMenu289Pw&% Button1Px% C A  B` A  B` A&Py &%PzP{&% Delete&&&&&&&&%P|&P}&&&&P~& %  GormNSMenu290P&% Button2P% C, A  B` A  B` A&P &%PP&% Cancel&&&&&&&&%P&P&&&&P& %  GormNSMenu291P& %  GormNSMenu292eP& %  GormNSMenu2930P& %  GormNSMenu294vP& %  GormNSMenu295P& %  GormNSMenu296P& %  GormNSMenu297AP& %  GormNSMenu298P& %  GormNSMenu299P& %  MenuItem300P& %  MenuItem301P& %  MenuItem302P& %  MenuItem303P& %  MenuItem304P& %  MenuItem305P& %  MenuItem306P& %  MenuItem307P& %  MenuItem308P& %  MenuItem309yP& %  MenuItem310P& %  MenuItem311P& %  MenuItem312P& %  MenuItem313P& %  MenuItem314P& %  MenuItem315P& %  MenuItem316P& %  MenuItem317P& %  MenuItem318P& %  MenuItem319P& %  MenuItem320P& %  MenuItem321P& %  MenuItem322P& %  MenuItem323P& %  MenuItem324P& %  MenuItem325P& %  MenuItem326P& %  MenuItem600P& %  MenuItem327~P& %  MenuItem601P& %  MenuItem328P& %  MenuItem602P& %  MenuItem329P& %  MenuItem603P& %  MenuItem604P& %  MenuItem605P& %  MenuItem606P& %  MenuItem607P& %  MenuItem608P& %  MenuItem609P& %  MenuItem330P& %  MenuItem331P& %  MenuItem332P& %  MenuItem333P& %  MenuItem334P& %  MenuItem335P& %  MenuItem336P& %  MenuItem610P& %  MenuItem337P& %  MenuItem611 P& %  MenuItem338P±& %  MenuItem612 Pñ& %  MenuItem339Pı& %  MenuItem613Pű& %  MenuItem614PƱ& %  MenuItem615PDZ& %  MenuItem616Pȱ& %  MenuItem617Pɱ& %  MenuItem618`Pʱ& %  MenuItem619P˱& %  MenuItem340P̱& %  MenuItem341Pͱ& %  MenuItem342Pα& %  MenuItem343Pϱ& %  MenuItem344Pб& %  MenuItem345Pѱ& %  MenuItem346Pұ& %  MenuItem620Pӱ& %  MenuItem347PԱ& %  MenuItem621Pձ& %  MenuItem348 Pֱ& %  MenuItem622Pױ& %  MenuItem349.Pر& %  MenuItem623Pٱ& %  MenuItem624Pڱ& %  MenuItem625P۱& %  MenuItem626Pܱ& %  MenuItem627Pݱ& %  MenuItem900yPޱ& %  MenuItem628P߱& %  MenuItem901P& %  MenuItem629P& %  MenuItem902P& %  MenuItem903P& %  MenuItem904P& %  MenuItem905P& %  MenuItem906P& %  MenuItem907P& %  MenuItem908bP& %  MenuItem909gP& %  GormNSMenu100P& %  GormNSMenu101P& %  MenuItem350 P& %  GormNSMenu102P& %  MenuItem3513P& %  GormNSMenu103P& %  MenuItem352P& %  GormNSMenu104*P& %  MenuItem3536P& %  GormNSMenu105aP& %  MenuItem354P& %  GormNSMenu106oP& %  MenuItem355P& %  GormNSMenu107wP& %  MenuItem356P& %  GormNSMenu108P& %  MenuItem630P& %  MenuItem357P& %  GormNSMenu109P& %  MenuItem631P& %  MenuItem358 P& %  MenuItem632P& %  MenuItem359%P& %  MenuItem633P& %  MenuItem634P& %  MenuItem635P& %  MenuItem636P& %  MenuItem637P& %  MenuItem910-P& %  MenuItem638P& %  MenuItem9112P& %  MenuItem639yP & %  MenuItem912sP & %  MenuItem913xP & %  MenuItem914P & %  MenuItem915P & %  MenuItem916 P& %  MenuItem917P& %  MenuItem918P& %  MenuItem919P& %  GormNSMenuP& %  GormNSMenu110P& %  GormNSMenu111P& %  MenuItem360(P& %  GormNSMenu1128P& %  MenuItem361+P& %  GormNSMenu113P& %  MenuItem362P& %  GormNSMenu114P& %  MenuItem363DP& %  GormNSMenu115P& %  MenuItem364GP& %  GormNSMenu116P& %  MenuItem365JP& %  GormNSMenu117#P & %  MenuItem366MP!& %  GormNSMenu118^P"& %  MenuItem640P#& %  MenuItem367PP$& %  GormNSMenu119P%& %  MenuItem641P&& %  MenuItem368SP'& %  MenuItem642P(& %  MenuItem369P)& %  MenuItem643P*& %  MenuItem644P+& %  MenuItem645P,& %  MenuItem646;P-& %  MenuItem647>P.& %  MenuItem920P/& %  MenuItem648AP0& %  MenuItem921P1& %  MenuItem649DP2& %  MenuItem922P3& %  MenuItem923!P4& %  MenuItem924$P5& %  MenuItem925'P6& %  MenuItem926*P7& %  MenuItem9278P8& %  MenuItem928 P9& %  MenuItem9295P:& %  GormNSMenu120P;& %  GormNSMenu121AP<& %  MenuItem370P=& %  GormNSMenu122P>& %  MenuItem371P?& %  GormNSMenu123P@& %  MenuItem372PA& %  GormNSMenu124APB& %  MenuItem373`PC& %  GormNSMenu125PD& %  MenuItem374cPE& %  GormNSMenu126PF& %  MenuItem375fPG& %  GormNSMenu1278PH& %  MenuItem376iPI& %  GormNSMenu128PJ& %  MenuItem650GPK& %  MenuItem377lPL& %  GormNSMenu129PM& %  MenuItem651JPN& %  MenuItem378oPO& %  MenuItem652MPP& %  MenuItem379rPQ& %  MenuItem653PPR& %  MenuItem654SPS& %  MenuItem655VPT& %  MenuItem656YPU& %  MenuItem657XPV& %  GormNSMenu10*PW& %  MenuItem930MPX& %  MenuItem658PY& %  GormNSMenu11aPZ& %  MenuItem931>P[& %  MenuItem659P\& %  GormNSMenu12P] P^&% Insert metatagP_ &P`Pa&% {!end}Pb&&&% %PcPd& %  {!endsection}Pe&&&% %PfPg& %  {!repeat X}Ph&&&% %PiPj& %  {!inner X}Pk&&&% %PlPm&% {!universal X="Y"}Pn&&&% %$(,04]-159=AEIMQiePo& %  MenuItem932;Pp& %  GormNSMenu13>Pq& %  MenuItem933_Pr& %  GormNSMenu14Ps& %  MenuItem934APt& %  GormNSMenu15Pu& %  MenuItem935DPv& %  GormNSMenu16Pw& %  MenuItem936GPx& %  GormNSMenu17Py& %  MenuItem937JPz& %  GormNSMenu18P{& %  MenuItem938\P|& %  GormNSMenu19P}& %  MenuItem939PP~& %  GormNSMenu130P& %  GormNSMenu131P& %  MenuItem380uP& %  GormNSMenu132#P& %  MenuItem381xP& %  GormNSMenu133^P& %  MenuItem382P& %  GormNSMenu134P& %  MenuItem383P& %  GormNSMenu135P& %  MenuItem384P& %  GormNSMenu136P& %  MenuItem385P& %  GormNSMenu137AP& %  MenuItem386P& %  GormNSMenu138P& %  MenuItem660P& %  MenuItem387P& %  GormNSMenu139P& %  MenuItem661P& %  MenuItem388P& %  MenuItem662P& %  MenuItem389P& %  MenuItem663P& %  MenuItem664P& %  MenuItem665P& %  MenuItem666P& %  MenuItem667P& %  GormNSMenu20#P& %  MenuItem940VP& %  MenuItem668P& %  GormNSMenu21P& %  MenuItem941SP& %  MenuItem669P& %  GormNSMenu22P& %  MenuItem942YP& %  GormNSMenu23P& %  MenuItem943jP& %  GormNSMenu24P& %  MenuItem944mP& %  GormNSMenu25P& %  MenuItem945pP& %  GormNSMenu26P& %  MenuItem946{P& %  GormNSMenu27P& %  MenuItem947~P& %  GormNSMenu28P& %  MenuItem948P& %  GormNSMenu29*P& %  MenuItem949P& %  GormNSMenu140P& %  GormNSMenu1418P& %  MenuItem390P& %  GormNSMenu142P& %  MenuItem391P& %  GormNSMenu143P& %  MenuItem392P& %  GormNSMenu144P& %  MenuItem393P& %  GormNSMenu145#P& %  MenuItem394P& %  GormNSMenu146^P& %  MenuItem395P& %  GormNSMenu147P& %  MenuItem396P& %  GormNSMenu148P& %  MenuItem670P& %  MenuItem397P±& %  GormNSMenu149aPñ& %  MenuItem671Pı& %  MenuItem398Pű& %  MenuItem672PƱ& %  MenuItem399PDZ& %  MenuItem673Pȱ& %  MenuItem674Pɱ& %  MenuItem675~Pʱ& %  MenuItem676P˱& %  MenuItem677P̱& %  GormNSMenu30aPͱ& %  MenuItem950Pα& %  MenuItem678Pϱ& %  GormNSMenu31Pб& %  MenuItem951Pѱ& %  MenuItem679Pұ& %  GormNSMenu32Pӱ& %  MenuItem952PԱ& %  GormNSMenu33Pձ& %  MenuItem953Pֱ& %  GormNSMenu34Pױ& %  MenuItem954Pر& %  GormNSMenu35Pٱ& %  MenuItem955Pڱ& %  GormNSMenu36P۱& %  MenuItem956Pܱ& %  GormNSMenu37Pݱ& %  MenuItem957Pޱ&% MenuItemP߱& %  GormNSMenu38P& %  MenuItem958P& %  GormNSMenu39#P& %  MenuItem959P& %  GormNSMenu150P& %  GormNSMenu151AP& %  GormNSMenu152P& %  GormNSMenu153P& %  GormNSMenu154P& %  GormNSMenu1558P& %  GormNSMenu156aP& %  GormNSMenu157P& %  GormNSMenu158P& %  MenuItem680P& %  GormNSMenu159P& %  MenuItem681[P& %  MenuItem682`P& %  MenuItem683cP& %  MenuItem684fP& %  MenuItem685iP& %  MenuItem686lP& %  MenuItem687oP& %  GormNSMenu40P& %  MenuItem960P& %  MenuItem688rP& %  GormNSMenu41^P& %  MenuItem961P& %  MenuItem962P& %  MenuItem689uP& %  GormNSMenu42oP& %  MenuItem963P& %  GormNSMenu43wP& %  MenuItem964AP & %  GormNSMenu44P & %  MenuItem965P & %  GormNSMenu45P & %  GormNSMenu468P & %  GormNSPanelP 1NSPanel1NSWindow%  C B& % C D6P %  C B  C B&P  &LxP P &% SystemP &% windowBackgroundColorP &% WindowP &%Remove work item  ? A F@ F@%P P &%NSApplicationIconP & %  GormNSMenu47P & %  GormNSMenu48P & %  GormNSMenu49P & %  GormNSMenu160#P & %  GormNSMenu161^P & %  GormNSMenu162P & %  GormNSMenu163P & %  GormNSMenu164P & %  GormNSMenu165AP & %  GormNSMenu166P & %  GormNSMenu167P &% NSServicesMenuP & %  GormNSMenu168P & %  GormNSMenu1698P & %  MenuItem690xP & %  MenuItem691FP & %  MenuItem692P & %  MenuItem693P !& %  MenuItem694P "& %  MenuItem695P #& %  MenuItem696P $& %  GormNSMenu50P %& %  MenuItem697P && %  GormNSMenu51P '& %  MenuItem698P (& %  GormNSMenu52P )& %  MenuItem699P *& %  GormNSMenu53P +& %  GormNSMenu54P ,& %  GormNSMenu55oP -& %  GormNSMenu56wP .& %  GormNSMenu57P /& %  GormNSMenu58P 0& %  GormNSMenu598P 1& %  GormNSMenu170aP 2& %  GormNSMenu171P 3& %  GormNSMenu172P 4& %  GormNSMenu173P 5& %  GormNSMenu174#P 6& %  GormNSMenu175^P 7& %  GormNSMenu176P 8& %  GormNSMenu177P 9& %  GormNSMenu178P :& %  GormNSMenu179AP ;& %  GormNSMenu60P < P =& %  Sort downP > &P ?P @&% ItemP A&&&% %P B& %  GormNSMenu61#P C& %  GormNSMenu62P D& %  GormNSMenu63^P E& %  GormNSMenu64P F& %  GormNSMenu65P G& %  GormNSMenu66P H& %  GormNSMenu67P I& %  GormNSMenu68P J& %  GormNSMenu69P K& %  TextFinderP L K  &P M& %  GormNSMenu180P N& %  GormNSMenu181P O& %  GormNSMenu182P P& %  GormNSMenu1838P Q& %  GormNSMenu184aP R& %  GormNSMenu185P S& %  GormNSMenu186P T& %  GormNSMenu187P U& %  GormNSMenu188#P V& %  GormNSMenu189^P W& %  GormNSMenu70P X& %  GormNSMenu71P Y& %  GormNSMenu72oP Z& %  GormNSMenu73wP [& %  MenuItem1P \& %  GormNSMenu74P ]& %  MenuItem2P ^& %  GormNSMenu75P _& %  MenuItem3P `& %  GormNSMenu768P a& %  MenuItem4P b& %  GormNSMenu77#P c& %  MenuItem5P d& %  GormNSMenu78P e& %  MenuItem6P f& %  GormNSMenu79^P g& %  MenuItem7P h& %  MenuItem8P i& %  MenuItem9P j& %  GormNSMenu190P k& %  GormNSMenu191P l& %  GormNSMenu192P m& %  GormNSMenu193AP n& %  GormNSMenu194P o& %  GormNSMenu195P p& %  GormNSMenu196P q& %  GormNSMenu1978P r& %  GormNSMenu198aP s& %  GormNSMenu199P t& %  GormNSMenu80P u& %  GormNSMenu81P v& %  GormNSMenu82P w& %  GormNSMenu83P x& %  GormNSMenu84P y& %  GormNSMenu85P z& %  GormNSMenu86P {& %  GormNSMenu87P |& %  GormNSMenu88P }& %  GormNSMenu89oP ~& %  MenuItem200P & %  GormNSMenu90wP & %  MenuItem201P & %  GormNSMenu91P & %  MenuItem202P & %  GormNSMenu92P & %  MenuItem203P & %  GormNSMenu938P & %  MenuItem204P & %  GormNSMenu94#P & %  MenuItem205P & %  GormNSMenu95P & %  MenuItem206P & %  GormNSMenu96^P & %  MenuItem207P & %  GormNSMenu97P & %  MenuItem208P & %  GormNSMenu98P & %  MenuItem209P & %  GormNSMenu99P & %  MenuItem210P & %  MenuItem211P & %  MenuItem212P & %  MenuItem213P & %  MenuItem214P & %  MenuItem215P & %  MenuItem216P & %  MenuItem217P & %  MenuItem218P & %  MenuItem219P & %  MenuItem220P & %  MenuItem221P & %  MenuItem222P & %  MenuItem223P & %  MenuItem224P & %  MenuItem225P & %  MenuItem226P & %  MenuItem500P & %  MenuItem227P & %  MenuItem501P & %  MenuItem228P & %  MenuItem502P & %  MenuItem229P & %  MenuItem503P & %  MenuItem504P & %  MenuItem505P & %  MenuItem506P & %  MenuItem507P & %  MenuItem508P & %  MenuItem509P & %  appDelegateP    &P & %  MenuItem230P & %  MenuItem231P & %  MenuItem232 P & %  MenuItem233 P & %  MenuItem234P & %  MenuItem235P & %  MenuItem236P & %  MenuItem510P & %  MenuItem237P & %  MenuItem511P & %  MenuItem238P & %  MenuItem512P & %  MenuItem239P & %  MenuItem513P & %  MenuItem514P & %  MenuItem515P ±& %  MenuItem516P ñ& %  MenuItem517P ı& %  MenuItem518P ű& %  MenuItem519~P Ʊ&% NSMenu{P DZ& %  MenuItem240P ȱ& %  MenuItem241!P ɱ& %  MenuItem242P ʱ& %  MenuItem243$P ˱& %  MenuItem244P ̱& %  MenuItem245'P ͱ& %  MenuItem246,P α& %  MenuItem520P ϱ& %  MenuItem247/P б& %  MenuItem521P ѱ& %  MenuItem2482P ұ& %  MenuItem522P ӱ& %  MenuItem2495P Ա& %  MenuItem523P ձ& %  MenuItem524P ֱ& %  MenuItem525P ױ& %  MenuItem526;P ر& %  MenuItem800P ٱ& %  MenuItem527P ڱ =P ۱&&&% %

 P ? ƐP @ vP A ƐP B y P C yP D yP E yP F yP G yP H yP I ƐP J ܐP K P L P M P N P O P P P Q P R P S P T ƐP U z P V zP W zP X zP Y zP Z zP [ zP \ zP ] zP ^  zP _ zP ` { P a {P b {P c {P d | P e |P f |P g |P h |P i |P j |P k |P l |P m zP n ̐P o P p P q P r P s P t zP u P v ̐P w ̐P x ̐P y ̐P z ƐP { P | ԐP } ԐP ~ԐP ԐP  ԐP  P  ֐P  ԐP  s P  sP  ԐP  n P   nP  ֐P  ֐P  ֐P  ֐P  ֐P  ֐P  ֐P  ֐P  sP  sP  sP  sP  sP  sP  sP  sP   sP   sP   sP   sP   sP   sP   sP  nP  nP  nP  nP  nP  nP  nP  ƐP  SːP  SP  SP  SP  SP  SP  SP  SP  SP  SP  SP  SP  SP  SP  SP # SP & SP  SP  TP  TP  TP  TP  SP  P  P  P ± P 1NSNibControlConnector P ı&% submenuAction:P ű ~ P Ʊ&% submenuAction:P DZ P ȱ&%NSFirstP ɱ& %  openDocument:P ʱ P ˱& %  newDocument:P ̱ P ͱ& %  saveDocument:P α P ϱ&% saveDocumentAs:P б P ѱ&% saveDocumentTo:P ұ P ӱ&% saveAllDocuments:P Ա P ձ&% revertDocumentToSaved:P ֱ P ױ&% close:P ر P ٱ&% submenuAction:P ڱ P ۱&% cut:P ܱ P ݱ&% copy:P ޱ P ߱&% paste:P  P & %  selectAll:P  P &% submenuAction:P  P &% submenuAction:P  P & %  alignLeft:P  P & %  alignCenter:P  P &% submenuAction:P  zP &% submenuAction:P  {P &% submenuAction:P  zP &% submenuAction:P  zP &% submenuAction:P  P &% submenuAction:P  P &% submenuAction:P  P &% submenuAction:P  P &% submenuAction:P  P &% submenuAction:P  SP &% submenuAction:P  SP &% submenuAction:P ( P &% submenuAction:P  P &% arrangeInFront:P  P &% performMiniaturize:P  P & %  performClose:P  P  P &% orderFrontFontPanel:P  P & %  addFontTrait:P  P & %  addFontTrait:P  P & %  underline:P  P & %  superscript:P  P & %  subscript:P  P & %  unscript:P  P & %  copyFont:P  P & %  pasteFont:P  [ P & %  terminate:P 1NSNibOutletConnector P &% delegateP ! P "& %  alignRight:P # P $& %  toggleRuler:P % P && %  copyRuler:P ' zP ( zP )&% submenuAction:P * }P + }P ,' }P -) }P . }P / }P 0" }P 1" }P 2&% submenuAction:P 3 "P 4$ P 5  zP 6  zP 7 zP 8 ԐP 9 P :&% submenuAction:P ; ΐP < P = P >&% submenuAction:P ? АP @ P A P B P C&% submenuAction:P D ֐P E P F P G P H P I&% hide:P J P K& %  pasteRuler:P L P M&% submenuAction:P N- P O/ P P1 P QJ P RM P SO P TQ P UR P VS P WT P X3 ƐP Y3 P Z&% submenuAction:P [ 3P \5 P ] P ^ P _ P ` P a&% doFindCurrentCode:P b P c&% doFindNextCode:P d P e& %  doFindMate:P f P g&% doRemoveCodesFromSelection:P h P i&% doDeleteCodePair:P j P k&% requestCodeDefinition:P l  P m&!% !requestCodeDefinitionOfSelection:P n zP o zP p&% submenuAction:P q mʐP r mP s mP t mP u mP v mP w mP x mP y P z&% popHotCodeStack:P { P |&% refreshCodeList:P } P ~&% selectWithinCodeList:P  P &% selectMoreCodeList:P  P &% selectFewerCodeList:P  P &% selectAllCodeList:P  P  P &% submenuAction:P  rP  rP  rP  rP  rP  rP  rP  rP  rP  rP  rP  rP  P &% sortUp:P - P / P 1 P J P O P Q P R P S P T P  P & %  sortDown:P  P  P  P  P  P  P  P  P  P  P &% toggleCaseSensitive:P  P & %  caseMenuItemP  P & %  selectRecs:P  P &% selectAdditionalRecs:P  P &% selectFewerRecs:P  P &% selectReverseRecs:P  P &% selectAllRecs:P  P &% doMark:P  P & %  doUnmark:P  P & %  doMarkAll:P  P & %  doUnmarkAll:P  P &% doReverseMarked:P ± P ñ&% removeSelected:P ı P ű&% removeUnselected:P Ʊ  P DZ& %  selectMarked:P ȱ  P ɱ&% selectUnmarked:P ʱ  P ˱&% addMarkedToSelected:P ̱  P ͱ&% addUnmarkedToSelected:P α  P ϱ&% removeMarkedFromSelected:P б  P ѱ&% removeUnmarkedFromSelected:P ұ P ӱ& %  doCollapseUp:P Ա P ձ&% doCollapseDown:P ֱ P ױ&% doSetStripTags:P ر P ٱ&% doShowComment:P ڱ wP ۱ P ܱ&% undo:P ݱԐP ޱ P ߱& %  exportData:P  ƐP  P &% submenuAction:P ~P ~P ~P &% submenuAction:P P P ~P ~P &% submenuAction:P P P ~P ~P &% submenuAction:P P P  ~P  ~P &% submenuAction:P  P  P  ~P  ~P &% submenuAction:P  P  P  P &% insertTAMSText:P P  P P P P .P 0P 2P 3P 4P 5P 6P 8P 7P 7 P &% insertTAMSText:P 8 P  P  P  P  P  P . P 0 P 2 P 3 P 4 P 5 P 6 P 9P WP ZP oP qP !sP "uP #wP $yP %{P &}P 'P (P )P * P +&% insertTAMSText:P ,9 +P -o +P .Z +P /u +P 0w +P 1y +P 2W +P 3} +P 4 +P 5 +P 6 +P 7{ +P 8q +P 9P :P ;P <P =P >P ?P @P AP BP CP D +P E +P F +P G +P H +P I +P J +P K +P L +P M +P N +P O +P P +P QP RP SP T +P U +P V +P W +P X +P Y P Z&% rebuildMenuItemP [ P \&% rebuildBookmarks:P ] P ^&% doRemoveBookmarks:P _ P `&% importCodesAndDefs:P a P b& %  importCodes:P c P d&% exportCodesAndDefs:P e P f&% integrateCodes:P g P h&% showCodeBrowser:P i P j&% doNameCodeSet:P k SP l SP m&% submenuAction:P nאP oP pP q P r& %  codeSetMenuP s P t& %  editCodeSet:P u P v& %  loadAllCodes:P wԐP xԐP y P z&% turnSelectionIntoCodeSet:P { P |&% doSelectCodeSetDialogue:P } ƐP ~ P &% submenuAction:P  ŐP  P   P  P & %  aboutApp:P   P & %  doPreference:P  ֐P  ֐P ֐P ֐P  P & %  doRecode:P  P & %  doAddCode:P  P &% deleteSourceCodes:P  P &% doDeleteMarked:P  P & %  doAddComment:P  P &% doAppendCommentToMarked:P ֐P # P &% doToggleReanalysisMode:P  P  P &% doAddRootCode:P  P &% doDelRootCode:P & P &% doProjPrefPanel:P  P & %  doCodeLevel:P  P & %  doSetDateFmt:P  {P  P & %  recolorTags:P  P & %  doColorOff:P  P  ƐP  P &% submenuAction:P  P   P   P  P &% generateCount:P   P &% generateCrossReference:P  P  P &% runSummaryReport:P  P &% addNamedSelection:P  P & %  doSetMath:P   P &% createAutoSet:P  P & %  autoSetMenuP * SP  P ±&% newFileToProj:P ñ P ı&% addFileToProj:P ű P Ʊ&% openSelectedFile:P DZ P ȱ&% removeFileFromProj:P ɱ P ʱ&% closeProjFile:P ˱* P ̱&% closeAllFiles:P ͱ P α&% removeAllFiles:P ϱ P б&% emptyCodeBook:P ѱ P ұ&% removeAllAutoSets:P ӱ P Ա&% clearNamedSelSet:P ձ- P ֱ- P ױ& %  doDotGraph:P ر/ P ٱ/ P ڱ&% generateKappa:P ۱  P ܱP ݱP ޱKP ߱wP P  P & %  delWorkMenuP  P & %  delWorkPanelP  P &% cancelRemoveWorkItem:P K P &% deleteAllWorkItems:P w P &% okRemoveWorkItem:P  3P &% workMenuP  #P &% reanalysisMenuP  P &% toggleShowTagsMenuItemP 1 SP 1 SP &% submenuAction:P 1P 2P  P 2 P & %  editFileSet:P   P & %  loadAllFiles:P  1P & %  fileSetMenuP  P & %  docMacroMenuP  P &% insertTAMSText:P ' P &% doFindButtons:P ) P &% doTurnTextToButton:P  P &% addItemToToolbar:P  ԐP  P &% submenuAction:P  P  P   P &% runSummaryReport:P  P &% summReportMenuP  P &% clearAllWorkItems:P  P &% removeWorkItem:P 5 P &% addSelfToWorkMenu:P  K P  KP & %  findNext:P  KP & %  findPrevious:P  KP &% takeFindStringFromSelection:P  KP &% jumpToSelection:P  KP &% orderFrontFindPanel:P !  wP "  P #&% copyWithoutTags:P $1 GSMutableSet1! NSMutableSet1"NSSet&  L {gtamsanalyzer.app-0.42/Source/GTAMSAnalyzerInfo.plist0000644000175000017500000000672610162465511023073 0ustar brentbrent00000000000000{ ApplicationDescription = "Qualitative Research Tools for the Free World"; ApplicationIcon = ""; ApplicationName = GTAMSAnalyzer; ApplicationRelease = 0.42; Authors = "Matthew Weinstein"; Copyright = "Copyright (C) 2004 by Matthew Weinstein"; CopyrightDescription = "Released under GPL"; FullVersionID = 0.42; NOTE = "Automatically generated!"; URL = "http://educ.kent.edu/~mweinste/tams"; NSTypes = ( { NSName = "XML TAMS Project"; NSHumanReadableName = "XML TAMS Project"; NSUnixExtensions = ("xtprj"); NSDOSExtensions = ("xtprj"); NSIcon = "tproj2 icon"; NSRole = Editor; NSDocumentClass = myProject }, { NSName = "TAMS Project"; NSHumanReadableName = "TAMS Project"; NSUnixExtensions = ("gtprj"); NSDOSExtensions = ("gtprj"); NSIcon = "tproj2 icon"; NSRole = Editor; NSDocumentClass = myProject }, { NSName = "Rich text file"; NSHumanReadableName = "Rich text file"; NSUnixExtensions = ("rtf"); NSDOSExtensions = ("rtf"); NSMIMETypes = ("text/rtf"); NSIcon = FileIcon_rtf; NSRole = Editor; NSDocumentClass = MyDocument; }, { NSName = "rtfd"; NSHumanReadableName = "RTFD Document"; NSUnixExtensions = ("rtfd"); NSDOSExtensions = ("rtfd"); NSIcon = FileIcon_rtf; NSRole = Editor; NSDocumentClass = MyDocument; }, { NSName = "RTFD Document"; NSHumanReadableName = "RTFD Document"; NSUnixExtensions = ("rtfd"); NSDOSExtensions = ("rtfd"); NSIcon = FileIcon_rtf; NSRole = Editor; NSDocumentClass = Document; }, { NSName = "Text"; NSHumanReadableName = "Text Document"; NSUnixExtensions = ("txt"); NSDOSExtensions = ("txt"); NSMIMETypes = ("text/plain"); NSIcon = FileIcon_txt; NSRole = Editor; NSDocumentClass = MyDocument; }, { NSName = "XML TAMS Result"; NSHumanReadableName = "XML TAMS Result"; NSUnixExtensions = ("xtrs"); NSDOSExtensions = ("xtrs"); NSMIMETypes = ("text/plain"); NSIcon = "tams result icon small.tif"; NSRole = Editor; NSDocumentClass = myResults; }, { NSName = "TAMS Result"; NSHumanReadableName = "TAMS Result"; NSUnixExtensions = ("gtrs"); NSDOSExtensions = ("gtrs"); NSIcon = "tams result icon small.tif"; NSRole = Editor; NSDocumentClass = myResults; }, { NSName = "Text"; NSHumanReadableName = "Text"; NSUnixExtensions = ("txt"); NSDOSExtensions = ("txt"); NSIcon = "FileIcon_txt"; NSRole = Editor; NSDocumentClass = MWSummaryReport; }, { NSName = "Text"; NSHumanReadableName = "Text"; NSUnixExtensions = ("txt"); NSDOSExtensions = ("txt"); NSIcon = "FileIcon_txt"; NSRole = Editor; NSDocumentClass = MWKappa; } ); }gtamsanalyzer.app-0.42/Source/info.plist0000555000175000017500000001127310162465511020623 0ustar brentbrent00000000000000 CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions xtprj CFBundleTypeIconFile tamsProjIcon2b CFBundleTypeName XML TAMS Project CFBundleTypeRole Editor NSDocumentClass myProject CFBundleTypeExtensions tprj CFBundleTypeIconFile tamsProjIcon2c CFBundleTypeName TAMS Project CFBundleTypeRole Editor NSDocumentClass myProject CFBundleTypeExtensions rtf CFBundleTypeName Rich text file CFBundleTypeRole Editor NSDocumentClass MyDocument CFBundleTypeExtensions xtrs CFBundleTypeName XML TAMS Result CFBundleTypeRole Editor NSDocumentClass myResults CFBundleTypeExtensions trs CFBundleTypeIconFile tamsRsltIcon2c CFBundleTypeName TAMS Result CFBundleTypeRole Editor NSDocumentClass myResults NSExportableAs Text XML CFBundleTypeExtensions txt3 CFBundleTypeName TabbedText CFBundleTypeRole Editor NSDocumentClass tableBrowser NSExportableAs Text CFBundleTypeExtensions xml CFBundleTypeName XML CFBundleTypeRole None CFBundleTypeExtensions txt CFBundleTypeName Tabbed Text CFBundleTypeRole Editor NSDocumentClass MWKappa NSExportableAs Text CFBundleTypeExtensions txt CFBundleTypeName Tabbed Text CFBundleTypeRole Editor NSDocumentClass MWSummaryReport CFBundleTypeExtensions rtfd CFBundleTypeName RTFD CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass MyDocument CFBundleTypeExtensions txt CFBundleTypeName Text CFBundleTypeOSTypes TEXT CFBundleTypeRole Editor NSDocumentClass MyDocument CFBundleExecutable TamsAnalyzer CFBundleGetInfoString TAMS Analyzer: a qualitative research tool CFBundleIconFile tamsAppIcon2d CFBundleIdentifier com.maydaysoftware.tamsanalyzer CFBundleInfoDictionaryVersion 6.0 CFBundleName TAMS Analyzer CFBundlePackageType APPL CFBundleShortVersionString 2.3 CFBundleSignature tamS CFBundleVersion 2.4 NSAppleScriptEnabled YES NSMainNibFile MainMenu NSPrincipalClass NSApplication gtamsanalyzer.app-0.42/Source/internal.h0000555000175000017500000007057710162465511020614 0ustar brentbrent00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2003 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* This header contains definitions that are shared between the different modules, but which are not relevant to the outside. */ /* Get the definitions provided by running "configure" */ #include "config.h" /* Standard C headers plus the external interface definition. The only time setjmp and stdarg are used is when NO_RECURSE is set. */ #include #include #include #include #include #include #include #include #ifndef PCRE_SPY #define PCRE_DEFINITION /* Win32 __declspec(export) trigger for .dll */ #endif #include "pcre.h" /* When compiling for use with the Virtual Pascal compiler, these functions need to have their names changed. PCRE must be compiled with the -DVPCOMPAT option on the command line. */ #ifdef VPCOMPAT #define strncmp(s1,s2,m) _strncmp(s1,s2,m) #define memcpy(d,s,n) _memcpy(d,s,n) #define memmove(d,s,n) _memmove(d,s,n) #define memset(s,c,n) _memset(s,c,n) #else /* VPCOMPAT */ /* To cope with SunOS4 and other systems that lack memmove() but have bcopy(), define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY is set. Otherwise, include an emulating function for those systems that have neither (there some non-Unix environments where this is the case). This assumes that all calls to memmove are moving strings upwards in store, which is the case in PCRE. */ #if ! HAVE_MEMMOVE #undef memmove /* some systems may have a macro */ #if HAVE_BCOPY #define memmove(a, b, c) bcopy(b, a, c) #else /* HAVE_BCOPY */ void * pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n) { int i; dest += n; src += n; for (i = 0; i < n; ++i) *(--dest) = *(--src); } #define memmove(a, b, c) pcre_memmove(a, b, c) #endif /* not HAVE_BCOPY */ #endif /* not HAVE_MEMMOVE */ #endif /* not VPCOMPAT */ /* PCRE keeps offsets in its compiled code as 2-byte quantities by default. These are used, for example, to link from the start of a subpattern to its alternatives and its end. The use of 2 bytes per offset limits the size of the compiled regex to around 64K, which is big enough for almost everybody. However, I received a request for an even bigger limit. For this reason, and also to make the code easier to maintain, the storing and loading of offsets from the byte string is now handled by the macros that are defined here. The macros are controlled by the value of LINK_SIZE. This defaults to 2 in the config.h file, but can be overridden by using -D on the command line. This is automated on Unix systems via the "configure" command. */ #if LINK_SIZE == 2 #define PUT(a,n,d) \ (a[n] = (d) >> 8), \ (a[(n)+1] = (d) & 255) #define GET(a,n) \ (((a)[n] << 8) | (a)[(n)+1]) #define MAX_PATTERN_SIZE (1 << 16) #elif LINK_SIZE == 3 #define PUT(a,n,d) \ (a[n] = (d) >> 16), \ (a[(n)+1] = (d) >> 8), \ (a[(n)+2] = (d) & 255) #define GET(a,n) \ (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2]) #define MAX_PATTERN_SIZE (1 << 24) #elif LINK_SIZE == 4 #define PUT(a,n,d) \ (a[n] = (d) >> 24), \ (a[(n)+1] = (d) >> 16), \ (a[(n)+2] = (d) >> 8), \ (a[(n)+3] = (d) & 255) #define GET(a,n) \ (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3]) #define MAX_PATTERN_SIZE (1 << 30) /* Keep it positive */ #else #error LINK_SIZE must be either 2, 3, or 4 #endif /* Convenience macro defined in terms of the others */ #define PUTINC(a,n,d) PUT(a,n,d), a += LINK_SIZE /* PCRE uses some other 2-byte quantities that do not change when the size of offsets changes. There are used for repeat counts and for other things such as capturing parenthesis numbers in back references. */ #define PUT2(a,n,d) \ a[n] = (d) >> 8; \ a[(n)+1] = (d) & 255 #define GET2(a,n) \ (((a)[n] << 8) | (a)[(n)+1]) #define PUT2INC(a,n,d) PUT2(a,n,d), a += 2 /* In case there is no definition of offsetof() provided - though any proper Standard C system should have one. */ #ifndef offsetof #define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field)) #endif /* These are the public options that can change during matching. */ #define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL) /* Private options flags start at the most significant end of the four bytes, but skip the top bit so we can use ints for convenience without getting tangled with negative values. The public options defined in pcre.h start at the least significant end. Make sure they don't overlap, though now that we have expanded to four bytes there is plenty of space. */ #define PCRE_FIRSTSET 0x40000000 /* first_byte is set */ #define PCRE_REQCHSET 0x20000000 /* req_byte is set */ #define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */ #define PCRE_ICHANGED 0x08000000 /* i option changes within regex */ /* Options for the "extra" block produced by pcre_study(). */ #define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */ /* Masks for identifying the public options which are permitted at compile time, run time or study time, respectively. */ #define PUBLIC_OPTIONS \ (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \ PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK) #define PUBLIC_EXEC_OPTIONS \ (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK) #define PUBLIC_STUDY_OPTIONS 0 /* None defined */ /* Magic number to provide a small check against being handed junk. */ #define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ /* Negative values for the firstchar and reqchar variables */ #define REQ_UNSET (-2) #define REQ_NONE (-1) /* Flags added to firstbyte or reqbyte; a "non-literal" item is either a variable-length repeat, or a anything other than literal characters. */ #define REQ_CASELESS 0x0100 /* indicates caselessness */ #define REQ_VARY 0x0200 /* reqbyte followed non-literal item */ /* Miscellaneous definitions */ typedef int BOOL; #define FALSE 0 #define TRUE 1 /* Escape items that are just an encoding of a particular data value. Note that ESC_n is defined as yet another macro, which is set in config.h to either \n (the default) or \r (which some people want). */ #ifndef ESC_e #define ESC_e 27 #endif #ifndef ESC_f #define ESC_f '\f' #endif #ifndef ESC_n #define ESC_n NEWLINE #endif #ifndef ESC_r #define ESC_r '\r' #endif /* We can't officially use ESC_t because it is a POSIX reserved identifier (presumably because of all the others like size_t). */ #ifndef ESC_tee #define ESC_tee '\t' #endif /* These are escaped items that aren't just an encoding of a particular data value such as \n. They must have non-zero values, as check_escape() returns their negation. Also, they must appear in the same order as in the opcode definitions below, up to ESC_z. There's a dummy for OP_ANY because it corresponds to "." rather than an escape sequence. The final one must be ESC_REF as subsequent values are used for \1, \2, \3, etc. There is are two tests in the code for an escape greater than ESC_b and less than ESC_Z to detect the types that may be repeated. These are the types that consume a character. If any new escapes are put in between that don't consume a character, that code will have to change. */ enum { ESC_A = 1, ESC_G, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, ESC_w, ESC_dum1, ESC_C, ESC_Z, ESC_z, ESC_E, ESC_Q, ESC_REF }; /* Flag bits and data types for the extended class (OP_XCLASS) for classes that contain UTF-8 characters with values greater than 255. */ #define XCL_NOT 0x01 /* Flag: this is a negative class */ #define XCL_MAP 0x02 /* Flag: a 32-byte map is present */ #define XCL_END 0 /* Marks end of individual items */ #define XCL_SINGLE 1 /* Single item (one multibyte char) follows */ #define XCL_RANGE 2 /* A range (two multibyte chars) follows */ /* Opcode table: OP_BRA must be last, as all values >= it are used for brackets that extract substrings. Starting from 1 (i.e. after OP_END), the values up to OP_EOD must correspond in order to the list of escapes immediately above. Note that whenever this list is updated, the two macro definitions that follow must also be updated to match. */ enum { OP_END, /* 0 End of pattern */ /* Values corresponding to backslashed metacharacters */ OP_SOD, /* 1 Start of data: \A */ OP_SOM, /* 2 Start of match (subject + offset): \G */ OP_NOT_WORD_BOUNDARY, /* 3 \B */ OP_WORD_BOUNDARY, /* 4 \b */ OP_NOT_DIGIT, /* 5 \D */ OP_DIGIT, /* 6 \d */ OP_NOT_WHITESPACE, /* 7 \S */ OP_WHITESPACE, /* 8 \s */ OP_NOT_WORDCHAR, /* 9 \W */ OP_WORDCHAR, /* 10 \w */ OP_ANY, /* 11 Match any character */ OP_ANYBYTE, /* 12 Match any byte (\C); different to OP_ANY for UTF-8 */ OP_EODN, /* 13 End of data or \n at end of data: \Z. */ OP_EOD, /* 14 End of data: \z */ OP_OPT, /* 15 Set runtime options */ OP_CIRC, /* 16 Start of line - varies with multiline switch */ OP_DOLL, /* 17 End of line - varies with multiline switch */ OP_CHARS, /* 18 Match string of characters */ OP_NOT, /* 19 Match anything but the following char */ OP_STAR, /* 20 The maximizing and minimizing versions of */ OP_MINSTAR, /* 21 all these opcodes must come in pairs, with */ OP_PLUS, /* 22 the minimizing one second. */ OP_MINPLUS, /* 23 This first set applies to single characters */ OP_QUERY, /* 24 */ OP_MINQUERY, /* 25 */ OP_UPTO, /* 26 From 0 to n matches */ OP_MINUPTO, /* 27 */ OP_EXACT, /* 28 Exactly n matches */ OP_NOTSTAR, /* 29 The maximizing and minimizing versions of */ OP_NOTMINSTAR, /* 30 all these opcodes must come in pairs, with */ OP_NOTPLUS, /* 31 the minimizing one second. */ OP_NOTMINPLUS, /* 32 This set applies to "not" single characters */ OP_NOTQUERY, /* 33 */ OP_NOTMINQUERY, /* 34 */ OP_NOTUPTO, /* 35 From 0 to n matches */ OP_NOTMINUPTO, /* 36 */ OP_NOTEXACT, /* 37 Exactly n matches */ OP_TYPESTAR, /* 38 The maximizing and minimizing versions of */ OP_TYPEMINSTAR, /* 39 all these opcodes must come in pairs, with */ OP_TYPEPLUS, /* 40 the minimizing one second. These codes must */ OP_TYPEMINPLUS, /* 41 be in exactly the same order as those above. */ OP_TYPEQUERY, /* 42 This set applies to character types such as \d */ OP_TYPEMINQUERY, /* 43 */ OP_TYPEUPTO, /* 44 From 0 to n matches */ OP_TYPEMINUPTO, /* 45 */ OP_TYPEEXACT, /* 46 Exactly n matches */ OP_CRSTAR, /* 47 The maximizing and minimizing versions of */ OP_CRMINSTAR, /* 48 all these opcodes must come in pairs, with */ OP_CRPLUS, /* 49 the minimizing one second. These codes must */ OP_CRMINPLUS, /* 50 be in exactly the same order as those above. */ OP_CRQUERY, /* 51 These are for character classes and back refs */ OP_CRMINQUERY, /* 52 */ OP_CRRANGE, /* 53 These are different to the three seta above. */ OP_CRMINRANGE, /* 54 */ OP_CLASS, /* 55 Match a character class, chars < 256 only */ OP_NCLASS, /* 56 Same, but the bitmap was created from a negative class - the difference is relevant only when a UTF-8 character > 255 is encountered. */ OP_XCLASS, /* 57 Extended class for handling UTF-8 chars within the class. This does both positive and negative. */ OP_REF, /* 58 Match a back reference */ OP_RECURSE, /* 59 Match a numbered subpattern (possibly recursive) */ OP_CALLOUT, /* 60 Call out to external function if provided */ OP_ALT, /* 61 Start of alternation */ OP_KET, /* 62 End of group that doesn't have an unbounded repeat */ OP_KETRMAX, /* 63 These two must remain together and in this */ OP_KETRMIN, /* 64 order. They are for groups the repeat for ever. */ /* The assertions must come before ONCE and COND */ OP_ASSERT, /* 65 Positive lookahead */ OP_ASSERT_NOT, /* 66 Negative lookahead */ OP_ASSERTBACK, /* 67 Positive lookbehind */ OP_ASSERTBACK_NOT, /* 68 Negative lookbehind */ OP_REVERSE, /* 69 Move pointer back - used in lookbehind assertions */ /* ONCE and COND must come after the assertions, with ONCE first, as there's a test for >= ONCE for a subpattern that isn't an assertion. */ OP_ONCE, /* 70 Once matched, don't back up into the subpattern */ OP_COND, /* 71 Conditional group */ OP_CREF, /* 72 Used to hold an extraction string number (cond ref) */ OP_BRAZERO, /* 73 These two must remain together and in this */ OP_BRAMINZERO, /* 74 order. */ OP_BRANUMBER, /* 75 Used for extracting brackets whose number is greater than can fit into an opcode. */ OP_BRA /* 76 This and greater values are used for brackets that extract substrings up to a basic limit. After that, use is made of OP_BRANUMBER. */ }; /* WARNING: There is an implicit assumption in study.c that all opcodes are less than 128 in value. This makes handling UTF-8 character sequences easier. */ /* This macro defines textual names for all the opcodes. There are used only for debugging, in pcre.c when DEBUG is defined, and also in pcretest.c. The macro is referenced only in printint.c. */ #define OP_NAME_LIST \ "End", "\\A", "\\G", "\\B", "\\b", "\\D", "\\d", \ "\\S", "\\s", "\\W", "\\w", "Any", "Anybyte", "\\Z", "\\z", \ "Opt", "^", "$", "chars", "not", \ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", \ "class", "nclass", "xclass", "Ref", "Recurse", "Callout", \ "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", \ "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cond ref",\ "Brazero", "Braminzero", "Branumber", "Bra" /* This macro defines the length of fixed length operations in the compiled regex. The lengths are used when searching for specific things, and also in the debugging printing of a compiled regex. We use a macro so that it can be incorporated both into pcre.c and pcretest.c without being publicly exposed. As things have been extended, some of these are no longer fixed lenths, but are minima instead. For example, the length of a single-character repeat may vary in UTF-8 mode. The code that uses this table must know about such things. */ #define OP_LENGTHS \ 1, /* End */ \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* \A, \G, \B, \B, \D, \d, \S, \s, \W, \w */ \ 1, 1, 1, 1, 2, 1, 1, /* Any, Anybyte, \Z, \z, Opt, ^, $ */ \ 2, /* Chars - the minimum length */ \ 2, /* not */ \ /* Positive single-char repeats ** These are */ \ 2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** minima in */ \ 4, 4, 4, /* upto, minupto, exact ** UTF-8 mode */ \ /* Negative single-char repeats - only for chars < 256 */ \ 2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \ 4, 4, 4, /* NOT upto, minupto, exact */ \ /* Positive type repeats */ \ 2, 2, 2, 2, 2, 2, /* Type *, *?, +, +?, ?, ?? */ \ 4, 4, 4, /* Type upto, minupto, exact */ \ /* Character class & ref repeats */ \ 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ \ 5, 5, /* CRRANGE, CRMINRANGE */ \ 33, /* CLASS */ \ 33, /* NCLASS */ \ 0, /* XCLASS - variable length */ \ 3, /* REF */ \ 1+LINK_SIZE, /* RECURSE */ \ 2, /* CALLOUT */ \ 1+LINK_SIZE, /* Alt */ \ 1+LINK_SIZE, /* Ket */ \ 1+LINK_SIZE, /* KetRmax */ \ 1+LINK_SIZE, /* KetRmin */ \ 1+LINK_SIZE, /* Assert */ \ 1+LINK_SIZE, /* Assert not */ \ 1+LINK_SIZE, /* Assert behind */ \ 1+LINK_SIZE, /* Assert behind not */ \ 1+LINK_SIZE, /* Reverse */ \ 1+LINK_SIZE, /* Once */ \ 1+LINK_SIZE, /* COND */ \ 3, /* CREF */ \ 1, 1, /* BRAZERO, BRAMINZERO */ \ 3, /* BRANUMBER */ \ 1+LINK_SIZE /* BRA */ \ /* The highest extraction number before we have to start using additional bytes. (Originally PCRE didn't have support for extraction counts highter than this number.) The value is limited by the number of opcodes left after OP_BRA, i.e. 255 - OP_BRA. We actually set it a bit lower to leave room for additional opcodes. */ #define EXTRACT_BASIC_MAX 150 /* A magic value for OP_CREF to indicate the "in recursion" condition. */ #define CREF_RECURSE 0xffff /* The texts of compile-time error messages are defined as macros here so that they can be accessed by the POSIX wrapper and converted into error codes. Yes, I could have used error codes in the first place, but didn't feel like changing just to accommodate the POSIX wrapper. */ #define ERR1 "\\ at end of pattern" #define ERR2 "\\c at end of pattern" #define ERR3 "unrecognized character follows \\" #define ERR4 "numbers out of order in {} quantifier" #define ERR5 "number too big in {} quantifier" #define ERR6 "missing terminating ] for character class" #define ERR7 "invalid escape sequence in character class" #define ERR8 "range out of order in character class" #define ERR9 "nothing to repeat" #define ERR10 "operand of unlimited repeat could match the empty string" #define ERR11 "internal error: unexpected repeat" #define ERR12 "unrecognized character after (?" #define ERR13 "POSIX named classes are supported only within a class" #define ERR14 "missing )" #define ERR15 "reference to non-existent subpattern" #define ERR16 "erroffset passed as NULL" #define ERR17 "unknown option bit(s) set" #define ERR18 "missing ) after comment" #define ERR19 "parentheses nested too deeply" #define ERR20 "regular expression too large" #define ERR21 "failed to get memory" #define ERR22 "unmatched parentheses" #define ERR23 "internal error: code overflow" #define ERR24 "unrecognized character after (?<" #define ERR25 "lookbehind assertion is not fixed length" #define ERR26 "malformed number after (?(" #define ERR27 "conditional group contains more than two branches" #define ERR28 "assertion expected after (?(" #define ERR29 "(?R or (?digits must be followed by )" #define ERR30 "unknown POSIX class name" #define ERR31 "POSIX collating elements are not supported" #define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support" #define ERR33 "spare error" #define ERR34 "character value in \\x{...} sequence is too large" #define ERR35 "invalid condition (?(0)" #define ERR36 "\\C not allowed in lookbehind assertion" #define ERR37 "PCRE does not support \\L, \\l, \\N, \\P, \\p, \\U, \\u, or \\X" #define ERR38 "number after (?C is > 255" #define ERR39 "closing ) for (?C expected" #define ERR40 "recursive call could loop indefinitely" #define ERR41 "unrecognized character after (?P" #define ERR42 "syntax error after (?P" #define ERR43 "two named groups have the same name" #define ERR44 "invalid UTF-8 string" /* All character handling must be done as unsigned characters. Otherwise there are problems with top-bit-set characters and functions such as isspace(). However, we leave the interface to the outside world as char *, because that should make things easier for callers. We define a short type for unsigned char to save lots of typing. I tried "uchar", but it causes problems on Digital Unix, where it is defined in sys/types, so use "uschar" instead. */ typedef unsigned char uschar; /* The real format of the start of the pcre block; the index of names and the code vector run on as long as necessary after the end. */ typedef struct real_pcre { unsigned long int magic_number; size_t size; /* Total that was malloced */ const unsigned char *tables; /* Pointer to tables */ unsigned long int options; unsigned short int top_bracket; unsigned short int top_backref; unsigned short int first_byte; unsigned short int req_byte; unsigned short int name_entry_size; /* Size of any name items; 0 => none */ unsigned short int name_count; /* Number of name items */ } real_pcre; /* The format of the block used to store data from pcre_study(). */ typedef struct pcre_study_data { size_t size; /* Total that was malloced */ uschar options; uschar start_bits[32]; } pcre_study_data; /* Structure for passing "static" information around between the functions doing the compiling, so that they are thread-safe. */ typedef struct compile_data { const uschar *lcc; /* Points to lower casing table */ const uschar *fcc; /* Points to case-flipping table */ const uschar *cbits; /* Points to character type table */ const uschar *ctypes; /* Points to table of type maps */ const uschar *start_code; /* The start of the compiled code */ uschar *name_table; /* The name/number table */ int names_found; /* Number of entries so far */ int name_entry_size; /* Size of each entry */ int top_backref; /* Maximum back reference */ unsigned int backref_map; /* Bitmap of low back refs */ int req_varyopt; /* "After variable item" flag for reqbyte */ } compile_data; /* Structure for maintaining a chain of pointers to the currently incomplete branches, for testing for left recursion. */ typedef struct branch_chain { struct branch_chain *outer; uschar *current; } branch_chain; /* Structure for items in a linked list that represents an explicit recursive call within the pattern. */ typedef struct recursion_info { struct recursion_info *prevrec; /* Previous recursion record (or NULL) */ int group_num; /* Number of group that was called */ const uschar *after_call; /* "Return value": points after the call in the expr */ const uschar *save_start; /* Old value of md->start_match */ int *offset_save; /* Pointer to start of saved offsets */ int saved_max; /* Number of saved offsets */ } recursion_info; /* When compiling in a mode that doesn't use recursive calls to match(), a structure is used to remember local variables on the heap. It is defined in pcre.c, close to the match() function, so that it is easy to keep it in step with any changes of local variable. However, the pointer to the current frame must be saved in some "static" place over a longjmp(). We declare the structure here so that we can put a pointer in the match_data structure. NOTE: This isn't used for a "normal" compilation of pcre. */ struct heapframe; /* Structure for passing "static" information around between the functions doing the matching, so that they are thread-safe. */ typedef struct match_data { unsigned long int match_call_count; /* As it says */ unsigned long int match_limit;/* As it says */ int *offset_vector; /* Offset vector */ int offset_end; /* One past the end */ int offset_max; /* The maximum usable for return data */ const uschar *lcc; /* Points to lower casing table */ const uschar *ctypes; /* Points to table of type maps */ BOOL offset_overflow; /* Set if too many extractions */ BOOL notbol; /* NOTBOL flag */ BOOL noteol; /* NOTEOL flag */ BOOL utf8; /* UTF8 flag */ BOOL endonly; /* Dollar not before final \n */ BOOL notempty; /* Empty string match not wanted */ const uschar *start_code; /* For use when recursing */ const uschar *start_subject; /* Start of the subject string */ const uschar *end_subject; /* End of the subject string */ const uschar *start_match; /* Start of this match attempt */ const uschar *end_match_ptr; /* Subject position at end match */ int end_offset_top; /* Highwater mark at end of match */ int capture_last; /* Most recent capture number */ int start_offset; /* The start offset value */ recursion_info *recursive; /* Linked list of recursion data */ void *callout_data; /* To pass back to callouts */ struct heapframe *thisframe; /* Used only when compiling for no recursion */ } match_data; /* Bit definitions for entries in the pcre_ctypes table. */ #define ctype_space 0x01 #define ctype_letter 0x02 #define ctype_digit 0x04 #define ctype_xdigit 0x08 #define ctype_word 0x10 /* alphameric or '_' */ #define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */ /* Offsets for the bitmap tables in pcre_cbits. Each table contains a set of bits for a class map. Some classes are built by combining these tables. */ #define cbit_space 0 /* [:space:] or \s */ #define cbit_xdigit 32 /* [:xdigit:] */ #define cbit_digit 64 /* [:digit:] or \d */ #define cbit_upper 96 /* [:upper:] */ #define cbit_lower 128 /* [:lower:] */ #define cbit_word 160 /* [:word:] or \w */ #define cbit_graph 192 /* [:graph:] */ #define cbit_print 224 /* [:print:] */ #define cbit_punct 256 /* [:punct:] */ #define cbit_cntrl 288 /* [:cntrl:] */ #define cbit_length 320 /* Length of the cbits table */ /* Offsets of the various tables from the base tables pointer, and total length. */ #define lcc_offset 0 #define fcc_offset 256 #define cbits_offset 512 #define ctypes_offset (cbits_offset + cbit_length) #define tables_length (ctypes_offset + 256) /* End of internal.h */ gtamsanalyzer.app-0.42/Source/kappa.gorm/0000755000175000017500000000000010162465511020645 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/kappa.gorm/data.classes0000644000175000017500000000700511062075657023147 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:" ); Super = NSObject; }; MWKappa = { Actions = ( ); Outlets = ( theMessage, theFileTitle, ansTable, theTable, myWindow ); Super = tableBrowser; }; tableBrowser = { Actions = ( ); Outlets = ( ); Super = NSDocument; }; }gtamsanalyzer.app-0.42/Source/kappa.gorm/data.info0000644000175000017500000000027011062075657022442 0ustar brentbrent00000000000000GNUstep archive00002a96:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed Streamgtamsanalyzer.app-0.42/Source/kappa.gorm/objects.gorm0000644000175000017500000002005711062075657023200 0ustar brentbrent00000000000000GNUstep archive00002a96:00000022:000000d1:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString& %  TableColumn201 NSTableColumn0&% Item B B GP01NSTableHeaderCell1NSTextFieldCell1 NSActionCell1 NSCell0&% Item01 NSFont% &&&&&&&&%0 1 NSColor0 &%NSNamedColorSpace0 &% System0 & %  controlColor0 0&% System0&% windowFrameTextColor00&% nine0 %&&&&&&&&%0 0&% textBackgroundColor0 0& %  textColor0& %  ScrollView101 NSScrollView1NSView1 NSResponder% @@  D C  D C&01NSMutableArray1NSArray&01 NSClipView% A A D C  D C&0&01 NSTableView1 NSControl%  D C!  D C!&0&%0 0&&&&&&&&&0 &0!0"&% Coder 1 C> A GP0#0$&% Coder 1&&&&&&&&%0% 0&&% controlShadowColor 0'&&&&&&&&%0(0)&% Coder 2 C A GP0*0+&% Coder 2&&&&&&&&%%0, 0-&% System0.&% windowFrameTextColor0/&&&&&&&&%00 -01&% textBackgroundColor02 -03& %  textColor04 05& %  gridColor06 07&%NSCalibratedWhiteColorSpace ?G ?081NSTableHeaderView%  D A  D A&09&0:1GSTableCornerView% @ @ A A  A A&0;&%% A @ @@60<1 NSScroller% @ A A C  A C&0=&%0> &&&&&&&&&2 _doScroll:v12@0:4@8:0?% A @ D A  D A&0@&80A 0B& %  controlColor% A A A A <?0C& %  TableColumn3!0D&%NSOwner0E&% MWKappa0F& %  TextField10G1 NSTextField% A C D@ A  D@ A& 0H&%0I0J&% a0K % A`&&&&&&&&%0L 0M&% System0N&% textBackgroundColor0O M0P& %  textColor0Q& %  ScrollView0R % A A  D@ C@  D@ C@&0S&0T% A A D Ck  D Ck&0U&0V%  D C!  D C!&0W&%0X 0Y&&&&&&&&&0Z&0[0\&% column1 BP A GP0]0^&%  &&&&&&&&%0_ 0`&%System0a&%controlShadowColor0b 0c&% System0d&% windowFrameTextColor0e0f&%neuff&&&&&&&&%0g c0h&% textBackgroundColor0i c0j& %  textColor0k0l&% column2 C A GP0m0n&%  &&&&&&&&%_b0o0p&%ninep&&&&&&&&%gi0q c0r& %  gridColor0s c0t&% controlBackgroundColor0u%  D A  D A&0v&0w% @ @ A A  A A&0x&%% A @ @@s0y% @ A A C~  A C~&0z&%0{ Y&&&&&&&&&Rw0|% A @ D A  D A&0}&u0~ c0& %  controlColor0% A C@ D A  D A&0&%0 0&&&&&&&&&&RT% A A A A y|0& %  TextField0% A C@ D@ A  D@ A& 0&%00&% aK&&&&&&&&%0 0&% System0&% textBackgroundColor0 0& %  textColor0& %  GormNSWindow01NSWindow%  D C&% CB D@0%  D C  D C&0&01 NSTabView%  D C  D C&0&0% ? ? D @ C@  D @ C@&0&GR0&01 NSTabViewItem0&% item 10&% Kappa%00&% item 20&% Codes0% ? ? D @ C@  D @ C@&0&%%%0 -0&% windowBackgroundColor0&% Window0&% Window0&%Window ? A F@ F@%01NSImage0&%NSApplicationIcon0&% TabView0&% GSCustomClassMap0&0& %  TableColumn[0&% GormNSTableView10&% GormNSTableViewV0& %  TableColumn1k0&01NSNibConnector0&%NSOwner000F0Q0000000C01NSNibOutletConnector0& %  theFileTitle0F0& %  theMessage001NSMutableString&% theTable00±&% _window0ñ0ı&% myWindow0ű0Ʊ&% ansTable0DZ0ȱ&% windowController0ɱ0ʱ&% delegate0˱0̱& %  dataSource0ͱ0α&% delegate0ϱ0б& %  dataSource01 GSMutableSet1! NSMutableSet1"NSSet&gtamsanalyzer.app-0.42/Source/largeApp.tif0000555000175000017500000002360010162465511021047 0ustar brentbrent00000000000000MM*&H %&.Z] %&%HJWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW(OQWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW;=WWWWWWVVWWWWWWWWWWWWWWWWWVWWWWWVVWWWWWWWWV~T|SzSzU}V~WWWWWWWWWWWWWVU}T|U}VWWWV~SzSzT|V~W9;WWWWWV~S{OtLpMqQxU}WWWWWWWWWWWWWU}QxOtQxU}VWWU}MqLpOtS{V~WWWWWWT|OtGiDdGiOtT|VWWWWWWVWWWWSzLpGiLpSzV~WVT|GiDdGiOtT|VWWWWWWSzJmBaCbJlVVVWWWU}T|U}V~WWRxHjQwU}VVU}JlCbBaJmSzV~EfWWWWWWQxGi@^EeT{U}SzSzT|V~VU}PuQwT{V~WFh?]NrRyT|V~V~NsEe@^GiQxV~RyWWWWU~PvFg@^PvT|SzKoKoOtS{U~T|PuHjOtSzV~QwEf=Y?]KnOtS{V~U}@^FgPvU~WWWWWWV~NsDe@^PvRyNsCcCbGiOtT|T|JmGhIkOtS{PvDe9T9TCbHjNsS{QxGi@^DeNsT{QwWWWWWU}IkA`@^PuNsHjBa@^BaJmRyS{NsGiEeIkPvPvDd8S9TCcDdHjOtRxIk@^A`IkQwCcWWWWVT|Ef?\@^NsJlFhBb@^GiU~T|PvIkCcFgNsEe;WGiIlDdCbKnRxJl@^?\EfOt/EWWWWU}IkA`@^Hj@^Bb>[EfQwU}SzNsGiEeIkPvPvBaKoLpEeA`IkQxIk@^A`IkQwWWWWV~NsDe@^FgLpGh@^BbDe>[:VCcOtS{PvJmGhIkOtS{U}QwEf;W?\GiIlDdCbKnQwGh@^DeNs>[WWWWU~@^EfMqIkA`@^?\9T7Q@^MqRyOuKnJmOtSzV~V~QwEf;V;V@_CcDdSzPvFg@^FgPvWWWWV~QxGi@^DdLpLpGhBa@^=Y #define APP_NAME @"GNUstep" /* * Initialise and go! */ int main(int argc, const char *argv[]) { return NSApplicationMain (argc, argv); } gtamsanalyzer.app-0.42/Source/maketables.c0000555000175000017500000001070310162465511021064 0ustar brentbrent00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by: Philip Hazel Copyright (c) 1997-2003 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- See the file Tech.Notes for some information on the internals. */ /* This file is compiled on its own as part of the PCRE library. However, it is also included in the compilation of dftables.c, in which case the macro DFTABLES is defined. */ #ifndef DFTABLES #include "internal.h" #endif /************************************************* * Create PCRE character tables * *************************************************/ /* This function builds a set of character tables for use by PCRE and returns a pointer to them. They are build using the ctype functions, and consequently their contents will depend upon the current locale setting. When compiled as part of the library, the store is obtained via pcre_malloc(), but when compiled inside dftables, use malloc(). Arguments: none Returns: pointer to the contiguous block of data */ const unsigned char * pcre_maketables(void) { unsigned char *yield, *p; int i; #ifndef DFTABLES yield = (unsigned char*)(pcre_malloc)(tables_length); #else yield = (unsigned char*)malloc(tables_length); #endif if (yield == NULL) return NULL; p = yield; /* First comes the lower casing table */ for (i = 0; i < 256; i++) *p++ = tolower(i); /* Next the case-flipping table */ for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i); /* Then the character class tables. Don't try to be clever and save effort on exclusive ones - in some locales things may be different. Note that the table for "space" includes everything "isspace" gives, including VT in the default locale. This makes it work for the POSIX class [:space:]. */ memset(p, 0, cbit_length); for (i = 0; i < 256; i++) { if (isdigit(i)) { p[cbit_digit + i/8] |= 1 << (i&7); p[cbit_word + i/8] |= 1 << (i&7); } if (isupper(i)) { p[cbit_upper + i/8] |= 1 << (i&7); p[cbit_word + i/8] |= 1 << (i&7); } if (islower(i)) { p[cbit_lower + i/8] |= 1 << (i&7); p[cbit_word + i/8] |= 1 << (i&7); } if (i == '_') p[cbit_word + i/8] |= 1 << (i&7); if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7); if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7); if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7); if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7); if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7); if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7); } p += cbit_length; /* Finally, the character type table. In this, we exclude VT from the white space chars, because Perl doesn't recognize it as such for \s and for comments within regexes. */ for (i = 0; i < 256; i++) { int x = 0; if (i != 0x0b && isspace(i)) x += ctype_space; if (isalpha(i)) x += ctype_letter; if (isdigit(i)) x += ctype_digit; if (isxdigit(i)) x += ctype_xdigit; if (isalnum(i) || i == '_') x += ctype_word; /* Note: strchr includes the terminating zero in the characters it considers. In this instance, that is ok because we want binary zero to be flagged as a meta-character, which in this sense is any character that terminates a run of data characters. */ if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta; *p++ = x; } return yield; } /* End of maketables.c */ gtamsanalyzer.app-0.42/Source/markRec.tif0000555000175000017500000000642210162465511020703 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺"""֔ު"""ޗ۔ު5555555555555555"""""""ޔޔު5555555555555555"""""""ޔޔު5555555555V=55555"""""""痢ߒ۪"""瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳"""铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ      @   (markRec.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/metaicn.tif0000555000175000017500000000647210162465511020744 0ustar brentbrent00000000000000MM* (  (贽豺簹篸殸氹簹絾%%篸歶!&7 1䦱䦱䧱䫵*欵'T[{⡬⡫⡬⢭⦰ oqy69B#Za➩ᝩᝩᝩᝩ៪᫵lnx  0bjᝨᜧᛦᦰdgu~bjᛧߘߘߘߜ᧱`dv?BJ*,5"W_ޔޔޓޓޗߞ᪳XZa #7 ݐݏݐݑݙ࣭㫵  nx  ݏݐݔޘߞᡫ⨲UZq 6;W ٔޖߗߛᡫ⢭⧱RWo (ۛឩᡫ⡫⡬⤮㪳QVn% )ݠ⡫⡫⡫⡬⣮㧱䫵QVn03<;>F?Ea+⡫⡫⢭⤮㦱䪴孶 oumnu &+@).D⣭㣮㤮㦱䪳孶決 ;>F9?X9?X㤮㤮㥯㧱䪳孶氹絾mnu  1㦰䦱䧱䩳媴孶氹絾acj媳媳嫵孶殸沺# $'7豺簹簹籺糼跿HM` 58A#%/   #@CK&&$@CK}~:=E~qrynovfhnpqx    4  @  * 2(/Users/matthew/Documents/tams documents/metaicn.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/MGWColorPanel.h0000644000175000017500000000014010162465511021363 0ustar brentbrent00000000000000#import @interface NSColorPanel(MGWColorPanel) -(BOOL) worksWhenModal; @end; gtamsanalyzer.app-0.42/Source/MGWColorPanel.m0000644000175000017500000000016310162465511021375 0ustar brentbrent00000000000000#import "MGWColorPanel.m" @implementation NSColorPanel(MGWColorPanel) -(BOOL) worksWhenModal { return YES; } @end gtamsanalyzer.app-0.42/Source/MGWMyDocumentToolbar.h0000555000175000017500000000153410162465511022745 0ustar brentbrent00000000000000// // MGWMyDocumentToolbar.h // avtams // // Created by matthew on Tue Mar 09 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import @interface MGWMyDocumentToolbar : NSObject { IBOutlet id theDocument; IBOutlet id mainWindow; int buttonNdx; NSMutableArray *myButtons; NSMutableArray *allButtons; NSToolbar *myToolBar; } - (void)setupToolbar; - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag; - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar; - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar; -(BOOL) isButton: (NSString *) who; -(void) clearButtons; -(NSToolbarItem *) itemWithID: (NSString *) itemID image: (NSString *) fn action: (SEL) act; @end gtamsanalyzer.app-0.42/Source/MGWMyDocumentToolbar.m0000555000175000017500000001512310162465511022751 0ustar brentbrent00000000000000// // MGWMyDocumentToolbar.m // avtams // // Created by matthew on Tue Mar 09 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import "MGWMyDocumentToolbar.h" #import "tams.h" #import "tamsUtils.h" #import "utils.h" NSString *MGWDTBSave=@"Save..."; NSString *MGWDTBWorkbench=@"Workbench"; NSString *MGWDTBRefresh = @"Refresh"; NSString *MGWDTBFindRecord =@"Find record"; NSString *MGWDTBSortUpAZ =@"Sort A-Z"; NSString *MGWDTBSortUpAZWithin =@"Sort A-Z within"; NSString *MGWDTBSmartSortUp =@"Sort"; NSString *MGWDTBSelectAll =@"Select all"; NSString *MGWDTBSelect =@"Select..."; NSString *MGWDTBSelectReverse =@"Select reverse"; NSString *MGWDTBSelectLess =@"Remove from selection..."; NSString *MGWDTBMark =@"Mark"; NSString *MGWDTBUnmark =@"Unmark"; NSString *MGWDTBAddCode =@"Add code..."; NSString *MGWDTBRecode =@"Recode..."; NSString *MGWDTBAutoset =@"Autoset..."; NSString *MGWDTBDataSummary =@"Data summary..."; NSString *MGWDTBExportData =@"Export data..."; #define MWSTRINGCOMP(X,Y) [X isEqualToString: Y] @implementation MGWMyDocumentToolbar -(void) dealloc { [myButtons dealloc]; [allButtons dealloc]; } -(id) init { [super init]; myButtons = [[NSMutableArray alloc] init]; [myButtons addObject: NSToolbarCustomizeToolbarItemIdentifier]; #ifdef COCOAVERSION [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif [myButtons addObject: MGWDTBSave]; [myButtons addObject: MGWDTBWorkbench]; #ifdef COCOAVERSION [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif allButtons = [[NSMutableArray alloc] init]; [allButtons addObject: NSToolbarCustomizeToolbarItemIdentifier]; [allButtons addObject: NSToolbarSpaceItemIdentifier]; [allButtons addObject: NSToolbarFlexibleSpaceItemIdentifier]; #ifdef COCOAVERSION [allButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif [allButtons addObject: MGWDTBSave]; [allButtons addObject: MGWDTBWorkbench]; return self; } - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag { NSToolbarItem *who; if(MWSTRINGCOMP(itemIdentifier, MGWDTBRefresh)) who = [self itemWithID: MGWDTBRefresh image: @"refresh.tif" action: @selector(refreshResults:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBFindRecord)) who = [self itemWithID: MGWDTBFindRecord image: @"findRecord.tif" action: @selector(fetchRow:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBSortUpAZ)) who = [self itemWithID: MGWDTBSortUpAZ image: @"sortAZ.tif" action: @selector(sortUpAZ:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBSmartSortUp)) who = [self itemWithID: MGWDTBSmartSortUp image: @"smartSort.tif" action: @selector(smartSort:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBSortUpAZWithin)) who = [self itemWithID: MGWDTBSortUpAZWithin image: @"sortAZWithin.tif" action: @selector(sortUpAZWithin:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBSelectAll)) who = [self itemWithID: MGWDTBSelectAll image: @"selectAll3.tif" action: @selector(selectAllRecs:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBSelect)) who = [self itemWithID: MGWDTBSelect image: @"selectSome.tif" action: @selector(selectRecs:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBSelectReverse)) who = [self itemWithID: MGWDTBSelectReverse image: @"selectReverse.tif" action: @selector(selectReverseRecs:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBSelectLess)) who = [self itemWithID: MGWDTBSelectLess image: @"removeFrom.tif" action: @selector(selectFewerRecs:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBMark)) who = [self itemWithID: MGWDTBMark image: @"markRec.tif" action: @selector(doMark:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBUnmark)) who = [self itemWithID: MGWDTBUnmark image: @"unmarkRec.tif" action: @selector(doUnmark:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBAddCode)) who = [self itemWithID: MGWDTBAddCode image: @"addCode.tif" action: @selector(doAddCode:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBRecode)) who = [self itemWithID: MGWDTBRecode image: @"reCode2.tif" action: @selector(doRecode:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBAutoset)) who = [self itemWithID: MGWDTBAutoset image: @"autoSet.tif" action: @selector(createAutoSet:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBDataSummary)) who = [self itemWithID: MGWDTBDataSummary image: @"dataSumm2.tif" action: @selector(runSummaryReport:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBSave)) who = [self itemWithID: MGWDTBSave image: @"Save.tif" action: @selector(saveDocument:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBWorkbench)) who = [self itemWithID: MGWDTBWorkbench image: @"wbicn.tif" action: @selector(moveWorkBenchForward:)]; else if(MWSTRINGCOMP(itemIdentifier, MGWDTBExportData)) who = [self itemWithID: MGWDTBExportData image: @"export.tif" action: @selector(exportData:)]; else who = [[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier]; return [who autorelease]; } - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar { return allButtons; } - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar { //return myButtons; return myButtons; } -(void) clearButtons { [allButtons removeAllObjects]; } -(BOOL) isButton: (NSString *) who { NSArray *theList; theList = [myToolBar items]; FORALL(theList) { if([who isEqualToString: [temp itemIdentifier]] == YES) return YES; } ENDFORALL; return NO; } - (void)setupToolbar { NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier: @"DocumentWindowToolbar"];// uniqueString()]; [toolbar autorelease]; [toolbar setDelegate:self]; [toolbar setAllowsUserCustomization:YES]; [toolbar setAutosavesConfiguration: YES]; [mainWindow setToolbar: toolbar]; myToolBar = toolbar; } -(NSToolbarItem *) itemWithID: (NSString *) itemID image: (NSString *) fn action: (SEL) act { NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemID]; [item setLabel: itemID]; [item setPaletteLabel:itemID]; [item setImage:[NSImage imageNamed: fn]]; [item setTarget:theDocument]; [item setAction: act]; return item; } -(void) awakeFromNib { [self setupToolbar]; } @end gtamsanalyzer.app-0.42/Source/MGWPopUpButton.h0000555000175000017500000000066110162465511021575 0ustar brentbrent00000000000000// // MGWPopUpButton.h // TEST2 // // Created by matthew on Wed Oct 22 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import @interface NSPopUpButton(MGWPopUpButton) -(NSString *) titleOfItemWithTag: (int) t; -(NSMenuItem *) itemWithTag: (int) t; -(int) tagOfSelectedItem; -(void) selectItemWithTag: (int) t; -(void) selectItemWithTagNumber: (NSNumber *) n; -(unsigned) count; @end gtamsanalyzer.app-0.42/Source/MGWPopUpButton.m0000555000175000017500000000132410162465511021577 0ustar brentbrent00000000000000// // MGWPopUpButton.m // TEST2 // // Created by matthew on Wed Oct 22 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "MGWPopUpButton.h" @implementation NSPopUpButton(MGWPopUpButton) -(unsigned) count { return [self numberOfItems]; } -(NSString *) titleOfItemWithTag: (int) t { return [[self itemWithTag: t] title]; } -(NSMenuItem *) itemWithTag: (int) t { return [self itemAtIndex: [self indexOfItemWithTag: t]]; } -(int) tagOfSelectedItem { return [[self selectedItem] tag]; } -(void) selectItemWithTag: (int) t { [self selectItem: [self itemWithTag: t]]; } -(void) selectItemWithTagNumber: (NSNumber *) n { [self selectItemWithTag: [n intValue]]; } @end gtamsanalyzer.app-0.42/Source/MGWScanner.h0000555000175000017500000000036510162465511020730 0ustar brentbrent00000000000000// // MGWScanner.h // TEST2 // // Created by matthew on Wed Nov 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import @interface NSScanner(MGWScanner) -(void) next; -(void) prev; @end gtamsanalyzer.app-0.42/Source/MGWScanner.m0000555000175000017500000000062510162465511020734 0ustar brentbrent00000000000000// // MGWScanner.m // TEST2 // // Created by matthew on Wed Nov 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "MGWScanner.h" @implementation NSScanner(MGWScanner) -(void) next { if([self isAtEnd] == NO) [self setScanLocation: [self scanLocation] + 1]; } -(void) prev { if([self scanLocation] > 0) [self setScanLocation: [self scanLocation] - 1]; } @end gtamsanalyzer.app-0.42/Source/MList0000644000175000017500000000167010162465511017565 0ustar brentbrent00000000000000AGRegex.m\ AppController.m\ appDelegate.m\ bookmarkInfo.m\ codeBrowser.m\ codeListSearchWatcher.m\ codeListWatcher.m\ coderec.m\ ctLimitCrit.m\ ctLimitFunc.m\ ctQChar.m\ ctTagInfo.m\ ctUnlimitedRuns.m\ docDelegate.m\ dotGraphWatcher.m\ fileListMgr.m\ globalCodeMgr.m\ main.m\ MGWMyDocumentToolbar.m\ MGWPopUpButton.m\ MGWScanner.m\ MWDoubleDictionary.m\ MWExportWatcher.m\ MWFakeDoc.m\ MWFakeFile.m\ MWFile.m\ MWKappa.m\ MWKeyedProject.m\ MWKeyedResult.m\ MWPath.m\ MWRange.m\ MWResultToolbarDelegate.m\ MWSortStackItem.m\ MWSummaryReport.m\ MWTAMSStringCategories.m\ MyDocument.m\ myProject.m\ myResults.m\ myResultsOld.m\ NSMutableNumber.m\ NSRecordData.m\ prefBoss.m\ RegexTest.m\ searchListMgr.m\ setMacroWatcher.m\ stringCategories.m\ summaryWatcher.m\ tableBrowser.m\ TAMSCharEngine.m\ tamsutils.m\ testProject.m\ TextFinder.m\ TextFinderSemi.m\ toolBarDelagate.m\ utils.m\ varRegistry.m\ WorkingTextFinder.m\ xrefTableColumn.m\ xrefTableInfo.m\ gtamsanalyzer.app-0.42/Source/MWDoubleDictionary.h0000555000175000017500000000211410162465511022462 0ustar brentbrent00000000000000// // MWDoubleDictionary.h // TEST2 // // Created by matthew on Wed Aug 13 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import @interface MWDoubleDictionary : NSObject { NSMutableDictionary *root; } -(NSObject *) objectForKey1: (NSString *) who1 key2: (NSString *) who2; -(void) setObject: (NSObject *) what forKey1: (NSString *) who1 key2: (NSString*) who2; -(void) incKey1: (NSString *) who1 key2: (NSString *) who2; -(void) decKey1: (NSString *) who1 key2: (NSString *) who2; -(int) intForKey1: (NSString *) who1 key2: (NSString *) who2; -(BOOL) key1Exists: (NSString*) who1; -(BOOL) objectExistsForKey1: (NSString *) who1 key2: (NSString *) who2; -(void) setInt: (int) what forKey1: (NSString *) who1 key2: (NSString *) who2; -(NSArray *) firstKeys; -(NSArray *) keysForKey1: (NSString *) who1; -(int) sumForKey2: (NSString *) who2; -(int) sumForKey1: (NSString *) who1; -(int) diagSum; -(unsigned) count; -(NSArray *) toArray; -(void) removeAllObjects; -(void) removeObjectForKey1: (NSString*) who1 key2: (NSString*) who2; @end gtamsanalyzer.app-0.42/Source/MWDoubleDictionary.m0000555000175000017500000001053610162465511022476 0ustar brentbrent00000000000000// // MWDoubleDictionary.m // TEST2 // // Created by matthew on Wed Aug 13 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "MWDoubleDictionary.h" #import "utils.h" @implementation MWDoubleDictionary -(id) init { [super init]; root = [[NSMutableDictionary alloc] init]; return self; } -(void) dealloc { [root release]; [super dealloc]; } -(NSObject *) objectForKey1: (NSString *) who1 key2: (NSString *) who2; { NSMutableDictionary *first; first = [root objectForKey: who1]; if(first == nil) return nil; else return [first objectForKey: who2]; } -(void) setObject: (NSObject *) what forKey1: (NSString *) who1 key2: (NSString*) who2; { NSMutableDictionary *two; if((two = [root objectForKey: who1]) == nil) { [root setObject: (two = [NSMutableDictionary dictionary]) forKey: who1]; } [two setObject: what forKey: who2]; } -(void) removeAllObjects { [root removeAllObjects]; } -(void) incKey1: (NSString *) who1 key2: (NSString *) who2; { if([self objectExistsForKey1: who1 key2: who2] == NO) { [self setInt: 1 forKey1: who1 key2: who2]; } else { [self setInt: [self intForKey1: who1 key2: who2] + 1 forKey1: who1 key2: who2]; } } -(void) decKey1: (NSString *) who1 key2: (NSString *) who2; { if([self objectExistsForKey1: who1 key2: who2] == NO) { [self setInt: -1 forKey1: who1 key2: who2]; } else { [self setInt: [self intForKey1: who1 key2: who2] - 1 forKey1: who1 key2: who2]; } } -(void) setInt: (int) what forKey1: (NSString *) who1 key2: (NSString *) who2; { NSNumber *myNum = [NSNumber numberWithInt: what]; [self setObject: myNum forKey1: who1 key2: who2]; } -(int) intForKey1: (NSString *) who1 key2: (NSString *) who2 { NSNumber *what; what = [self objectForKey1: who1 key2: who2]; if(what == nil) return 0; else return [what intValue]; } -(BOOL) key1Exists: (NSString*) who1; { if([root objectForKey: who1] == nil) return NO; return YES; } -(BOOL) objectExistsForKey1: (NSString *) who1 key2: (NSString *) who2; { if([self objectForKey1: who1 key2: who2] == nil) return NO; return YES; } -(NSArray *) firstKeys { return [root allKeys]; } -(NSArray *) keysForKey1: (NSString *) who1 { NSMutableDictionary *ww; ww = [root objectForKey: who1]; if(ww == nil) return nil; else return [ww allKeys]; } -(int) sumForKey1: (NSString *) who1 { int ans; NSArray *who; who = [self keysForKey1: who1]; ans = 0; if(who != nil) { FORALL(who) { ans += [self intForKey1: who1 key2: temp]; } ENDFORALL; } return ans; } -(int) sumForKey2: (NSString *) who2 { int ans; NSArray *who = [self firstKeys]; ans = 0; if(who) { FORALL(who) { ans += [self intForKey1: temp key2: who2]; } ENDFORALL; } return ans; } -(int) diagSum { int ans; NSArray *who = [self firstKeys]; ans = 0; if(who) { FORALL(who) { ans += [self intForKey1: temp key2: temp]; } ENDFORALL; } return ans; } -(unsigned) count { NSArray *fk = [self firstKeys]; unsigned i; i = 0; FORALL(fk) { i+=[[self keysForKey1: temp] count]; } ENDFORALL; return i; } -(NSArray *) toArray { int i,n; NSArray *a1; NSMutableArray *aa; NSMutableDictionary *dd; NSArray *fk = [self firstKeys]; aa = [[NSMutableArray alloc] init]; FORALL(fk); { a1 = [self keysForKey1: temp]; n = [a1 count]; for(i = 0; i < n; i++) { dd = [NSMutableDictionary dictionary]; [dd setObject: temp forKey: @"key1"]; [dd setObject: [a1 objectAtIndex: i] forKey: @"key2"]; [dd setObject: [self objectForKey1: temp key2: [a1 objectAtIndex: i]] forKey: @"object"]; [aa addObject: dd]; } } ENDFORALL; [aa autorelease]; return aa; } -(void) removeObjectForKey1: (NSString*) who1 key2: (NSString*) who2 { NSMutableDictionary *who; who = [root objectForKey: who1]; [who removeObjectForKey: who2]; if([who count] == 0) [root removeObjectForKey: who1]; } @end gtamsanalyzer.app-0.42/Source/MWExportWatcher.h0000644000175000017500000000123310162465511022021 0ustar brentbrent00000000000000/* MWExportWatcher */ #import #import @interface MWExportWatcher : NSObject { IBOutlet id clipboardSwitch; IBOutlet id escapeSwitch; IBOutlet id fieldList; IBOutlet id formatMenu; IBOutlet id selectedSwitch; IBOutlet id tagSwitch; IBOutlet id theBoss; IBOutlet id theWindow; IBOutlet id thePane; IBOutlet id headerSwitch; IBOutlet id colDelim; IBOutlet id rowDelim; NSArray *columns; NSMutableArray *colPool, *colList; NSMutableArray *dndList; int dndNdx; } - (IBAction)exitExport:(id)sender; - (IBAction)runExport:(id)sender; - (void) doExport; @end gtamsanalyzer.app-0.42/Source/MWExportWatcher.m0000644000175000017500000004023310162465511022031 0ustar brentbrent00000000000000#import "MWExportWatcher.h" #import "MGWPopUpButton.h" #import "MWFakeFile.h" #import "TAMSCharEngine.h" #import "myResults.h" #import "tams.h" #import "utils.h" #import "tamsutils.h" #import "prefBoss.h" #import "stringCategories.h" #define TABFMT 1 #define COMMAFMT 2 #define NLFMT 3 #define CRFMT 4 #define XMLFMT 5 #define OTHERFMT 99 int moveInArray(id who, NSMutableArray *theArray, int row); @implementation MWExportWatcher -(id) init { [super init]; colPool = [[NSMutableArray alloc] init]; colList = [[NSMutableArray alloc] init]; dndList = [[NSMutableArray alloc] init]; return self; } -(void) dealloc { [colPool release]; [colList release]; [dndList release]; [super dealloc]; } -(NSString *) XprocessString: (NSString *) who line: (int) ln { NSString *ss; NSMutableString *s2, *s3, *s4; //get the selected row //get the appropriate data if([who length]) { ss = who; //set it to the textview s2 = [[NSMutableString alloc] init]; s3 = [[NSMutableString alloc] init]; s4 = [[NSMutableString alloc] init]; [s2 setString: ss]; [s2 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; if([tagSwitch state] == NSOffState) { MWFakeFile *mf; TAMSCharEngine *tx; ctQChar *qq; qq = [[ctQChar alloc] init]; mf = [[MWFakeFile alloc] initWithString: s2]; tx = [[TAMSCharEngine alloc] initWithFile: mf]; [tx setAllowTab: 1]; [tx setNoPar: 0]; [tx startSearch]; while([tx scanNext: qq withWarnings: NO] != ENDOFFILE) { if([qq tokentype] == CHAR) { [s3 appendString: [qq buff]]; } } [tx release]; [qq release]; [mf release]; } else [s3 setString: s2]; [s3 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; if([gPrefBoss TAScanForLN] && ln > 0) { [s4 setString: [NSString stringWithFormat: @"%d\t%@", ln, s3]]; } else { [s4 setString: s3]; } [s2 release]; [s3 release]; return s4; /*put colorize stuff here */ //if([self global: @"nonregexcharflag"] || [self global: @"regexcharflag"]) return; } } -(NSString *) processString: (NSString *) who line: (int) ln { NSMutableString *s2, *s3, *s4; //get the selected row //get the appropriate data if([tagSwitch state] == NSOnState && [escapeSwitch state] == NSOnState) return who; if([who length] == 0) return who; s3 = [[NSMutableString alloc] init]; s4 = [[NSMutableString alloc] init]; s2 = [[NSMutableString alloc] init]; [s2 setString: who]; if([escapeSwitch state] == NSOffState) { [s2 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; } /* useless if([escapeSwitch state] == NSOffState) { //set it to the textview [s2 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; } */ if([tagSwitch state] == NSOffState) { TAMSCharEngine *tx; ctQChar *qq; qq = [[ctQChar alloc] init]; tx = [[TAMSCharEngine alloc] initWithString: s2]; if([escapeSwitch state] == NSOffState) { [tx setAllowTab: 1]; [tx setNoPar: 0]; } else { [tx setAllowTab: 0]; [tx setNoPar: 1]; } [tx startSearch]; while([tx scanNext: qq withWarnings: NO] != ENDOFFILE) { if([qq tokentype] == CHAR) { [s3 appendString: [qq buff]]; } } [tx release]; [qq release]; } else [s3 setString: s2]; /* if([escapeSwitch state] == NSOffState) { [s3 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; } else [s3 replaceOccurrencesOfString: @"\\" withString: @"\\\\" options: 0 range: NSMakeRange(0, [s3 length])]; */ if([gPrefBoss TAScanForLN] && ln > 0) { if([escapeSwitch state] == NSOffState) [s4 setString: [NSString stringWithFormat: @"%d\t%@", ln, s3]]; else [s4 setString: [NSString stringWithFormat: @"%d\\t%@", ln, s3]]; } else { [s4 setString: s3]; } [s2 release]; [s3 release]; [s4 autorelease]; return s4; } -(NSMutableString *) getDataString { NSMutableString *fs = [NSMutableString string]; NSMutableString *rs = [NSMutableString string]; //NSMutableString *opentag = [NSMutableString string]; //NSMutableString *closetag = [NSMutableString string]; NSMutableString *ans = [[NSMutableString alloc] init]; NSArray *myData; int i,j,n,m; int format; NSEnumerator *nnn; NSNumber *ndx; nnn = [fieldList selectedRowEnumerator]; format = [[formatMenu selectedItem] tag]; [colList removeAllObjects]; while((ndx = [nnn nextObject]) != nil) { [colList addObject: [colPool objectAtIndex: [ndx intValue]]]; } if([colList count] < 1) { NSWARNING(@"Select fields for export"); return [NSMutableString string]; } if([selectedSwitch state] == NSOnState) myData = [theBoss hotData]; else myData = [theBoss allData]; switch(format) { case TABFMT: [fs setString: @"\t"]; [rs setString: @"\n"]; break; case COMMAFMT: [fs setString: @","]; [rs setString: @"\n"]; break; case NLFMT: [fs setString: @"\n"]; [rs setString: @"\n"]; break; case CRFMT: [fs setString: @"\r"]; [rs setString: @"\r"]; break; case XMLFMT: [fs setString: @"\n"]; [rs setString: @"\n"]; break; case OTHERFMT: [fs setString: [[colDelim stringValue] stringUnescaped]]; [rs setString: [[rowDelim stringValue] stringUnescaped]]; break; }; n = [myData count]; m = [colList count]; if(format == XMLFMT) { [ans appendString: @""]; [ans appendString: @"\n\n"]; } else if ([headerSwitch state] == NSOnState) { for(j = 0; j < m; j++) { if(j > 0) { [ans appendString: fs]; [ans appendString: [[[colList objectAtIndex: j] copy] autorelease]]; } else [ans appendString: [[[colList objectAtIndex: j] copy] autorelease]]; } [ans appendString: rs]; } for(i = 0; i < n; i++) { if(format == XMLFMT) [ans appendString: @"\n"]; for(j = 0; j < m; j++) { NSString *md, *fldname; NSDictionary *rcrd; int ln = [[[myData objectAtIndex: i] objectForKey: @"_line_number"] intValue]; rcrd = [myData objectAtIndex: i]; fldname = [colList objectAtIndex: j]; if([fldname isEqualToString: @"_beg_loc"]) md = [(NSNumber *)[rcrd objectForKey: fldname] stringValue]; else if([fldname isEqualToString: @"_doc"]) md = [(MWFile *)[rcrd objectForKey: fldname] name]; else md = [[myData objectAtIndex: i] objectForKey: [colList objectAtIndex: j]]; if([[colList objectAtIndex: j] isEqualToString: @"_data"] == NO) ln = -1; if(format != XMLFMT) { if(j > 0) { [ans appendString: fs]; [ans appendString: [self processString: md line: ln]]; } else [ans appendString: [self processString: md line: ln]]; } else { [ans appendString: [NSString stringWithFormat: @"\t<%@>%@\n", [colList objectAtIndex: j], [self processString: md line: ln], [colList objectAtIndex: j]]]; } } if(format == XMLFMT) [ans appendString: @""]; [ans appendString: rs]; } if(format == XMLFMT) [ans appendString: @"\n"]; [ans autorelease]; return ans; } -(void) savePanelDidEnd: (NSSavePanel *) sheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == NSOKButton) { NSString *myName = [sheet filename]; NSString *md = [self getDataString]; [md writeToFile: myName atomically: YES]; } else { } } - (IBAction)exitExport:(id)sender { [thePane orderOut: sender]; [NSApp endSheet: thePane returnCode: 0]; } - (IBAction)runExport:(id)sender { NSSavePanel *msp; if([clipboardSwitch state] == NSOffState) { msp = [NSSavePanel savePanel]; [msp setDelegate: self]; if([[formatMenu selectedItem] tag] == XMLFMT) [msp setRequiredFileType: @"xml"]; else [msp setRequiredFileType: @"txt"]; [msp beginSheetForDirectory: nil file: nil modalForWindow: thePane modalDelegate: self didEndSelector: @selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo: nil]; } else { BOOL a; NSString *ans = [self getDataString]; [ans retain]; [[NSPasteboard generalPasteboard] declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; a = [[NSPasteboard generalPasteboard] setString: ans forType: NSStringPboardType]; [ans autorelease]; //get string //copy to clipboard } //[thePane orderOut: sender]; //[NSApp endSheet: thePane returnCode: 1]; } - (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id)info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)operation { if(tableView == fieldList) return NSDragOperationMove;//NSDragOperationEvery else return NSDragOperationNone ; } - (int)numberOfRowsInTableView:(NSTableView *) tt { if(tt == fieldList) return [colPool count]; else return 0; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { if(aTableView == fieldList) return [colPool objectAtIndex: rowIndex]; else return @""; } - (BOOL)tableView:(NSTableView *)tableView writeRows:(NSArray *)rows toPasteboard:(NSPasteboard *)pboard { id testid; testid = fieldList; if(tableView == fieldList) { /* [dndList removeAllObjects]; FORALL(rows) { [dndList addObject: [colPool objectAtIndex: [temp intValue]]]; } ENDFORALL; [pboard setString: [dndList objectAtIndex: 0] forType: NSStringPboardType]; return YES; */ #ifdef SINGLEDRAG if([rows count] != 1) return NO; dndNdx = [[rows objectAtIndex: 0] intValue]; [pboard setString: [colPool objectAtIndex: [[rows objectAtIndex: 0] intValue]] forType: NSStringPboardType]; return YES; #else [dndList removeAllObjects]; FORALL(rows) { [dndList addObject: [colPool objectAtIndex: [temp intValue]]]; } ENDFORALL; [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; [pboard setString: [colPool objectAtIndex: [[rows objectAtIndex: 0] intValue]] forType: NSStringPboardType]; return YES; #endif } else return NO; } - (BOOL)tableView:(NSTableView *)tableView acceptDrop:(id )info row:(int)row dropOperation:(NSTableViewDropOperation)operation { int n; if(tableView == fieldList) { int currSpot; n = [dndList count]; currSpot = row; FORALL(dndList) { currSpot = moveInArray(temp, colPool, currSpot); } ENDFORALL; [tableView reloadData]; [tableView deselectAll: nil]; FORALL(dndList) { [tableView selectRow: [colPool indexOfObject: temp] byExtendingSelection: YES]; } ENDFORALL; [dndList removeAllObjects]; return YES; } else return NO; } -(void) exportDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode) { } } -(void) doExport { NSWindow *who; if([gPrefBoss detachedSheetValue]) who = nil; else who = theWindow; [fieldList setVerticalMotionCanBeginDrag: YES]; [fieldList registerForDraggedTypes: [NSArray arrayWithObjects: NSStringPboardType, nil]]; [clipboardSwitch setState: NSOnState]; [escapeSwitch setState: NSOffState]; [tagSwitch setState: NSOffState]; [headerSwitch setState: NSOffState]; [selectedSwitch setState: NSOnState]; [formatMenu selectItemWithTag: 1]; [colDelim setStringValue: @""]; [rowDelim setStringValue: @""]; [colPool removeAllObjects]; columns = [theBoss tableColumns]; FORALL(columns) { NSString *idfr = [temp identifier]; if([idfr isEqualToString: @"#"]) continue; #ifdef COLFILTER else if([idfr isEqualToString: @"_code"] || [idfr isEqualToString: @"_data"]) [colPool addObject: [[idfr copy] autorelease]]; else if([idfr characterAtIndex: 0] == '_') continue; else #endif [colPool addObject: [[idfr copy] autorelease]]; } ENDFORALL; [fieldList deselectAll: nil]; [fieldList reloadData]; [NSApp beginSheet: thePane modalForWindow: who modalDelegate: self didEndSelector: @selector(exportDidEnd:returnCode:contextInfo:) contextInfo: nil]; } @end gtamsanalyzer.app-0.42/Source/MWFakeDoc.h0000555000175000017500000000164010162465511020521 0ustar brentbrent00000000000000// // MWFakeDoc.h // avtams // // Created by matthew on Thu Mar 18 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import #import "tamsutils.h" #import "myProject.h" @interface MWFakeDoc : NSObject { BOOL openState; BOOL isDirty; NSRange selRange; NSMutableAttributedString *theDoc; MWFile *myMWFile; myProject *gWorkBench; } -(void) setWorkBench: (id) wb; -(id) initWithMWFile: (MWFile *) mw workBench: (myProject *) wb; -(BOOL) isReal; -(void) recode: (NSString *) what comment:(NSString *) cmt first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(void) recode: (NSString *) what first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(MWFile *) getMyMWFile; @end gtamsanalyzer.app-0.42/Source/MWFakeDoc.m0000555000175000017500000003362010162465511020531 0ustar brentbrent00000000000000// // MWFakeDoc.m // avtams // // Created by matthew on Thu Mar 18 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import #import #import "MWRange.h" #import "MWFakeDoc.h" #import "stringCategories.h" #import "TAMSCharEngine.h" #import "prefBoss.h" @implementation MWFakeDoc -(id) initWithMWFile: (MWFile *) who { [super init]; myMWFile = who; isDirty = NO; openState = NO; theDoc = nil; return self; } -(MWFile *) myMWFile{return myMWFile;} -(void) dealloc { if(theDoc != nil) [theDoc release]; [super dealloc]; } -(id) initWithMWFile: (MWFile *) mw workBench: (myProject *) wb { id it = [self init]; gWorkBench = wb; myMWFile = mw; return it; } -(NSString *) getTitle { return [myMWFile name]; } -(NSString *) fileName { return[myMWFile path]; } -(NSString *) getData { return [theDoc string]; } -(void) updateCodeWindow {;} -(void) setSelectedRange: (NSRange) r; { selRange = r; } -(NSRange) selectedRange {return selRange;} -(BOOL) isNew: (NSString *) who { if(gWorkBench != nil) return [gWorkBench isMyCode: who]; else return NO; } -(BOOL) isOpen{return openState;} -(BOOL) open { if(openState) return NO; theDoc = [[NSMutableAttributedString alloc] initWithAttributedString: [[self myMWFile] attributedString]]; openState = YES; return YES; } -(void) setDirty{isDirty = YES;} -(void) writeAndClose { NSString *tp = [[self myMWFile] type]; if([tp isEqualToString: @"rtf"] || [tp isEqualToString: @"RTF"]) { [[theDoc RTFFromRange:NSMakeRange(0, [theDoc length]) documentAttributes: nil] writeToFile: [[self myMWFile] path] atomically: YES]; } else if([tp isEqualToString: @"rtfd"] || [tp isEqualToString: @"RTFD"]) { [[theDoc RTFDFileWrapperFromRange:NSMakeRange(0, [theDoc length]) documentAttributes: nil] writeToFile: [[self myMWFile] path] atomically: YES updateFilenames: YES]; } else { [[theDoc string] writeToFile: [[self myMWFile] path] atomically: YES ]; } openState = NO; [theDoc release]; theDoc = nil; } -(void) setWorkBench: (id) who { gWorkBench = who; } -(BOOL) isReal {return NO;} -(MWFile *) getMyMWFile{ return myMWFile;} -(void) adjustResultDocsAt: (int) loc forLength: (int) len { NSMutableDictionary *msg; msg = [NSMutableDictionary dictionary]; [msg setObject: [NSNumber numberWithInt: loc] forKey: @"location"]; [msg setObject: [NSNumber numberWithInt: len] forKey: @"length"]; [[NSNotificationCenter defaultCenter] postNotificationName: @"TAMSDocAddedCode" object: [self getMyMWFile] userInfo: msg ]; } -(void) applyCode: (NSString *) aCode { NSMutableAttributedString *theans, *theans1; NSRange where, newWhere, loc1, loc2; //int mc; int l1, l2, r1, r2; NSColor *myC; //mc = [gPrefBoss realColor]; myC = [gWorkBench colorForCode: aCode]; where = [self selectedRange]; r1 = where.location; r2 = where.location + where.length; //[myUndo endUndoGroup]; //[myUndo beginUndoGrouping]; //[myTS beginEditing]; theans = [[NSMutableAttributedString alloc] init]; theans1 = [[NSMutableAttributedString alloc] init]; [theans appendString: @"{"]; [theans appendString: aCode]; INSERTCODER(theans); [theans appendString:@"}"]; //[self colorOn]; [theans1 appendString: @"{/"]; [theans1 appendString: aCode]; INSERTCODER(theans1); [theans1 appendString: @"}"]; [theans setColor: myC]; [theans1 setColor: myC]; loc1 = where; loc1.length = 0; [theDoc insertAttributedString: theans atIndex: loc1.location]; l1 = loc1.length = [theans length]; loc2.location = where.location + where.length + l1; loc2.length = 0; [theDoc insertAttributedString: theans1 atIndex: loc2.location]; l2 = loc2.length = [theans1 length]; newWhere = where; newWhere.length += l1 + l2; [self adjustResultDocsAt: r2 forLength: [theans1 length]]; [self adjustResultDocsAt: r1 forLength: [theans length]]; [theans release]; [theans1 release]; } -(void) recode: (NSString *) what first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef { [self recode: what comment: nil first: bwhere last: ewhere from: who withDef: myDef]; } -(void) recode: (NSString *) what comment:(NSString *) cmt first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef { ctQChar *begChar, *endChar; int bTerminus, eTerminus; int bNew, eNew, ll; int p1, p2, pr1, pr2, po1, po2; NSMutableAttributedString *ss; NSColor *myC; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; ss = [[NSMutableAttributedString alloc] init]; myC = [gWorkBench colorForCode: what]; //set up the reader [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //get the first and end tags with the next characters //first: begChar = [[ctQChar alloc] init]; [tc setCharLocation: (bwhere)]; [tc readnext: begChar]; bTerminus = [tc getCharLocation]; //second endChar = [[ctQChar alloc] init]; [tc setCharLocation: (ewhere)]; [tc readnext: endChar]; eTerminus = [tc getCharLocation]; //make sure they're a match if([endChar tokentype] == ENDTOKEN && [begChar tokentype] == TOKEN && [[endChar buff] isEqualToString: [begChar buff]] && [[endChar coder] isEqualToString: [begChar coder]]) { //save the location //currSel = [theDoc selectedRange]; //select the last //[theDoc setSelectedRange: NSMakeRange(ewhere, eTerminus - ewhere)]; p2 = ewhere; pr2 = eTerminus - ewhere; //[self colorOn]; [ss setString: @""]; [ss appendString: @"{/"]; [ss appendString: what]; INSERTCODER(ss); if([[endChar extra] length] && cmt == nil) { [ss appendString: @": "]; [ss appendString: [endChar extra]]; } if(cmt != nil) { [ss appendString: @": "]; [ss appendString: cmt]; } [ss appendString: @"}"]; //replace po2 = ll = [ss length]; //[theDoc insertText: ss]; [ss setColor: myC]; [theDoc replaceCharactersInRange: NSMakeRange(ewhere, eTerminus - ewhere) withAttributedString: ss]; //[theDoc setSelectedRange: NSMakeRange(ewhere, ll)]; //SETRAWCOLOR(myC); //get adjusted end and let the results know to adjust [tc clearSearchList]; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; [tc setCharLocation: (ewhere)]; [tc readnext: endChar]; eNew = [tc getCharLocation]; //[who adjustBy: eNew - eTerminus startingAt: ewhere for: [self getMyMWFile]]; [self adjustResultDocsAt: p2 + 1 forLength: po2 - pr2]; //select the first //[theDoc setSelectedRange: NSMakeRange(bwhere, bTerminus - bwhere)]; p1 = bwhere; pr1 = bTerminus - bwhere; //[self colorOn]; [ss setString: @""]; [ss appendString: @"{"]; [ss appendString: what]; INSERTCODER(ss); [ss appendString: @"}"]; //replace po1 = ll = [ss length]; //[theDoc insertText: ss]; [ss setColor: myC]; [theDoc replaceCharactersInRange: NSMakeRange(bwhere, bTerminus - bwhere) withAttributedString: ss]; //[theDoc setSelectedRange: NSMakeRange(bwhere, ll)]; //SETRAWCOLOR(myC); //get adjusted beginning and let the results know to adjust [tc setCharLocation: (bwhere)]; [tc readnext: (begChar)]; bNew = [tc getCharLocation]; //[who adjustBy: bNew - bTerminus startingAt: bwhere for: [self getMyMWFile]]; [self adjustResultDocsAt: p1+1 forLength: po1 - pr1]; //if it's new make sure to add it if([gWorkBench isMyCode: what] && !myDef) { [gWorkBench addCode: what definition: @"" active: YES append: YES]; [gWorkBench broadcastCodeChange: NO]; } else if([gWorkBench isMyCode: what]) { [gWorkBench addCode: what definition: myDef active: YES append: YES]; [gWorkBench broadcastCodeChange: NO]; } else { if(!myDef) { if([myDef isEqualToString: @""] == NO) { [gWorkBench addCode: what definition: myDef active: YES append: YES]; [gWorkBench broadcastCodeChange: NO]; } } } //restore cursor } [self setDirty]; [begChar release]; [endChar release]; [ss release]; [tc release]; } -(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who withDef: (NSString *) myDef { [self setSelectedRange: NSMakeRange(bwhere, ewhere - bwhere)]; if([self isNew: what] || (![self isNew: what] && ((!myDef) ||[myDef isEqualToString: @""] == NO)) ) { if(!myDef) [gWorkBench addCode: what definition: @"" active: YES append: YES]; else if([myDef isEqualToString: @""] == YES) [gWorkBench addCode: what definition: @"" active: YES append: YES]; else [gWorkBench addCode: what definition: myDef active: YES append: YES]; [gWorkBench broadcastCodeChange: NO]; [self applyCode: what]; } else [self applyCode: what]; [self setDirty]; } -(void) deleteCodeFromResultStartingWith: (int) bwhere endingWith: (int) ewhere from: (id) who { ctQChar *begChar, *endChar; int bTerminus, eTerminus; int bNew; NSMutableAttributedString *ss; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; ss = [[NSMutableAttributedString alloc] init]; //set up the reader [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //get the first and end tags with the next characters //first: begChar = [[ctQChar alloc] init]; [tc setCharLocation: (bwhere)]; [tc readnext: begChar]; bTerminus = [tc getCharLocation]; //second endChar = [[ctQChar alloc] init]; [tc setCharLocation: (ewhere)]; [tc readnext: endChar]; eTerminus = [tc getCharLocation]; //make sure they're a match if([endChar tokentype] == ENDTOKEN && [begChar tokentype] == TOKEN && [[endChar buff] isEqualToString: [begChar buff]] && [[endChar coder] isEqualToString: [begChar coder]]) { //select the last //[theDoc setSelectedRange: NSMakeRange(ewhere, eTerminus - ewhere)]; //[self colorOn]; [ss setString: @""]; //[theDoc insertText: ss]; [theDoc replaceCharactersInRange: NSMakeRange(ewhere, eTerminus - ewhere) withAttributedString: ss]; //get adjusted end and let the results know to adjust //[who adjustBy: ewhere - eTerminus startingAt: ewhere for: [self getMyMWFile]]; [self adjustResultDocsAt: ewhere forLength: ewhere - eTerminus]; //select the first //[theDoc setSelectedRange: NSMakeRange(bwhere, bTerminus - bwhere)]; [ss setString: @""]; //[theDoc insertText: ss]; [theDoc replaceCharactersInRange: NSMakeRange(bwhere, bTerminus - bwhere) withAttributedString: ss]; //get adjusted beginning and let the results know to adjust [tc setCharLocation: (bwhere)]; [tc readnext: (begChar)]; bNew = [tc getCharLocation]; //[who adjustBy: bwhere - bTerminus startingAt: bwhere for: [self getMyMWFile]]; [self adjustResultDocsAt: bwhere forLength: bwhere - bTerminus]; //if it's new make sure to add it [gWorkBench broadcastCodeChange: NO]; //restore cursor } [self setDirty]; [begChar release]; [endChar release]; [ss release]; [tc release]; } -(void) ConvertMovieTimeToHHMMSS: (BOOL) hhmmssFormat { long l; NSString *ss; NSMutableArray *tLoc = [[NSMutableArray alloc] init]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; ctQChar *q; NSRange r,s; NSString *timeCode; int tt, i, n; BOOL timeMode, hfmt; double t1; NSString *theDocString; timeCode = [gPrefBoss getAVCode]; if(!gWorkBench) return; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; q = [[ctQChar alloc] init]; timeMode = NO; r = NSMakeRange(0,0); while((tt = [tc scanNext: q]) != ENDOFFILE) { //scan through doc if(tt == TOKEN) { if([[q buff] isEqualToString: timeCode]) { timeMode = YES; } else timeMode = NO; } else if(timeMode == YES) { if(tt == CHAR) { hfmt = isHHMMSS([q buff]); if(hhmmssFormat) { if(hfmt == NO) //this is one we want [tLoc addObject: [[[MWRange alloc] initWithRange: [q range]] autorelease]]; } else { if(hfmt == YES) [tLoc addObject: [[[MWRange alloc] initWithRange: [q range]] autorelease]]; } } timeMode = NO; } else timeMode = NO; } [tc release]; [q release]; n = [tLoc count]; theDocString = [theDoc string]; for(i = n-1; i >= 0; i--) { NSString *newTime, *oldTime; MWRange *w; w = [tLoc objectAtIndex: i]; oldTime = [theDocString substringWithRange: [w range]]; if(hhmmssFormat) newTime = sec2hhmmss((unsigned) [oldTime doubleValue]); else newTime = [NSString stringWithFormat: @"%u", hhmmss2sec(oldTime)]; [theDoc replaceCharactersInRange: [w range] withAttributedString: [[[NSAttributedString alloc] initWithString: newTime] autorelease]]; } [tLoc release]; } @end gtamsanalyzer.app-0.42/Source/MWFakeFile.h0000555000175000017500000000045710162465511020700 0ustar brentbrent00000000000000// // MWFakeFile.h // TEST2 // // Created by matthew on Thu Jun 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import #import "MWFile.h" @interface MWFakeFile : MWFile { NSString *myString; } -(id) initWithString: (NSString *) what; @end gtamsanalyzer.app-0.42/Source/MWFakeFile.m0000555000175000017500000000130310162465511020674 0ustar brentbrent00000000000000// // MWFakeFile.m // TEST2 // // Created by matthew on Thu Jun 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "MWFakeFile.h" @implementation MWFakeFile -(id) initWithString: (NSString *) what { self = [super init]; myString = [[NSString alloc] initWithString: what]; [path setString: @""]; return self; } -(void) dealloc { [myString release]; [super dealloc]; } -(NSString *) name {return path;} -(NSString *) path {return path;} -(NSString *) string {return myString;} -(BOOL) open {return YES;} -(void) setOpen: (BOOL) state {;} -(void) setOpenFile: (id) aFid {;} -(void) setHasFile: (BOOL) state {;} -(BOOL) hasFile {return NO;} @end gtamsanalyzer.app-0.42/Source/MWFile.h0000555000175000017500000000164710162465511020113 0ustar brentbrent00000000000000// // MWFile.h // TA2 hot // // Created by matthew on Sat Apr 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import //#import "MyDocument.h" @interface MWFile : NSObject { NSMutableString *path; id fid; //points to the actual NSDocument that is open BOOL open, hasFile; } /* these 2 are key since they work whether or not the file is open or closed */ - (NSString *) string; - (id) filePointer; - (NSString *) path; - (NSString *) name; - (NSString *) type; - (NSString *) string; - (id) filePointer; - (BOOL) open; -(BOOL) isReallyOpen; -(id) setOpenFakeFileWithWorkBench: (id) wb; -(void) setOpen: (BOOL) state; -(void) setHasFile: (BOOL) state; -(void) setPath: (NSString *) aPath; -(BOOL) hasFile; -(id) init; -(id) initWithPath: (NSString *) aPath; -(void) setOpenFile: (id) aFid; -(BOOL) isEqual: (MWFile *) who; -(BOOL) compare: (MWFile *) who; @end gtamsanalyzer.app-0.42/Source/MWFile.m0000555000175000017500000001030210162465511020104 0ustar brentbrent00000000000000// // MWFile.m // TA2 hot // // Created by matthew on Sat Apr 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "MWFile.h" #import "MWFakeDoc.h" @implementation MWFile - (NSString *) path { if(fid != nil) if([fid isReal] == NO) return path; if(open) { if([fid fileName]) return [fid fileName]; else return @""; } else return path; } - (NSString *) name { if([self hasFile]) return [[self path] lastPathComponent]; else if([self open]) return [fid getTitle]; else return @""; /* if(open) if([fid isReal] == NO) return [path lastPathComponent]; if([fid fileName]) return [path lastPathComponent]; else if(open) return [fid getTitle]; return @""; */ } - (NSString *) type {return [path pathExtension];} -(NSAttributedString *) attributedString { NSDictionary *myAttrib; NSAttributedString *masterString; /* if([[self type] isEqualToString: @"rtf"] || [[self type] isEqualToString: @"RTF"] || [[self type] isEqualToString: @"RTFD"] || [[self type] isEqualToString: @"rtfd"] ) */ if([self hasFile]) { return [[[NSAttributedString alloc] initWithPath: [self path] documentAttributes: &myAttrib] autorelease]; } } - (NSString *) string { NSString *myString; NSAttributedString *masterString; NSDictionary *myAttrib; if([self open]) { return [[[fid getData] copy] autorelease]; } else //may need to deal with strings... { if([[self type] isEqualToString: @"txt"] || [[self type] isEqualToString: @"TXT"]) { return [[NSString alloc] initWithContentsOfFile: [self path]]; } else if([[self type] isEqualToString: @"rtf"] || [[self type] isEqualToString: @"RTF"] || [[self type] isEqualToString: @"RTFD"] || [[self type] isEqualToString: @"rtfd"] ) { masterString = [[NSAttributedString alloc] initWithPath: [self path] documentAttributes: &myAttrib]; myString = [[NSString alloc] initWithString: [masterString string]]; [masterString release]; return [myString autorelease] ; } } } -(void) setPath: (NSString *) aPath { [path setString: aPath]; // [self setHasFile: YES]; } - (id) filePointer { return fid; //may need to open a file also } - (BOOL) open {return open;} -(BOOL) isReallyOpen { if(open && fid != nil) { if([fid isReal]) return YES; } return NO; } -(void) setOpen: (BOOL) state {open = state; if(state == NO) fid = nil;} -(id) init { [super init]; path = [[NSMutableString alloc] init]; open = NO; fid = nil; [self setHasFile: NO]; return self; } -(id) initWithPath: (NSString *) aPath { id who = [self init]; if (who) [path setString: aPath]; open = NO; [self setHasFile: YES]; return who; } -(void) dealloc { [path release]; [super dealloc]; } -(id) setOpenFakeFileWithWorkBench: (id) wb { if(fid != nil) return nil; fid = [[MWFakeDoc alloc] initWithMWFile: self workBench: wb]; if (fid == nil) return fid; [self setHasFile: YES]; open = YES; [fid open]; } -(void) closeFakeFile { if(fid == nil) return; if([fid isReal] == YES) return; [fid writeAndClose]; [fid release]; fid = nil; open = NO; } -(void) setOpenFile: (id) aFid { NSString *thePath; fid = aFid; if(aFid != nil) open = YES; else open = NO; if(aFid) { thePath = [aFid fileName]; if(thePath) { [self setPath: thePath]; [self setHasFile: YES]; } else [self setPath: [aFid getTitle]]; } } -(void) setHasFile: (BOOL) state {hasFile = state;} -(BOOL) hasFile { if(fid) { if([fid fileName]) { [self setPath: [fid fileName]]; return YES; } else return NO; } else return hasFile; } -(BOOL) isEqual: (MWFile *) who { return [[self path] isEqualToString: [who path]]; } -(BOOL) compare: (MWFile *) who { return [[self path] compare: [who path]]; } @end gtamsanalyzer.app-0.42/Source/MWKappa.h0000555000175000017500000000110410162465511020254 0ustar brentbrent00000000000000// // MWKappa.h // TEST2 // // Created by matthew on Thu Aug 14 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import #import "tableBrowser.h" #import "MWDoubleDictionary.h" @interface MWKappa : tableBrowser { //kappa stuff IBOutlet id theMessage; IBOutlet id theFileTitle; NSMutableString *fileTitles; float kappa, effAgSum; int totCount, agreements; NSMutableDictionary *ef; MWDoubleDictionary *myKMatrix; NSMutableArray *answers; IBOutlet NSTableView *ansTable; } -(void) buildKappa; @end gtamsanalyzer.app-0.42/Source/MWKappa.m0000555000175000017500000002372310162465511020274 0ustar brentbrent00000000000000// // MWKappa.m // TEST2 // // Created by matthew on Thu Aug 14 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "tams.h" #import "MWKappa.h" #import "tamsutils.h" #define COLWIDTH 90.0 @implementation MWKappa -(id) init { [super init]; fileTitles = [[NSMutableString alloc] init]; answers = [[NSMutableArray alloc] init]; return self; } -(void) dealloc { [ef release]; [fileTitles release]; [answers release]; [ myKMatrix release]; [super dealloc]; } - (NSString *)windowNibName { // Implement this to return a nib to load OR implement -makeWindowControllers to manually create your controllers. return @"kappa"; } - (NSData *)dataRepresentationOfType:(NSString *)type { // Implement to provide a persistent data representation of your document OR remove this and implement the file-wrapper or file path based save methods. NSMutableData *dd; NSNumber *e; float ee; int i, n, cnt; cnt = [hotCodeList count]; dd = [[NSMutableData alloc] init]; //print the top DATASTRING(dd, fileTitles); DATANL(dd); DATASTRING(dd, [NSString stringWithFormat: @"Cohen's kappa = %.3f; %d agreements/%d opportunities (%.3f)", kappa, agreements, totCount, ((float) agreements)/totCount]); DATANL(dd); FORALL(hotCodeList) { DATATAB(dd); DATASTRING(dd, temp); } ENDFORALL; DATATAB(dd); DATASTRING(dd,@"EF"); DATATAB(dd); DATASTRING(dd,@"Total"); DATANL(dd); //Go through the hotcode list for(i = 0; i < cnt; i++) { //print the code name DATASTRING(dd, [hotCodeList objectAtIndex: i]); //print the data FORALL(hotCodeList) { DATATAB(dd); DATASTRING(dd, [NSString stringWithFormat: @"%d", [myKMatrix intForKey1: [hotCodeList objectAtIndex: i] key2: temp]]); } ENDFORALL; e = [ef objectForKey: [hotCodeList objectAtIndex: i]]; if(e == nil) ee = 0.0; else ee = [e floatValue]; //we're on a diagonal DATATAB(dd); DATASTRING(dd, [NSString stringWithFormat: @"%.3f", ee]); DATATAB(dd); DATASTRING(dd ,[NSString stringWithFormat: @"%d", [myKMatrix sumForKey1: [hotCodeList objectAtIndex: i]]]); DATANL(dd); } DATASTRING(dd, @"Total"); FORALL(hotCodeList) { DATATAB(dd); DATASTRING(dd, [NSString stringWithFormat: @"%d", [myKMatrix sumForKey2: temp]]); } ENDFORALL; DATATAB(dd); DATASTRING(dd, [NSString stringWithFormat: @"%.3f", effAgSum]); DATATAB(dd); DATASTRING(dd, [NSString stringWithFormat: @"%d", totCount]); DATANL(dd);DATANL(dd); //summary of the results DATASTRING(dd, @"Item\tCoder 1\tCoder 2\n"); for(n = 1; n<= totCount; n++) { NSString *tmp1, *tmp2; NSMutableDictionary *temp; temp = [answers objectAtIndex: n-1]; DATASTRING(dd, [NSString stringWithFormat: @"%d\t%@\t%@\n", n, (((tmp1 = [temp objectForKey: @"alpha"]) != nil)? tmp1: @""), (((tmp2 = [temp objectForKey: @"beta"]) != nil)? tmp2: @"")]); } return dd; } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)type { // Implement to load a persistent data representation of your document OR remove this and implement the file-wrapper or file path based load methods. return YES; } -(void) buildKappa { NSArray *rows; NSArray *mf; int qcnt, tcnt; float effAg; ctQChar *q; //make an array of the right codes based on n #ifdef levels FORALL(hcl) { if(codeLevel(temp) <= lvl) [realCodeList addObject: [[temp copy] autorelease]]; } ENDFORALL; #endif myKMatrix = [[MWDoubleDictionary alloc] init]; ef = [[NSMutableDictionary alloc] init]; mf = [tce hotFileList]; [fileTitles setString: [NSString stringWithFormat: @"%@ x %@", [[mf objectAtIndex: 0] name], [[mf objectAtIndex: 1] name]]]; [theFileTitle setStringValue: fileTitles]; //initialize a count qcnt = 0; tcnt = 0; //a flag for which coder it is //first time through make an array theDData = [[NSMutableDictionary alloc] init]; q = [[ctQChar alloc] init]; [answers addObject: [NSMutableDictionary dictionary]]; while([tce scanNext: q] != ENDOFALLFILES) { if([q tokentype] == TOKEN) { //[theDData setObject: [NSMutableDictionary dictionary] forKey: [[[q buff] copy] autorelease]]; if(tcnt == 0) [[answers objectAtIndex: qcnt] setObject: [[[q buff] copy] autorelease] forKey: @"alpha"]; else [[answers objectAtIndex: qcnt] setObject: [[[q buff] copy] autorelease] forKey: @"beta"]; } if([q tokentype] == META) { if([[q buff] isEqualToString: @"endsection"]) { [answers addObject: [NSMutableDictionary dictionary]]; qcnt++; } if([[q buff] isEqualToString: @"end"]) { //tot = qcnt; qcnt = 0; tcnt++; } } } //then convert the dictionary: FORALL(answers) { if([temp objectForKey: @"alpha"] != nil && [temp objectForKey: @"beta"] != nil) [myKMatrix incKey1: [temp objectForKey: @"alpha"] key2: [temp objectForKey: @"beta"]]; } ENDFORALL; //for each alpha code add it to a dictionary with a dictionary as the object //for each beta make it the key of the second dictionary and an NSNumber as the count //expected frequency of agreement rowsum*colsum/tot; agreements = [myKMatrix diagSum]; rows = [myKMatrix firstKeys]; effAgSum = 0.0; totCount = 0; FORALL(rows) { totCount += [myKMatrix sumForKey1: temp]; } ENDFORALL; FORALL(rows) { int colCount; int rowCount = [myKMatrix sumForKey1: temp]; colCount = [myKMatrix sumForKey2: temp]; effAg = rowCount * colCount; effAg /= totCount; // effAg = ((float) rowCount) *colCount /((float) agreements); [ef setObject: [NSNumber numberWithFloat: effAg] forKey: temp]; effAgSum += effAg; } ENDFORALL; kappa = (agreements - effAgSum)/(float)(totCount - effAgSum); [theMessage setStringValue: [NSString stringWithFormat: @"Cohen's kappa = %.3f; %d agreements/%d opportunities (%.3f)", kappa, agreements, totCount, ((float) agreements)/totCount]]; [self setupTable]; [theTable reloadData]; [ansTable reloadData]; [self updateChangeCount: NSChangeDone]; } -(void) setupTable { NSTableColumn *t; //make it the first column t = [[NSTableColumn alloc] initWithIdentifier: @".Codes"]; [t setWidth: COLWIDTH]; [theTable addTableColumn: t]; [[t headerCell] setStringValue: @"Codes"]; //Add a column for each and FORALL(hotCodeList) { t = [[NSTableColumn alloc] initWithIdentifier: temp]; [t setWidth: COLWIDTH]; [theTable addTableColumn: t]; [[t headerCell] setStringValue: temp]; }ENDFORALL; //make it the first column t = [[NSTableColumn alloc] initWithIdentifier: @".EF"]; [t setWidth: COLWIDTH]; [theTable addTableColumn: t]; [[t headerCell] setStringValue: @"EF"]; t = [[NSTableColumn alloc] initWithIdentifier: @".RTotals"]; [t setWidth: COLWIDTH]; [theTable addTableColumn: t]; [[t headerCell] setStringValue: @"Total"]; } /* table portion */ - (int)numberOfRowsInTableView:(NSTableView *)aTableView { if(aTableView == ansTable) return totCount; return [hotCodeList count] + 1; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn: (NSTableColumn *)aTableColumn row:(int)rowIndex { NSNumber *e; int cnt; float ee; cnt = [hotCodeList count]; if(aTableView == ansTable) { NSLog(@"Building back table\n"); if([[aTableColumn identifier] isEqualToString: @"Item"] == YES) { //return [NSString stringWithFormat: @"%d", rowIndex+1]; NSLog(@"returning %d\n",rowIndex+1); return [NSNumber numberWithInt: rowIndex+1]; } else if([[aTableColumn identifier] isEqualToString: @"Coder 1"] == YES) { return [[answers objectAtIndex: rowIndex] objectForKey: @"alpha"]; } else if([[aTableColumn identifier] isEqualToString: @"Coder 2"] == YES) { return [[answers objectAtIndex: rowIndex] objectForKey: @"beta"]; } } if([[aTableColumn identifier] isEqualToString: @".Codes"] == YES) { if(rowIndex >= cnt) { return @"Total"; } return [hotCodeList objectAtIndex: rowIndex]; } if([[aTableColumn identifier] isEqualToString: @".RTotals"] == YES) { if(rowIndex < cnt) return [NSNumber numberWithInt: [myKMatrix sumForKey1: [hotCodeList objectAtIndex: rowIndex]]]; else return [NSNumber numberWithInt: totCount]; } if([[aTableColumn identifier] isEqualToString: @".EF"] == YES) { if(rowIndex < cnt) { e = [ef objectForKey: [hotCodeList objectAtIndex: rowIndex]]; if(e == nil) ee = 0.0; else ee = [e floatValue]; return [NSString stringWithFormat: @"%.3f", ee]; } else return [NSString stringWithFormat: @"%.3f", effAgSum]; } if(rowIndex >= cnt) { return [NSNumber numberWithInt: [myKMatrix sumForKey2: [aTableColumn identifier]]]; } return [NSString stringWithFormat: @"%d", [myKMatrix intForKey1: [hotCodeList objectAtIndex: rowIndex] key2: [aTableColumn identifier]]]; } @end gtamsanalyzer.app-0.42/Source/MWKeyedProject.h0000644000175000017500000000046110162465511021614 0ustar brentbrent00000000000000// // MGWMyDocumentKeyed.h // avtams // // Created by matthew on Sat Jun 05 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import "myProject.h" @interface myProject(MWKeyedProject) - (NSData *) keyedDataRepresentation; - (BOOL)loadKeyedData:(NSData *)data; @end gtamsanalyzer.app-0.42/Source/MWKeyedProject.m0000644000175000017500000002723510162465511021631 0ustar brentbrent00000000000000// // MGWMyDocumentKeyed.m // avtams // // Created by matthew on Sat Jun 05 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import "MWKeyedProject.h" #import "MWFile.h" #import "myProject.h" #import "MyDocument.h" #import "tams.h" #import "utils.h" #import "myResults.h" //#import "ctReadChar.h" #import "tableBrowser.h" #import "prefBoss.h" #import "TAMSCharEngine.h" #import "appDelegate.h" #import "MWPath.h" #import "ctTagInfo.h" #import "tamsutils.h" #import "MWKappa.h" #import "AGRegex.h" @implementation myProject(MWKeyedProject) - (NSData *) keyedDataRepresentation { NSMutableArray *fileArray = [NSMutableArray array]; NSMutableArray *resultArray = [NSMutableArray array]; NSMutableArray *searchArray = [NSMutableArray array]; NSString *pPath, *tPath; NSMutableData *myDat = [[NSMutableData alloc] init]; NSKeyedArchiver *myOut = [[NSKeyedArchiver alloc] initForWritingWithMutableData: myDat]; [myOut setOutputFormat: NSPropertyListXMLFormat_v1_0]; /*--Put my variables here */ NSLog(@"In keyeddatarep"); tPath = [self fileName]; pPath = [savingFileName stringByDeletingLastPathComponent]; //make an array //add to it a version # [myOut encodeObject: @"10" forKey: @"version"]; //add to it the search file list if([openFiles count]) { FORALL(openFiles) { if([temp path] == nil) continue; switch(absPathMode) { case ABSPATHMODE: [fileArray addObject: [[temp path] stringByStandardizingPath]]; break; case RELPATHMODE: [fileArray addObject: abs2rel(pPath, [temp path])]; break; case LOCPATHMODE: [fileArray addObject: [(MWFile *)temp name]]; break; }; } ENDFORALL; [myOut encodeObject: fileArray forKey: @"fileList"]; } if([searchFiles count]) { FORALL(searchFiles) { if([temp path] == nil) continue; switch(absPathMode) { case ABSPATHMODE: [searchArray addObject: [[temp path] stringByStandardizingPath]]; break; case RELPATHMODE: [searchArray addObject: abs2rel(pPath, [temp path])]; break; case LOCPATHMODE: [searchArray addObject: [(MWFile *)temp name]]; break; }; } ENDFORALL; [myOut encodeObject: searchArray forKey: @"searchList"]; } //add to it the init file if (initFile) { switch(absPathMode) { case ABSPATHMODE: [myOut encodeObject: [[initFile path] stringByStandardizingPath] forKey: @"init"]; break; case RELPATHMODE: [myOut encodeObject: abs2rel(pPath, [initFile path]) forKey: @"init"]; break; case LOCPATHMODE: [myOut encodeObject: [initFile name] forKey: @"init"]; break; }; } else [myOut encodeObject: @"" forKey: @"init"]; //add to it the code dictionary if([codeList count]) [myOut encodeObject: codeList forKey: @"codeList"]; //save the path mode switch(absPathMode) { case ABSPATHMODE: [myOut encodeObject: @"A" forKey: @"pathMode"]; break; case RELPATHMODE: [myOut encodeObject: @"R" forKey: @"pathMode"]; break; case LOCPATHMODE: [myOut encodeObject: @"F" forKey: @"pathMode"]; break; }; if([autoSetDict count]) [myOut encodeObject: [autoSetDict copy] forKey: @"autosets"]; if([resultFiles count]) { FORALL(resultFiles) { if([temp path] == nil) continue; switch(absPathMode) { case ABSPATHMODE: [resultArray addObject: [[temp path] stringByStandardizingPath]]; break; case RELPATHMODE: [resultArray addObject: abs2rel(pPath, [temp path])]; break; case LOCPATHMODE: [resultArray addObject: [(MWFile *)temp name]]; break; }; } ENDFORALL; [myOut encodeObject: resultArray forKey: @"resultList"]; } if([[self getSaveableNamedSearchList] count]) [myOut encodeObject: [self getSaveableNamedSearchList] forKey: @"namedSearchList"]; if([searchListMenu numberOfItems] > 0) [myOut encodeObject: [[[searchListMenu selectedItem] title] copy] forKey: @"selectedNamedSearchList"]; else [myOut encodeObject: @"" forKey: @"selectedNamedSearchList"]; if([namedSrch count]) [myOut encodeObject: namedSrch forKey: @"namedSearch"]; if ([codeSets count]) { [myOut encodeObject: [[codeSets copy] autorelease] forKey: @"codeSets"]; } if([[self fileSetsForSaving] count]) [myOut encodeObject: [self fileSetsForSaving] forKey: @"fileSets"]; [myOut encodeObject: [[fileSetCurrName copy] autorelease] forKey: @"currFileSet"]; if(tempCodeSet) [myOut encodeObject: [NSString stringWithString: @""] forKey: @"currCodeSet"]; else [myOut encodeObject: [[codeSetCurrName copy] autorelease] forKey: @"currCodeSet"]; if([summReports count]) [myOut encodeObject: summReports forKey: @"summReport"]; /*end block */ [myOut finishEncoding]; return myDat; } #define IFSAVEDKEY(X) if((testObj = [masterArray decodeObjectForKey: X]) != nil) - (BOOL)loadKeyedData:(NSData *)data { // Insert code here to read your document from the given data. You can also choose to override -loadFileWrapperRepresentation:ofType: or -readFromFile:ofType: instead. NSKeyedUnarchiver * masterArray; NSArray *fileList; MWFile *sfile; id testObj; NSString *tPath;//= [self fileName]; NSString *pPath = [[self fileName] stringByDeletingLastPathComponent]; int vers; masterArray = [[NSKeyedUnarchiver alloc] initForReadingWithData: data]; tPath = [self fileName]; vers = [[masterArray decodeObjectForKey: @"version"] intValue]; if((testObj = [masterArray decodeObjectForKey: @"autosets"]) != nil) [autoSetDict addEntriesFromDictionary: testObj]; IFSAVEDKEY(@"pathMode") { if([testObj isEqualToString: @"A"]) absPathMode = ABSPATHMODE; else if([testObj isEqualToString: @"R"]) absPathMode = RELPATHMODE; else if([testObj isEqualToString: @"L"]) absPathMode = LOCPATHMODE; else if([testObj isEqualToString: @"F"]) absPathMode = LOCPATHMODE; } else absPathMode = ABSPATHMODE; IFSAVEDKEY(@"resultList") { fileList = testObj; FORALL(fileList) { if(isAbsPath(temp)) { MWFile *mwf =[[MWFile alloc] initWithPath: [temp stringByStandardizingPath]]; [resultFiles addObject: mwf]; #ifdef FIXRESULTS [self addFile: mwf toSet: @"Results"]; #endif } else { MWFile *mwf ; if([temp length] == 0) continue; if([temp isEqualToString: @""]) continue; mwf = [[MWFile alloc] initWithPath: rel2abs(pPath, temp)]; [resultFiles addObject: mwf]; #ifdef FIXRESULTS [self addFile: mwf toSet: @"Results"]; #endif } } ENDFORALL; } IFSAVEDKEY(@"fileList") { fileList = [masterArray decodeObjectForKey: @"fileList"]; FORALL(fileList) { if(isAbsPath(temp)) { MWFile *mwf = [[MWFile alloc] initWithPath: [temp stringByStandardizingPath]]; [openFiles addObject: mwf]; [allFiles addObject: mwf]; } else { MWFile *mwf; if([temp length] == 0) continue; if([temp isEqualToString: @""]) continue; mwf=[[MWFile alloc] initWithPath: rel2abs(pPath, temp)]; [openFiles addObject: mwf]; [allFiles addObject: mwf]; } } ENDFORALL; } IFSAVEDKEY(@"searchList") { fileList = [masterArray decodeObjectForKey: @"searchList"]; FORALL(fileList) { if([temp length] == 0) continue; if([temp isEqualToString: @""]) continue; if(isAbsPath(temp)) sfile = [self fileForPath: [temp stringByStandardizingPath]]; else sfile = [self fileForPath: rel2abs(pPath,temp)]; if(sfile) { [searchFiles addObject: sfile]; } } ENDFORALL; } IFSAVEDKEY(@"init") { //[openFiles addObjectsFromArray: [masterArray decodeObjectForKey: 1]]; if([[masterArray decodeObjectForKey: @"init"] isEqualToString: @""]) initFile = nil; else { NSString *iiFile; iiFile = [masterArray decodeObjectForKey: @"init"]; if(isAbsPath(iiFile)) initFile = [self fileForPath: [iiFile stringByStandardizingPath]]; else initFile = [self fileForPath: rel2abs(pPath, iiFile)]; [initFileName setStringValue: [initFile name]]; [searchFiles removeObject: initFile]; [searchListView reloadData]; } } IFSAVEDKEY(@"codeList") [codeList addEntriesFromDictionary: [masterArray decodeObjectForKey: @"codeList"]]; IFSAVEDKEY(@"namedSearchList") [self setUseableNamedSearchList: [masterArray decodeObjectForKey: @"namedSearchList"]]; IFSAVEDKEY(@"selectedNamedSearchList") if([[masterArray decodeObjectForKey: @"selectedNamedSearchList"] isEqualToString: @""] == NO) [searchListMenu selectItemWithTitle: [masterArray decodeObjectForKey: @"selectedNamedSearchList"]]; IFSAVEDKEY(@"namedSearch") [namedSrch addEntriesFromDictionary: [masterArray decodeObjectForKey: @"namedSearch"]]; IFSAVEDKEY(@"codeSets") [codeSets addEntriesFromDictionary: [masterArray decodeObjectForKey: @"codeSets"]]; IFSAVEDKEY(@"fileSets") [self loadFileSets: [masterArray decodeObjectForKey: @"fileSets"]]; //[self loadFileSetWithName: [masterArray decodeObjectForKey: 13]]; IFSAVEDKEY(@"currFileSet") [fileSetCurrName setString: [masterArray decodeObjectForKey: @"currFileSet"]]; IFSAVEDKEY(@"currCodeSet") [codeSetCurrName setString: [masterArray decodeObjectForKey: @"currCodeSet"]]; IFSAVEDKEY(@"summReort") { [summReports addEntriesFromDictionary: [masterArray decodeObjectForKey: @"summReport"]]; [self rebuildSummReportMenu]; } [self setCodeListDirty]; return YES; } @end gtamsanalyzer.app-0.42/Source/MWKeyedResult.h0000644000175000017500000000052010162465511021460 0ustar brentbrent00000000000000// // MWKeyedResult.h // avtams // // Created by matthew on Sat Jun 05 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import #import #import "myResults.h" @interface myResults (MWKeyedResult) - (NSData *) keyedDataRepresentation; -(void) loadKeyedData; @end gtamsanalyzer.app-0.42/Source/MWKeyedResult.m0000644000175000017500000002701010162465511021470 0ustar brentbrent00000000000000// // MWKeyedResult.m // avtams // // Created by matthew on Sat Jun 05 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import "MWKeyedResult.h" #import "myResults.h" #import "ctReadChar.h" #import "tams.h" #import "ctLimitCrit.h" #import "TAMSCharEngine.h" #import "coderec.h" #import "NSRecordData.h" #import "prefBoss.h" #import "myProject.h" #import "docDelegate.h" #import "appDelegate.h" #import "utils.h" #import "tamsutils.h" #import "MWPath.h" #import "MWFakeFile.h" #import "MGWPopUpButton.h" //#import "AGRegex.h" #import #import #import "MWSortStackItem.h" #import "stringCategories.h" #import "MWTAMSStringCategories.h" #define UPDATERECCOUNT [self updateRecCount]; @implementation myResults (MWKeyedResult) - (NSData *) keyedDataRepresentation { NSMutableData *myDat = [[NSMutableData alloc] init]; NSKeyedArchiver *rootArray = [[NSKeyedArchiver alloc] initForWritingWithMutableData: myDat]; [rootArray setOutputFormat: NSPropertyListXMLFormat_v1_0]; NSMutableData *dd; int ab; NSMutableArray *nameList, *fixedDataArray, *nKeys; NSMutableDictionary *nSets; dd = [[NSMutableData alloc] init]; if(gWorkBench) { ab = [gWorkBench absPath]; } else ab = ABSPATHMODE; //1. save the version [rootArray encodeObject: @"10" forKey: @"version"]; FORALL(fileList) { if([temp hasFile] == NO) { NSWARNING(@"Cannot save in TAMS format until all source files have been saved."); return nil; } } ENDFORALL; //2. save the globals if([[myGlobals getGlobals] count]) [rootArray encodeObject: [myGlobals getGlobals] forKey: @"globals"]; //3. save the file list if([fileList count]) { nameList = [[NSMutableArray alloc] init]; FORALL(fileList) { [nameList addObject: [[(MWFile *) temp name] copy]]; } ENDFORALL; [rootArray encodeObject: [nameList autorelease] forKey: @"fileList"]; } //4. save the data if([backData count]) { fixedDataArray = [[NSMutableArray alloc] init]; FORALL(backData) { NSMutableDictionary *what; MWFile *myObj; what = [[NSMutableDictionary alloc] init]; [what addEntriesFromDictionary: temp]; myObj = [temp objectForKey: @"_doc"]; [what setObject: [[myObj name] copy] forKey: @"_doc"]; [fixedDataArray addObject: what]; } ENDFORALL; [rootArray encodeObject: [fixedDataArray autorelease] forKey: @"backData"]; } //5. save the visible data if([myData count]) [rootArray encodeObject: [self arrayFromSubset: myData] forKey: @"frontData"]; //6. save the named sets nKeys = [namedSelDict allKeys]; if([nKeys count]) { nSets = [[NSMutableDictionary alloc] init]; FORALL(nKeys) { [nSets setObject: [self arrayFromSubset: [namedSelDict objectForKey: temp]] forKey: temp]; } ENDFORALL; [rootArray encodeObject: [nSets autorelease] forKey: @"namedSets"]; } //7. the limit string if(limitString) [rootArray encodeObject: limitString forKey: @"limit"]; else [rootArray encodeObject: @"" forKey: @"limit"]; //8. the list of columns if([colList count]) [rootArray encodeObject: colList forKey: @"columns"]; //9. the current string [rootArray encodeObject: [[[limitField stringValue] copy] autorelease] forKey: @"limitField"]; //10. save the coder [rootArray encodeObject: [[codersString copy] autorelease] forKey: @"coders"]; //11. save autosets if([autoSets count]) [rootArray encodeObject: autoSets forKey: @"autosets"]; //12. save the selected row [rootArray encodeObject: [NSNumber numberWithInt: [theResults selectedRow]] forKey: @"selectedRow"]; //13. save marked list if([markedList count]) [rootArray encodeObject: [self arrayFromSubset: markedList] forKey: @"marked"]; //14. save summary reports if([summReports count]) [rootArray encodeObject: summReports forKey: @"summaryReports"]; //15. save date string [rootArray encodeObject: [[dfString copy] autorelease] forKey: @"dateFormat"]; [rootArray encodeObject: [NSNumber numberWithInt: dfIndex] forKey: @"dateFormatIndex"]; //16. save auto history if([autoHistory count]) [rootArray encodeObject: autoHistory forKey: @"autohistory"]; [rootArray encodeObject: [[autoHistoryStart copy] autorelease] forKey: @"autohistoryStart"]; //17. save media dictionary if([mediaDict count]) [rootArray encodeObject: [[mediaDict copy] autorelease] forKey: @"mediaDictionary"]; [rootArray finishEncoding]; return myDat; } #define IFSAVEDKEY(X) if((testObj = [rootArray decodeObjectForKey: X]) != nil) -(void) loadKeyedData { NSMutableArray *dataArray; NSMutableDictionary *theDict; NSArray *theSetNames, *fl; int selRow; NSDictionary *theSavedNS; id testObj; NSKeyedUnarchiver * rootArray; //NSMutableArray *fileList = [NSMutableArray array]; NSString *tPath; int vers; rootArray = [[NSKeyedUnarchiver alloc] initForReadingWithData: mySavedData]; tPath = [self fileName]; vers = [[rootArray decodeObjectForKey: @"version"] intValue]; // BOOL apm; // NSMutableString *wbPath = [[NSMutableString alloc] init];f selRow = 0; if(!gWorkBench) { NSWARNING(@"Cannot open file directly. Must open through a workbench/project"); return; } //rootArray = [NSUnarchiver unarchiveObjectWithData: mySavedData]; { //2. save the globals IFSAVEDKEY(@"globals") [myGlobals setGlobals: [rootArray decodeObjectForKey: @"globals"]]; //need to load the flag values //3. save the file list; have to convert to absolute paths IFSAVEDKEY(@"fileList") { fl = [rootArray decodeObjectForKey: @"fileList"]; FORALL(fl) { if(![gWorkBench fileForName: temp]) { NSString *msg1 = [NSString stringWithFormat:@"Cannot continue. Missing source file \"%@\" for this result.", temp]; NSWARNING(msg1); return; } else [fileList addObject: [gWorkBench fileForName: temp]]; } ENDFORALL; } //4. save the data IFSAVEDKEY(@"backData") { dataArray = [rootArray decodeObjectForKey: @"backData"]; FORALL(dataArray) { theDict = [[NSMutableDictionary alloc] initWithDictionary: temp]; [theDict setObject: [gWorkBench fileForName: [temp objectForKey: @"_doc"]] forKey: @"_doc"]; [backData addObject: theDict]; } ENDFORALL; } //5. save the visible data IFSAVEDKEY(@"frontData") [myData addObjectsFromArray: [self subsetFromArray: [rootArray decodeObjectForKey: @"frontData"]]]; //6. save the named sets //get the dictionary IFSAVEDKEY(@"namedSets") { theSavedNS = [rootArray decodeObjectForKey: @"namedSets"]; //get the keys theSetNames = [theSavedNS allKeys]; //work through them FORALL(theSetNames) { [namedSelDict setObject: [self subsetFromArray: [theSavedNS objectForKey: temp]] forKey: temp]; } ENDFORALL; } //if([theSetNames count]) [self renewNamedSelMenu]; //7. get the limit string if(!limitString) limitString = [[NSMutableString alloc] init]; IFSAVEDKEY(@"limit") [limitString setString: [rootArray decodeObjectForKey: @"limit"]]; //8. get colList IFSAVEDKEY(@"columns") [colList addObjectsFromArray: [rootArray decodeObjectForKey: @"columns"]]; //[myWindow setTitle: [[[self getMWFile] path] lastPathComponent]]; //9. IFSAVEDKEY(@"limitField") [limitField setStringValue: [rootArray decodeObjectForKey: @"limitField"]]; //10. get the Coder's list IFSAVEDKEY(@"coders") [codersString setString: [rootArray decodeObjectForKey: @"coders"]]; //11. get the automatic sets IFSAVEDKEY(@"autosets") { { [autoSets addEntriesFromDictionary: [rootArray decodeObjectForKey: @"autosets"]]; } [self rebuildAutoSetMenu]; } //12. get the selected row { IFSAVEDKEY(@"selectedRow") selRow = [[rootArray decodeObjectForKey: @"selectedRow"] intValue]; IFSAVEDKEY(@"marked") [self markBackArray: [rootArray decodeObjectForKey: @"marked"]]; } //13. summary reports IFSAVEDKEY(@"summaryReports") { [summReports addEntriesFromDictionary: [rootArray decodeObjectForKey: @"summaryReports"]]; [self rebuildSummReportMenu]; } { IFSAVEDKEY(@"dateFormat") [dfString setString: [rootArray decodeObjectForKey: @"dateFormat"]]; IFSAVEDKEY(@"dateFormatIndex") dfIndex = [[rootArray decodeObjectForKey: @"dateFormatIndex"] intValue]; } IFSAVEDKEY(@"autohistory") { [autoHistory addObjectsFromArray: [rootArray decodeObjectForKey: @"autohistory"]]; } IFSAVEDKEY(@"autohistoryStart") { [autoHistoryStart setString: [rootArray decodeObjectForKey: @"autohistoryStart"]]; } IFSAVEDKEY(@"mediaDictionary") { [mediaDict addEntriesFromDictionary: [rootArray decodeObjectForKey: @"mediaDictionary"]]; } [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleResultsDidChange:) name: @"TAMSResultDidChange" object: gWorkBench]; FORALL(fileList) { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleDirtySourceFlag:) name: @"TAMSDocDidChange" object: temp]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(addCodeHandler:) name: @"TAMSDocAddedCode" object: temp]; }ENDFORALL; [dirtySourceFlag setState: NSOnState]; UPDATERECCOUNT; [self updateChangeCount: NSChangeCleared]; [self rebuildSummReportMenu]; [self clearTable]; [self setupTables]; [theResults reloadData]; if(selRow >= 0) { [theResults selectRow: selRow byExtendingSelection: NO]; [theResults scrollRowToVisible: selRow]; } [rootArray autorelease]; } } @end gtamsanalyzer.app-0.42/Source/MWPath.h0000555000175000017500000000053510162465511020123 0ustar brentbrent00000000000000/* * MWFile.h * TEST2 * * Created by matthew on Tue Apr 29 2003. * Copyright (c) 2003 __MyCompanyName__. All rights reserved. * */ #import #import NSString *abs2rel(NSString *rootPath, NSString *myPath); NSString *rel2abs(NSString *rootPath, NSString *myPath); BOOL isAbsPath(NSString *who); gtamsanalyzer.app-0.42/Source/MWPath.m0000555000175000017500000000565310162465511020136 0ustar brentbrent00000000000000/* * MWFile.c * TEST2 * * Created by matthew on Tue Apr 29 2003. * Copyright (c) 2003 __MyCompanyName__. All rights reserved. * */ #import #import #include "MWPath.h" BOOL isAbsPath(NSString *who) { unsigned len; len = [who length]; NSLog(@"who = %d\n", len); if(len == 0) return NO; if([who characterAtIndex: 0] == '/') return YES; else return NO; } #define LASTCHAR(X) [X characterAtIndex: [X length] - 1] NSString *rel2abs(NSString *rootPath, NSString *myPath) { NSArray *rtarray, *patharray; int i, n, l1, l2; NSMutableString *absString; if(isAbsPath(myPath)) return myPath; absString = [[NSMutableString alloc ] init]; //count how many levels in root and total rtarray = [rootPath pathComponents]; l1 = [rtarray count]; //count how many ups in path and total patharray = [myPath pathComponents]; l2 = [patharray count]; n = 0; for(i = 0; i < l2; i++) { if([[patharray objectAtIndex: i] isEqualToString: @".."]) n++; else break; } //copy the root up to the number of ups for(i = 0; i < l1 - n; i++) { [absString appendString: [rtarray objectAtIndex: i]]; if (i > 0) [absString appendString: @"/"]; } for(i = n; i < l2; i++) { [absString appendString: [patharray objectAtIndex: i]]; [absString appendString: @"/"]; } if(LASTCHAR(myPath) != '/') //eat the last character [absString deleteCharactersInRange: NSMakeRange([absString length] - 1, 1)]; //and then the rest of the way down [absString autorelease]; return absString; } NSString *abs2rel(NSString *rootPath, NSString *aPath) { NSArray *rtarray, *patharray; int i, l1, l2, ll, rc; NSMutableString *relString; NSString *myPath; myPath = [aPath stringByStandardizingPath]; if(!isAbsPath(myPath)) return myPath; relString = [[NSMutableString alloc ] init]; //root to array rtarray = [rootPath pathComponents]; l1 = [rtarray count]; //path to array patharray = [myPath pathComponents]; l2 = [patharray count]; ll = (l1 < l2)? l1 : l2; //count how many levels are in common for(i = 0, rc = 0; i < ll; i++) { //how many to root after that if([[rtarray objectAtIndex: i] isEqualToString: [patharray objectAtIndex: i]]) rc++; else break; } //make dots up for (i = 0; i < l1 - rc; i++) { [relString appendString: @"../"]; } //make path back down for (i = rc; i < l2 ; i++) { [relString appendString: [patharray objectAtIndex: i]]; [relString appendString: @"/"]; } if(LASTCHAR(myPath) != '/') //eat the last character [relString deleteCharactersInRange: NSMakeRange([relString length] - 1, 1)]; //return it [relString autorelease]; return relString; }gtamsanalyzer.app-0.42/Source/MWRange.h0000555000175000017500000000064410162465511020264 0ustar brentbrent00000000000000// // MWRange.h // TEST2 // // Created by matthew on Sat Feb 07 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import @interface MWRange : NSObject { NSRange r; } -(id) initWithRange: (NSRange) rr; -(void) setLocation: (int) a length: (int) b; -(unsigned) location; -(unsigned) length; -(unsigned) end; -(NSRange) range; -(void) setRange: (NSRange) rr; @end gtamsanalyzer.app-0.42/Source/MWRange.m0000555000175000017500000000106010162465511020262 0ustar brentbrent00000000000000// // MWRange.m // TEST2 // // Created by matthew on Sat Feb 07 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import "MWRange.h" @implementation MWRange -(id)initWithRange: (NSRange) rr { [super init]; r = rr; return self; } -(void) setLocation: (int) a length: (int) b { r.location = a; r.length = b; } -(unsigned) location {return r.location;} -(unsigned) length {return r.length;} -(unsigned) end {return r.location + r.length;} -(NSRange) range {return r;} -(void) setRange: (NSRange) rr{r = rr;} @end gtamsanalyzer.app-0.42/Source/MWResultToolbarDelegate.h0000555000175000017500000000156610162465511023470 0ustar brentbrent00000000000000// // MWResultToolbarDelegate.h // avtams // // Created by matthew on Tue Mar 09 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import #import @interface MWResultToolbarDelegate : NSObject { IBOutlet id theDocument; IBOutlet id mainWindow; int buttonNdx; NSMutableArray *myButtons; NSMutableArray *allButtons; NSToolbar *myToolBar; } - (void)setupToolbar; - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag; - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar; - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar; -(BOOL) isButton: (NSString *) who; -(void) clearButtons; -(NSToolbarItem *) itemWithID: (NSString *) itemID image: (NSString *) fn action: (SEL) act; @end gtamsanalyzer.app-0.42/Source/MWResultToolbarDelegate.m0000555000175000017500000003376010162465511023476 0ustar brentbrent00000000000000// // MWResultToolbarDelegate.m // avtams // // Created by matthew on Tue Mar 09 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import "MWResultToolbarDelegate.h" #import "tams.h" #import "tamsutils.h" #import "utils.h" #define GSTOOLBAR1 NSString *MWRTBSave=@"Save..."; NSString *MWRTBWorkbench=@"Workbench"; NSString *MWRTBRefresh = @"Refresh"; NSString *MWRTBFindRecord =@"Find record"; NSString *MWRTBSortUpAZ =@"Sort A-Z"; NSString *MWRTBSortUpAZWithin =@"Sort A-Z within"; NSString *MWRTBSortUp09 =@"Sort 0-9"; NSString *MWRTBSortUp09Within =@"Sort 0-9 within"; NSString *MWRTBSortUpCode =@"Sort code"; NSString *MWRTBSortUpCodeWithin =@"Sort code within"; NSString *MWRTBSmartSortUp =@"Sort"; NSString *MWRTBSelectAll =@"Select all"; NSString *MWRTBSelect =@"Select..."; NSString *MWRTBSelectReverse =@"Select reverse"; NSString *MWRTBSelectLess =@"Rmv from sel..."; NSString *MWRTBSelectCodeSet=@"Sel. code set"; NSString *MWRTBSelectionToCodeSet=@"Sel. to code set"; NSString *MWRTBMark =@"Mark"; NSString *MWRTBUnmark =@"Unmark"; NSString *MWRTBAddCode =@"Add code..."; NSString *MWRTBRecode =@"Recode..."; NSString *MWRTBAutoset =@"Autoset..."; NSString *MWRTBDataSummary =@"Data summary..."; NSString *MWRTBExportData =@"Export data..."; NSString *MWRTBCollapseUp=@"Collapse up"; NSString *MWRTBCollapseDown=@"Collapse down"; NSString *MWRTBComment=@"Comment"; NSString *MWRTBColumn=@"Column"; NSString *MWRTBTags=@"Tags?"; NSString *MWRTBAddComment=@"+ Comment"; NSString *MWRTBAddMarkedComment=@"Comment marked"; NSString *MWRTBAddRootCode=@"+Root code"; NSString *MWRTBDelRootCode=@"-Root code"; NSString *MWRTBCodeLevel=@"Code level"; NSString *MWRTBCodeDef=@"Code def."; NSString *MWRTBSelCodeDef=@"Sel. code def."; NSString *MWRTBCodeBrowser=@"Code browser"; NSString *MWRTBPlayMedia=@"Play media"; #define MWSTRINGCOMP(X,Y) [X isEqualToString: Y] @implementation MWResultToolbarDelegate -(void) dealloc { [myButtons dealloc]; [allButtons dealloc]; } -(id) init { [super init]; myButtons = [[NSMutableArray alloc] init]; #ifdef GSTOOLBAR1 [myButtons addObject: MWRTBWorkbench]; [myButtons addObject: MWRTBFindRecord]; [myButtons addObject: MWRTBRefresh]; [myButtons addObject: MWRTBTags]; [myButtons addObject: MWRTBSmartSortUp]; [myButtons addObject: MWRTBSelect ]; [myButtons addObject: MWRTBSelectAll]; [myButtons addObject: MWRTBExportData]; #else [myButtons addObject: NSToolbarCustomizeToolbarItemIdentifier]; #ifdef COCOAVERSION [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif [myButtons addObject: MWRTBSave]; [myButtons addObject: MWRTBWorkbench]; #ifdef COCOAVERSION [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif [myButtons addObject: MWRTBFindRecord]; [myButtons addObject: MWRTBRefresh]; [myButtons addObject: MWRTBSmartSortUp]; #ifdef COCOAVERSION [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif [myButtons addObject: MWRTBSelectAll]; [myButtons addObject: MWRTBSelect ]; #ifdef COCOAVERSION [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif /* [myButtons addObject: MWRTBSortUpAZ ]; [myButtons addObject: MWRTBSortUpAZWithin]; #ifdef COCOAVERSION [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif [myButtons addObject: MWRTBMark ]; [myButtons addObject: MWRTBUnmark ]; #ifdef COCOAVERSION [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif [myButtons addObject: MWRTBAddCode]; [myButtons addObject: MWRTBRecode ]; #ifdef COCOAVERSION [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif [myButtons addObject: MWRTBAutoset ]; [myButtons addObject: MWRTBDataSummary]; */ #endif allButtons = [[NSMutableArray alloc] init]; [allButtons addObject: NSToolbarCustomizeToolbarItemIdentifier]; [allButtons addObject: NSToolbarSpaceItemIdentifier]; [allButtons addObject: NSToolbarFlexibleSpaceItemIdentifier]; #ifdef COCOAVERSION [allButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif [allButtons addObject: MWRTBSave]; [allButtons addObject: MWRTBWorkbench]; [allButtons addObject: MWRTBRefresh]; [allButtons addObject: MWRTBFindRecord]; [allButtons addObject: MWRTBSortUpAZ ]; [allButtons addObject: MWRTBSortUpAZWithin]; [allButtons addObject: MWRTBSortUp09 ]; [allButtons addObject: MWRTBSortUp09Within]; [allButtons addObject: MWRTBSortUpCode ]; [allButtons addObject: MWRTBSortUpCodeWithin]; [allButtons addObject: MWRTBSmartSortUp]; [allButtons addObject: MWRTBSelectAll]; [allButtons addObject: MWRTBSelect ]; [allButtons addObject: MWRTBSelectReverse ]; [allButtons addObject: MWRTBSelectLess ]; [allButtons addObject: MWRTBSelectCodeSet ]; [allButtons addObject: MWRTBSelectionToCodeSet ]; [allButtons addObject: MWRTBMark ]; [allButtons addObject: MWRTBUnmark ]; [allButtons addObject: MWRTBAddCode]; [allButtons addObject: MWRTBRecode ]; [allButtons addObject: MWRTBAddRootCode]; [allButtons addObject: MWRTBDelRootCode]; [allButtons addObject: MWRTBCodeLevel]; [allButtons addObject: MWRTBAutoset ]; [allButtons addObject: MWRTBDataSummary]; [allButtons addObject: MWRTBExportData]; [allButtons addObject: MWRTBCollapseUp]; [allButtons addObject: MWRTBCollapseDown]; [allButtons addObject: MWRTBComment]; [allButtons addObject: MWRTBColumn]; [allButtons addObject: MWRTBTags]; [allButtons addObject: MWRTBAddComment]; [allButtons addObject: MWRTBAddMarkedComment]; [allButtons addObject: MWRTBCodeDef]; [allButtons addObject: MWRTBSelCodeDef]; [allButtons addObject: MWRTBCodeBrowser]; [allButtons addObject: MWRTBPlayMedia]; return self; } - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag { NSToolbarItem *who; if(MWSTRINGCOMP(itemIdentifier, MWRTBRefresh)) who = [self itemWithID: MWRTBRefresh image: @"refresh.tif" action: @selector(refreshResults:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBFindRecord)) who = [self itemWithID: MWRTBFindRecord image: @"findRecord.tif" action: @selector(fetchRow:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSortUpAZ)) who = [self itemWithID: MWRTBSortUpAZ image: @"sortAZ.tif" action: @selector(sortUpAZ:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSortUp09)) who = [self itemWithID: MWRTBSortUp09 image: @"sort09.tif" action: @selector(sortUpInt:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSortUp09Within)) who = [self itemWithID: MWRTBSortUp09Within image: @"sort09Within.tif" action: @selector(sortUpIntWithin:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSortUpCode)) who = [self itemWithID: MWRTBSortUpCode image: @"sortCode.tif" action: @selector(sortUpCode:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSortUpCodeWithin)) who = [self itemWithID: MWRTBSortUpCodeWithin image: @"sortCodeWithin.tif" action: @selector(sortUpCodeWithin:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBAddRootCode)) who = [self itemWithID: MWRTBAddRootCode image: @"addRoot7.tif" action: @selector(doAddRootCode:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBDelRootCode)) who = [self itemWithID: MWRTBDelRootCode image: @"delRoot3.tif" action: @selector(doDelRootCode:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSmartSortUp)) who = [self itemWithID: MWRTBSmartSortUp image: @"smartSort.tif" action: @selector(smartSort:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBCodeLevel)) who = [self itemWithID: MWRTBCodeLevel image: @"codeLevel.tif" action: @selector(doCodeLevel:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSortUpAZWithin)) who = [self itemWithID: MWRTBSortUpAZWithin image: @"sortAZWithin.tif" action: @selector(sortUpAZWithin:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSelectAll)) who = [self itemWithID: MWRTBSelectAll image: @"selectAll3.tif" action: @selector(selectAllRecs:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSelectCodeSet)) who = [self itemWithID: MWRTBSelectCodeSet image: @"codeset2sel.tif" action: @selector(doSelectCodeSetDialogue:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSelectionToCodeSet)) who = [self itemWithID: MWRTBSelectionToCodeSet image: @"sel2codeset.tif" action: @selector(turnSelectionIntoCodeSet:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBCodeBrowser)) who = [self itemWithID: MWRTBCodeBrowser image: @"codeBrowser.tif" action: @selector(showCodeBrowser:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSelect)) who = [self itemWithID: MWRTBSelect image: @"selectSome.tif" action: @selector(selectRecs:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSelectReverse)) who = [self itemWithID: MWRTBSelectReverse image: @"selectReverse.tif" action: @selector(selectReverseRecs:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSelectLess)) who = [self itemWithID: MWRTBSelectLess image: @"removeFrom.tif" action: @selector(selectFewerRecs:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBMark)) who = [self itemWithID: MWRTBMark image: @"markRec.tif" action: @selector(doMark:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBUnmark)) who = [self itemWithID: MWRTBUnmark image: @"unmarkRec2.tif" action: @selector(doUnmark:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBAddComment)) who = [self itemWithID: MWRTBAddComment image: @"addcomment.tif" action: @selector(doAddComment:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBAddMarkedComment)) who = [self itemWithID: MWRTBAddMarkedComment image: @"addmarkedcomment.tif" action: @selector(doAppendCommentToMarked:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBAddCode)) who = [self itemWithID: MWRTBAddCode image: @"addCode.tif" action: @selector(doAddCode:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBRecode)) who = [self itemWithID: MWRTBRecode image: @"reCode2.tif" action: @selector(doRecode:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBAutoset)) who = [self itemWithID: MWRTBAutoset image: @"autoSet.tif" action: @selector(createAutoSet:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBDataSummary)) who = [self itemWithID: MWRTBDataSummary image: @"dataSumm2.tif" action: @selector(runSummaryReport:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSave)) who = [self itemWithID: MWRTBSave image: @"Save.tif" action: @selector(saveDocument:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBPlayMedia)) who = [self itemWithID: MWRTBPlayMedia image: @"playMedia.tif" action: @selector(doMediaPlayer:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBWorkbench)) who = [self itemWithID: MWRTBWorkbench image: @"wbicn.tif" action: @selector(moveWorkBenchForward:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBCollapseUp)) who = [self itemWithID: MWRTBCollapseUp image: @"collapseUp.tif" action: @selector(doCollapseUp:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBCollapseDown)) who = [self itemWithID: MWRTBCollapseDown image: @"collapseDown.tif" action: @selector(doCollapseDown:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBComment)) who = [self itemWithID: MWRTBComment image: @"comment.tif" action: @selector(doShowComment:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBCodeDef)) who = [self itemWithID: MWRTBCodeDef image: @"def.tif" action: @selector(requestCodeDefinition:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBSelCodeDef)) who = [self itemWithID: MWRTBSelCodeDef image: @"defFromSel.tif" action: @selector(requestCodeDefinitionOfSelection:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBColumn)) who = [self itemWithID: MWRTBColumn image: @"column.tif" action: @selector(doBrowseField:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBTags)) who = [self itemWithID: MWRTBTags image: @"tag2.tif" action: @selector(doSetStripTags:)]; else if(MWSTRINGCOMP(itemIdentifier, MWRTBExportData)) who = [self itemWithID: MWRTBExportData image: @"export.tif" action: @selector(exportData:)]; else who = [[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier]; return [who autorelease]; } - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar { return allButtons; } - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar { //return myButtons; return myButtons; } -(void) clearButtons { [allButtons removeAllObjects]; } -(BOOL) isButton: (NSString *) who { NSArray *theList; theList = [myToolBar items]; FORALL(theList) { if([who isEqualToString: [temp itemIdentifier]] == YES) return YES; } ENDFORALL; return NO; } - (void)setupToolbar { NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier: @"ResultWindowToolbar"];// uniqueString()]; [toolbar autorelease]; [toolbar setDelegate:self]; [toolbar setAllowsUserCustomization:YES]; [toolbar setAutosavesConfiguration: YES]; [mainWindow setToolbar: toolbar]; myToolBar = toolbar; } -(NSToolbarItem *) itemWithID: (NSString *) itemID image: (NSString *) fn action: (SEL) act { NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemID]; [item setLabel: itemID]; [item setPaletteLabel:itemID]; [item setImage:[NSImage imageNamed: fn]]; [item setTarget:theDocument]; [item setAction: act]; return item; } -(void) awakeFromNib { [self setupToolbar]; } @end gtamsanalyzer.app-0.42/Source/MWSortStackItem.h0000555000175000017500000000173210162465511021763 0ustar brentbrent00000000000000// // MWSortStackItem.h // TamsAnalyzer // // Created by matthew on Sat Mar 08 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #define SORTDATE 1 #define SORTSTRING 2 #define SORTFLOATNUMBER 3 #define SORTINTNUMBER 4 #define SORTCODE 5 #define NSOBJVERS #import int stackComp(id first, id second, NSMutableArray *sortStack); @interface MWSortStackItem #ifdef NSOBJVERS : NSObject { #else : NSObject { #endif #ifdef NSOBJVERS NSString *columnID; BOOL up; int type; NSMutableString *dateFormat; int codeLevel; #else NSMutableDictionary *slf; #endif } -(id) init; -(id) initWithID: (NSString *) who direction: (BOOL) which type: (int) how dateFormat: (NSString *) df codeLevel: (int)cl; -(NSString *) column; -(BOOL) direction; -(int) sortType; -(void) setDateFormat: (NSString *) df; -(NSString *) dateFormat; -(int) codeLevel; #ifdef NSOBJVERS //-(void) setObject: (id) what forKey: (id) who; #endif @end gtamsanalyzer.app-0.42/Source/MWSortStackItem.m0000555000175000017500000002111510162465511021765 0ustar brentbrent00000000000000// // MWSortStackItem.m // TamsAnalyzer // // Created by matthew on Sat Mar 08 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "MWSortStackItem.h" #import "utils.h" #import "tamsutils.h" int stackComp(id first, id second, NSMutableArray *sortStack) { int i; int cnt; NSMutableDictionary *thisOne; NSComparisonResult cr; cr = NSOrderedAscending; cnt = [sortStack count]; for(i = 0; i < [sortStack count]; i++) { thisOne = [sortStack objectAtIndex: i]; if([[thisOne objectForKey: @"type"] intValue] == SORTSTRING) { if([thisOne objectForKey: @"case"] == nil) cr = [(NSString *) [first objectForKey: [thisOne objectForKey: @"col"]] compare: [second objectForKey: [thisOne objectForKey: @"col"]]]; else cr = [(NSString *) [first objectForKey: [thisOne objectForKey: @"col"]] compare: [second objectForKey: [thisOne objectForKey: @"col"]] options: NSCaseInsensitiveSearch]; if(cr == NSOrderedSame) continue; if([[thisOne objectForKey: @"up"] boolValue] == YES) { if(cr == NSOrderedAscending) return NSOrderedAscending; if(cr == NSOrderedDescending) return NSOrderedDescending; } else { if(cr == NSOrderedAscending) return NSOrderedDescending; if(cr == NSOrderedDescending) return NSOrderedAscending; } } else if([[thisOne objectForKey: @"type"] intValue] == SORTINTNUMBER) { if([[first objectForKey: [thisOne objectForKey: @"col"] ] intValue] < [[second objectForKey: [thisOne objectForKey: @"col"] ] intValue]) cr = -1; if([[first objectForKey: [thisOne objectForKey: @"col"] ] intValue] > [[second objectForKey: [thisOne objectForKey: @"col"] ] intValue]) cr = 1; if([[first objectForKey: [thisOne objectForKey: @"col"] ] intValue] == [[second objectForKey: [thisOne objectForKey: @"col"] ] intValue]) cr = 0; if(cr == 0) continue; if([[thisOne objectForKey: @"up"] boolValue] == YES) { if(cr == -1) return NSOrderedAscending; if(cr == 1) return NSOrderedDescending; } else { if(cr == -1) return NSOrderedDescending; if(cr == 1) return NSOrderedAscending; } } else if([[thisOne objectForKey: @"type"] intValue] == SORTFLOATNUMBER) { if([[first objectForKey: [thisOne objectForKey: @"col"] ] doubleValue] < [[second objectForKey: [thisOne objectForKey: @"col"] ] doubleValue]) cr = -1; if([[first objectForKey: [thisOne objectForKey: @"col"] ] doubleValue] > [[second objectForKey: [thisOne objectForKey: @"col"] ] doubleValue]) cr = 1; if([[first objectForKey: [thisOne objectForKey: @"col"] ] doubleValue] == [[second objectForKey: [thisOne objectForKey: @"col"] ] doubleValue]) cr = 0; if(cr == 0) continue; if([[thisOne objectForKey: @"up"] boolValue] == YES) { if(cr == -1) return NSOrderedAscending; if(cr == 1) return NSOrderedDescending; } else { if(cr == -1) return NSOrderedDescending; if(cr == 1) return NSOrderedAscending; } } else if([[thisOne objectForKey: @"type"] intValue] == SORTDATE) { if([(NSDate *)[NSCalendarDate dateWithString: [first objectForKey: [thisOne objectForKey: @"col"] ] calendarFormat: [thisOne objectForKey: @"dateFormat"] ] compare: (NSDate *)[NSCalendarDate dateWithString: [second objectForKey: [thisOne objectForKey: @"col"] ] calendarFormat: [thisOne objectForKey: @"dateFormat"] ]] == NSOrderedDescending) cr = -1; else if([(NSDate *)[NSCalendarDate dateWithString: [first objectForKey: [thisOne objectForKey: @"col"] ] calendarFormat: [thisOne objectForKey: @"dateFormat"] ] compare: (NSDate *)[NSCalendarDate dateWithString: [second objectForKey: [thisOne objectForKey: @"col"] ] calendarFormat: [thisOne objectForKey: @"dateFormat"] ]] == NSOrderedAscending) cr = 1; else continue; if([[thisOne objectForKey: @"up"] boolValue] == YES) { if(cr == 1) return NSOrderedAscending; if(cr == -1) return NSOrderedDescending; } else { if(cr == 1) return NSOrderedDescending; if(cr == -1) return NSOrderedAscending; } } else if ([[thisOne objectForKey: @"type"] intValue] == SORTCODE) { int ll; if([[thisOne objectForKey: @"codeLevel"] intValue] > 0) { ll = compCodeByLevel((NSString *) [first objectForKey: [thisOne objectForKey: @"col"] ], [second objectForKey: [thisOne objectForKey: @"col"] ]); if(ll >= [[thisOne objectForKey: @"codeLevel"] intValue] ) continue; } cr = [(NSString *) [first objectForKey: [thisOne objectForKey: @"col"] ] compare: [second objectForKey: [thisOne objectForKey: @"col"] ]]; if(cr == NSOrderedSame) continue; if([[thisOne objectForKey: @"up"] boolValue] == YES) { if(cr == NSOrderedAscending) return NSOrderedAscending; if(cr == NSOrderedDescending) return NSOrderedDescending; } else { if(cr == NSOrderedAscending) return NSOrderedDescending; if(cr == NSOrderedDescending) return NSOrderedAscending; } } } return NSOrderedSame; } @implementation MWSortStackItem -(id) init { [super init]; #ifdef NSOBJVERS dateFormat = [[NSMutableString alloc] init]; columnID = [[NSMutableString alloc] init]; #else slf = [[NSMutableDictionary alloc] init]; #endif return self; } -(id) initWithID: (NSString *) who direction: (BOOL) which type: (int) how dateFormat: (NSString *) df codeLevel: (int) cl { [super init]; #ifdef NSOBJVERS dateFormat = [[NSMutableString alloc] initWithString: df]; columnID = [[NSMutableString alloc] initWithString: who]; up = which; codeLevel = cl; type = how; #else [slf setObject: [NSMutableString stringWithString: df] forKey: @"dateFormat"]; [slf setObject: [NSMutableString stringWithString: who] forKey: @"col"]; //dateFormat = [[NSMutableString alloc] initWithString: df]; //columnID = who; [slf setObject: [NSNumber numberWithBool: which] forKey: @"up"]; [slf setObject: [NSNumber numberWithInt: how] forKey: @"type"]; [slf setObject: [NSNumber numberWithInt: cl] forKey: @"codeLevel"]; #endif return self; } #ifdef NSOBJVERS -(void) encodeWithCoder: (NSCoder *) coder { NSMutableDictionary *md = [NSMutableDictionary dictionary]; //[coder encodeObject: [[columnID copy] autoRelease]]; //[coder encodeObject: [[dateFormat copy] autorelease] ]; [md setObject: [[columnID copy] autorelease] forKey: @"col"]; [md setObject: [[dateFormat copy] autorelease] forKey: @"dateFormat"]; [md setObject: [NSNumber numberWithBool: up] forKey: @"up"]; [md setObject: [NSNumber numberWithBool: type] forKey: @"type"]; [md setObject: [NSNumber numberWithBool: codeLevel] forKey: @"codeLevel"]; //[super encodeWithCoder: coder]; [coder encodeObject: md]; } -(id) initWithCoder: (NSCoder *) coder { NSDictionary *md; [super init]; md = [coder decodeObject]; dateFormat = [[NSMutableString alloc] initWithString: [md objectForKey: @"dateFormat"]]; columnID = [[NSMutableString alloc] initWithString: [md objectForKey: @"col"]]; up = [[md objectForKey: @"up"] boolValue]; type = [[md objectForKey: @"type"] intValue]; codeLevel = [[md objectForKey: @"codeLevel"] intValue]; return self; } #else -(void) encodeWithCoder: (NSCoder *) coder{ [coder encodeObject: self]; } -(id) initWithCoder: (NSCoder *) coder { NSDictionary *md; [super init]; md = [coder decodeObject]; slf = [[NSMutableDictionary alloc] init]; [slf addEntriesFromDictionary: md]; return self; } #endif #ifdef NSOBJVERS -(NSString *) column {return columnID;} -(BOOL) direction {return up;} -(int) sortType {return type;} -(void) setDateFormat: (NSString *) df {[dateFormat setString: df];} -(NSString *) dateFormat {return dateFormat;} -(int) codeLevel {return codeLevel;} -(void) dealloc {[dateFormat dealloc]; [super dealloc];} #else -(NSString *) column {return [slf objectForKey: @"col"];} -(BOOL) direction {return [[slf objectForKey: @"up"] boolValue];} -(int) sortType {return [[slf objectForKey: @"type"] intValue];} -(void) setDateFormat: (NSString *) df {[slf setObject: [[df copy] autorelease] forKey: @"dateFormat"];} -(NSString *) dateFormat {return [slf objectForKey: @"dateFormat"];} -(int) codeLevel {return [[slf objectForKey: @"codeLevel"] intValue];} -(void) dealloc { #ifdef NSOBJVERS [dateFormat release]; [columnID release]; #else [slf release]; #endif [super dealloc];} #endif @end gtamsanalyzer.app-0.42/Source/MWSummaryReport.gorm/0000755000175000017500000000000010162465511022646 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/MWSummaryReport.gorm/data.classes0000644000175000017500000000656711062075653025160 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:" ); Super = NSObject; }; MWSummaryReport = { Actions = ( ); Outlets = ( dataTable ); Super = NSDocument; }; }gtamsanalyzer.app-0.42/Source/MWSummaryReport.gorm/data.info0000644000175000017500000000027011062075653024437 0ustar brentbrent00000000000000GNUstep archive00002a96:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed Streamgtamsanalyzer.app-0.42/Source/MWSummaryReport.gorm/objects.gorm0000644000175000017500000001001311062075653025164 0ustar brentbrent00000000000000GNUstep archive00002a96:0000001e:00000063:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%NSOwner0&% MWSummaryReport0&% GSCustomClassMap0&0& %  TableColumn101 NSTableColumn0 &% column2 Co A GP0 1NSTableHeaderCell1NSTextFieldCell1 NSActionCell1 NSCell0 &%  0 1 NSFont% &&&&&&&&%0 1 NSColor0&%NSNamedColorSpace0&% System0&% controlShadowColor0 0&% System0&% windowFrameTextColor00&% nine0 %&&&&&&&&%0 0&% textBackgroundColor0 0& %  textColor0& %  ScrollView01 NSScrollView1NSView1 NSResponder%  C C  C C&01NSMutableArray1NSArray&01 NSClipView% A A C Cb  C Cb&0&0 1 NSTableView1 NSControl%  C C!  C C!&0!&%0" 0#&&&&&&&&&0$&0%0&&% column1 C A GP0'0(&%  &&&&&&&&%0) 0*&%System0+&%controlShadowColor0,0-&%neuf-&&&&&&&&%0. 0/& %  gridColor00 01&% System02&% controlBackgroundColor031NSTableHeaderView%  C A  C A&04&051GSTableCornerView% @ @ A A  A A&06&%% A @ @@0071 NSScroller% @ A A Cu  A Cu&08&%09 #&&&&&&&&&2 _doScroll:v12@0:4@850:% A @ C A  C A&0;&30< 0=& %  controlColor0>% A C{ C A  C A&0?&%0@ 0A&&&&&&&&&&% A A A A >7:0B& %  GormNSWindow0C1NSWindow%  C C&% B D 0D%  C C  C C&0E&0F 0G&% System0H&% windowBackgroundColor0I&% Window0J&% Window0K&%Window ? A F@ F@%0L1NSImage0M&%NSApplicationIcon0N& %  TableColumn%0O&% GormNSTableView 0P&  0Q1NSNibConnectorB0R&%NSOwner0S0TO0UN0V0W1NSNibOutletConnectorOR0X& %  dataSource0YOR0Z&% delegate0[RB0\&% _window0]BR0^&% windowController0_BR0`&% delegate0aRO0b& %  dataTable0c1 GSMutableSet1 NSMutableSet1NSSet&Cgtamsanalyzer.app-0.42/Source/MWSummaryReport.h0000555000175000017500000000203010162465511022050 0ustar brentbrent00000000000000/* * MWSummaryReport.h * TEST2 * * Created by matthew on Sat Oct 18 2003. * Copyright (c) 2003 __MyCompanyName__. All rights reserved. * */ #import #import "myResults.h" #import "NSMutableNumber.h" #define SUMMCOUNT 0 #define SUMMSUM 1 #define SRALPHATYPE 0 #define SRINTTYPE 1 #define SRREALTYPE 2 #define SRDATETYPE 3 #define SRCODETYPE 4 @interface MWSummaryReport : NSDocument { IBOutlet id dataTable; IBOutlet NSWindow *myWindow; //inputs NSMutableArray *data; NSMutableArray *groupData; int summType, countDup, compLevel, countBlank; int summFieldType; NSMutableString *summField; NSMutableString *summSumField; NSMutableString *dateFormat; NSMutableArray *sortStack; //output NSMutableArray *summData; NSMutableNumber *tot; } -(void) buildSummary; -(void) setData: (NSMutableArray *) d andReport: (NSDictionary *) aReport; -(void) setDateFormat: (NSString *) df; -(void) setupTable; - (id) columnID: (NSString *) col row: (int) rowIndex; @end gtamsanalyzer.app-0.42/Source/MWSummaryReport.m0000555000175000017500000004051310162465511022065 0ustar brentbrent00000000000000// // MWSummaryReport.m // TEST2 // // Created by matthew on Fri Oct 17 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "MWSummaryReport.h" #import "NSMutableNumber.h" #import "tamsutils.h" #import "tams.h" #import "MWSortStackItem.h" #define COLWIDTH 90 void MAKECOLUMN(NSTableView *TABLE,NSString *MYID, NSString *HEAD) {NSTableColumn *_t = [[NSTableColumn alloc] initWithIdentifier: MYID]; [_t setWidth: COLWIDTH];[TABLE addTableColumn: _t]; [[_t headerCell] setStringValue: HEAD];} @implementation MWSummaryReport -(id) init { [super init]; groupData = [[NSMutableArray alloc] init]; summData = [[NSMutableArray alloc] init]; summField = [[NSMutableString alloc] init]; summSumField = [[NSMutableString alloc] init]; dateFormat = [[NSMutableString alloc] init]; tot = [[NSMutableNumber alloc] init]; sortStack = [[NSMutableArray alloc] init]; return self; } -(void) dealloc { [groupData release]; [summData release]; [summField release]; [summSumField release]; [dateFormat release]; [sortStack release]; [tot release]; [super dealloc]; } -(BOOL) isEqualToLevel: (int) level first: (NSString *)c1 second: (NSString *) c2 { int ll; if(level == 0) return [c1 isEqualToString: c2]; if([c1 isEqualToString: c2] ==YES) return YES; ll = compCodeByLevel(c1, c2); if(ll >= level) return YES; return NO; } -(IBAction) niceClose: (id) Sender { [myWindow performClose: self]; } -(void) sortData: (NSMutableArray *) who withStack: (NSArray *) stack { NSMutableArray *ms = [[NSMutableArray alloc] init]; FORALL(stack) { [ms addObject: temp]; [who sortUsingFunction: stackComp context: ms]; } ENDFORALL; [ms release]; } -(void) setData: (NSMutableArray *) d andReport: (NSDictionary *) aReport; { data = d; [groupData addObjectsFromArray: [aReport objectForKey: @"groupData"]]; [summField setString: [aReport objectForKey: @"summField"]]; summType = [[aReport objectForKey: @"summType"] intValue]; countDup = [[aReport objectForKey: @"countDup"] boolValue]; countBlank = [[aReport objectForKey: @"countBlank"] boolValue]; compLevel = [[aReport objectForKey: @"compLevel"] intValue]; summFieldType = [[aReport objectForKey: @"summFieldType"] intValue]; if([aReport objectForKey: @"sort"] != nil) [sortStack addObjectsFromArray: [aReport objectForKey: @"sort"]]; else { [sortStack release]; sortStack = nil; } } -(BOOL) compareField: (NSString *) field type: (int) t first: (NSString *) s1 second: (NSString *) s2 compLevel: (int) cl { if(t == SRINTTYPE) return ([s1 intValue] == [s2 intValue])? YES : NO; if(t == SRREALTYPE) return ([s1 floatValue] == [s2 floatValue]) ? YES : NO; if(t == SRALPHATYPE) return [s1 isEqualToString: s2]; if(t == SRDATETYPE) { return [[NSCalendarDate dateWithString:s1 calendarFormat: dateFormat] isEqualToDate: [NSCalendarDate dateWithString:s2 calendarFormat: dateFormat]]; } if(t == SRCODETYPE) { return [self isEqualToLevel: cl first: s1 second: s2]; } } -(void) printShowingPrintPanel: (BOOL) flag { NSPrintInfo *printInfo = [self printInfo]; NSPrintOperation *printOp; printOp = [NSPrintOperation printOperationWithView: dataTable printInfo: printInfo]; [printOp setShowPanels: flag]; [printOp runOperation]; } #define COUNTNAME(X) ((summType == SUMMCOUNT)? [NSString stringWithFormat: @"%@ Count",X] : [NSString stringWithFormat: @"%@ Sum",X]) #define SUMNAME(X) [NSString stringWithFormat: @"%@ Sum",X] -(void) setupTable { //delete the existing columns //create the right number of columns with the right headers //send a refresh id tc; tc = [dataTable tableColumns]; FORALL(tc) { [dataTable removeTableColumn: temp]; } ENDFORALL; //create new ones if([summData count] == 0) return; //make the count stuff here // md = [myData objectAtIndex: 0]; MAKECOLUMN(dataTable, @"Total", @"Total"); FORALL(groupData) { NSString *title; title = [temp objectForKey: @"field"]; MAKECOLUMN(dataTable, title, title); } ENDFORALL; FORALL(groupData) { NSString *title; title = [temp objectForKey: @"field"]; MAKECOLUMN(dataTable, COUNTNAME(title), COUNTNAME(title)); } ENDFORALL; MAKECOLUMN(dataTable, COUNTNAME(@"Total"), COUNTNAME(@"Total")); [dataTable setAllowsColumnReordering: YES]; [dataTable reloadData]; } -(NSString *) stringValue: (NSDictionary *) record field: (NSString *) which { if([which isEqualToString: @"_doc"] == YES) { return [[record objectForKey: which] name]; } else if([which isEqualToString: @"_end_loc"] == YES) { return [record objectForKey: which]; } else if([which isEqualToString: @"_begin_loc"] == YES) { return [record objectForKey: which]; } else return [record objectForKey: which]; } -(NSString *) realValue: (NSString *) ss toLevel: (int) l { NSArray *mid; NSMutableArray *aend; int i; if(l == 0) return [[ss copy] autorelease]; mid = [ss componentsSeparatedByString: @">"]; if([mid count] <= l) return [[ss copy] autorelease]; aend = [NSMutableArray array]; for(i=0; i< l; i++) { [aend addObject: [[[mid objectAtIndex: i] copy] autorelease]]; } return [aend componentsJoinedByString: @">"]; } -(NSString *) realValue: (NSString *) ss forGroup: (NSDictionary *) dd { int l; if([[dd objectForKey: @"type"] intValue] == SRCODETYPE) { l = [[dd objectForKey: @"compLevel"] intValue]; return [self realValue: ss toLevel: l]; } else return [[ss copy] autorelease]; } -(void) buildSummary { int fflag; int i,j,n,m, i1; NSMutableArray *currValue, *summArray; id currData; int breakpnt; if(sortStack != nil) [self sortData: data withStack: sortStack]; currValue = [NSMutableArray array]; summArray = [NSMutableArray array]; fflag = 1; n = [data count]; m = [groupData count]; for(i = 0 ; i < n; i++) { currData = [data objectAtIndex: i]; if(fflag) { FORALL(groupData) { [currValue addObject: [[[self stringValue: currData field: [temp objectForKey: @"field"]] copy] autorelease]]; } ENDFORALL; [currValue addObject: [[[self stringValue: currData field: summField] copy] autorelease]]; fflag = 0; //loop for all summArray FORALL(groupData) { if (summType == SUMMCOUNT) { [summArray addObject: [[[NSMutableNumber alloc] initWithInt: 1]autorelease]]; } else { [summArray addObject: [[[NSMutableNumber alloc] initWithString: [self stringValue: currData field: summField]] autorelease] ]; } }ENDFORALL; if(summType == SUMMCOUNT) [tot inc]; else [tot addString: [self stringValue: currData field: summField]]; } else { breakpnt = -1; //Check for break,find the lowest member of currValue to break FORALL(groupData) { if([self compareField: [temp objectForKey: @"field"] type: [[temp objectForKey: @"type"] intValue] first: [self stringValue: currData field: [temp objectForKey: @"field"]] second: [currValue objectAtIndex: __i] compLevel: [[temp objectForKey: @"compLevel"] intValue]] == NO ) { breakpnt = __i; break; } } ENDFORALL; if(breakpnt>=0) { for(j = m - 1; j >= breakpnt; j--) { NSMutableDictionary *sr = [NSMutableDictionary dictionary]; [sr setObject: [self realValue: [currValue objectAtIndex: j] forGroup: [groupData objectAtIndex: j]] forKey: @"value"]; [sr setObject: [[summArray objectAtIndex: j] description] forKey: @"summValue"]; [sr setObject: [NSNumber numberWithInt: j] forKey: @"level"]; [sr setObject: [[[[groupData objectAtIndex: j] objectForKey: @"field"] copy] autorelease] forKey: @"field"]; for(i1 = 0; i1 < j; i1++) { [sr setObject: [self realValue: [[[currValue objectAtIndex: i1] copy] autorelease] forGroup: [groupData objectAtIndex: i1]] forKey: [[groupData objectAtIndex: i1] objectForKey: @"field"]]; } [summData addObject: sr]; [[summArray objectAtIndex: j] zeroInt]; } } // this involves a compare value at the appropriate level //all values higher need to have summary records made and zero arrays //--if yes make summary and zero the the summArray arrays //set currValues { switch(summType) { case SUMMCOUNT: if (countBlank == NO && [[self stringValue:currData field: summField] isEqualToString: @""] == YES) { ; } else if(countDup == NO) { //need to check to see if we really do this if( breakpnt < 0 && [self compareField: summField type: summFieldType first: [self stringValue: currData field: summField] second: [currValue objectAtIndex: m] compLevel: compLevel] == YES) { ;//don't do a thing. } else { for(j = 0; j < m; j++){ [[summArray objectAtIndex: j] inc]; if(j==0)[tot inc];} } } else { for(j = 0; j < m; j++){ [[summArray objectAtIndex: j] inc]; if(j==0)[tot inc]; } } break; case SUMMSUM: for(j = 0; j < m; j++){ [[summArray objectAtIndex: j] addString: [self stringValue: currData field: summField]]; if(j==0)[tot addString: [self stringValue: currData field: summField]]; } default:; } } [currValue removeAllObjects]; FORALL(groupData) { [currValue addObject: [[[self stringValue: currData field: [temp objectForKey: @"field"]] copy] autorelease]]; } ENDFORALL; [currValue addObject: [[[self stringValue: currData field: summField] copy] autorelease]]; } } for(j = m - 1; j >= 0; j--) { NSMutableDictionary *sr = [NSMutableDictionary dictionary]; [sr setObject: [self realValue: [currValue objectAtIndex: j] forGroup: [groupData objectAtIndex: j]] forKey: @"value"]; [sr setObject: [[[[groupData objectAtIndex: j] objectForKey: @"field"] copy] autorelease] forKey: @"field"]; [sr setObject: [[summArray objectAtIndex: j] description] forKey: @"summValue"]; [sr setObject: [NSNumber numberWithInt: j] forKey: @"level"]; for(i1 = 0; i1 < j; i1++) { [sr setObject: [self realValue: [[[currValue objectAtIndex: i1] copy] autorelease] forGroup: [groupData objectAtIndex: i1]] forKey: [[groupData objectAtIndex: i1] objectForKey: @"field"]]; } [summData addObject: sr]; [[summArray objectAtIndex: j] zeroInt]; } { int n; n = [summData count]; n++; } [self setupTable]; [dataTable reloadData]; [self updateChangeCount: NSChangeDone]; } - (NSString *)windowNibName { // Implement this to return a nib to load OR implement -makeWindowControllers to manually create your controllers. return @"MWSummaryReport"; } - (NSData *)dataRepresentationOfType:(NSString *)type { // Implement to provide a persistent data representation of your document OR remove this and implement the file-wrapper or file path based save methods. NSMutableData *dd; NSMutableArray *ci = [[NSMutableArray alloc] init]; int i, n; dd = [[NSMutableData alloc] init]; //make the count stuff here // md = [myData objectAtIndex: 0]; DATASTRING(dd, @"Total"); [ci addObject: @"Total"]; FORALL(groupData) { NSString *title; title = [temp objectForKey: @"field"]; DATATAB(dd); DATASTRING(dd, title); [ci addObject: title]; } ENDFORALL; FORALL(groupData) { NSString *title; title = [temp objectForKey: @"field"]; DATATAB(dd); DATASTRING(dd, COUNTNAME(title)); [ci addObject: COUNTNAME(title)]; } ENDFORALL; DATATAB(dd); DATASTRING(dd, COUNTNAME(@"Total")); [ci addObject: COUNTNAME(@"Total")]; DATANL(dd); n = [summData count]; for(i = 0; i <=n ; i++) { FORALL(ci) { if(__i > 0) DATATAB(dd); DATASTRING(dd, [self columnID: temp row: i]); } ENDFORALL; DATANL(dd); } [ci release]; return dd; } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)type { // Implement to load a persistent data representation of your document OR remove this and implement the file-wrapper or file path based load methods. return NO; } -(void) setDateFormat: (NSString *) df { [dateFormat setString: df]; } -(NSWindow *) window {return myWindow;} - (int)numberOfRowsInTableView:(NSTableView *)aTableView { int n = [summData count]; return n+1; } - (id) columnID: (NSString *) col row: (int) rowIndex { NSMutableDictionary *dd; NSString *tt ; if(rowIndex == [summData count] && [col isEqualToString: @"Total"]) return @"Total"; if(rowIndex == [summData count] && [col isEqualToString: COUNTNAME(@"Total")]) return [tot description]; if(rowIndex == [summData count]) return @""; dd = [summData objectAtIndex: rowIndex]; tt = [dd objectForKey: @"field"]; if([col isEqualToString: COUNTNAME(tt)] == YES) return [dd objectForKey: @"summValue"]; if([col isEqualToString: tt] == YES) return [dd objectForKey: @"value"]; if([dd objectForKey: col] != nil) return [dd objectForKey: col]; return @""; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { return [self columnID: [aTableColumn identifier] row: rowIndex]; /* if(rowIndex == [summData count] && [[aTableColumn identifier] isEqualToString: @"Total"]) return @"Total"; if(rowIndex == [summData count] && [[aTableColumn identifier] isEqualToString: COUNTNAME(@"Total")]) return [tot description]; if(rowIndex == [summData count]) return @""; dd = [summData objectAtIndex: rowIndex]; tt = [dd objectForKey: @"field"]; if([[aTableColumn identifier] isEqualToString: COUNTNAME(tt)] == YES) return [dd objectForKey: @"summValue"]; if([[aTableColumn identifier] isEqualToString: tt] == YES) return [dd objectForKey: @"value"]; return @""; */ } @end gtamsanalyzer.app-0.42/Source/MyDocument.h0000555000175000017500000001550710162465511021054 0ustar brentbrent00000000000000// // MyDocument.h // TAMS Edit // // Created by matthew on Thu Apr 18 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #define DATATYPE 1 #define RESULTTYPE 2 #import #import #import "toolBarDelagate.h" #import "MWFile.h" #import "tams.h" //#import "myProject.h" @interface MyDocument : NSDocument { //kludge for flags int rawF, exactF, emptyF, simpleF, sectionF, regexCharF, nonRegexCharF; int rtfFlag; //real variables int myDocType; IBOutlet NSTextView *theDoc; IBOutlet NSTableView *theCodeList; IBOutlet NSTableView *searchCodeList; IBOutlet NSTextField *theNewCode; IBOutlet NSTabView *theTabs; IBOutlet NSWindow *myWindow; IBOutlet id myToolbar; IBOutlet id coderIDView; IBOutlet id initFileSearchSwitch; IBOutlet id movieTitle; IBOutlet id myColorWell; IBOutlet id inheritedColorSwitch; IBOutlet id rawButton; IBOutlet id exactButton; IBOutlet id emptyButton; IBOutlet id simpleButton; IBOutlet id sectionButton; IBOutlet id codeButton; IBOutlet NSTextView *codeInfo; IBOutlet NSTextField *newCodeName; IBOutlet NSWindow *codeInfoSheet; IBOutlet id codeColorMenu; IBOutlet id widthSheet; IBOutlet id wsWidthSize; IBOutlet id wsStartNumber; IBOutlet id wsBlankBreakSwitch; IBOutlet id wsCountEmptyLineSwitch; IBOutlet id commentView; IBOutlet id commentSheet; id gWorkBench; MWFile *myFID; IBOutlet id rateMenu; NSMutableString *codeInfoStr; BOOL dirty; NSMutableString *myData; NSData *dataFromFile; NSMutableArray *hotCodeList; //for searching IBOutlet NSTextField *theLimitString; IBOutlet NSTextField *theWindowName; //for comments IBOutlet id setCommentSheet; IBOutlet id setCommentMenu; IBOutlet id setCommentField; //for code sets IBOutlet id codeSetSheet; IBOutlet id codeSetName; //for bookmarks NSMutableArray *bookmarkVault; NSMenuItem *rebuildBMenuItem; NSMutableDictionary *savedFormat; //for macros NSMutableArray *macroArray; //for av #ifdef MULTIMEDIA IBOutlet NSMovieView *myMovieView; NSMovie *myMovie; IBOutlet id stopStartButton; IBOutlet id timeField; NSTimer *myTimer; BOOL jagFlag; long duration; #else id myMovie; #endif } -(int) getDocType; -(NSString *) getTitle; -(NSString *) theLimitString; -(NSString *) theWindowName; -(int) rawF; -(int) exactF; -(int) emptyF; -(int) simpleF; -(int) sectionF; -(int) regexCharF; -(int) nonRegexCharF; -(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who; -(void) recode: (NSString *) what first: (int) bwhere last: (int) ewhere from: (id) who; -(void) recode: (NSString *) what first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(NSArray *) getHotCodeList; -(NSString *) stringFrom: (int) b to: (int) e; -(void) recode: (NSString *) what comment: (NSString *)cmt first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(void) deleteCodeFromResultStartingWith: (int) bwhere endingWith: (int) ewhere from: (id) who; -(void) adjustResultDocsAt: (int) loc forLength: (int) len; -(BOOL) isNew: (NSString *) what; -(void) appendString: (NSString *)what; -(void) setDirty: (BOOL) value; -(BOOL) dirty; -(IBAction) rebuildBookmarks: (id) sender; -(IBAction) okCodeInfo: (id) sender; -(IBAction) searchForCode: (id) Sender; -(IBAction) integrateCodes: (id) sender; -(IBAction) doFindCurrentCode: (id) sender; -(IBAction) doFindNextCode: (id) sender; -(IBAction) checkForPairs: (id) sender; -(IBAction) checkForNested: (id) sender; -(IBAction) insertTAMSText: (id) sender; -(IBAction) moveWorkBenchForward: (id) sender; -(IBAction) addItemToToolbar: (id) sender; -(IBAction) doRemoveBookmarks: (id) sender; -(IBAction) doFindSelectedRange: (id) sender; -(IBAction) doTurnTextToButton: (id) sender; -(IBAction) doToggleRuler: (id) sender; -(IBAction) requestCodeDefinition: (id) sender; -(IBAction) doColorize: (id) sender; #ifdef MULTIMEDIA -(IBAction) setRate: (id) sender; #endif -(void) setReanalysisState: (BOOL) which; -(void) setTitleFromFile; -(void) setGWorkBench: (id) who; -(id) getGWorkBench; -(void) setMWFile: (MWFile *) who; -(MWFile *) getMyMWFile; -(void) scanForMetas; -(void) renewBookmarkMenu; -(void) insertString: (NSString *) what; -(void) moveForward; -(IBAction) generateCodeList: (id) Sender; -(void) selectAndScrollRange: (NSRange) theRange andMoveForward: (BOOL) move; -(void) displayCode; -(IBAction) refreshCodeList: (id) Sender; -(void) updateCodeWindow; -(void) zapCodeWindow; -(IBAction) addCode: (id) Sender; -(IBAction) newCode: (id) Sender; -(BOOL) isACode: (NSString *) who; -(IBAction) okCountLines: (id) sender; -(IBAction) cancelCountLines: (id) sender; -(IBAction) okCodeWithComment: (id) sender; -(IBAction) cancelCodeWithComment: (id) sender; -(IBAction) editCodeSet: (id) Sender; -(void) scrollToTop; -(NSMutableArray *) hotCodeList; -(NSArray *) remakeCodeList; -(void) assignCode; -(void) loadtextViewWithData:(NSData *) data; -(void) setData; -(NSString *) getData; -(void) applyCode: (NSString *) aCode; -(void) applyCode: (NSString *) aCode withComment: (NSString *) comment; -(BOOL)tableView: (NSTableView *) aTable shouldEditTableColumn: (NSTableColumn *) aCol row: (unsigned) arow; -(void) sheetDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo; -(BOOL) isMyCode: (NSString *) who; -(BOOL) isValidCode: (NSString *) who; -(NSString *) codersList; -(void) performClose; -(void) printShowingPrintPanel: (BOOL) flag; -(NSTextView *) myTextView; //movies #ifdef MULTIMEDIA -(IBAction) startMovie: (id) sender; -(IBAction) stopMovie: (id) sender; -(IBAction) openMovie: (id) sender; -(IBAction) insertMovieTime: (id) sender; -(IBAction) setMovieTime: (id) sender; -(IBAction) backSpaceMovieTime: (id) Sender; -(void) loadMediaFile: (NSString *) who; -(IBAction) fwdFrame: (id) sender; -(IBAction) bkFrame: (id) sender; -(IBAction) gotoMovieEnd: (id) sender; -(IBAction) gotoMovieStart: (id) sender; -(IBAction) clearMediaFileTags: (id) sender; -(IBAction) speedUp: (id) sender; -(IBAction) slowDown: (id) sender; -(void) endTimer; #endif -(IBAction) selectColorFromWell:(id)Sender; -(IBAction) selectColorFromSwitch:(id) sender; -(IBAction) rebuildDocMacros: (id) sender; -(IBAction) handleDocMacro: (id) sender; -(void) addMacroItem: (NSString *) ss code: (BOOL) aCode; -(IBAction) okSetComment: (id) sender; -(IBAction) cancelSetComment: (id) sender; -(IBAction) cancelNameCodeSet: (id) Sender; -(IBAction) okNameCodeSet: (id) Sender; -(IBAction) doNameCodeSet: (id) Sender; @end extern MyDocument *gCurrentDataSource; gtamsanalyzer.app-0.42/Source/MWTAMSStringCategories.h0000555000175000017500000000074710162465511023175 0ustar brentbrent00000000000000// // MWTAMSStringCategories.h // avtams // // Created by matthew on Sun Mar 21 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import @interface NSString(MWTAMSStringCategories) -(int) numberOfCodeComponents; -(NSString *) lastCodeComponents: (int) cnt; -(NSString *) lastCodeComponent; -(NSString *) firstCodeComponents: (int) cnt; -(NSString *) firstCodeComponent; -(NSArray *) codeComponents; -(NSString *) copyrelease; @end gtamsanalyzer.app-0.42/Source/MWTAMSStringCategories.m0000555000175000017500000000262210162465511023174 0ustar brentbrent00000000000000// // MWTAMSStringCategories.m // avtams // // Created by matthew on Sun Mar 21 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import "MWTAMSStringCategories.h" @implementation NSString(MWTAMSStringCategories) -(NSString *) copyrelease { return [[self copy] autorelease]; } -(int) numberOfCodeComponents { return [[self codeComponents] count]; } -(NSString *) lastCodeComponents: (int) cnt { NSArray *myComponents; int n; myComponents = [self codeComponents]; n = [myComponents count]; if(cnt < n) { NSArray *myNewSelf; myNewSelf = [myComponents subarrayWithRange: NSMakeRange(n - cnt, cnt)]; return [myNewSelf componentsJoinedByString: @">"]; } else return [self copyrelease]; } -(NSString *) lastCodeComponent { return [self lastCodeComponents: 1]; } -(NSString *) firstCodeComponents: (int) cnt { NSArray *myComponents; int n; myComponents = [self codeComponents]; n = [myComponents count]; if(cnt < n) { NSArray *myNewSelf; myNewSelf = [myComponents subarrayWithRange: NSMakeRange(0, cnt)]; return [myNewSelf componentsJoinedByString: @">"]; } else return [self copyrelease]; } -(NSString *) firstCodeComponent { return [self firstCodeComponents: 1]; } -(NSArray *) codeComponents { return [self componentsSeparatedByString: @">"]; } @end gtamsanalyzer.app-0.42/Source/MyDocument.m0000555000175000017500000035504010162465511021060 0ustar brentbrent00000000000000// // MyDocument.m // TAMS Edit // // Created by matthew on Thu Apr 18 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // //#import "ctReadChar.h" #ifdef MULTIMEDIA #import "Carbon/Carbon.h" #endif #import "MyDocument.h" #import "tams.h" #import "tamsutils.h" #import "myResults.h" #import "myProject.h" #import "prefBoss.h" #import "bookmarkInfo.h" #import "appDelegate.h" #import "ctTagInfo.h" #import "tableBrowser.h" #import "TAMSCharEngine.h" #import "stringCategories.h" #import "MGWPopUpButton.h" #import "MWRange.h" #import "MWFakeFile.h" #define NSTRIM(X) [X stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]] #import #define BOOKMARKBASE 3 #define DOCMACROBASE 6 #define NEWAPPLYCODE 1 #define USETIMER 0 MyDocument *gCurrentDataSource; #define SETRAWCOLOR(X) [theDoc setTextColor: X range: [theDoc selectedRange]]; #define SETCOLOR(X) [theDoc setTextColor: [gWorkBench colorForCode: X] range: [theDoc selectedRange]]; #define SETBASECOLOR [theDoc setTextColor: getColorForInt([gPrefBoss tagColorValue]) range: [theDoc selectedRange]]; @implementation MyDocument -(id) init { #ifdef MULTIMEDIA #ifdef USETIMER myTimer = nil; #endif #endif rawF = 1; emptyF = exactF = 0; regexCharF = nonRegexCharF = 0; [super init]; myDocType = DATATYPE; dataFromFile = nil; myMovie = nil; myData = nil; savedFormat = nil; macroArray = [[NSMutableArray alloc] init]; // hotCodeList = [[NSMutableArray alloc] init]; bookmarkVault = [[NSMutableArray alloc] init]; codeInfoStr = [[NSMutableString alloc] init]; // [hotCodeList retain]; return self; } -(void) dealloc{ [[NSNotificationCenter defaultCenter] removeObserver: self]; [dataFromFile release]; [macroArray release]; #ifdef MULTIMEDIA #ifdef USETIMER if(myTimer != nil) { [myTimer invalidate]; [myTimer release]; } #endif #endif [hotCodeList dealloc]; if(savedFormat) [savedFormat release]; if(myMovie != nil) {[myMovie release];} [super dealloc]; } -(myProject *) getGWorkBench { return gWorkBench;} -(NSColor *) getColor: (int) col { switch(col) { case red: return [NSColor redColor]; break; case yellow: return [NSColor yellowColor]; break; case green: return [NSColor greenColor] ; break; case blue: return [NSColor blueColor] ; break; case ltgray: return [NSColor lightGrayColor] ; break; case gray: return [NSColor grayColor] ; break; case dkgray: return [NSColor darkGrayColor]; break; case black: return [NSColor blackColor]; break; default: ; } } -(void) newColorOn: (NSColor *) what { [theDoc setTextColor: what range: [theDoc selectedRange]]; } -(void) colorOn: (int) col { switch(col) { case red: [theDoc setTextColor: [NSColor redColor] range: [theDoc selectedRange]]; break; case yellow: [theDoc setTextColor: [NSColor yellowColor] range: [theDoc selectedRange]]; break; case green: [theDoc setTextColor: [NSColor greenColor] range: [theDoc selectedRange]]; break; case blue: [theDoc setTextColor: [NSColor blueColor] range: [theDoc selectedRange]]; break; case ltgray: [theDoc setTextColor: [NSColor lightGrayColor] range: [theDoc selectedRange]]; break; case gray: [theDoc setTextColor: [NSColor grayColor] range: [theDoc selectedRange]]; break; case dkgray: [theDoc setTextColor: [NSColor darkGrayColor] range: [theDoc selectedRange]]; break; default: ; } } -(void) colorOff { [theDoc setTextColor: [NSColor blackColor] range: [theDoc selectedRange]]; } /* This is a version of find next code, but it assumes the calling function does the setup */ -(void) findNextCode: (TAMSCharEngine *) who { ctQChar *q; int aloc, bloc, l; NSRange n; q = [[ctQChar alloc] init]; //set up system //get selection //save location n = [theDoc selectedRange]; l = [[theDoc string] length]; if(n.location > l - 1) return; //set up cursor one character back [who setCharLocation: (aloc = n.location + n.length)]; //loop while(aloc < l - 1) { //save location A read a character save location B aloc = [who getCharLocation]; //is it a code? [who readnext: q]; bloc = [who getCharLocation]; if([q tokentype] == TOKEN || [q tokentype] == ENDTOKEN || [q tokentype] == META) //Yes select from A-B { [theDoc setSelectedRange: NSMakeRange(aloc, bloc - aloc)]; [theDoc scrollRangeToVisible: NSMakeRange(aloc, bloc - aloc)]; [q release]; return; } // else aloc = bloc - 1; //[who setCharLocation: (aloc + 1)]; } [q release]; //else goto A-1 } #define COLOR1 -(IBAction) doColorize: (id) sender { NSRange r,s; NSTextStorage *ts = [theDoc textStorage]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; ctQChar *q; if(!gWorkBench) return; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; q = [[ctQChar alloc] init]; r = [theDoc selectedRange]; [ts beginEditing]; while([tc scanNext: q] != ENDOFFILE) { if([q tokentype] == TOKEN || [q tokentype] == ENDTOKEN) { /* [ts addAttribute: NSForegroundColorAttributeName value: [gWorkBench colorForCode: [q buff]] range: [q range]]; */ [theDoc setTextColor: [gWorkBench colorForCode: [q buff]] range: [q range]]; } //else if([q tokentype] == ENDOFFILE) else if([q tokentype] == META) { /* [ts addAttribute: NSForegroundColorAttributeName value: getColorForInt([gPrefBoss tagColorValue]) range: [q range]]; */ [theDoc setTextColor: [gPrefBoss metaColor] range: [q range]]; } } //[ts processEditing]; [ts endEditing]; //[theDoc didChangeText]; [theDoc setAllowsUndo: YES]; //[theDoc setSelectedRange: r]; //[theDoc scrollRangeToVisible: r]; [self updateChangeCount: NSChangeDone]; [q release]; [tc release]; } -(IBAction) doColorizeRange: (NSRange) theRange { NSRange r,s; NSTextStorage *ts = [theDoc textStorage]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; MWFakeFile *mff; ctQChar *q; if(!gWorkBench) return; mff = [[MWFakeFile alloc] initWithString: [[theDoc string] substringWithRange: theRange]]; [tc addFileToSearchList: mff]; [tc startSearch]; q = [[ctQChar alloc] init]; r = [theDoc selectedRange]; [ts beginEditing]; while([tc scanNext: q] != ENDOFFILE) { if([q tokentype] == TOKEN || [q tokentype] == ENDTOKEN) { /* [ts addAttribute: NSForegroundColorAttributeName value: [gWorkBench colorForCode: [q buff]] range: [q range]]; */ s = [q range]; [theDoc setTextColor: [gWorkBench colorForCode: [q buff]] range: NSMakeRange(s.location + theRange.location, s.length)]; } //else if([q tokentype] == ENDOFFILE) else if([q tokentype] == META) { /* [ts addAttribute: NSForegroundColorAttributeName value: getColorForInt([gPrefBoss tagColorValue]) range: [q range]]; */ s = [q range]; [theDoc setTextColor: [gPrefBoss metaColor] range: NSMakeRange(s.location + theRange.location, s.length)]; } } //[ts processEditing]; [ts endEditing]; //[theDoc didChangeText]; [theDoc setAllowsUndo: YES]; //[theDoc setSelectedRange: r]; //[theDoc scrollRangeToVisible: r]; [self updateChangeCount: NSChangeDone]; [q release]; [tc release]; [mff release]; } -(IBAction) doColorOn: (id) sender { NSRange r,s; int myColor; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; [theDoc setAllowsUndo: YES]; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; if([[sender title] isEqualToString: @"Red"] ==YES) myColor = red; else if([[sender title] isEqualToString: @"Yellow"] ==YES) myColor = yellow; else if([[sender title] isEqualToString: @"Green"] ==YES) myColor = green; else if([[sender title] isEqualToString: @"Blue"] ==YES) myColor = blue; else if([[sender title] isEqualToString: @"Light gray"] ==YES) myColor = ltgray; else if([[sender title] isEqualToString: @"Gray"] ==YES) myColor = gray; else if([[sender title] isEqualToString: @"Dark gray"] ==YES) myColor = dkgray; #ifdef COLOR2 { NSScanner *myscn; int n1, n2, nt; NSTextStorage *myts; NSString *dummm; NSString* theTxt; NSRange rrr; myts = [theDoc textStorage]; // [myts beginEditing]; theTxt = [theDoc string]; nt = [theTxt length]; myscn = [[NSScanner alloc] initWithString: theTxt]; [myscn setScanLocation: 0]; while ([myscn scanUpToString: @"{" intoString: nil] == YES) { n1 = [myscn scanLocation]; if([myscn scanUpToString: @"}" intoString: nil] ==YES) { n2 = [myscn scanLocation]+1; [myts addAttribute: NSForegroundColorAttributeName value: [self getColor: myColor] range: NSMakeRange(n1, n2-n1)]; } else break; } // [myts endEditing]; [theDoc didChangeText]; [myscn release]; } #endif #ifdef COLOR1 { ctQChar *qq; NSTextStorage *ts = [theDoc textStorage]; qq = [[ctQChar alloc] init]; r = [theDoc selectedRange]; [theDoc setSelectedRange: NSMakeRange(0,0)]; s = NSMakeRange(0,0); [ts beginEditing]; while([tc scanNext: qq] != ENDOFFILE) { if([qq tokentype] == CHAR) continue; //[self findNextCode: tc]; //[theDoc setSelectedRange: [qq range]]; //[self colorOn: myColor]; [ts addAttribute: NSForegroundColorAttributeName value: [self getColor: myColor] range: [qq range]]; } [ts endEditing]; [theDoc setAllowsUndo: YES]; [theDoc setSelectedRange: r]; [theDoc scrollRangeToVisible: r]; [self updateChangeCount: NSChangeDone]; [qq release]; [tc release]; } #endif #ifdef COLOR3 r = [theDoc selectedRange]; [theDoc setSelectedRange: NSMakeRange(0,0)]; s = NSMakeRange(0,0); for(;;) { [self findNextCode: tc]; t = [theDoc selectedRange]; if(s.length == t.length && s.location == t.location) break; [self colorOn: myColor]; s = t; } [theDoc setAllowsUndo: YES]; [theDoc setSelectedRange: r]; [theDoc scrollRangeToVisible: r]; [self updateChangeCount: NSChangeDone]; [tc release]; #endif } -(IBAction) doColorOff: (id) sender { NSRange r; r = [theDoc selectedRange]; /* [theDoc setSelectedRange: NSMakeRange(0,0)]; s = NSMakeRange(0,0); for(;;) { [self doFindNextCode: nil]; t = [theDoc selectedRange]; if(s.length == t.length && s.location == t.location) break; [self colorOff]; s = [theDoc selectedRange]; } */ [theDoc setTextColor: [NSColor blackColor]]; [theDoc setSelectedRange: r]; [theDoc scrollRangeToVisible: r]; [self updateChangeCount: NSChangeDone]; } -(int) sectionF {return sectionF;} -(int) emptyF{ return emptyF;} -(int) exactF {return exactF;} -(int) rawF {return rawF;} -(int) simpleF {return simpleF;} -(int) regexCharF {return regexCharF;} //to start with don't do this for single file searches -(int) nonRegexCharF {return nonRegexCharF;} -(void) printShowingPrintPanel: (BOOL) flag { //NSPrintInfo *printInfo = [self printInfo]; NSPrintOperation *printOp; printOp = [NSPrintOperation printOperationWithView: theDoc]; //printInfo: printInfo]; [printOp setShowPanels: flag]; [printOp runOperation]; } /* - (void)print:(id)sender { NSPrintOperation *op = [NSPrintOperation printOperationWithView:theDoc]; // Assume printAccessoryView exists and returns your custom view NSView *accView = [self printAccessoryView]; [op setAccessoryView:accView]; [op runOperation]; } */ -(NSString *) getTitle { return [myWindow title]; } -(int) getDocType {return myDocType;} - (NSString *)windowNibName { // Override returning the nib file name of the document // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. return @"MyPanedDocument"; } -(void) appendString: (NSString *)what { NSRange n, l; //save location n = [theDoc selectedRange]; //find the end l = NSMakeRange([[theDoc string] length],0); //insert [theDoc setSelectedRange: l]; [theDoc insertText: what]; //restore location [theDoc setSelectedRange: n]; } -(NSString *) theLimitString { return [theLimitString stringValue]; } - (void) assignCode { [self addCode: self]; } - (void) displayCode { int who; //NSLog(@"in display code\n"); who = [theCodeList selectedRow]; if(who >= 0) { [theNewCode setStringValue: [[gWorkBench getHotCodeList] objectAtIndex: who]]; } } -(IBAction) displayCode: (id) sender { //NSLog(@"In display:\n"); [self displayCode]; } -(void) setReanalysisState: (BOOL) which; { if(which == YES) { [theDoc setEditable: NO]; [theDoc setSelectable: YES]; if([[theDoc undoManager] isUndoRegistrationEnabled] == YES) { [[theDoc undoManager] removeAllActions]; [[theDoc undoManager] disableUndoRegistration]; } } else { [theDoc setEditable: YES]; if([[theDoc undoManager] isUndoRegistrationEnabled] == NO) [[theDoc undoManager] enableUndoRegistration]; } } -(void) goReanalysisMode: (NSNotification *) notification { if([[[notification userInfo] objectForKey: @"state"] isEqualToString: @"ON"] == YES) { [self setReanalysisState: YES]; } else [self setReanalysisState: NO]; } - (void)windowControllerDidLoadNib:(NSWindowController *) aController { [super windowControllerDidLoadNib:aController]; //deal with the toolbar // Add any code here that need to be executed once the windowController has loaded the document's window. if(dataFromFile) { [self loadtextViewWithData: dataFromFile]; [dataFromFile release]; dataFromFile = nil; } #ifdef OLDWORKINGCODE //now that the codes are built, build the button bar (this should be combined with the bookmarks [self doFindButtons: nil]; //find the bookmark window tttt = rebuildBMenuItem = [[NSApp delegate] rebuildMenuItem]; [self rebuildBookmarks: rebuildBMenuItem]; #endif //This has to be moved to the workbench since it does not have access //to it's mwfile yet //[self scanForMetas]; //loads the bookmarks and buttons--relocated to the project file //register //[gWorkBench registerWindow: self]; //[theDoc becomeFirstResponder]; [theDoc setImportsGraphics: YES]; #ifdef MULTIMEDIA #ifdef USETIMER if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_2) jagFlag = YES; else jagFlag = FALSE; myTimer = [[NSTimer scheduledTimerWithTimeInterval:0.1 // interval, 0.1 seconds target:self selector:@selector(idleTimer:) // call this method userInfo:nil repeats:YES] retain]; #endif #endif [myWindow makeFirstResponder: theDoc]; [self refreshCodeList: nil]; [theCodeList reloadData]; //NSLog(@"setting action--"); [theCodeList setTarget: self]; [theCodeList setAction: @selector(displayCode)]; [theCodeList setDoubleAction: @selector(assignCode)]; //NSLog(@"action set\n"); [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(rootColorChanged:) name: @"rootColorChanged" object: nil]; } -(void) rootColorChanged: (id) notification { [self doColorize: nil]; } -(NSString *) theWindowName { return [theWindowName stringValue]; } - (BOOL)loadFileWrapperRepresentation:(NSFileWrapper *)wrapper ofType:(NSString *)docType { if([docType isEqualToString: @"RTFD"] == YES) { return [self loadDataRepresentation: [wrapper serializedRepresentation] ofType: docType]; } else return [super loadFileWrapperRepresentation: wrapper ofType: docType]; } -(void) loadtextViewWithData:(NSData *) data { if(rtfFlag == 0) { myData = [[NSMutableString alloc] initWithCString: [data bytes]]; [theDoc setString: myData]; [myData release]; } else if (rtfFlag == 1) { [theDoc replaceCharactersInRange: NSMakeRange(0, [[theDoc string] length]) withRTF: data]; } else if (rtfFlag == 2) { [theDoc replaceCharactersInRange: NSMakeRange(0, [[theDoc string] length]) withRTFD: data]; } } - (NSFileWrapper *)fileWrapperRepresentationOfType:(NSString *)aType { if([aType isEqualToString: @"RTFD"] == YES) { return [[NSFileWrapper alloc] initWithSerializedRepresentation:[theDoc RTFDFromRange: NSMakeRange(0, [[theDoc string] length])]]; } else return [super fileWrapperRepresentationOfType: aType]; } - (NSData *)dataRepresentationOfType:(NSString *)aType { // Insert code here to write your document from the given data. //You can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead. if([aType isEqualToString: @"Text"] == YES) { return [NSMutableData dataWithBytes: [[theDoc string] cString] length: [[theDoc string] cStringLength]]; } else if ([aType isEqualToString: @"Rich text file"] == YES) { return [theDoc RTFFromRange: NSMakeRange(0, [[theDoc string] length])]; } else if ([aType isEqualToString: @"RTFD"] == YES) { return [theDoc RTFDFromRange: NSMakeRange(0, [[theDoc string] length])]; } } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType { // Insert code here to read your document from the given data. You can also choose to override -loadFileWrapperRepresentation:ofType: or -readFromFile:ofType: instead. if(theDoc) { [self loadtextViewWithData: data]; } else { dataFromFile = [data retain]; } if([aType isEqualToString: @"Text"] == YES) { rtfFlag = 0; } else if([aType isEqualToString: @"Rich text file"] == YES) { rtfFlag = 1; } else if([aType isEqualToString: @"RTFD"] == YES) { rtfFlag = 2; } return YES; } -(void) updateCodeWindow { [theCodeList removeAllToolTips]; if(gWorkBench != nil) { if([gWorkBench isCodeSet] == YES) { NSString *ccs = [NSString stringWithFormat: @"Codes: %@",[gWorkBench currCodeSet]]; NSSETHEADER(theCodeList, @"Codes", ccs ); } else { NSSETHEADER(theCodeList, @"Codes",@"Codes"); } } [theCodeList reloadData]; } -(void) zapCodeWindow { [theCodeList removeAllToolTips]; [hotCodeList removeAllObjects]; [theCodeList reloadData]; } -(void) setDirty: (BOOL) value { dirty = value; } -(BOOL) dirty { return dirty; } -(NSString *) getData { return [theDoc string]; } -(void) setData { //gTheData = [[theDoc string] copy]; //resetDataStream(); } -(IBAction) generateCount: (id) Sender { NSMutableArray *hc; tableBrowser *mt; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; [self refreshCodeList: nil]; hc = [NSMutableArray arrayWithArray: [gWorkBench getHotCodeList]]; //Need to send over the hot code list [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; mt = [[tableBrowser alloc] init]; [mt setHotCodeList: hc]; [mt setDataType: @"count"]; [mt setCharEngine: tc]; //[NSBundle loadNibNamed: @"FreqCount" owner: mt]; //[mt windowControllerDidLoadNib: nil]; [mt makeWindowControllers]; [[NSDocumentController sharedDocumentController] addDocument:mt]; [mt showWindows]; [[mt window] makeKeyAndOrderFront: self]; } -(IBAction) generateCrossReference: (id) Sender { NSMutableArray *hc; tableBrowser *mt; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; [self refreshCodeList: nil]; hc = [NSMutableArray arrayWithArray: [gWorkBench getHotCodeList]]; //Need to send over the hot code list [tc addFileToSearchList:[self getMyMWFile]]; [tc startSearch]; mt = [[tableBrowser alloc] init]; [mt setHotCodeList: hc]; [mt setDataType: @"xref"]; [mt setCharEngine: tc]; //[NSBundle loadNibNamed: @"FreqCount" owner: mt]; //[mt windowControllerDidLoadNib: nil]; [mt makeWindowControllers]; [[NSDocumentController sharedDocumentController] addDocument:mt]; [mt showWindows]; [[mt window] makeKeyAndOrderFront: self]; } -(IBAction) selectAllCodeList: (id) sender { if(gWorkBench != nil) [gWorkBench loadAllCodes: nil]; } -(void) nameCodeSetDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode) { NSString *ss; ss = [NSString stringWithString: [codeSetName stringValue]]; if([ss isEqualToString: @""]) return; if(gWorkBench != nil) [gWorkBench convertTempToRealCodeSet: ss]; } } -(IBAction) cancelNameCodeSet: (id) Sender { [codeSetSheet orderOut: Sender]; [NSApp endSheet: codeSetSheet returnCode: 0]; } -(IBAction) okNameCodeSet: (id) Sender { [codeSetSheet orderOut: Sender]; [NSApp endSheet: codeSetSheet returnCode: 1]; } -(IBAction) doNameCodeSet: (id) Sender { [NSApp beginSheet: codeSetSheet modalForWindow: myWindow modalDelegate: self didEndSelector: @selector(nameCodeSetDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(IBAction) clearHotCodeStack: (id) sender { if(gWorkBench == nil) [gWorkBench clearTempCodeStack]; } -(IBAction) popHotCodeStack: (id) sender { NSString *ss; if(gWorkBench != nil) { ss = [gWorkBench popTempCodeStack]; if(ss != nil) [theNewCode setStringValue: ss]; else [self selectAllCodeList: nil]; } } -(IBAction) selectWithinCodeList: (id) sender { NSString *ss; if(gWorkBench == nil) return; ss = [NSString stringWithString: [theNewCode stringValue]]; if([ss isEqualToString: @""]) [gWorkBench loadAllCodes: nil]; else [gWorkBench selectTempCodeSetWithin: [theNewCode stringValue]]; } -(IBAction) selectMoreCodeList: (id) sender { NSString *ss; if(gWorkBench == nil) return; ss = [NSString stringWithString: [theNewCode stringValue]]; if([ss isEqualToString: @""]) [gWorkBench loadAllCodes: nil]; else [gWorkBench selectTempCodeSetMore: [theNewCode stringValue]]; } -(IBAction) selectFewerCodeList: (id) sender { NSString *ss; if(gWorkBench == nil) return; ss = [NSString stringWithString: [theNewCode stringValue]]; if([ss isEqualToString: @""]) [gWorkBench loadAllCodes: nil]; else [gWorkBench selectTempCodeSetFewer: [theNewCode stringValue]]; } -(IBAction) refreshCodeList: (id) Sender{ if(Sender == nil) { [theCodeList removeAllToolTips]; [theCodeList reloadData]; } else { NSString *ss; if(gWorkBench == nil) return; ss = [NSString stringWithString: [theNewCode stringValue]]; if([ss isEqualToString: @""]) [gWorkBench loadAllCodes: nil]; else [gWorkBench loadTempCodeSet: [theNewCode stringValue]]; } //[gTheData release]; } -(NSArray *) getHotCodeList { return [gWorkBench getHotCodeList]; } -(void) insertString: (NSString *) what { NSRange r; int l; l = [what length]; r = [theDoc selectedRange]; [theDoc insertText: what]; if([gPrefBoss autoColorValue]) { [self doColorizeRange: NSMakeRange(r.location, l)]; } } -(IBAction) doTurnTextToButton: (id) sender { NSMutableString *ss; NSRange r; r = [theDoc selectedRange]; if (r.length == 0) return; ss = [[NSMutableString alloc] init]; //get the text [ss setString: [[theDoc string] substringWithRange: r]]; //send it to the button [myToolbar addText: ss]; [self addMacroItem: ss code: NO]; [self rebuildDocMacros: nil]; [ss autorelease]; } -(IBAction) insertTAMSText: (id) sender { NSRange selRange; NSMutableString *ss; int loc; int mc; int len, i; NSMutableDictionary *txtState; //mc = [gPrefBoss realColor]; ss = [[NSMutableString alloc] init]; selRange = [theDoc selectedRange]; txtState = [NSMutableDictionary dictionaryWithDictionary: [theDoc typingAttributes]]; [ss setString: [sender title]]; len = [ss length]; for(i = 0, loc = -1; i < len; i++) { if([ss characterAtIndex: i] == 'X') { loc = i; break; } } [theDoc insertText: ss]; selRange.length = [ss length]; //if(mc != black) { [theDoc setSelectedRange: selRange]; [self newColorOn: [gPrefBoss metaColor]]; [theDoc setSelectedRange: NSMakeRange(selRange.location + [ss length], 0)]; //[txtState setObject: [NSColor blackColor] forKey: NSForegroundColorAttributeName]; [theDoc setTypingAttributes: txtState]; /* [[theDoc textStorage] addAttribute: NSForegroundColorAttributeName value: [txtState objectForKey: NSForegroundColorAttributeName] range: NSMakeRange(selRange.location + [ss length], 0)]; //[theDoc setInsertionPointColor: ipc]; */ } [ss release]; if(loc >= 0) [theDoc setSelectedRange: NSMakeRange(selRange.location + loc, 1)]; } -(BOOL) isNew: (NSString *) what { NSArray *hots; hots = [gWorkBench getHotCodeList]; FORALL(hots) { if([temp isEqualToString: what]==YES) return NO; } ENDFORALL; return YES; } -(IBAction) doRemoveBookmarks: (id) sender { NSRange currSel; ctQChar *qq; int bTerminus, eTerminus; NSMenu *myMen; int i,n; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; //delete the menu options myMen = [sender menu]; n = [myMen numberOfItems]; for(i = n-1; i > BOOKMARKBASE; i--) { [myMen removeItemAtIndex: i]; } currSel = [theDoc selectedRange]; //set up the reader [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //get the first and end tags with the next characters //first: qq = [[ctQChar alloc] init]; [tc setCharLocation: (0L)]; bTerminus = 0L; while([tc scanNext: (qq)] != ENDOFFILE) { if([qq tokentype] == META) { if([[qq buff] isEqualToString: @"bookmark"] == YES) { eTerminus = [tc getCharLocation]; //adjust our location if(bTerminus < currSel.location) currSel.location -= (eTerminus - bTerminus); //select the bookmark and delete [theDoc setSelectedRange: NSMakeRange(bTerminus, eTerminus - bTerminus )]; [theDoc insertText: @""]; [tc startSearch]; [tc setCharLocation: (bTerminus)]; } } bTerminus = [tc getCharLocation]; } //restore selection [theDoc setSelectedRange: currSel]; //scroll range [theDoc scrollRangeToVisible: currSel]; [qq release]; [tc release]; } -(NSString *) stringFrom: (int) b to: (int) e { int l = [[theDoc string] length]; NSMutableString *ss = [NSMutableString string]; if(b < 0 || b > l-1) return ss; if(e < 0 || e > l-1) return ss; if(b >= e) return ss; [ss setString: [[theDoc string] substringWithRange: NSMakeRange(b, e-b)]]; return ss; } -(void) deleteCodeFromResultStartingWith: (int) bwhere endingWith: (int) ewhere from: (id) who { NSRange currSel; ctQChar *begChar, *endChar; int bTerminus, eTerminus; int bNew, lll; NSMutableString *ss; [self setReanalysisState: NO]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; ss = [[NSMutableString alloc] init]; //set up the reader [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //get the first and end tags with the next characters //first: begChar = [[ctQChar alloc] init]; [tc setCharLocation: (bwhere)]; [tc readnext: begChar]; bTerminus = [tc getCharLocation]; //second endChar = [[ctQChar alloc] init]; [tc setCharLocation: (ewhere)]; [tc readnext: endChar]; eTerminus = [tc getCharLocation]; //make sure they're a match if([endChar tokentype] == ENDTOKEN && [begChar tokentype] == TOKEN && [[endChar buff] isEqualToString: [begChar buff]] && [[endChar coder] isEqualToString: [begChar coder]]) { //save the location currSel = [theDoc selectedRange]; //select the last [theDoc setSelectedRange: NSMakeRange(ewhere, eTerminus - ewhere)]; //[self colorOn]; [ss setString: @""]; [theDoc insertText: ss]; //get adjusted end and let the results know to adjust //[who adjustBy: ewhere - eTerminus startingAt: ewhere for: [self getMyMWFile]]; [self adjustResultDocsAt: ewhere forLength: ewhere - eTerminus]; //select the first [theDoc setSelectedRange: NSMakeRange(bwhere, bTerminus - bwhere)]; [ss setString: @""]; [theDoc insertText: ss]; //get adjusted beginning and let the results know to adjust [tc setCharLocation: (bwhere)]; [tc readnext: (begChar)]; bNew = [tc getCharLocation]; //[who adjustBy: bwhere - bTerminus startingAt: bwhere for: [self getMyMWFile]]; [self adjustResultDocsAt: bwhere forLength: bwhere - bTerminus]; //if it's new make sure to add it [gWorkBench broadcastCodeChange: NO]; //restore cursor lll = [[theDoc string] length]; if(currSel.location > lll -1) currSel.location = lll - 1; if(currSel.location + currSel.length > lll - 1) currSel.length = 0; [theDoc setSelectedRange: currSel]; } if(gWorkBench != nil) [self setReanalysisState: [gWorkBench reanalysisMode]]; [self updateChangeCount: NSChangeDone]; [theDoc didChangeText]; [begChar release]; [endChar release]; [ss release]; [tc release]; } -(void) recode: (NSString *) what first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef { [self recode: what comment: nil first: bwhere last: ewhere from: who withDef: myDef]; } -(void) recode: (NSString *) what comment: (NSString *)cmt first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef { NSRange currSel; ctQChar *begChar, *endChar; int bTerminus, eTerminus; int bNew, eNew, lll, ll; int p1, p2, pr1, pr2, po1, po2; NSMutableString *ss; NSColor *myC; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; [self setReanalysisState: NO]; ss = [[NSMutableString alloc] init]; myC = [gWorkBench colorForCode: what]; //set up the reader [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //get the first and end tags with the next characters //first: begChar = [[ctQChar alloc] init]; [tc setCharLocation: (bwhere)]; [tc readnext: begChar]; bTerminus = [tc getCharLocation]; //second endChar = [[ctQChar alloc] init]; [tc setCharLocation: (ewhere)]; [tc readnext: endChar]; eTerminus = [tc getCharLocation]; //make sure they're a match if([endChar tokentype] == ENDTOKEN && [begChar tokentype] == TOKEN && [[endChar buff] isEqualToString: [begChar buff]] && [[endChar coder] isEqualToString: [begChar coder]]) { //save the location currSel = [theDoc selectedRange]; //select the last [theDoc setSelectedRange: NSMakeRange(ewhere, eTerminus - ewhere)]; p2 = ewhere; pr2 = eTerminus - ewhere; //[self colorOn]; [ss setString: @""]; [ss appendString: @"{/"]; [ss appendString: what]; INSERTCODER(ss); if([[endChar extra] length] && cmt == nil) { [ss appendString: @": "]; [ss appendString: [endChar extra]]; } if(cmt != nil) { [ss appendString: @": "]; [ss appendString: cmt]; } [ss appendString: @"}"]; //replace po2 = ll = [ss length]; [theDoc insertText: ss]; [theDoc setSelectedRange: NSMakeRange(ewhere, ll)]; SETRAWCOLOR(myC); //get adjusted end and let the results know to adjust [tc clearSearchList]; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; [tc setCharLocation: (ewhere)]; [tc readnext: endChar]; eNew = [tc getCharLocation]; //[who adjustBy: eNew - eTerminus startingAt: ewhere for: [self getMyMWFile]]; [self adjustResultDocsAt: p2 + 1 forLength: po2 - pr2]; //select the first [theDoc setSelectedRange: NSMakeRange(bwhere, bTerminus - bwhere)]; p1 = bwhere; pr1 = bTerminus - bwhere; //[self colorOn]; [ss setString: @""]; [ss appendString: @"{"]; [ss appendString: what]; INSERTCODER(ss); [ss appendString: @"}"]; //replace po1 = ll = [ss length]; [theDoc insertText: ss]; [theDoc setSelectedRange: NSMakeRange(bwhere, ll)]; SETRAWCOLOR(myC); //get adjusted beginning and let the results know to adjust [tc setCharLocation: (bwhere)]; [tc readnext: (begChar)]; bNew = [tc getCharLocation]; //[who adjustBy: bNew - bTerminus startingAt: bwhere for: [self getMyMWFile]]; [self adjustResultDocsAt: p1+1 forLength: po1 - pr1]; //if it's new make sure to add it if([self isNew: what] && !myDef) { [gWorkBench addCode: what definition: @"" active: YES append: YES]; [gWorkBench broadcastCodeChange: NO]; } else if([self isNew: what]) { [gWorkBench addCode: what definition: myDef active: YES append: YES]; [gWorkBench broadcastCodeChange: NO]; } else { if(!myDef) { if([myDef isEqualToString: @""] == NO) { [gWorkBench addCode: what definition: myDef active: YES append: YES]; [gWorkBench broadcastCodeChange: NO]; } } } //restore cursor lll = [[theDoc string] length]; if(currSel.location > lll -1) currSel.location = lll - 1; if(currSel.location + currSel.length > lll - 1) currSel.length = 0; [theDoc setSelectedRange: currSel]; } if(gWorkBench != nil) [self setReanalysisState: [gWorkBench reanalysisMode]]; [self updateChangeCount: NSChangeDone]; [theDoc didChangeText]; [begChar release]; [endChar release]; [ss release]; [tc release]; } -(void) recode: (NSString *) what first: (int) bwhere last: (int) ewhere from: (id) who { [self recode: what first: bwhere last: ewhere from: who withDef: nil]; } -(IBAction) doInsertDate: (id) sender { [theDoc insertText: [[NSDate date] description]]; } -(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who withDef: (NSString *) myDef { NSRange rr; [theDoc setSelectedRange: NSMakeRange(bwhere, ewhere - bwhere)]; if([self isNew: what] || (![self isNew: what] && ((!myDef) ||[myDef isEqualToString: @""] == NO)) ) { if(!myDef) [gWorkBench addCode: what definition: @"" active: YES append: YES]; else if([myDef isEqualToString: @""] == YES) [gWorkBench addCode: what definition: @"" active: YES append: YES]; else [gWorkBench addCode: what definition: myDef active: YES append: YES]; [gWorkBench broadcastCodeChange: NO]; [self applyCode: what]; } else [self applyCode: what]; //go back and adjust all the numbers //get the new selection rr = [theDoc selectedRange]; //[who adjustBy: (rr.location + rr.length) - ewhere - ([what length] + 2) startingAt: ewhere for: [self getMyMWFile]]; // [self adjustResultDocsAt: ewhere forLength: (rr.location + rr.length) - ewhere - ([what length] + 2)]; //[who adjustBy: [what length] + 2 startingAt: bwhere for: [self getMyMWFile]]; //[self adjustResultDocsAt: bwhere forLength: [what length] + 2]; [self updateChangeCount: NSChangeDone]; [theDoc didChangeText]; } -(BOOL) isReal{return YES;} -(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who { [self setReanalysisState: NO]; [theDoc setSelectedRange: NSMakeRange(bwhere, ewhere - bwhere)]; [self applyCode: what]; //go back and adjust all the numbers //[who adjustBy: [what length] + 2 startingAt: ewhere for: self]; [self adjustResultDocsAt: ewhere forLength: [what length] + 2]; //[who adjustBy: [what length] + 2 startingAt: bwhere for: self]; [self adjustResultDocsAt: bwhere forLength: [what length] + 2]; //what if it's new? if([self isNew: what]) { [gWorkBench newCode: what definition: nil color: inheritedColor]; [self refreshCodeList: nil]; } if(gWorkBench != nil) [self setReanalysisState: [gWorkBench reanalysisMode]]; } -(IBAction) addItemToToolbar: (id) sender { int who; NSString *name; who = [theCodeList selectedRow]; if(who >= 0) { name = [[gWorkBench getHotCodeList] objectAtIndex: who]; [myToolbar addItem: name ]; [self addMacroItem: name code: YES]; [self rebuildDocMacros: nil]; } } -(IBAction) doToggleRuler: (id) sender { [theDoc toggleRuler: self]; } -(void) commentDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == 0) return; else { int who; if([gPrefBoss codeFromListValue] == 0) { // This would be a great addition if we did some user preference on it if([[theNewCode stringValue] length]) { if([self isNew: [theNewCode stringValue]] == YES) [self newCode: nil]; else [self applyCode: [theNewCode stringValue] withComment: [commentView string]]; return; } } who = [theCodeList selectedRow]; if(who >= 0) { [self applyCode: [[gWorkBench getHotCodeList] objectAtIndex: who] withComment: [commentView string]]; } } } -(IBAction) addCode: (id) Sender { int who; NSLog(@"addCode\n"); if([gPrefBoss commentForCode] == 1 && Sender == codeButton) { NSLog(@"in comment\n"); [commentView setString: @""]; [NSApp beginSheet: commentSheet modalForWindow: myWindow modalDelegate: self didEndSelector: @selector(commentDidEnd:returnCode:contextInfo:) contextInfo: nil]; return; } if([gPrefBoss codeFromListValue] == 0) { NSLog(@"in codeFromListValue\n"); // This would be a great addition if we did some user preference on it if([[theNewCode stringValue] length]) { if([self isNew: [theNewCode stringValue]] == YES) [self newCode: nil]; else [self applyCode: [theNewCode stringValue]]; return; } } who = [theCodeList selectedRow]; if(who >= 0) { [self applyCode: [[gWorkBench getHotCodeList] objectAtIndex: who]]; } } -(void) applyCode: (NSString *) aCode withComment: (NSString *) comment { #ifdef NEWAPPLYCODE NSMutableString *theans, *theans1; NSRange where, newWhere, loc1, loc2; int l1, l2, r1, r2; NSColor *myC; [self setReanalysisState: NO]; myC = [gWorkBench colorForCode: aCode]; where = [theDoc selectedRange ]; r1 = where.location; r2 = where.location + where.length; theans = [[NSMutableString alloc] init]; theans1 = [[NSMutableString alloc] init]; //[[theDoc textStorage] beginEditing]; [theans appendString: @"{"]; [theans appendString: aCode]; INSERTCODER(theans); [theans appendString:@"}"]; //[self colorOn]; l1 = [theans length]; [theans1 appendString: @"{/"]; [theans1 appendString: aCode]; INSERTCODER(theans1); if(comment) if([comment length]) { [theans1 appendString: @": "]; [theans1 appendString: comment]; } [theans1 appendString: @"}"]; l2 = [theans1 length]; loc1 = where; loc1.length = 0; [theDoc setSelectedRange: loc1]; [theDoc insertText: theans]; loc1.length = l1; { [theDoc setSelectedRange: loc1]; SETCOLOR(aCode);//[self colorOn: mc]; } loc2.location = where.location + where.length + l1; loc2.length = 0; [theDoc setSelectedRange: loc2]; [theDoc insertText: theans1]; loc2.length = l2; //if(mc != black) { [theDoc setSelectedRange: loc2]; SETCOLOR(aCode);//[self colorOn: mc]; } newWhere = where; newWhere.length += l1 +l2; [theDoc setSelectedRange: newWhere]; //[[theDoc textStorage] endEditing]; [self adjustResultDocsAt: r2 forLength: [theans1 length]]; [self adjustResultDocsAt: r1 forLength: [theans length]]; [theans release]; [theans1 release]; if(gWorkBench != nil) [self setReanalysisState: [gWorkBench reanalysisMode]]; //[theDoc replaceCharactersInRange: where withString: theans]; //[theDoc setSelectedRange: NSMakeRange(where.location, newLen)]; //[self updateChangeCount: NSChangeDone]; #else NSMutableString *theans; NSMutableString *theVictim; NSRange where; unsigned newLen; theans = [[NSMutableString alloc] init]; [theans appendString: @"{"]; [theans appendString: aCode]; INSERTCODER(theans); [theans appendString:@"}"]; myData = [theDoc string]; where = [theDoc selectedRange ]; //[self colorOn]; theVictim = [[NSMutableString alloc] initWithString: [myData substringWithRange: where]]; [self colorOff]; [theans appendString: theVictim]; //[self colorOn]; [theans appendString: @"{/"]; [theans appendString: aCode]; INSERTCODER(theans); if(comment) if([comment length]) { [theans appendString: @": "]; [theans appendString: comment]; } [theans appendString: @"}"]; [self colorOff]; newLen = [theans length]; [theDoc insertText: theans]; //[theDoc replaceCharactersInRange: where withString: theans]; [theDoc setSelectedRange: NSMakeRange(where.location, newLen)]; //[self updateChangeCount: NSChangeDone]; #endif } /* this is for fetching definitions*/ -(void) sheetDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == 1) { int cc; //cc = [[codeColorMenu selectedItem] tag]; if([inheritedColorSwitch state] == NSOnState) cc = inheritedColor; else cc = otherColor; [codeInfoStr setString: [codeInfo string]]; if(cc == otherColor) [gWorkBench newCode: [theNewCode stringValue] definition: codeInfoStr realColor:[myColorWell color]]; else [gWorkBench newCode: [theNewCode stringValue] definition: codeInfoStr color:cc]; [self applyCode: [theNewCode stringValue] withComment: nil]; } [self refreshCodeList: nil]; } -(IBAction) cancelCodeInfo: (id) sender { //[codeInfoStr setString: [codeInfo stringValue]]; [codeInfoSheet orderOut: sender]; [NSApp endSheet: codeInfoSheet returnCode: 0]; } -(IBAction) okCodeInfo: (id) sender { //[codeInfoStr setString: [codeInfo stringValue]]; [codeInfoSheet orderOut: sender]; [NSApp endSheet: codeInfoSheet returnCode: 1]; } -(IBAction) selectColorFromWell:(id)Sender { [inheritedColorSwitch setState: NSOffState]; } -(IBAction) selectColorFromSwitch:(id) sender { if([inheritedColorSwitch state] == NSOnState) [myColorWell setColor: [NSColor blackColor]]; } -(IBAction) newCode: (id) Sender { NSMutableString *chkstr, *chk2; chkstr = [[NSMutableString alloc] initWithString: [theNewCode stringValue]]; //[codeColorMenu selectItemAtIndex: [codeColorMenu indexOfItemWithTag: inheritedColor]]; [inheritedColorSwitch setState: NSOnState]; if(gWorkBench != nil) [myColorWell setColor: [gWorkBench colorForCode: [theNewCode stringValue]]]; else [myColorWell setColor: [NSColor blackColor]]; if([chkstr length] == 1) { if([chkstr isEqualToString: @" "]) { [chkstr release]; return; } } else { chk2 = NSTRIM(chkstr); [chkstr setString: chk2]; } //[chkstr setString: NSTRIM(chkstr)]; if([chkstr length] == 0) { [chkstr release]; return; } if(!isCodeNameLegal(chkstr)) { NSWARNING(@"Illegal character in code name"); return; } if([gPrefBoss promptValue]) { //init the variables [codeInfoStr setString: @""]; [codeInfo setString: @""]; [newCodeName setStringValue: [theNewCode stringValue]]; //ask for the information [NSApp beginSheet: codeInfoSheet modalForWindow: myWindow modalDelegate: self didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) contextInfo: nil]; //while([NSApp modalWindow]) ; //send it on //This has been relocated to the ok button action routine //[gWorkBench newCode: [theNewCode stringValue] definition: codeInfoStr]; } else { [gWorkBench newCode: [theNewCode stringValue] definition: @"" color: inheritedColor]; [self applyCode: [theNewCode stringValue] withComment: nil]; [self refreshCodeList: nil]; } } -(IBAction) integrateCodes: (id) sender { NSArray *aHotCodeList; int n; //rebuild the codes aHotCodeList = [self remakeCodeList]; n = [aHotCodeList count]; //go through mine FORALL(aHotCodeList) { //if it is in theirs if([gWorkBench isMyCode: temp] == NO) { [gWorkBench newCode: temp definition: [self getTitle] color: inheritedColor]; } } ENDFORALL; } -(BOOL) isACode: (NSString *) who { NSArray *aHotCodeList = [gWorkBench allCodeList]; FORALL(aHotCodeList) { if([temp isEqualToString: who] == YES) return YES; } ENDFORALL; return NO; } -(BOOL) isMyCode: (NSString *) who { NSArray *aHotCodeList = [gWorkBench getHotCodeList]; FORALL(aHotCodeList) { if([temp isEqualToString: who] == YES) return YES; } ENDFORALL; return NO; } -(BOOL) isValidCode: (NSString *) who { return [self isMyCode: who]; } -(NSArray *) keyCodeList { return [[gWorkBench getHotCodeList] retain]; } -(NSArray *) hotCodeList { //if(gWorkBench == nil) NSLog(@"Do not have a workbench.\n"); return [gWorkBench getHotCodeList];} -(NSArray *) remakeCodeList { int n; int insertflag; ctQChar *q; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; NSRange rrr; NSMutableArray *hotCodeList = [NSMutableArray array]; q = [[ctQChar alloc] init]; [hotCodeList removeAllObjects]; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //[self setData]; while([tc scanNext: q] != ENDOFFILE) { //until eof //if it's a tag if([q tokentype] == ENDTOKEN) { insertflag = 0; FORALL(hotCodeList) { if([temp isEqualToString: [q buff]]) { insertflag = -1; break; } else if ((n = [temp compare: [q buff]]) == NSOrderedAscending) //strcmp((char *)[temp cString],(char *) [[q buff] cString])) > 0)// ([[(NSString *)temp compare: [q buff]] isGreaterThan] == YES) { NSString *myans; rrr =[[q extra] rangeOfString: @"retired" options: NSCaseInsensitiveSearch]; if(rrr.location != NSNotFound) continue; myans = [[[q buff] copy] autorelease]; [hotCodeList insertObject: myans atIndex: __i]; insertflag = 1; break; } } ENDFORALL; if(insertflag == 0) { NSString *myans; rrr =[[q extra] rangeOfString: @"retired" options: NSCaseInsensitiveSearch]; if(rrr.location != NSNotFound) continue; myans = [[[q buff] copy] autorelease]; //[myans retain]; [hotCodeList addObject: myans]; } } //check it out } [q release]; [tc release]; return hotCodeList; } -(void) adjustResultDocsAt: (int) loc forLength: (int) len { NSMutableDictionary *msg; msg = [NSMutableDictionary dictionary]; [msg setObject: [NSNumber numberWithInt: loc] forKey: @"location"]; [msg setObject: [NSNumber numberWithInt: len] forKey: @"length"]; [[NSNotificationCenter defaultCenter] postNotificationName: @"TAMSDocAddedCode" object: [self getMyMWFile] userInfo: msg ]; } -(void) applyCode: (NSString *) aCode { #ifdef OLDNEWAPPLYCODE NSMutableString *theans, *theans1; NSRange where, newWhere, loc1, loc2; //int mc; int l1, l2; //mc = [gPrefBoss realColor]; where = [theDoc selectedRange ]; //[[theDoc textStorage] beginEditing]; theans = [[NSMutableString alloc] init]; theans1 = [[NSMutableString alloc] init]; [theans appendString: @"{"]; [theans appendString: aCode]; INSERTCODER(theans); [theans appendString:@"}"]; //[self colorOn]; [theans1 appendString: @"{/"]; [theans1 appendString: aCode]; INSERTCODER(theans1); [theans1 appendString: @"}"]; loc1 = where; loc1.length = 0; [theDoc setSelectedRange: loc1]; [theDoc insertText: theans]; l1 = loc1.length = [theans length]; //if(mc != black) { [theDoc setSelectedRange: loc1]; [self newColorOn: [gPrefBoss realColor]]; } loc2.location = where.location + where.length + l1; loc2.length = 0; [theDoc setSelectedRange: loc2]; [theDoc insertText: theans1]; l2 = loc2.length = [theans1 length]; //if(mc != black) { [theDoc setSelectedRange: loc2]; [self newColorOn: [gPrefBoss realColor]]; } newWhere = where; newWhere.length += l1 + l2; [theDoc setSelectedRange: newWhere]; //[[theDoc textStorage] endEditing]; [theans release]; [theans1 release]; //[theDoc replaceCharactersInRange: where withString: theans]; //[theDoc setSelectedRange: NSMakeRange(where.location, newLen)]; //[self updateChangeCount: NSChangeDone]; #endif #ifdef NEWAPPLYCODE NSMutableString *theans, *theans1; NSRange where, newWhere, loc1, loc2; NSDictionary *initState; NSMutableDictionary *myat; NSTextStorage *myTS; NSUndoManager *myUndo; //int mc; int l1, l2, r1, r2; NSColor *myC; [self setReanalysisState: NO]; //mc = [gPrefBoss realColor]; myC = [gWorkBench colorForCode: aCode]; where = [theDoc selectedRange ]; r1 = where.location; r2 = where.location + where.length; myTS = [theDoc textStorage]; myUndo = [theDoc undoManager]; if([myTS length] < where.location) initState = [myTS attributesAtIndex: where.location effectiveRange: nil]; else initState = [theDoc typingAttributes]; myat = [NSMutableDictionary dictionaryWithDictionary: [theDoc typingAttributes]]; //[myUndo endUndoGroup]; //[myUndo beginUndoGrouping]; //[myTS beginEditing]; theans = [[NSMutableString alloc] init]; theans1 = [[NSMutableString alloc] init]; [theans appendString: @"{"]; [theans appendString: aCode]; INSERTCODER(theans); [theans appendString:@"}"]; //[self colorOn]; [theans1 appendString: @"{/"]; [theans1 appendString: aCode]; INSERTCODER(theans1); [theans1 appendString: @"}"]; loc1 = where; loc1.length = 0; [theDoc setSelectedRange: loc1]; [theDoc insertText: theans]; // [myTS insertAttributedString: [[[NSAttributedString alloc] initWithString: theans] autorelease] atIndex: loc1.location]; l1 = loc1.length = [theans length]; [theDoc setSelectedRange: loc1]; //if(mc != black) { //[myTS addAttribute: NSForegroundColorAttributeName // value: [self getColor: mc] range: loc1]; [ myTS addAttribute: NSForegroundColorAttributeName value: myC range: loc1]; } loc2.location = where.location + where.length + l1; loc2.length = 0; // [myTS insertAttributedString: [[[NSAttributedString alloc] initWithString: theans1] autorelease] atIndex: loc2.location]; [theDoc setSelectedRange: loc2]; [theDoc insertText: theans1]; l2 = loc2.length = [theans1 length]; [theDoc setSelectedRange: loc2]; //if(mc != black) { //[myTS addAttribute: NSForegroundColorAttributeName // value:[self getColor: mc] range: loc2]; [myTS addAttribute: NSForegroundColorAttributeName value: myC range: loc2]; } newWhere = where; newWhere.length += l1 + l2; [myTS setAttributes:initState range: NSMakeRange(newWhere.location+newWhere.length, 0)]; [self adjustResultDocsAt: r2 forLength: [theans1 length]]; [self adjustResultDocsAt: r1 forLength: [theans length]]; [theDoc setTypingAttributes: myat]; //[myTS endEditing]; [theDoc didChangeText]; //[myUndo endUndoGrouping]; [theDoc setSelectedRange: newWhere]; [theans release]; [theans1 release]; if(gWorkBench != nil) [self setReanalysisState: [gWorkBench reanalysisMode]]; #endif #ifdef LESSNEWAPPLYCODE NSMutableString *theans, *theans1; NSRange where, newWhere, loc1, loc2; NSDictionary *initState; NSMutableDictionary *myat; NSTextStorage *myTS; NSUndoManager *myUndo; //int mc; int l1, l2; NSColor *myC; //mc = [gPrefBoss r]; myC = [gWorkBench colorForCode: aCode]; where = [theDoc selectedRange ]; myTS = [theDoc textStorage]; myUndo = [theDoc undoManager]; if([myTS length] < where.location) initState = [myTS attributesAtIndex: where.location effectiveRange: nil]; else initState = [theDoc typingAttributes]; myat = [NSMutableDictionary dictionaryWithDictionary: [theDoc typingAttributes]]; //[myUndo endUndoGroup]; //[myUndo beginUndoGrouping]; //[myTS beginEditing]; theans = [[NSMutableString alloc] init]; theans1 = [[NSMutableString alloc] init]; [theans appendString: @"{"]; [theans appendString: aCode]; INSERTCODER(theans); [theans appendString:@"}"]; //[self colorOn]; [theans1 appendString: @"{/"]; [theans1 appendString: aCode]; INSERTCODER(theans1); [theans1 appendString: @"}"]; loc1 = where; loc1.length = 0; //[theDoc setSelectedRange: loc1]; //[theDoc insertText: theans]; [myTS insertAttributedString: [[[NSAttributedString alloc] initWithString: theans] autorelease] atIndex: loc1.location]; l1 = loc1.length = [theans length]; //if(mc != black) { //[myTS addAttribute: NSForegroundColorAttributeName // value: [self getColor: mc] range: loc1]; [myTS addAttribute: NSForegroundColorAttributeName value: myC range: loc1]; } loc2.location = where.location + where.length + l1; loc2.length = 0; [myTS insertAttributedString: [[[NSAttributedString alloc] initWithString: theans1] autorelease] atIndex: loc2.location]; l2 = loc2.length = [theans1 length]; //if(mc != black) { // [myTS addAttribute: NSForegroundColorAttributeName // value:[self getColor: mc] range: loc2]; [myTS addAttribute: NSForegroundColorAttributeName value:myC range: loc2]; } newWhere = where; newWhere.length += l1 + l2; [myTS setAttributes:initState range: NSMakeRange(newWhere.location+newWhere.length, 0)]; [theDoc setTypingAttributes: myat]; //[myTS endEditing]; [theDoc didChangeText]; //[myUndo endUndoGrouping]; [theDoc setSelectedRange: newWhere]; [theans release]; [theans1 release]; //[theDoc replaceCharactersInRange: where withString: theans]; //[theDoc setSelectedRange: NSMakeRange(where.location, newLen)]; //[self updateChangeCount: NSChangeDone]; #endif } -(IBAction) setTypeBlack: (id) Sender { NSMutableDictionary *myat; NSRange selrange; selrange = [theDoc selectedRange]; if(selrange.length) [theDoc setTextColor: [NSColor blackColor] range: [theDoc selectedRange]]; else { myat = [NSMutableDictionary dictionaryWithDictionary: [theDoc typingAttributes]]; [myat setObject: [NSColor blackColor] forKey: NSForegroundColorAttributeName]; [theDoc setTypingAttributes: myat]; } } -(IBAction) saveFontFormat: (id) Sender { if(savedFormat) [savedFormat release]; savedFormat = [NSMutableDictionary dictionaryWithDictionary: [theDoc typingAttributes]]; [savedFormat retain]; } -(IBAction) applyFontFormat: (id) Sender { NSRange selrange; if(savedFormat == nil) return; selrange = [theDoc selectedRange]; if(selrange.length) { NSTextStorage *what; what = [theDoc textStorage]; [what beginEditing]; [what setAttributes: savedFormat range: selrange]; [what endEditing]; [theDoc didChangeText]; } else { [theDoc setTypingAttributes: savedFormat]; } } -(IBAction) clearFontFormat: (id) sender { if(savedFormat != nil) { [savedFormat release]; savedFormat = nil; } } -(IBAction) generateCodeList: (id) Sender { NSRange where,theEnd; NSMutableString *theCodeString; NSMutableArray *hotCodeList; theCodeString = [[NSMutableString alloc] init]; //save location where = [theDoc selectedRange]; theEnd.location = [[theDoc string] length]; theEnd.length = 0; //refresh hotCodeList = [self remakeCodeList]; //go to end [theDoc setSelectedRange: theEnd]; //spill out the codes [theCodeString appendString: [NSString stringWithFormat: @"Codes from file %@:\n", [[self getMyMWFile] name]]]; FORALL(hotCodeList) { [theCodeString appendString: @"{"]; [theCodeString appendString: [hotCodeList objectAtIndex: __i]]; [theCodeString appendString: @"}"]; [theCodeString appendString: @"{/"]; [theCodeString appendString: [hotCodeList objectAtIndex: __i]]; [theCodeString appendString: @"}"]; [theCodeString ADDCHAR('\n')]; } ENDFORALL; //restore location [theDoc setSelectedRange: where]; [gWorkBench newFileWithText: theCodeString]; } - (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex { if([gPrefBoss useToolTipValue]) { [theCodeList addToolTipRect: [theCodeList frameOfCellAtColumn: 0 row: rowIndex] owner: [[self keyCodeList] objectAtIndex: rowIndex] userData:nil]; } } -(BOOL)tableView: (NSTableView *) aTable shouldEditTableColumn: (NSTableColumn *) aCol row: (unsigned) arow { return NO; } -(void) widthSizeDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { int lw; int ls; BOOL blank, numBlank; if(returnCode == 1) { lw = [wsWidthSize intValue]; ls = [wsStartNumber intValue]; if ([wsBlankBreakSwitch state] == NSOnState) blank = YES; else blank = NO; if ([wsCountEmptyLineSwitch state] == NSOnState) numBlank = YES; else numBlank = NO; [self lineNumberDocWithWidth: lw startingAt: ls atBlanks: blank numberBlanks: numBlank]; } } -(IBAction) okCodeWithComment: (id) sender { [commentSheet orderOut: sender]; [NSApp endSheet: commentSheet returnCode: 1]; } -(IBAction) cancelCodeWithComment: (id) sender { [commentSheet orderOut: sender]; [NSApp endSheet: commentSheet returnCode: 0]; } -(IBAction) okCountLines: (id) sender { [widthSheet orderOut: sender]; [NSApp endSheet: widthSheet returnCode: 1]; } -(IBAction) cancelCountLines: (id) sender { [widthSheet orderOut: sender]; [NSApp endSheet: widthSheet returnCode: 0]; } -(void) lineNumberDocWithWidth: (int) width startingAt: (int) begin atBlanks: (BOOL) blanks numberBlanks: (BOOL) cntBlanks { int rcnt; NSString *tempStr; int llen, len, i; int spaceLoc; int blanklen; int skipMode; int lnum; NSString *ttt; MWCHAR cc; //give it to the char engine //create q spaceLoc = blanklen = skipMode = rcnt = llen = 0; //two passes once to break lines; once to number if(width > 0) { tempStr = [NSString stringWithString: [theDoc string]]; len = [tempStr length]; for(i =0; i < len; i++) { cc = [tempStr characterAtIndex: i]; //do the ones we skip over if(skipMode == 1) { skipMode = 0; continue; } if(skipMode == 2 && cc == '}') { skipMode = 0; continue; } if(skipMode) continue; if(cc == '\\') { skipMode = 1; continue; } if(cc == '{') { skipMode = 2; continue; } if(cc == '\r' || cc == '\n') { blanklen = 0; spaceLoc = 0; llen = 0; } if(llen > width) { if(blanks == YES) { if(spaceLoc) i = spaceLoc; } //insert the return and do what you need to if(i + 1 + rcnt < len +rcnt -1) { [theDoc setSelectedRange: NSMakeRange(i+1+rcnt, 0)]; [theDoc insertText: @"\n"]; rcnt++; blanklen = 0; spaceLoc = 0; llen = 0; } else break; continue; } if(cc == ' ') { spaceLoc = i; blanklen =0; } llen++; blanklen++; } } //get it again and tce rcnt = 0; lnum = begin; tempStr = [NSString stringWithString: [theDoc string]]; len = [tempStr length]; if(((cc = [tempStr characterAtIndex: 0]) != '\n') && cc != '\r') { [theDoc setSelectedRange: NSMakeRange( 0, 0)]; ttt = [NSString stringWithFormat: @"%d\t", lnum]; [theDoc insertText: ttt]; rcnt += [ttt length]; lnum++; } for(i = 0; i < len ; i++) { if(((cc = [tempStr characterAtIndex: i]) == '\n') || cc == '\r') { if(i < len - 1) { if( ([tempStr characterAtIndex: i+1] == '\r' || [tempStr characterAtIndex: i+1]) == '\n' && cntBlanks == NO) continue; [theDoc setSelectedRange: NSMakeRange( i+1 + rcnt, 0)]; ttt = [NSString stringWithFormat: @"%d\t", lnum]; [theDoc insertText: ttt]; rcnt += [ttt length]; lnum++; } } } } -(IBAction) numberLines: (id) sender { [wsWidthSize setIntValue: 40]; [wsStartNumber setIntValue: 1]; [wsBlankBreakSwitch setState: NSOnState]; [wsCountEmptyLineSwitch setState: NSOffState]; [NSApp beginSheet: widthSheet modalForWindow: myWindow modalDelegate: self didEndSelector: @selector(widthSizeDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(IBAction) removeLineNumbers: (id) sender { NSMutableArray *numLoc; NSRange r; int i, n, fflag, nflag; int tpart; MWCHAR ch; NSCharacterSet *nums; nums = [NSCharacterSet decimalDigitCharacterSet]; fflag = 1; nflag = 1; tpart = 0; r.location = r.length = 0; n = [[theDoc string] length]; for(i = 0; i < n; i++) { ch = [[theDoc string] characterAtIndex: i]; if(ch == '\r' || ch == '\n') { r.location = i+1; r.length = 0; nflag = 1; tpart = 0; continue; } if(nflag) { if(tpart == 0) { if([nums characterIsMember: ch] == YES) { r.length++; continue; } else if(ch == '\t' && r.length > 0) { r.length++; [theDoc setSelectedRange: r]; [theDoc insertText: @""]; n -= r.length; i -= r.length; nflag = 0; } else { nflag = 0; continue; } } } } } -(IBAction) doFindSelectedRange: (id) sender { [theDoc scrollRangeToVisible: [theDoc selectedRange]]; } -(void) selectAndScrollRange: (NSRange) theRange andMoveForward: (BOOL) move { long ll = [[theDoc string] length]; NSRange rr = theRange; if (rr.location >= ll) { rr.location = ll - 1 ; rr.length = 0; } if(rr.location+rr.length >= ll) { rr.length = ll - 1 - rr.location; } //select range [theDoc setSelectedRange: rr]; //scroll range [theDoc scrollRangeToVisible: rr]; //move forward if(move == YES) { [theTabs selectFirstTabViewItem: self]; [myWindow makeKeyAndOrderFront: self]; } } - (void) moveForward { [myWindow makeKeyAndOrderFront: self]; [self updateCodeWindow]; } - (IBAction) doFindBookmark: (id) sender { int n; n = [[sender menu] indexOfItem: sender]; [self selectAndScrollRange: NSMakeRange([[bookmarkVault objectAtIndex: n - (BOOKMARKBASE + 1)] bmLocation] + 1, 9) andMoveForward: (BOOL) YES]; } -(IBAction) moveWorkBenchForward: (id) sender { [gWorkBench front]; } -(IBAction) doFindButtons: (id) sender { ctQChar *q; NSMutableArray *theButtonList; NSMutableString *ss; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; //clear existing macros [macroArray removeAllObjects]; //[myToolbar clearButtons]; //start search if([gWorkBench getInitFile] != nil) if([gWorkBench getInitFile] != [self getMyMWFile]) [tc addFileToSearchList: [gWorkBench getInitFile]]; [tc addFileToSearchList: [self getMyMWFile]]; (gCurrentDataSource = self); [tc startSearch]; // read through and if it's a meta named bookmark... q = [[ctQChar alloc] init]; theButtonList = [[NSMutableArray alloc] init]; //go to eof while([tc scanNext: q] != ENDOFALLFILES) { //is it a !button if([q tokentype] == META && [[q buff] isEqualToString: @"button"] == YES) //break it up { //add it to the list [theButtonList addObjectsFromArray: convertStringToArray([q extra], ',')]; } } if([theButtonList count] == 0) return; ss = [[NSMutableString alloc] init]; //trim the list FORALL(theButtonList) { //NSString *rrr = [NSString stringWithString: temp]; [ss setString: temp]; trimNSS(ss); //is it a quote? if([ss isEqualToString: @"|"] == YES) { [myToolbar addBar]; } else if([ss startsWith: @"cmd::"]) { [myToolbar addCmd: ss]; } else if(ISQUOTE(ss)) { //yes? then trim the quotes trimCharNSS(ss, '\"'); if([myToolbar isButton: ss] == NO) { //is it a button? [myToolbar addText: ss]; [self addMacroItem: ss code: NO]; } else [self addMacroItem: ss code: NO]; //no, then add it } else { if([myToolbar isButton: ss] == NO) { //is it already a button? //no, then add it with addItem [myToolbar addItem: ss]; [self addMacroItem: ss code: YES]; } else [self addMacroItem: ss code: YES]; } } ENDFORALL; [ss release]; [tc release]; [self rebuildDocMacros: nil]; } //this is a combined bookmark and button scanner -(void) scanForMetas { NSMenu *myMen; int i,n; ctQChar *q; bookmarkInfo *bm; NSMutableArray *theButtonList; NSMutableString *ss; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; //this is for the toolbar theButtonList = [[NSMutableArray alloc] init]; //clear existing macros [macroArray removeAllObjects]; //delete the menu options for bookmarks myMen = [ [[NSApp delegate] rebuildMenuItem] menu]; n = [myMen numberOfItems]; for(i = n-1; i > BOOKMARKBASE; i--) { [myMen removeItemAtIndex: i]; } // go through and find all the !bookmarks // set the text if([gPrefBoss scanInitValue] && [gWorkBench getInitFile]) if([gWorkBench getInitFile] != [self getMyMWFile]) [tc addFileToSearchList: [gWorkBench getInitFile]]; [tc addFileToSearchList: [self getMyMWFile]]; (gCurrentDataSource = self); [tc startSearch]; // read through and if it's a meta named bookmark... q = [[ctQChar alloc] init]; //[self setData]; [bookmarkVault removeAllObjects]; // while([tc readnext:q] != EOF) while([tc scanNext:q] != ENDOFALLFILES) { //until eof //if it's a tag if([q tokentype] == META) { if([[q buff] isEqualToString: @"mediafile"] == YES) { #ifdef MULTIMEDIA [self loadMediaFile: [q extra]]; #endif ; } if([[q buff] isEqualToString: @"bookmark"] == YES) { bm = [[bookmarkInfo alloc] init]; [bm setLocation: [q where]]; [bm setIdentifier: [q extra]]; //save location [bookmarkVault addObject: bm]; } if( [[q buff] isEqualToString: @"button"] == YES) //break it up { //add it to the list [theButtonList addObjectsFromArray: convertStringToArray([q extra], ',')]; } } } //put the bookmarks in the menu FORALL(bookmarkVault) { NSMenuItem *mm; mm = [[NSMenuItem alloc] init]; [mm setTitle: [temp identifier]]; [mm setAction: @selector(doFindBookmark:)]; [myMen addItem: mm]; }ENDFORALL; // handle the buttons if([theButtonList count]) { ss = [[NSMutableString alloc] init]; //trim the list FORALL(theButtonList) { //NSString *rrr = [NSString stringWithString: temp]; [ss setString: temp]; trimNSS(ss); //is it a quote? if([ss isEqualToString: @"|"] == YES) { [myToolbar addBar]; } else if([ss startsWith: @"cmd::"]) { [myToolbar addCmd: ss]; } else if(ISQUOTE(ss)) { //yes? then trim the quotes trimCharNSS(ss, '\"'); if([myToolbar isButton: ss] == NO) { //is it a button? [myToolbar addText: ss]; [self addMacroItem: ss code: NO]; } //no, then add it } else { if([myToolbar isButton: ss] == NO) { //is it already a button? //no, then add it with addItem [myToolbar addItem: ss]; [self addMacroItem: ss code: YES]; } } } ENDFORALL; [ss release]; } [q release]; [tc release]; [self rebuildDocMacros: nil]; if([gPrefBoss autoColorValue]) { [self doColorize: self]; [self updateChangeCount: NSChangeCleared];//opening the document even if it changes code color should be dirty neutral } } -(void) renewBookmarkMenu { NSMenu *myMen; int i,n; //delete the menu options myMen = [ [[NSApp delegate] rebuildMenuItem] menu]; n = [myMen numberOfItems]; for(i = n-1; i > BOOKMARKBASE; i--) { [myMen removeItemAtIndex: i]; } FORALL(bookmarkVault) { NSMenuItem *mm; mm = [[NSMenuItem alloc] init]; [mm setTitle: [temp identifier]]; [mm setAction: @selector(doFindBookmark:)]; [myMen addItem: mm]; }ENDFORALL; } -(void) addMacroItem: (NSString *) ss code: (BOOL) aCode { NSMutableDictionary *dd = [NSMutableDictionary dictionary]; NSMutableString *mys = [NSMutableString string]; NSString *itemIdentifier = [[ss copy] autorelease]; if([itemIdentifier length] > 10) { [mys setString: [itemIdentifier substringToIndex: 3]]; [mys appendString: @""]; [mys appendString: [itemIdentifier substringFromIndex: ([itemIdentifier length] - 7)]]; } else [mys setString: itemIdentifier]; [dd setObject: mys forKey: @"name"]; [dd setObject: itemIdentifier forKey: @"text"]; if(aCode) [dd setObject: @"C" forKey: @"type"]; else [dd setObject: @"T" forKey: @"type"]; [macroArray addObject: dd]; } -(IBAction) handleDocMacro: (id) sender { int n = [sender tag]; NSDictionary *who; if(n < [macroArray count]) { who = [macroArray objectAtIndex: n]; if([[who objectForKey: @"type"] isEqualToString: @"C"] == YES) { [self applyCode: [who objectForKey: @"text"]]; } else [self insertString: [who objectForKey: @"text"]]; } } -(IBAction) clearDocMacros: (id) sender { NSMenu *myMen = [[[NSApp delegate] docMacroMenu] submenu]; int i, n; n = [myMen numberOfItems]; for(i = n-1; i >= DOCMACROBASE; i--) { [myMen removeItemAtIndex: i]; } } -(IBAction) rebuildDocMacros: (id) sender { NSMenu *myMen = [[[NSApp delegate] docMacroMenu] submenu]; [self clearDocMacros: nil]; FORALL(macroArray) { NSMenuItem *mm; if(__i <= 9){ mm = [[NSMenuItem alloc] initWithTitle: [temp objectForKey: @"name"] action: @selector(handleDocMacro:) keyEquivalent: [NSString stringWithFormat: @"%d", 9 - __i]]; [mm setKeyEquivalentModifierMask:NSCommandKeyMask| NSControlKeyMask];//|NSCommandKeyMask } else { mm = [[NSMenuItem alloc] initWithTitle: [temp objectForKey: @"name"] action: @selector(handleMacro:) keyEquivalent: @""]; } [mm setTag: __i]; [myMen addItem: mm]; } ENDFORALL; } -(IBAction) rebuildBookmarks: (id) sender { NSMenu *myMen; int i,n; ctQChar *q; bookmarkInfo *bm; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; //delete the menu options myMen = [sender menu]; n = [myMen numberOfItems]; for(i = n-1; i > BOOKMARKBASE; i--) { [myMen removeItemAtIndex: i]; } // go through and find all the !bookmarks // set the text [tc addFileToSearchList: [self getMyMWFile]]; (gCurrentDataSource = self); // read through and if it's a meta named bookmark... q = [[ctQChar alloc] init]; [tc startSearch]; [bookmarkVault removeAllObjects]; while([tc scanNext:q] != ENDOFFILE) { //until eof //if it's a tag if([q tokentype] == META) { if([[q buff] isEqualToString: @"bookmark"] == YES) { bm = [[bookmarkInfo alloc] init]; [bm setLocation: [q where]]; [bm setIdentifier: [q extra]]; //save location [bookmarkVault addObject: bm]; } } } //put them in the menu FORALL(bookmarkVault) { NSMenuItem *mm; mm = [[NSMenuItem alloc] init]; [mm setTitle: [temp identifier]]; [mm setAction: @selector(doFindBookmark:)]; [myMen addItem: mm]; }ENDFORALL; [q release]; [tc release]; } -(IBAction) doRemoveCodesFromSelection: (id) sender { NSRange n, ll, r; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; NSMutableArray *aa= [[NSMutableArray alloc] init]; ctQChar *qq; int rslt; int currLoc, l; unsigned r1; r1 = 0; //get the boundaries n = [theDoc selectedRange]; if(n.length == 0) return; r1 = n.length; //set things up [tc addFileToSearchList: [self getMyMWFile]]; //clearSearchList(); [tc startSearch]; qq = [[ctQChar alloc] init]; //set start location [tc setCharLocation: n.location ]; do { rslt = [tc scanNext: qq]; r = [qq range]; switch(rslt) { case META: case TOKEN: case ENDTOKEN: if(r.location >= n.location && r.location < n.location + n.length) { [aa insertObject: [[[MWRange alloc] initWithRange: r] autorelease] atIndex: 0]; r1 -= r.length; } break; default:; } //scan next //if it is meta, tag or endtag //save the location in a stack } while(r.location < n.location + n.length && rslt != ENDOFFILE && r.location + r.length <= n.location+n.length); FORALL(aa) { NSRange rrr; rrr = [temp range]; [theDoc setSelectedRange: rrr]; [theDoc insertText: @""]; } ENDFORALL; [theDoc setSelectedRange: NSMakeRange(n.location, r1)]; [aa release]; [tc release]; [qq release]; #ifdef oldDeleteTextInRange [theDoc setSelectedRange: NSMakeRange(n.location + n.length, 0)]; l = 0; currLoc = n.location + n.length + 1; for(;;) { //loop til out of loop or hadn't move //find a code [self doFindCurrentCode: self]; ll = [theDoc selectedRange]; if(ll.location == currLoc) break; if(ll.location <= n.location) break; else { //remove it [theDoc insertText: @""]; currLoc = ll.location; } } [theDoc setSelectedRange: NSMakeRange(n.location, 0)]; #endif } -(IBAction) doFindNextCode: (id) sender { ctQChar *q; int aloc, bloc, l; NSRange n; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; q = [[ctQChar alloc] init]; gCurrentDataSource = self; [ tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //set up system //get selection //save location n = [theDoc selectedRange]; l = [[theDoc string] length]; if(n.location > l - 1) return; //set up cursor one character back aloc = n.location + n.length; [tc setCharLocation: aloc]; //loop while(aloc < l - 1) { //save location A read a character save location B aloc = [tc getCharLocation]; //is it a code? [tc readnext: q]; bloc = [tc getCharLocation]; if([q tokentype] == TOKEN || [q tokentype] == ENDTOKEN || [q tokentype] == META) //Yes select from A-B { [theDoc setSelectedRange: NSMakeRange(aloc, bloc - aloc)]; [theDoc scrollRangeToVisible: NSMakeRange(aloc, bloc - aloc)]; [q release]; return; } //[tc setCharLocation: (aloc + 1)]; } [q release]; [tc release]; //else goto A-1 } -(IBAction) doFindCurrentCode: (id) sender { ctQChar *q; int aloc, bloc; NSRange n; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; q = [[ctQChar alloc] init]; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //set up system //get selection //save location n = [theDoc selectedRange]; if(n.location <= 0) return; //set up cursor one character back [tc setCharLocation: (aloc = n.location - 1)]; //loop while(aloc >= 0) { //save location A read a character save location B aloc = [tc getCharLocation]; //is it a code? [tc readnext: q]; bloc = [tc getCharLocation]; if([q tokentype] == TOKEN || [q tokentype] == ENDTOKEN || [q tokentype] == META) //Yes select from A-B { if(aloc > 0) { int slashCnt; int sindex; slashCnt = 0; sindex = aloc - 1; while([tc readCharAtIndex: sindex] == '\\') { slashCnt++; sindex--; if(sindex < 0) break; } if( slashCnt % 2 == 1) { aloc--; [tc setCharLocation: aloc]; continue; } } [theDoc setSelectedRange: NSMakeRange(aloc, bloc - aloc)]; [theDoc scrollRangeToVisible: NSMakeRange(aloc, bloc - aloc)]; [q release]; return; } aloc--; [tc setCharLocation: aloc]; } [q release]; //else goto A-1 [tc release]; } -(IBAction) doDeleteCodePair: (id) sender { ctQChar *q; int aloc, bloc; int fwdFlag; NSRange n; NSMutableString *myname = [[NSMutableString alloc] init]; NSMutableString *mycode = [[NSMutableString alloc] init]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; fwdFlag = 1; q = [[ctQChar alloc] init]; [self setReanalysisState: NO]; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //set up system //get selection //save location [self doFindCurrentCode: nil]; n = [theDoc selectedRange]; [tc setCharLocation: (n.location)]; //get the first code [tc readnext: q]; if([q tokentype] == TOKEN) { [myname setString: [q buff]]; [mycode setString: [q coder]]; } else if ([q tokentype] == ENDTOKEN) { [myname setString: [q buff]]; [mycode setString: [q coder]]; fwdFlag = 0; } else { [q release]; [myname release]; [mycode release]; [tc release]; if(gWorkBench != nil) [self setReanalysisState: [gWorkBench reanalysisMode]]; return; } if(fwdFlag) { //get the current code bloc = [tc getCharLocation]; while([tc readnext: q] != EOF) { aloc = bloc; if([q tokentype] == ENDTOKEN) if([[q buff] isEqualToString: myname] == YES && [[q coder] isEqualToString: mycode]) { bloc = [tc getCharLocation]; //kill the end [theDoc setSelectedRange: NSMakeRange(aloc, bloc - aloc)]; [theDoc insertText: @""]; [self adjustResultDocsAt: aloc+1 forLength: -(bloc - aloc)]; //kill the start [theDoc setSelectedRange: n]; [self adjustResultDocsAt: n.location + 1 forLength: - n.length]; [theDoc insertText: @""]; // clean up [q release]; [myname release]; [tc release]; if(gWorkBench != nil) [self setReanalysisState: [gWorkBench reanalysisMode]]; return; } bloc = [tc getCharLocation]; } } else { [tc setCharLocation: (bloc = n.location - 1)]; while(bloc >= 0) { [tc readnext: q]; aloc = [tc getCharLocation]; if([q tokentype] == TOKEN) { if([[q buff] isEqualToString: myname] == YES && [[q coder] isEqualToString: mycode] == YES) { [theDoc setSelectedRange: n]; [theDoc insertText: @""]; [theDoc setSelectedRange: NSMakeRange(bloc, aloc - bloc)]; [theDoc insertText: @""]; [self adjustResultDocsAt: n.location + 1 forLength: - n.length]; [self adjustResultDocsAt: bloc+1 forLength: -(aloc - bloc)]; [q release]; [myname release]; [tc release]; if(gWorkBench != nil) [self setReanalysisState: [gWorkBench reanalysisMode]]; return; } } bloc--; [tc setCharLocation: bloc]; } //get current location //loop backwards //if it's a TOKEN //does it match //get the loc's and delete } [q release]; [myname release]; [mycode release]; [tc release]; if(gWorkBench != nil) [self setReanalysisState: [gWorkBench reanalysisMode]]; } -(IBAction) doFindMate: (id) sender { ctQChar *q; int aloc, bloc; int fwdFlag; NSRange n; NSMutableString *myname = [[NSMutableString alloc] init]; NSMutableString *mycname = [[NSMutableString alloc] init]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; fwdFlag = 1; q = [[ctQChar alloc] init]; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; //set up system //get selection //save location [self doFindCurrentCode: nil]; n = [theDoc selectedRange]; [tc setCharLocation: n.location]; //get the first code [tc readnext: q]; if([q tokentype] == TOKEN) { [myname setString: [q buff]]; [mycname setString: [q coder]]; } else if ([q tokentype] == ENDTOKEN) { [myname setString: [q buff]]; [mycname setString: [q coder]]; fwdFlag = 0; } else { [q release]; [myname release]; [mycname release]; [tc release]; return; } if(fwdFlag) { //get the current code bloc = [tc getCharLocation]; while([tc readnext: q] != EOF) { aloc = bloc; if([q tokentype] == ENDTOKEN) if([[q buff] isEqualToString: myname] == YES && [[q coder] isEqualToString: mycname] == YES) { bloc = [tc getCharLocation]; //select the end [theDoc setSelectedRange: NSMakeRange(aloc, bloc - aloc)]; [theDoc scrollRangeToVisible: NSMakeRange(aloc, bloc - aloc)]; // clean up [q release]; [myname release]; [tc release]; return; } bloc = [tc getCharLocation]; } } else { [tc setCharLocation: (bloc = n.location - 1)]; while(bloc >= 0) { [tc readnext: q]; aloc = [tc getCharLocation]; if([q tokentype] == TOKEN) { if([[q buff] isEqualToString: myname] == YES && [[q coder] isEqualToString: mycname] == YES) { [theDoc setSelectedRange: NSMakeRange(bloc, aloc - bloc)]; [theDoc scrollRangeToVisible: NSMakeRange(bloc, aloc - bloc)]; [q release]; [myname release]; [tc release]; return; } } bloc--; [tc setCharLocation: bloc]; } //get current location //loop backwards //if it's a TOKEN //does it match //get the loc's and delete } [q release]; [myname release]; [mycname release]; [tc release]; } -(IBAction) requestCodeDefinition: (id) sender { int who,t; NSString *theCode; NSMutableString *theDef; //get the string t = [theTabs indexOfTabViewItem: [theTabs selectedTabViewItem]]; if(t == 0) who = [theCodeList selectedRow]; else who = [searchCodeList selectedRow]; if(who >= 0) { theCode = [[gWorkBench getHotCodeList] objectAtIndex: who]; } else return; //ask for definition theDef = [gWorkBench getDefinition: theCode]; if(!theDef) {NSWARNING(@"Need to establish a central code file"); return;} //if it exists retain and display it [theDef retain]; NSRunAlertPanel(theCode, theDef, @"Ok", nil, nil); //release it [theDef release]; } -(IBAction) checkForPairs: (id) sender { NSMutableArray *codeHolder; ctQChar *q; ctTagInfo *ti; int myloc; TAMSCharEngine *tc = [[TAMSCharEngine alloc] initWithFileAndStart: [self getMyMWFile]]; ti = nil; q = [[ctQChar alloc] init]; codeHolder = [[NSMutableArray alloc] init]; myloc = [tc getCharLocation]; while([tc scanNext: q] != ENDOFFILE) { //until eof //if it's a tag if([q tokentype] == TOKEN) { [codeHolder addObject: [[[ctTagInfo alloc] initWithName: [q buff] location: [q where] coder: [q coder]] autorelease]]; } else if([q tokentype] == ENDTOKEN) { FORALL(codeHolder) { ti = nil; if([[temp name] isEqualToString: [q buff]] == YES && [[temp coder] isEqualToString: [q coder]] == YES) { ti = temp; break; } }ENDFORALL; if(ti) [codeHolder removeObject: ti]; else { [theDoc setSelectedRange: NSMakeRange(myloc, [tc getCharLocation] - myloc)]; //scroll range [theDoc scrollRangeToVisible: NSMakeRange(myloc, [tc getCharLocation] - myloc)]; [q release]; [codeHolder release]; [tc release]; return; } } myloc = [tc getCharLocation]; } if([codeHolder count]) { //select range ti = [codeHolder objectAtIndex: 0]; [theDoc setSelectedRange: NSMakeRange([ti location]+1, [[ti name] length])]; //scroll range [theDoc scrollRangeToVisible: NSMakeRange([ti location]+1, [[ti name] length])]; } else NSMESSAGE(@"No unmatched code pairs found"); [q release]; [codeHolder release]; [tc release]; } -(IBAction) checkForNested: (id) sender { NSMutableArray *codeHolder; ctQChar *q; int errFlg; ctTagInfo *ti; TAMSCharEngine *tc = [[TAMSCharEngine alloc] initWithFileAndStart: [self getMyMWFile]]; ti = nil; errFlg = 0; q = [[ctQChar alloc] init]; codeHolder = [[NSMutableArray alloc] init]; while([tc scanNext: q] != ENDOFFILE) { //until eof //if it's a tag if([q tokentype] == TOKEN) { if([codeHolder count]) { FORALL(codeHolder) { if([[temp name] isEqualToString: [q buff]] == YES) { [theDoc setSelectedRange: NSMakeRange([q where]+1, [[q buff] length])]; [theDoc scrollRangeToVisible: NSMakeRange([q where]+1, [[q buff] length])]; [q release]; [codeHolder release]; return; } }ENDFORALL; [codeHolder addObject: [[[ctTagInfo alloc] initWithName: [q buff] location: [q where] coder: [q coder]] autorelease]]; } else [codeHolder addObject: [[[ctTagInfo alloc] initWithName: [q buff] location: [q where] coder: [q coder]] autorelease]]; } else if([q tokentype] == ENDTOKEN) { FORALL(codeHolder) { ti = nil; if([[temp name] isEqualToString: [q buff]] == YES && [[temp coder] isEqualToString: [q coder]] == YES) { ti = temp; break; } }ENDFORALL; if(ti) [codeHolder removeObject: ti]; } } NSMESSAGE(@"No nested codes found"); [q release]; [codeHolder release]; [tc release]; } #ifdef XXYY - (void)setDocumentEdited:(BOOL)flag { if (flag != isDocumentEdited) { isDocumentEdited = flag; [[self window] setDocumentEdited:isDocumentEdited]; if (transientDocument == self) transientDocument = nil; } if (!isDocumentEdited) changeCount = 0; } - (BOOL)isDocumentEdited { return isDocumentEdited; } #endif /* this actually searches for results */ -(IBAction) searchForCode: (id) Sender { myResults *aa; NSDocumentController *who; NSMutableString *myLimitStr = [[NSMutableString alloc] init]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; //initWithFileAndStart: [self getMyMWFile]]; //start search if([initFileSearchSwitch state] == NSOnState && [gWorkBench getInitFile]) [tc addFileToSearchList: [gWorkBench getInitFile]]; [tc addFileToSearchList: [self getMyMWFile]]; (gCurrentDataSource = self); [tc startSearch]; //get the flags if([rawButton state] == NSOnState) rawF = 1; else rawF = 0; if([exactButton state] == NSOnState) exactF = 1; else exactF = 0; if([emptyButton state] == NSOnState) emptyF = 1; else emptyF = 0; if([sectionButton state] == NSOnState) sectionF = 1; else sectionF = 0; nonRegexCharF = regexCharF = 0; //for the moment it has no interface for single files if([simpleButton state] == NSOnState) { int i,ln; int sflg; unichar c; sflg = 1; [myLimitStr setString: [theLimitString stringValue]]; trimNSS(myLimitStr); if([myLimitStr isEqualToString: @""]) simpleF = sflg; else { ln = [myLimitStr length]; for(i = 0; i < ln; i++) { c = [myLimitStr characterAtIndex: i]; //if(c == '*' || c == '+' || c == ',') if( c == '+' )//|| c == ',') { sflg = 0; break; } } simpleF = sflg; if(simpleF) [simpleButton setState: NSOnState]; else [simpleButton setState: NSOffState]; } } else { simpleF = 0; [myLimitStr setString: [theLimitString stringValue]]; trimNSS(myLimitStr); //need to drop this for unlimited non-simple searches // if([myLimitStr isEqualToString: @""]) // simpleF = 1; if(simpleF) [simpleButton setState: NSOnState]; else [simpleButton setState: NSOffState]; } [myLimitStr release]; //make me the current data source [tc setGCurrentDataSource: self]; //find the controller who = [NSDocumentController sharedDocumentController]; //make the window [who setShouldCreateUI: YES]; //ans = [[myResults alloc] init]; //[who addDocument: ans]; aa = [who openUntitledDocumentOfType: @"TAMS Result" display: YES]; [aa setGWorkBench: gWorkBench]; [gWorkBench registerResult: aa]; [aa setCharEngine: tc]; [aa executeTAMS]; [aa retain]; } -(NSString *) codersList { return [coderIDView stringValue]; } -(void) setGWorkBench: (id) who { gWorkBench = who;} -(void) setMWFile: (MWFile *) who {myFID = who;} -(void) setTitleFromFile { if([[self getMyMWFile] hasFile]) { [myWindow setTitle: [[self getMyMWFile] name]]; } } -(MWFile *) getMyMWFile {return myFID;} -(void) performClose { [myWindow performClose: self]; } - (void) document:(NSDocument *)doc didSave:(BOOL)didSave contextInfo:(void *)contextInfo { MWFile *mw; mw = [self getMyMWFile]; if(didSave == YES) { [myWindow setDocumentEdited: NO]; [self updateChangeCount: NSChangeCleared]; [mw setOpenFile: self]; //reset the path [mw setHasFile: YES]; NSLog(@"doc path = %@\n", [mw path]); if(gWorkBench != nil) [gWorkBench setDirty]; } } -(IBAction) saveDocument: (id) Sender { //[self saveToFile:nil saveOperation: NSSaveAsOperation delegate: self didSaveSelector:@selector(document:didSave:contextInfo:) contextInfo:nil ]; if([self fileName]) [super saveDocument: nil]; else [self saveDocumentWithDelegate: self didSaveSelector: @selector(document:didSave:contextInfo:) contextInfo: nil]; return; /* [super saveDocument: self]; path = [self fileName]; [gWorkBench setDirty];//kludge since we're too lazy to make our own save Doc if([self fileName]) if([[mw path] isEqualToString: [self fileName]] ==NO) { [mw setOpenFile: self]; //reset the path [mw setHasFile: YES]; [gWorkBench setDirty]; } */ } -(IBAction) saveDocumentAs: (id) Sender { [self runModalSavePanelForSaveOperation: NSSaveAsOperation delegate: self didSaveSelector: @selector(document:didSave:contextInfo:) contextInfo: nil]; //[self saveDocumentWithDelegate: self didSaveSelector: @selector(document:didSave:contextInfo:) contextInfo: nil]; return; /* [super saveDocumentAs: self]; mw = [self getMWFile]; [gWorkBench setDirty];//kludge since we're too lazy to make our own save Doc if([self fileName]) if([[mw path] isEqualToString: [self fileName]] ==NO) { [mw setOpenFile: self]; //reset the path [mw setHasFile: YES]; [gWorkBench setDirty]; } */ } #ifdef OLDSAVEROUTINE -(IBAction) saveDocument: (id) Sender { MWFile *mw; [super saveDocument: self]; mw = [self getMyMWFile]; if([[mw path] isEqualToString: [self fileName]] ==NO) { [mw setOpenFile: self]; //reset the path [gWorkBench setDirty]; } } -(IBAction) saveDocumentAs: (id) Sender { MWFile *mw; [super saveDocumentAs: self]; mw = [self getMyMWFile]; if([[mw path] isEqual: [self fileName]] ==NO) { [mw setOpenFile: self]; //reset the path [gWorkBench setDirty]; } } #endif -(IBAction) showCodeBrowser: (id) Sender { [gWorkBench showCodeBrowser: self]; } -(IBAction) niceClose: (id) Sender { [myWindow performClose: self]; } -(NSTextView*) myTextView { return theDoc; } -(IBAction) doQuoteBraces: (id) Sender { NSString *ss = [theDoc string]; unsigned l,st,cnt; unichar c; int i; NSRange r; r = [theDoc selectedRange]; if(r.length == 0) { st = 0; l = [ss length]; } else { st = r.location; l = r.length + r.location; } cnt = 0; for (i = l - 1; i >= st; i--) { c = [ss characterAtIndex: i]; if (c == '{') { if(i > 0) { if([ss characterAtIndex: i - 1] != '\\') { [theDoc setSelectedRange: NSMakeRange(i,0)]; [theDoc insertText: @"\\"]; cnt++; } } else { [theDoc setSelectedRange: NSMakeRange(i,0)]; [theDoc insertText: @"\\"]; cnt++; } } else if (c == '}') { if(i > 0) { if([ss characterAtIndex: i - 1] != '\\') { [theDoc setSelectedRange: NSMakeRange(i,0)]; [theDoc insertText: @"\\"]; cnt++; } } else { [theDoc setSelectedRange: NSMakeRange(i,0)]; [theDoc insertText: @"\\"]; cnt++; } } } [theDoc setSelectedRange: NSMakeRange(r.location, r.length+cnt)]; } -(IBAction) doToggleReanalysisMode: (id) sender { if(gWorkBench) { [gWorkBench doToggleReanalysisMode: sender]; } } -(BOOL) validateMenuItem: (NSMenuItem *) menuItem { NSString *name; //get rid of paste name = [menuItem title]; if(([name isEqualToString: [[theDoc undoManager] undoMenuItemTitle]])) { //NSLog(@"Testing"); } if(gWorkBench != nil) { if([gWorkBench reanalysisMode] == YES) { if([name isEqualToString: @"Cut"] || [name isEqualToString: @"Paste"] || ([name rangeOfString: @"Undo"].location) != NSNotFound || ([name rangeOfString: @"Redo"].location) != NSNotFound || [name isEqualToString: @"Clear"] || [name isEqualToString: @"Escape braces"] || [name isEqualToString: @"Wrap and line number"] || [name isEqualToString: @"{!bookmark X}"] || [[[menuItem menu] title] isEqualToString: @"Insert metatag"] || [name isEqualToString: @"Insert date-time"] || [name isEqualToString: @"Remove all bookmarks"] ) { return NO; } } } return [super validateMenuItem: menuItem]; } -(void) loadAllCodes: (id) sender { if(gWorkBench) [gWorkBench loadAllCodes: sender]; } -(void) loadCodeSet: (id) sender { if(gWorkBench != nil) [gWorkBench loadCodeSet: sender]; } -(IBAction) editCodeSet: (id) Sender { if(gWorkBench != nil) { if(![gPrefBoss detachedSheetValue]) [self moveWorkBenchForward: self]; [gWorkBench editCodeSet: Sender]; } } -(void) scrollToTop { [theDoc scrollRangeToVisible: NSMakeRange(0,0)]; [theDoc setSelectedRange: NSMakeRange(0,0)]; } -(IBAction) doDotGraph: (id) sender { if(gWorkBench != nil) { [gWorkBench doDotGraph: self]; } } #ifdef MULTIMEDIA -(IBAction) setMovieTime: (id) sender; { long tmValue, scale; double tm; NSString *ss,*tt; NSRange r; if(myMovie == nil ) return; r= [theDoc selectedRange]; if (r.length == 0) return; ss = [theDoc string]; tt = [ss substringWithRange: r]; scale = (long) GetMovieTimeScale( [myMovie QTMovie]); if(isHHMMSS(tt)) { tmValue = hhmmss2sec(tt) * scale; } else { tm = [tt doubleValue]; tmValue = tm * scale; } SetMovieTimeValue([myMovie QTMovie], tmValue); #ifdef scantimeformat long scale; NSRange n, ll, r; TAMSCharEngine *tc; ctQChar *qq; int rslt; double tm; long tmValue; if(myMovie == nil ) return; tc = [[TAMSCharEngine alloc] init]; //get the boundaries n = [theDoc selectedRange]; //set things up [tc addFileToSearchList: [self getMyMWFile]]; //clearSearchList(); [tc startSearch]; qq = [[ctQChar alloc] init]; //set start location [tc setCharLocation: n.location ]; scale = GetMovieTimeScale( [myMovie QTMovie]); while((rslt = [tc scanNext: qq]) != ENDOFFILE) { if(rslt == META) { if([[qq buff] isEqualToString: @"time"] == YES) { tm = [[qq extra] doubleValue]; tmValue = (long) tm * scale; SetMovieTimeValue([myMovie QTMovie], tmValue); [qq release]; [tc release]; return; } } } [qq release]; [tc release]; return; #endif } -(void) ConvertMovieTimeToHHMMSS: (BOOL) hhmmssFormat { long scale, l; double mt; NSRange rr; NSString *ss; NSMutableArray *tLoc = [[NSMutableArray alloc] init]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; ctQChar *q; NSRange r,s; NSString *timeCode; int tt, i, n; BOOL timeMode, hfmt; double t1; NSString *theDocString; rr = [theDoc selectedRange]; mt = GetMovieTime([myMovie QTMovie], nil) / (double)scale; timeCode = [gPrefBoss getAVCode]; if(!gWorkBench) return; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; q = [[ctQChar alloc] init]; timeMode = NO; r = NSMakeRange(0,0); while((tt = [tc scanNext: q]) != ENDOFFILE) { //scan through doc if(tt == TOKEN) { if([[q buff] isEqualToString: timeCode]) { timeMode = YES; } else timeMode = NO; } else if(timeMode == YES) { if(tt == CHAR) { hfmt = isHHMMSS([q buff]); if(hhmmssFormat) { if(hfmt == NO) //this is one we want [tLoc addObject: [[[MWRange alloc] initWithRange: [q range]] autorelease]]; } else { if(hfmt == YES) [tLoc addObject: [[[MWRange alloc] initWithRange: [q range]] autorelease]]; } } timeMode = NO; } else timeMode = NO; } [tc release]; [q release]; n = [tLoc count]; theDocString = [theDoc string]; for(i = n-1; i >= 0; i--) { NSString *newTime, *oldTime; MWRange *w; w = [tLoc objectAtIndex: i]; oldTime = [theDocString substringWithRange: [w range]]; if(hhmmssFormat) newTime = sec2hhmmss((unsigned) [oldTime doubleValue]); else newTime = [NSString stringWithFormat: @"%u", hhmmss2sec(oldTime)]; [theDoc setSelectedRange: [w range]]; [theDoc insertText: newTime]; } [tLoc release]; [theDoc setSelectedRange: rr]; } -(IBAction) convertSec2HHMMSS: (id) sender { [self ConvertMovieTimeToHHMMSS: YES]; } -(IBAction) convertHHMMSS2Sec: (id) sender { [self ConvertMovieTimeToHHMMSS: NO]; } -(IBAction) findMovieTime: (id) sender { long scale, l; double mt; NSRange rr; NSString *ss; if(myMovie == nil ) return; scale = GetMovieTimeScale( [myMovie QTMovie]); if([gPrefBoss codeAV]) { TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; ctQChar *q; NSRange r,s; NSString *timeCode; int tt; BOOL timeMode; double t1; rr = [theDoc selectedRange]; mt = GetMovieTime([myMovie QTMovie], nil) / (double)scale; timeCode = [gPrefBoss getAVCode]; if(!gWorkBench) return; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; q = [[ctQChar alloc] init]; timeMode = NO; r = NSMakeRange(0,0); while((tt = [tc scanNext: q]) != ENDOFFILE) { //scan through doc if(tt == TOKEN) { if([[q buff] isEqualToString: timeCode]) { timeMode = YES; } else timeMode = NO; } else if(timeMode == YES) { if(tt == CHAR) { if(isHHMMSS([q buff])) { NSString *tttt; tttt = [q buff]; t1 = hhmmss2sec(tttt); } else t1 = [[q buff] doubleValue]; if(t1 > mt) { //Select and scroll [tc release]; [q release]; [theDoc setSelectedRange: r]; [theDoc scrollRangeToVisible: r]; return; } else r = [q range]; } timeMode = NO; } else timeMode = NO; } [tc release]; [q release]; NSWARNING(@"Time code not found"); } } -(NSString *) getMovieTimeString { long scale; double timeSpot; scale = GetMovieTimeScale( [myMovie QTMovie]); timeSpot = GetMovieTime([myMovie QTMovie], nil) / (double)scale; if([gPrefBoss timeFormatHHMMSS] == 1) { return sec2hhmmss((unsigned) timeSpot); } else return [NSString stringWithFormat: @"%.2lf", timeSpot]; } -(IBAction) insertMovieTime: (id) sender { long scale, l; NSRange rr; NSString *ss; if(myMovie == nil ) return; scale = GetMovieTimeScale( [myMovie QTMovie]); if([gPrefBoss codeAV]) { rr = [theDoc selectedRange]; ss = [NSString stringWithFormat: @"{%@}%@{/%@}", [gPrefBoss getAVCode], [self getMovieTimeString], [gPrefBoss getAVCode]]; l = [ss length]; [theDoc insertText: ss]; if([gPrefBoss autoColorValue]) [self doColorizeRange: NSMakeRange(rr.location, l)]; //this may slow things down too much } else [theDoc insertText: [NSString stringWithFormat: @"%@", [self getMovieTimeString]]]; } -(IBAction) backSpaceMovieTime: (id) sender { long scale,ct; long bs; long newloc; bs = [gPrefBoss getAVBackspace]; if(myMovie == nil ) return; scale = GetMovieTimeScale( [myMovie QTMovie]); ct = GetMovieTime([myMovie QTMovie], nil); newloc = ct - (scale * bs); if(newloc < 0L) newloc = 0L; SetMovieTimeValue([myMovie QTMovie], newloc); } -(IBAction) fwdSpaceMovieTime: (id) sender { long scale,ct; long bs; long newloc; bs = [gPrefBoss getAVBackspace]; if(myMovie == nil ) return; scale = GetMovieTimeScale( [myMovie QTMovie]); ct = GetMovieTime([myMovie QTMovie], nil); newloc = ct + (scale * bs); if(newloc > duration) newloc = duration; SetMovieTimeValue([myMovie QTMovie], newloc); } -(IBAction) stopMovie: (id) sender { [myMovieView stop: nil]; } -(IBAction) startMovie: (id) sender { if([myMovieView isPlaying] == YES) { [myMovieView stop: nil]; [stopStartButton setState: NSOffState]; } else { if([gPrefBoss autoBackspace] == 1) [self backSpaceMovieTime: nil]; [myMovieView start: nil]; [stopStartButton setState: NSOnState]; } } -(void) moviePanelDidEnd: (NSOpenPanel *) sheet returnCode: (int) returnCode contextInfo: (void*) contextInfo { NSRange rr; if(returnCode == NSOKButton) { NSString *what; NSArray *who; //EnterMovies(); who = [sheet filenames]; if([who count] != 1) return; rr = [theDoc selectedRange]; what = [who objectAtIndex: 0]; if(myMovie != nil) [myMovie release]; myMovie = [[NSMovie alloc] initWithURL: [NSURL fileURLWithPath: what] byReference: YES]; if(myMovie != nil) { NSString *newTag; duration = GetMovieDuration([myMovie QTMovie]); [myMovieView showController: YES adjustingSize: YES]; [movieTitle setStringValue: [what lastPathComponent]]; [myMovieView setMovie: myMovie]; [theDoc setSelectedRange: NSMakeRange(0,0)]; newTag = [NSString stringWithFormat: @"{!mediafile %@}", what]; [theDoc insertText: newTag ]; [theDoc setSelectedRange: NSMakeRange(rr.location + [newTag length], rr.length)]; } } } -(void) loadMediaFile: (NSString *) what { NSString *path; if([[NSFileManager defaultManager] fileExistsAtPath: what] == YES) { if (myMovie != nil) [myMovie release]; myMovie = [[NSMovie alloc] initWithURL: [NSURL fileURLWithPath: what] byReference: YES]; if(myMovie != nil) { [myMovieView showController: YES adjustingSize: YES]; duration = GetMovieDuration([myMovie QTMovie]); [movieTitle setStringValue: [what lastPathComponent]]; [myMovieView setMovie: myMovie]; return; } } else { if((path = [self fileName]) != nil) { NSMutableArray *cmp = [NSMutableArray arrayWithArray: [path pathComponents]]; NSString *newPath; [cmp removeLastObject]; [cmp addObject: [what lastPathComponent]]; newPath = [cmp componentsJoinedByString: @"/"]; if([[NSFileManager defaultManager] fileExistsAtPath: newPath] == YES) { if(myMovie != nil) [myMovie release]; myMovie = [[NSMovie alloc] initWithURL: [NSURL fileURLWithPath: newPath] byReference: YES]; if(myMovie != nil) { [myMovieView showController: YES adjustingSize: YES]; duration = GetMovieDuration([myMovie QTMovie]); [movieTitle setStringValue: [newPath lastPathComponent]]; [myMovieView setMovie: myMovie]; return; } } } } NSWARNING(@"Unable to find or open media file. Remove !mediafile metatag and relocate the file"); } -(IBAction) openMovie: (id) sender { NSOpenPanel *op; op = [NSOpenPanel openPanel]; [op beginSheetForDirectory: nil file: nil types: nil /*[NSMovie movieUnfilteredFileTypes]*/ modalForWindow: myWindow modalDelegate:self didEndSelector: @selector(moviePanelDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(IBAction) setRate: (id) sender { float dd; if(myMovie == nil) return; dd = [[rateMenu titleOfSelectedItem] floatValue]; [myMovieView setRate: dd]; } -(IBAction) fwdFrame: (id) sender { if(myMovie == nil) return; [myMovieView stepForward: sender]; } -(IBAction) bkFrame: (id) sender { if(myMovie == nil) return; [myMovieView stepBack: sender]; } -(IBAction) gotoMovieEnd: (id) sender { if(myMovie == nil) return; [myMovieView gotoEnd: sender]; } -(IBAction) gotoMovieStart: (id) sender; { if(myMovie == nil) return; [myMovieView gotoBeginning: sender]; } -(IBAction) speedUp: (id) sender { if(myMovie == nil) return; [myMovieView setRate: [myMovieView rate] + 0.01]; } -(IBAction) slowDown: (id) sender; { if(myMovie == nil) return; [myMovieView setRate: [myMovieView rate] - 0.01]; } -(IBAction) clearMediaFileTags: (id) sender { TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; ctQChar *q; int t,n; NSMutableArray *aa; MWRange *mr; aa = [[NSMutableArray alloc] init]; [tc addFileToSearchList: [self getMyMWFile]]; [tc startSearch]; q = [[ctQChar alloc] init]; while((t = [tc scanNext: q]) != ENDOFFILE) { if(t == META) { if([[q buff] isEqualToString: @"mediafile"]) { mr = [[MWRange alloc] initWithRange: [q range]]; [mr autorelease]; [aa insertObject: mr atIndex: 0]; } } } n = [aa count]; if (n > 0) { FORALL(aa) { [theDoc setSelectedRange: [temp range]]; [theDoc insertText: @""]; } ENDFORALL; } [aa release]; [tc release]; [q release]; } -(IBAction) showTimeAsHHMMSS: (id) sender { NSString *ss; double tm; NSString *ans; NSRange r; long scale, ct; long sec, min, hr; r = [theDoc selectedRange]; if(r.length) { ss = [[theDoc string] substringWithRange: r]; if(isHHMMSS(ss) == YES) NSWARNING(@"Selected time must be in seconds."); tm = [ss doubleValue]; sec = (long) tm; min = sec/60; sec = sec % 60; hr = min/ 60; min = min%60; ans = [NSString stringWithFormat: @"Selected time = %2ld:%0.2ld:%0.2ld", hr, min, sec]; NSMESSAGE(ans); } else { if(myMovie == nil) return; scale = GetMovieTimeScale( [myMovie QTMovie]); ct = GetMovieTime([myMovie QTMovie], nil); sec = ct/scale; min = sec/60; sec = sec % 60; hr = min/ 60; ans = [NSString stringWithFormat: @"Media time = %2ld:%0.2ld:%0.2ld", hr, min, sec]; NSMESSAGE(ans); } } //end MULTIMEDIA #endif -(void) idleTimer:(id)sender { #ifdef MULTIMEDIA long scale, ct; float time; if(myMovie == nil) return; scale = GetMovieTimeScale( [myMovie QTMovie]); ct = GetMovieTime([myMovie QTMovie], nil); if([myMovieView isPlaying] && [stopStartButton state] == NSOffState) [stopStartButton setState: NSOnState]; if([myMovieView isPlaying] == NO && [stopStartButton state] == NSOnState) [stopStartButton setState: NSOffState]; time = (float) ct/ (float) scale; if([gPrefBoss timeFormatHHMMSS] == 1) [timeField setStringValue: sec2hhmmss((unsigned) time)]; else [timeField setStringValue: [NSString stringWithFormat: @"%.2fs", (float) ct/ (float) scale]]; if(jagFlag) MoviesTask([myMovie QTMovie],0); #endif } -(void) endTimer { #ifdef MULTIMEDIA if(myMovie == nil) return; [myMovie release]; myMovie = nil; #ifdef USETIMER if(myTimer == nil) return; [myTimer invalidate]; [myTimer release]; myTimer= nil; #endif #endif } -(IBAction) copyWithoutTags: (id) sender { ctQChar *q; NSString *oText; NSMutableString *nText; NSRange r; MWFakeFile *ff; int ch; BOOL a; r = [theDoc selectedRange]; if(r.length == 0) return; oText = [[theDoc string] substringWithRange: r]; ff = [[MWFakeFile alloc] initWithString: oText]; nText = [[NSMutableString alloc] init]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; [tc setAllowTab: 1]; [tc setNoPar: 0]; //start search [tc addFileToSearchList: ff]; [tc startSearch]; q = [[ctQChar alloc] init]; while((ch = [tc scanNext: q withWarnings: NO]) != ENDOFALLFILES) { if (ch == CHAR) [nText appendString: [q buff]]; } [q release]; [tc release]; [ff release]; [[NSPasteboard generalPasteboard] declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; a = [[NSPasteboard generalPasteboard] setString: nText forType: NSStringPboardType]; [nText autorelease]; } -(IBAction) requestCodeDefinitionOfSelection: (id) sender { NSRange who; NSString *theCode, *theSel; NSMutableString *theDef; NSString *warning; //get the string if(gWorkBench == nil) return; who = [theDoc selectedRange]; if(who.length == 0) return; theSel = [[theDoc string] substringWithRange: who]; theCode = extractFirstCode(theSel); if(theCode == nil) {NSWARNING(@"Cannot find code in selection."); return;} //ask for definition theDef = [gWorkBench getDefinition: theCode]; if(!theDef) { warning = [NSString stringWithFormat: @"Cannot find definition for string: %@", theCode]; NSWARNING(warning); return; } //if it exists retain and display it [theDef retain]; NSRunAlertPanel(theCode, theDef, @"Ok", nil, nil); //release it [theDef release]; } -(IBAction) recolorTags: (id) sender { [self doColorOff: nil]; [self doColorize: nil]; } -(void) setCommentDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSRange curr, r; if(returnCode) { NSString *s; r = curr = [theDoc selectedRange]; int tagtype; tagtype = [setCommentMenu tagOfSelectedItem]; switch(tagtype) { case 0: if(curr.length > 0) { [theDoc setSelectedRange: NSMakeRange(curr.location+curr.length, 0)]; s = [NSString stringWithFormat: @"{!endcomment %@}", [setCommentField stringValue]]; [theDoc insertText: s]; r.length += [s length]; } [theDoc setSelectedRange: NSMakeRange(curr.location, 0)]; s = [NSString stringWithFormat: @"{!setcomment %@}", [setCommentField stringValue]]; [theDoc insertText: s]; r.length += [s length]; break; case 1: if(curr.length > 0) { [theDoc setSelectedRange: NSMakeRange(curr.location+curr.length, 0)]; s = [NSString stringWithFormat: @"{!endcomment %@}", [setCommentField stringValue]]; [theDoc insertText: s]; r.length += [s length]; } [theDoc setSelectedRange: NSMakeRange(curr.location, 0)]; s = [NSString stringWithFormat: @"{!setcomment %@}", [setCommentField stringValue]]; [theDoc insertText: s]; r.length += [s length]; break; default:; } if([gPrefBoss autoColorValue] == 1) [self doColorizeRange: r]; [theDoc setSelectedRange: r]; } } -(IBAction) cancelSetComment: (id) Sender { [setCommentSheet orderOut: Sender]; [NSApp endSheet: setCommentSheet returnCode: 0]; } -(IBAction) okSetComment: (id) Sender { [setCommentSheet orderOut: Sender]; [NSApp endSheet: setCommentSheet returnCode: 1]; } -(IBAction) doSetComment: (id) Sender { [setCommentField setStringValue: @""]; [NSApp beginSheet: setCommentSheet modalForWindow: myWindow modalDelegate: self didEndSelector: @selector(setCommentDidEnd:returnCode:contextInfo:) contextInfo: nil]; } @end gtamsanalyzer.app-0.42/Source/MyDocumentSimple.h0000644000175000017500000001362310162465511022222 0ustar brentbrent00000000000000// // MyDocument.h // TAMS Edit // // Created by matthew on Thu Apr 18 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #define DATATYPE 1 #define RESULTTYPE 2 #import #import @interface MyDocument : NSDocument { //real variables IBOutlet NSTextView *theDoc; IBOutlet NSTableView *theCodeList; IBOutlet NSTableView *searchCodeList; IBOutlet NSTextField *theNewCode; IBOutlet NSTabView *theTabs; IBOutlet NSWindow *myWindow; IBOutlet id myToolbar; IBOutlet id coderIDView; IBOutlet id initFileSearchSwitch; IBOutlet id movieTitle; IBOutlet id myColorWell; IBOutlet id inheritedColorSwitch; IBOutlet id rawButton; IBOutlet id exactButton; IBOutlet id emptyButton; IBOutlet id simpleButton; IBOutlet id sectionButton; IBOutlet id codeButton; IBOutlet NSTextView *codeInfo; IBOutlet NSTextField *newCodeName; IBOutlet NSWindow *codeInfoSheet; IBOutlet id codeColorMenu; IBOutlet id widthSheet; IBOutlet id wsWidthSize; IBOutlet id wsStartNumber; IBOutlet id wsBlankBreakSwitch; IBOutlet id wsCountEmptyLineSwitch; IBOutlet id commentView; IBOutlet id commentSheet; //for searching IBOutlet NSTextField *theLimitString; IBOutlet NSTextField *theWindowName; //for comments IBOutlet id setCommentSheet; IBOutlet id setCommentMenu; IBOutlet id setCommentField; //for code sets IBOutlet id codeSetSheet; IBOutlet id codeSetName; } -(int) getDocType; -(NSString *) getTitle; -(NSString *) theLimitString; -(NSString *) theWindowName; -(int) rawF; -(int) exactF; -(int) emptyF; -(int) simpleF; -(int) sectionF; -(int) regexCharF; -(int) nonRegexCharF; -(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who; -(void) recode: (NSString *) what first: (int) bwhere last: (int) ewhere from: (id) who; -(void) recode: (NSString *) what first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(NSArray *) getHotCodeList; -(NSString *) stringFrom: (int) b to: (int) e; -(void) recode: (NSString *) what comment: (NSString *)cmt first: (int) bwhere last: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(void) deleteCodeFromResultStartingWith: (int) bwhere endingWith: (int) ewhere from: (id) who; -(void) adjustResultDocsAt: (int) loc forLength: (int) len; -(BOOL) isNew: (NSString *) what; -(void) appendString: (NSString *)what; -(void) setDirty: (BOOL) value; -(BOOL) dirty; -(IBAction) rebuildBookmarks: (id) sender; -(IBAction) okCodeInfo: (id) sender; -(IBAction) searchForCode: (id) Sender; -(IBAction) integrateCodes: (id) sender; -(IBAction) doFindCurrentCode: (id) sender; -(IBAction) doFindNextCode: (id) sender; -(IBAction) checkForPairs: (id) sender; -(IBAction) checkForNested: (id) sender; -(IBAction) insertTAMSText: (id) sender; -(IBAction) moveWorkBenchForward: (id) sender; -(IBAction) addItemToToolbar: (id) sender; -(IBAction) doRemoveBookmarks: (id) sender; -(IBAction) doFindSelectedRange: (id) sender; -(IBAction) doTurnTextToButton: (id) sender; -(IBAction) doToggleRuler: (id) sender; -(IBAction) requestCodeDefinition: (id) sender; -(IBAction) doColorize: (id) sender; -(IBAction) setRate: (id) sender; -(void) setReanalysisState: (BOOL) which; -(void) setTitleFromFile; -(void) setGWorkBench: (id) who; -(id) getGWorkBench; -(void) setMWFile: (MWFile *) who; -(MWFile *) getMyMWFile; -(void) scanForMetas; -(void) renewBookmarkMenu; -(void) insertString: (NSString *) what; -(void) moveForward; -(IBAction) generateCodeList: (id) Sender; -(void) selectAndScrollRange: (NSRange) theRange andMoveForward: (BOOL) move; -(void) displayCode; -(IBAction) refreshCodeList: (id) Sender; -(void) updateCodeWindow; -(void) zapCodeWindow; -(IBAction) addCode: (id) Sender; -(IBAction) newCode: (id) Sender; -(BOOL) isACode: (NSString *) who; -(IBAction) okCountLines: (id) sender; -(IBAction) cancelCountLines: (id) sender; -(IBAction) okCodeWithComment: (id) sender; -(IBAction) cancelCodeWithComment: (id) sender; -(IBAction) editCodeSet: (id) Sender; -(void) scrollToTop; -(NSMutableArray *) hotCodeList; -(NSArray *) remakeCodeList; -(void) assignCode; -(void) loadtextViewWithData:(NSData *) data; -(void) setData; -(NSString *) getData; -(void) applyCode: (NSString *) aCode; -(void) applyCode: (NSString *) aCode withComment: (NSString *) comment; -(BOOL)tableView: (NSTableView *) aTable shouldEditTableColumn: (NSTableColumn *) aCol row: (unsigned) arow; -(void) sheetDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo; -(BOOL) isMyCode: (NSString *) who; -(BOOL) isValidCode: (NSString *) who; -(NSString *) codersList; -(void) performClose; -(void) printShowingPrintPanel: (BOOL) flag; -(NSTextView *) myTextView; -(IBAction) startMovie: (id) sender; -(IBAction) stopMovie: (id) sender; -(IBAction) openMovie: (id) sender; -(IBAction) insertMovieTime: (id) sender; -(IBAction) setMovieTime: (id) sender; -(IBAction) backSpaceMovieTime: (id) Sender; -(void) loadMediaFile: (NSString *) who; -(IBAction) fwdFrame: (id) sender; -(IBAction) bkFrame: (id) sender; -(IBAction) gotoMovieEnd: (id) sender; -(IBAction) gotoMovieStart: (id) sender; -(IBAction) clearMediaFileTags: (id) sender; -(IBAction) speedUp: (id) sender; -(IBAction) slowDown: (id) sender; -(void) endTimer; -(IBAction) selectColorFromWell:(id)Sender; -(IBAction) selectColorFromSwitch:(id) sender; -(IBAction) rebuildDocMacros: (id) sender; -(IBAction) handleDocMacro: (id) sender; -(void) addMacroItem: (NSString *) ss code: (BOOL) aCode; -(IBAction) okSetComment: (id) sender; -(IBAction) cancelSetComment: (id) sender; -(IBAction) cancelNameCodeSet: (id) Sender; -(IBAction) okNameCodeSet: (id) Sender; -(IBAction) doNameCodeSet: (id) Sender; @end gtamsanalyzer.app-0.42/Source/MyPanedDocument.gorm/0000755000175000017500000000000010162465511022605 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/MyPanedDocument.gorm/data.classes0000644000175000017500000001313311062075652025101 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "selectMoreCodeList:" ); Super = NSObject; }; MyDocument = { Actions = ( "setGWorkBench:", "rebuildBookmarks:", "okCodeInfo:", "searchForCode:", "integrateCodes:", "doFindCurrentCode:", "doFindNextCode:", "checkForPairs:", "checkForNested:", "insertTAMSText:", "moveWorkBenchForward:", "addItemToToolbar:", "doRemoveBookmarks:", "doFindSelectedRange:", "doTurnTextToButton:", "doToggleRuler:", "requestCodeDefinition:", "doColorize:", "setRate:", "generateCodeList:", "refreshCodeList:", "addCode:", "newCode:", "okCountLines:", "cancelCountLines:", "okCodeWithComment:", "cancelCodeWithComment:", "editCodeSet:", "startMovie:", "stopMovie:", "openMovie:", "insertMovieTime:", "setMovieTime:", "backSpaceMovieTime:", "fwdFrame:", "bkFrame:", "gotoMovieEnd:", "gotoMovieStart:", "clearMediaFileTags:", "speedUp:", "slowDown:", "selectColorFromWell:", "selectColorFromSwitch:", "rebuildDocMacros:", "handleDocMacro:", "okSetComment:", "cancelSetComment:", "cancelNameCodeSet:", "okNameCodeSet:", "doNameCodeSet:", "cancelCodeInfo:", "newAction:", "codeSetSelMore:", "selectMoreCodeList:" ); Outlets = ( myToolbar, coderIDView, initFileSearchSwitch, movieTitle, myColorWell, inheritedColorSwitch, rawButton, exactButton, emptyButton, simpleButton, sectionButton, codeButton, codeColorMenu, widthSheet, wsWidthSize, wsStartNumber, wsBlankBreakSwitch, wsCountEmptyLineSwitch, commentView, commentSheet, setCommentSheet, setCommentMenu, setCommentField, codeSetSheet, myWindow, theDoc, theCodeList, theNewCode, codeInfo, codeInfoSheet, newCodeName, codeSetName ); Super = NSDocument; }; codeListWatcher = { Actions = ( ); Outlets = ( myCodeList, myOwner ); Super = NSObject; }; docDelegate = { Actions = ( ); Outlets = ( myBoss ); Super = NSObject; }; toolBarDelagate = { Actions = ( "setCode:" ); Outlets = ( theDocument, mainWindow, "IBOutlet id mainWindow" ); Super = NSObject; }; }gtamsanalyzer.app-0.42/Source/MyPanedDocument.gorm/data.info0000644000175000017500000000027011062075652024375 0ustar brentbrent00000000000000GNUstep archive00002a96:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed Streamgtamsanalyzer.app-0.42/Source/MyPanedDocument.gorm/objects.gorm0000644000175000017500000004045511062075652025137 0ustar brentbrent00000000000000GNUstep archive00002a96:0000002a:000001b8:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&(01NSString&% Button501NSButton1 NSControl1NSView1 NSResponder% @ C B A  B A&01 NSMutableArray1 NSArray&%01 NSButtonCell1 NSActionCell1NSCell0&% Inherited color01NSImage0 1NSMutableString&% common_SwitchOff0 1NSFont%&&&&&&&&%0 &0 &0 0&% common_SwitchOn&&&0& %  GormNSPanel01NSPanel1NSWindow%  C݀ Cb& % B D0%  C݀ Cb  C݀ Cb&0 &01 NSTextField% CF B A  B A&0 &%01NSTextFieldCell0&% Describe code:0% A`&&&&&&&&%01NSColor0&%NSNamedColorSpace0&% System0&% textBackgroundColor00& %  textColor01 NSScrollView% C A C C,  C C,&0 &0 1 NSClipView% A  C C, A  C C,&0! &0"1 NSTextView1NSText% A  C C,  C C,&0# &0$0%&% System0&&% textBackgroundColor  K K0'%0(& %  textColor C K$0)1 NSScroller%  A C,  A C,&0* &%0+0,& &&&&&&&&&2 _doScroll:v12@0:4@8 % A A A A )0-1 NSColorWell% A C# BT A  BT A&0. &%0/00& &&&&&&&&0102&%NSCalibratedWhiteColorSpace ?03% A A B` A  B` A&04 &%05 06&% Ok &&&&&&&&%07&08&&&&09% B A B` A  B` A&0: &%0; 0<&% Cancel &&&&&&&&%0=&0>&&&&0?% B CF B A  B A&0@ &%0A0B&% Title&&&&&&&&%0C0D&% System0E&% textBackgroundColor0FD0G& %  textColor0H0I&% System0J&% windowBackgroundColor0K&% Window0L&% PanelL A A F@ F@%0M0N&%NSApplicationIcon0O&% Button630P& %  TableColumn0Q1 NSTableColumn0R&% column1 C A GP0S1NSTableHeaderCell0T&% Codes0U% &&&&&&&&%0V0W&%System0X&%controlShadowColor0Y0Z&% System0[&% windowFrameTextColor0\0]&%neuf ]&&&&&&&&%0^Z0_&% textBackgroundColor0`Z0a& %  textColor0b&% Button790c&% Button80d% C A  B` A  B` A&0e &%0f 0g&% Ok &&&&&&&&%0h&0i&&&&0j&% Button90k% C A  B` A  B` A&0l &%0m 0n&% Cancel &&&&&&&&%0o&0p&&&&0q&% Button0r% C B` A  B` A& 0s &%0t 0u&% Def &&&&&&&&%0v&0w&&&&0x& %  docDelegate0y1 GSNibItemx  &0z&% Button100{% Cr A  B` A  B` A&0| &%0} 0~&% Ok &&&&&&&&%0&0&&&&0& %  TextField0% C΀ C2 A  C2 A& 0 &%00& &&&&&&&&%00&% System0&% textBackgroundColor00& %  textColor0&% Button110% C A  B` A  B` A&0 &%0 0&% Cancel &&&&&&&&%0&0&&&&0&% GSCustomClassMap0&0& %  SplitView01 NSSplitView% A A  D@ C  D@ C&0 &01!NSBox%  C2 C  C2 C&0 &0%  C2 C  C2 C&0 &0%  C2 C  C2 C&0 &0% A A C C  C C&0 &01" NSTableView%  C C!  C C!&0 &%00& &&&&&&&&0 &Q0Z0& %  gridColor02 ?Q ?01#NSTableHeaderView%  C A  C A&0 &01$GSTableCornerView% @ @ A A  A A&0 &%% A @ @@0% @ A A C  A C&0 &%0 &&&&&&&&&0% A @ C A  C A&0 &0Z0& %  controlColor% A A A A 0% B Cۀ B` A  B` A& 0 &%0 0&% New &&&&&&&&%0&0&&&&0% Bt Cۀ B` A  B` A& 0 &%0 0&% Code &&&&&&&&%0&0&&&&0% Cۀ B` A  B` A& 0 &%0 0&% Sel. + &&&&&&&&%0±&0ñ&&&&r0ı% B C B` A  B` A& 0ű &%0Ʊ 0DZ&% Ruler &&&&&&&&%0ȱ&0ɱ&&&&0ʱ0˱&% Title &&&&&&&& %%0̱% C8  C C  C C&0ͱ &0α% A @ C C A  C C&0ϱ &0б% A  C C  C C&0ѱ &0ұ0ӱ&% System0Ա&% textBackgroundColor  K K0ձ0ֱ& %  textColor C K0ױ% @ @ A C  A C&0ر &%0ٱ0ڱ& &&&&&&&&&̲% A A A A 0۱0ܱ&% common_Dimple.tiff0ݱ0ޱ&%System0߱&%controlBackgroundColor00&%controlShadowColor%A0& %  GormNSPanel10%  C C& % Ca D0%  C C  C C&0 &0% A B B A  B A&0 &%00&% Code set name:&&&&&&&&%00&% System0&% textBackgroundColor00& %  textColor0% B B C A  C A&0 &%00& &&&&&&&&%00&% System0&% textBackgroundColor00& %  textColordk00&% System0&% windowBackgroundColor0&% Window0&% Panel ? A F@ F@%M0& %  GormNSPanel20%  C C&% Cb D0%  C C  C C&P &P% A C[ B A  B A&P &%PP&% Comment:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP & %  textColorP % A B C C=  C C=&P &P % A @ C C9 A @ C C9&P &P% A @ C C9  C C9&P &PP&% SystemP&% textBackgroundColor  K KPP& %  textColor C KP% @ @ A C9  A C9&P &%PP& &&&&&&&&&  % A A A A {PP&% SystemP&% windowBackgroundColorP&% WindowP&% Panel ? A F@ F@%MP& %  TextView1"P& %  GormNSWindowP %  D@ C&% C\ DP!%  D@ C  D@ C&P" &HKP#&% WindowP$&%Window A A F@ F@%MP%& %  TextView2P&&% codeListWatcherP'&  &P(& %  ScrollViewP)&% BoxP*& %  TextField1P+& %  TextField2?P,&% GormNSTableViewP-& %  TextField3P.& %  TextField4P/& %  TextField5P0& %  ScrollView1P1& %  ColorWell-P2& %  ScrollView2P3&%NSOwnerP4& %  MyDocumentP5& %  ScrollView3 P6& %  TableColumn1P7P8&% column2 BT A GPP9P:&%  U&&&&&&&&%P;IP<&% controlShadowColorYP=P>&% three >&&&&&&&&%^`P?&% toolBarDelagateP@?  &PA&% Button1PB&% Button2PC&% TextViewPD&% Button3PE&% Button4PF &KKPG1%NSNibConnectorPH&%NSOwnerPI%(PJ%,PK%PPL%6PM%qPN%AHPO%BHPP%DHPQ%PR%EPS%xHPT%&HPU1&NSNibOutletConnectorxHPV&% myBossPW&&HPX&% myOwnerPY&xPZ&% delegateP[&HP\&% windowControllerP]&HP^&% _windowP_&HP`&% myWindowPa&H,Pb& %  theCodeListPc&HPd& %  theNewCodePe&HCPf&% theDocPg%HPh%*Pi%2Pj%Pk%1Pl%Pm%OPn%bPo%+Pp&HPq&% codeInfoPr&HPs& %  codeInfoSheetPt&H+Pu& %  newCodeNamePv&H1Pw& %  myColorWellPx&HPy&% inheritedColorSwitchPz1'NSNibControlConnectorOHP{& %  okCodeInfo:P|'bHP}&% cancelCodeInfo:P~&,&P& %  dataSourceP'HP&% refreshCodeList:P'qHP&% requestCodeDefinition:P'DHP&% newCode:P'BHP&% addCode:P&CxP&% delegateP&,HP&% delegateP%?HP&?HP& %  theDocumentP&?P& %  mainWindowP&H?P& %  myToolbarP'AHP&% doToggleRuler:P%HP%-P%.P%cP%jP&HP& %  codeSetSheetP&H.P& %  codeSetNameP'cHP&% okNameCodeSet:P'jHP&% cancelNameCodeSet:P%HP%/P%5P%%P%zP%P&H%P& %  commentViewP&HP& %  commentSheetP'zHP&% okCodeWithComment:P'HP&% cancelCodeWithComment:P&HBP& %  codeButtonP%P%)P%0P%CP'EHP&% selectMoreCodeList:P1( GSMutableSet1) NSMutableSet1*NSSet& @y'gtamsanalyzer.app-0.42/Source/myPanedResults.gorm/0000755000175000017500000000000010162465511022530 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/myPanedResults.gorm/data.classes0000644000175000017500000002202611062075652025025 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "changeFont:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontFontPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "addDotGraph:", "delAllDotGraph:", "delDotGraph:", "writeDotGraph:", "addAttrib:", "delAttrib:", "delAllAttrib:", "addEdgeAttrib:", "delEdgeAttrib:", "delAllEdgeAttrib:", "snValHandler:", "snAdd:", "snDel:", "snDelAll:", "seValHandler:", "seAdd:", "seDel:", "seDelAll:", "override:" ); Super = NSObject; }; MWExportWatcher = { Actions = ( "exitExport:", "runExport:" ); Outlets = ( clipboardSwitch, escapeSwitch, fieldList, formatMenu, selectedSwitch, tagSwitch, theBoss, theWindow, thePane, colDelim, rowDelim, headerSwitch ); Super = NSObject; }; MWResultToolbarDelegate = { Actions = ( ); Outlets = ( theDocument, mainWindow, "IBOutlet id mainWindow" ); Super = NSObject; }; dotGraphWatcher = { Actions = ( "addDotGraph:", "cancel:", "delAllDotGraph:", "delDotGraph:", "writeDotGraph:", "addAttrib:", "delAttrib:", "delAllAttrib:", "addEdgeAttrib:", "delEdgeAttrib:", "delAllEdgeAttrib:", "snValHandler:", "snAdd:", "snDel:", "snDelAll:", "seValHandler:", "seAdd:", "seDel:", "seDelAll:", "override:" ); Outlets = ( arrowDirMenu, nBorderMenu, nShapeMenu, nGroupMenu, dgMenu, fieldList, levelMenu, lineTypeMenu, nameField, theBoss, thePane, typeMenu, saveButton, attribTable, edgeAttribTable, fromMenu, toMenu, ftStyleMenu, ftDirMenu, ftTypeMenu, countSwitch, codeLevelSwitch, snVarMenu, snValMenu, snShapeMenu, snStyleMenu, snTable, seVarMenu, seValMenu, seShapeMenu, seStyleMenu, seTable, seDirMenu, overrideSwitch, codeLevel, "IBOutlet id nBorderMenu", "IBOutlet id nGroupMenu", "IBOutlet id fieldList", "IBOutlet id lineTypeMenu", "IBOutlet id theBoss", "IBOutlet id typeMenu", "IBOutlet id attribTable", "IBOutlet id fromMenu", "IBOutlet id ftStyleMenu", "IBOutlet id ftTypeMenu", "IBOutlet id codeLevelSwitch", "IBOutlet id snValMenu", "IBOutlet id snStyleMenu", "IBOutlet id seValMenu", "IBOutlet id seStyleMenu", "IBOutlet id overrideSwitch" ); Super = NSObject; }; myResults = { Actions = ( "doSelect:", "cancelSelect:", "popFwdSetStack:", "popSetStack:", "turnSelectionIntoCodeSet:", "okSel2CodeSet:", "selCSCancel:", "selCSSelectLess:", "selCSSelectMore:", "selCSSelect:", "doAddCodeOK:", "doNewCode:", "doAddCodeCancel:", "selectColorFromSwitch:", "selectColorFromWell:", "okAddComment:", "cancelAddComment:", "okDelRoot:", "cancelDelRoot:", "okAddRoot:", "cancelAddRoot:", "toggleAddRootColor:", "okCodeLevel:", "cancelCodeLevel:", "okNamedSelection:", "cancelNamedSelection:", "okSetMath:", "cancelSetMath:" ); Outlets = ( theResults, thisCell, recCount, dirtySourceFlag, limitField, myWindow, selectField, selectFloat, selectRegexFlag, selectMenu, selectSheet, exportWatcher, newOutlet, sel2CodeSetName, sel2CodeSetSheet, selCSExactSwitch, selCSMenu, selCSSheet, addCodeName, addCodeWindow, codePrompt, inheritedColorSwitch, myColorWell, newCodeDef, newCodeName, commentField, commentSheet, delRootPane, delRootLevels, addRootColor, addRootInherited, addRootName, addRootPane, codeLevelField, codeLevelPane, summWatcher, namedSelSheet, namedSelField, setMathSheet, setMathOpMenu, setMathSetMenu, autoSetWatcher, dotGraphWatcher ); Super = NSDocument; }; setMacroWatcher = { Actions = ( "zeroEditor:", "addAutosetStep:", "addAutoHistory:", "addSelectStep:", "addSetStep:", "addCodeSetStep:", "cancelMacro:", "deleteAllSteps:", "deleteStep:", "deleteMacro:", "loadMacro:", "moveDown:", "moveUp:", "saveMacro:", "runMacro:" ); Outlets = ( fpOption, macroMenu, macroView, nameView, regexOption, columnMenu, selectModeMenu, selectStringView, selectTypeMenu, setObjectMenu, localAutosetMenu, setOpMenu, startMenu, globalScope, sortSwitch, codeSetMenu, codeSetSelMenu, codeSetExact, myOverLord, macroSheet, "IBOutlet id macroMenu", "IBOutlet id nameView", "IBOutlet id columnMenu", "IBOutlet id selectStringView", "IBOutlet id setObjectMenu", "IBOutlet id setOpMenu", "IBOutlet id globalScope", "IBOutlet id codeSetMenu", "IBOutlet id codeSetExact", "IBOutlet id macroSheet" ); Super = NSObject; }; summaryWatcher = { Actions = ( "resetFields:", "addGroup:", "addSummRep:", "cancelSumm:", "delAllGroup:", "delAllSummRep:", "delGroup:", "delSummRep:", "loadReport:", "myAction:", "okSumm:", "suffleDownGroup:", "suffleUpGroup:", "addSortStackToGroups:" ); Outlets = ( compLevelField, sortSwitch, sortMenu, countDupSwitch, projWideSwitch, countBlanksSwitch, resultClass, resultWindow, summFieldPopMenu, summGroupPopMenu, summGroupTable, summGroupTypePopMenu, summName, summPane, summReportPopMenu, summTypePopMenu, summSumFieldPopMenu, summFieldType, summFieldCompLevel ); Super = NSObject; }; }gtamsanalyzer.app-0.42/Source/myPanedResults.gorm/data.info0000644000175000017500000000027011062075652024320 0ustar brentbrent00000000000000GNUstep archive00002a96:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed Streamgtamsanalyzer.app-0.42/Source/myPanedResults.gorm/objects.gorm0000644000175000017500000043650311062075652025065 0ustar brentbrent00000000000000GNUstep archive00002a96:00000031:00000fe1:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString& %  MenuItem3301 NSMenuItem0& %  Do not sort0&&&%01NSImage0& % common_Nibble%0 & %  ScrollView10 1 NSScrollView1 NSView1 NSResponder% C( D C~  D C~&0 1 NSMutableArray1 NSArray&0 1 NSClipView% A A D CQ  D CQ&0 &01 NSTableView1 NSControl%  D C!  D C!&0 &%01NSCell0&01NSFont%&&&&&&&&0 &01 NSTableColumn0&% # D A GP01NSTableHeaderCell1NSTextFieldCell1 NSActionCell0&%  0% &&&&&&&&%01NSColor0&%NSNamedColorSpace0&%System0&%controlShadowColor00&% System0&% windowFrameTextColor0 0!&%nine!&&&&&&&&%0"0#&% textBackgroundColor0$0%& %  textColor0&0'& %  gridColor0(0)&% System0*&% controlBackgroundColor0+1NSTableHeaderView%  D A  D A&0, &0-1GSTableCornerView% @ @ A A  A A&0. &%% A @ @@0/00&% controlBackgroundColor011 NSScroller% @ A A Cd  A Cd&02 &%03&&&&&&&&& 2 _doScroll:v12@0:4@8-04 % A @ D A  D A&05 &+0607& %  controlColor08% A Cj D A  D A&09 &%0:0;&&&&&&&&&&  % A A A A 8140<& %  MenuItem340=0>&$% $Use current sort before doing report&&%%0?& %  ScrollView20@% A A  CB C  CB C&0A &0B % A A C+ Ck  C+ Ck&0C &0D%  C+ C!  C+ C!&0E &%0F0G&&&&&&&&&0H &0I0J&% column1 C+ A GP0K0L&% Columns&&&&&&&&%0M0N&% System0O&% windowFrameTextColor0P0Q&%neufQ&&&&&&&&%0RN0S&% textBackgroundColor0TN0U& %  textColor0VN0W& %  gridColor(0X%  C+ A  C+ A&0Y &0Z% @ @ A A  A A&0[ &%% A @ @@0\N0]&% controlBackgroundColor0^% @ A A Ck  A Ck&0_ &%0`G&&&&&&&&&@Z0a % A @ C+ A  C+ A&0b &X0cN0d& %  controlColorB% A A A A ^a0e& %  MenuItem350f0g&.% .Use current groups to sort before doing report&&%%0h& %  ScrollView30i% B B C B  C B&0j &0k % A @ C} B A @ C} B&0l &0m1 NSTextView1NSText% A @ C} B  C} B&0n &0o0p&% System0q&% textBackgroundColor  K K0rp0s& %  textColor C} Ko0t% @ @ A B  A B&0u &%0v0w&&&&&&&&&&ik% A A A A t0x& %  MenuItem360y0z&% Item 10{&&&%%0|& %  ScrollView40}% A B C Cu  C Cu&0~ &0 % A @ C Cq A @ C Cq&0 &0% A @ C Cq  C Cq&0 &00&% System0&% textBackgroundColor  K K00& %  textColor C K0% @ @ A Cq  A Cq&0 &%00&&&&&&&&&&}% A A A A 0& %  MenuItem3700&% Item 2{&&%%0& %  MenuItem11000&% Bold0&&&%%0& %  TextField6001 NSTextField% A B B A  B A&0 &%00&% Node:0% A`&&&&&&&&%00&% System0&% textBackgroundColor00& %  textColor0& %  ScrollView50% A B C C  C C&0 &0 % A A C C  C C&0 &0%  C C!  C C!&0 &%00&&&&&&&&&0 &00&% field B A GP00&% Group&&&&&&&&%00&% System0&% windowFrameTextColor0!!&&&&&&&&%00&% textBackgroundColor00& %  textColor00&% type CC A GP00&% Type&&&&&&&&%0!!&&&&&&&&%00& %  gridColor00&%NSCalibratedWhiteColorSpace ?Y6N ?0%  C A  C A&0 &0% @ @ A A  A A&0 &%% A @ @@0% @ A A C  A C&0± &%0ñ&&&&&&&&&0ı % A @ C A  C A&0ű &0Ʊ0DZ& %  controlColor% A A A A 0ȱ& %  MenuItem380ɱ0ʱ&% Item 3{&&%%0˱& %  MenuItem1110̱0ͱ&% Dotted&&%%0α& %  TextField610ϱ% A B$ B A  B A&0б &%0ѱ0ұ& %  Attributes:&&&&&&&&%0ӱ0Ա&% System0ձ&% textBackgroundColor0ֱ0ױ& %  textColor0ر& %  ScrollView60ٱ% AP C C C  C C&0ڱ &0۱ % A A C C  C C&0ܱ &0ݱ%  C C!  C C!&0ޱ &%0߱0&&&&&&&&&0 &00&% column1 C A GP00&% Steps&&&&&&&&%00&% System0&% windowFrameTextColor0QQ&&&&&&&&%00&% textBackgroundColor00& %  textColor00& %  gridColor0 ?WE ?0%  C A  C A&0 &0% @ @ A A  A A&0 &%% A @ @@0% @ A A C  A C&0 &%0&&&&&&&&&ٲ0 % A @ C A  C A&0 &00& %  controlColor% A A A A 0& %  MenuItem3900&% Count of records0&&&%%P& %  ColorWell1P1 NSColorWell% B B0 BT A  BT A&P &%PP&&&&&&&&&P ?P& %  MenuItem112PP&% FilledP &&&%%P & %  TextField62P % C0 B B0 A  B0 A&P &%P P&% Value:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  ScrollView7P% A C C C  C C&P &P % A A C B  C B&P &P%  C C!  C C!&P &%PP&&&&&&&&&P &PP&% column1 C A GPP P!&%  &&&&&&&&%P"P#&% SystemP$&% windowFrameTextColorP%P&&%sept&&&&&&&&&%P'#P(&% textBackgroundColorP)#P*& %  textColorP+#P,& %  gridColorP-#P.&% controlBackgroundColorP/%  C A  C A&P0 &P1% @ @ A A  A A&P2 &%% A @ @@-P3% @ A A B  A B&P4 &%P5&&&&&&&&&1P6 % A @ C A  C A&P7 &/P8#P9& %  controlColor% A A A A 36P:& %  MenuItem113P;P<&% TextP=&&&%%P>&% Button50P?1NSButton% CU A  B` A  B` A&P@ &%PA1 NSButtonCellPB&% Ok&&&&&&&&%PC&PD&&&&PE& %  TextField63PF% C- Ce B` A  B` A&PG &%PHPI&&&&&&&&&%PJPK&% SystemPL&% textBackgroundColorPMKPN& %  textColorPO& %  ScrollView8PP% A C C C  C C&PQ &PR % A A Cƀ B  Cƀ B&PS &PT%  Cƀ C!  Cƀ C!&PU &%PVPW&&&&&&&&&PX &PYPZ&% column1 Cƀ A GPP[P\&%  &&&&&&&&%P]P^&% SystemP_&% windowFrameTextColorP`&&&&&&&&&&%Pa^Pb&% textBackgroundColorPc^Pd& %  textColorPe^Pf& %  gridColorPg^Ph&% controlBackgroundColorPi%  Cƀ A  Cƀ A&Pj &Pk% @ @ A A  A A&Pl &%% A @ @@gPm% @ A A B  A B&Pn &%PoW&&&&&&&&&PkPp % A @ Cƀ A  Cƀ A&Pq &iPr^Ps& %  controlColorR% A A A A mpPt& %  MenuItem114PuPv&% Box=&&%%Pw&% Button51Px% C A  B` A  B` A&Py &%PzP{&% Cancel&&&&&&&&%P|&P}&&&&P~& %  TextField64P% A C@ B A  B A&P &%PP&% Specific arrows:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  ScrollView9P% A B C C  C C&P &P % A A Cƀ B  Cƀ B&P &P%  C C!  C C!&P &%PP&&&&&&&&&P &PP&% column1 C A GPPP&%  &&&&&&&&%PP&% SystemP&% windowFrameTextColorP&&&&&&&&&&%PP&% textBackgroundColorPP& %  textColorPP& %  gridColorPP&% controlBackgroundColorP%  C A  C A&P &P% @ @ A A  A A&P &%% A @ @@P% @ A A B  A B&P &%P&&&&&&&&&P % A @ Cƀ A  Cƀ A&P &PP& %  controlColor% A A A A P& %  MenuItem115PP&% Ellipse=&&%%P&% Button52P% C A0 B` A  B` A&P &%PP&% Ok&&&&&&&&%P&P&&&&P& %  TextField65P% B C@ A A  A A&P &%PP&% ->&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  MenuItem116P±Pñ&% HexagonPı&&&%%Pű&% Button53PƱ% CӀ A0 B` A  B` A&PDZ &%PȱPɱ&% Cancel&&&&&&&&%Pʱ&P˱&&&&P̱& %  TextField66Pͱ% A Cq C A  C A&Pα &%PϱPб&% Specific arrow values:&&&&&&&&%PѱPұ&% SystemPӱ&% textBackgroundColorPԱPձ& %  textColorPֱ& %  ColorWellPױ% B C  BT A  BT A&Pر &%PٱPڱ&&&&&&&&&P۱ ?Pܱ& %  MenuItem117PݱPޱ&% HouseP߱&&&%%P&% Button54P% C C B` A  B` A&P &%PP&% Clear&&&&&&&&%P&P&&&&P& %  TextField67P% A B B A  B A&P &%PP&% Edge elements:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  MenuItem118PP&% PointP&&&%%P&% Button55P% C C B` A  B` A&P &%PP&% Save&&&&&&&&%P&P&&&&P& %  TextField68P% CV B B( A  B( A&P &%PP&% Value:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  MenuItem119PP&% NormalP &&&%%P &% Button56P % CC C B` A  B` A&P &%P P&% Load&&&&&&&&%P&P&&&&P& %  TextField69P% A B$ B A  B A&P &%PP& %  Attributes:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP&% Button57P% C C B` A  B` A&P &%PP&% Delete&&&&&&&&%P &P!&&&&P"&% ClipViewP# % A A Cƀ B  Cƀ B&P$ &P%%  Cƀ C!  Cƀ C!&P& &%P'P(&&&&&&&&&P) &P*P+&% column1 Cƀ A GPP,P-&%  &&&&&&&&%P.P/&%SystemP0&%controlShadowColorP1P2&% SystemP3&% windowFrameTextColorP4P5&%sept5&&&&&&&&%P62P7&% textBackgroundColorP82P9& %  textColorP:2P;& %  gridColorP<2P=&% controlBackgroundColorP>%  Cƀ A  Cƀ A&P? &P@% @ @ A A  A A&PA &%% A @ @@<PB&% Button58PC% C C B` A  B` A&PD &%PEPF&% Run&&&&&&&&%PG&PH&&&&PI&% Button59PJ% AP B A A  A A&PK &%PLPM&% ^&&&&&&&&%PN&PO&&&&PP&% GormNSPopUpButton20PQ1 NSPopUpButton% B4 C C A  C A&PR &%PS1!NSPopUpButtonCell1"NSMenuItemCellPT&&&&&&&&&PU1#NSMenuPV&PW &PXPY&% Item 1PZ&&&%%P[P\&% Item 2Z&&%%P]P^&% Item 3Z&&%%%P_&P`&&&&XU%%%%%Pa&% GormNSPopUpButton21Pb % B C Cm A  Cm A&Pc &%Pd!Pe&&&&&&&&&Pf#Pg&Ph &PiPj&% Item 1Pk&&&%%PlPm&% Item 2k&&%%PnPo&% Item 3k&&%%%Pp&Pq&&&&if%%%%%Pr&% GormNSPopUpButton22Ps % A C Ci A  Ci A&Pt &%Pu!Pv&&&&&&&&&Pw#Px&Py &PzP{&% SelectP|&&&%%P}P~&% Remove from selection|&&%%PP&% Select additional|&&%%%P&P&&&&zw%%%%%P&% GormNSPopUpButton23P % B C@ C? A  C? A&P &%P!P&&&&&&&&&P#P&P &PP&% Item 1P&&&%%PP&% Item 2&&%%PP&% Item 3&&%%%P&P&&&&%%%%%P&% GormNSPopUpButton24P % B C C^ A  C^ A&P &%P!P&&&&&&&&&P#P&P &PP& %  1 to manyP&&&%%PP& %  Many to many&&%%PP&% Tree&&%%%P&P&&&&%%%%%P&% GormNSPopUpButton25P % B C B A  B A&P &%P!P&&&&&&&&&P#P&P &PP&% BothP&&&%%PP&% Forward&&%%PP&% Back&&%%PP&% NoneP&&&%%%P&P&&&&%%%%%P&% GormNSPopUpButton26P % B C C^ A  C^ A&P &%P!P&&&&&&&&&P#P&P &PP±&% YesPñ&&&%%PıPű&% No&&%%%PƱ&PDZ&&&&%%%%%Pȱ&% GormNSPopUpButton27Pɱ % Bp C@ B A  B A&Pʱ &%P˱!P̱&&&&&&&&&Pͱ#Pα&Pϱ &PбPѱ&% Item 1Pұ&&&%%PӱPԱ&% Item 2&&%%PձPֱ&% Item 3&&%%%Pױ&Pر&&&&͐%%%%%Pٱ&% GormNSPopUpButton28Pڱ % C C C A  C A&P۱ &%Pܱ!Pݱ&&&&&&&&&Pޱ#P߱&P &PP&% NormalP&&&%%PP&% Dot&&%%PP&% Dashed&&%%PP&% NoneP&&&%%%P&P&&&&ސ%%%%%P& %  MenuItem40PP& %  Sum of fields&&%%P&% GormNSPopUpButton29P % C C@ B A  B A&P &%P!P&&&&&&&&&P#P&P &PP&% TextP&&&%%PP&% Box&&%%PP&% Ellipse&&%%PP&% HexagonP&&&%%PP&% HouseP&&&%%PP&% PointP&&&%%%P&P &&&&%%%%%P & %  MenuItem41P P &% Item 1P &&&%%P& %  MenuItem42PP&% Item 2 &&%%P& %  MenuItem43PP&% Item 3 &&%%P& %  MenuItem44PP&% CodeP&&&%%P& %  MenuItem45PP&% Alpha&&%%P& %  MenuItem46PP&% Int&&%%P& %  MenuItem47PP &% RealP!&&&%%P"& %  MenuItem120P#P$&% Bold &&%%P%& %  MenuItem48P&P'&% DateP(&&&%%P)& %  MenuItem121P*P+&% Dotted &&%%P,& %  MenuItem49P-P.&% CodeP/&&&%%P0& %  MenuItem122P1P2&% FilledP3&&&%%P4& %  MenuItem123P5P6&% BothP7&&&%%P8&% Button60P9% B B A A  A A&P: &%P;P<&% -&&&&&&&&%P=&P>&&&&P?& %  MenuItem124P@PA&% Forward7&&%%PB&% Button61PC% B( B A A  A A&PD &%PEPF&% v&&&&&&&&%PG&PH&&&&PI& %  MenuItem125PJPK&% Back7&&%%PL&% Button62PM% B B A A  A A&PN &%POPP&% --&&&&&&&&%PQ&PR&&&&PS& %  MenuItem126PTPU&% NonePV&&&%%PW&% Button63PX% C B B A  B A&PY &%PZP[& %  Add history&&&&&&&&%P\&P]&&&&P^& %  MenuItem127P_P`&% NormalPa&&&%%Pb&% Button64Pc% AP Bp C( A  C( A&Pd &%PePf&% Use current sort at startPgPh1$NSMutableString&% common_SwitchOff&&&&&&&&%Pi&Pj&PkPl$&% common_SwitchOn&&&Pm& %  MenuItem128PnPo&% Dota&&%%Pp&% Button65Pq% AP B C A  C A&Pr &%PsPt&% Project wide autosetg&&&&&&&&%Pu&Pv&k&&&Pw& %  MenuItem129PxPy&% Dasheda&&%%Pz&% Button66P{% D A  B` A  B` A&P| &%P}P~&% Exit&&&&&&&&%P&P&&&&P&% Button67P% Cq A  B| A  B| A&P &%PP&% Add step&&&&&&&&%P&P&&&&P&% Button68P% B C C( A  C( A&P &%PP&% Floating point numberg&&&&&&&&%P&P&k&&&P&% TableHeaderView>P&% Button69P% B C@ B A  B A&P &%PP&% Regexg&&&&&&&&%P&P&k&&&P&% GormNSPopUpButton30P % Cx C@ B A  B A&P &%P!P&&&&&&&&&P#P&P &PP&% Normal&&%%%P&P&&&&%%%%%P&% GormNSPopUpButton31P % Ca B B A  B A&P &%P!P&&&&&&&&&P#P&P &PP&% Item 1P&&&%%PP&% Item 2&&%%PP&% Item 3&&%%%P&P&&&&%%%%%P&% GormNSPopUpButton32P % BT B B A  B A&P &%P!P&&&&&&&&&P#P&P &PP&% Item 1P&&&%%PP&% Item 2&&%%PP±&% Item 3&&%%%Pñ&Pı&&&&%%%%%Pű&% GormNSPopUpButton33PƱ % C, B B A  B A&PDZ &%Pȱ!Pɱ&&&&&&&&&Pʱ#P˱&P̱ &#*1%Pͱ&Pα&&&&ʐ%%%%%Pϱ&% GormNSPopUpButton34Pб % B B B A  B A&Pѱ &%Pұ!Pӱ&&&&&&&&&PԱ#Pձ&Pֱ &PױPر&% BothPٱ&&&%%PڱP۱&% Forward&&%%PܱPݱ&% Back&&%%PޱP߱&% NoneP&&&%%%P&P&&&&Ԑ%%%%%P&% GormNSPopUpButton35P % A C@ B A  B A&P &%P!P&&&&&&&&&P#P&P &PP&% Item 1P&&&%%PP&% Item 2&&%%PP&% Item 3&&%%%P&P&&&&%%%%%P&% ButtonP% BH Cڀ B A  B A& P &%PP&% >&&&&&&&&%P&P&&&&P&% GormNSPopUpButton36P % C_ C@ B A  B A&P &%P!P&&&&&&&&&P#P&P &5@JT%P&P&&&&5%%%%%P&% GormNSPopUpButton37P % C C@ B A  B A&P &%P!P &&&&&&&&&P #P &P &P P&% Item 1P&&&%%PP&% Item 2&&%%PP&% Item 3&&%%%P&P&&&&  %%%%%P&% GormNSPopUpButton38P % C C@ B A  B A&P &%P!P&&&&&&&&&P#P&P &_nxPP&% NoneP &&&%%%P!&P"&&&&_%%%%%P#& %  MenuItem50P$P%&% Alpha/&&%%P&&% GormNSPopUpButton39P' % C- B B A  B A&P( &%P)!P*&&&&&&&&&P+#P,&P- &P.P/&% NormalP0&&&%%P1P2&% Dot0&&%%P3P4&% Dashed0&&%%P5P6&% NoneP7&&&%%%P8&P9&&&&.+%%%%%P:& %  MenuItem51P;P<&% Int/&&%%P=& %  MenuItem52P>P?&% RealP@&&&%%PA& %  MenuItem53PBPC&% DatePD&&&%%PE& %  MenuItem54PFPG&% intersect withPH&&&%%PI& %  MenuItem55PJPK& %  union withH&&%%PL& %  MenuItem56PMPN&% not in the union withH&&%%PO& %  MenuItem57PPPQ&% don't intersect withPR&&&%%PS& %  MenuItem130PT& %  MenuItem58PUPV&% non-overlapped union withPW&&&%%PX& %  MenuItem131PY& %  MenuItem59PZP[&% Item 1P\&&&%%P]& %  MenuItem132P^& %  MenuItem133P_&% Button70P`% Co A  B A  B A&Pa &%PbPc&% Add step&&&&&&&&%Pd&Pe&&&&Pf& %  MenuItem134Pg&% Button71Ph% Co A  B A  B A&Pi &%PjPk&% Add step&&&&&&&&%Pl&Pm&&&&Pn& %  MenuItem135Po&% Button72Pp% Cx C B` A  B` A&Pq &%PrPs&% Exactg&&&&&&&&%Pt&Pu&k&&&Pv& %  MenuItem136Pw&% Button73Px% Co A  B A  B A&Py &%PzP{&% Add step&&&&&&&&%P|&P}&&&&P~&% ScrollerP% @ A A B  A B&P &%P(&&&&&&&&&P& %  MenuItem137P&% Button74P% B C B A  B A&P &%PP&% Include countsg&&&&&&&&%P&P&k&&&P& %  MenuItem138PP&% AllP&&&%%P&% Button75P% A B B A  B A&P &%PP& %  Save to fileg&&&&&&&&%P&P&k&&&P& %  MenuItem139PP& %  Forward only&&%%P&% Button76P% B Cg B A  B A&P &%PP&% Use code level:g&&&&&&&&%P&P&k&&&P&% Button77P% B A  B A  B A&P &%PP& %  Show graph&&&&&&&&%P&P&&&&P&% Button78P% A A  B` A  B` A&P &%PP&% Exit&&&&&&&&%P&P&&&&P&% Button79P% A C A A  A A&P &%PP&% +&&&&&&&&%P&P&&&&P&% GormNSPopUpButton40P % B B B A  B A&P &%P!P&&&&&&&&&P#P&P &PP&% Item 1P&&&%%PP&% Item 2&&%%PP±&% Item 3&&%%%Pñ&Pı&&&&%%%%%Pű&% GormNSTableView1DPƱ& %  ClipView1PDZ % A @ Cƀ A  Cƀ A&Pȱ &>Pɱ2Pʱ& %  controlColorP˱&% GormNSPopUpButton41P̱ % C B B A  B A&Pͱ &%Pα!Pϱ&&&&&&&&&Pб#Pѱ&Pұ &PӱPԱ& %  Backward only&&%%%Pձ&Pֱ&&&&А%%%%%Pױ&% GormNSTableView2Pر&% GormNSPopUpButton42Pٱ % C B B A  B A&Pڱ &%P۱!Pܱ&&&&&&&&&Pݱ#Pޱ&P߱ &PP&% Item 1P&&&%%PP&% Item 2&&%%PP&% Item 3&&%%%P&P&&&&ݐ%%%%%P&% GormNSTableView3P&% GormNSTableView4P& %  ScrollView10P% A C C C  C C&P &P % A A Cƀ B  Cƀ B&P &P%  Cƀ C!  Cƀ C!&P &%PP&&&&&&&&&P &PP&% column1 Cƀ A GPPP&%  &&&&&&&&%.PP&% SystemP&% windowFrameTextColorP55&&&&&&&&%PP&% textBackgroundColorPP& %  textColorPP& %  gridColorPP&% SystemP&% controlBackgroundColorP%  Cƀ A  Cƀ A&P &P% @ @ A A  A A&P &%% A @ @@P % @ A A B  A B&P &%P &&&&&&&&&P % A @ Cƀ A  Cƀ A&P &PP& %  controlColor% A A A A   P&% GormNSPopUpButton44P % B B B A  B A&P &%P!P&&&&&&&&&P#P&P &;u%P&P&&&&;%%%%%P&% GormNSTableView5TP&% TabView1P1% NSTabView% C B C C  C C&P &P % ? ? C C  C C&P &  P! % Bh C@ C# A  C# A&P" &%P#!P$&&&&&&&&&P%#P&&P' &P(P)&% SelectP*&&&%%P+P,&% Select additional*&&%%P-P.&% Select reverse*&&%%P/P0&% Remove from selectionP1&&&%%%P2&P3&&&&(%%%%%%P4 % B C CN A  CN A&P5 &%P6!P7&&&&&&&&&P8#P9&P: &  P;P<&% Search case insensitiveP=&&&%%P>P?&% Search case sensitive=&&%%P@PA&% Search exact string=&&%% PBPC&% Search = valuePD&&&%%PEPF&% Search > valuePG&&&%%PHPI&% Search >= valuePJ&&&%%PKPL&% Search < valuePM&&&%%PNPO&% Search <= valuePP&&&%%PQPR&% Search for datePS&&&%%PTPU&% Search before datePV&&&%% PWPX&% Search on or before datePY&&&%% PZP[&% Search after dateP\&&&%% P]P^&% Search on or after dateP_&&&%% %P`&Pa&&&&;8%%%%%Pb % B C@ CN A  CN A&Pc &%Pd!Pe&&&&&&&&&Pf#Pg&Ph &PiPj&% Item 1Pk&&&%%PlPm&% Item 2k&&%%PnPo&% Item 3k&&%%%Pp&Pq&&&&if%%%%%Pr% A C@ B@ A  B@ A&Ps &%PtPu&% Select:&&&&&&&&%PvPw&% SystemPx&% textBackgroundColorPywPz& %  textColorP{% A C B A  B A&P| &%P}P~&% Select string:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP% B C@ CN A  CN A&P &%PP&&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP &P1& NSTabViewItemP&% item 1P&% Select%P&P&% item 2P&% SetP % ? ? C C  C C&P &P% A C@ B A  B A&P &%PP& %  Operation:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP% A C A A  A A&P &%PP&% Set:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP % B C CB A  CB A&P &%P!P&&&&&&&&&P#P&P &PP&% Intersect withP&&&%%PP& %  Union with&&%%PP&% Don't intersect withP&&&%%PP&% Non-overlapped union with&&%%PP&% Not in the union withP&&&%%%P&P&&&&%%%%%Q`%P&P&% 3P&% AutosetP % ? ? C C  C C&P± &bPñ% A C BP A  BP A&Pı &%PűPƱ&% Autoset:&&&&&&&&%PDZPȱ&% SystemPɱ&% textBackgroundColorPʱP˱& %  textColorh%P̱&Pͱ&% 4Pα&% Code setPϱ % ? ? C C  C C&Pб &Pѱ% A C@ B A  B A&Pұ &%PӱPԱ& %  Code set:&&&&&&&&%PձPֱ&% SystemPױ&% textBackgroundColorPرPٱ& %  textColorspx%%%Pڱ& %  ScrollView11P۱% A B C C  C C&Pܱ &#@#% A A A A Pݱ&% GormNSTableView6Pޱ&% TabView2P߱%% C A  C D@  C D@&P &P % ? ? C C@  C C@&P &PP% A C A A  A A&P &%PP&% +&&&&&&&&%P&P&&&&P% A C@ C A  C A&P &%PP&% Specific nodes:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP% A C@ B4 A  B4 A&P &%PP&% Nodes:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP% B0 C A A  A A&P &%PP&% -&&&&&&&&%P&P&&&&P% B C A A  A A&P &%PP&% --&&&&&&&&%P&P&&&&P% A Cq C A  C A&P &%P P &% Specific node values:&&&&&&&&%P P &% SystemP &% textBackgroundColorP P& %  textColorP% A A  A A  A A&P &%PP&% +&&&&&&&&%P&P&&&&P% B0 A  A A  A A&P &%PP&% -&&&&&&&&%P&P&&&&P% B A  A A  A A&P &%PP&% --&&&&&&&&%P &P!&&&& P" &P#&P$&% item 1P%&% Nodes%P&&P'&% item 2P(&% EdgesP) % ? ? C C@  C C@&P* &P+% B C A A  A A&P, &%P-P.&% --&&&&&&&&%P/&P0&&&&P1% B0 C A A  A A&P2 &%P3P4&% -&&&&&&&&%P5&P6&&&&P7% B A  A A  A A&P8 &%P9P:&% --&&&&&&&&%P;&P<&&&&P=% B0 A  A A  A A&P> &%P?P@&% -&&&&&&&&%PA&PB&&&&PC% A A  A A  A A&PD &%PEPF&% +&&&&&&&&%PG&PH&&&&'%߰%%PI&% GormNSTableView7PJ&% GormNSTableView8%PK& %  MenuItem60PLPM&% Item 2\&&%%PN& %  MenuItem61POPP&% Item 3\&&%%PQ& %  MenuItem62PRPS&% AllPT&&&%%PU&% GSCustomClassMapPV&PW&% MWExportWatcherPX1' GSNibItemW  &PY& %  MenuItem63PZP[&% VisibleT&&%%P\& %  MenuItem64P]P^&% Item 3T&&%%P_& %  MenuItem65(P`& %  MenuItem66+Pa& %  MenuItem67-Pb& %  MenuItem140Pc& %  MenuItem68/Pd& %  MenuItem69;Pe&% Button80Pf& %  TableColumn10Pg&% Button81+Ph& %  TableColumn11Pi&% Button82Pj&% ViewPk % @ @ C   C &Pl &Pm& %  TableColumn12Pn&% Button83Po& %  TableColumn13PpPq&% column2 Ch A GPPrPs&%  &&&&&&&&%PtPu&% SystemPv&% controlShadowColorPwPx&% ninex&&&&&&&&%Py&% Button84Pz& %  TableColumn14P{&% Button85P|& %  TableColumn15P}P~&% column2 Cu A GPPP&%  &&&&&&&&%PP&% SystemP&% controlShadowColor"PP&% seven&&&&&&&&%')P&% Button86P& %  TableColumn16YP&% Button871P& %  TableColumn17PP&% column2 C A GPPP&%  &&&&&&&&%PP&% SystemP&% controlShadowColor]PP&% seven&&&&&&&&%acP&% Button887P& %  TableColumn18P&% Button89=P& %  TableColumn19PP&% column2 C A GPPP&%  &&&&&&&&%P&&&&&&&&%P&% GormNSTableViewP& %  MenuItem70>P&% setMacroWatcherP'  &P& %  MenuItem71@P& %  MenuItem72BP& %  MenuItem73EP& %  MenuItem74KP& %  MenuItem75HP& %  MenuItem76NP& %  MenuItem77QP& %  MenuItem78TP&% dotGraphWatcherP'  &P& %  MenuItem79WP&% GormNSPopUpButton1P % C C} C* A  C* A&P &%P!P&&&&&&&&&P#P&P &PP& %  Tab separatedP&&&%%PP&% Comma separated&&%%PP& %  \n separated&&%%PP& %  \r separatedP&&&%%PP&% XMLP&&&%%PP&% Other:P±&&&%%c%Pñ&Pı&&&&%%%%%Pű&% GormNSPopUpButton2PƱ % B B C A  C A&PDZ &%Pȱ!Pɱ&&&&&&&&&Pʱ#P˱&P̱ &PͱPα&% Item 1Pϱ&&&%%PбPѱ&% Item 2&&%%PұPӱ&% Item 3&&%%%PԱ&Pձ&&&&ʐ%%%%%Pֱ& %  TableColumn20Pױ&% Button90CPر&% GormNSPopUpButton3Pٱ % B C1 C A  C A&Pڱ &%P۱!Pܱ&&&&&&&&&Pݱ#Pޱ&P߱ &PP&% Item 1P&&&%%PP&% Item 2&&%%PP&% Item 3&&%%%P&P&&&&ݐ%%%%%P& %  TableColumn21PP&% column2 C A GPPP&%  &&&&&&&&%PP&% SystemP&% controlShadowColorPP&% seven&&&&&&&&%P&% Button91P% C B C A  C A&P &%PP&%Include column titlesg&&&&&&&&%P&P&k&&&P&% GormNSPopUpButton4P % B B Cf A  Cf A&P &%P!P&&&&&&&&&P#P&P &PP&% mm/dd/yyP&&&%%PP& %  mm/dd/yyyy&&%%PP& %  mm-dd-yyyy&&%%P P & %  dd/mm/yyyyP &&&%%P P &% dd/mm/yyP&&&%%PP&% month dd, yyyyP&&&%%PP&% dd month, yyyyP&&&%%PP&% hh:mmP&&&%%PP& %  hh:mm AM/PMP&&&%%PP&% hh:mm:ssP&&&%% PP&% hh:mm:ss AM/PMP &&&%% P!P"&% 24hh:mmP#&&&%% P$P%& %  24hh:mm:ssP&&&&%% P'P(&% OtherP)&&&%%c%P*&P+&&&&%%%%%P,& %  TableColumn22*P-& %  TableColumn23P.P/&% column2 C A GPP0P1&%  &&&&&&&&%1P2&&&&&&&&%68P3&% GormNSPopUpButton5P4 % A C C= A  C= A&P5 &%P6!P7&&&&&&&&&P8#P9&P: &y%P;&P<&&&&y8%%%%%P=&% GormNSPopUpButton6P> % A A  C A  C A&P? &%P@!PA&&&&&&&&&PB#PC&PD &=f%PE&PF&&&&B%%%%%PG&% GormNSPopUpButton7PH % B B4 C0 A  C0 A&PI &%PJ!PK&&&&&&&&&PL#PM&PN &FJPUM%PO&PP&&&&FL%%%%%PQ&% GormNSPopUpButton8PR % B B0 B A  B A&PS &%PT!PU&&&&&&&&&PV#PW&PX &PYPZ&% Item 1P[&&&%%P\P]&% Item 2[&&%%P^P_&% Item 3[&&%%%P`&Pa&&&&YV%%%%%Pb&% GormNSPopUpButton9Pc % B B B A  B A&Pd &%Pe!Pf&&&&&&&&&Pg#Ph&Pi &%Pj&Pk&&&&g%%%%%Pl& %  MenuItem80ZPm& %  MenuItem81]Pn& %  MenuItem82Po& %  MenuItem83Pp& %  MenuItem84Pq& %  MenuItem85Pr& %  MenuItem86Ps&% Button1Pt% A Cڀ B A  B A& Pu &%PvPw&% <&&&&&&&&%Px&Py&&&&Pz& %  MenuItem87zP{&% Button2P|% B C܀ A A  A A& P} &%P~P&g&&&&&&&&%P&P&k&&&P& %  MenuItem88}P&% Button3P% B B C A  C A&P &%PP&% Floating point numbersg&&&&&&&&%P&P&k&&&P& %  MenuItem89P&% Button4P% B B0 C A  C A&P &%PP&% Regular expressiong&&&&&&&&%P&P&k&&&P&% Button5P% CZ A  B` A  B` A&P &%PP&% Ok&&&&&&&&%P&%  P&&&&P&% Button6P% C A  B` A  B` A&P &%PP&% Cancel&&&&&&&&%P&P&&&&P&% Button7P% C C C; A  C; A&P &%PP&% Use '\' to escape charactersg&&&&&&&&%P&P&k&&&P&% Button8P% C B B A  B A&P &%PP&% Tagsg&&&&&&&&%P&P&k&&&P&% Button9P% C B C A  C A&P &%PP&% Export to clipboardg&&&&&&&&%P&P&k&&&P& %  MenuItem90P& %  MenuItem91P&%NSOwnerP& %  myResultsP& %  MenuItem92P& %  MenuItem93P& %  MenuItem94P& %  MenuItem95P& %  MenuItem96P& %  MenuItem97P& %  MenuItem98P& %  MenuItem99P& %  TextView1mP±& %  TextView2Pñ& %  TextField10Pı% B B0 C{ A  C{ A&Pű &%PƱPDZ&&&&&&&&&%PȱPɱ&% SystemPʱ&% textBackgroundColorP˱P̱& %  textColorPͱ& %  TextField11Pα% A B B A  B A&Pϱ &%PбPѱ& %  Code sets:&&&&&&&&%PұPӱ&% SystemPԱ&% textBackgroundColorPձPֱ& %  textColorPױ& %  TextField12Pر% A C3 B A  B A&Pٱ &%PڱP۱& %  Code to add:&&&&&&&&%PܱPݱ&% SystemPޱ&% textBackgroundColorP߱P& %  textColorP& %  TextField13P% A C3 BP A  BP A&P &%PP&% Name:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  TextField14P% A C BT A  BT A&P &%PP&% Color:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  TextField15P% A B B A  B A&P &%PP& %  Definition:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  TextField16P% B C0 C A  C A&P &%PP&&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP & %  TextField17P % A Cs B A  B A&P &%P P &% Comment:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  TextField18P% A B< C1 A  C1 A&P &%PP&% Number of levels to remove:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP& %  TextField19P% C@ B0 B` A  B` A&P &%P P!&&&&&&&&&%P"P#&% SystemP$&% textBackgroundColorP%#P&& %  textColorP'& %  TableColumnP(&% Box1P)1(NSBox% C] C; C @  C @&P* &kP+P,&% Box&&&&&&&& %%P-& %  ScrollViewP.%  D C"  D C"&P/ &P0 % A @ D C A  D C&P1 &P2% A  D C  D C&P3 &P4P5&% SystemP6&% textBackgroundColor  K KP75P8& %  textColor D K4P9% @ @ A C  A C&P: &%P;P<&&&&&&&&&&.0% A A A A 9P=&% Box3P>(% C C C B  C B&P? &P@ %  C B  C B&PA &PB% B8 B A  B A&PC &%PDPE& %  Add group:&&&&&&&&%PFPG&% SystemPH&% textBackgroundColorPIGPJ& %  textColorPK% B A C2 A  C2 A&PL &%PMPN&% For codes, compare to level:&&&&&&&&%POPP&% SystemPQ&% textBackgroundColorPRPPS& %  textColorPT% B  Cn A  Cn A&PU &%PVPW&$% $(code level = 0 compares all levels)&&&&&&&&%PXPY&% SystemPZ&% textBackgroundColorP[YP\& %  textColorP]% C A B` A  B` A&P^ &%P_P`&&&&&&&&&%PaPb&% SystemPc&% textBackgroundColorPdbPe& %  textColorRPf% C B0 A A  A A&Pg &%PhPi&% +&&&&&&&&%Pj&Pk&&&&Pl % CH B0 B A  B A&Pm &%Pn!Po&&&&&&&&&Pp#Pq&Pr &-$;>B%Ps&Pt&&&&-p%%%%%PuPv&% Title&&&&&&&& %%Pw&% TextView2Px&% Box4Py(% C C C C   C C &Pz &P{ %  C C   C C &P| &  P}% A B B A  B A&P~ &%PP&% Show:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorcP % CL B B A  B A&P &%P!P&&&&&&&&&P#P&P & %P&P&&&& %%%%%P% B B C2 A  C2 A&P &%PP&% For codes, compare to level:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP% C B B` A  B` A&P &%PP&&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP% B BH Co A  Co A&P &%PP&$% $(code level = 0 compares all levels)&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP% B B A  B A&P &%PP& %  Field type:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP % B B B A  B A&P &%P!P&&&&&&&&&P#P&P &&%P&P&&&&%%%%%P% B A Co A  Co A&P &%PP&"% "Count duplicates in summary columng&&&&&&&&%P&P&k&&&P±% B  C[ A  C[ A&Pñ &%PıPű&% Count blank linesg&&&&&&&&%PƱ&PDZ&k&&&Pȱv&&&&&&&& %%Pɱ&% summaryWatcherPʱ'  &P˱& %  TextField20P̱% A B B A  B A&Pͱ &%PαPϱ&% New root code:&&&&&&&&%PбPѱ&% SystemPұ&% textBackgroundColorPӱPԱ& %  textColorPձ& %  TextField21Pֱ% B BP B A  B A&Pױ &%PرPٱ&% Color:&&&&&&&&%PڱP۱&% SystemPܱ&% textBackgroundColorPݱPޱ& %  textColorP߱& %  TextField22P% B B Cy A  Cy A&P &%PP&&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP&% Button10P% C C& C A  C A&P &%PP&% Selected records onlyg&&&&&&&&%P&P&k&&&P& %  TextField23P% A B B A  B A&P &%PP& %  Code level:&&&&&&&&%PP&% SystemP&% textBackgroundColorPP& %  textColorP&% Button11P% C A  B` A  B` A&P &%PP&%Export&&&&&&&&%P&P &&&&P & %  TextField24P % A B0 C A  C A&P  &%P P &*% *(Code level = 0; means use the whole code)&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP &% Button12P % C A  B` A  B` A&P &%P P &% Exit&&&&&&&&%P &P &&&&P & %  TextField25P % B B B` A  B` A&P  &%P P &&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP &% Button13P % C A  B` A  B` A&P  &%P P &% Close&&&&&&&&%P !&P "&&&&P #& %  TextField26P $% A B B A  B A&P % &%P &P '& %  Date format:&&&&&&&&%P (P )&% SystemP *&% textBackgroundColorP + )P ,& %  textColorP -&% Button14P .% C{ A  B` A  B` A&P / &%P 0P 1&% Ok&&&&&&&&%P 2&P 3&&&&P 4&% BoxP 5(% CZ Cv C @  C @&P 6 &P 7 % @ @ C   C &P 8 &P 9P :&% Box&&&&&&&& %%P ;& %  TextField27P <% B B< B` A  B` A&P = &%P >P ?&% Other:&&&&&&&&%P @P A&% SystemP B&% textBackgroundColorP C AP D& %  textColorP E&% Button15P F% B B0 B` A  B` A&P G &%P HP I&% Exactg&&&&&&&&%P J&P K&k&&&P L& %  TextField28P M% B B0 Cf A  Cf A&P N &%P OP P&&&&&&&&&%P QP R&% SystemP S&% textBackgroundColorP T RP U& %  textColorP V&% Button16P W% A A  B A  B A&P X &%P YP Z& %  Select set&&&&&&&&%P [&P \&&&&P ]& %  TextField29P ^% A C̀ CE A  CE A&P _ &%P `P a&&&&&&&&&%P bP c&% SystemP d&% textBackgroundColorP e cP f& %  textColorP g&% Button17P h% B A  B A  B A&P i &%P jP k& %  Remove set&&&&&&&&%P l&P m&&&&P n&% Button18P o% C) A  B A  B A&P p &%P qP r&% Add set to selection&&&&&&&&%P s&P t&&&&P u&% Button19P v% C A  B` A  B` A&P w &%P xP y&% Exit&&&&&&&&%P z&P {&&&&P |& %  SplitViewP }1) NSSplitView% A A  D C  D C&P ~ &. P P &% common_Dimple.tiff(P )P &% controlShadowColor%AP &% MWResultToolbarDelegateP '   &P & %  TextField1P % CZ C_ B A  B A&P &%P P &% Between columns:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  TextField2P % C C܀ C A  C A&P &%P P &% Title&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  TextField3P % A B B A  B A&P &%P P &% Select string:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  TextField4P % B B Cr A  Cr A&P &%P P &&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  TextField5P % CZ CE B A  B A&P &%P P & %  Between rows:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  TextField6P % C C\ C A  C A&P &%P P &&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP &% GormNSPopUpButtonP ± % B B C A  C A&P ñ &%P ı!P ű&&&&&&&&&P Ʊ#P DZ&P ȱ &  P ɱP ʱ&% Search case insensitiveP ˱&&&%%P ̱P ͱ&% Search case sensitive &&%%P αP ϱ&% Search exact string &&%% P бP ѱ&% Search field = valueP ұ&&&%%P ӱP Ա&% Search field > valueP ձ&&&%%P ֱP ױ&% Search field >= valueP ر&&&%%P ٱP ڱ&% Search field < valueP ۱&&&%%P ܱP ݱ&% Search field <= valueP ޱ&&&%%P ߱P &% Search for dateP &&&%%P P &% Search before dateP &&&%% P P &% Search on or before dateP &&&%% P P &% Search after dateP &&&%% P P &% Search on or after dateP &&&%% %P &P &&&& Ɛ%%%%%P & %  TextField7P % C CB C A  C A&P &%P P &&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  TextField30BP & %  TextField8P % CQ C} B A  B A&P &%P P &% Export format:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  GormNSPanelP 1*NSPanel1+NSWindow%  C C,&% BL DP  %  C C,  C C,&P  & P P &% SystemP &% windowBackgroundColorP &% WindowP &% select  A A F@ F@%P P &%NSApplicationIconP & %  TextField31KP & %  TextField9P % A B< B A  B A&P  &%P P &% Code set name:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  TextField32TP & %  TextField33]P &% Button20P % C A  B` A  B` A&P  &%P P !&% Cancel&&&&&&&&%P "&P #&&&&P $& %  TextField34}P %&% Button21P &% C @ B` A  B` A&P ' &%P (P )&% Ok&&&&&&&&%P *&P +&&&&P ,& %  TextField35P -&% Button22P .% C C C A  C A&P / &%P 0P 1&% Use inherited colorg&&&&&&&&%P 2&P 3&k&&&P 4& %  TextField36P 5&% Button23P 6% C A  B` A  B` A&P 7 &%P 8P 9&% Ok&&&&&&&&%P :&P ;&&&&P <& %  TextField37P =&% Button24P >% C A  B` A  B` A&P ? &%P @P A&% Cancel&&&&&&&&%P B&P C&&&&P D& %  TextField38P E&% Button25P F% C~ A  B` A  B` A&P G &%P HP I&% Ok&&&&&&&&%P J&P K&&&&P L& %  TextField39P M% A B< B A  B A&P N &%P OP P& %  Set name:&&&&&&&&%P QP R&% SystemP S&% textBackgroundColorP T RP U& %  textColorP V&% Button26P W% C A  B` A  B` A&P X &%P YP Z&% Ok&&&&&&&&%P [&P \&&&&P ]&% Button27P ^% C@ A  B` A  B` A&P _ &%P `P a&% Cancel&&&&&&&&%P b&P c&&&&P d&% Button28P e% C) BP B A  B A&P f &%P gP h&% Use inherited colorg&&&&&&&&%P i&P j&k&&&P k&% Button29P l% C A  B` A  B` A&P m &%P nP o&% Cancel&&&&&&&&%P p&P q&&&&P r& %  MenuItem10 P s& %  MenuItem1 P t& %  MenuItem11 P u& %  MenuItem2 P v& %  MenuItem12 P w& %  MenuItem3 P x& %  MenuItem13P y& %  MenuItem4 P z& %  MenuItem14P {& %  MenuItem5 P |& %  MenuItem15P }& %  MenuItem6 P ~& %  MenuItem16P & %  MenuItem7 P & %  MenuItem17P & %  MenuItem8 P & %  TextField40P % B B0 Cw A  Cw A&P &%P P &&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  MenuItem18P & %  MenuItem9 P & %  TextField41P % A B< B A  B A&P &%P P &% Visible records:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  MenuItem19P & %  TextField42P % AP C B@ A  B@ A&P &%P P &% Name:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  TextField43P % B C C9 A  C9 A&P &%P P &&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP &% Button30P % Cs A  B` A  B` A&P &%P P &% Ok&&&&&&&&%P &P &&&&P & %  TextField44P % AP B B A  B A&P &%P P & %  Start with:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP &% Button31P % Cq A  B` A  B` A&P &%P P ±&% Cancel&&&&&&&&%P ñ&P ı&&&&P ű& %  TextField45rP Ʊ&% Button32P DZ% C4 A  B` A  B` A&P ȱ &%P ɱP ʱ&% Ok&&&&&&&&%P ˱&P ̱&&&&P ͱ& %  TextField46{P α&% Button33P ϱ% C A  B` A  B` A&P б &%P ѱP ұ&% Cancel&&&&&&&&%P ӱ&P Ա&&&&P ձ& %  TextField47P ֱ&% Button34P ױ% CS A  B` A  B` A&P ر &%P ٱP ڱ&% Ok&&&&&&&&%P ۱&P ܱ&&&&P ݱ& %  TextField48P ޱ&% Button35P ߱% B0 B  A A  A A&P &%P P &% --&&&&&&&&%P &P &&&&P & %  TextField49P &% Button36P % B B  A A  A A&P &%P P &% ^&&&&&&&&%P &P &&&&P &% Button37P % B B  A A  A A&P &%P P &% v&&&&&&&&%P &P &&&&P &% Button38P % CT C̀ B A  B A&P &%P P & %  Project wideg&&&&&&&&%P &P &k&&&P &% Button39P % A B  A A  A A&P &%P P &% -&&&&&&&&%P &P &&&&P & %  TextFieldP % B C܀ B A  B A& P  &%P P &% Title&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP & %  GormNSPanel10P *%  D! C&%  DP  %  D! C  D! C&P  & ^4 P % C C A A  A A&P  &%P P &% --&&&&&&&&%P &P &&&&P % Cn C A A  A A&P  &%P P &% -&&&&&&&&%P &P &&&&P % CL C A A  A A&P  &%P P &% +&&&&&&&&%P &P !&&&&P "% C B  C A  C A&P # &%P $P %&% Convert sort to groups&&&&&&&&%P &&P '&&&&>P (% D@ A  B` A  B` A&P ) &%P *P +&% Exit&&&&&&&&%P ,&P -&&&&P .% D A  B` A  B` A&P / &%P 0P 1&% Run&&&&&&&&%P 2&P 3&&&&P 4% C A  B A  B A&P 5 &%P 6P 7& %  Reset fields&&&&&&&&%P 8&P 9&&&&>yP :P ;&% SystemP <&% windowBackgroundColorP =&% WindowP >& %  Data summary > ? A F@ F@% P ?& %  GormNSPanel11P @*%  C B&% C D P A %  C B  C B&P B & M ?xP CP D&% SystemP E&% windowBackgroundColorP F&% WindowP G& %  Named set G ? A F@ F@% P H& %  GormNSPanel12P I*%  C B&% P D P J %  C B  C B&P K & HP L % C B4 C9 A  C9 A&P M &%P N!P O&&&&&&&&&P P#P Q&P R &ZLO%P S&P T&&&&Z P%%%%% C FP U&% Panel U ? A F@ F@% P V& %  GormNSPanel13P W*%  D0 C& % B, DP X %  D0 C  D0 C&P Y & P Z % AP C C1 A  C1 A&P [ &%P \!P ]&&&&&&&&&P ^#P _&P ` &P aP b&% Item 1P c&&&%%P dP e&% Item 2 c&&%%P fP g&% Item 3 c&&%%%P h&P i&&&& a ^%%%%% CJ9CMX P j % B B B A  B A&P k &%P l!P m&&&&&&&&&P n#P o&P p &RZ]%P q&P r&&&&R n%%%%%cq{P sP t&% SystemP u&% windowBackgroundColorP v&% WindowP w&% Autosets w ? A F@ F@% P x& %  GormNSPanel14P y*%  DD D &% C0 D P z %  DD D   DD D &P { &P |% B` C C A  C A&P } &%P ~P &% output&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP % A C B$ A  B$ A&P &%P P &% Name:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP % A C B A  B A&P &%P P &% Type:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP % A C BD A  BD A&P &%P P &% Levels:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorP % A C B@ A  B@ A&P &%P P &% Arrows:&&&&&&&&%P P &% SystemP &% textBackgroundColorP  P & %  textColorFP P &% windowBackgroundColorP &% WindowP &%Graphviz  ? A F@ F@% P &% MenuItem P & %  GormNSPanel1P *%  C C&% B DP %  C C  C C&P &@  5)P P &% SystemP &% windowBackgroundColorP &% WindowP &% Panel  A A F@ F@% P & %  MenuItem20P & %  GormNSPanel2P *%  C B&% C? DP %  C B  C B&P &   .P P &% SystemP &% windowBackgroundColorP &% WindowP & %  Code set name  ? A F@ F@% P & %  MenuItem21P ±& %  GormNSPanel3P ñ*%  C B&% C DP ı %  C B  C B&P ű & F W h o vP ƱP DZ&% SystemP ȱ&% windowBackgroundColorP ɱ&% WindowP ʱ&% Select code set  ? A F@ F@% P ˱& %  MenuItem22 P ̱&% TabViewP ͱ%% A B C Cb  C Cb&P α &P ϱ % ? ? C CO  C CO&P б & &P ѱ &P ұ&P ӱ&% item 1P Ա&% Existing codes ϐ% P ձ&P ֱ&% item 2P ױ& %  New codesP ر % ? ? C CO  C CO&P ٱ & .װi 6% Ͱ%%P ڱ& %  GormNSPanel4P ۱*%  C C&% CJ DP ܱ %  C C  C C&P ݱ & P ޱP ߱&% SystemP &% windowBackgroundColorP &% WindowP &% Add code/Recode  ? A F@ F@% P & %  MenuItem23P & %  GormNSPanel5P *%  C C&% Cd DP %  C C  C C&P & } > FP P &% SystemP &% windowBackgroundColorP &% WindowP &% Comment  ? A F@ F@% P & %  MenuItem24 P & %  GormNSPanel6P *%  C B&% C DP %  C B  C B&P & W ^P P &% SystemP &% windowBackgroundColorP &% WindowP &% Delete root codes  ? A F@ F@% P & %  MenuItem25P & %  GormNSPanel7P *%  C C &% C DP %  C C   C C &P & e l P P &% SystemP &% windowBackgroundColorP &% WindowP &% Panel  ? A F@ F@% P & %  MenuItem26P & %  GormNSPanel8P *%  C C&% C DP  %  C C  C C&P  &   P P &% SystemP &% windowBackgroundColorP &% WindowP & %  Code level  ? A F@ F@% P & %  MenuItem27P & %  GormNSPanel9P *%  C B& % C CP  %  C B  C B&P  & $ < M P P &% SystemP &% windowBackgroundColorP &% WindowP &% Panel  ? A F@ F@% P & %  MenuItem100P & %  TextField50P & %  MenuItem28$P & %  MenuItem101P & %  TextField51P & %  MenuItem29P & %  MenuItem102P & %  TextField52 |P & %  MenuItem103P & %  TextField53 P &% Button40 P & %  MenuItem104P !& %  TextField54 P "&% Button41 P #& %  MenuItem105P $& %  TextField55 P %&% Button42 P && %  MenuItem106P '& %  TextField56 P (&% Button43 "P )& %  MenuItem107P *&% TableCornerView@P +& %  TextField57P ,&% Button44fP -& %  MenuItem108P .& %  TextField58P /&% Button45P 0& %  MenuItem109P 1& %  TextField59P 2&% Button46P 3&% Button47 (P 4&% Button48 .P 5&% Button49 4P 6& %  TableColumn1P 7P 8&% column2 B A GPP 9P :&%  &&&&&&&&%P ;P <&% SystemP =&% controlShadowColorP >P ?&% nine ?&&&&&&&&%"$P @& %  TableColumn2IP A& %  TableColumn3P BP C&% column2 BT A GPP DP E&%  &&&&&&&&%P F P G&% controlShadowColorMP HP I&% three I&&&&&&&&%RTP J& %  TableColumn4P KP L&% column3 B A GPP MP N&&&&&&&&&% ;P OP P&% SystemP Q&% windowFrameTextColorP R ? ?&&&&&&&&%P S PP T&% textBackgroundColorP U PP V& %  textColorP W&% GormNSPopUpButton10P X& %  TableColumn5P YP Z&% column4 B A GPP [ N&&&&&&&&% ; OP \ ? ?&&&&&&&&% S UP ]&% GormNSPopUpButton11P ^& %  TableColumn6P _P `&% column5 B A GPP a N&&&&&&&&% ; OP b ? ?&&&&&&&&% S UP c&% GormNSPopUpButton12lP d& %  TableColumn7P eP f&% column6 B A GPP g N&&&&&&&&% ; OP h ? ?&&&&&&&&% S UP i&% GormNSPopUpButton13 LP j& %  GormNSWindowP k+%  D C&% Cc DP l %  D C  D C&P m &  |t }P nP o&% SystemP p&% windowBackgroundColorP q&% WindowP r&% WindowP s&%Window A A F@ F@% P t& %  TableColumn8P uP v&% column7 B A GPP w N&&&&&&&&% ; OP x ? ?&&&&&&&&% S UP y&% GormNSPopUpButton14 ZP z& %  TableColumn9P {P |&% column8 B A GPP } N&&&&&&&&% ; OP ~ ? ?&&&&&&&&% S UP &% GormNSPopUpButton15 jP &% GormNSPopUpButton16!P &% GormNSPopUpButton174P &% GormNSPopUpButton18bP & %  MenuItem30P &% GormNSPopUpButton19P & %  MenuItem31!P & %  MenuItem32'P &P 1,NSNibConnector jP &%NSOwnerP ,- |P ,w |P , P , P , |P , |P ,' |P , 6 |P ,{P 1-NSNibOutletConnector P & %  theResultsP - wP &% thisCellP - P &% recCountP - P & %  limitFieldP - {P &% dirtySourceFlagP - jP &% _windowP - jP &% myWindowP - j P &% windowControllerP - j P &% delegateP - P & %  dataSourceP - P &% delegateP ,  P , P , P , P ,P ,P ,P ,P - P & %  selectFieldP - P & %  selectSheetP - P & %  selectMenuP - P & %  selectFloatP - P &% selectRegexFlagP 1.NSNibControlConnector P & %  doSelect:P . P & %  cancelSelect:P , P , sP , uP ±, wP ñ, yP ı, {P ű, }P Ʊ, P DZ, P ȱ, P ɱ, rP ʱ, tP ˱, vP ̱, P ͱ- P α& %  theDocumentP ϱ- jP б& %  mainWindowP ѱ,P ұ,s P ӱ.s P Ա& %  popSetStack:P ձ. P ֱ&% popFwdSetStack:P ױ, P ر,?P ٱ,ŐP ڱ, @P ۱, AP ܱ,P ݱ,P ޱ,P ߱,鐐P ,P , P , P , P , P ,P , P , P , xP , zP , |P , ~P , P , P ,W P -WP &% clipboardSwitchP -WP & %  tagSwitchP -WP & %  escapeSwitchP -WP &% selectedSwitchP -WP & %  formatMenuP -W P &% colDelimP -W P &% rowDelimP -W P &% thePaneP -W P &% theBossP -WP & %  fieldListP -W jP & %  theWindowP - WP & %  exportWatcherP -WP &% delegateP -WP & %  dataSourceP .WP & %  runExport:P . WP & %  exitExport:P , |P , J |P , X |P , ^ |P , d |P , t |P , z |P , P , P ,ÐP , P , -P . - P &% okSel2CodeSet:P .  P &% cancelSel2CodeSet:P - P &% sel2CodeSetNameP !- P "&% sel2CodeSetSheetP #, P $,͐P %,ŐP &, EP ', VP (, gP ), nP *, uP +- P ,& %  selCSSheetP -- EP .&% selCSExactSwitchP /- P 0& %  selCSMenuP 1. V P 2& %  selCSSelect:P 3. g P 4&% selCSSelectLess:P 5. n P 6&% selCSSelectMore:P 7. u P 8& %  selCSCancel:P 9, P :, ̐P ;, P <,אP =,ؐP >, %P ?,ᐐP @,됐P A,P B, -P C,P D,֐P E,hP F,P G, 5P H- P I& %  codePromptP J- P K& %  addCodeNameP L. % P M& %  doAddCodeOK:P N.  P O&% doAddCodeCancel:P P- P Q& %  addCodeWindowP R- P S& %  newCodeNameP T- P U& %  newCodeDefP V- P W& %  myColorWellP X- -P Y&% inheritedColorSwitchP Z. P [&% selectColorFromWell:P \. - P ]&% selectColorFromSwitch:P ^. 5 P _& %  doNewCode:P `, P a, P b,|P c,P d, =P e, EP f- P g& %  commentFieldP h- P i& %  commentSheetP j. E P k& %  okAddComment:P l. = P m&% cancelAddComment:P n, P o,P p,P q, VP r, ]P s- P t& %  delRootPaneP u- P v& %  delRootLevelsP w. V P x& %  okDelRoot:P y. ] P z&% cancelDelRoot:P {, P |, P }, P ~, P , d P , P , kP , P - P & %  addRootColorP - P & %  addRootNameP - dP &% addRootInheritedP - P & %  addRootPaneP ,  P ,P , P , P , P , ƐP - P &% codeLevelFieldP - P & %  codeLevelPaneP . P & %  okCodeLevel:P . P &% cancelCodeLevel:P , P , #P ,P , ;P , LP , ΐP , ֐P , P , P , P , ːP , 㐐P , 퐐P , P , P , P , P , P , P , P , P , P ,P ,אP ,fP ,hP , ]P ,3P , ސP , P , P , P , P ,  P , " P , % P , (P ,=P ,P ,

P,,wP-- P.& %  namedSelFieldP/- ?P0& %  namedSelSheetP1.> P2&% okNamedSelection:P3.w P4&% cancelNamedSelection:P5, H P6, P7,GP8, iP9,P:,ŐP;,EP<,IP=,LP>,OP?,TP@,YPA,KPB,NPC- GPD& %  setMathOpMenuPE- iPF&% setMathSetMenuPG- HPH& %  setMathSheetPI. PJ& %  okSetMath:PK. PL&% cancelSetMath:PM, V PN, PO, PP,PQ,PR,PS, yPT, PU,PV,BPW,ؐPX,鐐PY,mPZ,oP[,IP\,8 P],B P^,L P_,WP`, Pa, Pb,bPc,QPd,YPe,\Pf,pPg,zPh, Pi, Pj, Pk, ŐPl, ͐Pm, ՐPn,Po,Pp,Pq,_Pr,`Ps,aPt,cPu,dPv,Pw,Px,Py,Pz,P{,P|,P},P~,P,P,lP,mP, ݐP, 吐P, P,PP,nP,oP,pP,qP,rP,_P,aP, P,gP, P,rP,P,oP,wP,zP,P,P, P.P& %  zeroEditor:P.P& %  saveMacro:P. P& %  loadMacro:P.P& %  deleteMacro:P.BP& %  runMacro:P.IP&% moveUp:P.BP& %  moveDown:P.8P& %  deleteStep:P.WP&% addAutoHistory:P.LP&% deleteAllSteps:P.zP& %  cancelMacro:P.P&% addSelectStep:P-P& %  dataSourceP- P&% nameViewP-P& %  macroViewP- yP& %  macroMenuP- P& %  startMenuP-bP& %  sortSwitchP-pP& %  globalScopeP-P& %  regexOptionP-P&% fpOptionP±- Pñ&% selectStringViewPı- Pű&% selectModeMenuPƱ- PDZ&% selectTypeMenuPȱ- Pɱ& %  columnMenuPʱ._P˱& %  addSetStep:P̱- Pͱ& %  setOpMenuPα-PPϱ& %  setObjectMenuPб.gPѱ&% addAutosetStep:Pұ-aPӱ&% localAutosetMenuPԱ-oPձ& %  codeSetExactPֱ-rPױ&% codeSetSelMenuPر-Pٱ& %  codeSetMenuPڱ- VP۱& %  macroSheetPܱ- VPݱ&% windowControllerPޱ- P߱&% autoSetWatcherP- P& %  myOverLordP.wP&% addCodeSetStep:P, x P,ސP,P,ꐐP,zP,|P,P,P,P,P,P,P, P, P, !P, $P, 'P,P,P,OP,P,P,P,P,ݐP,P,P,ȐP,eP,ِP,P, +P, .P,i P,P,n P, 1 P ,y P ,{ P , P ,P ,ΐP, P,P,P,EP,~P,됐P,IP,֐P,鐐P,㐐P,P,P,P,P,P,g P, P,̐P , P!,J P",, P#,- P$, P%, P&, P', P(, P), P*," P+,~ P,.~P-& %  _doScroll:P., * P/, P0, P1,琐P2,P3,P4,P5,P6,P7,P8,P9,P:,P;,P<,P=,P>, P?, P@, PA, PB, PC, #PD, &PE, )PF, -PG, 0PH,PI,ːPJ,PK, PL,:PM,tPN,PO,PP,ܐPQ,PR, PS,PT,"PU,)PV,0PW,4PX,?PY,IPZ,SP[,^P\,mP],wP^,SP_, P`,XPa,]Pb,^Pc,fPd,& Pe,nPf,vPg,Ph,Pi,Pj,bPk, Pl-Pm& %  arrowDirMenuPn-EPo& %  codeLevelPp-Pq& %  countSwitchPr-Ps&% codeLevelSwitchPt-Pu& %  fieldListPv-Pw& %  levelMenuPx-Py& %  lineTypeMenuPz- P{& %  nameFieldP|-P}& %  nBorderMenuP~-P& %  nGroupMenuP-P& %  nShapeMenuP-P$&% overrideSwitchP-P$& %  saveButtonP-P$& %  snShapeMenuP-P$& %  snStyleMenuP-P$& %  snVarMenuP-P$& %  snValMenuP-P$&% typeMenuP- xP$&% thePaneP- P$&% theBossP- P&% dotGraphWatcherP-P$& %  attribTableP-IP$&% edgeAttribTableP-P$&% fromMenuP-P$&% toMenuP-P$& %  ftDirMenuP-P$& %  ftStyleMenuP-JP$&% seTableP-P$& %  seVarMenuP-P$& %  seValMenuP-P$& %  seShapeMenuP-&P$& %  seStyleMenuP-P$& %  seDirMenuP-P$& %  dataSourceP-P$&% delegateP-IP-JP-P-P.P$&% cancel:P.P$& %  override:P.P$&% writeDotGraph:P.eP$& %  addAttrib:P.iP$& %  delAttrib:P.nP$& %  delAllAttrib:P±.Pñ$& %  seValHandler:Pı.yPű$&% snAdd:PƱ.{PDZ$&% snDel:Pȱ.Pɱ$& %  snDelAll:Pʱ.P˱$&% addEdgeAttrib:P̱.Pͱ$&% delEdgeAttrib:Pα.gPϱ$&% delAllEdgeAttrib:Pб.Pѱ.Pұ$&% seAdd:Pӱ.PԱ$&% seDel:Pձ.Pֱ$& %  seDelAll:Pױ-Pر$&% snTablePٱ, 4Pڱ,( P۱,j Pܱ,=Pݱ,xPޱ,P߱-WP$& %  headerSwitchP1/ GSMutableSet10 NSMutableSet11NSSet& @ X I k W  y   gtamsanalyzer.app-0.42/Source/myProject.bk0000555000175000017500000004345310162465511021112 0ustar brentbrent00000000000000// // myProject.m // TA2 hot // // Created by matthew on Sat Apr 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "MWFile.h" #import "myProject.h" #import "MyDocument.h" #import "tams.h" #import "utils.h" #import "myResults.h" //#import "ctReadChar.h" #import "tableBrowser.h" #import "prefBoss.h" #import "TAMSCharEngine.h" int menuStringComp(id first, id second, void *key) { return [first caseInsensitiveCompare: second]; } int aStringComp(id first, id second, void *key) { return [(NSString *) first compare: second]; } @implementation myProject - (NSString *)windowNibName { // Override returning the nib file name of the document // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. return @"myProject"; } - (NSData *)dataRepresentationOfType:(NSString *)aType { NSMutableArray *masterArray = [NSMutableArray array]; // Insert code here to write your document from the given data. You can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead. //make an array //add to it a version # [masterArray addObject: @"3"]; //add to it the search file list [masterArray addObject: openFiles]; //add to it the init file [masterArray addObject: [initFile path]]; //add to it the code dictionary [masterArray addObject: codeList]; //serialize it return [NSArchiver archivedDataWithRootObject: masterArray]; } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType { // Insert code here to read your document from the given data. You can also choose to override -loadFileWrapperRepresentation:ofType: or -readFromFile:ofType: instead. NSMutableArray * masterArray; masterArray = [NSUnarchiver unarchiveObjectWithData: data]; [openFiles addObjectsFromArray: [masterArray objectAtIndex: 1]]; initFile = [[MWFile alloc] initWithPath: [masterArray objectAtIndex: 2]]; [codeList addEntriesFromDictionary: [masterArray objectAtIndex: 3]]; return YES; } -(id) init { [super init]; //globals //multiFileFlag = 0; uniqueNumber = 0; openFiles = [[NSMutableArray alloc] init]; searchFiles = [[NSMutableArray alloc] init]; codeList = [[NSMutableDictionary alloc] init]; //locals return self; } - (void) shoveWindow { int row; row = [fileListView selectedRow]; if([(MWFile *)[openFiles objectAtIndex: row] open] == YES) { [[[openFiles objectAtIndex: row] filePointer] moveForward]; //[[openFiles objectAtIndex: row] moveForward]; } else { id myfile = [[NSDocumentController sharedDocumentController] openDocumentWithContentsOfFile:[[openFiles objectAtIndex: row] path] display:YES]; [[openFiles objectAtIndex: row] setOpenFile: myfile]; [myfile setMWFile: [openFiles objectAtIndex: row]]; [myfile setGWorkBench: self]; [myfile retain]; } } -(void) openMWFile: (MWFile *) who { id myfile = [[NSDocumentController sharedDocumentController] openDocumentWithContentsOfFile:[who path] display:YES]; [who setOpenFile: myfile]; [myfile setMWFile: who]; [myfile setGWorkBench: self]; [myfile retain]; } -(BOOL) mwFileExists: (MWFile *) who { FORALL(openFiles) { if(who == temp) return YES; } ENDFORALL; return NO; } - (void)windowControllerDidLoadNib:(NSWindowController *) aController { [codeListView setTarget: self]; [codeListView setDoubleAction: @selector(displaySelData)]; [fileListView setTarget: self]; [fileListView setDoubleAction: @selector(shoveWindow)]; } - (void)windowDidLoad { } - (id)initWithWindowNibName:(NSString *)windowNibName { [super init]; //globals //multiFileFlag = 0; //gSearchList = [[NSMutableArray alloc] init]; openFiles = [[NSMutableArray alloc] init]; searchFiles = [[NSMutableArray alloc] init]; //locals return self; } -(int) emptyF{ return emptyF;} -(int) exactF {return exactF;} -(int) rawF {return rawF;} -(int) simpleF {return simpleF;} -(MWFile *) getMWFile { int row; row = [fileListView selectedRow]; return [openFiles objectAtIndex: row]; } -(MWFile *) searchFileName { int row; row = [searchListView selectedRow]; return [searchFiles objectAtIndex: row]; } /* -(void) registerWindow: (MyDocument *) who { [openFiles addObject: who]; [fileListView reloadData]; } */ - (void) unregisterWindow: (MyDocument *) who { #ifdef TAVER1 [searchFiles removeObject: who]; [openFiles removeObject: who]; if(who == codeSource) { gCentralCodeFile = codeSource = nil; [codeSourceView setStringValue: @""]; [codeSourceBox setState: NSOffState]; /* ideally this too, but could be too slow... FORALL(openFiles) { [temp updateCodeWindow]; } ENDFORALL; */ //the alternative FORALL(openFiles) { [temp zapCodeWindow]; } ENDFORALL; } [fileListView reloadData]; [searchListView reloadData]; #endif FORALL(openFiles) { if(who == [temp filePointer]) { [temp setPath: [who fileName]]; [temp setOpenFile: nil]; } } ENDFORALL; } //may need to change - (BOOL) isInitFile: (MWFile *) who { if(who == initFile) return YES; else return NO; } -(NSString *) uniqueString; { return [NSString stringWithFormat: @"TAMSSTRING %d", uniqueNumber++]; } - (NSMutableArray *) fileList { return openFiles; } - (NSMutableArray *) searchList { return searchFiles; } - (void) newCode: (NSString *) what definition: (NSString *) info { NSMutableDictionary *myEntry; NSMutableString *myDef = [[NSMutableString alloc] init]; myEntry = [codeList objectForKey: what]; if(myEntry) { [myDef setString: [myEntry objectForKey: @"definition"]]; [myDef appendString: @" "]; [myDef appendString: info]; [myEntry setObject: myDef forKey: what]; } else { myEntry = [[NSMutableDictionary alloc] init]; [myDef setString: info]; [myEntry setObject: myDef forKey: @"definition"]; [myEntry setObject: @"YES" forKey: @"active"]; [codeList setObject: myEntry forKey: what]; } /* #ifdef TAVER1 NSMutableString *s = [[NSMutableString alloc] init]; if(!gCentralCodeFile) return; //make a proper code out of it [s appendString: @"{"]; [s appendString: what]; [s appendString: @"}"]; if([gPrefBoss dateTimeValue]) { [s appendString: [[NSDate date] description]]; if(info) if([info length]) [s appendString: @": "]; } if(info) [s appendString: info]; [s appendString: @"{/"]; [s appendString: what]; [s appendString: @"}"]; [s ADDCHAR('\n')]; //send it to the current [gCentralCodeFile appendString: s]; //update the masses [gCentralCodeFile refreshCodeList: self]; FORALL(openFiles) { [temp updateCodeWindow]; } ENDFORALL; #endif */ } /* - (IBAction)centralCode:(id)sender { if([sender state] == NSOffState) { gCentralCodeFile = nil; } else { if(codeSource) gCentralCodeFile = codeSource; else [sender setState: NSOffState]; } } */ - (IBAction)clearSearch:(id)sender { [searchStringView setStringValue: @""]; } - (IBAction)doAdd:(id)sender { //don't add the init file if([self isInitFile: [self getMWFile]] == YES) return; [searchFiles addObject: [self getMWFile]]; [searchListView reloadData]; } - (IBAction)doAddAll:(id)sender { [self doRemoveAll: self]; [searchFiles addObjectsFromArray: openFiles]; if(initFile) { [searchFiles removeObject: initFile]; } #ifdef TAVER1 if(gCentralCodeFile) { [searchFiles removeObject: gCentralCodeFile]; } #endif [searchListView reloadData]; } - (IBAction)doRefresh:(id)sender { } - (IBAction)doRemove:(id)sender { [searchFiles removeObject: [self searchFileName]]; [searchListView reloadData]; } - (IBAction)doRemoveAll:(id)sender { [searchFiles removeAllObjects]; [searchListView reloadData]; } - (IBAction) setInitFile: (id) sender { MWFile *who; who = [self getMWFile]; if (initFile == who) { [initFileName setStringValue: @""]; initFile = nil; } else { initFile = who; [initFileName setStringValue: [who name]]; [searchFiles removeObject: who]; [searchListView reloadData]; } } -(NSMutableString *) getDefinition: (NSString *) what { NSMutableDictionary *myWord; myWord = [codeList objectForKey: what]; if(myWord) return [myWord objectForKey: @"definition"]; else return [NSMutableString string]; #ifdef TAVER1 ctQChar *q; NSMutableString *ss; int inZoneFlag; TAMSCharEngine *tce = [[TAMSCharEngine alloc] initWithFileAndStart: gCentralCodeFile]; if(!gCentralCodeFile) return nil; q = [[ctQChar alloc] init]; [q retain]; //gCurrentDataSource = gCentralCodeFile; //clearSearchList(); //addFileToSearchList(gCentralCodeFile); //startSearch(); inZoneFlag = 0; ss = [[NSMutableString alloc] init]; while([tce readnext: q] != EOF) { if([q tokentype] == TOKEN) { if([[q buff] isEqualToString: what] == YES) { inZoneFlag = 1; } } if([q tokentype] == CHAR && inZoneFlag) { [ss appendString: [q buff]]; } if([q tokentype] == ENDTOKEN) { if([[q buff] isEqualToString: what] == YES) { inZoneFlag = 0; [ss ADDCHAR('\n')]; } } } [ss autorelease]; [tce release]; return ss; #endif } -(IBAction) generateCount: (id) Sender { NSMutableArray *hc; NSMutableArray *sl; tableBrowser *mt; TAMSCharEngine *tce; #ifdef TAVER1 if(!gCentralCodeFile) { NSWARNING(@"You need to establish a central code file."); return; } #endif sl = [[NSMutableArray alloc] init]; // [gCentralCodeFile refreshCodeList: nil]; // gCurrentDataSource = self; hc = [NSMutableArray arrayWithArray: [self hotCodeList]]; //is there anyone to search? if(initFile) [sl addObject: initFile]; [sl addObjectsFromArray: searchFiles]; if([sl count] == 0) return; tce = [[TAMSCharEngine alloc] initWithArrayAndStart: searchFiles]; //make me the current data source mt = [[tableBrowser alloc] init]; [mt setCharEngine: tce]; [mt setHotCodeList: hc]; [mt setDataType: @"count"]; [NSBundle loadNibNamed: @"FreqCount" owner: mt]; [mt windowControllerDidLoadNib: nil]; [[mt window] makeKeyAndOrderFront: self]; } -(IBAction) generateCrossReference: (id) Sender { NSMutableArray *hc; tableBrowser *mt; NSMutableArray *sl; TAMSCharEngine *tce; sl = [[NSMutableArray alloc] init]; // gCurrentDataSource = self; hc = [NSMutableArray arrayWithArray: [self hotCodeList]]; //is there anyone to search? if(initFile) [sl addObject: initFile]; [sl addObjectsFromArray: searchFiles]; if([sl count] == 0) return; //make me the current data source tce = [[TAMSCharEngine alloc] initWithArrayAndStart: sl]; [tce setGCurrentDataSource: self]; mt = [[tableBrowser alloc] init]; [mt setCharEngine: tce]; [mt setHotCodeList: hc]; [mt setDataType: @"xref"]; [NSBundle loadNibNamed: @"FreqCount" owner: mt]; [mt windowControllerDidLoadNib: nil]; [[mt window] makeKeyAndOrderFront: self]; } - (IBAction)doSearch:(id)sender { myResults *aa; NSDocumentController *who; NSMutableArray *sl; NSMutableString *myLimStr = [[NSMutableString alloc] init]; TAMSCharEngine *tce; sl = [[NSMutableArray alloc] init]; //set the flags if([rawButton state] == NSOnState) rawF = 1; else rawF = 0; if([exactButton state] == NSOnState) exactF = 1; else exactF = 0; if([emptyButton state] == NSOnState) emptyF = 1; else emptyF = 0; if([simpleButton state] == NSOnState) { int i,ln; int sflg; char c; sflg = 1; [myLimStr setString: [searchStringView stringValue]]; trimNSS(myLimStr); if([myLimStr isEqualToString: @""]) sflg = 1; else { ln = [myLimStr length]; for(i = 0; i < ln; i++) { c = [myLimStr characterAtIndex: i]; //if(c == '*' || c == '+' || c == ',') if( c == '+')// || c == ',') { sflg = 0; break; } } simpleF = sflg; if(simpleF) [simpleButton setState: NSOnState]; else [simpleButton setState: NSOffState]; } } else { simpleF = 0; [myLimStr setString: [searchStringView stringValue]]; trimNSS(myLimStr); if([myLimStr isEqualToString: @""]) simpleF = 1; if(simpleF) [simpleButton setState: NSOnState]; else [simpleButton setState: NSOffState]; } [myLimStr release]; //is there anyone to search? if(initFile) [sl addObject: initFile]; [sl addObjectsFromArray: searchFiles]; if([searchFiles count] == 0) { NSWARNING(@"Search list is empty"); return; } //make me the current data source tce = [[TAMSCharEngine alloc] initWithArrayAndStart: sl]; [tce setGCurrentDataSource: self]; //find the controller who = [NSDocumentController sharedDocumentController]; //make the window [who setShouldCreateUI: YES]; //ans = [[myResults alloc] init]; //[who addDocument: ans]; aa = [who openUntitledDocumentOfType: @"ViewType" display: YES]; [aa setGWorkBench: self]; [aa setCharEngine: tce]; [aa executeTAMS]; [aa retain]; } - (BOOL) fileExists: (NSString *) who { FORALL(openFiles) { if([who isEqualToString: [temp path]]) return YES; } ENDFORALL; return NO; #ifdef TAVER1 if([openFiles indexOfObject: who] == NSNotFound) return NO; else return YES; #endif } - (IBAction)myAction:(id)sender { } -(void) back { [myWindow orderBack: self]; } -(void) front { [myWindow makeKeyAndOrderFront: self]; } #ifdef TAVER1 - (IBAction)setCodeSource:(id)sender { codeSource = gCentralCodeFile =[self fileName]; [codeSourceView setStringValue: [gCentralCodeFile getTitle]]; [codeSourceBox setState: NSOnState]; // [gCentralCodeFile remakeCodeList]; FORALL(openFiles) { [temp updateCodeWindow]; } ENDFORALL; } -(void) setCodeSourceWithName: (NSString *) name { int i, cnt; FORALL(openFiles) { if([name isEqualToString: [temp fileName]] == YES) { codeSource = gCentralCodeFile = temp; [codeSourceView setStringValue: [gCentralCodeFile getTitle]]; [codeSourceBox setState: NSOnState]; cnt = [openFiles count]; for(i = 0; i < cnt; i++) { [[openFiles objectAtIndex: i] updateCodeWindow]; } return; } } ENDFORALL; } #endif - (IBAction) setInitFileWithName: (NSString *) fname { FORALL(openFiles) { if([fname isEqualToString: [temp fileName]] == YES) { if(temp == initFile) { [initFileName setStringValue: @""]; initFile = nil; return; } initFile = temp; [initFileName setStringValue: [temp getTitle]]; [searchFiles removeObject: temp]; [searchListView reloadData]; return; } } ENDFORALL; } /* - (MyDocument *) codeSource { return codeSource; } */ -(NSString *) theLimitString { return [searchStringView stringValue]; } -(void) displaySelData { int row; NSMutableString *ss, *tt; ss = [[NSMutableString alloc] init]; tt = [[NSMutableString alloc] init]; [ss setString: [searchStringView stringValue]]; row = [codeListView selectedRow]; [tt setString: [[self hotCodeList] objectAtIndex: row]]; [ss appendString: tt]; [searchStringView setStringValue: ss]; } -(NSArray *) hotCodeList { NSMutableArray *hc; hc = [NSMutableArray arrayWithArray: [codeList allKeys]]; [hc sortUsingFunction: aStringComp context: nil]; [hc autorelease]; return hc; } -(NSArray *) getHotCodeList { NSMutableArray *hc; hc = [NSMutableArray arrayWithArray: [codeList allKeys]]; [hc sortUsingFunction: aStringComp context: nil]; [hc autorelease]; return hc; #ifdef TAVER1 if(gCentralCodeFile) { //[gCentralCodeFile setData]; //[self setData]; [gCentralCodeFile remakeCodeList]; return [gCentralCodeFile hotCodeList]; } else { return nil; } #endif } -(NSString *) theWindowName { return [windowNameView stringValue]; } - (void)windowWillClose:(NSNotification *)aNotification { /* need to do some serious workhere with notifying the other windows */ //gCentralCodeFile = nil; //gWorkBench = nil; } - (void)windowDidUpdate:(NSNotification *)aNotification { [fileListView reloadData]; [codeListView reloadData]; [searchListView reloadData]; [codeListView setTarget: self]; [codeListView setDoubleAction: @selector(displaySelData)]; [fileListView setTarget: self]; [fileListView setDoubleAction: @selector(shoveWindow)]; [[NSApplication sharedApplication] addWindowsItem: myWindow title: @"*Work Bench" filename: NO]; } -(NSString *) codersList { return [coderIDView stringValue]; } - (void) openPanelDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { NSArray *theFiles; int i, n; if(returnCode) { theFiles = [[NSOpenPanel openPanel] filenames]; n = [theFiles count]; for(i = 0; i < n; i++) { [openFiles addObject: [[MWFile alloc] initWithPath: [theFiles objectAtIndex: i]]]; } } } -(IBAction) addFileToProj: (id) Sender { [[NSOpenPanel openPanel] setAllowsMultipleSelection: YES]; [[NSOpenPanel openPanel] beginSheetForDirectory: nil file: nil types: [NSArray arrayWithObjects: @"txt", @"rtf", @"RTF", @"TXT", nil] modalForWindow: myWindow modalDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo: nil]; } @end gtamsanalyzer.app-0.42/Source/myProject.gorm/0000755000175000017500000000000010162465511021525 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/myProject.gorm/data.classes0000644000175000017500000001432011062075652024020 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:" ); Super = NSObject; }; fileListMgr = { Actions = ( ); Outlets = ( myProj ); Super = NSObject; }; globalCodeMgr = { Actions = ( ); Outlets = ( codeView, myProj ); Super = NSObject; }; myProject = { Actions = ( "loadAllCodes:", "loadCodeSet:", "loadAllFiles:", "loadFileSet:", "removeNSL:", "removeAllNSL:", "showCodeBrowser:", "doToggleReanalysisMode:", "addHotListToSearch:", "goFileMode:", "goResultMode:", "requestCodeDefinition:", "doFileShuffleUp:", "doFileShuffleDown:", "doSearchShuffleUp:", "doSearchShuffleDown:", "addFileToProj:", "openSelectedFile:", "newFileToProj:", "removeFileFromProj:", "okPrefPanel:", "cancelPrefPanel:", "setInitFile:", "clearSearch:", "doAdd:", "doAddAll:", "doRefresh:", "doRemove:", "doRemoveAll:", "doSearch:", "myAction:", "addNamedSL:", "okNamedSL:", "cancelNamedSL:", "okNamedSrch:", "cancelNamedSrch:", "addNamedSrch:", "delNamedSrch:", "delAllNamedSearch:", "doNamedSrch:", "codeSetAdd:", "codeSetDel:", "codeSetDelAll:", "codeSetSelAll:", "codeSetSelNone:", "codeSetClose:", "editCodeSet:", "codeSetSelMore:", "codeSetSelLess:", "codeSetSel:", "fileSetAdd:", "fileSetDel:", "fileSetDelAll:", "fileSetSelAll:", "fileSetSelNone:", "fileSetClose:", "editFileSet:", "fileSetSelMore:", "fileSetSelLess:", "fileSetSel:", "showFileSet:", "initializeSearchMode:", "newAction:", "showCodeSet:" ); Outlets = ( searchListMenu, searchListSheet, searchListNameField, emptyButton, exactButton, rawButton, simpleButton, sectionButton, searchTypeMenu, codeListView, codeSourceView, codeSourceBox, fileListView, codeFileName, myWindow, searchListView, searchStringView, windowNameView, coderIDView, coderIDPrompt, initFileName, projPrefPanel, absPathSwitch, fileCountView, pathModeView, fileListModeView, fileModeButton, resultModeButton, setName, setMenu, searchNameMenu, searchNameAdd, searchNameDelete, searchNameDeleteAll, searchNameSheet, searchNameSheetField, searchNameSheetOK, searchNameSheetCancel, codeSetName, codeSetPopMenu, codeSetPopMenu2, codeSetTable, codeSetPane, codeSetSelString, codeSetSelRegex, codeSetSelExact, codeCountView, searchCountView, fileSetName, fileSetPopMenu, fileSetPopMenu2, fileSetTable, fileSetPane, fileSetSelString, fileSetSelRegex, fileSetSelExact, closeButtonTarget ); Super = NSDocument; }; searchListMgr = { Actions = ( ); Outlets = ( myProj, mySource ); Super = NSObject; }; }gtamsanalyzer.app-0.42/Source/myProject.gorm/data.info0000644000175000017500000000027011062075652023315 0ustar brentbrent00000000000000GNUstep archive00002a96:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed Streamgtamsanalyzer.app-0.42/Source/myProject.gorm/objects.gorm0000644000175000017500000014534411062075652024062 0ustar brentbrent00000000000000GNUstep archive00002a96:0000002a:00000590:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&% GormNSPopUpButton701 NSPopUpButton1NSButton1 NSControl1 NSView1 NSResponder% C CJ B A  B A& 01 NSMutableArray1 NSArray&%01 NSPopUpButtonCell1NSMenuItemCell1 NSButtonCell1 NSActionCell1NSCell0&01NSFont%&&&&&&&&0 1NSMenu0 &0 &0 1 NSMenuItem0 &% Item 10&&&%01NSImage0& % common_Nibble%00&% Item 2&&%%00&% Item 3&&%%%0&0&&&& %%%%%0&% Button240% C C B` A  B` A&0 &%00&% Sel. -&&&&&&&&%0&0&&&&0& %  ScrollView101 NSScrollView% C B C C  C C&0 &0!1 NSClipView% A A B C  B C&0" &0#1 NSTableView%  B C!  B C!&0$ &%0%0&&&&&&&&&&0' &0(1 NSTableColumn0)&% column1 B A GP0*1NSTableHeaderCell1NSTextFieldCell0+&% Search0,% &&&&&&&&%0-1NSColor0.&%NSNamedColorSpace0/&%System00&%controlShadowColor01.02&% System03&% windowFrameTextColor0405&%huit5&&&&&&&&%06.207&% textBackgroundColor08.209& %  textColor0:.20;& %  gridColor0<.0=&% System0>&% controlBackgroundColor0?1NSTableHeaderView%  B A  B A&0@ &0A1GSTableCornerView% @ @ A A  A A&0B &%% A @ @@<0C1 NSScroller% @ A A C  A C&0D &%0E&&&&&&&&&&2 _doScroll:v12@0:4@8A0F% A @ B A  B A&0G &?0H.20I& %  controlColor!% A A A A CF0J&% GormNSPopUpButton80K% A C B A  B A& 0L &%0M 0N&&&&&&&&&0O0P&0Q &0R0S&% Item 10T&&&%%0U0V&% Item 2T&&%%0W0X&% Item 3T&&%%%0Y&0Z&&&&RO%%%%%0[&% Button250\% CM C B` A  B` A&0] &%0^0_&% Sel. all&&&&&&&&%0`&0a&&&&0b& %  ScrollView20c% B B C C  C C&0d &0e% A A B C  B C&0f &0g%  B C!  B C!&0h &%0i0j&&&&&&&&&0k &0l0m&% column1 B A GP0n0o&% Files,&&&&&&&&%-0p.0q&% System0r&% windowFrameTextColor0s55&&&&&&&&%0t.q0u&% textBackgroundColor0v.q0w& %  textColor0x.q0y& %  gridColor0z.0{&% System0|&% controlBackgroundColor0}%  B A  B A&0~ &0% @ @ A A  A A&0 &%% A @ @@0.q0&% controlBackgroundColor0% @ A A C  A C&0 &%0j&&&&&&&&&c0% A @ B A  B A&0 &}0.q0& %  controlColore% A A A A 0&% Button260% C C B A  B A&0 &%00& %  Sel. none&&&&&&&&%0&0&&&&0& %  ScrollView30% A B  C C  C C&0 &0% A A C C  C C&0 &0%  C C!  C C!&0 &%00&&&&&&&&&0 &00&% column1 C A GP00&% Codes,&&&&&&&&%-0.0&% System0&% windowFrameTextColor00&%neuf&&&&&&&&%0.0&% textBackgroundColor0.0& %  textColor0.0& %  gridColor0.0&% controlBackgroundColor0%  C A  C A&0 &0% @ @ A A  A A&0 &%% A @ @@0% @ A A C  A C&0 &%0&&&&&&&&&0% A @ C A  C A&0 &0.0& %  controlColor% A A A A 0&% Button270% C @ B` A  B` A&0 &%00&% Close&&&&&&&&%0&0&&&&0& %  ScrollView40% A B C C  C C&0 &0% A A C C  C C&0± &0ñ%  C C!  C C!&0ı &%0ű0Ʊ&&&&&&&&&0DZ &0ȱ0ɱ&% column1 C A GP0ʱ0˱&% Codes,&&&&&&&&%-0̱.0ͱ&% System0α&% windowFrameTextColor0ϱ&&&&&&&&%0б.0ѱ&% textBackgroundColor0ұ.0ӱ& %  textColor0Ա.0ձ& %  gridColor0ֱ.0ױ&% controlBackgroundColor0ر%  C A  C A&0ٱ &0ڱ% @ @ A A  A A&0۱ &%% A @ @@0ܱ% @ A A C  A C&0ݱ &%0ޱƐ&&&&&&&&&0߱% A @ C A  C A&0 &0.0& %  controlColor% A A A A 0&% Button280% A C B` A  B` A&0 &%00&% Select&&&&&&&&%0&0&&&&0&% Button290% B C B` A  B` A&0 &%00&% Sel. +&&&&&&&&%0&0&&&&0& %  MenuItem100&% new0&&&%%0&% Scroller0& %  MenuItem200&% open&&%%0& %  GormNSWindow01 NSWindow%  D C&% B D;@0 %  D C  D C&0 &**0% C Co C8 C  C8 C& 0 &0% A A C! C  C! C&P &P%  C% C!  C% C!&P &%PP&&&&&&&&&P &PP&% column1 C% A GPPP &% Codes,&&&&&&&&%-P .P &% SystemP &% windowFrameTextColorP 55&&&&&&&&%P. P&% textBackgroundColorP. P& %  textColorP. P& %  gridColorP.P&% SystemP&% controlBackgroundColorP%  C% A  C% A&P &P% @ @ A A  A A&P &%% A @ @@P. P&% controlBackgroundColorP% @ A A C  A C&P &%P&&&&&&&&&P % A @ C! A  C! A&P! &P". P#& %  controlColor% A A A A  cP$1! NSTextField% B C B A  B A& P% &%P&P'&&&&&&&&&%P(.P)&% SystemP*&% textBackgroundColorP+.)P,& %  textColorP-!% B C B A  B A& P. &%P/P0&&&&&&&&&%P1.P2&% SystemP3&% textBackgroundColorP4.2P5& %  textColorP6% C C B A  B A& P7 &%P8P9&% C.B.&&&&&&&&%P:&P;&&&&P<% C C B A  B A& P= &%P>P?&% Def.&&&&&&&&%P@&PA&&&&PB% Cl C B` A  B` A& PC &%PDPE&% Search&&&&&&&&%PF&PG&&&&PH% Cl C B` A  B` A& PI &%PJPK&% Clear&&&&&&&&%PL&PM&&&&PN% B CJ B A  B A& PO &%PP PQ&&&&&&&&&PRPS&PT &PUPV&% File&&%PWPX&%common_3DArrowDown%PYPZ&% removeP[&&&%%P\P]&% addP^&&&%%%P_&P`&&&&UR%%%%%Pa% B C B A  B A& Pb &%Pc Pd&&&&&&&&&PePf&Pg &PhPi&% SimplePj&&&%%PkPl& %  Non-simplej&&%%PmPn&% Sectionj&&%%PoPp&% StringPq&&&%%PrPs& %  Regex stringPt&&&%%%Pu&Pv&&&&he%%%%%Pw% B C B` A  B` A& Px &%PyPz&% RawP{P|1"NSMutableString&% common_SwitchOff&&&&&&&&%P}&P~&PP"&% common_SwitchOn&&&P% CC C B` A  B` A& P &%PP&% Exact{&&&&&&&&%P&P&&&&P% C C Bx A  Bx A& P &%PP&% Empty{&&&&&&&&%P&P&&&&P!% A C B A  B A& P &%PP&% Search:P% A`&&&&&&&&%P.P&% SystemP&% textBackgroundColorP.P& %  textColorP!% A C B A  B A& P &%PP& %  Coder IDs:&&&&&&&&%P.P&% SystemP&% textBackgroundColorP.P& %  textColorP% A B A A  A A&$P &%PP&% v&&&&&&&&%P&P&&&&P% C C A A  A A&!P &%PP&% ^&&&&&&&&%P&P&&&&P% A C A A  A A&$P &%PP&% ^&&&&&&&&%P&P&&&&P% C B A A  A A&!P &%PP&% v&&&&&&&&%P&P&&&&P% Cs C- B` A  B` A&P &%PP&% Init&&&&&&&&%P&P&&&&P% Cs C B` A  B` A&$P &%PP&% >&&&&&&&&%P±&Pñ&&&&Pı% Cs B B` A  B` A&$Pű &%PƱPDZ&% >>&&&&&&&&%Pȱ&Pɱ&&&&Pʱ% Cs B B` A  B` A&$P˱ &%P̱Pͱ&% <&&&&&&&&%Pα&Pϱ&&&&Pб% Cs B` B` A  B` A&$Pѱ &%PұPӱ&% <<&&&&&&&&%PԱ&Pձ&&&&Pֱ!% C Co A A  A A& Pױ &%PرPٱ&% 0&&&&&&&&%Pڱ.P۱&% SystemPܱ&% textBackgroundColorPݱ.Pޱ& %  textColorP߱!% C B A A  A A&$P &%PP&% 0&&&&&&&&%P.P&% SystemP&% textBackgroundColorP.P& %  textColorP!% A B A A  A A&$P &%PP&% 0&&&&&&&&%P.P&% SystemP&% textBackgroundColorP.P& %  textColorP!% B A  B A  B A&$P &%PP&&&&&&&&&%P.P&% SystemP&% textBackgroundColorP.P& %  textColorP!% C A@ B A  B A&$P &%PP&&&&&&&&&%P.P&% SystemP&% textBackgroundColorP.P& %  textColorP!% C A@ B A  B A&$P &%PP& %  File mode:&&&&&&&&%P.P&% SystemP &% textBackgroundColorP .P & %  textColorP !% B A@ B( A  B( A&$P &%PP&% Init:&&&&&&&&%P.P&% SystemP&% textBackgroundColorP.P& %  textColorP% C C C A  C A& P &%P P&&&&&&&&&PP&P &PP& %  Code setsP&&&%W%PP &% Manage code sets&&%%P!P"&% View all codes&&%%%P#&P$&&&&%%%%%P%% B Cc C A  C A& P& &%P' P(&&&&&&&&&P)P*&P+ &P,P-& %  File setsP.&&&%W%P/P0&% Manage file sets.&&%%P1P2&% View all data files.&&%%%P3&P4&&&&,)%%%%%P5% C CJ A A  A A& P6 &%P7P8&% +&&&&&&&&%P9&P:&&&&P;% D CJ A A  A A& P< &%P=P>&% --&&&&&&&&%P?&P@&&&&PA% C CJ A A  A A& PB &%PCPD&% -&&&&&&&&%PE&PF&&&&KPG% C C A A  A A& PH &%PIPJ&% +&&&&&&&&%PK&PL&&&&PM% C4 C A A  A A& PN &%POPP&% -&&&&&&&&%PQ&PR&&&&PS% CU C A A  A A& PT &%PUPV&% --&&&&&&&&%PW&PX&&&&PY.PZ&% SystemP[&% windowBackgroundColorP\&% WindowP]&% WindowP^&%Window A A F@ F@%P_P`&%NSApplicationIconPa& %  MenuItem3PbPc&% ItemPd&&&%PePf"&% common_2DCheckMarkPgPh"& %  common_2DDash%Pi& %  MenuItem4YPj&%NSOwnerPk& %  myProjectPl& %  MenuItem5\Pm& %  MenuItem6hPn& %  MenuItem7kPo& %  MenuItem8mPp& %  MenuItem9oPq&% Button30Pr% C C B` A  B` A&Ps &%PtPu&% Sel. -&&&&&&&&%Pv&Pw&&&&Px&% Button31Py% CN C B` A  B` A&Pz &%P{P|&% Sel. all&&&&&&&&%P}&P~&&&&P&% Button32P% C C B A  B A&P &%PP& %  Sel. none&&&&&&&&%P&P&&&&P&% Button33P% B C B` A  B` A&P &%PP&% Exact{&&&&&&&&%P&P&&&&P&% Button34P% Bx C B` A  B` A&P &%PP&% Regex{&&&&&&&&%P&P&&&&P& %  ScrollViewP&% Button35P% C6 C B A  B A&P &%PP&% +&&&&&&&&%P&P&&&&P&% Button36P% C\ C B A  B A&P &%PP&% -&&&&&&&&%P&P&&&&P&% Button37P% C C B A  B A&P &%PP&% --&&&&&&&&%P&P&&&&P&% Button38P% Ct @@ B` A  B` A&P &%PP&% Cancel&&&&&&&&%P&P&&&&P&% Button39P% C7 @@ B` A  B` A&P &%PP&% Ok&&&&&&&&%P&P&&&&P& %  TableColumn1PP&% column2 BT A GPPP&%  ,&&&&&&&&%P.ZP&% controlShadowColor PP&% three&&&&&&&&%P&% ClipViewP±& %  TableColumn2(Pñ& %  TableColumn3PıPű&% column2 BT A GPPƱPDZ&%  ,&&&&&&&&%1Pȱ&&&&&&&&%68Pɱ& %  TableColumn4lPʱ& %  TableColumn5P˱P̱&% column2 BT A GPPͱPα&%  ,&&&&&&&&%pPϱ&&&&&&&&%tvPб& %  TableColumn6Pѱ& %  TableColumn7PұPӱ&% column2 BT A GPPԱPձ&%  ,&&&&&&&&%Pֱ.Pױ&% SystemPر&% controlShadowColorPٱPڱ&% three&&&&&&&&%P۱& %  TableColumn8Pܱ& %  TableColumnPݱ& %  ClipView1Pޱ&% Button405P߱&% Button41;P&% Button42AP&% Button43P% C A  B` A  B` A&P &%PP&% Ok&&&&&&&&%P&P&&&&P&% Button44P% C A  B` A  B` A&P &%PP&% Cancel&&&&&&&&%P&P&&&&P&% Button45GP& %  TextField$P&% Button46MP&% Button47SP&% Button48P% C A  B` A  B` A&P &%PP&% Ok&&&&&&&&%P&P&&&&P&% Button49P% C A  B` A  B` A&P &%PP&% Cancel&&&&&&&&%P&P&&&&P& %  TextField10 P& %  TextField11P!% A C C A  C A&P &%PP&&&&&&&&&%P.P&% SystemP &% textBackgroundColorP .P & %  textColorP & %  TextField12P !% A Cɀ BL A  BL A&P &%PP&% Select:&&&&&&&&%P.P&% SystemP&% textBackgroundColorP.P& %  textColorP& %  TextField13P!% Bt Cɀ Ck A  Ck A&P &%PP&&&&&&&&&%P.P&% SystemP&% textBackgroundColorP.P& %  textColorP & %  MenuItem10rP!& %  TextField14P"!% Bx Cŀ Ck A  Ck A&P# &%P$P%&&&&&&&&&%P&.P'&% SystemP(&% textBackgroundColorP).'P*& %  textColorP+& %  MenuItem11P,& %  TextField15P-!% A0 Cŀ BL A  BL A&P. &%P/P0&% Select:&&&&&&&&%P1.P2&% SystemP3&% textBackgroundColorP4.2P5& %  textColorP6&% GormNSPopUpButtonNP7& %  MenuItem12P8& %  TextField16P9!% A C C A  C A&P: &%P;P<&&&&&&&&&%P=.P>&% SystemP?&% textBackgroundColorP@.>PA& %  textColorPB&% TableHeaderViewPC& %  GormNSPanel1PD1#NSPanel%  C C& % C* D'PE %  C C  C C&PF &ry"-PG% A0 C C A  C A&PH &%PI PJ&&&&&&&&&PKPL&PM &PNPO&% Item 1PP&&&%%PQPR&% Item 2P&&%%PSPT&% Item 3P&&%%%PU&PV&&&&NK%%%%%9PW.PX&% SystemPY&% windowBackgroundColorPZ&% WindowP[& %  File sets[ ? A F@ F@%_P\& %  MenuItem13!P]& %  TextField17P^!% A B B A  B A&P_ &%P`Pa&% File save mode:&&&&&&&&%Pb.Pc&% SystemPd&% textBackgroundColorPe.cPf& %  textColorPg& %  GormNSPanelPh#%  C C& % D D(@Pi %  C C  C C&Pj &Pk% C A  B` A  B` A&Pl &%PmPn&% Close&&&&&&&&%Po&Pp&&&&Pq% C C B A  B A&Pr &%PsPt&% --&&&&&&&&%Pu&Pv&&&&Pw% A C C A  C A&Px &%Py Pz&&&&&&&&&P{P|&P} &P~P&% Item 1P&&&%%PP&% Item 2&&%%PP&% Item 3&&%%%P&P&&&&~{%%%%%P% C[ C B A  B A&P &%PP&% -&&&&&&&&%P&P&&&&P% C5 C B A  B A&P &%PP&% +&&&&&&&&%P&P&&&& P% Bt C B` A  B` A&P &%PP&% Regex{&&&&&&&&%P&P&&&&P% B C B` A  B` A&P &%PP&% Exact{&&&&&&&&%P&P&&&&P% A C B` A  B` A&P &%PP&% Select&&&&&&&&%P&P&&&&P% B C B` A  B` A&P &%PP&% Sel. +&&&&&&&&%P&P&&&&\P.P&% windowBackgroundColorP&% WindowP& %  Code sets ? A F@ F@%_P& %  GormNSPanel2P#%  C B&% C D@P %  C B  C B&P &P% B B C9 A  C9 A&P &%P P&&&&&&&&&PP&P &PP&% AbsoluteP&&&%%PP&% Relative&&%%PP& %  Same folder&&%%%P&P±&&&&%%%%%^Pñ.Pı&% SystemPű&% windowBackgroundColorPƱ&% WindowPDZ&% Project preferences ? A F@ F@%_Pȱ& %  MenuItem14,Pɱ& %  TextField18Pʱ!% A B< C A  C A&P˱ &%P̱Pͱ&% Enter search list name:&&&&&&&&%Pα.Pϱ&% SystemPб&% textBackgroundColorPѱ.Pұ& %  textColorPӱ&% Button1%P?%#P@%PA%ÐPB%bPC%$PD%ɐPE%ʐPF%PG% PH%PI%ӐPJ%萐PK%PL%6PM%+PN%PO%PP%PQ% PR% PS%9PT%9PU%9PV%9PW%PX%PY%PZ%a9P[%iP\%lP]%mP^%nP_%oP`%pPa% Pb%Pc%Pd%Pe%Pf%Pg1&NSNibOutletConnector9$Ph& %  fileListViewPi&9#Pj&% searchListViewPk&9 Pl& %  codeListViewPm%Pn%9Po%9Pp&9Pq& %  codeCountViewPr&9Ps&% searchCountViewPt&9Pu& %  fileCountViewPv1'NSNibControlConnector9Pw&% newFileToProj:Px'9Py&% openSelectedFile:Pz'i9P{&% removeFileFromProj:P|'l9P}&% addFileToProj:P~&9+P&% searchTypeMenuP%9P&9P&% myProjP%/9P&/9P&% myProjP&/#P&% mySourceP%'9P&' P&% codeViewP& 'P& %  dataSourceP& 'P&% delegateP&#/P&#/P&9P&% searchStringViewP&9 P& %  coderIDViewP'9P& %  setInitFile:P'9P&% doAdd:P'9P& %  doAddAll:P'9P& %  doRemove:P'9P& %  doRemoveAll:P%P%9P&9P& %  initFileNameP&9P& %  pathModeViewP&9P&% delegateP&9P&% windowControllerP&$9P& %  dataSourceP&$9P&% delegateP&'9P&% myProjP&9P&% _windowP&9P&% myWindowP'9P& %  doSearch:P'9P& %  clearSearch:P'9P&% doFileShuffleUp:P'9P&% doFileShuffleDown:P'9P&% doSearchShuffleUp:P'9P&% doSearchShuffleDown:P'9P&% requestCodeDefinition:P&9P±& %  rawButtonPñ%Pı%Pű'9PƱ&% showCodeBrowser:PDZ%,Pȱ%+Pɱ%7Pʱ%\P˱&9,P̱&% codeSetPopMenu2Pͱ'\9Pα& %  loadAllCodes:Pϱ'79Pб& %  editCodeSet:Pѱ%g9Pұ%Pӱ%%PԱ%АPձ%ѐPֱ%Pױ%Pر%"Pٱ%-Pڱ% 9P۱%!9Pܱ% Pݱ%Pޱ%.P߱%2P%4P%6P%P%[P%P&9-P&% codeSetPopMenuP&9.P&% codeSetSelRegexP&92P&% codeSetSelExactP&9%P& %  codeSetTableP&9P&% codeSetSelStringP&9P& %  codeSetNameP&9gP& %  codeSetPaneP'49P& %  codeSetSel:P'69P&% codeSetSelMore:P'9P&% codeSetSelLess:P'[9P&% codeSetSelAll:P'9P&% codeSetSelNone:P&%9P& %  dataSourceP'9P& %  codeSetClose:P'!9P& %  codeSetAdd:P' 9P& %  codeSetDel:P'"9P&% codeSetDelAll:P'-9P& %  showCodeSet:P %19P %ȐP %搐P %P &91P&% fileSetPopMenu2P'9P& %  editFileSet:P'9P& %  loadAllFiles:P%C9P%9P%9P%&9P%9P%9P%9P%q9P%x9P%9P%9P%9P%!9P %,9P!%39P"%9P#%9P$%9P%%89P&%9P'%9P('P)& %  _doScroll:P*% 9P+%9P,%B9P-&9CP.& %  fileSetPaneP/&93P0&% fileSetPopMenuP1&9!P2&% fileSetSelStringP3&9P4&% fileSetSelRegexP5&9P6&% fileSetSelExactP7&&9P8& %  dataSourceP9&9&P:& %  fileSetTableP;'9P<& %  fileSetSel:P='9P>&% fileSetSelMore:P?'q9P@&% fileSetSelLess:PA'x9PB&% codeSetSelAll:PC'9PD&% fileSetSelNone:PE'9PF& %  fileSetAdd:PG'9PH& %  fileSetDel:PI'9PJ&% fileSetDelAll:PK'39PL& %  showFileSet:PM'9PN& %  fileSetClose:PO&98PP& %  fileSetNamePQ%9PR%9PS%9PT%59PU%]9PV&95PW& %  absPathSwitchPX&9PY& %  projPrefPanelPZ'9P[& %  okPrefPanel:P\'9P]&% cancelPrefPanel:P^%9P_%9P`%9Pa%Pb%9Pc%ɐPd%琐Pe%ᐐPf%萐Pg'9Ph& %  okNamedSL:Pi'9Pj&% cancelNamedSL:Pk&9Pl&% searchListSheetPm&9Pn&% searchListNameFieldPo&9Pp&% searchListMenuPq'9Pr& %  addNamedSL:Ps'9Pt& %  removeNSL:Pu'9Pv& %  removeAllNSL:Pw%J9Px%9Py%9Pz%9P{&9JP|&% searchNameMenuP}'9P~& %  addNamedSrch:P'9P& %  delNamedSrch:P'9P&% delAllNamedSearch:P%9P%9P%9P%9P%9P&9P&% searchNameSheetP&9P&% searchNameSheetFieldP'9P& %  okNamedSrch:P'9P&% cancelNamedSrch:P1( GSMutableSet1) NSMutableSet1*NSSet& D0(hgtamsanalyzer.app-0.42/Source/myProject.h0000555000175000017500000002112410162465511020734 0ustar brentbrent00000000000000// // MyDocument.h // TA2 hot // // Created by matthew on Sat Apr 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import #import #import "MyDocument.h" #import "myProject.h" #import "myResults.h" #define ABSPATHMODE 0 #define RELPATHMODE 1 #define LOCPATHMODE 2 #define SETMODEFILEs 0 #define SETMODECODEs 1 @interface myProject : NSDocument { int rawF, emptyF, exactF; int simpleF, sectionF, regexCharF, nonRegexCharF; int uniqueNumber; IBOutlet id searchListMenu; IBOutlet id searchListSheet; IBOutlet id searchListNameField; IBOutlet id emptyButton; IBOutlet id exactButton; IBOutlet id rawButton; IBOutlet id simpleButton; IBOutlet id sectionButton; IBOutlet id searchTypeMenu; MWFile *initFile; IBOutlet id codeListView; IBOutlet id codeSourceView; IBOutlet id codeSourceBox; IBOutlet id fileListView; IBOutlet id codeFileName; IBOutlet id myWindow; IBOutlet id searchListView; IBOutlet id searchStringView; IBOutlet id windowNameView; IBOutlet id coderIDView; IBOutlet id coderIDPrompt; IBOutlet id initFileName; IBOutlet id projPrefPanel; IBOutlet id absPathSwitch; IBOutlet id fileCountView; IBOutlet id pathModeView; IBOutlet id fileListModeView; IBOutlet id fileModeButton; IBOutlet id resultModeButton; IBOutlet id setName; IBOutlet id setMenu; IBOutlet id searchNameMenu; IBOutlet id searchNameAdd; IBOutlet id searchNameDelete; IBOutlet id searchNameDeleteAll; IBOutlet id searchNameSheet; IBOutlet id searchNameSheetField; IBOutlet id searchNameSheetOK; IBOutlet id searchNameSheetCancel; IBOutlet id codeSetName; IBOutlet id codeSetPopMenu; IBOutlet id codeSetPopMenu2; IBOutlet id codeSetTable; IBOutlet id codeSetPane; IBOutlet id codeSetSelString; IBOutlet id codeSetSelRegex; IBOutlet id codeSetSelExact; IBOutlet id codeCountView; IBOutlet id searchCountView; NSMutableArray *codeSetButtons; NSMutableDictionary *codeSets, *fileSets, *currSet; NSMutableString *codeSetCurrName, *fileSetCurrName, *currName; IBOutlet id fileSetName; IBOutlet id fileSetPopMenu; IBOutlet id fileSetPopMenu2; IBOutlet id fileSetTable; IBOutlet id fileSetPane; IBOutlet id fileSetSelString; IBOutlet id fileSetSelRegex; IBOutlet id fileSetSelExact; NSMutableArray *fileSetButtons; NSMutableDictionary *summReports; int setMode; BOOL codeListDirty; NSMutableArray *theHotCodeList; BOOL tempCodeSet; NSMutableArray *tempCodeList; NSMutableArray *tempCodeStack; NSMutableArray *openFiles, *searchFiles; NSMutableDictionary *codeList, *reportDictionary, *namedSearchList, *namedSrch, *autoSetDict; NSMutableArray *resultFiles, *fList, *allFiles; NSMutableString *savingFileName; BOOL reanalysisMode; int absPathMode; int fileViewMode; id closeButtonTarget; id closeButtonSel; } -(int) rawF; -(int) exactF; -(int) emptyF; -(int) simpleF; -(int) sectionF; -(int) regexCharF; -(int) nonRegexCharF; -(MWFile *) fileForName: (NSString *) where; -(IBAction) removeNSL: (id) sender; -(IBAction) removeAllNSL: (id) sender; -(IBAction) showCodeBrowser: (id) Sender; -(BOOL) reanalysisMode; -(void) setReanalysisMode: (BOOL) value; -(IBAction) doToggleReanalysisMode: (id) sender; -(void) rebuildAutoSetMenu; -(void) handleMakeDirty; -(MWFile *) fileForPath: (NSString *) where; -(NSMutableString *) getDefinition: (NSString *) what; - (void) shoveWindow; - (void)windowDidUpdate:(NSNotification *)aNotification; - (BOOL) fileExists: (MWFile *) who; - (BOOL) isInitFile: (MWFile *) who; -(MWFile *) getInitFile; -(void) newCode: (NSString *) what definition: (NSString *) info color: (int) whatColor; - (id)initWithWindowNibName:(NSString *)windowNibName; - (NSMutableArray *) fileList; - (NSMutableArray *) searchList; //protocol for result documents -(NSString *) theLimitString; -(NSString *) uniqueString; -(NSString *) theWindowName; - (void)windowDidLoad; -(void) displaySelData; -(void) front; -(void) back; -(void) setDirty; -(NSArray *) getHotCodeList; -(NSArray *) allCodeList; -(BOOL) isCodeActive: (NSString *) who; -(NSString *) codersList; -(NSArray *) hotCodeList; -(void) openMWFile: (MWFile *) who type: (int) what; -(BOOL) mwFileExists: (MWFile *) who; -(MWFile *) getMWFile; -(MWFile *) searchFileName; -(NSMutableDictionary *) getReports; -(BOOL) isMyCode: (NSString *) ss; -(void) broadcastCodeChange: (BOOL) colorize; -(void) registerResult: (myResults *) who; -(void) unregisterResult: (MWFile *) who; -(void) updateFileView; -(int) absPath; -(void) newFileWithText: (NSString *) what; -(IBAction) addHotListToSearch: (id) sender; -(IBAction) goFileMode: (id) sender; -(IBAction) goResultMode: (id) sender; -(IBAction) requestCodeDefinition: (id) sender; -(IBAction) doFileShuffleUp: (id) sender; -(IBAction) doFileShuffleDown: (id) sender; -(IBAction) doSearchShuffleUp: (id) sender; -(IBAction) doSearchShuffleDown: (id) sender; -(IBAction) addFileToProj: (id) Sender; -(IBAction) openSelectedFile: (id) Sender; -(IBAction) newFileToProj: (id) Sender; -(IBAction) removeFileFromProj: (id) Sender; -(IBAction) okPrefPanel: (id) Sender; -(IBAction) cancelPrefPanel: (id) Sender; - (IBAction) setInitFile: (id) sender; - (IBAction)clearSearch:(id)sender; - (IBAction)doAdd:(id)sender; - (IBAction)doAddAll:(id)sender; - (IBAction)doRefresh:(id)sender; - (IBAction)doRemove:(id)sender; - (IBAction)doRemoveAll:(id)sender; - (IBAction)doSearch:(id)sender; - (IBAction)myAction:(id)sender; -(void) addCode: (NSString *) what definition: (NSString *) info active: (BOOL) act append: (BOOL) app; -(IBAction) addNamedSL: (id) Sender; -(IBAction) okNamedSL: (id) Sender; -(IBAction) cancelNamedSL: (id) Sender; -(NSColor *) colorForCode: (NSString *) myCode; //saving search name -(IBAction) okNamedSrch: (id) Sender; -(IBAction) cancelNamedSrch: (id) Sender; -(IBAction) addNamedSrch: (id) Sender; -(IBAction) delNamedSrch: (id) Sender; -(IBAction) delAllNamedSearch: (id) Sender; -(IBAction) doNamedSrch: (id) Sender; -(IBAction) codeSetAdd:(id) sender; -(IBAction) codeSetDel:(id) sender; -(IBAction) codeSetDelAll:(id) sender; -(IBAction) codeSetSelAll:(id) sender; -(IBAction) codeSetSelNone:(id) sender; -(IBAction) codeSetClose:(id) sender; -(void) loadAllCodes: (id) sender; -(void) loadCodeSet: (id) sender; -(void) loadTempCodeSet: (NSString *) who; -(void) rebuildCodeSetMenu: (NSMenu *) asmn withSel: (SEL) mysel at: (int) start showState: (BOOL) st; -(void) rebuildCodeSetMenu; -(IBAction) editCodeSet: (id) Sender; -(void) addCodeToCurrSet: (NSString *) who; -(NSArray *) allCodeSetNames; -(NSString *) currCodeSet; -(BOOL) isCodeSet; -(IBAction) codeSetSelMore: (id) sender; -(IBAction) codeSetSelLess: (id) sender; -(IBAction) codeSetSel: (id) sender; -(void) registerCodeSet: (NSString *) who withCodes: (NSMutableArray *) what force: (BOOL) ff; -(BOOL) codeSetExists: (NSString *) who; -(NSArray *) codesInCodeSet: (NSString *) who; -(void) updateCodeCount; -(NSArray *) allCodeList; -(IBAction) fileSetAdd:(id) sender; -(IBAction) fileSetDel:(id) sender; -(IBAction) fileSetDelAll:(id) sender; -(IBAction) fileSetSelAll:(id) sender; -(IBAction) fileSetSelNone:(id) sender; -(IBAction) fileSetClose:(id) sender; -(void) loadAllFiles: (id) sender; -(void) loadFileSet: (id) sender; -(void) rebuildFileSetMenu; -(IBAction) editFileSet: (id) Sender; -(void) addFileToCurrSet: (MWFile *) who; -(NSArray *) allFileSetNames; -(NSString *) currFileSet; -(BOOL) isFileSet; -(IBAction) fileSetSelMore: (id) sender; -(IBAction) fileSetSelLess: (id) sender; -(IBAction) fileSetSel: (id) sender; -(NSArray *) hotFileSet; -(NSArray *) allFileList; -(void) addFile: (MWFile *) who toSet: (NSString *) s; -(IBAction) showFileSet: (id) sender; -(void) loadFileSetWithName: (NSString *) who; -(void) rebuildFileSetPopMenu; -(NSArray *) dataFileSetNames; -(int) hotFileCount; -(NSArray *) allFileList; -(NSArray *) mySummReports; -(void) delSummReport:(NSString *) who; -(void) addSummReport:(NSString *) who report: (NSDictionary *) r global: (BOOL) g; -(BOOL) isMySummReport: (NSString *) who; -(void) rebuildSummReportMenu; -(void) addAutoSet: (NSMutableDictionary *) what withName: (NSString *) who; -(NSMutableDictionary *) autoSetForName: (NSString *) who; -(void) removeAutoSetForName: (NSString *) who; -(NSArray *) allAutoSetNames; -(void) setupSearchMode: (int) smode; -(IBAction) initializeSearchMode: (id) sender; @end #define FILEOPEN(X) [gWorkBench fileExists: X] #define SOURCETYPE 0 #define RESULTFILETYPE 1 gtamsanalyzer.app-0.42/Source/myProject.m0000555000175000017500000035733610162465511020762 0ustar brentbrent00000000000000// // myProject.m // TA2 hot // // Created by matthew on Sat Apr 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "MWFile.h" #import "myProject.h" #import "MyDocument.h" #import "tams.h" #import "utils.h" #import "myResults.h" //#import "ctReadChar.h" #import "tableBrowser.h" #import "prefBoss.h" #import "TAMSCharEngine.h" #import "appDelegate.h" #import "MWPath.h" #import "ctTagInfo.h" #import "tamsutils.h" #import "MWKappa.h" #import "AGRegex.h" #import "myProject.h" #define FILEMODE 0 #define RESULTMODE 1 #define SIMPLEINDEX 0 #define NONSIMPLEINDEX 1 #define SECTIONSEARCHINDEX 2 #define NONREGEXCHARINDEX 3 #define REGEXCHARINDEX 4 #define CODESETBASE 2 #define CODESETBASE2 3 #define FILESETBASE 2 #define CODESETBASE3 2 #define FILESETBASE2 3 //#define FIXRESULTS //#define UNTITLEDBLOCK 1 #define MAKEDIRTY [self handleMakeDirty]; //Old makedirty[self updateChangeCount: NSChangeDone]; #define MAKECLEAN [self updateChangeCount: NSChangeCleared]; int aStringComp(id first, id second, void *key) { return [(NSString *) first compare: second]; } @implementation myProject -(void) setDirty {MAKEDIRTY;} -(BOOL) hasFile { if([self fileName] == nil) return NO; else return YES; } - (NSString *)windowNibName { // Override returning the nib file name of the document // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. return @"myProject"; } -(BOOL) codeListDirty {return codeListDirty;} -(void) setCodeListDirty {codeListDirty = YES; [self broadcastCodeChange: NO];} -(void) setCodeListClean {codeListDirty = NO;} -(void) handleMakeDirty { [self setCodeListDirty]; if([self fileName] != nil && [self shouldSave]) [self saveDocument: nil]; else [self updateChangeCount: NSChangeDone]; [self updateCodeCount]; //[searchCountView setIntValue: [[self searchList] count]]; } //make sure everyone has a file path -(BOOL) shouldSave { FORALL(openFiles) { if([temp hasFile] == NO) return NO; } ENDFORALL; #ifdef UNTITLEDBLOCK FORALL(resultFiles) { if([temp hasFile] == NO) return NO; } ENDFORALL; #endif return YES; } - (IBAction)saveDocument:(id)sender { if([self shouldSave] == NO) { NSWARNING(@"You must save or close all files (including search results) in this project before saving the project itself."); return; } if([self hasFile] == NO) { if([self shouldSave] == NO ) { NSWARNING(@"You must save all files in this project before saving the project itself."); return; } if(absPathMode != ABSPATHMODE) { NSWARNING(@"Saving with absolute paths. Reselect path option and save again other path modes."); absPathMode = ABSPATHMODE; } } else [savingFileName setString: [self fileName]]; [super saveDocument: sender]; #ifdef attempt2 if([self windowShouldClose: nil] == NO ) return; NSSavePanel *mysp = [NSSavePanel savePanel]; //do we need to save if([self fileName] == nil && absPathMode != ABSPATHMODE) { for(;;) { n = [mysp runModal]; if(n == NSFileHandlingPanelOKButton || n == NSFileHandlingPanelCancelButton) break; } } else { if([self fileName] != nil) [savingFileName setString: [self fileName]]; [super saveDocument: sender]; return; } if(n == NSFileHandlingPanelCancelButton) return; [savingFileName setString: [mysp filename]]; [[self dataRepresentationOfType: [[NSDocumentController sharedDocumentController] typeFromFileExtension: [mysp requiredFileType]]] writeToFile: savingFileName atomically: YES]; [self setFileName: savingFileName]; #endif #ifdef attempt1 BOOL doubleSave; NSString *fn; fn = nil; fn = [self fileName]; doubleSave = NO; if(fn != nil) [super saveDocument: sender]; else { if(absPathMode != ABSPATHMODE) doubleSave = YES; if(doubleSave) { absPathMode = ABSPATHMODE; [super saveDocument: sender]; } else { [super saveDocument: sender]; return; } if(doubleSave && [self fileName] != nil) { absPathMode = RELPATHMODE; [super saveDocument: sender]; } } #endif } - (IBAction)saveDocumentTo:(id)sender { if([self shouldSave] == NO) { NSWARNING(@"You must save or close all files (including search results) in this project before saving the project itself."); return; } if([self hasFile] == NO) { if([self shouldSave] == NO ) { NSWARNING(@"You must save all files in this project before saving the project itself."); return; } if(absPathMode != ABSPATHMODE) { NSWARNING(@"Saving with absolute paths. Reselect path option in \"Preferences\" and save again for relative paths."); absPathMode = ABSPATHMODE; } } if(absPathMode != ABSPATHMODE) { NSWARNING(@"Saving with absolute paths. Reselect path option and save again for relative paths."); absPathMode = ABSPATHMODE; } [super saveDocumentTo: sender]; } - (IBAction)saveDocumentAs:(id)sender { int pm; pm = absPathMode; if([self shouldSave] == NO) { NSWARNING(@"You must save or close all files (including search results) in this project before saving the project itself."); return; } if([self hasFile] == NO) { if([self shouldSave] == NO ) { NSWARNING(@"You must save all files in this project before saving the project itself."); return; } if(absPathMode != ABSPATHMODE) { NSWARNING(@"Saving with absolute paths. Reselect path option in \"Preferences\" and save again for relative paths."); absPathMode = ABSPATHMODE; } } if(absPathMode != ABSPATHMODE) { NSWARNING(@"Saving with absolute paths. Reselect path option and save again for relative paths."); absPathMode = ABSPATHMODE; } [super saveDocumentAs: sender]; #ifdef attempt1 BOOL doubleSave; doubleSave = NO; if(absPathMode != ABSPATHMODE) doubleSave = YES; if(doubleSave) { absPathMode = ABSPATHMODE; [super saveDocumentAs: sender]; } else { [super saveDocumentAs: sender]; return; } if(doubleSave) { absPathMode = pm; [self saveDocument: sender]; //this is the 2nd save, now that we have a path } #endif } -(NSMutableArray *) name2MWFileArray: (NSArray *) who { NSMutableArray *mm; MWFile *mf; mm = [NSMutableArray array]; FORALL(who) { mf = [self fileForName: temp]; if(mf != nil) [mm addObject: mf]; } ENDFORALL; return mm; } -(NSMutableArray *) MWFile2NameArray: (NSArray *) who { NSMutableArray *mm; mm = [NSMutableArray array]; FORALL(who) { [mm addObject: [[[temp name] copy] autorelease]]; }ENDFORALL; return mm; } -(NSMutableArray *) MWFile2NameArrayRedux: (NSArray *) who { NSMutableArray *mm; mm = [NSMutableArray array]; FORALL(who) { if([temp hasFile]) [mm addObject: [[[temp name] copy] autorelease]]; }ENDFORALL; return mm; } -(NSDictionary *) fileSetsForSaving { NSMutableDictionary *ans = [NSMutableDictionary dictionary]; NSArray *nn = [self allFileSetNames]; NSArray *old, *nw; FORALL(nn) { old = [fileSets objectForKey: temp]; nw = [self MWFile2NameArrayRedux: old]; [ans setObject: nw forKey: temp]; } ENDFORALL; return ans; } -(void) loadFileSets: (NSDictionary *) savedFS { NSArray *nn = [savedFS allKeys]; NSArray *old, *nw; FORALL(nn) { #ifdef FIXRESULTS if([temp isEqualToString: @"Results"]) continue; #endif old = [savedFS objectForKey: temp]; nw = [self name2MWFileArray: old]; if(nw != nil) [fileSets setObject:nw forKey: temp]; } ENDFORALL; } -(NSMutableDictionary *) convertedNSL: (NSDictionary *) who { NSMutableDictionary *tt; tt = [[NSMutableDictionary alloc]init]; if([who objectForKey: @"init"] != nil) { [tt setObject: [[who objectForKey: @"init"] name] forKey: @"init"]; } [tt setObject: [self MWFile2NameArray: [who objectForKey: @"searchList"]] forKey: @"searchList"]; return tt; } -(NSMutableDictionary *) reconvertedNSL: (NSDictionary *) who { NSMutableDictionary *tt; tt = [[NSMutableDictionary alloc] init]; if([who objectForKey: @"init"] != nil) { [tt setObject: [self fileForName: [who objectForKey: @"init"]] forKey: @"init"]; } [tt setObject: [self name2MWFileArray: [who objectForKey: @"searchList"]] forKey: @"searchList"]; return tt; } -(NSDictionary*) getSaveableNamedSearchList { NSArray *ak; NSMutableDictionary *convDict; convDict = [[NSMutableDictionary alloc] init]; ak = [namedSearchList allKeys]; FORALL(ak) { [convDict setObject: [self convertedNSL: [namedSearchList objectForKey: temp]] forKey: temp]; } ENDFORALL; return convDict; } - (NSData *)dataRepresentationOfType:(NSString *)aType { NSMutableArray *masterArray = [NSMutableArray array]; NSMutableArray *fileArray = [NSMutableArray array]; NSMutableArray *resultArray = [NSMutableArray array]; NSMutableArray *searchArray = [NSMutableArray array]; NSString *pPath, *tPath; // Insert code here to write your document from the given data. You can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead. //construct my path #ifdef USESXML if([aType isEqualToString: @"XML TAMS Project"] == YES) return [self keyedDataRepresentation]; #endif tPath = [self fileName]; pPath = [savingFileName stringByDeletingLastPathComponent]; //make an array //add to it a version # [masterArray addObject: @"9"]; //add to it the search file list FORALL(openFiles) { switch(absPathMode) { case ABSPATHMODE: [fileArray addObject: [[temp path] stringByStandardizingPath]]; break; case RELPATHMODE: [fileArray addObject: abs2rel(pPath, [temp path])]; break; case LOCPATHMODE: [fileArray addObject: [(MWFile *)temp name]]; break; }; } ENDFORALL; [masterArray addObject: fileArray]; FORALL(searchFiles) { switch(absPathMode) { case ABSPATHMODE: [searchArray addObject: [[temp path] stringByStandardizingPath]]; break; case RELPATHMODE: [searchArray addObject: abs2rel(pPath, [temp path])]; break; case LOCPATHMODE: [searchArray addObject: [(MWFile *)temp name]]; break; }; } ENDFORALL; [masterArray addObject: searchArray]; //add to it the init file if (initFile) { switch(absPathMode) { case ABSPATHMODE: [masterArray addObject: [[initFile path] stringByStandardizingPath]]; break; case RELPATHMODE: [masterArray addObject: abs2rel(pPath, [initFile path])]; break; case LOCPATHMODE: [masterArray addObject: [initFile name]]; break; }; } else [masterArray addObject: @""]; //add to it the code dictionary [masterArray addObject: codeList]; //save the path mode switch(absPathMode) { case ABSPATHMODE: [masterArray addObject: @"A"]; break; case RELPATHMODE: [masterArray addObject: @"R"]; break; case LOCPATHMODE: [masterArray addObject: @"F"]; break; }; [masterArray addObject: [autoSetDict copy]]; FORALL(resultFiles) { #ifdef UNTITLEDBLOCK #else if([temp hasFile] == NO) continue; #endif switch(absPathMode) { case ABSPATHMODE: [resultArray addObject: [[temp path] stringByStandardizingPath]]; break; case RELPATHMODE: [resultArray addObject: abs2rel(pPath, [temp path])]; break; case LOCPATHMODE: [resultArray addObject: [(MWFile *)temp name]]; break; }; } ENDFORALL; [masterArray addObject: resultArray]; [masterArray addObject: [self getSaveableNamedSearchList]]; if([searchListMenu numberOfItems] > 0) [masterArray addObject: [[[searchListMenu selectedItem] title] copy]]; else [masterArray addObject: @""]; [masterArray addObject: namedSrch]; [masterArray addObject: [codeSets copy]]; [masterArray addObject: [self fileSetsForSaving]]; [masterArray addObject: [[fileSetCurrName copy] autorelease]]; if(tempCodeSet) [masterArray addObject: [NSString stringWithString: @""]]; else [masterArray addObject: [[codeSetCurrName copy] autorelease]]; [masterArray addObject: summReports]; //serialize it return [NSArchiver archivedDataWithRootObject: masterArray]; } -(MWFile *) fileForPath: (NSString *) where { FORALL(openFiles) { if([where isEqualToString: [temp path]]) return temp; } ENDFORALL; FORALL(resultFiles) { if([where isEqualToString: [temp path]]) return temp; } ENDFORALL; return nil; } -(MWFile *) fileForName: (NSString *) where { FORALL(openFiles) { if([where isEqualToString: [temp name]]) return temp; } ENDFORALL; FORALL(resultFiles) { if([where isEqualToString: [temp name]]) return temp; } ENDFORALL; return nil; } -(void) setUseableNamedSearchList: (NSDictionary *) who { NSArray *ak; NSMutableDictionary *convDict; convDict = [[NSMutableDictionary alloc] init]; ak = [who allKeys]; FORALL(ak) { [namedSearchList setObject: [self reconvertedNSL: [who objectForKey: temp]] forKey: temp]; } ENDFORALL; } -(NSMutableDictionary *) getReports{return reportDictionary;} - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType { // Insert code here to read your document from the given data. You can also choose to override -loadFileWrapperRepresentation:ofType: or -readFromFile:ofType: instead. NSMutableArray * masterArray; NSArray *fileList; MWFile *sfile; int vers; NSString *tPath;//= [self fileName]; NSString *pPath = [[self fileName] stringByDeletingLastPathComponent]; #ifdef USESXML if([aType isEqualToString: @"XML TAMS Project"] == YES) return [self loadKeyedData: data]; #endif masterArray = [NSUnarchiver unarchiveObjectWithData: data]; tPath = [self fileName]; vers = [[masterArray objectAtIndex: 0] intValue]; if([[masterArray objectAtIndex: 0] isEqualToString: @"2.0c"] || vers >= 3) { [autoSetDict addEntriesFromDictionary: [masterArray objectAtIndex: 6]]; } if([[masterArray objectAtIndex: 0] isEqualToString: @"2.0b"]|| [[masterArray objectAtIndex: 0] isEqualToString: @"2.0c"]|| vers >= 3) { if([[masterArray objectAtIndex: 5] isEqualToString: @"A"]) absPathMode = ABSPATHMODE; else if([[masterArray objectAtIndex: 5] isEqualToString: @"R"]) absPathMode = RELPATHMODE; else if([[masterArray objectAtIndex: 5] isEqualToString: @"L"]) absPathMode = LOCPATHMODE; else if([[masterArray objectAtIndex: 5] isEqualToString: @"F"]) absPathMode = LOCPATHMODE; if([[masterArray objectAtIndex: 0] isEqualToString: @"2.0c"] || vers >= 3) { fileList = [masterArray objectAtIndex: 7]; FORALL(fileList) { if(isAbsPath(temp)) { MWFile *mwf =[[MWFile alloc] initWithPath: [temp stringByStandardizingPath]]; [resultFiles addObject: mwf]; #ifdef FIXRESULTS [self addFile: mwf toSet: @"Results"]; #endif } else { MWFile *mwf = [[MWFile alloc] initWithPath: rel2abs(pPath, temp)]; [resultFiles addObject: mwf]; #ifdef FIXRESULTS [self addFile: mwf toSet: @"Results"]; #endif } } ENDFORALL; } } else absPathMode = ABSPATHMODE; if([[masterArray objectAtIndex: 0] isEqualToString: @"2.0a"] || [[masterArray objectAtIndex: 0] isEqualToString: @"2.0b"]|| [[masterArray objectAtIndex: 0] isEqualToString: @"2.0c"] || vers >= 3) { fileList = [masterArray objectAtIndex: 1]; FORALL(fileList) { if(isAbsPath(temp)) { MWFile *mwf = [[MWFile alloc] initWithPath: [temp stringByStandardizingPath]]; [openFiles addObject: mwf]; [allFiles addObject: mwf]; } else { MWFile *mwf =[[MWFile alloc] initWithPath: rel2abs(pPath, temp)]; [openFiles addObject: mwf]; [allFiles addObject: mwf]; } } ENDFORALL; fileList = [masterArray objectAtIndex: 2]; FORALL(fileList) { if(isAbsPath(temp)) sfile = [self fileForPath: [temp stringByStandardizingPath]]; else sfile = [self fileForPath: rel2abs(pPath,temp)]; if(sfile) { [searchFiles addObject: sfile]; } } ENDFORALL; //[openFiles addObjectsFromArray: [masterArray objectAtIndex: 1]]; if([[masterArray objectAtIndex: 3] isEqualToString: @""]) initFile = nil; else { NSString *iiFile; iiFile = [masterArray objectAtIndex: 3]; if(isAbsPath(iiFile)) initFile = [self fileForPath: [iiFile stringByStandardizingPath]]; else initFile = [self fileForPath: rel2abs(pPath, iiFile)]; [initFileName setStringValue: [initFile name]]; [searchFiles removeObject: initFile]; [searchListView reloadData]; } [codeList addEntriesFromDictionary: [masterArray objectAtIndex: 4]]; if(vers >= 3) { [self setUseableNamedSearchList: [masterArray objectAtIndex: 8]]; } if(vers >= 4) { if([[masterArray objectAtIndex: 9] isEqualToString: @""] == NO) [searchListMenu selectItemWithTitle: [masterArray objectAtIndex: 9]]; } if(vers >= 5) { [namedSrch addEntriesFromDictionary: [masterArray objectAtIndex: 10]]; } if(vers >= 6) { [codeSets addEntriesFromDictionary: [masterArray objectAtIndex: 11]]; } if(vers >= 7) { [self loadFileSets: [masterArray objectAtIndex: 12]]; //[self loadFileSetWithName: [masterArray objectAtIndex: 13]]; [fileSetCurrName setString: [masterArray objectAtIndex: 13]]; } else { [[fileSets objectForKey: @"Results"] addObjectsFromArray: resultFiles]; } if(vers >=8) { [codeSetCurrName setString: [masterArray objectAtIndex: 14]]; } if (vers >= 9) { [summReports addEntriesFromDictionary: [masterArray objectAtIndex: 15]]; [self rebuildSummReportMenu]; } [self setCodeListDirty]; return YES; } else return NO; } -(id) init { [super init]; //globals //multiFileFlag = 0; tempCodeSet = NO; reanalysisMode = NO; uniqueNumber = 0; absPathMode = ABSPATHMODE; fileViewMode = FILEMODE; [self setCodeListDirty]; fList = openFiles = [[NSMutableArray alloc] init]; allFiles = [[NSMutableArray alloc] init]; tempCodeList = [[NSMutableArray alloc] init]; tempCodeStack = [[NSMutableArray alloc] init]; searchFiles = [[NSMutableArray alloc] init]; resultFiles = [[NSMutableArray alloc] init]; codeList = [[NSMutableDictionary alloc] init]; reportDictionary = [[NSMutableDictionary alloc] init]; autoSetDict = [[NSMutableDictionary alloc] init]; namedSrch = [[NSMutableDictionary alloc] init]; namedSearchList = [[NSMutableDictionary alloc] init]; savingFileName = [[NSMutableString alloc] init]; codeSetCurrName = [[NSMutableString alloc] init]; fileSetCurrName = [[NSMutableString alloc] init]; codeSets = [[NSMutableDictionary alloc] init]; fileSets = [[NSMutableDictionary alloc] init]; [fileSets setObject: [NSMutableArray array] forKey: @"Results"]; //done so there is always access codeSetButtons = [[NSMutableArray alloc] init]; summReports = [[NSMutableDictionary alloc] init]; theHotCodeList = [[NSMutableArray alloc] init]; //locals return self; } -(void) dealloc { [fileSetCurrName release]; [allFiles release]; [fileSets release]; [tempCodeList release]; [tempCodeStack release]; [codeSets release]; [openFiles release]; [codeSetCurrName release]; [codeSetButtons release]; [searchFiles release]; [resultFiles release]; [codeList release]; [savingFileName release]; [reportDictionary release]; [namedSearchList release]; [namedSrch release]; [autoSetDict release]; [summReports release]; [theHotCodeList release]; [super dealloc]; } - (void) shoveWindow { [self openSelectedFile: nil]; } -(void) openMWFile: (MWFile *) who type: (int) what { id myfile; NSDocumentController *myDC; NSString *myPath; myDC = [NSDocumentController sharedDocumentController]; if([who open] == YES) { [[who filePointer] moveForward]; //[[openFiles objectAtIndex: row] moveForward]; } else { NSString *myfp; NSMutableArray *myfpc; [myDC setShouldCreateUI: YES]; //if filemode is folder //get my path //get the path //use only the name //otherwise the old way myPath = [who path] ; if(absPathMode == LOCPATHMODE) { myfp = [self fileName]; if(myfp != nil) { myfpc =[NSMutableArray arrayWithArray: [myfp pathComponents]]; [myfpc removeLastObject]; if([[NSFileManager defaultManager] changeCurrentDirectoryPath: [NSString pathWithComponents: myfpc]] == YES) { myfile = [myDC openDocumentWithContentsOfFile: [[myPath lastPathComponent] stringByStandardizingPath] display:YES]; if(myfile) [myfile setFileName: myPath]; } else NSWARNING(@"Could not switch directory path."); } else NSWARNING(@"Project is not saved, cannot use folder path mode"); } else { myfile = [myDC openDocumentWithContentsOfFile: myPath display:YES]; if(myfile){[myfile setFileName: myPath]; NSLog(@"opening: %@\n",myPath);} } //myfile = [myDC makeDocumentWithContentsOfFile: myPath ofType: @"RTFD"]; if(!myfile) { NSWARNING(@"File not found."); return; } [myfile retain]; [who setOpenFile: myfile]; [myfile setMWFile: who]; [myfile setGWorkBench: self]; [myfile setTitleFromFile]; if(what == SOURCETYPE) { [myfile scanForMetas]; [myfile moveForward]; [myfile scrollToTop]; [myfile setReanalysisState: [self reanalysisMode]]; [[NSNotificationCenter defaultCenter] addObserver: myfile selector: @selector(goReanalysisMode:) name: @"TAGoReanalysisMode" object: self]; } else if (what == RESULTFILETYPE) { [myfile moveForward]; [myfile loadSavedData]; [myfile setFileName: myPath]; } } } -(IBAction) openSelectedFile: (id) Sender { int row; NSDocumentController *myDC; myDC = [NSDocumentController sharedDocumentController]; row = [fileListView selectedRow]; if(row < 0) return; [self openMWFile: [fList objectAtIndex: row] type: fileViewMode]; } -(BOOL) mwFileExists: (MWFile *) who { FORALL(openFiles) { if(who == temp) return YES; } ENDFORALL; FORALL(resultFiles) { if(who == temp) return YES; } ENDFORALL; return NO; } -(IBAction) doCloseWindowAction: (id) Sender { if([self windowShouldClose: self]) { [closeButtonTarget performSelector: (SEL) closeButtonSel withObject: self afterDelay: 0.0]; //[myWindow performClose: self]; } } - (void)windowControllerDidLoadNib:(NSWindowController *) aController { id cButton; NSArray *myMenuItems; NSMenuItem *myItem; [codeListView setTarget: self]; [codeListView setDoubleAction: @selector(displaySelData)]; [fileListView setTarget: self]; [fileListView setDoubleAction: @selector(shoveWindow)]; //get old #ifdef PANTHERVERSION cButton = [myWindow standardWindowButton:NSWindowCloseButton ]; closeButtonTarget = [cButton target]; closeButtonSel = [cButton action]; //switch to the new [cButton setTarget: self]; [cButton setAction: @selector(doCloseWindowAction:)]; #endif if(initFile) [initFileName setStringValue: [initFile name]]; [searchListMenu removeAllItems]; myMenuItems = [namedSearchList allKeys]; FORALL(myMenuItems) { [searchListMenu addItemWithTitle: temp]; myItem = [searchListMenu lastItem]; [myItem setTarget: self]; [myItem setAction: @selector(loadSL:)]; } ENDFORALL; [searchNameMenu removeAllItems]; myMenuItems = [namedSrch allKeys]; FORALL(myMenuItems) { [searchNameMenu addItemWithTitle: temp]; myItem = [searchNameMenu lastItem]; [myItem setTarget: self]; [myItem setAction: @selector(doNamedSrch:)]; } ENDFORALL; [self rebuildSummReportMenu]; [self reloadFileSet]; [self loadCurrCodeSet]; [self updateCodeCount]; } - (void)windowDidLoad { } - (id)initWithWindowNibName:(NSString *)windowNibName { [super init]; //globals //multiFileFlag = 0; //gSearchList = [[NSMutableArray alloc] init]; uniqueNumber = 0; fList = openFiles = [[NSMutableArray alloc] init]; searchFiles = [[NSMutableArray alloc] init]; resultFiles = [[NSMutableArray alloc] init]; reportDictionary = [[NSMutableDictionary alloc] init]; codeList = [[NSMutableDictionary alloc] init]; savingFileName = [[NSMutableString alloc] init]; //locals return self; } -(int) emptyF{ return emptyF;} -(int) exactF {return exactF;} -(int) rawF {return rawF;} -(int) simpleF {return simpleF;} -(int) sectionF {return sectionF;} -(int) regexCharF {return regexCharF;} -(int) nonRegexCharF {return nonRegexCharF;} -(MWFile *) getMWFile { MWFile *who; int row; row = [fileListView selectedRow]; who= [[self hotFileSet] objectAtIndex: row]; return who; } -(MWFile *) searchFileName { int row; row = [searchListView selectedRow]; return [searchFiles objectAtIndex: row]; } /* -(void) registerWindow: (MyDocument *) who { [openFiles addObject: who]; [self updateFileView]; } */ - (void) removeFileFromSets: (MWFile *) who { NSArray *w; w = [fileSets allKeys]; FORALL(w) { [[fileSets objectForKey: temp] removeObject: who]; } ENDFORALL; } - (void) unregisterWindow: (MyDocument *) who { FORALL(openFiles) { if(who == [temp filePointer]) { [(MWFile *)temp setPath: [who fileName]]; [temp setOpenFile: nil]; } } ENDFORALL; } -(MWFile *) getInitFile {return initFile;} //may need to change - (BOOL) isInitFile: (MWFile *) who { if(who == initFile) return YES; else return NO; } -(NSString *) uniqueString; { return [NSString stringWithFormat: @"TAMSSTRING %d", uniqueNumber++]; } - (NSMutableArray *) fileList { return fList; } - (NSMutableArray *) searchList { return searchFiles; } -(void) registerResult: (myResults *) what { MWFile *who; who = [[MWFile alloc] init]; [who setOpenFile: what]; [who setHasFile: NO]; [resultFiles addObject: who]; [self addFile: who toSet: @"Results"]; [what setMWFile: who]; MAKEDIRTY; //[self setDirty]; } -(void) unregisterResult: (MWFile *) who { [resultFiles removeObject: who]; [self removeFile: who fromSet: @"Results"]; if([who hasFile]) [self setDirty]; } -(void) broadcastCodeChange: (BOOL) colorize { FORALL(openFiles) { if([(MWFile *)temp open]) { [(MyDocument *)[(MWFile *)temp filePointer] updateCodeWindow]; if([gPrefBoss autoColorValue] && colorize) [(MyDocument *)[(MWFile *)temp filePointer] doColorize: nil]; } } ENDFORALL; if([self isCodeSet] == YES) { NSString *css = [NSString stringWithFormat: @"Codes: %@", [self currCodeSet]]; NSSETHEADER(codeListView, @"Codes",css); } else { NSSETHEADER(codeListView, @"Codes",@"Codes"); } [codeListView reloadData]; } -(BOOL) isCodeActive: (NSString*) who { NSDictionary *myDef; myDef = [codeList objectForKey: who]; if(myDef) { if([[myDef objectForKey: @"active"] isEqualToString: @"YES"]) return YES; } return NO; } -(void) addCode: (NSString *) what definition: (NSString *) info active: (BOOL) act append: (BOOL) app { NSMutableDictionary *myEntry; NSMutableString *myDef, *oldDef; myEntry = [codeList objectForKey: what]; if(myEntry) { } else { myEntry = [[NSMutableDictionary alloc] init]; [codeList setObject: myEntry forKey: what]; } if(app) { oldDef = [myEntry objectForKey: @"definition"]; myDef = [NSMutableString string]; if([gPrefBoss dateTimeValue]) {[myDef appendString: [[NSDate date] description]]; [myDef appendString: @": "]; } if(oldDef) { [myDef appendString: oldDef]; [myDef appendString: @" "]; } [myDef appendString: info]; } else { if([gPrefBoss dateTimeValue]) {[myDef appendString: [[NSDate date] description]]; [myDef appendString: @": "]; } [myDef appendString: info]; } [myDef ADDCHAR('\n')]; [myEntry setObject: myDef forKey: @"definition"]; if(act) [myEntry setObject: @"YES" forKey: @"active"]; else [myEntry setObject: @"NO" forKey: @"active"]; [self addCodeToCurrSet: what]; MAKEDIRTY; } - (void) newCode: (NSString *) what definition: (NSString *) info active: (BOOL) act { NSMutableDictionary *myEntry; NSMutableString *myDef = [[NSMutableString alloc] init]; myEntry = [codeList objectForKey: what]; if(myEntry) { if([gPrefBoss dateTimeValue]) {[myDef appendString: [[NSDate date] description]]; [myDef appendString: @": "]; } [myDef appendString: [myEntry objectForKey: @"definition"]]; [myDef appendString: @" "]; [myDef appendString: info]; [myDef ADDCHAR('\n')]; [myEntry setObject: myDef forKey: what]; if(act) [myEntry setObject: @"YES" forKey: @"active"]; else [myEntry setObject: @"NO" forKey: @"active"]; [self addCodeToCurrSet: what]; } else { myEntry = [[NSMutableDictionary alloc] init]; if([gPrefBoss dateTimeValue]) {[myDef appendString: [[NSDate date] description]]; [myDef appendString: @": "]; } [myDef appendString: info]; [myDef ADDCHAR('\n')]; [myEntry setObject: myDef forKey: @"definition"]; if(act) [myEntry setObject: @"YES" forKey: @"active"]; else [myEntry setObject: @"NO" forKey: @"active"]; [codeList setObject: myEntry forKey: what]; [self addCodeToCurrSet: what]; } MAKEDIRTY; [myDef release]; } - (void) newCode: (NSString *) what definition: (NSString *) info realColor: (NSColor *) whatColor { NSMutableDictionary *myEntry; NSMutableString *myDef = [[NSMutableString alloc] init]; myEntry = [codeList objectForKey: what]; if(myEntry) { if([gPrefBoss dateTimeValue]) {[myDef appendString: [[NSDate date] description]]; [myDef appendString: @": "]; } [myDef setString: [myEntry objectForKey: @"definition"]]; [myDef appendString: @" "]; [myDef appendString: info]; [self addCodeToCurrSet: what]; [myEntry setObject: myDef forKey: what]; } else { myEntry = [[NSMutableDictionary alloc] init]; if([gPrefBoss dateTimeValue]) {[myDef appendString: [[NSDate date] description]]; [myDef appendString: @": "]; } [myDef appendString: info]; [myDef ADDCHAR('\n')]; [myEntry setObject: myDef forKey: @"definition"]; [myEntry setObject: @"YES" forKey: @"active"]; [myEntry setObject: [NSNumber numberWithInt: otherColor] forKey: @"color"]; [myEntry setObject: whatColor forKey: @"realColor"]; [self addCodeToCurrSet: what]; [codeList setObject: myEntry forKey: what]; } MAKEDIRTY; [myDef release]; } - (void) newCode: (NSString *) what definition: (NSString *) info color: (int) whatColor { NSMutableDictionary *myEntry; NSMutableString *myDef = [[NSMutableString alloc] init]; myEntry = [codeList objectForKey: what]; if(myEntry) { if([gPrefBoss dateTimeValue]) {[myDef appendString: [[NSDate date] description]]; [myDef appendString: @": "]; } [myDef setString: [myEntry objectForKey: @"definition"]]; [myDef appendString: @" "]; [myDef appendString: info]; [self addCodeToCurrSet: what]; [myEntry setObject: myDef forKey: what]; } else { myEntry = [[NSMutableDictionary alloc] init]; if([gPrefBoss dateTimeValue]) {[myDef appendString: [[NSDate date] description]]; [myDef appendString: @": "]; } [myDef appendString: info]; [myDef ADDCHAR('\n')]; [myEntry setObject: myDef forKey: @"definition"]; [myEntry setObject: @"YES" forKey: @"active"]; [myEntry setObject: [NSNumber numberWithInt: whatColor] forKey: @"color"]; [self addCodeToCurrSet: what]; [codeList setObject: myEntry forKey: what]; } MAKEDIRTY; [myDef release]; } -(void) setInitMWFile: (MWFile *) who { if (initFile == who || who == nil) { [initFileName setStringValue: @""]; initFile = nil; } else { initFile = who; [initFileName setStringValue: [who name]]; [searchFiles removeObject: who]; [searchListView reloadData]; } MAKEDIRTY; } - (IBAction)clearSearch:(id)sender { [searchStringView setStringValue: @""]; } -(BOOL) isInSearchList: (MWFile *) who { FORALL(searchFiles) { if(temp == who) return YES; }ENDFORALL; return NO; } - (IBAction) doAdd:(id)sender { int n; BOOL m; //don't add the init file if([fList count] == 0) return; n = [fileListView selectedRow]; //NSLog(@"Selected row = %d\n", n); if(n < 0 && [fList count] > 0) [fileListView selectRow: 0 byExtendingSelection: NO]; if(fileViewMode == RESULTMODE) { NSWARNING(@"Can only modify search list from a source set."); return; } if([self isInitFile: [self getMWFile]] == YES) return; m = [self isInSearchList: [self getMWFile]]; if( m == YES) return; [searchFiles addObject: [self getMWFile]]; if(n < [fList count]-1) { [fileListView selectRow: n+1 byExtendingSelection: NO]; [fileListView reloadData]; } [searchListView reloadData]; MAKEDIRTY; } - (IBAction)doAddAll:(id)sender { if(fileViewMode == RESULTMODE) { NSWARNING(@"Can only modify search list from data source file set."); return; } [self doRemoveAll: self]; //NSLog(@"removed all\n"); [searchFiles addObjectsFromArray: [self hotFileSet]]; //NSLog(@"Added from array\n"); if(initFile) { int loc; loc = -1; FORALL(searchFiles) { if(temp == initFile) { loc = __i; break; } }ENDFORALL; if(loc >= 0) [searchFiles removeObjectAtIndex: loc]; //[searchFiles removeObject: initFile]; //NSLog(@"removed init file. %d left\n", [searchFiles count]); } MAKEDIRTY; [searchListView reloadData]; //NSLog(@"reloaded\n"); } - (IBAction)doRefresh:(id)sender { } - (IBAction)doRemove:(id)sender { int n; if([searchFiles count] == 0) return; n = [searchListView selectedRow]; //NSLog(@"Selected row = %d\n", n); if(n < 0 && [searchFiles count] > 0) [searchListView selectRow: 0 byExtendingSelection: NO]; if(fileViewMode == RESULTMODE) { NSWARNING(@"Can only modify search list from data file set."); return; } [searchFiles removeObject: [self searchFileName]]; [searchListView reloadData]; MAKEDIRTY; } - (IBAction)doRemoveAll:(id)sender { if(fileViewMode == RESULTMODE) { NSWARNING(@"Can only modify search list from a data file set."); return; } [searchFiles removeAllObjects]; [searchListView reloadData]; MAKEDIRTY; } - (IBAction) forceInitFile: (MWFile *) who { if (who == nil) { [initFileName setStringValue: @""]; initFile = nil; } else { initFile = who; [initFileName setStringValue: [who name]]; [searchFiles removeObject: who]; [searchListView reloadData]; } MAKEDIRTY; } - (IBAction) setInitFile: (id) sender { MWFile *who; who = [self getMWFile]; if (initFile == who) { [initFileName setStringValue: @""]; initFile = nil; } else { initFile = who; [initFileName setStringValue: [who name]]; [searchFiles removeObject: who]; [searchListView reloadData]; } MAKEDIRTY; } -(NSMutableString *) getDefinition: (NSString *) what { NSMutableDictionary *myWord; myWord = [codeList objectForKey: what]; if(myWord) return [myWord objectForKey: @"definition"]; else return [NSMutableString string]; } -(IBAction) generateCount: (id) Sender { NSMutableArray *hc; NSMutableArray *sl; tableBrowser *mt; TAMSCharEngine *tce; sl = [[NSMutableArray alloc] init]; hc = [NSMutableArray arrayWithArray: [self getHotCodeList]]; // [gCentralCodeFile refreshCodeList: nil]; // gCurrentDataSource = self; //is there anyone to search? if(initFile) [sl addObject: initFile]; [sl addObjectsFromArray: searchFiles]; if([sl count] == 0) return; tce = [[TAMSCharEngine alloc] initWithArrayAndStart: searchFiles] ; //make me the current data source mt = [[[tableBrowser alloc] init] autorelease]; #ifdef OLDNIBLOADER [mt setHotCodeList: hc]; [mt setDataType: @"count"]; [mt setCharEngine: tce]; [NSBundle loadNibNamed: @"FreqCount" owner: mt]; [mt windowControllerDidLoadNib: nil]; [[mt window] makeKeyAndOrderFront: self]; #else [mt setHotCodeList: hc]; [mt setDataType: @"count"]; [mt setCharEngine: tce]; [mt makeWindowControllers]; [[NSDocumentController sharedDocumentController] addDocument:mt]; [mt showWindows]; //[mt windowControllerDidLoadNib: nil]; //[doc updateChangeCount:NSChangeDone]; // mark as dirty //[document showWindows]; [[mt window] makeKeyAndOrderFront: self]; #endif [sl release]; } -(IBAction) generateCrossReference: (id) Sender { NSMutableArray *hc; tableBrowser *mt; NSMutableArray *sl; TAMSCharEngine *tce; sl = [[NSMutableArray alloc] init]; // gCurrentDataSource = self; hc = [NSMutableArray arrayWithArray: [self getHotCodeList]]; //is there anyone to search? if(initFile) [sl addObject: initFile]; [sl addObjectsFromArray: searchFiles]; if([sl count] == 0) return; //make me the current data source tce = [[TAMSCharEngine alloc] initWithArrayAndStart: sl]; [tce setGCurrentDataSource: self]; mt = [[[tableBrowser alloc] init] autorelease]; [mt setCharEngine: tce]; [mt setHotCodeList: hc]; [mt setDataType: @"xref"]; #ifdef OLDNIBLOADER [NSBundle loadNibNamed: @"FreqCount" owner: mt]; [mt windowControllerDidLoadNib: nil]; #else [mt makeWindowControllers]; [[NSDocumentController sharedDocumentController] addDocument:mt]; [mt showWindows]; //[mt windowControllerDidLoadNib: nil]; #endif [[mt window] makeKeyAndOrderFront: self]; } -(IBAction) generateKappa: (id) Sender { NSMutableArray *hc; MWKappa *mt; NSMutableArray *sl; TAMSCharEngine *tce; sl = [[NSMutableArray alloc] init]; // gCurrentDataSource = self; hc = [NSMutableArray arrayWithArray: [self getHotCodeList]]; //is there anyone to search? //if(initFile) [sl addObject: initFile]; if([searchFiles count] != 2) { NSWARNING(@"To generate Kappa, the search list should consist of 2 \"identical\" files."); return; } [sl addObjectsFromArray: searchFiles]; if([sl count] == 0) return; //make me the current data source tce = [[TAMSCharEngine alloc] initWithArrayAndStart: sl]; [tce setGCurrentDataSource: self]; mt = [[[MWKappa alloc] init] autorelease]; [mt setCharEngine: tce]; [mt setHotCodeList: hc]; [mt setDataType: @"kappa"]; #ifdef OLDNIBLOADER [NSBundle loadNibNamed: @"kappa" owner: mt]; [mt windowControllerDidLoadNib: nil]; #else [mt makeWindowControllers]; [[NSDocumentController sharedDocumentController] addDocument:mt]; [mt showWindows]; //[mt windowControllerDidLoadNib: nil]; //[doc updateChangeCount:NSChangeDone]; // mark as dirty //[document showWindows]; #endif [mt buildKappa]; [[mt window] makeKeyAndOrderFront: self]; } - (IBAction)doSearch:(id)sender { myResults *aa; NSDocumentController *who; NSMutableArray *sl; int st; NSMutableString *myLimStr = [[NSMutableString alloc] init]; sl = [[NSMutableArray alloc] init]; //set the flags st = [searchTypeMenu tagOfSelectedItem]; if([rawButton state] == NSOnState) rawF = 1; else rawF = 0; if([exactButton state] == NSOnState) exactF = 1; else exactF = 0; if([emptyButton state] == NSOnState) emptyF = 1; else emptyF = 0; if(st == SECTIONSEARCHINDEX) sectionF = 1; else sectionF = 0; if(st == REGEXCHARINDEX) regexCharF = 1; else regexCharF = 0; if(st == NONREGEXCHARINDEX) nonRegexCharF = 1; else nonRegexCharF = 0; if(st == SIMPLEINDEX) { int i,ln; int sflg; unichar c; sflg = 1; [myLimStr setString: [searchStringView stringValue]]; trimNSS(myLimStr); if([myLimStr isEqualToString: @""]) simpleF = sflg; else { ln = [myLimStr length]; for(i = 0; i < ln; i++) { c = [myLimStr characterAtIndex: i]; //if(c == '*' || c == '+' || c == ',') if( c == '+')// || c == ',') { sflg = 0; break; } } simpleF = sflg; } } else if ([searchTypeMenu indexOfSelectedItem] == NONSIMPLEINDEX) { simpleF = 0; [myLimStr setString: [searchStringView stringValue]]; trimNSS(myLimStr); //if we get a nonsimple unlimited search this will have to go: //if([myLimStr isEqualToString: @""]) // simpleF = 1; } [myLimStr release]; //is there anyone to search? if(initFile) [sl addObject: initFile]; [sl addObjectsFromArray: searchFiles]; if([searchFiles count] == 0) { NSWARNING(@"Search list is empty"); return; } //make me the current data source //find the controller who = [NSDocumentController sharedDocumentController]; //make the window //[who setShouldCreateUI: YES]; //ans = [[myResults alloc] init]; //[who addDocument: ans]; #ifdef USESXML aa = [who openUntitledDocumentOfType: @"XML TAMS Result" display: YES]; #else aa = [who openUntitledDocumentOfType: @"TAMS Result" display: YES]; #endif [aa setGWorkBench: self]; [aa setCharEngineWithSource: self andFileList: sl]; [self registerResult: aa]; [aa executeTAMS]; [aa retain]; } - (BOOL) fileExists: (MWFile *) who { FORALL(openFiles) { if(who == temp) return YES; } ENDFORALL; return NO; #ifdef TAVER1 if([openFiles indexOfObject: who] == NSNotFound) return NO; else return YES; #endif } - (IBAction)myAction:(id)sender { } -(void) back { [myWindow orderBack: self]; } -(void) front { [myWindow makeKeyAndOrderFront: self]; } #ifdef TAVER1 - (IBAction)setCodeSource:(id)sender { codeSource = gCentralCodeFile =[self fileName]; [codeSourceView setStringValue: [gCentralCodeFile getTitle]]; [codeSourceBox setState: NSOnState]; // [gCentralCodeFile remakeCodeList]; FORALL(openFiles) { [temp updateCodeWindow]; } ENDFORALL; } -(void) setCodeSourceWithName: (NSString *) name { int i, cnt; FORALL(openFiles) { if([name isEqualToString: [temp fileName]] == YES) { codeSource = gCentralCodeFile = temp; [codeSourceView setStringValue: [gCentralCodeFile getTitle]]; [codeSourceBox setState: NSOnState]; cnt = [openFiles count]; for(i = 0; i < cnt; i++) { [[openFiles objectAtIndex: i] updateCodeWindow]; } return; } } ENDFORALL; } #endif - (IBAction) setInitFileWithName: (NSString *) fname { FORALL(openFiles) { if([fname isEqualToString: [temp fileName]] == YES) { if(temp == initFile) { [initFileName setStringValue: @""]; initFile = nil; return; } initFile = temp; [initFileName setStringValue: [temp getTitle]]; [searchFiles removeObject: temp]; [searchListView reloadData]; return; } } ENDFORALL; } /* - (MyDocument *) codeSource { return codeSource; } */ -(NSString *) theLimitString { return [searchStringView stringValue]; } -(void) displaySelData { int row; NSMutableString *ss, *tt; ss = [[NSMutableString alloc] init]; tt = [[NSMutableString alloc] init]; [ss setString: [searchStringView stringValue]]; row = [codeListView selectedRow]; [tt setString: [[[self getHotCodeList] objectAtIndex: row] copy]]; [ss appendString: tt]; [searchStringView setStringValue: ss]; [ss release]; [tt release]; } -(BOOL) isMyCode: (NSString *) ss { NSDictionary *test; test = [codeList objectForKey: ss]; if(test) return YES; else return NO; } -(NSArray *) allCodeList { NSMutableArray *hc; hc = [NSMutableArray arrayWithArray: [codeList allKeys]]; [hc sortUsingFunction: menuStringComp context: nil]; return hc; } -(NSArray *) hotCodeList { NSMutableArray *hc, *hc2; if(tempCodeSet) return tempCodeList; if([self codeListDirty] == NO) return theHotCodeList; if([codeSetCurrName isEqualToString: @""] == NO) { hc = [codeSets objectForKey: codeSetCurrName]; [hc sortUsingFunction: menuStringComp context: nil]; [theHotCodeList removeAllObjects]; [theHotCodeList addObjectsFromArray: hc]; [self setCodeListClean]; return theHotCodeList; } hc2 = [codeList allKeys]; hc = [NSMutableArray array]; FORALL(hc2) { if([self isCodeActive: temp] == YES) [hc addObject: temp]; } ENDFORALL; [hc sortUsingFunction: menuStringComp context: nil]; [theHotCodeList removeAllObjects]; [theHotCodeList addObjectsFromArray: hc]; [self setCodeListClean]; //[hc retain]; return theHotCodeList; } /* kept for legacy functions*/ -(NSArray *) getHotCodeList { return [self hotCodeList]; } -(NSString *) theWindowName { return [windowNameView stringValue]; } -(BOOL) windowShouldClose: (NSNotification *)aNotification { int n, i; n = [openFiles count]; for(i = 0; i < n; i++) { if([(MWFile *)[openFiles objectAtIndex: i] open] == YES) { NSWARNING(@"Close open source files before closing the project."); return NO; } } n = [resultFiles count]; for(i = 0; i < n; i++) { if([(MWFile *)[resultFiles objectAtIndex: i] open] == YES) { NSWARNING(@"Close open result files before closing the project."); return NO; } } return YES; } - (void)windowWillClose:(NSNotification *)aNotification { /* need to do some serious workhere with notifying the other windows */ //gCentralCodeFile = nil; //gWorkBench = nil; FORALL(resultFiles) { if([(MWFile *)temp open]) [[temp filePointer] setGWorkBench: nil]; } ENDFORALL; } - (void)windowDidUpdate:(NSNotification *)aNotification { [self updateFileView]; [codeListView reloadData]; [searchListView reloadData]; [codeListView setTarget: self]; [codeListView setDoubleAction: @selector(displaySelData)]; [fileListView setTarget: self]; [fileListView setDoubleAction: @selector(shoveWindow)]; //[[NSApplication sharedApplication] addWindowsItem: myWindow title: @"*Work Bench" filename: NO]; } -(IBAction) requestCodeDefinition: (id) sender { int who; NSString *theCode; NSMutableString *theDef; //get the string who = [codeListView selectedRow]; if(who >= 0) { theCode = [[self getHotCodeList] objectAtIndex: who]; } else return; //ask for definition theDef = [self getDefinition: theCode]; if(!theDef) {NSWARNING(@"Need to establish a central code file"); return;} //if it exists retain and display it [theDef retain]; NSRunAlertPanel(theCode, theDef, @"Ok", nil, nil); //release it [theDef release]; } -(void) dropMWFile: (MWFile *) who { [openFiles removeObject: who]; [allFiles removeObject: who]; [searchFiles removeObject: who]; [self removeFileFromSets: who]; [self updateFileView]; [searchListView reloadData]; [fileListView reloadData]; MAKEDIRTY; } -(NSString *) codersList { return [coderIDView stringValue]; } -(IBAction) doFileShuffleDown: (id) sender { int n; // if([fList count] == 0) return; n = [fileListView selectedRow]; if(n < 0) return; if(n< [fList count]-1) { //[fList exchangeObjectAtIndex:n withObjectAtIndex: n+1]; if([fileSetCurrName isEqualToString: @""] == YES) [openFiles exchangeObjectAtIndex:n withObjectAtIndex: n+1]; // else [[self hotFileSet] exchangeObjectAtIndex:n withObjectAtIndex: n+1]; [fileListView selectRow: n+1 byExtendingSelection: NO]; [self updateFileView]; MAKEDIRTY; } } -(IBAction) doFileShuffleUp: (id) sender { int n; if([fList count] == 0) return; n = [fileListView selectedRow]; if(n > 0) { if([fileSetCurrName isEqualToString: @""] == YES) [openFiles exchangeObjectAtIndex:n withObjectAtIndex: n-1]; // else [[self hotFileSet] exchangeObjectAtIndex:n withObjectAtIndex: n-1]; //[fList exchangeObjectAtIndex:n withObjectAtIndex: n-1]; [fileListView selectRow: n-1 byExtendingSelection: NO]; [self updateFileView]; MAKEDIRTY; } } -(IBAction) doSearchShuffleDown: (id) sender { int n; n = [searchListView selectedRow]; if(n< [searchFiles count]) { [searchFiles exchangeObjectAtIndex:n withObjectAtIndex: n+1]; [searchListView selectRow: n+1 byExtendingSelection: NO]; [searchListView reloadData]; MAKEDIRTY; } } -(IBAction) doSearchShuffleUp: (id) sender { int n; n = [searchListView selectedRow]; if(n > 0) { [searchFiles exchangeObjectAtIndex:n withObjectAtIndex: n-1]; [searchListView selectRow: n-1 byExtendingSelection: NO]; [searchListView reloadData]; MAKEDIRTY; } } - (void) openPanelDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { NSArray *theFiles; int i, n; MWFile *mwf; if(returnCode) { theFiles = [sheet filenames]; n = [theFiles count]; for(i = 0; i < n; i++) { mwf = [[MWFile alloc] initWithPath: [theFiles objectAtIndex: i]]; if(fileViewMode == FILEMODE) { [openFiles addObject: mwf]; [allFiles addObject: mwf]; if([fileSetCurrName isEqualToString:@""] == NO) if([fileSetCurrName isEqualToString: @"Results"] == NO) [self addFileToCurrSet: mwf]; [mwf setHasFile: YES]; } else { [resultFiles addObject: mwf]; [self addFile: mwf toSet: @"Results"]; [mwf setHasFile: YES]; } } if (n) { [self updateFileView]; MAKEDIRTY; } } } -(MyDocument *) newFile { MyDocument *newFile; NSDocumentController *dc; MWFile *who; dc = [NSDocumentController sharedDocumentController]; newFile = [dc openUntitledDocumentOfType: @"Rich text file" display: YES]; if(newFile) { who = [[MWFile alloc] init]; [who setOpenFile: newFile]; [who setHasFile: NO]; if([fileSetCurrName isEqualToString:@""] == NO) if([fileSetCurrName isEqualToString: @"Results"] == NO) [self addFileToCurrSet: who]; [openFiles addObject: who]; [allFiles addObject: who]; [newFile setMWFile: who]; [newFile setGWorkBench: self]; [newFile retain]; [newFile moveForward]; if([gPrefBoss scanInitValue]) [newFile scanForMetas]; [newFile setReanalysisState: [self reanalysisMode]]; [[NSNotificationCenter defaultCenter] addObserver: newFile selector: @selector(goReanalysisMode:) name: @"TAGoReanalysisMode" object: self]; [self updateFileView]; MAKEDIRTY; } return newFile; } -(IBAction) newFileToProj: (id) Sender { [self newFile]; } -(void) newFileWithText: (NSString *) what { MyDocument *who; who = [self newFile]; [who appendString: what]; } -(IBAction) newTextFileToProj: (id) Sender { MyDocument *newFile; NSDocumentController *dc; MWFile *who; if(fileViewMode == RESULTMODE) { NSWARNING(@"Can only add files from data file set."); return; } dc = [NSDocumentController sharedDocumentController]; newFile = [dc openUntitledDocumentOfType: @"Text" display: YES]; if(newFile) { who = [[MWFile alloc] init]; [who setOpenFile: newFile]; [openFiles addObject: who]; [allFiles addObject: who]; [newFile setMWFile: who]; [newFile setGWorkBench: self]; [who setHasFile: NO]; [newFile retain]; [newFile moveForward]; [self updateFileView]; MAKEDIRTY; } } -(IBAction) addFileToProj: (id) Sender { NSOpenPanel *myOP; /* NSString *ss; ss = abs2rel(@"/a/b/c/d/e", @"/a/b/c/d/e/foo.txt"); */ NSMutableArray *mytype; if(fileViewMode == FILEMODE) mytype = [NSMutableArray arrayWithObjects: @"txt", @"rtf", @"rtfd", @"RTFD", @"RTF", @"TXT", nil]; else mytype = [NSMutableArray arrayWithObjects: @"xtrs", @"trs",@"TRS", nil]; //[mytype removeLastObject]; myOP = [NSOpenPanel openPanel]; NSLog(@"Types = %@\n",mytype); [myOP setAllowsMultipleSelection: YES]; [myOP beginSheetForDirectory: nil file: nil types: mytype modalForWindow: myWindow modalDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo: nil]; /* result = [[NSOpenPanel openPanel] runModalForDirectory: NSHomeDirectory() file:nil types: mytype];//[NSArray arrayWithObjects: @"txt", @"rtf", @"RTF", @"TXT", nil]]; */ } -(IBAction) niceClose: (id) Sender { if([self windowShouldClose: nil]) [myWindow performClose: self]; } -(IBAction) closeAllFiles: (id) Sender { if(fileViewMode == RESULTMODE) { FORALL(resultFiles) { if([(MWFile *)temp open] == NO) continue; [[temp filePointer] niceClose: self]; } ENDFORALL; } else { FORALL(openFiles) { if([(MWFile *)temp open] == NO) continue; [[temp filePointer] niceClose: self]; } ENDFORALL; } } -(IBAction) closeProjFile: (id) Sender { int n; MWFile *who; n = [fileListView selectedRow]; if(n >= 0) { who = [openFiles objectAtIndex: n]; if([who open]) { [self shoveWindow]; [[who filePointer] performClose]; } } } -(void) expungeFileFromSearchList: (MWFile *) who { NSArray *fs; NSMutableArray *cfs; fs = [namedSearchList allKeys]; FORALL(fs) { cfs = [[namedSearchList objectForKey: temp] objectForKey: @"searchList"]; [cfs removeObject: who]; } ENDFORALL; //[openFiles removeObject: who]; } -(void) expungeFileFromProj: (MWFile *) who { NSArray *fs; NSMutableArray *cfs; fs = [self allFileSetNames]; FORALL(fs) { cfs = [fileSets objectForKey: temp]; [cfs removeObject: who]; } ENDFORALL; [openFiles removeObject: who]; } -(IBAction) removeFileFromProj: (id) Sender { MWFile *who; int n; n = [fileListView selectedRow]; who = [fList objectAtIndex: n]; if([who open] == YES) {NSWARNING(@"Cannot remove open files.");} else { [fList removeObject: who]; if([fileSetCurrName isEqualToString: @""]) { [self expungeFileFromProj: who]; [self expungeFileFromSearchList: who]; [searchFiles removeObject: who]; } [self updateFileView]; [searchListView reloadData]; MAKEDIRTY; } } -(IBAction) importCodesAndDefs: (id) Sender { MWFile *who; int n; ctQChar *q; NSMutableString *ss; int inZoneFlag; NSRange rrr; who = [self getMWFile]; TAMSCharEngine *tce = [[TAMSCharEngine alloc] initWithFileAndStart: who]; BOOL active; n = [fileListView selectedRow]; who = [openFiles objectAtIndex: n]; q = [[ctQChar alloc] init]; //gCurrentDataSource = gCentralCodeFile; //clearSearchList(); //addFileToSearchList(gCentralCodeFile); //startSearch(); inZoneFlag = 0; ss = [[NSMutableString alloc] init]; while([tce scanNext: q] != ENDOFFILE) { if([q tokentype] == TOKEN) inZoneFlag = 1; if([q tokentype] == CHAR && inZoneFlag) { [ss appendString: [q buff]]; } if([q tokentype] == ENDTOKEN) { //is it retired rrr =[[q extra] rangeOfString: @"retired" options: NSCaseInsensitiveSearch]; if(rrr.location != NSNotFound) active = NO; else active = YES; //send the definition [self addCode: [q buff] definition: [ss copy] active: active append: YES]; //zap the string [ss setString: @""]; inZoneFlag = 0; } } [ss autorelease]; [tce release]; [self broadcastCodeChange: NO]; MAKEDIRTY; } -(IBAction) importCodes: (id) Sender { MWFile *who; int n; ctQChar *q; NSRange rrr; BOOL active; who = [self getMWFile]; TAMSCharEngine *tce = [[TAMSCharEngine alloc] initWithFileAndStart: who]; n = [fileListView selectedRow]; who = [openFiles objectAtIndex: n]; q = [[ctQChar alloc] init]; //gCurrentDataSource = gCentralCodeFile; //clearSearchList(); //addFileToSearchList(gCentralCodeFile); //startSearch(); while([tce scanNext: q] != ENDOFFILE) { if([q tokentype] == ENDTOKEN) { //is it retired rrr =[[q extra] rangeOfString: @"retired" options: NSCaseInsensitiveSearch]; if(rrr.location != NSNotFound) active = NO; else active = YES; //send the definition [self addCode: [q buff] definition: @"" active: active append: YES]; //zap the string } } [tce release]; [self broadcastCodeChange: NO]; MAKEDIRTY; } -(IBAction) exportCodesAndDefs: (id) Sender { NSMutableString *ss; NSMutableArray *cl; MyDocument *md; ss = [NSMutableString string]; cl = [self allCodeList]; [cl retain]; FORALL(cl) { [ss appendString: @"{"]; [ss appendString: temp]; [ss appendString: @"}"]; [ss appendString: [self getDefinition: temp]]; [ss appendString: @"{/"]; [ss appendString: temp]; if([self isCodeActive: temp] == NO) { [ss appendString: @": retired"]; } [ss appendString: @"}"]; [ss ADDCHAR('\n')]; } ENDFORALL; //make an untitled document md = [self newFile]; //set the string to it if(md) { //[ss retain]; [md appendString: ss]; } } -(IBAction) emptyCodeBook: (id) Sender { if(NSYESNOQUESTION(@"This will erase all of your codes. Procede?") == NO) return; [codeList removeAllObjects]; [self broadcastCodeChange: YES]; MAKEDIRTY; } -(IBAction) showCodeBrowser: (id) Sender { MAKEDIRTY; [[NSApp delegate] doCodeDictionary: codeList from: self]; } /* basic files for saving v. 1 projects */ -(void) writeFileWithInit: (NSString *) myInit andFiles: (NSArray *) s1 andSearch: (NSArray *) s2 andDict: (NSDictionary *) d1 withName: (NSString *) myName { NSMutableString *myPath; NSMutableArray *myDataArray; NSArray *a1, *a2; NSDictionary *d3; NSString *w; //deal with nulls a1 = a2 = nil; if(!s1) { a1 = [[NSArray alloc] init]; } else a1 = s1; if(!s2) { a2 = [[NSArray alloc] init]; } else a1 = s2; if(!d1) { d3 = [[NSDictionary alloc] init]; } else d3 = d1; myPath = [NSString stringWithFormat: @"%@/Desktop/%@.tprj",NSHomeDirectory(), myName];//~/Desktop/%@.tprj", myName ]; // myPath = [NSString stringWithFormat: @"~/%@.tprj", myName ]; myDataArray = [[NSMutableArray alloc] init]; [myDataArray addObject: @"2.0a"]; //add to it the search file list [myDataArray addObject: a1]; [myDataArray addObject: a2]; //add to it the init file if (myInit) [myDataArray addObject: myInit]; else [myDataArray addObject: @""]; //add to it the code dictionary [myDataArray addObject: d3]; //serialize it if([[NSFileManager defaultManager] createFileAtPath: myPath contents: [NSArchiver archivedDataWithRootObject: myDataArray] attributes: nil]) { w = [NSString stringWithFormat: @"Writing file %@ to desktop directory", myName]; NSWARNING(w); } else { w = [NSString stringWithFormat: @"Problems writing file %@ to desktop directory", myName]; NSWARNING(w); } } -(IBAction) exportVersionOneProjects: (id) Sender { NSArray *theState, *theSet; NSMutableDictionary *allSets; NSArray *theMenuItems; NSString *currItem; int n, i; theState = [gPrefBoss savedState]; if([[theState objectAtIndex: 0] isEqualToString: @"1"] == YES) { NSWARNING(@"Can't convert this version's file information."); return; } theMenuItems = [[theState objectAtIndex: 1] allKeys]; if(!(n = [theMenuItems count])) return; for(i = 0; i < n; i++) { currItem = [theMenuItems objectAtIndex: i]; if ([[theState objectAtIndex: 0] isEqualToString: @"2"] == YES) { allSets = [theState objectAtIndex: 1]; theSet = [allSets objectForKey: currItem]; [self writeFileWithInit: [theSet objectAtIndex: 1] andFiles: [theSet objectAtIndex: 2] andSearch: nil andDict: nil withName: currItem]; } } } -(void) localizePathForArray: (NSArray *) myArray { NSString *pPath, *tPath; // Insert code here to write your document from the given data. You can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead. //construct my path tPath = [self fileName]; pPath = [savingFileName stringByDeletingLastPathComponent]; FORALL(myArray) { [(MWFile *)temp setPath: rel2abs(pPath, [(MWFile *)temp name])]; [(MWFile *)temp setHasFile: YES]; } ENDFORALL; } - (void) projPrefDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { if(returnCode) { BOOL oldPM; oldPM = absPathMode; absPathMode = [absPathSwitch indexOfSelectedItem]; [self updateFileView]; if(oldPM != absPathMode) { MAKEDIRTY; } else if (absPathMode == LOCPATHMODE) { [self localizePathForArray: openFiles]; [self localizePathForArray: resultFiles]; } } } -(IBAction) cancelPrefPanel: (id) Sender { [projPrefPanel orderOut: Sender]; [NSApp endSheet: projPrefPanel returnCode: 0]; } -(IBAction) okPrefPanel: (id) Sender { [projPrefPanel orderOut: Sender]; [NSApp endSheet: projPrefPanel returnCode: 1]; } -(IBAction) doProjPrefPanel: (id) Sender { if(absPathMode != ABSPATHMODE && [self fileName] == nil) { NSWARNING(@"Must save file using absolute paths before you can change project to relative paths") return; } [absPathSwitch selectItemAtIndex: absPathMode]; [NSApp beginSheet: projPrefPanel modalForWindow: myWindow modalDelegate: self didEndSelector: @selector(projPrefDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(IBAction) goFileMode: (id) sender { [resultModeButton setState: NSOffState]; fList = openFiles; fileViewMode = FILEMODE; [self updateFileView]; } -(IBAction) goResultMode: (id) sender { [fileModeButton setState: NSOffState]; fList = resultFiles; fileViewMode = RESULTMODE; [self updateFileView]; } -(void) updateFileView { [fileCountView setStringValue: [NSString stringWithFormat: @"%d",[self hotFileCount]]]; [fileListView reloadData]; switch(absPathMode) { case ABSPATHMODE: [pathModeView setStringValue: @"A"]; break; case RELPATHMODE: [pathModeView setStringValue: @"R"]; break; case LOCPATHMODE: [pathModeView setStringValue: @"F"]; break; }; } -(int) absPath {return absPathMode;} -(IBAction) removeAllFiles: (id) sender { if(fileViewMode == RESULTMODE) { FORALL(resultFiles) { if([(MWFile *)temp open]) { [[temp filePointer] setGWorkBench: nil]; } } ENDFORALL; [resultFiles removeAllObjects]; MAKEDIRTY; [self updateFileView]; } else NSWARNING(@"At present this only works in \"Reports\" mode"); } -(IBAction) checkForPairs: (id) sender { NSMutableArray *codeHolder; NSTextView *theDoc; MWFile *theMWFile; ctQChar *q; ctTagInfo *ti; int myloc; //TAMSCharEngine *tc = [[TAMSCharEngine alloc] initWithFileAndStart: [self getMyMWFile]]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init];//initWithFileAndStart: [self getMyMWFile]]; [tc addArrayToSearchList: openFiles]; [tc startSearch]; q = [[ctQChar alloc] init]; [q retain]; codeHolder = [[NSMutableArray alloc] init]; myloc = [tc getCharLocation]; while([tc scanNext: q] != ENDOFALLFILES) { //until eof //if it's a tag if([q tokentype] == TOKEN) { [codeHolder addObject: [[[ctTagInfo alloc] initWithName: [q buff] location: [q where] coder: [q coder] doc: [tc hotSearchDocument]] autorelease]]; } else if([q tokentype] == ENDTOKEN) { FORALL(codeHolder) { ti = nil; if([[(ctTagInfo *)temp name] isEqualToString: [q buff]] == YES && [[temp coder] isEqualToString: [q coder]] == YES && [temp document] == [tc hotSearchDocument]) { ti = temp; break; } }ENDFORALL; if(ti) [codeHolder removeObject: ti]; else { theMWFile = [tc hotSearchDocument]; [self openMWFile: theMWFile type:SOURCETYPE ]; theDoc = [[theMWFile filePointer] myTextView]; [theDoc setSelectedRange: NSMakeRange(myloc, [tc getCharLocation] - myloc)]; //scroll range [theDoc scrollRangeToVisible: NSMakeRange(myloc, [tc getCharLocation] - myloc)]; [q release]; [codeHolder release]; [tc release]; return; } } myloc = [tc getCharLocation]; } if([codeHolder count]) { //select range ti = [codeHolder objectAtIndex: 0]; theMWFile = [ti document]; [self openMWFile: theMWFile type:SOURCETYPE ]; theDoc = [[theMWFile filePointer] myTextView]; [theDoc setSelectedRange: NSMakeRange([ti location]+1, [[ti name] length])]; //scroll range [theDoc scrollRangeToVisible: NSMakeRange([ti location]+1, [[ti name] length])]; } else { NSMESSAGE(@"All code pairs matched"); } [q release]; [codeHolder release]; [tc release]; } -(IBAction) checkForNested: (id) sender { NSMutableArray *codeHolder; NSTextView *theDoc; MWFile *theMWFile; ctQChar *q; int errFlg; ctTagInfo *ti; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init];//initWithFileAndStart: [self getMyMWFile]]; [tc addArrayToSearchList: openFiles]; [tc startSearch]; errFlg = 0; q = [[ctQChar alloc] init]; [q retain]; codeHolder = [[NSMutableArray alloc] init]; while([tc scanNext: q] != ENDOFALLFILES) { //until eof //if it's a tag if([q tokentype] == TOKEN) { if([codeHolder count]) { FORALL(codeHolder) { if([[(ctTagInfo *)temp name] isEqualToString: [q buff]] == YES && [temp document] == [tc hotSearchDocument]) { theMWFile = [temp document]; [self openMWFile: theMWFile type:SOURCETYPE ]; theDoc = [[theMWFile filePointer] myTextView]; [theDoc setSelectedRange: NSMakeRange([q where]+1, [[q buff] length])]; [theDoc scrollRangeToVisible: NSMakeRange([q where]+1, [[q buff] length])]; [q release]; [codeHolder release]; return; } }ENDFORALL; [codeHolder addObject: [[[ctTagInfo alloc] initWithName: [q buff] location: [q where] coder: [q coder] doc: [tc hotSearchDocument]]autorelease]]; } else [codeHolder addObject: [[[ctTagInfo alloc] initWithName: [q buff] location: [q where] coder: [q coder] doc: [tc hotSearchDocument]]autorelease]]; } else if([q tokentype] == ENDTOKEN) { FORALL(codeHolder) { ti = nil; if([(NSString *)[(ctTagInfo *)temp name] isEqualToString: [q buff]] == YES && [[temp coder] isEqualToString: [q coder]] == YES) { ti = temp; break; } }ENDFORALL; if(ti) [codeHolder removeObject: ti]; } } NSMESSAGE(@"No nested codes found"); [q release]; [codeHolder release]; [tc release]; } -(IBAction) removeNSL: (id) sender { NSMutableString *who; if([searchListMenu numberOfItems] <= 0) return; who = [[NSMutableString alloc] init]; [who setString: [[searchListMenu selectedItem] title]]; [searchListMenu removeItemWithTitle: who]; [namedSearchList removeObjectForKey: who]; [who release]; MAKEDIRTY; } -(IBAction) removeAllNSL: (id) sender { [searchListMenu removeAllItems]; [namedSearchList removeAllObjects]; MAKEDIRTY; } -(IBAction) loadSL: (id) sender { NSMutableDictionary *mystuff; mystuff = [namedSearchList objectForKey: [[searchListMenu selectedItem] title]]; //set the init if([mystuff objectForKey: @"init"] != nil) [self forceInitFile: [mystuff objectForKey: @"init"]]; else [self forceInitFile: nil]; [searchFiles removeAllObjects]; [searchFiles addObjectsFromArray: [mystuff objectForKey: @"searchList"]]; MAKEDIRTY; } -(void) namedSLDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSMutableArray *mm; NSMutableDictionary *md; NSMenuItem *myItem; if(returnCode) { if([namedSearchList objectForKey: [searchListNameField stringValue]] != nil) { NSWARNING(@"Name already exists; use unique name"); return; } mm = [[NSMutableArray alloc] init]; md = [[NSMutableDictionary alloc] init]; [mm autorelease]; [md autorelease]; if([self getInitFile]) [md setObject: [self getInitFile] forKey: @"init"]; [mm addObjectsFromArray: searchFiles]; [md setObject: mm forKey: @"searchList"]; [namedSearchList setObject: md forKey: [searchListNameField stringValue]]; [searchListMenu addItemWithTitle: [searchListNameField stringValue]]; myItem = [searchListMenu lastItem]; [myItem setTarget: self]; [myItem setAction: @selector(loadSL:)]; [searchListMenu selectItem: myItem]; MAKEDIRTY; } } -(IBAction) cancelNamedSL: (id) Sender { [searchListSheet orderOut: Sender]; [NSApp endSheet: searchListSheet returnCode: 0]; } -(IBAction) okNamedSL: (id) Sender { [searchListSheet orderOut: Sender]; [NSApp endSheet: searchListSheet returnCode: 1]; } -(IBAction) addNamedSL: (id) Sender { NSWindow *who; [searchListNameField setStringValue: @""]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: searchListSheet modalForWindow: myWindow modalDelegate: self didEndSelector: @selector(namedSLDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(NSColor *) colorForCode: (NSString *) myCode { NSMutableString *currentCode; NSArray *codeArray, *tarray; NSMutableDictionary *who; int n, i, j; int colorCode; NSRange r; NSNumber *nsColorNumber; if(myCode == nil) return [gPrefBoss realColor]; if([myCode isEqualToString: @""]) return [gPrefBoss realColor]; codeArray = [myCode componentsSeparatedByString: @">"]; n = [codeArray count]; currentCode = [NSMutableString string]; r.location = 0; for (i = n - 1; i >= 0; i--) { //put together the string up to this point [currentCode setString: @""]; r.length = i + 1; tarray = [codeArray subarrayWithRange: r]; [currentCode setString: [tarray componentsJoinedByString: @">"]]; who = [codeList objectForKey: currentCode]; if(who == nil) { if (i == 0)//do the gprefboss thing break; else continue; } nsColorNumber = [who objectForKey: @"color"]; if(nsColorNumber == nil) { if(i == 0)break; else continue; } colorCode = [nsColorNumber intValue]; if(colorCode == otherColor) { NSColor *ccc = [who objectForKey: @"realColor"]; if(ccc != nil) return ccc; else continue; } if(colorCode == inheritedColor) continue; else { return getColorForInt(colorCode); } } return [gPrefBoss realColor];//getColorForInt([gPrefBoss tagColorValue]); } -(void) namedSrchDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSMutableArray *mm; NSMutableDictionary *md; NSMenuItem *myItem; if(returnCode) { if([namedSrch objectForKey: [searchNameSheetField stringValue]] != nil) { NSWARNING(@"Name already exists; use unique name"); return; } mm = [[NSMutableArray alloc] init]; md = [[NSMutableDictionary alloc] init]; [mm autorelease]; [md autorelease]; //[mm addObject: [[[searchStringView stringValue] copy] autorelease]]; //[mm addObject: [[[coderIDView stringValue] copy] autorelease]]; [md setObject: [NSNumber numberWithInt: 1] forKey: @"version"]; [md setObject: [[[searchStringView stringValue] copy] autorelease] forKey: @"limit"]; [md setObject: [[[coderIDView stringValue] copy] autorelease] forKey: @"coder"]; [md setObject: [NSNumber numberWithInt: [rawButton intValue]] forKey: @"raw"]; [md setObject: [NSNumber numberWithInt: [emptyButton intValue]] forKey: @"empty"]; [md setObject: [NSNumber numberWithInt: [exactButton intValue]] forKey: @"exact"]; [md setObject: [NSNumber numberWithInt: [searchTypeMenu indexOfSelectedItem]] forKey: @"searchType"]; [namedSrch setObject: md forKey: [searchNameSheetField stringValue]]; [searchNameMenu addItemWithTitle: [searchNameSheetField stringValue]]; myItem = [searchNameMenu lastItem]; [myItem setTarget: self]; [myItem setAction: @selector(doNamedSrch:)]; [searchNameMenu selectItem: myItem]; MAKEDIRTY; } } -(IBAction) cancelNamedSrch: (id) Sender { [searchNameSheet orderOut: Sender]; [NSApp endSheet: searchNameSheet returnCode: 0]; } -(IBAction) okNamedSrch: (id) Sender { [searchNameSheet orderOut: Sender]; [NSApp endSheet: searchNameSheet returnCode: 1]; } -(IBAction) addNamedSrch: (id) Sender { NSWindow *who; [searchNameSheetField setStringValue: @""]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: searchNameSheet modalForWindow: myWindow modalDelegate: self didEndSelector: @selector(namedSrchDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(IBAction) delNamedSrch: (id) Sender { NSMutableString *who; if([searchNameMenu numberOfItems] <= 0) return; if(NSYESNOQUESTION(@"This will delete the selected \"named search.\" Continue?") == NO) return; who = [[NSMutableString alloc] init]; [who setString: [[searchNameMenu selectedItem] title]]; [searchNameMenu removeItemWithTitle: who]; [namedSrch removeObjectForKey: who]; [who release]; MAKEDIRTY; } -(IBAction) delAllNamedSearch: (id) Sender { if(NSYESNOQUESTION(@"This will delete all \"named searches.\" Continue?") == NO) return; [searchNameMenu removeAllItems]; [namedSrch removeAllObjects]; MAKEDIRTY; } -(IBAction) doNamedSrch: (id) Sender { NSDictionary *who; int n; if([searchNameMenu numberOfItems] <= 0) return; who = [namedSrch objectForKey: [[searchNameMenu selectedItem] title]]; if(who == nil) return; if([[who objectForKey: @"version"] intValue] >= 1) { int st; st = [[who objectForKey: @"searchType"] intValue]; [self setupSearchMode: st]; [searchStringView setStringValue: [who objectForKey: @"limit"]]; [coderIDView setStringValue: [who objectForKey: @"coder"]]; [rawButton setIntValue: [[who objectForKey: @"raw"] intValue]]; [emptyButton setIntValue: [[who objectForKey: @"empty"] intValue]]; [exactButton setIntValue: [[who objectForKey: @"exact"] intValue]]; n = [[who objectForKey: @"searchType"] intValue]; [searchTypeMenu selectItemAtIndex: st]; } //if([who count] != 2) return; //[searchStringView setStringValue: [who objectAtIndex: 0]]; //[coderIDView setStringValue: [who objectAtIndex: 1]]; } -(void) addAutoSet: (NSMutableDictionary *) what withName: (NSString *) who { [autoSetDict setObject: what forKey: who]; MAKEDIRTY; } -(NSMutableDictionary *) autoSetForName: (NSString *) who { return [autoSetDict objectForKey: who]; } -(void) removeAutoSetForName: (NSString *) who { [autoSetDict removeObjectForKey: who]; MAKEDIRTY; } -(NSArray *) allAutoSetNames { return [autoSetDict allKeys]; } -(IBAction) removeAllAutoSets: (id) sender { if(NSYESNOQUESTION(@"This will delete all project wide auto sets. Procede?") == YES) [autoSetDict removeAllObjects]; [self rebuildAutoSetMenu]; } -(BOOL) reanalysisMode{return reanalysisMode;} -(void) setReanalysisMode: (BOOL) value {reanalysisMode = value;} -(IBAction) doToggleReanalysisMode: (id) sender { NSMutableDictionary *aa = [NSMutableDictionary dictionary]; if(reanalysisMode == YES) { [aa setObject: @"OFF" forKey: @"state"]; reanalysisMode = NO; [sender setState: NSOffState]; [[NSNotificationCenter defaultCenter] postNotificationName: @"TAGoReanalysisMode" object: self userInfo: aa]; } else { [aa setObject: @"ON" forKey: @"state"]; reanalysisMode = YES; [sender setState: NSOnState]; [[NSNotificationCenter defaultCenter] postNotificationName: @"TAGoReanalysisMode" object: self userInfo: aa]; } } -(void) dummy:(id) sender{} -(void) rebuildAutoSetMenu { int i, n, m; NSMenu *asmn; NSMutableArray *w2; asmn = [[[NSApp delegate] autoSetMenu] submenu]; m = [asmn numberOfItems]; if(m > AUTOSETBASE) for(i = AUTOSETBASE; i < m; i++) { [asmn removeItemAtIndex: AUTOSETBASE]; } w2 = [NSMutableArray arrayWithArray: [self allAutoSetNames]]; [w2 sortUsingFunction: menuStringComp context: nil]; n = [w2 count]; if(n > 0) { for(i=0; i< n; i++) { [asmn addItemWithTitle: [w2 objectAtIndex: i] action: @selector(dummy:) keyEquivalent: @""]; } } } - (void) windowDidBecomeKey:(NSNotification *)aNotification { //[self renewNamedSelMenu]; [self rebuildAutoSetMenu]; { if([self reanalysisMode] == YES) { [[[NSApp delegate] reanalysisMenu] setState: NSOnState]; } else { [[[NSApp delegate] reanalysisMenu] setState: NSOffState]; } } [self rebuildCodeSetMenu]; [self rebuildFileSetMenu]; [self rebuildSummReportMenu]; [self updateCodeCount]; } - (void)updateCodeCount { /* if ([codeSetCurrName isEqualToString:@""] == YES) [codeCountView setIntValue: [[self allCodeList] count]]; else [codeCountView setIntValue: [codeSets objectForKey: codeSetCurrName]]; */ [codeCountView setIntValue: [[self hotCodeList] count]]; [searchCountView setIntValue: [[self searchList] count]]; } - (int)numberOfRowsInTableView:(NSTableView *)aTableView { if(aTableView == codeSetTable) return [[self allCodeList] count]; if(aTableView == fileSetTable) return [[self allFileList] count]; if(aTableView == fileListView) { if(allFiles != nil) return [[self getHotFileList] count]; else return 0; } } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { if(aTableView == codeSetTable) return [[self allCodeList] objectAtIndex: rowIndex]; if(aTableView == fileSetTable) return [[[self allFileList] objectAtIndex: rowIndex] name]; if(aTableView == fileListView) { return [[[self getHotFileList] objectAtIndex: rowIndex] name]; } } - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { if(aTableView == fileListView) return NO; } - (void) codeSetDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [self rebuildCodeSetMenu]; MAKEDIRTY; } -(IBAction) codeSetSelAll:(id) sender { [codeSetTable selectAll: nil]; } -(IBAction) codeSetSelNone:(id) sender { [codeSetTable deselectAll: nil]; } -(void) rebuildCodeSetPopMenu { [codeSetPopMenu removeAllItems]; FORALL([self allCodeSetNames]) { [[codeSetPopMenu menu] addItemWithTitle: temp action: @selector(showCodeSet:) keyEquivalent: @""]; } ENDFORALL; } -(IBAction) codeSetDelAll: (id) sender { if(NSYESNOQUESTION(@"Delete all code sets?") == YES) { [codeSetCurrName setString: @""]; [self rebuildCodeSetMenu]; [self broadcastCodeChange: NO]; [codeSets removeAllObjects]; [self rebuildCodeSetPopMenu]; } } -(IBAction) codeSetDel: (id) sender { if(NSYESNOQUESTION(@"Delete selected code set?") == YES) { if([codeSetCurrName isEqualToString: [[codeSetPopMenu selectedItem] title]] == YES) { [codeSetCurrName setString: @""]; [self rebuildCodeSetMenu]; [self broadcastCodeChange: NO]; } [codeSets removeObjectForKey: [[codeSetPopMenu selectedItem] title]]; [self rebuildCodeSetPopMenu]; } } -(void) loadAllCodes: (id) sender { if(tempCodeSet == YES) { [tempCodeList removeAllObjects]; } [codeSetCurrName setString: @""]; tempCodeSet = NO; [self rebuildCodeSetMenu]; [self broadcastCodeChange: NO]; MAKEDIRTY; } -(void) loadCodeSet: (id) sender { if(tempCodeSet == YES) { [tempCodeList removeAllObjects]; } [codeSetCurrName setString: [sender title]]; tempCodeSet = NO; [self rebuildCodeSetMenu]; [self broadcastCodeChange: NO]; MAKEDIRTY; } -(void) loadCurrCodeSet { [self rebuildCodeSetMenu]; [self broadcastCodeChange: NO]; } -(IBAction) showCodeSet: (id) sender { int i, j, m, n; NSArray *hc = [self allCodeList]; NSArray *tc; NSString *who; if([codeSetPopMenu selectedItem] == nil )return; [self codeSetSelNone: nil]; tc = [codeSets objectForKey: [[codeSetPopMenu selectedItem] title]]; [codeSetName setStringValue: [[codeSetPopMenu selectedItem] title]]; m = [hc count]; n = [tc count]; for(j = 0; j < n; j++) { who = [tc objectAtIndex: j]; for(i = 0; i < m; i++) { if([who isEqualToString: [hc objectAtIndex: i]] == YES) { [codeSetTable selectRow: i byExtendingSelection: YES]; } } } } -(IBAction) codeSetSel: (id) sender { [self codeSetSelNone: sender]; [self codeSetSelMore: sender]; } -(IBAction) codeSetSelLess: (id) sender { NSEnumerator *oe = [codeSetTable selectedRowEnumerator]; NSNumber *sr; NSArray *hc = [self allCodeList]; NSString *fs = [codeSetSelString stringValue]; AGRegex *regex; AGRegexMatch *match; if([codeSetSelRegex state] == NSOnState) regex = [[AGRegex alloc] initWithPattern: fs options: (AGRegexCaseInsensitive|AGRegexMultiline)]; while((sr = [oe nextObject]) != nil) { if([codeSetSelRegex state] == NSOffState) { if([codeSetSelExact state] == NSOnState) { if([[hc objectAtIndex: [sr intValue]] isEqualToString: fs] == YES) { [codeSetTable deselectRow: [sr intValue]]; } } else { if(([[hc objectAtIndex: [sr intValue]] rangeOfString: fs].location) != NSNotFound) { [codeSetTable deselectRow: [sr intValue]]; } } } else { match = [regex findInString: [hc objectAtIndex: [sr intValue]]]; if([match count]) [codeSetTable deselectRow: [sr intValue]]; } } if([codeSetSelRegex state] == NSOnState) [regex release]; } -(IBAction) codeSetSelMore: (id) sender { NSArray *hc = [self allCodeList]; NSString *fs = [codeSetSelString stringValue]; AGRegex *regex; AGRegexMatch *match; if([codeSetSelRegex state] == NSOnState) regex = [[AGRegex alloc] initWithPattern: fs options: (AGRegexCaseInsensitive|AGRegexMultiline)]; FORALL(hc) { if([codeSetSelRegex state] == NSOffState) { if([codeSetSelExact state] == NSOnState) { if([temp isEqualToString: fs] == YES) { [codeSetTable selectRow: __i byExtendingSelection: YES]; } } else { if(([temp rangeOfString: fs].location) != NSNotFound) { [codeSetTable selectRow: __i byExtendingSelection: YES]; } } } else { match = [regex findInString: temp]; if([match count]) [codeSetTable selectRow: __i byExtendingSelection: YES]; } } ENDFORALL; if([codeSetSelRegex state] == NSOnState) [regex release]; } -(NSString *) currCodeSet { return codeSetCurrName; } -(BOOL) isCodeSet { if([codeSetCurrName isEqualToString: @""] == YES) return NO; return YES; } -(NSArray *) codesInCodeSet: (NSString *) who { return [codeSets objectForKey: who]; } -(BOOL) codeSetExists: (NSString *) who { if([codeSets objectForKey: who] == nil) return NO; else return YES; } -(void) registerCodeSet: (NSString *) who withCodes: (NSMutableArray *) what force: (BOOL) ff { if([self codeSetExists: who] == NO || ff) { [codeSets setObject: what forKey: who]; [self rebuildCodeSetMenu]; MAKEDIRTY; } } -(IBAction) addHotListToSearch: (id) sender { NSMutableString *currStr = [NSMutableString string]; NSArray *hcl; [currStr setString: [searchStringView stringValue]]; hcl = [self getHotCodeList]; if([hcl count] > 0) { if([currStr length] > 0) [currStr appendString: @", "]; [currStr appendString: [hcl componentsJoinedByString: @", "]]; [searchStringView setStringValue: currStr]; } } -(void) clearTempCodeStack { [tempCodeStack removeAllObjects]; } -(NSString *) popTempCodeStack { NSDictionary *who; NSString *ss; //NSLog(@"stack size = %d\n", [tempCodeStack count]); if([tempCodeStack count] == 0) return nil; who = [tempCodeStack lastObject]; ss = [who objectForKey: @"name"]; [ss retain]; //NSLog(@"name = %@\n", ss); [codeSetCurrName setString: [who objectForKey: @"prompt"]]; [tempCodeList removeAllObjects]; [tempCodeList addObjectsFromArray: [who objectForKey: @"codes"]]; [self broadcastCodeChange: NO]; [tempCodeStack removeLastObject]; [ss autorelease]; //NSLog(@"last name = %@\n", ss); return ss; } -(void) convertTempToRealCodeSet: (NSString *) who { if(tempCodeSet == NO) { NSWARNING(@"Current code set is not a quick selection."); return ; } if([codeSets objectForKey: who] != nil) { if( NSYESNOQUESTION(@"Write over existing code set with this name?") == NO) return ; } [codeSets setObject: [NSMutableArray arrayWithArray: tempCodeList] forKey: [[who copy] autorelease]]; [codeSetCurrName setString: who]; tempCodeSet = NO; [tempCodeList removeAllObjects]; [self broadcastCodeChange: NO]; MAKEDIRTY; } -(void) selectTempCodeSetWithin: (NSString *) who { AGRegex *regex; AGRegexMatch *match; NSMutableArray *hcl; if(who == nil) return; if([who isEqualToString: @""]) return; hcl = [NSMutableArray array]; regex = [[AGRegex alloc] initWithPattern: who options: (AGRegexCaseInsensitive|AGRegexMultiline)]; //erase the current set if(tempCodeSet == NO) { [tempCodeList removeAllObjects]; [tempCodeList addObjectsFromArray: [self getHotCodeList]]; } FORALL(tempCodeList) { match = [regex findInString: temp]; if([match count]) { [hcl addObject: temp]; } else { if([gPrefBoss checkCodeDef]) { NSString *myDef; myDef = [self getDefinition: temp]; if([myDef isEqualToString: @""] == NO) { match = [regex findInString: myDef]; if([match count]) [hcl addObject: temp]; } //look it up and check it } } } ENDFORALL; //add the current set { [tempCodeList removeAllObjects]; } [tempCodeList addObjectsFromArray: hcl]; [tempCodeList sortUsingFunction: nsStringComp context: nil]; [codeSetCurrName appendString: [NSString stringWithFormat: @", %@",who]];; tempCodeSet = YES; { NSMutableDictionary *myEntry; myEntry = [NSMutableDictionary dictionary]; while([tempCodeStack count] >= [gPrefBoss hclStackSize] && [tempCodeStack count] > 0) [tempCodeStack removeObjectAtIndex: 0]; [myEntry setObject: [NSString stringWithString: who] forKey: @"name"]; [myEntry setObject: [NSArray arrayWithArray: tempCodeList] forKey: @"codes"]; [myEntry setObject: [NSString stringWithString: codeSetCurrName] forKey: @"prompt"]; [tempCodeStack addObject: myEntry]; } [regex release]; [self setCodeListDirty]; [self broadcastCodeChange: NO]; } -(void) loadTempCodeSet: (NSString *) who { AGRegex *regex; AGRegexMatch *match; NSArray *hc = [self allCodeList]; NSMutableArray *hcl; if(who == nil) return; if([who isEqualToString: @""]) return; hcl = [NSMutableArray array]; regex = [[AGRegex alloc] initWithPattern: who options: (AGRegexCaseInsensitive|AGRegexMultiline)]; //erase the current set if(tempCodeSet == YES) { [tempCodeList removeAllObjects]; } FORALL(hc) { match = [regex findInString: temp]; if([match count]) { [hcl addObject: temp]; } else { if([gPrefBoss checkCodeDef]) { NSString *myDef; myDef = [self getDefinition: temp]; if([myDef isEqualToString: @""] == NO) { match = [regex findInString: myDef]; if([match count]) [hcl addObject: temp]; } //look it up and check it } } } ENDFORALL; //add the current set [tempCodeList addObjectsFromArray: hcl]; [tempCodeList sortUsingFunction: nsStringComp context: nil]; [codeSetCurrName setString: who]; { NSMutableDictionary *myEntry; myEntry = [NSMutableDictionary dictionary]; while([tempCodeStack count] >= [gPrefBoss hclStackSize] && [tempCodeStack count] > 0) [tempCodeStack removeObjectAtIndex: 0]; [myEntry setObject: [NSString stringWithString: who] forKey: @"name"]; [myEntry setObject: [NSArray arrayWithArray: tempCodeList] forKey: @"codes"]; [myEntry setObject: [NSString stringWithString: codeSetCurrName] forKey: @"prompt"]; [tempCodeStack addObject: myEntry]; } tempCodeSet = YES; [regex release]; [self setCodeListDirty]; [self broadcastCodeChange: NO]; } -(void) selectTempCodeSetFewer: (NSString *) who { AGRegex *regex; AGRegexMatch *match; NSMutableArray *hcl; if(who == nil) return; if([who isEqualToString: @""]) return; hcl = [NSMutableArray array]; regex = [[AGRegex alloc] initWithPattern: who options: (AGRegexCaseInsensitive|AGRegexMultiline)]; //erase the current set FORALL(tempCodeList) { BOOL found; found = NO; match = [regex findInString: temp]; if([match count]) { found = YES; } else { if([gPrefBoss checkCodeDef]) { NSString *myDef; myDef = [self getDefinition: temp]; if([myDef isEqualToString: @""] == NO) { match = [regex findInString: myDef]; if([match count]) found = YES; } //look it up and check it } } if(found == NO) { [hcl addObject: [[temp copy] autorelease]]; } } ENDFORALL; //add the current set [tempCodeList removeAllObjects]; [tempCodeList addObjectsFromArray: hcl]; [tempCodeList sortUsingFunction: nsStringComp context: nil]; [codeSetCurrName appendString: [NSString stringWithFormat: @"-%@",who]]; tempCodeSet = YES; { NSMutableDictionary *myEntry; myEntry = [NSMutableDictionary dictionary]; while([tempCodeStack count] >= [gPrefBoss hclStackSize] && [tempCodeStack count] > 0) [tempCodeStack removeObjectAtIndex: 0]; [myEntry setObject: [NSString stringWithString: who] forKey: @"name"]; [myEntry setObject: [NSArray arrayWithArray: tempCodeList] forKey: @"codes"]; [myEntry setObject: [NSString stringWithString: codeSetCurrName] forKey: @"prompt"]; [tempCodeStack addObject: myEntry]; } [regex release]; [self setCodeListDirty]; [self broadcastCodeChange: NO]; } -(void) selectTempCodeSetMore: (NSString *) who { AGRegex *regex; AGRegexMatch *match; NSArray *hc = [self allCodeList]; NSMutableArray *hcl; if(who == nil) return; if([who isEqualToString: @""]) return; hcl = [NSMutableArray array]; regex = [[AGRegex alloc] initWithPattern: who options: (AGRegexCaseInsensitive|AGRegexMultiline)]; //erase the current set if(tempCodeSet == YES) { [hcl addObjectsFromArray: tempCodeList]; } FORALL(hc) { match = [regex findInString: temp]; if([match count]) { addUniqueToArray(hcl, [[temp copy] autorelease]); } else { if([gPrefBoss checkCodeDef]) { NSString *myDef; myDef = [self getDefinition: temp]; if([myDef isEqualToString: @""] == NO) { match = [regex findInString: myDef]; if([match count]) addUniqueToArray(hcl, [[temp copy] autorelease]); } //look it up and check it } } } ENDFORALL; //add the current set [tempCodeList removeAllObjects]; [tempCodeList addObjectsFromArray: hcl]; [tempCodeList sortUsingFunction: nsStringComp context: nil]; [codeSetCurrName appendString: [NSString stringWithFormat: @"+%@",who]]; tempCodeSet = YES; { NSMutableDictionary *myEntry; myEntry = [NSMutableDictionary dictionary]; while([tempCodeStack count] >= [gPrefBoss hclStackSize] && [tempCodeStack count] > 0) [tempCodeStack removeObjectAtIndex: 0]; [myEntry setObject: [NSString stringWithString: who] forKey: @"name"]; [myEntry setObject: [NSArray arrayWithArray: tempCodeList] forKey: @"codes"]; [myEntry setObject: [NSString stringWithString: codeSetCurrName] forKey: @"prompt"]; [tempCodeStack addObject: myEntry]; } [regex release]; [self setCodeListDirty]; [self broadcastCodeChange: NO]; } -(void) addCodeToCurrSet: (NSString *) who { NSMutableArray *na = [NSMutableArray array]; if(tempCodeSet) { [tempCodeList addObject: [[who copy] autorelease]]; [tempCodeList sortUsingFunction: nsStringComp context: nil]; return; } if([codeSetCurrName isEqualToString: @""] == YES) return; [na addObjectsFromArray: [self getHotCodeList]]; [na addObject: [[who copy] autorelease]]; [codeSets setObject: na forKey: codeSetCurrName]; MAKEDIRTY; } -(NSArray *) allCodeSetNames { NSMutableArray *ans =[NSMutableArray array]; [ans addObjectsFromArray: [codeSets allKeys]]; [ans sortUsingFunction: menuStringComp context: nil]; return ans; } -(void) rebuildCodeSetMenu: (NSMenu *) asmn withSel: (SEL) mysel at: (int) start showState: (BOOL) st { int i, n, m; NSMutableArray *w2; m = [asmn numberOfItems]; if(m > start) for(i = start; i < m; i++) { [asmn removeItemAtIndex: start]; } w2 = [NSMutableArray arrayWithArray: [self allCodeSetNames]]; [w2 sortUsingFunction: menuStringComp context: nil]; n = [w2 count]; if(n > 0) { [asmn addItem: [NSMenuItem separatorItem]]; for(i=0; i< n; i++) { [asmn addItemWithTitle: [w2 objectAtIndex: i] action: mysel keyEquivalent: @""]; } if([codeSetCurrName isEqualToString: @""] == NO && st) { [[asmn itemWithTitle: codeSetCurrName] setState: NSOnState]; } } } -(void) rebuildCodeSetMenu: (NSMenu *) asmn at: (int) start { [self rebuildCodeSetMenu: asmn withSel: @selector(loadCodeSet:) at: start showState: YES]; } -(void) rebuildCodeSetMenu { [self rebuildCodeSetMenu: [[[NSApp delegate] codeSetMenu] submenu] at: CODESETBASE]; [self rebuildCodeSetMenu: [codeSetPopMenu2 menu] at: CODESETBASE2]; /* [self rebuildCodeSetMenu: [[[NSApp delegate] rsltCodeSetMenu] submenu] withSel: @selector(selectCodeSet:) at: CODESETBASE3 showState: NO]; */ } -(IBAction) codeSetAdd: (id) sender { NSMutableArray *csa, *hc; NSEnumerator *oe = [codeSetTable selectedRowEnumerator]; NSNumber *sr; csa = [NSMutableArray array]; hc = [self allCodeList]; while((sr = [oe nextObject]) != nil) { [csa addObject: [[[hc objectAtIndex: [sr intValue]] copy] autorelease]]; } if([[codeSetName stringValue] isEqualToString: @""] == YES) { NSWARNING(@"You must name the current set"); } else if([csa count] == 0) { NSWARNING(@"You must select the codes you want in the set before saving"); } else { [codeSets setObject: csa forKey: [codeSetName stringValue]]; [self rebuildCodeSetPopMenu]; [codeSetPopMenu selectItemWithTitle: [codeSetName stringValue]]; } } -(IBAction) codeSetClose: (id) Sender { [codeSetPane orderOut: Sender]; [NSApp endSheet: codeSetPane returnCode: 0]; } -(IBAction) editCodeSet: (id) Sender { NSWindow *who; NSArray *hc; hc = [self allCodeList]; [codeSetName setStringValue: @""]; [self rebuildCodeSetPopMenu]; [codeSetTable reloadData]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: codeSetPane modalForWindow: who modalDelegate: self didEndSelector: @selector(codeSetDidEnd:returnCode:contextInfo:) contextInfo: nil]; } /* -----------------------------------------------------*/ -(IBAction) fileSetSelAll:(id) sender { [fileSetTable selectAll: nil]; } -(IBAction) fileSetSelNone:(id) sender { [fileSetTable deselectAll: nil]; } -(IBAction) fileSetDelAll: (id) sender { if(NSYESNOQUESTION(@"Delete all file sets?") == YES) { [fileSetCurrName setString: @""]; [self reloadFileSet]; [fileSets removeAllObjects]; [self rebuildFileSetPopMenu]; } } -(IBAction) fileSetDel: (id) sender { if(NSYESNOQUESTION(@"Delete selected file set?") == YES) { if([fileSetCurrName isEqualToString: [[fileSetPopMenu selectedItem] title]] == YES) { [fileSetCurrName setString: @""]; [self reloadFileSet]; } [fileSets removeObjectForKey: [[fileSetPopMenu selectedItem] title]]; [self rebuildFileSetPopMenu]; } } -(IBAction) loadAllFiles: (id) sender { [self loadFileSetWithName: @""]; MAKEDIRTY; } -(void) loadFileSet: (id) sender { [self loadFileSetWithName: [sender title]]; MAKEDIRTY; } -(void) loadFileSetWithName: (NSString *) who { NSString *tmp; [fileSetCurrName setString: who]; [self rebuildFileSetMenu]; [fileListView reloadData]; if([who isEqualToString: @"Results"] == YES) fileViewMode = RESULTMODE; else fileViewMode = FILEMODE; if([who isEqualToString: @""] == YES) { NSSETHEADER(fileListView, @"Files",@"Files"); } else { tmp =[NSString stringWithFormat: @"Files: %@", who]; NSSETHEADER(fileListView, @"Files", tmp); } fList = [self hotFileSet]; } -(void) reloadFileSet { [self loadFileSetWithName: [[fileSetCurrName copy] autorelease]]; } -(IBAction) showFileSet: (id) sender { int i, j, m, n; NSArray *hc = [self allFileList]; NSArray *tc; NSString *who; if([fileSetPopMenu selectedItem] == nil )return; [self fileSetSelNone: nil]; tc = [fileSets objectForKey: [[fileSetPopMenu selectedItem] title]]; [fileSetName setStringValue: [[fileSetPopMenu selectedItem] title]]; m = [hc count]; n = [tc count]; for(j = 0; j < n; j++) { who = [tc objectAtIndex: j]; for(i = 0; i < m; i++) { if(who == [hc objectAtIndex: i]) { [fileSetTable selectRow: i byExtendingSelection: YES]; } } } } -(void) rebuildFileSetPopMenu { [fileSetPopMenu removeAllItems]; FORALL([self dataFileSetNames]) { [[fileSetPopMenu menu] addItemWithTitle: temp action: @selector(showFileSet:) keyEquivalent: @""]; } ENDFORALL; } -(IBAction) fileSetSel: (id) sender { [self fileSetSelNone: sender]; [self fileSetSelMore: sender]; } -(IBAction) fileSetSelLess: (id) sender { NSEnumerator *oe = [fileSetTable selectedRowEnumerator]; NSNumber *sr; NSArray *hc = [self allFileList]; NSString *fs = [fileSetSelString stringValue]; AGRegex *regex; AGRegexMatch *match; if([fileSetSelRegex state] == NSOnState) regex = [[AGRegex alloc] initWithPattern: fs options: (AGRegexCaseInsensitive|AGRegexMultiline)]; while((sr = [oe nextObject]) != nil) { if([fileSetSelRegex state] == NSOffState) { if([fileSetSelExact state] == NSOnState) { if([[[hc objectAtIndex: [sr intValue]] name] isEqualToString: fs] == YES) { [fileSetTable deselectRow: [sr intValue]]; } } else { if(([[[hc objectAtIndex: [sr intValue]] name] rangeOfString: fs].location) != NSNotFound) { [fileSetTable deselectRow: [sr intValue]]; } } } else { match = [regex findInString: [[hc objectAtIndex: [sr intValue]] name]]; if([match count]) [fileSetTable deselectRow: [sr intValue]]; } } if([fileSetSelRegex state] == NSOnState) [regex release]; } -(NSArray *) allFileList { return allFiles; } -(IBAction) fileSetSelMore: (id) sender { NSArray *hc = [self allFileList]; NSString *fs = [fileSetSelString stringValue]; AGRegex *regex; AGRegexMatch *match; if([fileSetSelRegex state] == NSOnState) regex = [[AGRegex alloc] initWithPattern: fs options: (AGRegexCaseInsensitive|AGRegexMultiline)]; FORALL(hc) { if([fileSetSelRegex state] == NSOffState) { if([fileSetSelExact state] == NSOnState) { if([[temp name] isEqualToString: fs] == YES) { [fileSetTable selectRow: __i byExtendingSelection: YES]; } } else { if(([[temp name] rangeOfString: fs].location) != NSNotFound) { [fileSetTable selectRow: __i byExtendingSelection: YES]; } } } else { match = [regex findInString: [temp name]]; if([match count]) [fileSetTable selectRow: __i byExtendingSelection: YES]; } } ENDFORALL; } -(NSArray *) getHotFileList { return [self hotFileSet]; } -(int) hotFileCount { if([fileSetCurrName isEqualToString: @""] == YES) return [[self allFileList] count]; return [[fileSets objectForKey: fileSetCurrName] count]; } -(NSArray *) hotFileSet { if([fileSetCurrName isEqualToString: @""] == YES) return [self allFileList]; return [fileSets objectForKey: fileSetCurrName]; } -(NSString *) currFileSet { return fileSetCurrName; } -(BOOL) isFileSet { if([fileSetCurrName isEqualToString: @""] == YES) return NO; return YES; } -(void) removeFile: (MWFile *) who fromSet: (NSString *) s { NSMutableArray *na = [NSMutableArray array]; NSArray *extant; if([s isEqualToString: @""] == YES) return; extant = [fileSets objectForKey: s]; if(extant != nil) [na addObjectsFromArray: extant]; [na removeObject: who]; [fileSets setObject: na forKey: s]; if([s isEqualToString: fileSetCurrName] == YES) fList = na; } -(void) addFile: (MWFile *) who toSet: (NSString *) s { NSMutableArray *na = [NSMutableArray array]; NSArray *extant; if([s isEqualToString: @""] == YES) return; extant = [fileSets objectForKey: s]; if(extant != nil) [na addObjectsFromArray: extant]; [na addObject: who]; [fileSets setObject: na forKey: s]; if([s isEqualToString: fileSetCurrName] == YES) fList = na; } -(void) addFileToCurrSet: (MWFile *) who { NSMutableArray *na = [NSMutableArray array]; if([fileSetCurrName isEqualToString: @""] == YES) return; [na addObjectsFromArray: [self getHotFileList]]; [na addObject: who]; [fileSets setObject: na forKey: fileSetCurrName]; fList = na; } -(NSArray *) allFileSetNames { NSMutableArray *ans =[NSMutableArray array]; [ans addObjectsFromArray: [fileSets allKeys]]; [ans sortUsingFunction: menuStringComp context: nil]; return ans; } -(NSArray *) dataFileSetNames { NSMutableArray *tmp, *ans = [NSMutableArray array]; tmp = [self allFileSetNames]; FORALL(tmp) { if([temp isEqualToString: @"Results"] == NO) [ans addObject: [[temp copy] autorelease]]; } ENDFORALL; [ans sortUsingFunction: menuStringComp context: nil]; return ans; } -(void) rebuildFileSetMenuFor: (NSMenu *) asmn at: (int) start { int i, n, m; NSMutableArray *w2; m = [asmn numberOfItems]; if(m > start) for(i = start; i < m; i++) { [asmn removeItemAtIndex: start]; } w2 = [NSMutableArray arrayWithArray: [self allFileSetNames]]; [w2 sortUsingFunction: menuStringComp context: nil]; n = [w2 count]; if(n > 0) { [asmn addItem: [NSMenuItem separatorItem]]; for(i=0; i< n; i++) { [asmn addItemWithTitle: [w2 objectAtIndex: i] action: @selector(loadFileSet:) keyEquivalent: @""]; } if([fileSetCurrName isEqualToString: @""] == NO) { [[asmn itemWithTitle: fileSetCurrName] setState: NSOnState]; } } } -(void) rebuildFileSetMenu { [self rebuildFileSetMenuFor: [[[NSApp delegate] fileSetMenu] submenu] at: FILESETBASE]; [self rebuildFileSetMenuFor: [fileSetPopMenu2 menu] at: FILESETBASE2]; } -(IBAction) fileSetAdd: (id) sender { NSMutableArray *csa, *hc; NSEnumerator *oe = [fileSetTable selectedRowEnumerator]; NSNumber *sr; csa = [NSMutableArray array]; hc = [self allFileList]; while((sr = [oe nextObject]) != nil) { [csa addObject: [hc objectAtIndex: [sr intValue]] ]; } if([[fileSetName stringValue] isEqualToString: @""] == YES) NSWARNING(@"You must name the current set") else { [fileSets setObject: csa forKey: [fileSetName stringValue]]; [self rebuildFileSetPopMenu]; [fileSetPopMenu selectItemWithTitle: [fileSetName stringValue]]; } } -(IBAction) fileSetClose: (id) Sender { [fileSetPane orderOut: Sender]; [NSApp endSheet: fileSetPane returnCode: 0]; } - (void) fileSetDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { [self rebuildFileSetMenu]; MAKEDIRTY; } -(IBAction) editFileSet: (id) Sender { NSWindow *who; [fileSetName setStringValue: @""]; [self rebuildFileSetPopMenu]; [fileSetTable reloadData]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: fileSetPane modalForWindow: who modalDelegate: self didEndSelector: @selector(fileSetDidEnd:returnCode:contextInfo:) contextInfo: nil]; } /* summary report***************************************** */ -(BOOL) isMySummReport: (NSString *) who { NSArray *a; a = [self mySummReports]; FORALL(a) { if([temp isEqualToString: who]) return YES; } ENDFORALL; return NO; } -(void) addSummReport:(NSString *) who report: (NSDictionary *) r global: (BOOL) g { if(g == YES) { [summReports setObject:r forKey: who]; [self rebuildSummReportMenu]; MAKEDIRTY; } } -(void) delSummReport:(NSString *) who { if([self isMySummReport: who]) { [summReports removeObjectForKey: who]; [self rebuildSummReportMenu]; MAKEDIRTY; } } -(NSDictionary *) summReport: (NSString *) who { NSDictionary *ans; ans = [summReports objectForKey: who]; if(ans == nil) return nil; else return ans; } -(NSArray *) mySummReports { return [summReports allKeys]; } -(void) rebuildSummReportMenu { int i, n, m; NSMenu *asmn; NSMutableArray *w1, *w2; asmn = [[[NSApp delegate] summReportMenu] submenu]; m = [asmn numberOfItems]; if(m > SUMMREPORTBASE) for(i = SUMMREPORTBASE; i < m; i++) { [asmn removeItemAtIndex: SUMMREPORTBASE]; } w1 = [NSMutableArray arrayWithArray: [self mySummReports]]; [w1 sortUsingFunction: nsStringComp context: nil]; //who = [self allSetNames]; if((m = [w1 count]) > 0) { [asmn addItem: [NSMenuItem separatorItem]]; for(i=0; i< m; i++) { [asmn addItemWithTitle: [w1 objectAtIndex: i] action: nil keyEquivalent: @""]; } } } -(IBAction) doDotGraph: (id) sender { NSArray *hcl; NSString *theName; NSString *pp, *ss; NSMutableString *ans; NSMutableArray *nodeArray; NSTask *mytask; NSFileHandle *h; /* if([[NSWorkspace sharedWorkspace] fullPathForApplication: @"Graphviz"] == nil) { NSWARNING(@"You need to install Graphviz to use this function. See the documentation."); return; } */ ans =[NSMutableString string]; nodeArray = [NSMutableArray array]; theName = [NSString stringWithFormat: @"/tmp/tams codetree %@.dot", uniqueFileName()]; //theName = [NSString stringWithFormat: @"/tmp/tamstemp.dot"]; //get the hot code list hcl = [self hotCodeList]; [ans appendString: @"digraph codetree {\n"]; //for every code FORALL(hcl) { NSString *theString; theString = temp; while(theString != nil) { //create a node with terminus as its label ss = [NSString stringWithFormat: @"\"%@\"[label=\"%@\"]\n", theString, terminusOf(theString)]; addUniqueToArray(nodeArray, ss); theString = parentOf(theString); } } ENDFORALL; FORALL(nodeArray) { [ans appendString: temp]; } ENDFORALL; [nodeArray removeAllObjects]; //for every code FORALL(hcl) { NSString *whole; whole = temp; while((pp = parentOf(whole)) != nil) { ss = [NSString stringWithFormat: @"\"%@\"->\"%@\"\n", pp, whole]; addUniqueToArray(nodeArray, ss); whole = pp; } } ENDFORALL; FORALL(nodeArray) { [ans appendString: temp]; } ENDFORALL; [ans appendString: @"}\n"]; //does it have a parent? //create edge between self and parent //make the graph [ans writeToFile: theName atomically: YES]; //if(saveFlag == NO) // [[NSWorkspace sharedWorkspace] openFile:theName withApplication: @"Graphviz.app"]; mytask = [[NSTask alloc] init]; [mytask setLaunchPath: [gPrefBoss dotDir]]; [mytask setArguments: [NSArray arrayWithObjects: @"-Tps", [NSString stringWithFormat: @"-o%@.ps",theName],theName, nil]]; /* [[NSFileManager defaultManager] createFileAtPath: [NSString stringWithFormat: @"%@.ps", theName] contents: @"" attributes: [NSDictionary dictionary]]; [mytask setStandardOutput: [NSFileHandle fileHandleForWritingAtPath: [NSString stringWithFormat: @"%@.ps", theName]]]; */ [mytask launch]; //[mytask waitUntilExit]; if([gPrefBoss useGV] == 1) { NSLog(@"Using gv\n"); [NSTask launchedTaskWithLaunchPath: [gPrefBoss gvDir] arguments: [NSArray arrayWithObjects: [NSString stringWithFormat: @"%@.ps",theName], nil]]; } else if([[NSWorkspace sharedWorkspace] openFile: [NSString stringWithFormat: @"%@.ps", theName]] == NO) { NSString *mywarn, *mygraphfile; mygraphfile = [NSString stringWithFormat: @"%@.ps", theName]; mywarn = [NSString stringWithFormat: @"Could not open application for file \"%@\"", mygraphfile]; NSWARNING(mywarn); } } -(IBAction) addSelfToWorkMenu: (id) sender { NSString *fn = [self fileName]; if(fn != nil) { [[NSApp delegate] addWorkItem: fn]; } else NSWARNING(@"Project must be saved before being added to work menu."); } #ifdef MULTIMEDIA -(IBAction) convertSec2HHMMSS:(id) sender { if([searchFiles count] == 0) { NSWARNING(@"You must add files to search list."); return; } FORALL(searchFiles) { if((MWFile *)[temp open] == NO) { if([gPrefBoss batchOpenFiles]) [self openMWFile: temp type: SOURCETYPE]; else [(MWFile *)temp setOpenFakeFileWithWorkBench: self]; } [[temp filePointer] ConvertMovieTimeToHHMMSS: YES]; [temp closeFakeFile]; } ENDFORALL; } -(IBAction) convertHHMMSS2Sec:(id) sender { if([searchFiles count] == 0) { NSWARNING(@"You must add files to search list."); return; } FORALL(searchFiles) { if((MWFile *)[temp open] == NO) { if([gPrefBoss batchOpenFiles]) [self openMWFile: temp type: SOURCETYPE]; else [(MWFile *)temp setOpenFakeFileWithWorkBench: self]; } [[temp filePointer] ConvertMovieTimeToHHMMSS: NO]; [temp closeFakeFile]; } ENDFORALL; } #endif -(void) setupSearchMode: (int) smode { switch(smode) { case REGEXCHARINDEX: [coderIDPrompt setStringValue: @"Substring:"]; [coderIDView setStringValue: @"0"]; [exactButton setTitle: @"Case sens."]; [emptyButton setTitle: @"Multiline"]; break; default: [coderIDPrompt setStringValue: @"Coder IDs:"]; [coderIDView setStringValue: @""]; [exactButton setTitle: @"Exact"]; [emptyButton setTitle: @"Empty"]; break; }; } -(IBAction) initializeSearchMode: (id) sender { [self setupSearchMode: [searchTypeMenu tagOfSelectedItem]]; } @end gtamsanalyzer.app-0.42/Source/myProject_h.bk0000555000175000017500000000420310162465511021407 0ustar brentbrent00000000000000// // MyDocument.h // TA2 hot // // Created by matthew on Sat Apr 05 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import #import "MyDocument.h" #import "myProject.h" @interface myProject : NSDocument { int rawF, emptyF, exactF; int simpleF; int uniqueNumber; IBOutlet id emptyButton; IBOutlet id exactButton; IBOutlet id rawButton; IBOutlet id simpleButton; NSMutableArray *openFiles, *searchFiles; MyDocument *codeSource; MWFile *initFile; IBOutlet id codeListView; IBOutlet id codeSourceView; IBOutlet id codeSourceBox; IBOutlet id fileListView; IBOutlet id codeFileName; IBOutlet id myWindow; IBOutlet id searchListView; IBOutlet id searchStringView; IBOutlet id windowNameView; IBOutlet id coderIDView; IBOutlet id initFileName; IBOutlet id setName; IBOutlet id setMenu; NSMutableDictionary *codeList; } -(int) rawF; -(int) exactF; -(int) emptyF; -(int) simpleF; -(NSMutableString *) getDefinition: (NSString *) what; - (void) shoveWindow; - (void)windowDidUpdate:(NSNotification *)aNotification; - (BOOL) fileExists: (NSString *) who; - (BOOL) isInitFile: (MWFile *) who; -(void) newCode: (NSString *) what definition: (NSString *) info; - (id)initWithWindowNibName:(NSString *)windowNibName; - (NSMutableArray *) fileList; - (NSMutableArray *) searchList; //protocol for result documents -(NSString *) theLimitString; -(NSString *) uniqueString; -(NSString *) theWindowName; - (void)windowDidLoad; -(void) displaySelData; -(void) front; -(void) back; -(NSArray *) getHotCodeList; -(NSString *) codersList; -(NSArray *) hotCodeList; -(void) openMWFile: (MWFile *) who; -(BOOL) mwFileExists: (MWFile *) who; -(MWFile *) getMWFile; -(MWFile *) searchFileName; - (IBAction) setInitFile: (id) sender; - (IBAction)clearSearch:(id)sender; - (IBAction)doAdd:(id)sender; - (IBAction)doAddAll:(id)sender; - (IBAction)doRefresh:(id)sender; - (IBAction)doRemove:(id)sender; - (IBAction)doRemoveAll:(id)sender; - (IBAction)doSearch:(id)sender; - (IBAction)myAction:(id)sender; @end #define FILEOPEN(X) [gWorkBench fileExists: X] gtamsanalyzer.app-0.42/Source/myResult.gorm/0000755000175000017500000000000010162465511021375 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/myResult.gorm/data.classes0000644000175000017500000000677511062075651023706 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "changeFont:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontFontPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:" ); Super = NSObject; }; myResults = { Actions = ( ); Outlets = ( theResults, thisCell, recCount, dirtySourceFlag, limitField, myWindow ); Super = NSDocument; }; }gtamsanalyzer.app-0.42/Source/myResult.gorm/objects.gorm0000644000175000017500000001555211062075651023726 0ustar brentbrent00000000000000GNUstep archive00002a96:00000024:000000b1:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&% Button201NSButton1 NSControl1NSView1 NSResponder% B$ C B` A  B` A& 01 NSMutableArray1 NSArray&%01 NSButtonCell1 NSActionCell1NSCell0&01NSImage0 1NSMutableString&% common_SwitchOff0 1NSFont%&&&&&&&&%0 &0 &0 0&% common_SwitchOn&&&0& %  ScrollView101 NSScrollView% A A  D C  D C&0 &01 NSClipView% A A C C  C C&0 &01 NSTableView%  D C!  D C!&0 &%00& &&&&&&&&0 &01 NSTableColumn0&% column1 BP A GP01NSTableHeaderCell1NSTextFieldCell0&%  0% &&&&&&&&%01NSColor0&%NSNamedColorSpace0 &%System0!&%controlShadowColor0"0#&% System0$&% windowFrameTextColor0%0&&%neuf &&&&&&&&&%0'#0(&% textBackgroundColor0)#0*& %  textColor0+0,&% column2 C A GP0-0.&%  &&&&&&&&%"0/00&%nine 0&&&&&&&&%')01#02& %  gridColor0304&% System05&% controlBackgroundColor061NSTableHeaderView%  D A  D A&07 &081GSTableCornerView% @ @ A A  A A&09 &%% A @ @@0:#0;&% controlBackgroundColor0<1 NSScroller% @ A A C  A C&0= &%0> &&&&&&&&&2 _doScroll:v12@0:4@880?% A @ C A  C A&0@ &60A#0B& %  controlColor% A A A A <?0C&%NSOwner0D& %  myResults0E& %  TextField10F1 NSTextField% A C B A  B A& 0G &%0H0I&% Title0J% A`&&&&&&&&%0K0L&% System0M&% textBackgroundColor0NL0O& %  textColor0P& %  ScrollView0Q% B C C B  C B&0R &0S% A @ Cɀ B A  Cɀ B&0T &0U1 NSTextView1NSText% A  Cɀ B  Cɀ B&0V &0W0X&% System0Y&% textBackgroundColor  K K0ZX0[& %  textColor Cɀ KW0\% @ @ A B  A B&0] &%0^0_& &&&&&&&&&QS% A A A A \0`& %  TextField20a% B Cр C A  C A& 0b &%0c0d&% TitleJ&&&&&&&&%0e0f&% System0g&% textBackgroundColor0hf0i& %  textColor0j& %  TextField0k% A C B A  B A& 0l &%0m0n&% TitleJ&&&&&&&&%0o0p&% System0q&% textBackgroundColor0rp0s& %  textColor0t& %  GormNSWindow0u1NSWindow% ? A D C߀&% C D[@0v% ? A D C߀  D C߀&0w &Q0x% A C€ B A  B A& 0y &%0z 0{& %  Find record &&&&&&&&%0|&0}&&&&0~% B C Bd A  Bd A& 0 &%0 0&% Refresh &&&&&&&&%0&0&&&&kFa00&% System0&% windowBackgroundColor0&% Window0&% Window0&%Window A A F@ F@%00&%NSApplicationIcon0&% TextViewU0&% GSCustomClassMap0&0&% Buttonx0& %  TableColumn0&% GormNSTableView0& %  TableColumn1+0&% Button1~0 &01 NSNibConnectort0&%NSOwner0 P0 0 0 0 j0 E0 `0 0 0 0 0 01!NSNibOutletConnector0& %  theResults0!0&% thisCell0!j0&% recCount0!`0& %  limitField0!0&% dirtySourceFlag0!t0&% _window0!t0&% myWindow01" GSMutableSet1# NSMutableSet1$NSSet&ugtamsanalyzer.app-0.42/Source/myResults.h0000555000175000017500000002626310162465511021000 0ustar brentbrent00000000000000// // myResults.h // TAMS Edit // // Created by matthew on Sun Apr 21 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import #import "MyDocument.h" #import "varRegistry.h" #import "ctQChar.h" #import "TAMSCharEngine.h" #import "AGRegex.h" #import "MWFile.h" #define SELECT 1 #define SELECTADDITIONAL 2 #define SELECTREVERSE 3 #define SELECTFEWER 4 #define SELECTCODESET 5 #define SELALPHA 1 #define SELALPHACASE 2 #define SELEQUAL 3 #define SELGT 4 #define SELGTE 5 #define SELLT 6 #define SELLTE 7 #define SELDATE 8 #define SELBEFOREDATE 9 #define SELAFTERDATE 10 #define SELBEFOREEQDATE 11 #define SELAFTEREQDATE 12 #define SELEXACT 13 #define CODEMODENEW 0 #define CODEMODEOLD 1 #define AUTOSETBASE 8 #define SUMMREPORTBASE 1 int nsStringComp(id first, id second, void *key); int nsMWFileComp(id first, id second, void *key); @interface myResults : NSDocument { int myDocType; TAMSCharEngine *tce; BOOL closePermission; BOOL stripTags; IBOutlet NSTableView *theResults; IBOutlet NSTextView *thisCell; IBOutlet id addCodeName; IBOutlet id recodeName; IBOutlet id myColorWell; IBOutlet id inheritedColorSwitch; IBOutlet id newCodeName; IBOutlet id newCodeDef; IBOutlet id codePrompt; IBOutlet id dirtySourceFlag; IBOutlet id recCount; IBOutlet id selectSheet; IBOutlet id selectMenu; IBOutlet id selectField; IBOutlet id selectFloat; IBOutlet id selectRegexFlag; IBOutlet id dateFormatSheet; IBOutlet id dateFormatOther; IBOutlet id dateFormatMenu; IBOutlet id namedSelSheet; IBOutlet id namedSelField; IBOutlet id commentSheet; IBOutlet id commentField; IBOutlet id setMathOpMenu; IBOutlet id setMathSetMenu; IBOutlet id setMathSheet; IBOutlet id limitField; IBOutlet id codeColorMenu; IBOutlet id dotGraphWatcher; IBOutlet id exportWatcher; MWFile *myMWFID; id arBossWindow; id gWorkBench; int recodeFlag; int selectMode; NSMutableString *dfString; int dfIndex; BOOL caseSortFlag; BOOL firstUpdateFlag; //kludge so that first time it updates it wont be dirty NSMutableDictionary *univVault, *repVault, *normVault; NSMutableArray *univList, *repList, *blockList, *fileList, *colList; NSMutableString *limitString; NSData *mySavedData; NSString *savedDataType; //NSArray *rootArray; varRegistry *myGlobals; NSMutableArray *myData; NSMutableString *fmode; NSMutableArray *markedList; MyDocument *dataSource; NSMutableString *lgNewCodeName, *lgNewCodeDef; int lgNewCodeColor, lgNewCodeMode; NSColor *lgNewRealColor; NSMutableArray *codersList; NSMutableArray *sortStack; NSMutableArray *backData; NSMutableArray *setStack; NSMutableArray *fwdSetStack; NSMutableArray *lastRepList; NSMutableArray *innerRepList; NSMutableString *extraComment; NSMutableArray *commentArray; IBOutlet id backButton; IBOutlet id fwdButton; NSMutableDictionary *namedSelDict, *fieldMap; NSMutableString *namedSelSelected; NSMutableString *codersString, *innerRepeat; NSMutableDictionary *repCont; //has the contingencies for the repeats IBOutlet id sel2CodeSetSheet; IBOutlet id sel2CodeSetName; IBOutlet id selCSExactSwitch; IBOutlet id selCSMenu; IBOutlet id selCSSheet; BOOL exactCodeSetFlag; IBOutlet NSWindow *myWindow; IBOutlet NSWindow *addCodeWindow; IBOutlet NSWindow *recodeWindow; IBOutlet NSWindow *newCodeWindow; int innerRFlag; BOOL savedNamedSel; //autoSet IBOutlet id autoSetWatcher; NSMutableDictionary *autoSets; NSMutableArray *autoHistory; NSMutableString *autoHistoryStart; //summary report IBOutlet id summWatcher; NSMutableDictionary *summReports; int aCodeLevel; IBOutlet id codeLevelPane; IBOutlet id codeLevelField; int commentMode; NSMutableString *browseField; IBOutlet id browseFieldSheet; IBOutlet id browseFieldMenu; IBOutlet id addRootName; IBOutlet id addRootColor; IBOutlet id addRootInherited; IBOutlet id addRootPane; IBOutlet id delRootLevels; IBOutlet id delRootPane; //for movies NSMutableDictionary *mediaDict; #ifdef MULTIMEDIA IBOutlet id mediaSheet; IBOutlet id myMovieView; NSMovie *myMovie; IBOutlet id mediaFileName; IBOutlet id mediaTimeCode; #else id myMovie; #endif MWFile *currMWFile; NSTimer *myTimer; BOOL jagFlag; int mediaRow; BOOL builtTable; } -(MWFile *) currMWFile; -(void) setCurrMWFile: (MWFile *) who; -(void) addAutoSet: (NSMutableDictionary *) what withName: (NSString *) who; -(NSMutableDictionary *) autoSetForName: (NSString *) who; -(void) removeAutoSetForName: (NSString *) who; -(BOOL) validAutoSetName: (NSString *) who; -(NSArray *) allAutoSetNames; -(IBAction) doAutoSet: (id) sender; -(void) rebuildAutoSetMenu; -(IBAction) createAutoSet: (id) sender; -(IBAction) removeAllAutoSets: (id) sender; -(NSMutableDictionary *) autoSets; -(NSArray *) allSetNames; -(NSMutableArray*) getSetWithName: (NSString*) who; -(NSMutableArray*) autoHistory; -(NSMutableString*) autoHistoryStart; -(NSWindow *) myWindow; -(NSArray *) columns; -(void) handleSelect: (int) selectMode selectType: (int) st withString: (NSString *) compValue withCol: (NSString *) colName floatV: (int) fp regexV: (int) rf startArray: (NSMutableArray*) a1 endArray: (NSMutableArray*) a2; -(void) handleSet: (int) opType withSet: (NSArray *) mm startArray: (NSMutableArray*) a1 endArray: (NSMutableArray*) a2; -(NSMutableArray*) getAutoSetWithName: (NSString *) who; -(BOOL) validSetName: (NSString *) who; -(IBAction) selectFewerRecs: (id) Sender; -(void) displaySelData: (int) row; -(IBAction) doAddCodeOK: (id) sender; -(IBAction) doAddCodeCancel: (id) sender; -(IBAction) doNewCode: (id) sender; -(void) handleDirtySourceFlag: (NSNotification *) notification; -(void) executeTAMS; -(int) getDocType; -(NSString *) getTitle; -(void) clearTable; -(BOOL) isRepeat: (NSString *) name; -(int) global: (NSString *) name; -(void) setGlobal: (NSString *) name to: (int) val; -(void) setCharEngine: (TAMSCharEngine *) who; -(void) handlemeta: (ctQChar *) myc; - (void) doTamsSearch: (NSString *) aLimString; -(void) handleUniversal: (NSString *) namelist; -(void) handleEnd: (BOOL) section flush: (BOOL) f; //- (BOOL)readFromFile:(NSString *)fileName ofType:(NSString *)type; //-(BOOL) writeToFile: (NSString *) filename ofType: (NSString *) type; -(void) addToList: (NSMutableArray *) aList usingString: (NSString *) aString; -(NSMutableArray *) convertString: (NSString *) theString onChar: (unichar) breakChar; -(void) adjustBy: (int) amt startingAt: (int) loc for: (id) who; //-(void) addCode: (NSString *) what from: (int) bwhere to: (int) ewhere from: (id) who withDef: (NSString *) myDef; -(BOOL) isInnerRepeat: (NSString *) name; -(NSMutableArray *) sortStackCopy; -(NSMutableString *) getComment; -(void) setComment: (NSString *) what; -(void) appendComment: (NSString *) what; -(void) endComment: (NSString *) what; -(void) endLastComment; -(void) clearComments; -(NSMutableString *) limString; -(void) setGlobalInt: (id) key value: (int) v; -(IBAction) sortColumn: (id) Sender; -(IBAction) fetchRow: (id) Sender; -(IBAction) refreshResults: (id) Sender; -(IBAction) doMarkAll: (id) sender; -(IBAction) doUnmarkAll: (id) sender; -(IBAction) doDeleteMarked: (id) sender; -(IBAction) doReverseMarked: (id) sender; -(IBAction) doMark: (id) sender; -(IBAction) doUnmark: (id) sender; -(IBAction) doRecode: (id) sender; -(IBAction) doAddCode: (id) sender; -(IBAction) doShowComment: (id) sender; -(BOOL) isMarked: (int) row; -(IBAction) selectAllRecs: (id) Sender; -(IBAction) selectAdditionalRecs: (id) Sender; -(IBAction) selectRecs: (id) Sender; -(IBAction) doSelect: (id) Sender; -(IBAction) cancelSelect: (id) Sender; -(IBAction) cancelSetDateFmt: (id) Sender; -(IBAction) okSetDateFmt: (id) Sender; -(IBAction) doSetDateFmt: (id) Sender; -(void) doContWithDict: (NSMutableDictionary *) theVault; -(IBAction) clearNamedSelMenu: (id) Sender; -(void) setupTables; -(void) setDataSource: (NSString *) theData; //-(BOOL) writeToFile: (NSString *) filename ofType: (NSString *) type; -(BOOL)tableView: (NSTableView *) aTable shouldEditTableColumn: (NSTableColumn *) aCol row: (unsigned) arow; - (void)tableViewSelectionDidChange:(NSNotification *)aNotification; - (void)tableView:(NSTableView*)tableView didClickTableColumn:(NSTableColumn *)tableColumn; -(void) displaySelData; -(id) getGWorkBench: (id) who; -(void) setGWorkBench: (id) who; -(void) setMWFile: (MWFile *) who; -(MWFile *) getMWFile; -(IBAction) moveWorkBenchForward: (id) sender; - (void) moveForward; -(IBAction) showCodeBrowser: (id) Sender; -(void) setOriginalStateString; -(void) addStateString: (NSString *) what; -(void) setStateString: (NSString *) what; -(BOOL) isBlocked: (NSString *) name; -(void) setCharEngineWithSource: (id) src andFileList: (NSArray *) myList; -(BOOL) isAutoSet: (NSString *) who; -(IBAction) okNamedSelection: (id) Sender; -(IBAction) cancelNamedSelection: (id) Sender; -(IBAction) okCodeLevel: (id) sender; -(IBAction) cancelCodeLevel: (id) sender; -(NSArray *) allSummReports; -(NSArray *) mySummReports; -(void) delSummReport:(NSString *) who; -(void) addSummReport:(NSString *) who report: (NSDictionary *) r global: (BOOL) g; -(BOOL) isSummReport: (NSString *) who; -(NSDictionary *) summReport: (NSString *) who; -(int) reportScope: (NSString *) who; // 1 = local 2 = global 0 = nonexistant -(NSMutableString *) dateFormat; -(NSMutableArray *) hotData; -(NSMutableArray *) allData; -(void) rebuildSummReportMenu; -(IBAction) doFillName: (id) sender; -(NSArray *) tableColumns; -(int) fieldType: (NSString *) name; -(int) codeLevel; -(void) zeroSetStack; -(IBAction) popSetStack: (id) sender; -(void) pushSetStack; -(IBAction) popFwdSetStack: (id) sender; -(IBAction) doBrowseField: (id) sender; -(IBAction) okBrowseField: (id) sender; -(IBAction) cancelBrowseField: (id) sender; -(IBAction) selectColorFromWell:(id)Sender; -(IBAction) selectColorFromSwitch:(id) sender; -(IBAction) okSetMath: (id) Sender; -(IBAction) cancelSetMath: (id) Sender; -(IBAction) doAppendCommentToMarked: (id) sender; -(IBAction) doAddComment: (id) sender; -(IBAction) okAddComment: (id) sender; -(IBAction) cancelAddComment: (id) sender; -(IBAction) cancelSel2CodeSet: (id) Sender; -(IBAction) okSel2CodeSet: (id) Sender; -(IBAction) doSelectCodeSetDialogue: (id) Sender; -(IBAction) selCSSelect: (id) Sender; -(IBAction) selCSSelectMore: (id) Sender; -(IBAction) selCSSelectLess: (id) Sender; -(IBAction) selCSCancel: (id) Sender; -(BOOL) selectCodeSetWithName:(NSString *) who withWarnings: (BOOL) w pushStack: (BOOL) ps type: (int) tp exact: (BOOL) ex; -(IBAction) okAddRoot: (id) sender; -(IBAction) cancelAddRoot: (id) sender; -(IBAction) doAddRootCode: (id) sender; -(IBAction) toggleAddRootColor: (id) sender; -(IBAction) okDelRoot: (id) sender; -(IBAction) cancelDelRoot: (id) sender; #ifdef MULTIMEDIA -(IBAction) doMediaPlayer: (id) sender; -(IBAction) exitMediaPlayer: (id) Sender; -(IBAction) jumpMediaForward: (id) sender; -(IBAction) jumpMediaBack: (id) sender; -(IBAction) restartMedia: (id) sender; #endif @end //extern myResults *gCurrentTAMS; gtamsanalyzer.app-0.42/Source/myResults.m0000555000175000017500000074774510162465511021024 0ustar brentbrent00000000000000// // myResults.m // TAMS Edit // // Created by matthew on Sun Apr 21 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "myResults.h" #import "ctReadChar.h" #import "tams.h" #import "ctLimitCrit.h" #import "TAMSCharEngine.h" #import "coderec.h" #import "NSRecordData.h" #import "prefBoss.h" #import "myProject.h" #import "docDelegate.h" #import "appDelegate.h" #import "utils.h" #import "tamsutils.h" #import "MWPath.h" #import "MWFakeFile.h" #import "MGWPopUpButton.h" #import "MWKeyedResult.h" //#import "AGRegex.h" #import #import #import "MWSortStackItem.h" #import "stringCategories.h" #import "MWTAMSStringCategories.h" //#define SIMON 1 #define NOTIFICATIONDIRTY 1 #define CLOSEBUG 1 #define NAMEDSELMENU 140 #define COLWIDTH 90.0 #define XML 1 #define REGEXSEARCH 1 #define NAMEDSELBASE 4 #define FIELDMAP 1 #define MYGLOBAL(X) [myGlobals findInt: X] #define SETGLOBAL(X,Y) [myGlobals setKey: X intValue: Y] #define ON(X) if([X isEqualToString: [myc buff]] == YES) #define SELECTEDCOLUMNID(X) [[[X tableColumns] objectAtIndex: [X selectedColumn]] identifier] #define UPDATERECCOUNT [self updateRecCount]; #define TAMSTART(X) [[X objectForKey: @"_begin_loc"] intValue] #define TAMEND(X) [[X objectForKey: @"_end_loc"] intValue] #define MAKEDIRTY [self updateChangeCount: NSChangeDone]; #define DIRTYWARN if([dirtySourceFlag state] == NSOnState) if(NSYESNOQUESTION(@"Results may be out of synch with data files. Proceed?") == NO) return; NSString *dateFmt[20] = {{@"%m/%d/%y"}, //mm/dd/yy {@"%m/%d/%Y"}, //mm/dd/yyyy {@"%m-%d-%y"}, //mm-dd-yyyy {@"%d/%m/%Y"}, //dd/mm/yyyy {@"%d/%m/%y"}, //dd/mm/yy {@"%B %d, %Y"}, //month dd, yyyy {@"%d %B, %Y"}, //dd month, yyyy {@"%I:%M"}, //hh:mm {@"%I:%M %p"}, //hh:mm AM/PM {@"%I:%M:%S"}, //hh:mm:ss {@"%I:%M:%S %p"},//hh:mm:ss AM/PM {@"%H:%M"}, //24hh:mm {@"%H:%M:%S"}, //24hh:mm:ss {@""} //other }; BOOL arrayContainsString(NSArray *a, NSString *s) { int i; int n; n = [a count]; for(i = 0; i < n; i++) { if([[a objectAtIndex: i] isEqualToString: s] == YES) return YES; } return NO; } //need to change this for version 2 int locationComp(id first, id second, void *key) { //compare the documents if([first objectForKey: @"_doc"] == [second objectForKey: @"_doc"]) { if([[first objectForKey: @"_begin_loc"] intValue] > [[first objectForKey: @"_begin_loc"] intValue]) return NSOrderedDescending; else if([[first objectForKey: @"_begin_loc"] intValue] < [[first objectForKey: @"_begin_loc"] intValue]) return NSOrderedAscending; else return NSOrderedSame; } else { return [(MWFile *)[first objectForKey: @"_doc"] compare: [second objectForKey: @"_doc"]]; } } int locationFwdComp(id first, id second, void *key) { //compare the documents if([[first objectForKey: @"_doc"] isEqual: [second objectForKey: @"_doc"]]) { if([[first objectForKey: @"_begin_loc"] intValue] < [[first objectForKey: @"_begin_loc"] intValue]) return NSOrderedDescending; else if([[first objectForKey: @"_begin_loc"] intValue] > [[first objectForKey: @"_begin_loc"] intValue]) return NSOrderedAscending; else return NSOrderedSame; } else { return ([(MWFile *)[first objectForKey: @"_doc"] compare: [second objectForKey: @"_doc"]]); } } int nsStringComp(id first, id second, void *key) { return([(NSString *)first compare: second]); } int nsMWFileComp(id first, id second, void *key) { return nsStringComp([first name], [second name], key); } int stringComp(id first, id second, NSString *key) { return [[first objectForKey: key] compare: [second objectForKey: key]]; } int longFwdComp(id first, id second, NSString *key) { int a, b; a = [[first objectForKey: key] intValue]; b = [[second objectForKey: key] intValue]; if(a < b) return NSOrderedAscending; else if(a > b) return NSOrderedDescending; else return NSOrderedSame; } @implementation myResults -(void) updateOnlyRecCount { [recCount setStringValue: [NSString stringWithFormat: @"%d/%d", [myData count], [backData count]]]; } -(void) updateRecCountVertical { int n; n = [myData count]; [recCount setStringValue: [NSString stringWithFormat: @"%d/%d", n, [backData count]]]; [self updateChangeCount: NSChangeDone]; if([theResults selectedColumn] < 0 && [theResults numberOfRows] > 0) { [theResults selectRow: 0 byExtendingSelection: NO]; } [self displaySelData: 0]; } -(void) updateRecCount { int r, n; n = [myData count]; r = [theResults selectedRow]; [recCount setStringValue: [NSString stringWithFormat: @"%d/%d", n, [backData count]]]; [self updateChangeCount: NSChangeDone]; if(n>0 && [theResults numberOfRows] > 0) { [theResults selectRow: 0 byExtendingSelection: NO]; [self displaySelData: 0]; } } -(void) updateRecCountAtRow { int r, n; n = [myData count]; r = [theResults selectedRow]; [recCount setStringValue: [NSString stringWithFormat: @"%d/%d", n, [backData count]]]; [self updateChangeCount: NSChangeDone]; if(r < n && r >= 0) [self displaySelData: r]; else { if (n > 0 && [theResults numberOfRows] > 0) [theResults selectRow: 0 byExtendingSelection: NO]; [self displaySelData: 0]; } } -(BOOL) isUniversal: (NSString *) name { FORALL(univList) { if([temp isEqualToString: name]) return YES; } ENDFORALL; return NO; } -(BOOL) isInnerRepeat: (NSString *) name { FORALL(innerRepList) { if([temp isEqualToString: name]) return YES; } ENDFORALL; return NO; } -(BOOL) isLastRepeat: (NSString *) name { FORALL(lastRepList) { if([temp isEqualToString: name]) return YES; } ENDFORALL; return NO; } -(BOOL) isRepeat: (NSString *) name { FORALL(repList) { if([temp isEqualToString: name]) return YES; } ENDFORALL; return NO; } -(BOOL) isBlocked: (NSString *) name { FORALL(blockList) { if([temp isEqualToString: name]) return YES; } ENDFORALL; return NO; } -(int) getDocType {return myDocType;} -(void) setCharEngineWithSource: (id) src andFileList: (NSArray *) myList { tce = [[TAMSCharEngine alloc] init]; [tce addArrayToSearchList: myList]; [tce setGCurrentDataSource: src]; [tce startSearch]; } -(void) setCharEngine: (TAMSCharEngine*) who {tce = who;} -(void) setGlobalInt: (id) key value: (int) v { [myGlobals setKey: key intValue: v]; } -(int) global: (NSString *)name { return [myGlobals findInt: name]; } -(void) setGlobal: (NSString *) name to: (int) val { [myGlobals setKey: name intValue: val]; } -(void) initVariables { builtTable = NO; [myGlobals setKey: @"eofIsEndFlag" intValue: [gPrefBoss EOFIsEndValue]]; [myGlobals setKey: @"firstwriteflag" intValue: 1]; [myGlobals setKey: @"quoteflag" intValue: 1]; [myGlobals setKey: @"tabflag" intValue: 0]; [myGlobals setKey: @"headerflag" intValue: 1]; [myGlobals setKey: @"lnumflag" intValue: 0]; [myGlobals setKey: @"lineflag" intValue: 0]; [myGlobals setKey: @"fastflag" intValue: 0]; [myGlobals setKey: @"basicflag" intValue: [gPrefBoss defaultUnstruct]]; [myGlobals setKey: @"blankflag" intValue: 1]; [myGlobals setKey: @"startflag" intValue: 1]; [myGlobals setKey: @"nameflag" intValue: 0]; [myGlobals setKey: @"noparflag" intValue: 1]; [myGlobals setKey: @"cleanflag" intValue: 1]; [myGlobals setKey: @"lastRepeat" intValue: 0]; [myGlobals setKey: @"skipinnertopofdoc" intValue: 1]; [myGlobals setKey: @"skipinneratend" intValue: 1]; [myGlobals setKey: @"linecount" unsValue: 1L]; [myGlobals setKey: @"escapeflag" unsValue: [gPrefBoss escapeBracesValue]]; [myGlobals setKey: @"zeromark" unsValue: 0]; SETGLOBAL(@"backloadrepeatflag", [gPrefBoss backendRepeatValue]); SETGLOBAL(@"zapuniversal", [gPrefBoss zapUnivValue]); if([self global: @"skipinnertopofdoc"] == 1)innerRFlag = 0; } -(id) init { [super init]; myDocType = RESULTTYPE; firstUpdateFlag = YES; exactCodeSetFlag = YES; stripTags = NO; //[[NSDocumentController sharedDocumentController] addDocument: self]; myGlobals = [[varRegistry alloc] init]; closePermission = NO; caseSortFlag = NO; fieldMap = [[NSMutableDictionary alloc] init]; univVault = [[NSMutableDictionary alloc] init]; normVault = [[NSMutableDictionary alloc] init]; repVault = [[NSMutableDictionary alloc] init]; univList = [[NSMutableArray alloc] init]; fileList = [[NSMutableArray alloc] init]; codersList = [[NSMutableArray alloc] init]; colList = [[NSMutableArray alloc] init]; repList = [[NSMutableArray alloc] init]; blockList = [[NSMutableArray alloc] init]; myData = [[NSMutableArray alloc] init]; backData = [[NSMutableArray alloc] init]; setStack = [[NSMutableArray alloc] init]; fwdSetStack = [[NSMutableArray alloc] init]; fmode = [[NSMutableString alloc] init]; innerRepeat = [[NSMutableString alloc] init]; markedList = [[NSMutableArray alloc] init]; savedDataType = [[NSMutableString alloc] init]; lastRepList = [[NSMutableArray alloc] init]; innerRepList = [[NSMutableArray alloc] init]; lgNewCodeName = [[NSMutableString alloc] init]; lgNewCodeDef = [[NSMutableString alloc] init]; sortStack = [[NSMutableArray alloc] init]; dfString = [[NSMutableString alloc] init]; [dfString setString: dateFmt[0]]; browseField = [[NSMutableString alloc] initWithString: @"_data"]; codersString = [[NSMutableString alloc] init]; namedSelSelected = [[NSMutableString alloc] init]; namedSelDict = [[NSMutableDictionary alloc] init]; repCont = [[NSMutableDictionary alloc] init]; autoSets = [[NSMutableDictionary alloc] init]; summReports = [[NSMutableDictionary alloc] init]; autoHistory = [[NSMutableArray alloc] init]; autoHistoryStart = [[NSMutableString alloc] init]; extraComment = [[NSMutableString alloc] init]; commentArray = [[NSMutableArray alloc] init]; mediaDict = [[NSMutableDictionary alloc] init]; myMovie = nil; myTimer = nil; dfIndex = -1; limitString = nil; //These are set by the user and should maintain their value so we don't reset them in initVariable [myGlobals setKey: @"simpleflag" intValue: 0]; [myGlobals setKey: @"limitflag" intValue: 0]; [myGlobals setKey: @"rawflag" intValue: 1]; [myGlobals setKey: @"exactflag" intValue: 0]; [myGlobals setKey: @"emptyflag" intValue: 1]; [myGlobals setKey: @"regexcharflag" intValue: 1]; [myGlobals setKey: @"sectionsearch" intValue: 0]; [self initVariables]; return self; } - (void) reconnect { FORALL(fileList) { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleDirtySourceFlag:) name: @"TAMSDocDidChange" object: temp]; /* [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(addCodeHandler:) name: @"TAMSDocAddedCode" object: temp];*/ } ENDFORALL; } - (void) disconnect { [[NSNotificationCenter defaultCenter] removeObserver:self]; /* FORALL(fileList) { [[NSNotificationCenter defaultCenter] removeObserver:self name: @"TAMSDocDidChange" object: temp ]; }ENDFORALL; */ } - (void) close { [self disconnect]; [super close] ; } -(void) dealloc { [self disconnect]; [autoHistory release]; [lastRepList release]; [innerRepList release]; [autoHistoryStart release]; [autoSets release]; [univVault release]; [normVault release]; [repVault release]; [univList release]; [fieldMap release]; [summReports release]; [fileList release]; [colList release]; [savedDataType release]; [repList release]; [browseField release]; [mediaDict release]; [extraComment release]; [commentArray release]; [blockList release]; [myData release]; [backData release]; [fmode release]; [markedList release]; [lgNewCodeName release]; [lgNewCodeDef release]; [dfString release]; [codersList release]; [innerRepeat release]; [sortStack release]; [namedSelSelected release]; [namedSelDict release]; [repCont release]; [setStack release]; [fwdSetStack release]; [super dealloc]; } -(void) addCodeHandler: (NSNotification *) notification { NSDictionary *info; MWFile *who; who = [notification object]; info = [notification userInfo]; FORALL(backData) { if([temp objectForKey: @"_doc"] == who) { int b, e, l, loc; loc = [[info objectForKey: @"location"] intValue]; l = [[info objectForKey: @"length"] intValue]; b = [[temp objectForKey: @"_begin_loc"] intValue]; e = [[temp objectForKey: @"_end_loc"] intValue]; if(b >= loc) [temp setObject: [NSNumber numberWithLong: (b + l)] forKey: @"_begin_loc"]; if(e >= loc) [temp setObject: [NSNumber numberWithLong:( e + l)] forKey: @"_end_loc"]; } } ENDFORALL; [theResults reloadData]; } #ifdef NOTIFICATIONDIRTY -(void) handleDirtySourceFlag: (NSNotification *) notification { // if this is one of mine get dirty if([dirtySourceFlag state] == NSOnState) return; FORALL(fileList) { //if([(MWFile *)temp compare: [notification object]] == YES) if(temp == [notification object]) { [dirtySourceFlag setState: NSOnState]; return; } } ENDFORALL; } #else //update method - (void)windowDidBecomeKey:(NSNotification *)aNotification { //do the docs exist FORALL(fileList) { if([gWorkBench fileExists: temp] == YES) { //if yes are dirty [dirtySourceFlag setState: NSOnState]; return; } } ENDFORALL; //mark me and return if(gWorkBench != nil) { if([gWorkBench reanalysisMode] == YES) { [[[NSApp delegate] reanalysisMenu] setState: NSOnState]; } else { [[[NSApp delegate] reanalysisMenu] setState: NSOffState]; } [gWorkBench rebuildCodeSetMenu]; } } #endif -(void) adjustBy: (int) amt startingAt: (int) loc for: (id) who { int newLoc; FORALL(myData) { if([[temp objectForKey: @"_doc"] isEqual: who]) { if([[temp objectForKey: @"_begin_loc"] intValue] > loc) { newLoc = [[temp objectForKey: @"_begin_loc"] intValue] + amt; [temp setObject: [NSNumber numberWithInt: newLoc] forKey: @"_begin_loc"]; } if([[temp objectForKey: @"_end_loc"] intValue] > loc) { newLoc = [[temp objectForKey: @"_end_loc"] intValue] + amt; [temp setObject: [NSNumber numberWithInt: newLoc] forKey: @"_end_loc"]; } } } ENDFORALL; } -(IBAction) doMarkAll: (id) sender { [markedList setArray: myData]; [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(IBAction) doUnmarkAll: (id) sender { [markedList removeAllObjects]; [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(void) markRecord: (int) row withReload: (BOOL) doit { if([markedList indexOfObject: [myData objectAtIndex: row]] == NSNotFound) { [markedList addObject: [myData objectAtIndex: row]]; } if(doit == YES) [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } //array of nsnumbers -(void) markArray: (NSArray *) rows { FORALL(rows) { [self markRecord: [temp intValue] withReload: NO]; } ENDFORALL; [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(void) markBackArray: (NSArray *) rows { FORALL(rows) { if([markedList indexOfObject: [backData objectAtIndex: [temp intValue]]] == NSNotFound) { [markedList addObject: [backData objectAtIndex: [temp intValue]]]; } } ENDFORALL; [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(IBAction) doMark: (id) sender { int row; row = [theResults selectedRow]; if([markedList indexOfObject: [myData objectAtIndex: row]] == NSNotFound) { [markedList addObject: [myData objectAtIndex: row]]; } [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(IBAction) doUnmark: (id) sender { int row; int selObj; row = [theResults selectedRow]; selObj = [markedList indexOfObject: [myData objectAtIndex: row]]; if(selObj != NSNotFound) { [markedList removeObject: [myData objectAtIndex: row]]; } [theResults reloadData]; MAKEDIRTY; } -(IBAction) doDeleteMarked: (id) sender { if([markedList count]) { FORALL(markedList) { [myData removeObject: temp]; } ENDFORALL; [markedList removeAllObjects]; [theResults reloadData]; UPDATERECCOUNT; MAKEDIRTY; } } -(IBAction) doReverseMarked: (id) sender { NSMutableArray *newMarked = [[NSMutableArray alloc] init]; //save the total list into an array [newMarked setArray: myData]; //remove the marked FORALL(markedList) { [newMarked removeObject: temp]; } ENDFORALL; //set the new marked list [markedList setArray: newMarked]; [newMarked release]; //reload [theResults reloadData]; MAKEDIRTY; } -(IBAction) doShowComment: (id) sender { int row; id aRec; //get the key numbers row = [theResults selectedRow]; //make a range aRec = [myData objectAtIndex: row]; NSRunAlertPanel(@"Comment:", [aRec objectForKey: @"_comment"], @"Ok", nil, nil); } -(void) newCodeDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == 1) { [lgNewCodeName setString: [newCodeName stringValue]]; [lgNewCodeDef setString: [newCodeDef string]]; [arBossWindow orderOut: self]; [NSApp endSheet: arBossWindow returnCode: 1]; } } -(IBAction) deleteSourceCodes: (id) Sender { NSMutableArray *myLocalRecs; id myRec, ans; NSEnumerator *locList; DIRTYWARN; if([self global: @"sectionsearch"] == YES || [self global: @"regexcharflag"] == YES || [self global: @"nonregexcharflag"] == YES) { NSWARNING(@"Cannot delete codes this type of search"); return; } if([self global: @"limitflag"] && ![self global: @"simpleflag"]) { NSWARNING(@"Only simple searches can have records removed"); return; } ans = NSYESNOQUESTION(@"This will delete information from your source files. Should I proceed?"); if(ans == NO) return; if([markedList count]) { //is there something there? //refresh? //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationComp context: nil]; //go through and call the main docuement locList = [markedList reverseObjectEnumerator]; while(myRec = [locList nextObject]) { if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) { if([gPrefBoss batchOpenFiles]) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; else [(MWFile *)[myRec objectForKey: @"_doc"] setOpenFakeFileWithWorkBench: gWorkBench]; } [[[myRec objectForKey: @"_doc"] filePointer ] deleteCodeFromResultStartingWith: [[myRec objectForKey: @"_begin_loc"] intValue] endingWith: [[myRec objectForKey:@"_end_loc"] intValue] from: self]; } if([gPrefBoss batchOpenFiles] == 0) { locList = [myLocalRecs reverseObjectEnumerator]; while(myRec = [locList nextObject]) { [(MWFile *)[myRec objectForKey: @"_doc"] closeFakeFile]; } } //remove the files from here if([markedList count]) { FORALL(markedList) { [myData removeObject: temp]; [backData removeObject: temp]; } ENDFORALL; [markedList removeAllObjects]; } [theResults reloadData]; UPDATERECCOUNT; //have it reload if([gPrefBoss autoReloadValue]) [self refreshResults: self]; } else { } } -(void) recodeDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSMutableArray *myLocalRecs; NSMutableString *myNewCodeName; id myRec; NSEnumerator *locList; myNewCodeName = [[NSMutableString alloc] init]; if([markedList count]) { if(returnCode == 1) { //is there something there? if([lgNewCodeName isEqualToString: @""] == YES) return; //refresh? //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationComp context: nil]; //go through and call the main docuement locList = [markedList reverseObjectEnumerator]; while(myRec = [locList nextObject]) { if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; [[[myRec objectForKey: @"_doc"] filePointer] recode: lgNewCodeName first: [[myRec objectForKey:@"_begin_loc"] intValue] last: [[myRec objectForKey:@"_end_loc"] intValue] from: self withDef: lgNewCodeDef]; } if([gPrefBoss cancelAfterRecode] == 1) [self doUnmarkAll: nil]; //have it reload if([gPrefBoss autoReloadValue]) [self refreshResults: self]; } } else { } } //#define MODALWIND 1 -(void) setInnerRepeat: (NSString *) what { [innerRepeat setString: what]; trimNSS(innerRepeat); } -(void) buildCoderList { NSString *ss; NSMutableArray *tempArray; int n; //remove objects [codersList removeAllObjects]; //get the list ss = codersString; //split object tempArray = convertStringToArray(ss, ','); [tempArray retain]; n = [tempArray count]; FORALL(tempArray) { NSMutableString *tt; tt = [[NSMutableString alloc] init]; [tt setString: temp]; trimNSS(tt); [codersList addObject: tt]; } ENDFORALL; n = [codersList count]; //trim objects [tempArray release]; } -(IBAction) doAddCodeOK: (id) sender { lgNewCodeMode = CODEMODEOLD; [lgNewCodeName setString: [addCodeName titleOfSelectedItem]]; [lgNewCodeDef setString: @""]; [addCodeWindow orderOut: sender]; [NSApp endSheet: addCodeWindow returnCode: 1]; } -(IBAction) doFillName: (id) sender { [newCodeName setStringValue: [addCodeName titleOfSelectedItem]]; } -(IBAction) doNewCode: (id) sender { lgNewCodeMode = CODEMODENEW; if([inheritedColorSwitch state] == NSOnState) lgNewCodeColor = inheritedColor; else lgNewCodeColor = otherColor; //lgNewCodeColor = [[codeColorMenu selectedItem] tag]; lgNewRealColor = [myColorWell color]; [lgNewCodeName setString: [newCodeName stringValue]]; [lgNewCodeDef setString: [newCodeDef string]]; [addCodeWindow orderOut: sender]; [NSApp endSheet: addCodeWindow returnCode: 1]; } -(IBAction) doAddCodeCancel: (id) sender { [addCodeWindow orderOut: sender]; [NSApp endSheet: addCodeWindow returnCode: 0]; } -(IBAction) selectColorFromWell:(id)Sender { [inheritedColorSwitch setState: NSOffState]; } -(IBAction) selectColorFromSwitch:(id) sender { if([inheritedColorSwitch state] == NSOnState) [myColorWell setColor: [gWorkBench colorForCode: [newCodeName stringValue]]]; } -(NSMutableString *) escapeCommentBraces: (NSMutableString *) who { NSRange r, r1; int i,n; NSMutableString *ss = [NSMutableString string]; r = [who rangeOfString: @"{"]; r1 = [who rangeOfString: @"}"]; if(r1.location == NSNotFound && r.location == NSNotFound) return who; n = [who length]; for(i = 0; i < n; i++) { if([who characterAtIndex: i] == '\\') { if(i < n -1) { [ss ADDCHAR([who characterAtIndex: i])]; i++; [ss ADDCHAR([who characterAtIndex: i])]; continue; } } if([who characterAtIndex: i] == '{') { [ss ADDCHAR('\\')]; [ss ADDCHAR([who characterAtIndex: i])]; continue; } if([who characterAtIndex: i] == '}') { [ss ADDCHAR('\\')]; [ss ADDCHAR([who characterAtIndex: i])]; continue; } [ss ADDCHAR([who characterAtIndex: i])]; } [who setString: ss]; return who; } -(void) addCommentDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (NSArray *) hotList { NSString *lgNewCodeName; NSMutableString *thisCmnt, *theCmnt; NSMutableArray *myLocalRecs; id myRec; NSEnumerator *locList; if(returnCode) { if([hotList count]) { thisCmnt = [[NSMutableString alloc] init]; theCmnt = [commentField string]; //is there something there? myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: hotList]; //reverse sort [myLocalRecs sortUsingFunction: locationComp context: nil]; //go through and call the main docuement locList = [myLocalRecs reverseObjectEnumerator]; while(myRec = [locList nextObject]) { if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) { if([gPrefBoss batchOpenFiles] == 1) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; else [(MWFile *)[myRec objectForKey: @"_doc"] setOpenFakeFileWithWorkBench: gWorkBench]; } lgNewCodeName = [myRec objectForKey: @"_code"] ; if(commentMode == 0) { [thisCmnt setString: theCmnt]; } else { NSString *cmt1; cmt1 = [myRec objectForKey: @"_comment"]; if(cmt1 != nil) [thisCmnt setString: cmt1]; [thisCmnt appendString: theCmnt]; } [self escapeCommentBraces: thisCmnt]; [[[myRec objectForKey: @"_doc"] filePointer] recode: lgNewCodeName comment: thisCmnt first: [[myRec objectForKey:@"_begin_loc"] intValue] last: [[myRec objectForKey:@"_end_loc"] intValue] from: self withDef: @""]; /* This is too crude, but is the start of refreshing the actual data, what would need to happen is have tce or some such object translate this*/ [myRec setObject: thisCmnt forKey: @"_comment"]; } if([gPrefBoss batchOpenFiles] == 0) { locList = [myLocalRecs reverseObjectEnumerator]; while(myRec = [locList nextObject]) { [(MWFile *)[myRec objectForKey: @"_doc"] closeFakeFile]; } } //have it reload [self updateRecCountAtRow]; if([gPrefBoss cancelAfterRecode] == 1) [self doUnmarkAll: nil]; if([gPrefBoss autoReloadValue]) [self refreshResults: self]; [self displaySelData]; [thisCmnt release]; [myLocalRecs release]; } else { } } [hotList autorelease]; } -(IBAction) cancelAddComment: (id) Sender { [commentSheet orderOut: Sender]; [NSApp endSheet: commentSheet returnCode: 0]; } -(IBAction) okAddComment: (id) Sender { [commentSheet orderOut: Sender]; [NSApp endSheet: commentSheet returnCode: 1]; } -(IBAction) doAppendCommentToMarked: (id) sender { int row; NSMutableArray *hitList; NSWindow *who; NSString *cmt; DIRTYWARN; hitList = [[NSMutableArray alloc] init]; if([self global: @"simpleflag"] == 0) { NSWARNING(@"You can only add comments to simple searches."); return; } row = [theResults selectedRow]; [hitList addObjectsFromArray: markedList]; [commentField setString: @""]; /* row = [theResults selectedRow]; if([markedList indexOfObject: [myData objectAtIndex: row]] == NSNotFound) { [markedList addObject: [myData objectAtIndex: row]]; } [theResults reloadData]; [self updateChangeCount: NSChangeDone]; */ commentMode=1; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: commentSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(addCommentDidEnd:returnCode:contextInfo:) contextInfo: hitList]; } -(IBAction) doAddComment: (id) sender { int row; NSMutableArray *hitList; NSWindow *who; NSString *cmt; DIRTYWARN; hitList = [[NSMutableArray alloc] init]; if([self global: @"simpleflag"] == 0) { NSWARNING(@"You can only add comments to simple searches."); return; } row = [theResults selectedRow]; if(row >=0) [hitList addObject: [myData objectAtIndex: row]]; cmt = [[myData objectAtIndex: row] objectForKey: @"_comment"]; if(cmt != nil) [commentField setString: cmt]; commentMode = 0; /* row = [theResults selectedRow]; if([markedList indexOfObject: [myData objectAtIndex: row]] == NSNotFound) { [markedList addObject: [myData objectAtIndex: row]]; } [theResults reloadData]; [self updateChangeCount: NSChangeDone]; */ if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: commentSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(addCommentDidEnd:returnCode:contextInfo:) contextInfo: hitList]; } -(IBAction) doRecode: (id) sender { NSArray *clist; NSWindow *who; NSString *hcode; DIRTYWARN; if(![markedList count]) return; hcode = [[markedList objectAtIndex: 0] objectForKey: @"_code"]; if([self global: @"sectionsearch"] == YES || [self global: @"regexcharflag"] == YES || [self global: @"nonregexcharflag"] == YES) { NSWARNING(@"Cannot recode this type of search"); return; } if([self global: @"limitflag"] && ![self global: @"simpleflag"]) { NSWARNING(@"Only simple searches can be recoded"); return; } //delete the menu items if([addCodeName numberOfItems]) [addCodeName removeAllItems]; //get a fresh list //add new //[addCodeName addItemWithTitle: @"New"]; //build up the menu clist = [gWorkBench getHotCodeList]; [addCodeName addItemsWithTitles: clist]; [addCodeName selectItemAtIndex: 0]; recodeFlag = 1; if([self global: @"simpleflag"]) { [newCodeName setStringValue: hcode]; if([addCodeName itemWithTitle: hcode] != nil) [addCodeName selectItemWithTitle: hcode]; else [addCodeName selectItemAtIndex: 0]; } else { [addCodeName selectItemAtIndex: 0]; [newCodeName setStringValue: @""]; } [newCodeDef setString: @""]; [inheritedColorSwitch setState: NSOnState]; // [codeColorMenu selectItemAtIndex: [codeColorMenu indexOfItemWithTag: inheritedColor]]; [myColorWell setColor: [gPrefBoss realColor]]; [codePrompt setStringValue: @"Recode to:"]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: addCodeWindow modalForWindow: who modalDelegate: self didEndSelector: @selector(addCodeDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(BOOL) isOverlapped: (id) r1 and: (id) r2 { int b1, b2, e1, e2; b1 = TAMSTART(r1); b2 = TAMSTART(r2); e1 = TAMEND(r1); e2 = TAMEND(r2); if([r1 objectForKey: @"_doc"] != [r2 objectForKey: @"_doc"]) return NO; //if (r1 == r2) return NO; if( b1 <= b2 && e1 <= b2) return NO; if(b1 >= e2 && e1 >= e2) return NO; return YES; } -(NSString *) processRecodeWithOldCode: (NSString *) oldCode newCode: (NSString *) newCode onRecord: (NSString *) r1 range: (NSRange) rr { BOOL pmode, q4ct; int tcnt; TAMSCharEngine *tx = [[TAMSCharEngine alloc] initWithString: r1]; ctQChar *qq = [[ctQChar alloc] init]; NSMutableString *newData = [NSMutableString string]; [tx setEscFlag: 0]; [tx startSearch]; tcnt = 0; q4ct = NO; //[tx setCharLocation: rr.location]; if(([tx getCharLocation] <= rr.location + rr.length) && [tx getCharLocation] >= rr.location) pmode = YES; else pmode = NO; while([tx readnext: qq] != EOF) { switch([qq tokentype]) { case TOKEN: case ENDTOKEN: if( [[qq buff] isEqualToString: oldCode] == YES && ((pmode && tcnt < 2) || q4ct ==YES)) { tcnt++; if([qq tokentype] == TOKEN) q4ct = YES; [qq setBuff: newCode]; [newData appendString: stringForQChar(qq, NO)]; } else [newData appendString: stringForQChar(qq, NO)]; break; default: [newData appendString: stringForQChar(qq, NO)]; }; if(([tx getCharLocation] <= rr.location + rr.length) && [tx getCharLocation] >= rr.location) pmode = YES; else pmode = NO; } [tx release]; [qq release]; return newData; } -(NSString *) processAddcodeWithOldCode: (NSString *) oldCode newCode: (NSString *) newCode onRecord: (NSString *) r1 range: (NSRange) rr { TAMSCharEngine *tx = [[TAMSCharEngine alloc] initWithString: r1]; ctQChar *qq = [[ctQChar alloc] init]; NSMutableString *newData = [NSMutableString string]; int tcnt; BOOL pmode, q4ct; q4ct = NO; [tx setEscFlag: 0]; [tx startSearch]; //[tx setCharLocation: rr.location]; tcnt =0; if(([tx getCharLocation] <= rr.location + rr.length) && [tx getCharLocation] >= rr.location) pmode = YES; else pmode = NO; while([tx readnext: qq] != EOF) { switch([qq tokentype]) { case TOKEN: case ENDTOKEN: if( [[qq buff] isEqualToString: oldCode] == YES && ((pmode && tcnt < 2) || q4ct)) { if([qq tokentype] == TOKEN) q4ct = YES; tcnt++; [newData appendString: code2tag(newCode, (([qq tokentype] == TOKEN)? YES : NO), YES, nil)]; [newData appendString: stringForQChar(qq, NO)]; } else [newData appendString: stringForQChar(qq, NO)]; break; default: [newData appendString: stringForQChar(qq, NO)]; }; if(([tx getCharLocation] <= rr.location + rr.length) && [tx getCharLocation] >= rr.location) pmode = YES; else pmode = NO; } [tx release]; [qq release]; return newData; } -(void) adjustAllToRecodeWithNewCode: (NSString *) newCode oldCode: (NSString *) oldCode keyRecord: (id) rr keyData: (NSString *) kd { NSRange rrr; NSString * rstr; FORALL(backData) { int b1, b2, e1, e2, l1, l2; b1 = TAMSTART(rr); b2 = TAMSTART(temp); e1 = TAMEND(rr); e2 = TAMEND(temp); l2 = [[temp objectForKey: @"_data"] length]; l1 = [kd length]; if(TAMSTART(rr) == TAMSTART(temp) && TAMEND(rr) == TAMEND(temp)) { [temp setObject: [[newCode copy] autorelease] forKey: @"_code"]; } if([self isOverlapped: temp and: rr]) { if(b1 <= b2) rrr.location = 0; else rrr.location = b1 - b2; if(e1 >= e2) rrr.length = 1+e2 - (b2 + rrr.location) + ((l1 - (e2 - b2) > 0) ? l1 - (e2 -b2) : (e2-b2) - l1); else rrr.length = 1+e1 - (b2 + rrr.location) + ((l1 - (e2 - b2) > 0) ? l1 - (e2 -b2) : (e2-b2) - l1); rstr = [self processRecodeWithOldCode: oldCode newCode: newCode onRecord: [temp objectForKey: @"_data"] range: rrr]; [temp setObject: rstr forKey: @"_data"]; } } ENDFORALL; } -(void) adjustAllToAddcodeWithNewCode: (NSString *) newCode oldCode: (NSString *) oldCode keyRecord: (id) rr keyData: (NSString *) kd { NSRange rrr; NSString * rstr; FORALL(backData) { int b1, b2, e1, e2, l1, l2; b1 = TAMSTART(rr); b2 = TAMSTART(temp); e1 = TAMEND(rr); e2 = TAMEND(temp); l2 = [[temp objectForKey: @"_data"] length]; l1 = [kd length]; if([self isOverlapped: temp and: rr]) { if(b1 < b2) rrr.location = 0; else rrr.location = b2 - b1; if(e2 >= e1) rrr.length = 1+b2 - (b2 + rrr.location) + ((l1 - (e2 - b2) > 0) ? l1 - (e2 -b2) : (e2-b2) - l1); else rrr.length = 1+e1 - (b2 + rrr.location) + ((l1 - (e2 - b2) > 0) ? l1 - (e2 -b2) : (e2-b2) - l1); rstr = [self processAddcodeWithOldCode: oldCode newCode: newCode onRecord: [temp objectForKey: @"_data"] range: rrr]; [temp setObject: rstr forKey: @"_data"]; } } ENDFORALL; } -(void)handleResultsDidChange: (NSNotification *) not { NSDictionary *myDat = [not userInfo]; if([[myDat objectForKey: @"type"] isEqualToString: @"r"] == YES) { [self adjustAllToRecodeWithNewCode: [myDat objectForKey: @"newCode"] oldCode: [myDat objectForKey: @"oldCode"] keyRecord: [myDat objectForKey: @"keyRecord"] keyData: [myDat objectForKey: @"keyData"]];//[[myDat objectForKey: @"keyRecord"] objectForKey: @"_data"]]; } else { [self adjustAllToAddcodeWithNewCode: [myDat objectForKey: @"newCode"] oldCode: [myDat objectForKey: @"oldCode"] keyRecord: [myDat objectForKey: @"keyRecord"] keyData: [myDat objectForKey: @"keyData"]]; } } -(void) addCodeDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSMutableArray *myLocalRecs; id myRec; NSEnumerator *locList; NSMutableString *oldCode; NSMutableString *newData; oldCode = [NSMutableString string]; if(recodeFlag == 0) //this is addcode { if([markedList count]) { if(returnCode == 1) { //Something there? if([lgNewCodeName isEqualToString: @""] == YES) return; //is it a new definition? if(lgNewCodeMode == CODEMODENEW) { if(lgNewCodeColor == otherColor) [gWorkBench newCode: lgNewCodeName definition: lgNewCodeDef realColor: lgNewRealColor]; else [gWorkBench newCode: lgNewCodeName definition: lgNewCodeDef color: lgNewCodeColor]; } //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationFwdComp context: nil]; //go through and call the main docuement locList = [myLocalRecs reverseObjectEnumerator]; while(myRec = [locList nextObject]) { if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) { if([gPrefBoss batchOpenFiles]) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; else [(MWFile *)[myRec objectForKey: @"_doc"] setOpenFakeFileWithWorkBench: gWorkBench]; } [[[myRec objectForKey: @"_doc"] filePointer] addCode: lgNewCodeName from: [[myRec objectForKey:@"_begin_loc"] intValue] to: [[myRec objectForKey:@"_end_loc"] intValue] from: self withDef: @""]; if([self global: @"simpleflag"]) { NSString *rstr; [oldCode setString: [myRec objectForKey: @"_code"]]; if([gPrefBoss guessUpdate] == NO) { rstr = [self processAddcodeWithOldCode: oldCode newCode: lgNewCodeName onRecord: [myRec objectForKey: @"_data"] range: NSMakeRange(0, [[myRec objectForKey: @"_data"] length])]; [myRec setObject: rstr forKey: @"_data"]; } else { NSMutableDictionary *mynots = [NSMutableDictionary dictionary]; [mynots setObject: self forKey: @"origin"]; [mynots setObject: [[lgNewCodeName copy] autorelease] forKey: @"newCode"]; [mynots setObject: @"a" forKey: @"type"]; [mynots setObject: [[oldCode copy] autorelease] forKey: @"oldCode"]; [mynots setObject: myRec forKey: @"keyRecord"]; [mynots setObject: [myRec objectForKey: @"_data"] forKey: @"keyData"]; [[NSNotificationCenter defaultCenter] postNotificationName: @"TAMSResultDidChange" object: gWorkBench userInfo: mynots]; /*[self adjustAllToAddcodeWithNewCode: lgNewCodeName oldCode: oldCode keyRecord: myRec];*/ } } } if([gPrefBoss batchOpenFiles] == 0) { locList = [myLocalRecs reverseObjectEnumerator]; while(myRec = [locList nextObject]) { [(MWFile *)[myRec objectForKey: @"_doc"] closeFakeFile]; } } [self updateRecCountAtRow]; if([gPrefBoss cancelAfterAddCode] == 1) [self doUnmarkAll: nil]; //have it reload if([gPrefBoss autoReloadValue]) [self refreshResults: self]; [self displaySelData]; } } else { } } else if (recodeFlag == 1) { if([markedList count]) { if(returnCode == 1) { //is there something there? if([lgNewCodeName isEqualToString: @""] == YES) return; //refresh? if(lgNewCodeMode == CODEMODENEW) { if(lgNewCodeColor == otherColor) [gWorkBench newCode: lgNewCodeName definition: lgNewCodeDef realColor: lgNewRealColor]; else [gWorkBench newCode: lgNewCodeName definition: lgNewCodeDef color: lgNewCodeColor]; } //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationComp context: nil]; //go through and call the main docuement locList = [markedList reverseObjectEnumerator]; while(myRec = [locList nextObject]) { if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) { if([gPrefBoss batchOpenFiles] == 1) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; else [(MWFile *)[myRec objectForKey: @"_doc"] setOpenFakeFileWithWorkBench: gWorkBench]; } [[[myRec objectForKey: @"_doc"] filePointer] recode: lgNewCodeName first: [[myRec objectForKey:@"_begin_loc"] intValue] last: [[myRec objectForKey:@"_end_loc"] intValue] from: self withDef: @""]; [oldCode setString: [myRec objectForKey: @"_code"]]; /* This is too crude, but is the start of refreshing the actual data, what would need to happen is have tce or some such object translate this*/ { NSString *rstr; if([gPrefBoss guessUpdate] == NO) { [myRec setObject: [[lgNewCodeName copy] autorelease] forKey: @"_code"]; rstr = [self processRecodeWithOldCode: oldCode newCode: lgNewCodeName onRecord: [myRec objectForKey: @"_data"] range: NSMakeRange(0, [[myRec objectForKey: @"_data"] length])]; [myRec setObject: rstr forKey: @"_data"]; } else { NSMutableDictionary *mynots = [NSMutableDictionary dictionary]; [mynots setObject: self forKey: @"origin"]; [mynots setObject: [[lgNewCodeName copy]autorelease] forKey: @"newCode"]; [mynots setObject: @"r" forKey: @"type"]; [mynots setObject: [[oldCode copy] autorelease] forKey: @"oldCode"]; [mynots setObject: myRec forKey: @"keyRecord"]; [mynots setObject: [[[myRec objectForKey: @"_data"] copy] autorelease] forKey: @"keyData"]; /*[self adjustAllToRecodeWithNewCode: lgNewCodeName oldCode: oldCode keyRecord: myRec];*/ [[NSNotificationCenter defaultCenter] postNotificationName: @"TAMSResultDidChange" object: gWorkBench userInfo: mynots]; } } } if([gPrefBoss batchOpenFiles] == 0) { locList = [myLocalRecs reverseObjectEnumerator]; while(myRec = [locList nextObject]) { [(MWFile *)[myRec objectForKey: @"_doc"] closeFakeFile]; } } //have it reload [self updateRecCountAtRow]; if([gPrefBoss cancelAfterRecode] == 1) [self doUnmarkAll: nil]; if([gPrefBoss autoReloadValue]) [self refreshResults: self]; [self displaySelData]; [myLocalRecs autorelease]; } } else { } } else if (recodeFlag == 2) //add root class { if([markedList count]) { if(returnCode == 1) { NSMutableString *myNewPrefix; int m, i; //is there something there? if([lgNewCodeName isEqualToString: @""] == YES) return; myNewPrefix = [[NSMutableString alloc] initWithString: lgNewCodeName]; m = [myNewPrefix length]; trimNSS(myNewPrefix); for(i = m -1; i >= 0; i--) { if([myNewPrefix characterAtIndex: i] == '>') [myNewPrefix deleteCharactersInRange: NSMakeRange(i,1)]; else break; } { if(lgNewCodeColor == otherColor) [gWorkBench newCode: myNewPrefix definition: @"" realColor: lgNewRealColor]; else [gWorkBench newCode: myNewPrefix definition: @"" color: lgNewCodeColor]; } //refresh? //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationComp context: nil]; //go through and call the main docuement locList = [markedList reverseObjectEnumerator]; while(myRec = [locList nextObject]) { NSString *myHierCode; if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) { if([gPrefBoss batchOpenFiles] == 1) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; else [(MWFile *)[myRec objectForKey: @"_doc"] setOpenFakeFileWithWorkBench: gWorkBench]; } myHierCode = [NSString stringWithFormat: @"%@>%@", myNewPrefix, [myRec objectForKey: @"_code"]]; [myHierCode retain]; [[[myRec objectForKey: @"_doc"] filePointer] recode: myHierCode first: [[myRec objectForKey:@"_begin_loc"] intValue] last: [[myRec objectForKey:@"_end_loc"] intValue] from: self withDef: @""]; [oldCode setString: [myRec objectForKey: @"_code"]]; /* This is too crude, but is the start of refreshing the actual data, what would need to happen is have tce or some such object translate this*/ { NSString *rstr; if([gPrefBoss guessUpdate] == NO) { [myRec setObject: [[myHierCode copy] autorelease] forKey: @"_code"]; rstr = [self processRecodeWithOldCode: oldCode newCode: myHierCode onRecord: [myRec objectForKey: @"_data"] range: NSMakeRange(0, [[myRec objectForKey: @"_data"] length])]; [myRec setObject: rstr forKey: @"_data"]; } else { NSMutableDictionary *mynots = [NSMutableDictionary dictionary]; [mynots setObject: self forKey: @"origin"]; [mynots setObject: [[myHierCode copy]autorelease] forKey: @"newCode"]; [mynots setObject: @"r" forKey: @"type"]; [mynots setObject: [[oldCode copy] autorelease] forKey: @"oldCode"]; [mynots setObject: myRec forKey: @"keyRecord"]; [mynots setObject: [[[myRec objectForKey: @"_data"] copy] autorelease] forKey: @"keyData"]; /*[self adjustAllToRecodeWithNewCode: lgNewCodeName oldCode: oldCode keyRecord: myRec];*/ [[NSNotificationCenter defaultCenter] postNotificationName: @"TAMSResultDidChange" object: gWorkBench userInfo: mynots]; } } [myHierCode autorelease]; } if([gPrefBoss batchOpenFiles] == 0) { locList = [myLocalRecs reverseObjectEnumerator]; while(myRec = [locList nextObject]) { [(MWFile *)[myRec objectForKey: @"_doc"] closeFakeFile]; } } //have it reload [self updateRecCountAtRow]; if([gPrefBoss cancelAfterRecode] == 1) [self doUnmarkAll: nil]; if([gPrefBoss autoReloadValue]) [self refreshResults: self]; [self displaySelData]; [myNewPrefix release]; [myLocalRecs autorelease]; } } else { } } else if (recodeFlag == 3) //del root code { if([markedList count]) { if(returnCode == 1) { NSMutableString *oldDataCode; int m, i; int clevel; //is there something there? clevel = [delRootLevels intValue]; if(clevel <= 0) return; oldDataCode = [[NSMutableString alloc] init]; //refresh? //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationComp context: nil]; //go through and call the main docuement locList = [markedList reverseObjectEnumerator]; while(myRec = [locList nextObject]) { int oclevel; NSString *myHierCode; if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) { if([gPrefBoss batchOpenFiles] == 1) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; else [(MWFile *)[myRec objectForKey: @"_doc"] setOpenFakeFileWithWorkBench: gWorkBench]; } [oldDataCode setString: [myRec objectForKey: @"_code"]]; oclevel = [oldDataCode numberOfCodeComponents]; if(clevel < oclevel) myHierCode = [oldDataCode lastCodeComponents: oclevel - clevel]; else myHierCode = [oldDataCode lastCodeComponent]; [myHierCode retain]; [[[myRec objectForKey: @"_doc"] filePointer] recode: myHierCode first: [[myRec objectForKey:@"_begin_loc"] intValue] last: [[myRec objectForKey:@"_end_loc"] intValue] from: self withDef: @""]; [oldCode setString: [myRec objectForKey: @"_code"]]; /* This is too crude, but is the start of refreshing the actual data, what would need to happen is have tce or some such object translate this*/ { NSString *rstr; if([gPrefBoss guessUpdate] == NO) { [myRec setObject: [[lgNewCodeName copy] autorelease] forKey: @"_code"]; rstr = [self processRecodeWithOldCode: oldDataCode newCode: myHierCode onRecord: [myRec objectForKey: @"_data"] range: NSMakeRange(0, [[myRec objectForKey: @"_data"] length])]; [myRec setObject: rstr forKey: @"_data"]; } else { NSMutableDictionary *mynots = [NSMutableDictionary dictionary]; [mynots setObject: self forKey: @"origin"]; [mynots setObject: [[myHierCode copy]autorelease] forKey: @"newCode"]; [mynots setObject: @"r" forKey: @"type"]; [mynots setObject: [[oldDataCode copy] autorelease] forKey: @"oldCode"]; [mynots setObject: myRec forKey: @"keyRecord"]; [mynots setObject: [[[myRec objectForKey: @"_data"] copy] autorelease] forKey: @"keyData"]; /*[self adjustAllToRecodeWithNewCode: lgNewCodeName oldCode: oldCode keyRecord: myRec];*/ [[NSNotificationCenter defaultCenter] postNotificationName: @"TAMSResultDidChange" object: gWorkBench userInfo: mynots]; } } [myHierCode autorelease]; } if([gPrefBoss batchOpenFiles] == 0) { locList = [myLocalRecs reverseObjectEnumerator]; while(myRec = [locList nextObject]) { [(MWFile *)[myRec objectForKey: @"_doc"] closeFakeFile]; } } //have it reload [self updateRecCountAtRow]; if([gPrefBoss cancelAfterRecode] == 1) [self doUnmarkAll: nil]; if([gPrefBoss autoReloadValue]) [self refreshResults: self]; [self displaySelData]; [oldDataCode release]; [myLocalRecs autorelease]; } } else { } } } -(IBAction) doAddCode: (id) sender { NSArray *clist; NSWindow *who; NSString *hcode; if(![markedList count]) return; DIRTYWARN; hcode = [[markedList objectAtIndex: 0] objectForKey: @"_code"]; //delete the menu items if([addCodeName numberOfItems]) [addCodeName removeAllItems]; //get a fresh list //add new //[addCodeName addItemWithTitle: @"New"]; clist = [gWorkBench getHotCodeList]; [addCodeName addItemsWithTitles: clist]; [addCodeName selectItemAtIndex: 0]; recodeFlag = 0; [codePrompt setStringValue: @"Code to add:"]; if([self global: @"simpleflag"]) { [newCodeName setStringValue: hcode]; if([addCodeName itemWithTitle: hcode] != nil) [addCodeName selectItemWithTitle: hcode]; else [addCodeName selectItemAtIndex: 0]; } else { [newCodeName setStringValue: @""]; [addCodeName selectItemAtIndex: 0]; } [newCodeDef setString: @""]; [inheritedColorSwitch setState: NSOnState]; // [codeColorMenu selectItemAtIndex: // [codeColorMenu indexOfItemWithTag: inheritedColor]]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: addCodeWindow modalForWindow: who modalDelegate: self didEndSelector: @selector(addCodeDidEnd:returnCode:contextInfo:) contextInfo: nil]; //return if nothing there //copy the records //reverse sort them //go through and call the main document //have it add a code } -(IBAction) cancelAddRoot: (id) sender { [addRootPane orderOut: sender]; [NSApp endSheet: addRootPane returnCode: 0]; } -(IBAction) okAddRoot: (id) sender { if([addRootInherited state] == NSOnState) lgNewCodeColor = inheritedColor; else lgNewCodeColor = otherColor; //lgNewCodeColor = [[codeColorMenu selectedItem] tag]; lgNewRealColor = [addRootColor color]; [lgNewCodeName setString: [addRootName stringValue]]; [addRootPane orderOut: sender]; [NSApp endSheet: addRootPane returnCode: 1]; } -(IBAction) toggleAddRootColor: (id) sender { [addRootInherited setState: NSOffState]; } -(IBAction) doAddRootCode: (id) sender { NSArray *clist; NSWindow *who; NSString *hcode; if(![markedList count]) return; if(![self global: @"simpleflag"]) { NSWARNING(@"Add root code only works with simple searches."); return; } recodeFlag = 2; [addRootName setStringValue: @""]; [addRootInherited setState: NSOnState]; // [codeColorMenu selectItemAtIndex: // [codeColorMenu indexOfItemWithTag: inheritedColor]]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: addRootPane modalForWindow: who modalDelegate: self didEndSelector: @selector(addCodeDidEnd:returnCode:contextInfo:) contextInfo: nil]; //return if nothing there //copy the records //reverse sort them //go through and call the main document //have it add a code } -(IBAction) cancelDelRoot: (id) sender { [delRootPane orderOut: sender]; [NSApp endSheet: delRootPane returnCode: 0]; } -(IBAction) okDelRoot: (id) sender { [delRootPane orderOut: sender]; [NSApp endSheet: delRootPane returnCode: 1]; } -(IBAction) doDelRootCode: (id) sender { NSArray *clist; NSWindow *who; NSString *hcode; if(![markedList count]) return; if(![self global: @"simpleflag"]) { NSWARNING(@"Delete root code only works with simple searches."); return; } recodeFlag = 3; [delRootLevels setStringValue: @"1"]; // [codeColorMenu selectItemAtIndex: // [codeColorMenu indexOfItemWithTag: inheritedColor]]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: delRootPane modalForWindow: who modalDelegate: self didEndSelector: @selector(addCodeDidEnd:returnCode:contextInfo:) contextInfo: nil]; //return if nothing there //copy the records //reverse sort them //go through and call the main document //have it add a code } -(BOOL) isMarked: (int) row { if([markedList indexOfObject: [myData objectAtIndex: row]] == NSNotFound) return NO; else return YES; } -(BOOL) isMarkedRecord: (id) theRecord { if([markedList indexOfObject: theRecord] == NSNotFound) return NO; else return YES; } -(void) printShowingPrintPanel: (BOOL) flag //-(IBAction) printDocument: (id) sender //-(IBAction) print: (id) Sender { NSPrintInfo *printInfo = [self printInfo]; NSPrintOperation *printOp; [printInfo setOrientation: NSLandscapeOrientation]; [printInfo setHorizontalPagination: NSFitPagination]; printOp = [NSPrintOperation printOperationWithView: theResults printInfo: printInfo]; [printOp setShowPanels: YES];//flag]; [printOp runOperation]; } - (NSString *)windowNibName { // Implement this to return a nib to load OR implement -makeWindowControllers to manually create your controllers. return @"myPanedResults"; } -(NSMutableArray *) arrayFromSubset: (NSArray *) who { int n; NSMutableArray *newArr = [[NSMutableArray alloc] init]; FORALL(who) { if((n = [backData indexOfObject: temp]) != NSNotFound) { [newArr addObject: [NSString stringWithFormat: @"%d", n]]; } } ENDFORALL; return newArr; } - (NSData *)dataRepresentationOfType:(NSString *)type { // Implement to provide a persistent data representation of your document OR remove this and implement the file-wrapper or file path based save methods. NSMutableData *dd; int first; int ab; int cnt; MWFile *theDPtr; NSMutableArray *nameList, *fixedDataArray, *rootArray, *nKeys; NSMutableDictionary *nSets; unichar newLineChar; dd = [[NSMutableData alloc] init]; #ifdef USESXML if([type isEqualToString: @"XML TAMS Result"]) { return [self keyedDataRepresentation]; } #endif if([type isEqualToString: @"TAMS Result"]) { rootArray = [[NSMutableArray alloc] init]; if(gWorkBench) { ab = [gWorkBench absPath]; } else ab = ABSPATHMODE; //1. save the version [rootArray addObject: @"10"]; FORALL(fileList) { if([temp hasFile] == NO) { NSWARNING(@"Cannot save in TAMS format until all source files have been saved."); return nil; } } ENDFORALL; //2. save the globals [rootArray addObject: [myGlobals getGlobals]]; //3. save the file list nameList = [[NSMutableArray alloc] init]; FORALL(fileList) { [nameList addObject: [[(MWFile *) temp name] copy]]; } ENDFORALL; [rootArray addObject: nameList]; //4. save the data fixedDataArray = [[NSMutableArray alloc] init]; FORALL(backData) { NSMutableDictionary *what; MWFile *myObj; what = [[NSMutableDictionary alloc] init]; [what addEntriesFromDictionary: temp]; myObj = [temp objectForKey: @"_doc"]; [what setObject: [[myObj name] copy] forKey: @"_doc"]; [fixedDataArray addObject: what]; } ENDFORALL; [rootArray addObject: fixedDataArray]; //5. save the visible data [rootArray addObject: [self arrayFromSubset: myData]]; //6. save the named sets nSets = [[NSMutableDictionary alloc] init]; nKeys = [namedSelDict allKeys]; FORALL(nKeys) { [nSets setObject: [self arrayFromSubset: [namedSelDict objectForKey: temp]] forKey: temp]; } ENDFORALL; [rootArray addObject: nSets]; //7. the limit string if(limitString) [rootArray addObject: limitString]; else [rootArray addObject: @""]; //8. the list of columns [rootArray addObject: colList]; //9. the current string [rootArray addObject: [[[limitField stringValue] copy] autorelease]]; //10. save the coder [rootArray addObject: [[codersString copy] autorelease]]; //11. save autosets [rootArray addObject: [self autoSets]]; //12. save the selected row [rootArray addObject: [NSNumber numberWithInt: [theResults selectedRow]]]; //13. save marked list [rootArray addObject: [self arrayFromSubset: markedList]]; //14. save summary reports [rootArray addObject: summReports]; //15. save date string [rootArray addObject: [[dfString copy] autorelease]]; [rootArray addObject: [NSNumber numberWithInt: dfIndex]]; //16. save auto history [rootArray addObject: autoHistory]; [rootArray addObject: [[autoHistoryStart copy] autorelease]]; //17. save media dictionary [rootArray addObject: [[mediaDict copy] autorelease]]; dd = [NSArchiver archivedDataWithRootObject: rootArray]; return dd; } #ifdef HIER if([type isEqualToString: @"HierFormat1"] == YES) { //make an array unichar retChar; NSMutableArray aaa = [[NSMutableArray alloc] init]; NSMutableString sss = [[NSMutableString alloc] init]; if([gPrefBoss macNLValue]) { retchar = '\n'; newLineChar = '\r'; } else { retchar = '\r'; newLineChar = '\n'; } if([myData count] == 0) {[dd release]; [aaa release]; return nil;} [aaa addObjectsFromArray: myData]; //sort it [aaa sortUsingFunction: stringComp context: @"_code"]; //set the first tag [sss setString: [[myData objectAtIndex: 0] objectForKey @"_code"]]; //print the head of the tree DATASTRING(dd, limitString); DATACHAR(dd, newLineChar); //print the first tag DATATAB(dd); DATASTRING(dd, sss); //loop til end of array FORALL(aaa) { NSMutableString *thisTag = [[NSMutableString alloc] init]; //set this tag [thisTag setString: [temp objectForKey: @"_code"]]; //if this tag is != to last tag if([thisTag isEqualToString: sss] == NO) { //print new tag DATATAB(dd); DATASTRING(dd, thisTag); [sss setString: thisTag]; } //print the data DATATAB(dd);DATATAB(dd); DATASTRING(dd, [temp objectForKey: @"_data"]); //add all the extra stuff DATACHAR(dd, '['); DATASTRING(dd, thisTab); DATACHAR(dd, ']'); //and a return DATACHAR(dd, newLineChar); } } else #endif #ifdef XML ; if([type isEqualToString: @"XML"] == YES) { DATASTRING(dd,@""); DATANL(dd); DATASTRING(dd,@""); DATANL(dd); cnt = 0; FORALL(myData) { id key; id ans; NSEnumerator *ns; NSMutableString *sss=[[NSMutableString alloc] init]; // DATASTRING(dd, [[NSNumber numberWithInt: cnt] stringValue]); cnt++; ns = [colList objectEnumerator]; DATATAB(dd); DATASTRING(dd, @"");DATANL(dd); while(key = [ns nextObject]) { ans = [temp objectForKey: key]; //if([ans length] == 0) continue; DATATAB(dd); DATATAB(dd); if([key isEqualToString: @"_begin_loc"] == YES) { DATASTRING(dd, @"<");DATASTRING(dd, key); DATASTRING(dd, @">"); DATASTRING(dd, ans); DATASTRING(dd, @"");DATANL(dd); DATATAB(dd); DATATAB(dd); DATASTRING(dd, @"<_end_loc>"); DATASTRING(dd, [temp objectForKey: @"_end_loc"]); DATASTRING(dd, @"");DATANL(dd); //do the document stuff here } else if([key isEqualToString: @"_line_number"] == YES) { DATASTRING(dd, @"<");DATASTRING(dd, key); DATASTRING(dd, @">"); DATASTRING(dd, ans); DATASTRING(dd, @"");DATANL(dd); } else if([key isEqualToString: @"_doc"] == YES) { theDPtr = [temp objectForKey: @"_doc"]; DATATAB(dd); DATATAB(dd); DATASTRING(dd, @"<_document>"); if([gWorkBench mwFileExists: (MWFile*)theDPtr] == YES) { if([theDPtr hasFile] == YES) DATASTRING(dd, [theDPtr path]); else DATASTRING(dd, [theDPtr name]); } else { DATASTRING(dd,@"???"); } DATASTRING(dd, @"");DATANL(dd); } else { [sss setString: ans]; if([sss length] > 0) [sss replaceOccurrencesOfString: @">" withString: @":" options: NSCaseInsensitiveSearch range: NSMakeRange(0, [sss length])]; DATASTRING(dd, @"<");DATASTRING(dd, key); DATASTRING(dd, @">"); if([key isEqualToString: @"_data"] == YES) { //this just inserts the line number and an escaped tab if appropriate NSNumber * what; what = [temp objectForKey: @"_line_number"]; if(what != nil) { if([what intValue] > 0 && [gPrefBoss TAScanForLN] == 1) { DATASTRING(dd, what); DATASTRING(dd, @"\\t"); } } } DATASTRING(dd, sss); DATASTRING(dd, @"");DATANL(dd); } } [sss release]; DATATAB(dd); DATASTRING(dd, @"");DATANL(dd); } ENDFORALL; DATASTRING(dd,@""); DATANL(dd); } else #endif //This is text { if([gPrefBoss macNLValue]) newLineChar = '\r'; else newLineChar = '\n'; first = 1; cnt = 1; if([myData count] == 0) {[dd release]; return nil;} //write the headers if([self global: @"headerflag"]) { DATACHAR(dd, '#'); FORALL(colList) { DATACHAR(dd,'\t'); DATASTRING(dd, temp); } ENDFORALL; DATATAB(dd); DATASTRING(dd, @"_end_loc"); DATACHAR(dd, newLineChar); } FORALL(myData) { id key; id ans; NSEnumerator *ns; DATASTRING(dd, [[NSNumber numberWithInt: cnt] stringValue]); cnt++; ns = [colList objectEnumerator]; while(key = [ns nextObject]) { DATATAB(dd); ans = [temp objectForKey: key]; if([key isEqualToString: @"_data"] == YES) { //this just inserts the line number and an escaped tab if appropriate NSNumber * what; what = [temp objectForKey: @"_line_number"]; if(what != nil) { if([what intValue] > 0 && [gPrefBoss TAScanForLN] == 1) { DATASTRING(dd, what); DATASTRING(dd, @"\\t"); } } } if([key isEqualToString: @"_begin_loc"] == YES) { DATASTRING(dd, ans /*[ans stringValue] */); DATATAB(dd); DATASTRING(dd, [temp objectForKey: @"_end_loc"] ); //do the document stuff here } else if( [key isEqualToString: @"_line_number"] == YES) { DATASTRING(dd, ans /*[ans stringValue]*/); } else if([key isEqualToString: @"_doc"] == YES) { theDPtr = [temp objectForKey: @"_doc"]; if([gWorkBench mwFileExists: (MWFile *)theDPtr] == YES) { if([(MWFile *) theDPtr hasFile] == YES) { DATASTRING(dd, [theDPtr path]); } else { DATASTRING(dd, [theDPtr name]); } } else { DATASTRING(dd,@"???"); } } else { DATASTRING(dd, ans); } } DATACHAR(dd, newLineChar);; } ENDFORALL; } //[myWindow setDocumentEdited: NO]; //[self updateChangeCount: NSChangeCleared]; [dd retain]; return dd; } /* - (void)document:(NSDocument *)doc didSave:(BOOL)didSave contextInfo:(void *)contextInfo { if(didSave == YES) { [myWindow setDocumentEdited: NO]; [self updateChangeCount: NSChangeCleared]; NSLog(@"result name $@\n",[self fileName]); //[self autorelease]; } } */ -(IBAction) niceClose: (id) Sender { [myWindow performClose: self]; } -(void) setTitleFromFile { if([[self getMWFile] hasFile]) { [myWindow setTitle: [[self getMWFile] name]]; } } -(void) willClose { // [self saveDocumentWithDelegate: self didSaveSelector: // @selector(document:didSave:contextInfo:) contextInfo:(void *)nil]; if(gWorkBench) { if([self fileName]) { [[self getMWFile] setOpenFile: self]; [[self getMWFile] setHasFile: YES]; } else { [[self getMWFile] setOpen: NO]; [[self getMWFile] setHasFile: NO]; } } if(gWorkBench){ if([[self getMWFile] hasFile] == NO) { [[self getMWFile] setOpen: NO]; [gWorkBench unregisterResult: [self getMWFile]]; gWorkBench = nil; //should release it as well } else { [[self getMWFile] setOpen: NO]; } } else [[self getMWFile] setOpen: NO]; //[self disconnect]; [[NSNotificationCenter defaultCenter] removeObserver: self name: @"TAMSResultDidChange" object: nil ]; ; } - (void)windowWillClose:(NSNotification *)aNotification { #if CLOSEBUG #else [self willClose]; #endif } -(void)handleAnEOF: (MWFile *) mf { NSString *ss; [self clearComments]; [self setCurrMWFile: mf]; if([self global: @"sectionsearch"] && ([gWorkBench isInitFile: mf] == YES)) { [[tce ctRunVault] removeAllObjects]; } if([self global: @"eofIsEndFlag"] && ([gWorkBench isInitFile: mf] == NO)) [self handleEnd: NO flush: NO]; if(mf) ss = [NSString stringWithFormat: @"%@ has unterminated coded passages", [mf name]]; else ss = [NSString stringWithString: @"There are unterminated coded passages"]; [tce ctDelAllZones]; if([self global: @"zapuniversal"]) //([gPrefBoss zapUnivValue]) { int i, n; NSArray *who; who = [univVault allKeys]; n = [who count]; for(i = 0; i < n; i++) { [univVault setObject: @"" forKey: [who objectAtIndex: i]]; } } FORALL([tce ctRunVault]) { if([temp openRun]) { [tce ctCloseAllOpenRuns]; if([self global: @"sectionsearch"] == YES && [gWorkBench isInitFile: mf] == YES) ; //don't do anything else NSWARNING(ss);//@"There are unterminated coded passages"); break; } } ENDFORALL; SETGLOBAL(@"lastRepeat", 0); /* NSWARNING(ss); //NSWARNING(@"You have unterminated coded passages"); [self handleEnd: NO flush: YES]; */ } -(void)handleEachEOF: (NSNotification *)anote { NSString *ss; if([self global: @"sectionsearch"] && ([gWorkBench isInitFile: [anote object]] == YES)) { [[tce ctRunVault] removeAllObjects]; } if([self global: @"eofIsEndFlag"] && ([gWorkBench isInitFile: [anote object]] == NO)) [self handleEnd: NO flush: NO]; [self clearComments]; if([anote object]) ss = [NSString stringWithFormat: @"%@ has unterminated coded passages", [[anote object] name]]; else ss = [NSString stringWithString: @"There are unterminated coded passages"]; [tce ctDelAllZones]; if([self global: @"skipinnertopofdoc"] == 0) innerRFlag = 1; else innerRFlag = 0; [self clearComments]; if([self global: @"zapuniversal"]) //([gPrefBoss zapUnivValue]) { int i, n; NSArray *who; who = [univVault allKeys]; n = [who count]; for(i = 0; i < n; i++) { [univVault setObject: @"" forKey: [who objectAtIndex: i]]; } } FORALL([tce ctRunVault]) { if([temp openRun]) { [tce ctCloseAllOpenRuns]; if([self global: @"sectionsearch"] == YES && [gWorkBench isInitFile: [anote object]] == YES) ; //don't do anything else NSWARNING(ss);//@"There are unterminated coded passages"); break; } } ENDFORALL; /* NSWARNING(ss); //NSWARNING(@"You have unterminated coded passages"); [self handleEnd: NO flush: YES]; */ } -(id) subsetFromArray: (NSArray *) who { NSMutableArray *aa = [[NSMutableArray alloc] init]; FORALL(who) { id testValue; testValue = [backData objectAtIndex: [temp intValue]]; [aa addObject: [backData objectAtIndex: [temp intValue]]]; }ENDFORALL; return aa; } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)type { // Implement to load a persistent data representation of your document OR remove this and implement the file-wrapper or file path based load methods. NSArray *rootArray; if([type isEqualToString: @"TAMS Result"] || [type isEqualToString: @"XML TAMS Result"]) { //rootArray = [NSUnarchiver unarchiveObjectWithData: data]; mySavedData = data; [mySavedData retain]; [savedDataType setString: type]; } return YES; } -(void) loadSavedData { { NSArray *rootArray; NSMutableArray *dataArray; NSMutableDictionary *theDict; NSArray *theSetNames, *fl; int selRow; NSDictionary *theSavedNS; // BOOL apm; // NSMutableString *wbPath = [[NSMutableString alloc] init]; selRow = 0; #ifdef USESXML if([savedDataType isEqualToString: @"XML TAMS Result"]){ [self loadKeyedData]; return; } #endif if(!gWorkBench) { NSWARNING(@"Cannot open file directly. Must open through a workbench/project"); return; } rootArray = [NSUnarchiver unarchiveObjectWithData: mySavedData]; if([[rootArray objectAtIndex: 0] isEqualToString: @"2.0a"] ||[ [rootArray objectAtIndex: 0] intValue] >= 3) { //2. save the globals [myGlobals setGlobals: [rootArray objectAtIndex: 1]]; //need to load the flag values //3. save the file list; have to convert to absolute paths fl = [rootArray objectAtIndex: 2]; FORALL(fl) { if(![gWorkBench fileForName: temp]) { NSString *msg1 = [NSString stringWithFormat:@"Cannot continue. Missing source file \"%@\" for this result.", temp]; NSWARNING(msg1); return; } else [fileList addObject: [gWorkBench fileForName: temp]]; } ENDFORALL; //4. save the data dataArray = [rootArray objectAtIndex: 3]; FORALL(dataArray) { theDict = [[NSMutableDictionary alloc] initWithDictionary: temp]; [theDict setObject: [gWorkBench fileForName: [temp objectForKey: @"_doc"]] forKey: @"_doc"]; [backData addObject: theDict]; } ENDFORALL; //5. save the visible data [myData addObjectsFromArray: [self subsetFromArray: [rootArray objectAtIndex: 4]]]; //6. save the named sets //get the dictionary theSavedNS = [rootArray objectAtIndex: 5]; //get the keys theSetNames = [theSavedNS allKeys]; //work through them FORALL(theSetNames) { [namedSelDict setObject: [self subsetFromArray: [theSavedNS objectForKey: temp]] forKey: temp]; } ENDFORALL; //if([theSetNames count]) [self renewNamedSelMenu]; //7. get the limit string if(!limitString) limitString = [[NSMutableString alloc] init]; [limitString setString: [rootArray objectAtIndex: 6]]; //8. get colList [colList addObjectsFromArray: [rootArray objectAtIndex: 7]]; //[myWindow setTitle: [[[self getMWFile] path] lastPathComponent]]; //9. [limitField setStringValue: [rootArray objectAtIndex: 8]]; //10. get the Coder's list if([[rootArray objectAtIndex: 0] intValue] >= 3) [codersString setString: [rootArray objectAtIndex: 9]]; //11. get the automatic sets if([[rootArray objectAtIndex: 0] intValue] >= 4) { [autoSets addEntriesFromDictionary: [rootArray objectAtIndex: 10]]; } [self rebuildAutoSetMenu]; //12. get the selected row if([[rootArray objectAtIndex: 0] intValue] >= 5) { selRow = [[rootArray objectAtIndex: 11] intValue]; [self markBackArray: [rootArray objectAtIndex: 12]]; } //13. summary reports if([[rootArray objectAtIndex: 0] intValue] >= 6) { [summReports addEntriesFromDictionary: [rootArray objectAtIndex: 13]]; [self rebuildSummReportMenu]; } if([[rootArray objectAtIndex: 0] intValue] >= 7) { [dfString setString: [rootArray objectAtIndex: 14]]; dfIndex = [[rootArray objectAtIndex: 15] intValue]; } if([[rootArray objectAtIndex: 0] intValue] >= 8) { [autoHistory addObjectsFromArray: [rootArray objectAtIndex: 16]]; } if([[rootArray objectAtIndex: 0] intValue] >= 9) { [autoHistoryStart setString: [rootArray objectAtIndex: 17]]; } if([[rootArray objectAtIndex: 0] intValue] >= 10) { [mediaDict addEntriesFromDictionary: [rootArray objectAtIndex: 18]]; } [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleResultsDidChange:) name: @"TAMSResultDidChange" object: gWorkBench]; FORALL(fileList) { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleDirtySourceFlag:) name: @"TAMSDocDidChange" object: temp]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(addCodeHandler:) name: @"TAMSDocAddedCode" object: temp]; }ENDFORALL; [self setupTables]; [dirtySourceFlag setState: NSOnState]; UPDATERECCOUNT; [self updateChangeCount: NSChangeCleared]; [self rebuildSummReportMenu]; [theResults reloadData]; if(selRow >= 0 && [theResults numberOfRows] > 0) { [theResults selectRow: selRow byExtendingSelection: NO]; [theResults scrollRowToVisible: selRow]; } } } } -(BOOL) windowShouldClose: (NSNotification *)aNotification { #if CLOSEBUG [self willClose]; #endif return YES; } - (void)windowControllerDidLoadNib:(NSWindowController *)windowController { [super windowControllerDidLoadNib: windowController]; [self zeroSetStack]; [theResults setDelegate: self]; [theResults setDoubleAction: @selector(fetchRow:)]; [self rebuildSummReportMenu]; //[self clearTable]; ;// [self executeTAMS]; } -(void) executeTAMS { //get the data if(!tce ) return; [self rebuildAutoSetMenu]; //only secure place to put it [self rebuildSummReportMenu]; if([tce gCurrentDataSource] != nil) { dataSource = [tce gCurrentDataSource]; //[[myWindow windowController] setShouldCloseDocument: YES]; //[self resetStorage]; //need to zero out the arrays, send inits to all the processes //ctInitRV(); //[tce initLimit]; [self clearTable]; [self setGlobal: @"firstwriteflag" to: 1]; [self setGlobal: @"rawflag" to: [dataSource rawF]]; [self setGlobal: @"emptyflag" to: [dataSource emptyF]]; [self setGlobal: @"exactflag" to: [dataSource exactF]]; [self setGlobal: @"simpleflag" to: [dataSource simpleF]]; [self setGlobal: @"regexcharflag" to: [dataSource regexCharF]]; [self setGlobal: @"nonregexcharflag" to: [dataSource nonRegexCharF]]; [self setGlobal: @"sectionsearch" to: [dataSource sectionF]]; [self setGlobal: @"raw1stflag" to: [dataSource rawF]]; [self setGlobal: @"empty1stflag" to: [dataSource emptyF]]; [self setGlobal: @"exact1stflag" to: [dataSource exactF]]; [self setGlobal: @"simple1stflag" to: [dataSource simpleF]]; [self setGlobal: @"section1stflag" to: [dataSource sectionF]]; [self setGlobal: @"regexchar1stflag" to: [dataSource regexCharF]]; [self setGlobal: @"nonregexchar1stflag" to: [dataSource nonRegexCharF]]; if([gPrefBoss countSectionsValue]) SETGLOBAL(@"emptysectionflag", 1); else SETGLOBAL(@"emptysectionflag",0); //[myWindow setReleasedWhenClosed: YES]; [fileList removeAllObjects]; [colList removeAllObjects]; [codersString setString: [dataSource codersList]]; [self buildCoderList]; //get the search if(limitString != nil) [limitString release]; limitString = [[NSMutableString alloc] init]; [limitString setString: [dataSource theLimitString]]; [fileList addObjectsFromArray: [tce hotFileList]]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleResultsDidChange:) name: @"TAMSResultDidChange" object: gWorkBench]; FORALL(fileList) { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleDirtySourceFlag:) name: @"TAMSDocDidChange" object: temp]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(addCodeHandler:) name: @"TAMSDocAddedCode" object: temp]; }ENDFORALL; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleEachEOF:) name: @"TAMSFileHasEnded" object: nil]; [self setOriginalStateString]; if([limitString length]) { /* if([self global: @"sectionsearch"] == 1) { [limitField setStringValue: [NSString stringWithFormat: @"Section: %@", limitString]]; } else [limitField setStringValue: limitString]; */ [self setGlobal: @"limitflag" to: 1]; [tce handlelimit: limitString]; [self doTamsSearch: limitString]; [tce ctCloseAllOpenRuns]; if([[tce ctRunVault] count]) [self handleEnd: NO flush: NO]; } else { /* if([self global: @"sectionsearch"] == 1) { [limitField setStringValue: [NSString stringWithFormat: @"Section: unlimited", limitString]]; } else [limitField setStringValue: @"Unlimited"]; */ [self setGlobal: @"limitflag" to: 0]; [self doTamsSearch: nil]; [tce ctCloseAllOpenRuns]; if([[tce ctRunVault] count]) [self handleEnd: NO flush: NO]; } [tce setGCurrentTAMS: nil]; //do the search //do the tables //reload [self setupTables]; [myWindow makeKeyAndOrderFront: self]; [backData removeAllObjects]; [backData addObjectsFromArray: myData]; [self updateChangeCount: NSChangeDone]; UPDATERECCOUNT; [theResults reloadData]; [[NSNotificationCenter defaultCenter] removeObserver:self name: @"TAMSFileHasEnded" object: nil]; } [tce release]; } #ifdef SECTIONSEARCH -(NSMutableDictionary *) token2Dictionary: (ctQChar *) qq { NSALLOC(NSMutableDictionary, myD); [myD setObject: [[[qq buff] copy] autorelease] forKey: @"code"]; [myD setObject: [[[qq coder] copy] autorelease] forKey: @"coder"]; [myD setObject: @"Open" forKey: @"state"]; return [myD autorelease]; } -(void) removeCloseTags: (NSMutableArray *) aa { int i, n; NSMutableDictionary *tt; n = [aa count]; for(i = n - 1; i >= 0; i--) { tt = [aa objectAtIndex: i]; if([[tt objectForKey: @"state"] isEqualToString: @"Closed"]) [aa removeObject: tt]; } } -(void) addTokenForChar: (ctQChar *) qq forSection: (coderec *) ms { NSMutableArray *aa = [ms sectionCodes]; FORALL(aa) { if([[temp objectForKey: @"code"] isEqualToString: [qq buff]] && [[temp objectForKey: @"coder"] isEqualToString: [qq coder]]) { if([[temp objectForKey: @"state"] isEqualTo: @"Closed"]) { [temp setObject: @"Open" forKey: @"state"]; return; } } } ENDFORALL; [aa addObject: [self token2Dictionary: qq]]; } -(void) closeTokenForChar: (ctQChar *) qq forSection: (coderec *) ms { NSMutableArray *aa = [ms sectionCodes]; FORALL(aa) { if([[temp objectForKey: @"code"] isEqualToString: [qq buff]] && [[temp objectForKey: @"coder"] isEqualToString: [qq coder]]) { [temp setObject: @"Close" forKey: @"Closed"]; } } ENDFORALL; } #endif -(void) setCurrMWFile: (MWFile *) who { currMWFile = who; } -(MWFile *) currMWFile { return currMWFile; } - (void) doTamsSearch: (NSString *) aLimString { int nn; ctQChar *qq; #ifdef REGEXSEARCH AGRegex *regex; AGRegexMatch *match; NSArray *fl; int rsi, rsj, rsk, rsnn3, rsnn, rsnn2; int charZoom; int chtype; unsigned opt; long rsln; NSRange rsr, rsr2, rsr3; #endif #ifdef SECTIONSEARCH coderec *mySect; mySect = nil; #endif #ifdef REGEXSEARCH #endif qq = nil; qq = [[ctQChar alloc] init]; nn = [self global: @"simpleflag"]; //setup(); [tce setGCurrentTAMS: self]; #ifdef REGEXSEARCH charZoom = [gPrefBoss zoomFactorValue]; if([self global: @"nonregexcharflag"]) { fl = [tce hotFileList]; [colList addObject: @"_code"]; [colList addObject: @"_data"]; [colList addObject: @"_begin_loc"]; [colList addObject: @"_doc"]; opt = 0; if([self global: @"exactflag"] == 0) opt = NSCaseInsensitiveSearch; rsnn = [fl count]; for(rsi = 0 ; rsi < rsnn; rsi++) { MWFile *rsFile; NSString *rsString; fl = [tce hotFileList]; rsFile = [fl objectAtIndex: rsi]; rsString = [rsFile string]; rsln = [rsString length]; rsnn2 = 1; rsr3 = NSMakeRange(0, rsln - 1); while(rsnn2) { rsr = [rsString rangeOfString: limitString options: opt range: rsr3]; if(rsr.location != NSNotFound) { NSALLOC(NSMutableDictionary,theRec); rsr2 = rsr; if(charZoom > rsr2.location) { rsr2.length += charZoom; rsr2.location = 0; } else { rsr2.length += charZoom; rsr2.location -= charZoom; } rsr2.length += charZoom; if(rsr2.location + rsr2.length >= rsln) rsr2.length = rsln - rsr2.location; [theRec setObject: rsFile forKey: @"_doc"]; [theRec setObject: [[limitString copy] autorelease] forKey: @"_code"]; [theRec setObject: [rsString substringWithRange: rsr2] forKey: @"_data"]; /*[theRec setObject: [[[match groupAtIndex: rsk] copy] autorelease] forKey: @"_data"];*/ [theRec setObject: [[NSNumber numberWithLong: rsr.location] stringValue] forKey: @"_begin_loc"]; [theRec setObject: [[NSNumber numberWithLong: rsr.location + rsr.length] stringValue] forKey: @"_end_loc"]; rsr3.location = rsr.location + rsr.length; rsr3.length = rsln - rsr3.location; [myData addObject: theRec]; } else rsnn2 = 0; } } if(!qq) [qq release]; return; } #define NEWREGEXSEARCHCODE if([self global: @"regexcharflag"]) { NSRange tr; opt = 0; if([self global: @"exactflag"] == 0) opt = AGRegexCaseInsensitive; if([self global: @"emptyflag"] == 1) opt |= AGRegexMultiline; //regex = [[AGRegex alloc] initWithPattern: limitString options: opt]; fl = [tce hotFileList]; [colList addObject: @"_code"]; [colList addObject: @"_data"]; [colList addObject: @"_begin_loc"]; [colList addObject: @"_doc"]; rsnn = [fl count]; for(rsi = 0 ; rsi < rsnn; rsi++) { MWFile *rsFile; NSString *rsString; NSMutableDictionary *theRec; NSAutoreleasePool *myPool; int sbstr; if([codersString isEqualToString: @""] == YES) sbstr = 0; else sbstr = [codersString intValue]; //NSLog(@"str: %@; int:%d\n", codersString, sbstr); fl = [tce hotFileList]; rsFile = [fl objectAtIndex: rsi]; rsString = [rsFile string]; rsln = [rsString length]; tr = NSMakeRange(0,0); for(;;) { //fl = [regex findAllInString: rsString]; theRec = [[NSMutableDictionary alloc] init]; myPool = [[NSAutoreleasePool alloc] init]; rsr = rsr2 = [rsString findString: limitString selectedRange: tr options:opt wrap:NO regex: YES multiline: YES substring: sbstr]; [myPool release]; if(rsr.location == NSNotFound) break; { if(charZoom > rsr2.location) { rsr2.length += charZoom; rsr2.location = 0; } else { rsr2.length += charZoom; rsr2.location -= charZoom; } rsr2.length += charZoom; if(rsr2.location + rsr2.length >= rsln) rsr2.length = rsln - rsr2.location; [theRec setObject: [rsString substringWithRange: rsr2] forKey: @"_data"]; [theRec setObject: rsFile forKey: @"_doc"]; [theRec setObject: [[limitString copy] autorelease] forKey: @"_code"]; /*[theRec setObject: [[[match groupAtIndex: rsk] copy] autorelease] forKey: @"_data"];*/ [theRec setObject: [[NSNumber numberWithLong: rsr.location] stringValue] forKey: @"_begin_loc"]; [theRec setObject: [[NSNumber numberWithLong: rsr.location + rsr.length] stringValue] forKey: @"_end_loc"]; [myData addObject: [theRec autorelease]]; } tr.location = rsr.location + rsr.length; tr.length = 0; }//for(;;) } //[regex release]; return; } #endif #ifdef SCANCODE while((chtype = [tce scanNext: qq]) != ENDOFALLFILES) #else while([tce readnext: qq] != EOF) #endif { if(chtype != ENDOFFILE) { [self setCurrMWFile: [qq source]]; } #ifdef SECTIONSEARCH if([self global: @"sectionsearch"]) { //we need to add the open dictionary if([tce hasSectionRun] == NO) { [tce ctOpenSectionRun]; } #ifdef SCANCODE switch(chtype) #else switch([qq tokentype]) #endif { case TOKEN: //handle inner repeat if([self isRepeat: [qq buff]] && [self isInnerRepeat: [qq buff]] && innerRFlag) { [self handleEnd: YES flush: NO]; } else { innerRFlag = 1; } //handle last repeat if([self isRepeat: [qq buff]] && [self global: @"lastRepeat"]) { [self handleEnd: YES flush: NO]; SETGLOBAL(@"lastRepeat", 0);//[self setGlobal: @"lastRepeat" 0]; } if([self isLastRepeat: [qq buff]] == YES) {SETGLOBAL(@"lastRepeat", 1);} if([tce hasSectionRun] == NO) { [tce ctOpenSectionRun]; } if([self isRepeat: [qq buff]] == YES) [tce ctOpenRun: qq]; [tce ctAddSectionTag: [self token2Dictionary:qq]]; [tce ctAddOpenChar: qq]; break; break; case ENDTOKEN: if([tce hasSectionRun] == NO) { [tce ctOpenSectionRun]; } if([extraComment length])[qq addExtra: [self getComment]]; [tce ctAddOpenChar: qq]; [tce ctCloseSectionTagForCode: [qq buff] Coder: [qq coder]]; [tce ctCloseRun: qq]; break; case CHAR: if([tce hasSectionRun] == NO) { [tce ctOpenSectionRun]; } [tce ctAddOpenChar: qq]; break; case META: [self handlemeta: qq]; break; if([tce hasSectionRun] == NO) { mySect = [tce ctOpenSectionRun]; } break; case ENDOFFILE: [self handleAnEOF: [qq source]]; break; }; continue; } #endif // regular simple and non-simple searches if(/*![self global: @"limitflag"] || */[self global: @"simpleflag"]) { #ifdef SCANCODE switch(chtype) #else switch([qq tokentype]) #endif { case TOKEN: if([self isRepeat: [qq buff]] && [self isInnerRepeat: [qq buff]] && innerRFlag) [self handleEnd: YES flush: NO]; else { innerRFlag = 1; } if([self isRepeat: [qq buff]] && [self global: @"lastRepeat"]) { [self handleEnd: YES flush: NO]; SETGLOBAL(@"lastRepeat", 0);//[self setGlobal: @"lastRepeat" 0]; } if([self isLastRepeat: [qq buff]] == YES) { SETGLOBAL(@"lastRepeat", 1); } if([self global: @"simpleflag"] && aLimString) { //aCode = [[ctLimitCrit alloc] initWithString: aLimString]; //if(isStringTrue(aCode, [qq buff]) || [self isRepeat: [qq buff]]) if([tce isTagTrue: qq] || [self isRepeat: [qq buff]]) { [tce ctOpenRun: qq]; } } else [tce ctOpenRun: qq]; [tce ctAddZone: qq]; if([self global: @"rawflag"]) [tce ctAddOpenChar: qq]; break; case ENDTOKEN: if([extraComment length])[qq addExtra: [self getComment]]; [tce ctCloseRun: qq]; [tce ctDelZone: qq ]; if([self global: @"rawflag"]) [tce ctAddOpenChar: qq]; if([self global: @"basicflag"]) [self handleEnd: YES flush: NO]; break; case CHAR: [tce ctAddOpenChar: qq]; break; case META: [self handlemeta: qq]; break; case ENDOFFILE: [self handleAnEOF: [qq source]]; break; }; } //here is the limit logic else if(/*[self global: @"limitflag"] && */ ![self global: @"simpleflag"]) { int zoneFlag; if(chtype == ENDTOKEN) if([extraComment length])[qq addExtra: [self getComment]]; if(chtype == ENDOFFILE) { [self handleAnEOF: [qq source]]; continue; } if(chtype == TOKEN) { if([self isRepeat: [qq buff]] && [self isInnerRepeat: [qq buff]] && innerRFlag) [self handleEnd: YES flush: NO]; else innerRFlag = 1; if([self isRepeat: [qq buff]] && [self global: @"lastRepeat"]) { [self handleEnd: YES flush: NO]; SETGLOBAL(@"lastRepeat", 0);//[self setGlobal: @"lastRepeat" 0]; } if([self isLastRepeat: [qq buff]] == YES) { SETGLOBAL(@"lastRepeat", 1); } } zoneFlag = [tce handleLimChar: qq]; if(zoneFlag == STARTLIM) { //if([self isRepeat: [qq buff]]) continue; [tce ctOpenLimRun: qq]; } else if (zoneFlag == ENDLIM) { [tce ctCloseLimRun: qq]; if([self global:@"basicflag"]) [self handleEnd: YES flush: NO]; } else if (zoneFlag == INLIM) [tce ctAddLimChar:qq]; } } /* if([self global: @"eofIsEndFlag"]) //if([gPrefBoss EOFIsEndValue]) [self handleEnd: NO flush: NO]; */ [tce checkZones]; } - (void)savePanelDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { if(returnCode == NSCancelButton) return; if(returnCode == NSOKButton) { [self writeToFile:[[NSSavePanel savePanel] filename] ofType: @"DocumentType"]; } } -(NSMutableArray *) convertString: (NSString *) theString onChar: (unichar) breakChar { int i, len; unichar c; NSMutableString *ss = [[NSMutableString alloc] init]; NSMutableArray *ans = [[NSMutableArray alloc] init]; len = [theString length]; [ss setString: @""]; for(i = 0; i < len; i++) { c = [theString characterAtIndex: i]; if(c == ' ') { ; } else if (c == breakChar) { if([ss length] > 0) { [ans addObject: [ss copy]]; [ss setString: @""]; } } else { [ss ADDCHAR(c)]; } } if([ss length]) { [ans addObject: [ss copy]]; } return ans; } -(void) addToList: (NSMutableArray *) aList usingString: (NSString *) aString { NSMutableArray *ans; int i,n; if(aString == nil) return; if([aString isEqualToString: @""]) return; ans = [self convertString: aString onChar: ',']; //ans = convertStringToArray(aString, ','); //[ans retain]; n = [ans count]; for(i = 0; i < n; i++) { if(arrayContainsString(aList , [ans objectAtIndex: i]) == NO) [aList addObject: [ans objectAtIndex: i]]; } //[aList addObjectsFromArray: ans]; } -(BOOL)isHotCoder: (NSMutableDictionary *) rec { if([codersList count] == 0) return YES; FORALL(codersList) { if([temp isEqualToString: @"*"] == YES) { if([[rec objectForKey: @"_coder"] isEqualToString: @""] == YES) return YES; } else if([temp isEqualToString: [rec objectForKey: @"_coder"]] == YES) return YES; } ENDFORALL; return NO; } -(void) doContWithDict: (NSMutableDictionary *) theVault { int iii, nnn, ii, nn; NSMutableDictionary *contList, *contValue; NSArray *myKeyArray, *myContArray; myKeyArray = [theVault allKeys]; nnn = [myKeyArray count]; for(iii = 0; iii < nnn; iii++) { //work through //look up the repeat variabl if((contList = [repCont objectForKey: [myKeyArray objectAtIndex: iii]]) != nil) { //get the contingency contValue = [contList objectForKey: [theVault objectForKey: [myKeyArray objectAtIndex: iii]]]; if(contValue != nil) { myContArray = [contValue allKeys]; //set for each nn = [myContArray count]; for(ii = 0; ii < nn; ii++) { //if it's a repeat if([self isRepeat: [myContArray objectAtIndex: ii]] || [self isUniversal: [myContArray objectAtIndex: ii]] ) { [theVault setObject: [contValue objectForKey: [myContArray objectAtIndex: ii]] forKey: [myContArray objectAtIndex: ii]]; } } } else //zap the contingent variables { } } } } -(void) assignRepeat: (NSString *) rname withValue: (NSString *) rvalue { NSMutableString *ss, *tt; if([fieldMap count] > 0) { ss = [fieldMap objectForKey: rname]; if(ss == nil) [repVault setObject: rvalue forKey: rname]; else [repVault setObject: rvalue forKey: ss]; } else [repVault setObject: rvalue forKey: rname]; } int sectionTotCnt = 0; -(void) handleEnd: (BOOL) section flush: (BOOL) flushFlag { NSEnumerator *myenums ; coderec *mykey; NSString *ss, *st; NSMutableArray *doneList; int n; int realcnt; int fflag; fflag = 1; //first time through the emptys realcnt = 0; n= 0; if([self global: @"emptyflag"]) n = 1; if(section == YES && MYGLOBAL(@"emptysectionflag") == NO && [self global: @"sectionsearch"]) return; //we're not done if([self global: @"sectionsearch"]) { /* being here means that the section has ended, since this is called for !end*/ [tce ctCloseSectionRun]; /* filter results */ [tce filterSectionRuns]; } //|| (section == YES && [self global: @"emptysectionflag"]) //first handle all of the repeats //need to make this conditional on emptyflag /* if([self global: @"emptyflag"]) [repVault removeAllObjects]; */ //set the repeats FORALL([tce ctRunVault]) { st = [temp theName]; //for debugging //if([self isRepeat: [temp theName]]) if([temp runType] == REPEATRUN) { if(ss = [temp record]) { [self assignRepeat: [temp theName] withValue: [ss copy]]; //[repVault setObject: [ss copy] forKey: ]; } else [self assignRepeat: [temp theName] withValue: @""]; //[repVault setObject: @"" forKey: [temp theName]]; } } ENDFORALL; [self doContWithDict: repVault]; if([self global: @"firstwriteflag"]) { //[colList addObject: @"#"]; FORALL(univList) { [colList addObject: temp]; } ENDFORALL; FORALL(repList) { [colList addObject: temp]; } ENDFORALL; [colList addObject: @"_code"]; [colList addObject: @"_data"]; [colList addObject: @"_comment"]; [colList addObject: @"_coder"]; [colList addObject: @"_doc"]; if([tce hasLineNumbers] && [gPrefBoss TAScanForLN]) [colList addObject: @"_line_number"]; [colList addObject: @"_begin_loc"]; [self setGlobal: @"firstwriteflag" to: 0]; sectionTotCnt = 0; } myenums = [[tce ctRunVault] objectEnumerator]; while(mykey = [myenums nextObject]) { NSMutableDictionary *myrec; //if([mykey openRun] == YES) continue; if([self isRepeat: [mykey theName]] == YES) continue; //if it isn't in our approved coder list nix it //if([self isValidCoder: [mykey theCoder]] == NO) // continue; //we're not a repeat so this one counts //make a dictionary of myrec = [[NSMutableDictionary alloc] init]; // the univerals FORALL(univList) { [myrec setObject: [univVault objectForKey: temp] forKey: temp]; } ENDFORALL; //the repeats FORALL(repList) { NSString *tt; if(tt = [repVault objectForKey: temp]) [myrec setObject: tt forKey: temp]; else [myrec setObject: @"" forKey: temp]; } ENDFORALL; //This is where we need to add handling for cross code stuff if([mykey hasInfo] == YES && [mykey openRun] ==NO) { if([mykey runType] != SECTIONRUN) [myrec setDictionary: [mykey affiliatedInfo]]; } //ask if it has cross code //use that instead //if it is open and doesn't have one give it one //otherwise //the code [myrec setObject: [[mykey theName] copy] forKey: @"_code"]; //the comment [myrec setObject: [[mykey comment] copy] forKey: @"_comment"]; //the comment [myrec setObject: [[mykey theCoder] copy] forKey: @"_coder"]; //the document [myrec setObject: [mykey doc] forKey: @"_doc"]; //the index [myrec setObject: [[NSNumber numberWithLong: [mykey beginLoc]] stringValue] forKey: @"_begin_loc"]; [myrec setObject: [[NSNumber numberWithLong: [mykey endLoc]] stringValue] forKey: @"_end_loc"]; if([tce hasLineNumbers] && [gPrefBoss TAScanForLN]) [myrec setObject: [[NSNumber numberWithInt: [mykey lineStart]] stringValue] forKey: @"_line_number"]; //the data [myrec setObject: [[mykey record] copy] forKey: @"_data"]; if( [mykey hasInfo] == NO && [mykey openRun] == YES && ![self global: @"backloadrepeatflag"]) { if([mykey runType] != SECTIONRUN) [mykey setAffiliatedInfo: myrec]; if([self isHotCoder: myrec] == YES) realcnt++; } else if([mykey openRun] == NO) { if([self isHotCoder: myrec] == YES) { [myData addObject: myrec]; realcnt++; } } } sectionTotCnt += realcnt; // empty flag case if(((section == NO) || (section == YES && MYGLOBAL(@"emptysectionflag"))) && n && sectionTotCnt == 0) { NSMutableDictionary *myrec; myrec = [[NSMutableDictionary alloc] init]; // the univerals FORALL(univList) { [myrec setObject: [univVault objectForKey: temp] forKey: temp]; } ENDFORALL; //the repeats FORALL(repList) { NSString *tt; if(tt = [repVault objectForKey: temp]) { [myrec setObject: tt forKey: temp]; } else [myrec setObject: @"" forKey: temp]; } ENDFORALL; //the code [myrec setObject: @"*EMPTY*" forKey: @"_code"]; //the data [myrec setObject: @"" forKey: @"_data"]; //the comment [myrec setObject: @"" forKey: @"_comment"]; //the document //the index if([[tce ctRunVault] count]) { mykey = [[tce ctRunVault] objectAtIndex: 0]; [myrec setObject: [[NSNumber numberWithLong: [mykey beginLoc]] stringValue] forKey: @"_begin_loc"]; [myrec setObject: [[NSNumber numberWithLong: [mykey endLoc]] stringValue] forKey: @"_end_loc"]; [myrec setObject: [mykey doc] forKey: @"_doc"]; } else { int tl; MWFile *www; [myrec setObject:( [NSNumber numberWithLong: tl = [tce getCharLocation]]) forKey: @"_begin_loc"]; [myrec setObject:([NSNumber numberWithLong: tl = [tce getCharLocation]]) forKey: @"_end_loc"]; /*if([tce hotSearchDocument] != nil)*/ [myrec setObject: (www=[self currMWFile]) forKey: @"_doc"]; // else [myrec setObject: [ stringWithString: @"NO DOC"] forKey: @"_doc"]; tl = 0; #ifdef rightCode int tl; MWFile *www; [myrec setObject:( tl = [NSNumber numberWithLong: [tce getCharLocation]]) forKey: @"_begin_loc"]; [myrec setObject:( tl = [NSNumber numberWithLong: [tce getCharLocation]]) forKey: @"_end_loc"]; [myrec setObject: (www=[self currMWFile]) forKey: @"_doc"]; tl = 0; #endif } [myData addObject: myrec]; } // empty the data source //[ctRunVault removeAllObjects]; doneList = [[NSMutableArray alloc] init]; FORALL([tce ctRunVault]) { if([temp openRun] == NO) [doneList addObject: temp]; else if([self global: @"rawflag"] && [self global: @"basicflag"] == 0) [temp addString: @"{!end}"]; } ENDFORALL; FORALL(doneList) { [[tce ctRunVault] removeObject: temp]; } ENDFORALL; [doneList removeAllObjects]; [doneList release]; //if clean remove the repeats if(MYGLOBAL(@"cleanflag") && (section == NO)) { [repVault removeAllObjects]; } if(section == NO || MYGLOBAL(@"emptysectionflag") == 1) sectionTotCnt = 0; } /* This creates basically a tree structure using nsdictionaries. the first is a dictionary of repeat values and it returns a dictionary of possible values which returns a dictionary of contingent variables which returns a dictionary of their values */ #define IFVER2 -(void) handleIf: (NSString *) cList { AGRegex *myExpr, *myExpr2; AGRegexMatch *myMatch; NSArray *myMatch2; NSMutableDictionary *theBase, *tb2; //first look for the regex #ifdef IFVER1 myExpr = [[AGRegex alloc] initWithPattern: @"([a-zA-Z0-9\\_]+)[\\t\\ \\n\\r]*=[\\t\\ \\n\\r]*\\\"(.*)\\\"[\\t\\ \\n\\r]*=>[\\t\\ \\n\\r]*([a-zA-Z0-9\\_]+)[\\t\\ \\n\\r]*=[\\t\\ \\n\\r]*\\\"(.*)\\\""]; #endif #ifdef IFVER2 myExpr = [[AGRegex alloc] initWithPattern: @"^[\\t\\ \\n\\r]*([a-zA-Z0-9\\_]+)[\\t\\ \\n\\r]*=[\\t\\ \\n\\r]*\\\"([^\\\"]*)\\\"[\\t\\ \\n\\r]*=>"]; myExpr2 = [[AGRegex alloc] initWithPattern: @"=>[\\t\\ \\n\\r]*([a-zA-Z0-9\\_]+)[\\t\\ \\n\\r]*=[\\t\\ \\n\\r]*\\\"([^\\\"]*)\\\""]; #endif myMatch = [myExpr findInString: cList]; if( [myMatch count]) { theBase = [repCont objectForKey: [myMatch groupAtIndex: 1]]; #ifdef IFVER2 myMatch2 = [myExpr2 findAllInString: cList]; #endif if(theBase != nil) { if((tb2 = [theBase objectForKey: [myMatch groupAtIndex: 2]]) != nil) { #ifdef IFVER2 int n2, i2; n2 = [myMatch2 count]; for(i2 = 0; i2 < n2; i2++) { [tb2 setObject: [[myMatch2 objectAtIndex: i2] groupAtIndex: 2] forKey: [[myMatch2 objectAtIndex: i2] groupAtIndex: 1]]; } #endif #ifdef IFVER1 [tb2 setObject: [myMatch groupAtIndex: 4] forKey: [myMatch groupAtIndex: 3]]; #endif } else { int n2, i2; //tb2 = [[NSMutableDictionary alloc] init]; tb2 = [NSMutableDictionary dictionary]; #ifdef IFVER2 n2 = [myMatch2 count]; for(i2 = 0; i2 < n2; i2++) { [tb2 setObject: [[myMatch2 objectAtIndex: i2] groupAtIndex: 2] forKey: [[myMatch2 objectAtIndex: i2] groupAtIndex: 1]]; } #endif #ifdef IFVER1 [tb2 setObject: [myMatch groupAtIndex: 4] forKey: [myMatch groupAtIndex: 3]]; #endif [theBase setObject: tb2 forKey: [myMatch groupAtIndex: 2]]; } } else { theBase = [NSMutableDictionary dictionary];//[[NSMutableDictionary alloc] init]; tb2 = [NSMutableDictionary dictionary];// [[NSMutableDictionary alloc] init]; #ifdef IFVER1 [tb2 setObject: [myMatch groupAtIndex: 4] forKey: [myMatch groupAtIndex: 3]]; #endif #ifdef IFVER2 { int n2, i2; n2 = [myMatch2 count]; for(i2 = 0; i2 < n2; i2++) { [tb2 setObject: [[myMatch2 objectAtIndex: i2] groupAtIndex: 2] forKey: [[myMatch2 objectAtIndex: i2] groupAtIndex: 1]]; } } #endif [theBase setObject: tb2 forKey: [myMatch groupAtIndex: 2]]; [repCont setObject: theBase forKey: [myMatch groupAtIndex: 1]]; } } //apply changes to any universals [self doContWithDict: univVault]; } #ifdef FIELDMAP -(void) handleMap: (NSString *) namelist { NSArray *aa, *bb; NSMutableString *ss, *tt; ss = [NSMutableString string]; tt = [NSMutableString string]; aa = [namelist componentsSeparatedByString: @","]; //break up the commas //for each FORALL(aa) { bb = [temp componentsSeparatedByString: @"->"]; //separate out the parts for each //copy to a nsmutalbestring if([bb count] != 2) continue; [ss setString: [bb objectAtIndex: 0]]; trimNSS(ss); [tt setString: [bb objectAtIndex: 1]]; trimNSS(tt); [fieldMap setObject: tt forKey: ss]; }ENDFORALL; //strip them //add to dictionary } #endif -(void) handleSetRepeat: (NSString *) namelist { NSMutableArray *myUList; int n; NSMutableString *s1, *s2, *s3; NSMutableArray *oneUVar; NSEnumerator *myen; s1 = [[NSMutableString alloc] init]; s2 = [[NSMutableString alloc] init]; myUList = convertStringToArray(namelist, ','); myen = [myUList objectEnumerator]; n = [myUList count]; [s1 setString: @""]; [s2 setString: @""]; while(s3 = [myen nextObject]) { oneUVar = convertStringToArray(s3, '='); if([oneUVar count] == 2) { [s1 setString: [oneUVar objectAtIndex: 0]]; trimNSS(s1); [s2 setString: [oneUVar objectAtIndex: 1]]; trimNSS(s2); //add to both the list and the dictionary trimNSS(s2); trimCharNSS(s2,'\"'); if(arrayContainsString(repList, s1) == NO) [repList addObject: [s1 copy]]; if([self isRepeat: s1] && [self isInnerRepeat: s1]) [self handleEnd: YES flush: NO]; [self assignRepeat: [[s1 copy] autorelease] withValue: [[s2 copy] autorelease]]; //[repVault setObject: [[s2 copy] autorelease] forKey:[[s1 copy] autorelease] ]; [s1 setString: @""]; [s2 setString: @""]; } } //apply contingencies [self doContWithDict: repVault]; } -(void) handleUniversal: (NSString *) namelist { NSMutableArray *myUList; int n; NSMutableString *s1, *s2, *s3; NSMutableArray *oneUVar; NSEnumerator *myen; s1 = [[NSMutableString alloc] init]; s2 = [[NSMutableString alloc] init]; myUList = convertStringToArray(namelist, ','); myen = [myUList objectEnumerator]; n = [myUList count]; [s1 setString: @""]; [s2 setString: @""]; while(s3 = [myen nextObject]) { oneUVar = convertStringToArray(s3, '='); if([oneUVar count] == 2) { [s1 setString: [oneUVar objectAtIndex: 0]]; trimNSS(s1); [s2 setString: [oneUVar objectAtIndex: 1]]; trimNSS(s2); //add to both the list and the dictionary trimNSS(s2); trimCharNSS(s2,'\"'); if(arrayContainsString(univList, s1) == NO) [univList addObject: [s1 copy]]; [univVault setObject: [[s2 copy] autorelease] forKey: [[s1 copy] autorelease]]; [s1 setString: @""]; [s2 setString: @""]; } } //apply contingencies [self doContWithDict: univVault]; } /* switchboard for the meta commands */ -(void) handlemeta: (ctQChar *) myc { int i; NSMutableString *buff; buff = [[NSMutableString alloc] init]; /* trim the data */ if([[myc extra] length]) { i = 0; while([[myc extra] characterAtIndex: i] == ' ') { i++; if(i >= [[myc extra] length]) break; } [buff setString: [[myc extra] substringFromIndex: i]]; } else [buff setString: @""]; ON(@"end") { SETGLOBAL(@"basicflag",0); [self handleEnd: NO flush: NO]; if([self global: @"skipinneratend"] == 1) innerRFlag = 0; } else ON(@"backloadrepeat") SETGLOBAL(@"backloadrepeatflag", 1); else ON(@"frontloadrepeat") SETGLOBAL(@"backloadrepeatflag", 0); else ON(@"endsection"){ SETGLOBAL(@"basicflag", 0); [self handleEnd: YES flush: NO]; if([self global: @"skipinneratend"] == 1) innerRFlag = 0; } //media else ON(@"mediafile") { [mediaDict setObject: [[[myc extra] copy] autorelease] forKey:[[[[myc source] path] copy] autorelease] ]; } //repeat and ailiases else ON(@"repeat") [self addToList: repList usingString: buff]; else ON(@"context") [self addToList: repList usingString: buff]; else ON(@"contextcode") [self addToList: repList usingString: buff]; //inner and aliases else ON(@"first") {[lastRepList removeAllObjects]; [innerRepList removeAllObjects];[self addToList: innerRepList usingString: buff]; SETGLOBAL(@"basicflag",0);} else ON(@"inner") {[lastRepList removeAllObjects]; [innerRepList removeAllObjects];[self addToList: innerRepList usingString: buff]; SETGLOBAL(@"basicflag",0);} else ON(@"innerrepeat") {[lastRepList removeAllObjects]; [innerRepList removeAllObjects];[self addToList: innerRepList usingString: buff]; SETGLOBAL(@"basicflag",0);} else ON(@"firstrepeat") {[lastRepList removeAllObjects]; [innerRepList removeAllObjects];[self addToList: innerRepList usingString: buff]; SETGLOBAL(@"basicflag",0);} else ON(@"skipinnertopofdoc") { SETGLOBAL(@"skipinnertopofdoc",1); innerRFlag = 0; } else ON(@"noskipinnertopofdoc") { SETGLOBAL(@"skipinnertopofdoc",0); innerRFlag = 1; } else ON(@"skipinneratend") SETGLOBAL(@"skipinneratend",1); else ON(@"noskipinneratend") SETGLOBAL(@"skipinneratend",0); //last repeat and aliases else ON(@"lastrepeat") {SETGLOBAL(@"basicflag",0); [innerRepList removeAllObjects]; [lastRepList removeAllObjects]; [self addToList: lastRepList usingString: buff];SETGLOBAL(@"lastRepeat",0);} else ON(@"last") {[innerRepList removeAllObjects]; [lastRepList removeAllObjects]; [self addToList: lastRepList usingString: buff];SETGLOBAL(@"lastRepeat",0);} #ifdef FIELDMAP else ON(@"zapmap") [fieldMap removeAllObjects]; #endif //struct and unstruct and aliases else ON(@"basic") SETGLOBAL(@"basicflag", 1); else ON(@"unstruct") SETGLOBAL(@"basicflag", 1); else ON(@"unstructured") SETGLOBAL(@"basicflag", 1); else ON(@"structured") SETGLOBAL(@"basicflag",0); else ON(@"struct") SETGLOBAL(@"basicflag",0); else ON(@"block") [self addToList: blockList usingString: buff]; else ON(@"universal") [self handleUniversal: buff]; else ON(@"setrepeat") [self handleSetRepeat: buff]; else ON(@"name") { if([self isUniversal: @"FileName"] == NO) [univList addObject: @"FileName"]; [univVault setObject: trimCharNSS(trimNSS(buff), '\"') forKey: @"FileName"]; } else ON(@"setcomment") [self setComment: buff]; else ON(@"appendcomment") [self appendComment: buff]; else ON(@"endcomment") [self endComment: buff]; else ON(@"endlastcomment") [self endLastComment]; else ON(@"clearcomments") [self clearComments]; else ON(@"zapuniversal") SETGLOBAL(@"zapuniversal", 1); else ON(@"sectionsearch") SETGLOBAL(@"sectionsearch", 1); else ON(@"nozapuniversal") SETGLOBAL(@"zapuniversal", 0); else ON(@"nopar") SETGLOBAL(@"noparflag ", 0); else ON(@"par") SETGLOBAL(@"noparflag", 0); else ON(@"empty") SETGLOBAL(@"emptyflag", 0); else ON(@"noempty") SETGLOBAL(@"emptyflag", 0); else ON(@"emptysection") SETGLOBAL(@"emptysectionflag",1); else ON(@"noemptysection") SETGLOBAL(@"emptysectionflag",0); else ON(@"if") {[self handleIf: buff];} #ifdef FIELDMAP else ON(@"map") {[self handleMap: buff];} #endif else ON(@"escapeon") SETGLOBAL(@"escapeflag", 1); else ON(@"escapeoff") SETGLOBAL(@"escapeflag", 0); else ON(@"start") SETGLOBAL(@"startflag", 1); else ON(@"stop") SETGLOBAL(@"startflag", 0); //else ON(@"zap") // handlezap(); else ON(@"clean") { SETGLOBAL(@"cleanflag", 1); [repVault removeAllObjects]; } else ON(@"dirty") SETGLOBAL(@"cleanflag", 0); else ON(@"tab") SETGLOBAL(@"tabflag", 1); else ON(@"notab") SETGLOBAL(@"tabflag", 0); else ON(@"eofisend") SETGLOBAL(@"eofIsEndFlag", 1); else ON(@"eofisnotend") SETGLOBAL(@"eofIsEndFlag", 0); else ON(@"limit") { SETGLOBAL(@"limitflag", 0); if(limitString == nil) { limitString = [[NSMutableString alloc] init]; } [limitString setString: buff]; } //else ON(@"zero") // handlezero(); //else ON(@"zerozero") // zeromark = 0L; else ON(@"header") {SETGLOBAL(@"headerflag", 1); SETGLOBAL(@"firstwriteflag", 0);} else ON(@"noheader") {SETGLOBAL(@"headerflag", 0); SETGLOBAL(@"firstwriteflag", 0);} else ON(@"quote") SETGLOBAL(@"quoteflag", 1); else ON(@"noquote") SETGLOBAL(@"quoteflag", 0); else ON(@"exact") SETGLOBAL(@"exactflag", 1); else ON(@"notexact") SETGLOBAL(@"exactflag", 0); else ON(@"raw") SETGLOBAL(@"rawflag", 1); else ON(@"notraw") SETGLOBAL(@"rawflag", 0); else ON(@"append") [fmode setString: @"a"]; else ON(@"notappend") [fmode setString: @"w"]; //else ON(@"conname") handlecon(buff.val()); //else ON(@"datname") handledat(buff.val()); //else ON(@"macnl") setnewline(MACNL); //else ON(@"unixnl") setnewline(UNIXNL); else ON(@"noblank") SETGLOBAL(@"blankflag", 0); else ON(@"blank") SETGLOBAL(@"blankflag", 1); else ON(@"paranum") SETGLOBAL(@"lineflag", 0); else ON(@"noparanum") SETGLOBAL(@"lineflag", 0); else ON(@"recnum") SETGLOBAL(@"lnumflag", 1); else ON(@"norecnum") SETGLOBAL(@"lnumflag", 0); else ON(@"dummy") ; else ON(@"comment"); else ; } -(NSMutableString *) limString { if(limitString) return limitString; else return @""; } -(IBAction) toggleCaseSensitive: (id) sender { int state; if(caseSortFlag == NO) { NSLog(@"about to turn on case\n"); [[[NSApp delegate] caseMenuItem] setState: NSOffState]; caseSortFlag = YES; NSLog(@"turned on case\n"); } else { NSLog(@"about to turn off case\n"); [[[NSApp delegate] caseMenuItem] setState: NSOnState]; NSLog(@"turned off case\n"); caseSortFlag = NO; } } -(void) resetCaseSensitive { if(caseSortFlag == YES) { [[[NSApp delegate] caseMenuItem] setState: NSOnState]; } else { [[[NSApp delegate] caseMenuItem] setState: NSOffState]; } } -(BOOL) getCaseSensitive {return caseSortFlag;} -(IBAction) sortUpAZ: (id) sender { NSMenuItem *fakeMI=[[NSMenuItem alloc] init]; [fakeMI setTag: 2]; [fakeMI autorelease]; [self sortUp: fakeMI]; } -(IBAction) sortUpDate: (id) sender { NSMenuItem *fakeMI=[[NSMenuItem alloc] init]; [fakeMI setTag: 1]; [fakeMI autorelease]; [self sortUp: fakeMI]; } -(IBAction) sortUpCodeWithin: (id) sender { NSMenuItem *fakeMI=[[NSMenuItem alloc] init]; [fakeMI setTag: 15]; [fakeMI autorelease]; [self sortUp: fakeMI]; } -(IBAction) sortUpCode: (id) sender { NSMenuItem *fakeMI=[[NSMenuItem alloc] init]; [fakeMI setTag: 5]; [fakeMI autorelease]; [self sortUp: fakeMI]; } -(IBAction) sortUpFloat: (id) sender { NSMenuItem *fakeMI=[[NSMenuItem alloc] init]; [fakeMI setTag: 3]; [fakeMI autorelease]; [self sortUp: fakeMI]; } -(IBAction) sortUpInt: (id) sender { NSMenuItem *fakeMI=[[NSMenuItem alloc] init]; [fakeMI setTag: 4]; [fakeMI autorelease]; [self sortUp: fakeMI]; } -(IBAction) sortUpIntWithin: (id) sender { NSMenuItem *fakeMI=[[NSMenuItem alloc] init]; [fakeMI setTag: 14]; [fakeMI autorelease]; [self sortUp: fakeMI]; } -(IBAction) sortUpAZWithin: (id) sender { NSMenuItem *fakeMI=[[NSMenuItem alloc] init]; [fakeMI setTag: 12]; [fakeMI autorelease]; [self sortUp: fakeMI]; } -(IBAction) sortUp: (id) Sender { //get the column int n; int tt; NSMutableDictionary *ssi; int myType; id key; n = [theResults selectedColumn]; if(n > 0) { key = [[[theResults tableColumns] objectAtIndex: n] identifier]; tt = [Sender tag]; if(tt < 10) //not within { [sortStack removeAllObjects]; myType = tt; } else myType = tt - 10; // ssi = [[MWSortStackItem alloc] initWithID: key direction: YES type: myType dateFormat: dfString codeLevel: aCodeLevel]; ssi = [NSMutableDictionary dictionary]; [ssi setObject: [[key copy] autorelease] forKey: @"col"]; [ssi setObject: [[dfString copy] autorelease] forKey: @"dateFormat"]; [ssi setObject: [NSNumber numberWithBool: YES] forKey: @"up"]; [ssi setObject: [NSNumber numberWithInt: myType] forKey: @"type"]; [ssi setObject: [NSNumber numberWithInt: aCodeLevel] forKey: @"codeLevel"]; if([self getCaseSensitive] == YES) [ssi setObject: @"C" forKey: @"case"]; // [ssi autorelease]; [sortStack addObject: ssi]; [myData sortUsingFunction: stackComp context: sortStack]; [theResults reloadData]; MAKEDIRTY; } else NSWARNING(@"No data column selected"); } -(void) sortData: (NSMutableArray *) who withStack: (NSArray *) stack { NSMutableArray *a = [[NSMutableArray alloc] init]; FORALL(stack) { [a addObject: temp]; [who sortUsingFunction: stackComp context: a]; } ENDFORALL; [a release]; } -(NSMutableArray *) sortStackCopy { return [[sortStack copy] autorelease]; } -(IBAction) sortDown: (id) Sender { //get the column int n; int tt; NSMutableDictionary *ssi; int myType; id key; n = [theResults selectedColumn]; if(n > 0) { key = [[[theResults tableColumns] objectAtIndex: n] identifier]; tt = [Sender tag]; if(tt < 10) //not within { [sortStack removeAllObjects]; myType = tt; } else myType = tt - 10; //ssi = [[MWSortStackItem alloc] initWithID: key direction: NO type: myType dateFormat: dfString codeLevel: aCodeLevel]; //[ssi autorelease]; ssi = [NSMutableDictionary dictionary]; [ssi setObject: [[key copy] autorelease] forKey: @"col"]; [ssi setObject: [[dfString copy] autorelease] forKey: @"dateFormat"]; [ssi setObject: [NSNumber numberWithBool: NO] forKey: @"up"]; [ssi setObject: [NSNumber numberWithInt: myType] forKey: @"type"]; [ssi setObject: [NSNumber numberWithInt: aCodeLevel] forKey: @"codeLevel"]; if([self getCaseSensitive] == YES) [ssi setObject: @"C" forKey: @"case"]; [sortStack addObject: ssi]; [myData sortUsingFunction: stackComp context: sortStack]; [theResults reloadData]; MAKEDIRTY; } else NSWARNING (@"No data column selected"); } -(IBAction) sortColumn: (id) Sender { //get the column int n; id key; n = [theResults selectedColumn]; if(n > 0) { key = [[[theResults tableColumns] objectAtIndex: n] identifier]; //sort if([key isEqualToString: @"_begin_loc"] == YES) [myData sortUsingFunction: longFwdComp context: key]; else [myData sortUsingFunction: stringComp context: key]; } UPDATERECCOUNT; [theResults reloadData]; } -(IBAction) smartSort: (id) Sender { //get the column int n; id key; n = [theResults selectedColumn]; if(n > 0) { key = [[[theResults tableColumns] objectAtIndex: n] identifier]; //sort if([key isEqualToString: @"_begin_loc"] == YES ||[key isEqualToString: @"_line_number"] ) [self sortUpInt: nil]; else if ([key isEqualToString: @"_code"] == YES) [self sortUpCode: nil]; else [self sortUpAZ: nil]; } UPDATERECCOUNT; [theResults reloadData]; } -(void) dateFmtDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == 1) { int dtag = [[dateFormatMenu selectedItem] tag]; dfIndex = dtag; if(dtag == 99) { [dfString setString: [dateFormatOther stringValue]]; } else { [dfString setString: dateFmt[dtag]]; } MAKEDIRTY; } } -(IBAction) okSetDateFmt: (id) Sender { [dateFormatSheet orderOut: Sender]; [NSApp endSheet: dateFormatSheet returnCode: 1]; } -(IBAction) cancelSetDateFmt: (id) Sender { [dateFormatSheet orderOut: Sender]; [NSApp endSheet: dateFormatSheet returnCode: 0]; } -(IBAction) doSetDateFmt: (id) Sender { NSWindow *who; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; if(dfIndex < 0) [dateFormatMenu selectItemAtIndex: 0]; else if( dfIndex < 99) { [dateFormatMenu selectItemWithTag: dfIndex]; [dateFormatOther setStringValue: @""]; } else { [dateFormatMenu selectItemWithTag: dfIndex]; [dateFormatOther setStringValue: dfString]; } [NSApp beginSheet: dateFormatSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(dateFmtDidEnd:returnCode:contextInfo:) contextInfo: nil]; } /*--------------------- Selected Records ----------------*/ -(NSMutableArray*) handleStep: (NSMutableDictionary *) who onArray: (NSMutableArray *) ss { NSMutableArray *ans = [NSMutableArray array]; id cstype; int csIntType; id extype; BOOL exBoolType; if([[who objectForKey: @"stepType"] isEqualToString: @"sel"] == YES) { switch( [[who objectForKey: @"mode"] intValue]) { case SELECTREVERSE: case SELECTADDITIONAL: [ans setArray: ss]; [self handleSelect: [[who objectForKey: @"mode"] intValue] selectType: [[who objectForKey: @"type"] intValue] withString: [who objectForKey: @"searchValue"] withCol: [who objectForKey: @"col"] floatV: [[who objectForKey: @"float"] intValue] regexV: [[who objectForKey: @"regex"] intValue] startArray: backData endArray: ans]; break; case SELECTCODESET: cstype = [who objectForKey: @"type"]; if (cstype == nil) csIntType = SELECT; else csIntType = [cstype intValue]; extype = [who objectForKey: @"exact"]; if(extype == nil) exBoolType = YES; else exBoolType = [extype boolValue]; [self selectDataFrom: ss to: ans forCodeSet: [who objectForKey: @"name"] type: csIntType exact: exBoolType]; break; default: [self handleSelect: [[who objectForKey: @"mode"] intValue] selectType: [[who objectForKey: @"type"] intValue] withString: [who objectForKey: @"searchValue"] withCol: [who objectForKey: @"col"] floatV: [[who objectForKey: @"float"] intValue] regexV: [[who objectForKey: @"regex"] intValue] startArray: ss endArray: ans]; break; }; } //put runing an autoset here else if([[who objectForKey: @"stepType"] isEqualToString: @"autoset"] == YES) { [ans setArray: [self applyAutoSetWithName: [who objectForKey: @"name"] toArray: ss]]; } else { [self handleSet: [[who objectForKey: @"op"] intValue] withSet: [self getAutoSetWithName: [who objectForKey: @"obj"]] startArray: ss endArray: ans]; } return ans; } -(NSMutableArray*) getSetWithName: (NSString*) who { NSMutableArray *aa; aa = [namedSelDict objectForKey: who]; if(aa == nil) return [self getAutoSetWithName: who]; else return [NSMutableArray arrayWithArray: aa]; } -(NSMutableDictionary *) autoHistoryAsProgram { NSMutableDictionary *myMac = [NSMutableDictionary dictionary]; [myMac setObject: [self autoHistory] forKey: @"program"]; [myMac setObject: @"All" forKey: @"start"]; return myMac; } -(NSMutableArray*) applyAutoSetWithName: (NSString *) who toArray: (NSMutableArray *) showing { NSMutableArray *ans = [NSMutableArray array]; NSMutableDictionary *myMac; NSMutableArray *myProg; NSMutableArray *sData, *s2, *s1; NSArray *ss; if([self isAutoSet: who] == NO) return showing; sData = [[NSMutableArray alloc] init]; myMac = [self autoSetForName: who]; myProg = [myMac objectForKey: @"program"]; ss = [myMac objectForKey: @"sort"]; if([[myMac objectForKey: @"start"] isEqualToString: @"All"] == YES) [sData addObjectsFromArray: backData]; else if([[myMac objectForKey: @"start"] isEqualToString: @"Visible"] == YES) [sData addObjectsFromArray: showing]; else [sData addObjectsFromArray: [self getAutoSetWithName: [myMac objectForKey: @"start"]]]; s2 = sData; if(ss != nil) [self sortData: sData withStack: ss]; if(myProg) { FORALL(myProg) { s1 = [self handleStep: temp onArray: s2]; s2 = s1; //keep sending it back in } ENDFORALL; } [ans addObjectsFromArray: s2]; [sData release]; return ans; } -(NSMutableArray*) getAutoSetWithName: (NSString *) who { NSMutableArray *ans = [NSMutableArray array]; NSMutableDictionary *myMac; NSMutableArray *myProg; NSMutableArray *sData, *s2, *s1; NSArray *ss; sData = [[NSMutableArray alloc] init]; if(who == nil) { myMac = [self autoHistoryAsProgram]; } else myMac = [self autoSetForName: who]; myProg = [myMac objectForKey: @"program"]; ss = [myMac objectForKey: @"sort"]; if([[myMac objectForKey: @"start"] isEqualToString: @"All"] == YES) [sData addObjectsFromArray: backData]; else if([[myMac objectForKey: @"start"] isEqualToString: @"Visible"] == YES) [sData addObjectsFromArray: myData]; else [sData addObjectsFromArray: [self getAutoSetWithName: [myMac objectForKey: @"start"]]]; s2 = sData; if(ss != nil) [self sortData: sData withStack: ss]; if(myProg) { FORALL(myProg) { s1 = [self handleStep: temp onArray: s2]; s2 = s1; //keep sending it back in } ENDFORALL; } [ans addObjectsFromArray: s2]; [sData release]; return ans; } -(void) handleSet: (int) opType withSet: (NSArray *) mm startArray: (NSMutableArray*) a1 endArray: (NSMutableArray*) a2 { int i,n; NSMutableArray *final = [[NSMutableArray alloc] init]; { //get subset //mm = [namedSelDict objectForKey: [[setMathSetMenu selectedItem] title]]; //opType = [[setMathOpMenu selectedItem] tag]; switch (opType) { case 1: //intersect with FORALL(mm) { if([a1 indexOfObject: temp] == NSNotFound) { } else [final addObject: temp]; } ENDFORALL; [a2 addObjectsFromArray: final]; break; case 2: //union FORALL(mm) { if([a1 indexOfObject: temp] == NSNotFound) { [final addObject: temp]; } } ENDFORALL; [a2 addObjectsFromArray: final]; break; case 3: //Don't intersect with n = [mm count]; for(i = 0; i < n; i++) { [a1 removeObject: [mm objectAtIndex: i]]; } break; case 4: //not in union with n = [backData count]; for(i = 0; i < n; i++) { if([a1 containsObject: [backData objectAtIndex: i]] == YES || [mm containsObject: [backData objectAtIndex: i]] == YES) { } else { [a1 addObject: [backData objectAtIndex: i]]; } } [a2 addObjectsFromArray: final]; break; case 5: // XOR n = [mm count]; for(i = 0; i < n ; i++) { [a2 addObjectsFromArray: a1]; if([a2 containsObject: [mm objectAtIndex: i]] == YES) { [a2 removeObject: [mm objectAtIndex: i]]; } else { [a2 addObject: [mm objectAtIndex: i]]; } } break; }; [final release]; } } -(void) handleSelect: (int) selectMode selectType: (int) st withString: (NSString *) compValue withCol: (NSString *) colName floatV: (int) fp regexV: (int) rf startArray: (NSMutableArray*) a1 endArray: (NSMutableArray*) a2 { NSMutableArray *findList, *findFromList; NSRange a; AGRegex *myRegex; AGRegexMatch *myRegexMatch; NSString *fString; int n, i, cres, frflag; findList = [[NSMutableArray alloc] init]; findFromList = [[NSMutableArray alloc] init]; if(selectMode == SELECTREVERSE) { [findList setArray: a1]; [findList removeObjectsInArray: a2]; [a2 setArray: findList]; [findList release]; [findFromList release]; return; } [findFromList addObjectsFromArray: a1]; n = [findFromList count]; for(i =0; i < n; i++) { if([@"_doc" isEqualToString: colName ] == YES) { fString = [(MWFile *)[[findFromList objectAtIndex: i] objectForKey: colName] name]; } else fString = [[findFromList objectAtIndex: i] objectForKey: colName]; switch(st) { case SELALPHA: if(rf) { myRegex = [[AGRegex alloc] initWithPattern: compValue options: AGRegexCaseInsensitive]; myRegexMatch = [myRegex findInString: fString]; if([myRegexMatch count]) { [findList addObject: [findFromList objectAtIndex: i]]; } [myRegex release]; //[myRegexMatch release]; } else { a = [fString rangeOfString: compValue options: NSCaseInsensitiveSearch]; if(a.location != NSNotFound) { [findList addObject: [findFromList objectAtIndex: i]]; } } break; case SELALPHACASE: if(rf) { myRegex = [[AGRegex alloc] initWithPattern: compValue]; myRegexMatch = [myRegex findInString: fString]; if([myRegexMatch count]) { [findList addObject: [findFromList objectAtIndex: i]]; } [myRegex release]; [myRegexMatch release]; } else { a = [fString rangeOfString: compValue ]; if(a.location != NSNotFound) { [findList addObject: [findFromList objectAtIndex: i]]; } } break; case SELEXACT: //no regex for this one { int ans; ans = [fString isEqualToString: compValue ]; if(ans == YES) { [findList addObject: [findFromList objectAtIndex: i]]; } } break; case SELEQUAL: if(fp) { if([fString doubleValue] == [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] == [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELGT: if(fp) { if([fString doubleValue] > [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] > [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELGTE: if(fp) { if([fString doubleValue] >= [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] >= [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELLT: if(fp) { if([fString doubleValue] < [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] < [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELLTE: if(fp) { if([fString doubleValue] <= [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] <= [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELBEFOREDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedAscending) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELAFTERDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedDescending) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELBEFOREEQDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedAscending || cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELAFTEREQDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedDescending || cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; default: ; } } if(selectMode == SELECTADDITIONAL) { n = [findList count]; if(n == 0) { NSWARNING(@"No records found"); frflag=0; } else { frflag = 1; for(i = 0; i [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] > [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELGTE: if(fp) { if([fString doubleValue] >= [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] >= [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELLT: if(fp) { if([fString doubleValue] < [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] < [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELLTE: if(fp) { if([fString doubleValue] <= [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] <= [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELBEFOREDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedAscending) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELAFTERDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedDescending) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELBEFOREEQDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedAscending || cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELAFTEREQDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedDescending || cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; default: ; } } if(selectMode == SELECTADDITIONAL) { n = [findList count]; if(n == 0) { NSWARNING(@"No records found"); frflag=0; } else { frflag = 1; for(i = 0; i= NAMEDSELBASE; i--) { [namedSelMenu removeItemAtIndex: i]; } theKeys = [NSMutableArray arrayWithArray: [namedSelDict allKeys]]; [theKeys sortUsingFunction: nsStringComp context: nil]; FORALL(theKeys) { NSMenuItem *mm; mm = [[NSMenuItem alloc] init]; [mm setTitle: temp]; [mm setAction: @selector(loadNamedSelection:)]; [namedSelMenu addItem: mm]; }ENDFORALL; } -(void) namedSelDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSMutableArray *mm; if(returnCode) { if([namedSelDict objectForKey: [namedSelField stringValue]] != nil) { NSWARNING(@"Name already exists; use unique name"); return; } mm = [[NSMutableArray alloc] init]; [mm addObjectsFromArray: myData]; [namedSelDict setObject: mm forKey: [namedSelField stringValue]]; [mm release]; [self rebuildAutoSetMenu]; //[self renewNamedSelMenu]; [self setStateString: [namedSelField stringValue]]; [self updateOnlyRecCount]; MAKEDIRTY; } } -(IBAction) cancelNamedSelection: (id) Sender { [namedSelSheet orderOut: Sender]; [NSApp endSheet: namedSelSheet returnCode: 0]; } -(IBAction) okNamedSelection: (id) Sender { if([self validSetName: [namedSelField stringValue]] == NO) { NSWARNING(@"You must use a unique set name"); return; } [namedSelSheet orderOut: Sender]; [NSApp endSheet: namedSelSheet returnCode: 1]; } -(IBAction) addNamedSelection: (id) Sender { NSWindow *who; [namedSelField setStringValue: @""]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: namedSelSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(namedSelDidEnd:returnCode:contextInfo:) contextInfo: nil]; } - (void) windowDidBecomeKey:(NSNotification *)aNotification { //[self renewNamedSelMenu]; [self rebuildAutoSetMenu]; [self rebuildSummReportMenu]; [self resetCaseSensitive]; /* if(exactCodeSetFlag) { [[[NSApp delegate] exactRsltCodeSetMenuItem] setState: NSOnState]; } else { [[[NSApp delegate] exactRsltCodeSetMenuItem] setState: NSOffState]; } */ if(gWorkBench != nil) { if([gWorkBench reanalysisMode] == YES) { [[[NSApp delegate] reanalysisMenu] setState: NSOnState]; } else { [[[NSApp delegate] reanalysisMenu] setState: NSOffState]; } } [self displaySelData]; } /* ---------- Set Math with Named Sets ----------- */ -(void) setMathDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSArray *mm; NSString *sn; int opType, i,n; NSMutableArray *final = [[NSMutableArray alloc] init]; if(returnCode) { //get subset sn = [[setMathSetMenu selectedItem] title]; mm = [self getSetWithName: sn]; opType = [[setMathOpMenu selectedItem] tag]; //this block is for autohistory if([self isAutoSet: sn]) { NSMutableDictionary *ahd = [NSMutableDictionary dictionary]; [ahd setObject: @"set" forKey: @"stepType"]; [ahd setObject: [NSNumber numberWithInt: opType] forKey: @"op"]; [ahd setObject: [[sn copy] autorelease] forKey: @"obj"]; [autoHistory addObject: ahd]; } switch (opType) { case 1: //intersect with FORALL(mm) { if([myData indexOfObject: temp] == NSNotFound) { } else [final addObject: temp]; } ENDFORALL; [myData removeAllObjects]; [myData addObjectsFromArray: final]; break; case 2: //union FORALL(mm) { if([myData indexOfObject: temp] == NSNotFound) { [final addObject: temp]; } } ENDFORALL; [myData addObjectsFromArray: final]; break; case 3: //Don't intersect with n = [mm count]; for(i = 0; i < n; i++) { [myData removeObject: [mm objectAtIndex: i]]; } break; case 4: //not in union with n = [backData count]; for(i = 0; i < n; i++) { if([myData containsObject: [backData objectAtIndex: i]] == YES || [mm containsObject: [backData objectAtIndex: i]] == YES) { } else { [final addObject: [backData objectAtIndex: i]]; } } [myData removeAllObjects]; [myData addObjectsFromArray: final]; break; case 5: // XOR n = [mm count]; for(i = 0; i < n ; i++) { if([myData containsObject: [mm objectAtIndex: i]] == YES) { [myData removeObject: [mm objectAtIndex: i]]; } else { [myData addObject: [mm objectAtIndex: i]]; } } break; }; [final release]; UPDATERECCOUNT; [theResults reloadData]; [self addStateString: [NSString stringWithFormat: @"%@ w/ %@", [[setMathOpMenu selectedItem] title], [[setMathSetMenu selectedItem] title]]]; } } -(IBAction) cancelSetMath: (id) Sender { [setMathSheet orderOut: Sender]; [NSApp endSheet: setMathSheet returnCode: 0]; } -(IBAction) okSetMath: (id) Sender { [self pushSetStack]; [setMathSheet orderOut: Sender]; [NSApp endSheet: setMathSheet returnCode: 1]; } -(IBAction) doSetMath: (id) Sender { //Need to rebuild the named selections menu //are there any? NSMutableArray *namedSels; NSWindow *who; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; if([[self allSetNames] count] == 0) { NSWARNING(@"No named selections"); return; } [setMathOpMenu selectItemAtIndex: 0]; [setMathSetMenu removeAllItems]; namedSels = [NSMutableArray arrayWithArray: [self allSetNames]]; [namedSels sortUsingFunction: nsStringComp context: nil]; FORALL(namedSels) { [setMathSetMenu addItemWithTitle: temp]; } ENDFORALL; [namedSelField setStringValue: @""]; [NSApp beginSheet: setMathSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(setMathDidEnd:returnCode:contextInfo:) contextInfo: nil]; } /* find the record in the original file */ -(IBAction) fetchRow: (id) Sender { int row, b, e; NSMutableDictionary *aRec; MWFile *who; if(!gWorkBench) { NSWARNING(@"Project file has closed, cannot locate source files"); return; } //get the key numbers row = [theResults selectedRow]; //make a range aRec = [myData objectAtIndex: row]; b = [[aRec objectForKey: @"_begin_loc"] intValue]; e = [[aRec objectForKey: @"_end_loc"] intValue]; who = [aRec objectForKey: @"_doc"]; //call the window if([gWorkBench mwFileExists: who] == NO) { NSWARNING(@"Cannot find the source file."); } else { [who closeFakeFile]; [gWorkBench openMWFile: who type: SOURCETYPE]; [[who filePointer] selectAndScrollRange: NSMakeRange(b, e-b) andMoveForward: YES]; } } -(IBAction) refreshResults: (id) Sender { int selRow; int tsim; NSMutableString *ols = [[NSMutableString alloc] init]; //get the data FORALL(fileList) { if(FILEOPEN(temp) == NO) { NSWARNING(@"Cannot find one of the original source files."); return; } } ENDFORALL; //if(dataSource) { int nnn; [ols setString: [limitField stringValue]]; [self clearNamedSelMenu: nil]; tce = [[TAMSCharEngine alloc] initWithArrayAndStart: fileList]; selRow = [theResults selectedRow]; [self clearTable]; //do before the data goes away //clean my own lists [self initVariables]; [self zeroSetStack]; //[myData removeAllObjects]; [myData autorelease]; myData = [[NSMutableArray alloc] init]; // [backData removeAllObjects]; [backData autorelease]; backData = [[NSMutableArray alloc] init]; [univList removeAllObjects]; [repList removeAllObjects]; [lastRepList removeAllObjects]; [innerRepList removeAllObjects]; [blockList removeAllObjects]; [colList removeAllObjects]; [markedList removeAllObjects]; [univVault removeAllObjects]; [repVault removeAllObjects]; [normVault removeAllObjects]; [sortStack removeAllObjects]; [repCont removeAllObjects]; [fieldMap removeAllObjects]; [mediaDict removeAllObjects]; [self clearComments]; [self buildCoderList]; if([gPrefBoss countSectionsValue]) SETGLOBAL(@"emptysectionflag", 1); else SETGLOBAL(@"emptysectionflag",0); tsim = [self global: @"simpleflag"]; SETGLOBAL(@"rawflag", [self global: @"raw1stflag"]); SETGLOBAL(@"simpleflag", [self global: @"simple1stflag"]); tsim = [self global: @"simpleflag"]; SETGLOBAL(@"exactflag", [self global: @"exact1stflag"]); SETGLOBAL(@"emptyflag", [self global: @"empty1stflag"]); SETGLOBAL(@"sectionsearch", [self global: @"section1stflag"]); [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleEachEOF:) name: @"TAMSFileHasEnded" object: nil]; tsim = [self global: @"simpleflag"]; //get the search /* all of this is now handlied when the object is init'd*/ //[limitString setString: [dataSource theLimitString]]; //clearSearchList(); //addArrayToSearchList(fileList); //startSearch(); if([limitString length]) { [self setGlobal: @"limitflag" to: 1]; [tce handlelimit: limitString]; tsim = [self global: @"simpleflag"]; [self doTamsSearch: limitString]; [tce ctCloseAllOpenRuns]; if([[tce ctRunVault] count]) [self handleEnd: NO flush: NO]; } else { [self setGlobal: @"limitflag" to: 0]; tsim = [self global: @"simpleflag"]; [self doTamsSearch: nil]; [tce ctCloseAllOpenRuns]; if([[tce ctRunVault] count]) [self handleEnd: NO flush: NO]; } //gCurrentTAMS = nil; //do the search //do the tables //reload [self setupTables]; [myWindow makeKeyAndOrderFront: self]; [backData removeAllObjects]; [backData addObjectsFromArray: myData]; [self setOriginalStateString]; nnn = [[self autoHistory] count]; if(nnn > 0) { [self doAutoSet: nil]; [limitField setStringValue: ols]; } UPDATERECCOUNT; [theResults reloadData]; [ols release]; [[NSNotificationCenter defaultCenter] removeObserver:self name: @"TAMSFileHasEnded" object: nil]; if([myData count] > 0) { [myWindow setDocumentEdited: YES]; [self updateChangeCount: NSChangeDone]; } if([theResults numberOfRows] > selRow && [theResults numberOfRows] > 0) [theResults selectRow: selRow byExtendingSelection: NO]; [dirtySourceFlag setState: NSOffState]; if(savedNamedSel) [self restoreNamedSel]; [tce release]; } } -(void) clearTable { NSArray *tc = [theResults tableColumns]; NSTableColumn *t; NSEnumerator *ten; ten = [tc objectEnumerator]; while(t = [ten nextObject]) [theResults removeTableColumn: t]; } -(void) setupTables { NSTableColumn *t; NSEnumerator *men; NSString *ss; //delete the existing columns //create the right number of columns with the right headers //send a refresh /* FORALL(tc) { [theResults removeTableColumn: temp]; } ENDFORALL; */ //create new ones if([myData count] == 0) return; //make the count stuff here t = [[NSTableColumn alloc] initWithIdentifier: @"#"]; [t setWidth: COLWIDTH/2.0]; [theResults addTableColumn: t]; [[t headerCell] setStringValue: @"#"]; // md = [myData objectAtIndex: 0]; men = [colList objectEnumerator]; while(ss = [men nextObject]) { //make column if([self isBlocked: ss]) continue; t = [[NSTableColumn alloc] initWithIdentifier: ss]; [t setWidth: COLWIDTH]; [theResults addTableColumn: t]; [[t headerCell] setStringValue: ss]; } // [theResults setTarget: self]; // [theResults setAction: @selector(displaySelData)]; [theResults setAllowsColumnReordering: YES]; // [theResults setAutosizesAllColumnsToFit: YES]; builtTable = YES; [theResults reloadData]; // [theResults setAutosizesAllColumnsToFit: NO]; } - (int)numberOfRowsInTableView:(NSTableView *)aTableView { if(myData == nil || builtTable == NO){ NSLog(@"pop\'ng table before init\nb"); return 0; } return [myData count]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { NSMutableString *numStr; NSString *ss = [aTableColumn identifier]; NSDictionary *dd; if([ss isEqualToString: @"#"] == YES) { numStr = [[NSMutableString alloc] init]; [numStr setString: [[NSNumber numberWithInt: rowIndex + 1] stringValue]]; if([self isMarked: rowIndex] == YES) [numStr appendString: @"+"]; [numStr autorelease]; return numStr; } else if([ss isEqualToString: @"_doc"] == YES) { dd =[myData objectAtIndex: rowIndex]; return [(MWFile *)[dd objectForKey: @"_doc"] name]; } else { dd = [myData objectAtIndex: rowIndex]; return [dd objectForKey: ss]; } } -(void) setDataSource: (NSString *) theData{} -(BOOL)tableView: (NSTableView *) aTable shouldEditTableColumn: (NSTableColumn *) aCol row: (unsigned) arow { return NO; } - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { [self displaySelData]; } - (void)tableView:(NSTableView*)tableView didClickTableColumn:(NSTableColumn *)tableColumn { [self displaySelData]; } -(void) browseFieldDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode) { [browseField setString: [browseFieldMenu titleOfSelectedItem]]; [self displaySelData]; } } -(IBAction) cancelBrowseField: (id) Sender { [browseFieldSheet orderOut: Sender]; [NSApp endSheet: browseFieldSheet returnCode: 0]; } -(IBAction) okBrowseField: (id) Sender { [browseFieldSheet orderOut: Sender]; [NSApp endSheet: browseFieldSheet returnCode: 1]; } -(IBAction) doBrowseField: (id) Sender { NSWindow *who; NSMutableArray *cols=[NSMutableArray array]; NSArray *currCols; currCols = [self tableColumns]; FORALL(currCols) { [cols addObject: [temp identifier]]; } ENDFORALL; [browseFieldMenu removeAllItems]; [browseFieldMenu addItemsWithTitles: cols]; [browseFieldMenu selectItemWithTitle: browseField]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: browseFieldSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(browseFieldDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(void) displaySelData { [self displaySelData: [theResults selectedRow]]; } -(void) displaySelData: (int) row { NSString *ss; NSMutableString *s2, *s3; //get the selected row //get the appropriate data if([myData count] == 0) { [thisCell setString: @""]; return; } if([myData count] - 1 < row) row = [myData count] - 1; if(row >= 0) { if([browseField isEqualToString: @"_doc"]) ss = [[[myData objectAtIndex: row] objectForKey: browseField] name]; else ss = [[myData objectAtIndex: row] objectForKey: browseField]; //set it to the textview s2 = [[NSMutableString alloc] init]; s3 = [[NSMutableString alloc] init]; [s2 setString: ss]; [s2 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; if(stripTags) { MWFakeFile *mf; TAMSCharEngine *tx; ctQChar *qq; qq = [[ctQChar alloc] init]; mf = [[MWFakeFile alloc] initWithString: s2]; tx = [[TAMSCharEngine alloc] initWithFile: mf]; [tx setAllowTab: 1]; [tx setNoPar: 0]; [tx startSearch]; while([tx scanNext: qq withWarnings: NO] != ENDOFFILE) //while([tx readnext: qq] != EOF) { if([qq tokentype] == CHAR) { [s3 appendString: [qq buff]]; } } [tx release]; [qq release]; [mf release]; } else [s3 setString: s2]; [s3 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; if([gPrefBoss TAScanForLN] && [[[myData objectAtIndex: row] objectForKey: @"_line_number"] intValue] && [browseField isEqualToString: @"_data"]) { [thisCell setString: [NSString stringWithFormat: @"%d\t%@", [[[myData objectAtIndex: row] objectForKey: @"_line_number"] intValue], s3]]; } else { [thisCell setString: s3]; } [s2 release]; [s3 release]; /*put colorize stuff here */ //if([self global: @"nonregexcharflag"] || [self global: @"regexcharflag"]) return; if([gPrefBoss autoColorValue]) [self doColorize: nil]; } } -(IBAction) copyWithoutTags: (id) sender { ctQChar *q; NSString *oText; NSMutableString *nText; NSRange r; MWFakeFile *ff; int ch; BOOL a; r = [thisCell selectedRange]; if(r.length == 0) return; oText = [[thisCell string] substringWithRange: r]; ff = [[MWFakeFile alloc] initWithString: oText]; nText = [[NSMutableString alloc] init]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; [tc setAllowTab: 1]; [tc setNoPar: 0]; //start search [tc addFileToSearchList: ff]; [tc startSearch]; q = [[ctQChar alloc] init]; while((ch = [tc scanNext: q withWarnings: NO]) != ENDOFALLFILES) { if (ch == CHAR) [nText appendString: [q buff]]; } [q release]; [tc release]; [ff release]; [[NSPasteboard generalPasteboard] declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self]; a = [[NSPasteboard generalPasteboard] setString: nText forType: NSStringPboardType]; [nText autorelease]; } -(IBAction) doColorize: (id) sender { NSTextStorage *ts = [thisCell textStorage]; TAMSCharEngine *tc = [[TAMSCharEngine alloc] init]; ctQChar *q; MWFile *mf; if(!gWorkBench) return; mf = [[MWFakeFile alloc] initWithString: [thisCell string]]; [tc addFileToSearchList: mf]; [tc startSearch]; q = [[ctQChar alloc] init]; [thisCell setTextColor: [NSColor blackColor]]; [ts beginEditing]; while([tc scanNext: q withWarnings: NO] != ENDOFFILE) { if([q tokentype] == TOKEN || [q tokentype] == ENDTOKEN) { /* [ts addAttribute: NSForegroundColorAttributeName value: [gWorkBench colorForCode: [q buff]] range: [q range]]; */ [thisCell setTextColor: [gWorkBench colorForCode: [q buff]] range: [q range]]; } //else if([q tokentype] == ENDOFFILE) else if([q tokentype] == META) { /* [ts addAttribute: NSForegroundColorAttributeName value: getColorForInt([gPrefBoss tagColorValue]) range: [q range]]; */ [thisCell setTextColor: [gPrefBoss metaColor] range: [q range]]; } } [ts endEditing]; [tc release]; [mf release]; [q release]; } - (BOOL)validateMenuItem:(NSMenuItem *)anItem { BOOL ans = [super validateMenuItem: anItem]; if([[anItem title] isEqualToString: @"Save"] == YES) { return YES; } if([[anItem title] isEqualToString: @"Save As..."] == YES) { return YES; } return ans; } - (void) moveForward { [myWindow makeKeyAndOrderFront: self]; } -(IBAction) moveWorkBenchForward: (id) sender { [gWorkBench front]; } -(IBAction) showCodeBrowser: (id) Sender { [gWorkBench showCodeBrowser: self]; } -(NSString *)getTitle { return [myWindow title]; } -(void) setMWFile: (MWFile *) who{ myMWFID = who;} -(MWFile *) getMWFile {return myMWFID;} -(id) getGWorkBench: (id) who {return gWorkBench;} -(void) setGWorkBench: (id) who {gWorkBench = who;} - (void)document:(NSDocument *)doc didSave:(BOOL)didSave contextInfo:(void *)contextInfo { MWFile *mw; mw = [self getMWFile]; if(didSave == YES) { [myWindow setDocumentEdited: NO]; [self updateChangeCount: NSChangeCleared]; [mw setOpenFile: self]; //reset the path [mw setHasFile: YES]; if(gWorkBench != nil) [gWorkBench setDirty]; } } -(IBAction) saveDocument: (id) Sender { MWFile *mw; NSString *path; NSLog(@"in saveDocument--%@\n", [self fileName]); //[self saveToFile:nil saveOperation: NSSaveAsOperation delegate: self didSaveSelector:@selector(document:didSave:contextInfo:) contextInfo:nil ]; if([self fileName]) [super saveDocument: nil]; else [self saveDocumentWithDelegate: self didSaveSelector: @selector(document:didSave:contextInfo:) contextInfo: nil]; return; /* [super saveDocument: self]; path = [self fileName]; [gWorkBench setDirty];//kludge since we're too lazy to make our own save Doc if([self fileName]) if([[mw path] isEqualToString: [self fileName]] ==NO) { [mw setOpenFile: self]; //reset the path [mw setHasFile: YES]; [gWorkBench setDirty]; } */ } -(IBAction) saveDocumentAs: (id) Sender { MWFile *mw; [self runModalSavePanelForSaveOperation: NSSaveAsOperation delegate: self didSaveSelector: @selector(document:didSave:contextInfo:) contextInfo: nil]; //[self saveDocumentWithDelegate: self didSaveSelector: @selector(document:didSave:contextInfo:) contextInfo: nil]; return; /* [super saveDocumentAs: self]; mw = [self getMWFile]; [gWorkBench setDirty];//kludge since we're too lazy to make our own save Doc if([self fileName]) if([[mw path] isEqualToString: [self fileName]] ==NO) { [mw setOpenFile: self]; //reset the path [mw setHasFile: YES]; [gWorkBench setDirty]; } */ } -(void) setStateString: (NSString *) what { [limitField setStringValue: what]; } -(void) addStateString: (NSString *) what { NSString *old; old = [limitField stringValue]; [limitField setStringValue: [NSString stringWithFormat: @"%@; %@", old, what]]; } -(void) setOriginalStateString { if([self global: @"regexcharflag"] || [self global: @"nonregexcharflag"]) { [limitField setStringValue: [NSString stringWithFormat: @"Find: %@",limitString]]; return; } if([self global: @"sectionsearch"]) { if([limitString length]) { [limitField setStringValue: [NSString stringWithFormat: @"Section: %@",limitString]]; } else [limitField setStringValue: @"Section: unlimited"]; return; } else if(limitString) { if([limitString length]) { [limitField setStringValue: limitString]; return; } } [limitField setStringValue: @"Unlimited"]; } -(IBAction) doSetStripTags: (id) sender { NSMenuItem *tagMenu; tagMenu = [[NSApp delegate] toggleShowTagsMenuItem]; if([self global: @"rawflag"] == NO) return; if(stripTags) { stripTags = NO; [tagMenu setState: NSOffState]; } else { stripTags = YES; [tagMenu setState: NSOnState]; } [self displaySelData]; } -(IBAction) doCollapseDown:(id) Sender { //loop through NSString * compareValue; NSString *recKey; id compareRec; NSALLOC(NSMutableArray, tempStorage); int fflag; if([theResults selectedColumn] < 0) { NSWARNING(@"Need to select a column"); [tempStorage release]; return; } recKey = SELECTEDCOLUMNID(theResults); if(recKey == nil) return; fflag = 1; FORALL(myData) { if(fflag == 1) { compareValue = [temp objectForKey: recKey]; compareRec = temp; fflag = 2; } else if(fflag == 2) { if([[temp objectForKey: recKey] isEqualToString: compareValue] == YES) { compareRec = temp; } else { [tempStorage addObject: compareRec]; compareRec = temp; compareValue = [temp objectForKey: recKey]; } } }ENDFORALL; [self pushSetStack]; [tempStorage addObject: compareRec]; [myData removeAllObjects]; [myData addObjectsFromArray: tempStorage]; [tempStorage release]; { NSString *sss = [NSString stringWithFormat: @"cllpse dwn: %@", recKey]; [self addStateString: sss]; } UPDATERECCOUNT; [theResults reloadData]; //get the compare value if 1st time or compare with value if it's the second+ // is it different, save the new value } -(IBAction) doCollapseUp:(id) Sender { //loop through NSString * compareValue; NSString *recKey; id compareRec; NSALLOC(NSMutableArray, tempStorage); int fflag; if([theResults selectedColumn] < 0) { NSWARNING(@"Need to select a column"); [tempStorage release]; return; } recKey = SELECTEDCOLUMNID(theResults); fflag = 1; FORALL(myData) { if(fflag == 1) { compareValue = [temp objectForKey: recKey]; compareRec = temp; fflag = 2; } else if(fflag == 2) { if([[temp objectForKey: recKey] isEqualToString: compareValue] == YES) { ; //do nothing since we want the topmost one to represent everyone } else { [tempStorage addObject: compareRec]; compareRec = temp; compareValue = [temp objectForKey: recKey]; } } }ENDFORALL; [self pushSetStack]; [tempStorage addObject: compareRec]; [myData removeAllObjects]; [myData addObjectsFromArray: tempStorage]; [tempStorage release]; { NSString *sss = [NSString stringWithFormat: @"cllpse up: %@", recKey]; [self addStateString: sss]; } UPDATERECCOUNT; [theResults reloadData]; //get the compare value if 1st time or compare with value if it's the second+ // is it different, save the new value } /* auto sets routines */ -(IBAction) createAutoSet: (id) sender { [autoSetWatcher runMacroEditor]; } -(NSMutableDictionary *) autoSets { return autoSets; } -(NSWindow *) myWindow { return myWindow; } -(BOOL) isInfiniteLoop: (NSDictionary*)who usingStack: (NSMutableArray *)mystack { NSArray *pgm; int i, n; pgm = [who objectForKey: @"program"]; n = [pgm count]; for(i = 0; i< n; i++) { NSDictionary *w; w = [pgm objectAtIndex: i]; if([[w objectForKey: @"stepType"] isEqualToString: @"autoset"] == YES) { if(addUniqueToArray(mystack, [w objectForKey: @"name"]) == NO) return YES; if([self isInfiniteLoop: [self autoSetForName:[w objectForKey: @"name"]] usingStack: mystack] == YES) return YES; } if([[w objectForKey: @"stepType"] isEqualToString: @"set"] == YES) { NSString *setName; setName = [w objectForKey: @"obj"]; if(setName == nil) continue; if(addUniqueToArray(mystack, setName) == NO) return YES; if([self isInfiniteLoop: [self autoSetForName:setName] usingStack: mystack] == YES) return YES; } } return NO; } -(IBAction) doAutoSet: (id) sender { NSMutableDictionary *who; NSMutableArray *ans; NSString *title; NSMutableArray *oldHist; BOOL allFlag; allFlag = YES; if(sender != nil) { ans = [self getAutoSetWithName: [sender title]]; who = [self autoSetForName: [sender title]]; title = [sender title]; } else { ans = [self getAutoSetWithName: nil]; who = [self autoHistoryAsProgram]; title = [self autoHistoryStart]; oldHist = [[NSMutableArray alloc] initWithArray: autoHistory]; [autoHistory removeAllObjects]; } #ifdef NOSHOWZEROCOUNT if([ans count]) #endif { NSMutableArray *aa = [NSMutableArray array]; [aa addObject: title]; if([self isInfiniteLoop: who usingStack: aa]) { if(NSYESNOQUESTION(@"Autoset has a potential infinite loop, continue?") == NO) return; } [self pushSetStack]; [myData setArray: ans]; [theResults reloadData]; if([[who objectForKey: @"start"] isEqualToString: @"Visible"]) { allFlag = NO; [self addStateString: [NSString stringWithFormat: @"->%@",title]]; } else { [self setStateString: title]; } [autoHistoryStart setString: title]; if(sender != nil && allFlag == YES) [autoHistory removeAllObjects]; else if(sender == nil) { [autoHistory setArray: oldHist]; [oldHist release]; } UPDATERECCOUNT; } if([ans count] == 0) NSWARNING(@"No records found"); #ifdef NOSHOWZEROCOUNT else { NSWARNING(@"No records found"); } #endif } -(IBAction) removeAllAutoSets: (id) sender { if(NSYESNOQUESTION(@"Delete all of this file's autosets?") ==NO) return; [[self autoSets] removeAllObjects]; [self rebuildAutoSetMenu]; UPDATERECCOUNT; } -(IBAction) doRunSet: (id) sender { [self pushSetStack]; if([namedSelDict objectForKey: [sender title]] == nil) { //put the autohistory block here //this block is for autohistory [self doAutoSet: sender]; if([self isAutoSet: [sender title]]) { NSMutableDictionary *ahd = [NSMutableDictionary dictionary]; [ahd setObject: @"autoset" forKey: @"stepType"]; [ahd setObject: [[[sender title] copy] autorelease] forKey: @"name"]; [autoHistory addObject: ahd]; } } else [self loadNamedSelection: sender]; } -(void) rebuildAutoSetMenu { int i, n, m; NSMenu *asmn; NSMutableArray *w1, *w2; asmn = [[[NSApp delegate] autoSetMenu] submenu]; m = [asmn numberOfItems]; if(m > AUTOSETBASE) for(i = AUTOSETBASE; i < m; i++) { [asmn removeItemAtIndex: AUTOSETBASE]; } /* if(gWorkBench != nil) { who = [gWorkBench allAutoSetNames]; if(m = [who count]) for(i = 0; i 0) { for(i=0; i< m; i++) { [asmn addItemWithTitle: [w1 objectAtIndex: i] action: @selector(doRunSet:) keyEquivalent: @""]; } } n = [w2 count]; if(m > 0 && n > 0) [asmn addItem: [NSMenuItem separatorItem]]; if(n > 0) { for(i=0; i< n; i++) { [asmn addItemWithTitle: [w2 objectAtIndex: i] action: @selector(doRunSet:) keyEquivalent: @""]; } } } -(NSArray *) allSetNames { NSMutableArray *aa; aa = [NSMutableArray array]; [aa addObjectsFromArray: [self allAutoSetNames]]; [aa addObjectsFromArray: [namedSelDict allKeys]]; return aa; } -(NSArray *) allAutoSetNames { NSMutableArray *aa; aa = [NSMutableArray array]; if(gWorkBench != nil) { [aa addObjectsFromArray: [gWorkBench allAutoSetNames]]; } [aa addObjectsFromArray: [autoSets allKeys]]; return aa; } -(BOOL) validSetName: (NSString *) who { if(who == nil) return NO; if([who isEqualToString: @""] == YES) return NO; if([self validAutoSetName: who] && [namedSelDict objectForKey: who] == nil) return YES; else return NO; } -(NSMutableArray *) autoHistory{return autoHistory;} -(NSMutableString *) autoHistoryStart {return autoHistoryStart;} -(BOOL) isAutoSet: (NSString *) who { if([self autoSetForName: who] != nil) return YES; if(gWorkBench != nil) if([gWorkBench autoSetForName: who] != nil) return YES; return NO; } -(BOOL) validAutoSetName: (NSString *) who { if(who == nil) return NO; if([who isEqualToString: @""] == YES) return NO; if([self autoSetForName: who] == nil && [gWorkBench autoSetForName: who] == nil && [who isEqualToString: @"All"] == NO && [who isEqualToString: @"Visible"] == NO) return YES; else return NO; } -(void) addAutoSet: (NSMutableDictionary *) what withName: (NSString *) who { if([[what objectForKey: @"global"] intValue] == 0) { [autoSets setObject: what forKey: who]; UPDATERECCOUNT; } else if (gWorkBench != nil) {[gWorkBench addAutoSet: what withName: who];} else NSWARNING(@"Cannot save macro: not connected to a project"); } -(NSMutableDictionary *) myAutoSetForName: (NSString *) who { return [autoSets objectForKey: who]; } -(NSMutableDictionary *) autoSetForName: (NSString *) who { NSMutableDictionary *ans; if(gWorkBench != nil) ans = [gWorkBench autoSetForName: who]; else ans = nil; if(ans == nil) return [autoSets objectForKey: who]; else return ans; } -(void) removeAutoSetForName: (NSString *) who { if([self myAutoSetForName: who] != nil) { [autoSets removeObjectForKey: who]; UPDATERECCOUNT; } else if(gWorkBench != nil) [gWorkBench removeAutoSetForName: who]; } -(NSArray *) columns { return colList; } -(IBAction) doToggleReanalysisMode: (id) sender { if(gWorkBench) { [gWorkBench doToggleReanalysisMode: sender]; } } /*-----------------------------------------------*/ /* summary data routines */ -(NSMutableArray *) hotData {return myData;} -(IBAction) runSummaryReport: (id) sender { [summWatcher doSummary]; } -(void) codeLevelDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode) { aCodeLevel = [codeLevelField intValue]; } } -(IBAction) cancelCodeLevel: (id) Sender { [codeLevelPane orderOut: Sender]; [NSApp endSheet: codeLevelPane returnCode: 0]; } -(IBAction) okCodeLevel: (id) Sender { [codeLevelPane orderOut: Sender]; [NSApp endSheet: codeLevelPane returnCode: 1]; } -(IBAction) doCodeLevel: (id) Sender { NSWindow *who; [codeLevelField setIntValue: aCodeLevel]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: codeLevelPane modalForWindow: who modalDelegate: self didEndSelector: @selector(codeLevelDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(BOOL) isMySummReport: (NSString *) who { NSArray *a; a = [self mySummReports]; FORALL(a) { if([temp isEqualToString: who]) return YES; } ENDFORALL; return NO; } -(int) reportScope: (NSString *) who { if([self isMySummReport: who]) return 1; if([self isSummReport: who]) return 2; return 0; } -(NSMutableString *) dateFormat{return dfString;} -(BOOL) isSummReport: (NSString *) who { NSArray *a; a = [self allSummReports]; FORALL(a) { if([temp isEqualToString: who]) return YES; } ENDFORALL; return NO; } -(void) addSummReport:(NSString *) who report: (NSDictionary *) r global: (BOOL) g { if(g ==NO) { [summReports setObject:r forKey: who]; [self rebuildSummReportMenu]; MAKEDIRTY; } else { [gWorkBench addSummReport: who report: r global: g]; [self rebuildSummReportMenu]; } } -(void) delSummReport:(NSString *) who { if([self isMySummReport: who]) { [summReports removeObjectForKey: who]; [self rebuildSummReportMenu]; MAKEDIRTY; } else { [gWorkBench delSummReport: who]; } } -(NSArray *) mySummReports { return [summReports allKeys]; } -(NSArray *) allSummReports { NSMutableArray *ar = [NSMutableArray array]; [ar addObjectsFromArray: [self mySummReports]]; [ar addObjectsFromArray: [gWorkBench mySummReports]]; return ar; } -(NSDictionary *) summReport: (NSString *) who { NSDictionary *ans; ans = [summReports objectForKey: who]; if(ans == nil) return [gWorkBench summReport: who]; else return ans; } -(void) doRunSummRep: (id) sender { NSDictionary *r; r = [self summReport: [sender title]]; if(r != nil) [summWatcher runSummReport: r]; } -(void) rebuildSummReportMenu { int i, n, m; NSMenu *asmn; NSMutableArray *w1, *w2; asmn = [[[NSApp delegate] summReportMenu] submenu]; m = [asmn numberOfItems]; if(m > SUMMREPORTBASE) for(i = SUMMREPORTBASE; i < m; i++) { [asmn removeItemAtIndex: SUMMREPORTBASE]; } w1 = [NSMutableArray arrayWithArray: [self mySummReports]]; w2 = [NSMutableArray arrayWithArray: [gWorkBench mySummReports]]; [w1 sortUsingFunction: nsStringComp context: nil]; [w2 sortUsingFunction: nsStringComp context: nil]; //who = [self allSetNames]; [asmn addItem: [NSMenuItem separatorItem]]; if((m = [w1 count]) > 0) { for(i=0; i< m; i++) { [asmn addItemWithTitle: [w1 objectAtIndex: i] action: @selector(doRunSummRep:) keyEquivalent: @""]; } } n = [w2 count]; if(m > 0 && n > 0) [asmn addItem: [NSMenuItem separatorItem]]; if(n > 0) { for(i=0; i< n; i++) { [asmn addItemWithTitle: [w2 objectAtIndex: i] action: @selector(doRunSummRep:) keyEquivalent: @""]; } } } /******** dotGraph rountines ********/ -(NSArray *) tableColumns { return [theResults tableColumns]; } -(int) fieldType: (NSString *) name { if([self isUniversal: name] == YES) return 1; if([self isRepeat: name] == YES) return 2; else return 0; } -(int) codeLevel { return aCodeLevel; } -(IBAction) doDotGraph: (id) sender { [dotGraphWatcher doDotGraph]; } /******** stack routines ********/ -(NSMutableDictionary *) getStackElem { NSMutableDictionary *stackElem; NSString *ss; NSMutableArray *myHistory = [[NSMutableArray alloc] init]; stackElem = [NSMutableDictionary dictionary]; ss = [limitField stringValue]; [stackElem setObject: [NSArray arrayWithArray: myData] forKey: @"data"]; [stackElem setObject: [[ss copy] autorelease] forKey: @"limit"]; [myHistory addObjectsFromArray: [self autoHistory]]; [myHistory autorelease]; [stackElem setObject: myHistory forKey: @"history"]; return stackElem; } -(void) pushSetStack { NSMutableDictionary *stackElem; if([gPrefBoss enableBack] == 0) { [self zeroSetStack]; return; } stackElem = [self getStackElem]; [setStack addObject: stackElem]; [fwdSetStack removeAllObjects]; [fwdButton setEnabled: NO]; [backButton setEnabled: YES]; } -(IBAction) popSetStack: (id) sender { int nnn; if([gPrefBoss enableBack] == 0) { [self zeroSetStack]; return; } nnn = [setStack count]; if(nnn >0) { NSDictionary *dd; NSString *ss; NSArray *ah; //first save what we have [fwdSetStack addObject: [self getStackElem]]; [fwdButton setEnabled: YES]; //Now pop what we have dd = [setStack objectAtIndex: nnn - 1]; [myData setArray: [dd objectForKey: @"data"]]; ss = [dd objectForKey: @"limit"]; [limitField setStringValue: ss]; ah = [dd objectForKey: @"history"]; if(ah != nil) [autoHistory setArray: ah]; else [autoHistory removeAllObjects]; [setStack removeLastObject]; UPDATERECCOUNT; [theResults reloadData]; if([setStack count] == 0) [backButton setEnabled: NO]; } else [self zeroSetStack]; } -(IBAction) popFwdSetStack: (id) sender { if([gPrefBoss enableBack] == 0) { [self zeroSetStack]; return; } if([fwdSetStack count] >0) { NSDictionary *dd; NSString *ss; NSArray *ah; //first save what we have [setStack addObject: [self getStackElem]]; [backButton setEnabled: YES]; //Now pop what we have dd = [fwdSetStack lastObject]; [myData setArray: [dd objectForKey: @"data"]]; ss = [dd objectForKey: @"limit"]; [limitField setStringValue: ss]; ah = [dd objectForKey: @"history"]; if(ah != nil) [autoHistory setArray: ah]; else [autoHistory removeAllObjects]; [fwdSetStack removeLastObject]; UPDATERECCOUNT; [theResults reloadData]; if([fwdSetStack count] == 0) [fwdButton setEnabled: NO]; } else [self zeroSetStack]; } -(IBAction) zeroSetStack: (id) sender { [self zeroSetStack]; } -(void) zeroSetStack { [fwdButton setEnabled: NO]; [backButton setEnabled: NO]; [setStack removeAllObjects]; [fwdSetStack removeAllObjects]; } -(IBAction) exportData: (id) sender { [exportWatcher doExport]; } -(IBAction) toggleExactCodeSet: (id) sender { if(exactCodeSetFlag) { exactCodeSetFlag = NO; [sender setState: NSOffState]; } else { exactCodeSetFlag = YES; [sender setState: NSOnState]; } } -(BOOL) selectDataFrom: (NSArray *) fromArray to: (NSMutableArray *) toArray forCodeSet: (NSString *) who type: (int) tp exact: (BOOL) ex { int i,n; BOOL test; NSArray *codes; NSMutableArray *removeList; codes = [gWorkBench codesInCodeSet: who]; if(codes == nil) return NO; switch(tp) { case SELECT: n = [fromArray count]; for(i = 0; i < n; i++) { NSString *mycode; test = NO; mycode = [[fromArray objectAtIndex: i] objectForKey: @"_code"]; if(ex) { FORALL(codes) { if([mycode isEqualToString: temp]) { test = YES; break; } } ENDFORALL; } else { FORALL(codes) { if(isParentOf(temp, mycode)) { test = YES; break; } } ENDFORALL; } if(test)[toArray addObject: [myData objectAtIndex: i]]; } if([toArray count] <= 0) { return NO; } return YES; break; case SELECTFEWER: n = [fromArray count]; removeList = [NSMutableArray array]; for(i = 0; i < n; i++) { NSString *mycode; test = NO; mycode = [[fromArray objectAtIndex: i] objectForKey: @"_code"]; if(ex) { FORALL(codes) { if([mycode isEqualToString: temp]) { test = YES; break; } } ENDFORALL; } else { FORALL(codes) { if(isParentOf(temp, mycode)) { test = YES; break; } } ENDFORALL; } if(test)[removeList addObject: [myData objectAtIndex: i]]; } if([removeList count] <= 0) { return NO; } [toArray setArray: fromArray]; [toArray removeObjectsInArray: removeList]; return YES; break; case SELECTADDITIONAL: n = [backData count]; removeList = [NSMutableArray array]; for(i = 0; i < n; i++) { NSString *mycode; test = NO; mycode = [[backData objectAtIndex: i] objectForKey: @"_code"]; if(ex) { FORALL(codes) { if([mycode isEqualToString: temp]) { test = YES; break; } } ENDFORALL; } else { FORALL(codes) { if(isParentOf(temp, mycode)) { test = YES; break; } } ENDFORALL; } if(test) { if([fromArray indexOfObject: [backData objectAtIndex: i]] == NSNotFound) [removeList addObject: [backData objectAtIndex: i]]; } } if([removeList count] <= 0) { return NO; } [toArray setArray: fromArray]; [toArray addObjectsFromArray: removeList]; return YES; break; }; } -(BOOL) selectCodeSetWithName:(NSString *) who withWarnings: (BOOL) w pushStack: (BOOL) ps exact: (BOOL) ex { return [self selectCodeSetWithName: who withWarnings: w pushStack: ps type: SELECT exact: ex]; } -(BOOL) selectCodeSetWithName:(NSString *) who withWarnings: (BOOL) w pushStack: (BOOL) ps type: (int) tp exact: (BOOL) ex { BOOL test; NSMutableArray *findData; if([self global: @"simpleflag"] == 0) return NO; findData = [[NSMutableArray alloc] init]; test = [self selectDataFrom: myData to: findData forCodeSet: who type: tp exact: ex]; if(test == NO) { if(w) {NSWARNING(@"No data found.");} return NO; } //this block is for autohistory if(ps) [self pushSetStack]; [myData removeAllObjects]; [myData addObjectsFromArray: findData]; [findData release]; return YES; } -(IBAction) selectCodeSet: (id) sender { NSMutableDictionary *ahd = [NSMutableDictionary dictionary]; if([self global: @"simpleflag"] == 0) { {NSWARNING(@"Selecting code sets requires a simple style search");} return; } if([self selectCodeSetWithName: [sender title] withWarnings: YES pushStack: YES exact: exactCodeSetFlag]) { [ahd setObject: @"sel" forKey: @"stepType"]; [ahd setObject: [NSNumber numberWithInt: SELECTCODESET] forKey: @"mode"]; [ahd setObject: [[[sender title] copy] autorelease] forKey: @"name"]; [ahd setObject: [NSNumber numberWithBool: exactCodeSetFlag] forKey: @"exact"]; [autoHistory addObject: ahd]; UPDATERECCOUNT; [theResults reloadData]; [self addStateString: [NSString stringWithFormat: @"code set: %@", [sender title]]]; } } -(void) sel2CodeSetDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode) { NSMutableArray *myCodeList; NSString *codeName; codeName = [sel2CodeSetName stringValue]; if([gWorkBench codeSetExists: codeName]) { if(NSYESNOQUESTION(@"Code set already exists with that name. Replace it?") == NO) return; } myCodeList = [NSMutableArray array]; FORALL(myData) { addUniqueToArray(myCodeList, [[[temp objectForKey: @"_code"] copy] autorelease]); } ENDFORALL; [myCodeList sortUsingFunction: nsStringComp context: nil]; [gWorkBench registerCodeSet: codeName withCodes: myCodeList force: YES]; } } -(IBAction) cancelSel2CodeSet: (id) Sender { [sel2CodeSetSheet orderOut: Sender]; [NSApp endSheet: sel2CodeSetSheet returnCode: 0]; } -(IBAction) okSel2CodeSet: (id) Sender { [sel2CodeSetSheet orderOut: Sender]; [NSApp endSheet: sel2CodeSetSheet returnCode: 1]; } -(IBAction) turnSelectionIntoCodeSet: (id) sender { NSWindow *who; if([self global: @"simpleflag"] == 0) { NSWARNING(@"Must use a simple search to convert selections into code sets."); return; } if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [sel2CodeSetName setStringValue: @""]; [NSApp beginSheet: sel2CodeSetSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(sel2CodeSetDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(void) selCSDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSString *csName; BOOL csExact; NSString *stString; if(returnCode>0) { csName = [selCSMenu titleOfSelectedItem]; if([selCSExactSwitch state] == NSOnState) exactCodeSetFlag=csExact = YES; else exactCodeSetFlag=csExact = NO; NSMutableDictionary *ahd = [NSMutableDictionary dictionary]; if([self global: @"simpleflag"] == 0) { {NSWARNING(@"Selecting code sets requires a simple style search");} return; } if([self selectCodeSetWithName: csName withWarnings: YES pushStack: YES type: returnCode exact: csExact]) { [ahd setObject: @"sel" forKey: @"stepType"]; [ahd setObject: [NSNumber numberWithInt: SELECTCODESET] forKey: @"mode"]; [ahd setObject: [NSNumber numberWithInt: returnCode] forKey: @"type"]; [ahd setObject: [[csName copy] autorelease] forKey: @"name"]; [ahd setObject: [NSNumber numberWithBool: csExact] forKey: @"exact"]; [autoHistory addObject: ahd]; UPDATERECCOUNT; [theResults reloadData]; switch(returnCode) { case SELECT: stString = [NSString stringWithFormat: @"code set: %@", csName]; break; case SELECTFEWER: stString = [NSString stringWithFormat: @"-code set: %@", csName]; break; case SELECTADDITIONAL: stString = [NSString stringWithFormat: @"+code set: %@", csName]; break; }; if(csExact) [self addStateString: [NSString stringWithFormat: @"%@ (x)", stString]]; else [self addStateString: stString]; } } } -(IBAction) selCSCancel: (id) Sender { [selCSSheet orderOut: Sender]; [NSApp endSheet: selCSSheet returnCode: 0]; } -(IBAction) selCSSelectLess: (id) Sender { [selCSSheet orderOut: Sender]; [NSApp endSheet: selCSSheet returnCode: SELECTFEWER]; } -(IBAction) selCSSelectMore: (id) Sender { [selCSSheet orderOut: Sender]; [NSApp endSheet: selCSSheet returnCode: SELECTADDITIONAL]; } -(IBAction) selCSSelect: (id) Sender { [selCSSheet orderOut: Sender]; [NSApp endSheet: selCSSheet returnCode: SELECT]; } -(IBAction) doSelectCodeSetDialogue: (id) Sender { NSWindow *who; if([self global: @"simpleflag"] == 0) { NSWARNING(@"Must use a simple search to convert selections into code sets."); return; } [selCSMenu removeAllItems]; [selCSMenu addItemsWithTitles: [gWorkBench allCodeSetNames]]; if([selCSMenu numberOfItems] >= 1) [selCSMenu selectItemAtIndex: 0]; if(exactCodeSetFlag) [selCSExactSwitch setState: NSOnState]; else [selCSExactSwitch setState: NSOffState]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: selCSSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(selCSDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(IBAction) requestCodeDefinition: (id) sender { int who; NSString *theCode; NSMutableString *theDef; //get the string if(gWorkBench == nil) return; if([self global: @"simpleflag"] == 0) { NSWARNING(@"Definitions are only available in simple searches"); return; } who = [theResults selectedRow]; if(who >= 0) { theCode = [[myData objectAtIndex: who] objectForKey: @"_code"]; } else return; //ask for definition theDef = [gWorkBench getDefinition: theCode]; if(!theDef) { NSString *warning; warning = [NSString stringWithFormat: @"Cannot find definition for string: %@", theCode]; NSWARNING(warning); return; } //if it exists retain and display it [theDef retain]; NSRunAlertPanel(theCode, theDef, @"Ok", nil, nil); //release it [theDef release]; } -(IBAction) requestCodeDefinitionOfSelection: (id) sender { NSRange who; NSString *theCode, *theSel; NSMutableString *theDef; NSString *warning; //get the string if(gWorkBench == nil) return; who = [thisCell selectedRange]; if(who.length == 0) return; theSel = [[thisCell string] substringWithRange: who]; theCode = extractFirstCode(theSel); if(theCode == nil) {NSWARNING(@"Cannot find code in selection."); return;} //ask for definition theDef = [gWorkBench getDefinition: theCode]; if(!theDef) { warning = [NSString stringWithFormat: @"Cannot find definition for string: %@", theCode]; NSWARNING(warning); return; } //if it exists retain and display it [theDef retain]; NSRunAlertPanel(theCode, theDef, @"Ok", nil, nil); //release it [theDef release]; } -(BOOL) isReal {return YES;} -(void) appendComment: (NSString *) what { NSMutableString *hh; if(what == nil) { return; } if([what isEqualToString: @""]) { return; } hh = [NSMutableString stringWithString: what]; trimCharNSS(hh,'\"'); [commentArray addObject: hh]; [extraComment appendString: hh]; } -(void) endComment: (NSString *) what { NSMutableString *hh; if(what == nil) { [self clearComments]; return; } if([what isEqualToString: @""]) { [self clearComments]; return; } hh = [NSMutableString stringWithString: what]; trimCharNSS(hh,'\"'); FORALL(commentArray) { if([temp isEqualToString: hh]) { [commentArray removeObjectAtIndex: __i]; break; } } ENDFORALL; [extraComment setString: [commentArray componentsJoinedByString: @""]]; } -(void) endLastComment { if([commentArray count] > 0) [commentArray removeLastObject]; if([commentArray count] == 0) { [self clearComments]; return; } else [extraComment setString: [commentArray componentsJoinedByString: @""]]; } -(void) clearComments { [commentArray removeAllObjects]; [extraComment setString: @""]; } -(NSMutableString *) getComment { return extraComment; } -(void) setComment: (NSString *) what; { NSMutableString *hh; if(what == nil) { [self clearComments]; return; } if([what isEqualToString: @""]) { [self clearComments]; return; } [self clearComments]; hh = [NSMutableString stringWithString: what]; trimCharNSS(hh,'\"'); [extraComment setString: hh]; } #ifdef MULTIMEDIA -(void) loadMediaFile: (NSString *) what { NSString *path; if([[NSFileManager defaultManager] fileExistsAtPath: what] == YES) { if (myMovie != nil) [myMovie release]; myMovie = [[NSMovie alloc] initWithURL: [NSURL fileURLWithPath: what] byReference: YES]; if(myMovie != nil) { [myMovieView showController: YES adjustingSize: YES]; //duration = GetMovieDuration([myMovie QTMovie]); [mediaFileName setStringValue: [what lastPathComponent]]; [myMovieView setMovie: myMovie]; return; } } else { if((path = [self fileName]) != nil) { NSMutableArray *cmp = [NSMutableArray arrayWithArray: [path pathComponents]]; NSString *newPath; [cmp removeLastObject]; [cmp addObject: [what lastPathComponent]]; newPath = [cmp componentsJoinedByString: @"/"]; if([[NSFileManager defaultManager] fileExistsAtPath: newPath] == YES) { if(myMovie != nil) [myMovie release]; myMovie = [[NSMovie alloc] initWithURL: [NSURL fileURLWithPath: newPath] byReference: YES]; if(myMovie != nil) { [myMovieView showController: YES adjustingSize: YES]; //duration = GetMovieDuration([myMovie QTMovie]); [mediaFileName setStringValue: [newPath lastPathComponent]]; [myMovieView setMovie: myMovie]; return; } } } } NSWARNING(@"Unable to find or open media file. Remove !mediafile metatag and relocate the file"); } -(void) mediaPlayerDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { [myMovieView stop: nil]; [myTimer invalidate]; [myTimer release]; [myMovie release]; myMovie = nil; myTimer = nil; } -(IBAction) exitMediaPlayer: (id) Sender { [mediaSheet orderOut: Sender]; [NSApp endSheet: mediaSheet returnCode: 1]; } -(IBAction) setMovieTime: (NSString *) tt; { long tmValue, scale; double tm; if(myMovie == nil ) return; scale = (long) GetMovieTimeScale( [myMovie QTMovie]); if(isHHMMSS(tt)) { tmValue = hhmmss2sec(tt) * scale; } else { tm = [tt doubleValue]; tmValue = tm * scale; } SetMovieTimeValue([myMovie QTMovie], tmValue); /* tm = [tt doubleValue]; tmValue = tm * scale; SetMovieTimeValue([myMovie QTMovie], tmValue);*/ } -(IBAction) restartMedia: (id) sender { int r1; NSString *tc; //if I'm at the end exit r1 = [theResults selectedRow]; { //then jump to the new time tc = [[myData objectAtIndex: r1] objectForKey: [gPrefBoss getAVCode]]; if(tc == nil) return; if([tc isEqualToString: @""] != YES) { [mediaTimeCode setStringValue: tc]; [self setMovieTime: tc]; } } } -(void) jumpMediaRow: (int) row { int r1, r2, n; BOOL p; NSString *p1, *p2, *tc, *mf; //if I'm at the end exit r1 = mediaRow; r2 = row; n = [myData count]; if(r2 >= n || r2 <= 0) return; p = [myMovieView isPlaying]; //what is my file? p1 = [[[myData objectAtIndex: r1] objectForKey: @"_doc"] path]; //What is the next file? p2 = [[[myData objectAtIndex: r2] objectForKey: @"_doc"] path]; //are they the same if([p1 isEqualToString: p2]) { //then jump to the new time tc = [[myData objectAtIndex: r2] objectForKey: [gPrefBoss getAVCode]]; if(tc == nil) return; if([tc isEqualToString: @""] != YES) { [mediaTimeCode setStringValue: tc]; [self setMovieTime: tc]; } } else { [myMovieView stop: nil]; //get file mf = [mediaDict objectForKey: p2]; if(mf == nil) return; tc = [[myData objectAtIndex: r2] objectForKey: [gPrefBoss getAVCode]]; if(tc == nil) return; [myMovie release]; myMovie = nil; [self loadMediaFile: mf]; { if([tc isEqualToString: @""] != YES) { [mediaTimeCode setStringValue: tc]; [self setMovieTime: tc]; } } if(p) [myMovieView start: nil]; } if([theResults numberOfRows] > 0 && [theResults numberOfRows] > r2) [theResults selectRow: r2 byExtendingSelection: NO]; mediaRow = r2; //else stop //load //jump to time } -(IBAction) jumpMediaBack: (id) sender { int r1, r2, n; //if I'm at the end exit r1 = [theResults selectedRow]; r2 = r1 - 1; n = [myData count]; if(r1 == 0) return; [self jumpMediaRow: r2]; } -(IBAction) jumpMediaForward: (id) sender { int r1,r2, n; //if I'm at the end exit r1 = [theResults selectedRow]; r2 = r1 + 1; n = [myData count]; if(r1 >= n-1) return; [self jumpMediaRow: r2]; } -(void) idleTimer:(id)sender { long scale, ct; float time; if(myMovie == nil) return; scale = GetMovieTimeScale( [myMovie QTMovie]); ct = GetMovieTime([myMovie QTMovie], nil); time = (float) ct/ (float) scale; if([gPrefBoss timeFormatHHMMSS] == 1) [mediaTimeCode setStringValue: sec2hhmmss((unsigned) time)]; else [mediaTimeCode setStringValue: [NSString stringWithFormat: @"%.2fs", (float) ct/ (float) scale]]; if(jagFlag) MoviesTask([myMovie QTMovie],0); } -(void) XidleTimer:(id)sender { long scale, ct; double time; if(myMovie == nil) return; scale = GetMovieTimeScale( [myMovie QTMovie]); ct = GetMovieTime([myMovie QTMovie], nil); time = (double) ct/ (double) scale; if([gPrefBoss timeFormatHHMMSS] == 1) [mediaTimeCode setStringValue: sec2hhmmss((unsigned) time)]; else [mediaTimeCode setStringValue: [NSString stringWithFormat: @"%.2fs", time]]; //[mediaTimeCode setStringValue: [NSString stringWithFormat: @"%.2fs", time]; if(jagFlag) MoviesTask([myMovie QTMovie],0); } -(IBAction) doMediaPlayer: (id) sender { int r; NSDictionary *dd; NSString *df, *mf; NSString *tc; r = [theResults selectedRow]; if([mediaSheet isVisible]) { [self jumpMediaRow: r]; return; } //get row dd = [myData objectAtIndex: r]; //get file df = [[dd objectForKey: @"_doc"] path]; mf = [mediaDict objectForKey: df]; if(mf == nil) return; tc = [dd objectForKey: [gPrefBoss getAVCode]]; if(tc == nil) return; //does file have a media file //set the name of the media file //set the nsmovieview //jump to the location in the media file //run mediaRow = r; [NSApp beginSheet: mediaSheet modalForWindow: nil modalDelegate: self didEndSelector: @selector(mediaPlayerDidEnd:returnCode:contextInfo:) contextInfo: nil]; if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_2) jagFlag = YES; else jagFlag = FALSE; if(myTimer == nil) myTimer = [[NSTimer scheduledTimerWithTimeInterval:0.1 // interval, 0.1 seconds target:self selector:@selector(idleTimer:) // call this method userInfo:nil repeats:YES] retain]; [self loadMediaFile: mf]; { if([tc isEqualToString: @""] != YES) { [mediaTimeCode setStringValue: tc]; [self setMovieTime: tc]; } } } #else -(void) idleTimer:(id)sender { } #endif @end gtamsanalyzer.app-0.42/Source/myResultsOld.m0000555000175000017500000051431710162465511021446 0ustar brentbrent00000000000000// // myResults.m // TAMS Edit // // Created by matthew on Sun Apr 21 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "myResults.h" #import "ctReadChar.h" #import "tams.h" #import "ctLimitCrit.h" #import "TAMSCharEngine.h" #import "coderec.h" #import "NSRecordData.h" #import "prefBoss.h" #import "myProject.h" #import "docDelegate.h" #import "appDelegate.h" #import "utils.h" #import "tamsutils.h" #import "MWPath.h" #import "MWFakeFile.h" #import "MGWPopUpButton.h" //#import "AGRegex.h" #import #import #import "MWSortStackItem.h" #import "stringCategories.h" //#define SIMON 1 #define NOTIFICATIONDIRTY 1 #define CLOSEBUG 1 #define NAMEDSELMENU 140 #define XML 1 #define REGEXSEARCH 1 #define NAMEDSELBASE 4 #define MYGLOBAL(X) [myGlobals findInt: X] #define SETGLOBAL(X,Y) [myGlobals setKey: X intValue: Y] #define ON(X) if([X isEqualToString: [myc buff]] == YES) #define SELECTEDCOLUMNID(X) [[[X tableColumns] objectAtIndex: [X selectedColumn]] identifier] #define UPDATERECCOUNT [self updateRecCount]; #define TAMSTART(X) [[X objectForKey: @"_begin_loc"] intValue] #define TAMEND(X) [[X objectForKey: @"_end_loc"] intValue] #define MAKEDIRTY [self updateChangeCount: NSChangeDone]; NSString *dateFmt[20] = {{@"%m/%d/%y"}, //mm/dd/yy {@"%m/%d/%Y"}, //mm/dd/yyyy {@"%m-%d-%y"}, //mm-dd-yyyy {@"%d/%m/%Y"}, //dd/mm/yyyy {@"%d/%m/%y"}, //dd/mm/yy {@"%B %d, %Y"}, //month dd, yyyy {@"%d %B, %Y"}, //dd month, yyyy {@"%I:%M"}, //hh:mm {@"%I:%M %p"}, //hh:mm AM/PM {@"%I:%M:%S"}, //hh:mm:ss {@"%I:%M:%S %p"},//hh:mm:ss AM/PM {@"%H:%M"}, //24hh:mm {@"%H:%M:%S"}, //24hh:mm:ss {@""} //other }; BOOL arrayContainsString(NSArray *a, NSString *s) { int i; int n; n = [a count]; for(i = 0; i < n; i++) { if([[a objectAtIndex: i] isEqualToString: s] == YES) return YES; } return NO; } //need to change this for version 2 int locationComp(id first, id second, void *key) { //compare the documents if([first objectForKey: @"_doc"] == [second objectForKey: @"_doc"]) { if([[first objectForKey: @"_begin_loc"] intValue] > [[first objectForKey: @"_begin_loc"] intValue]) return NSOrderedDescending; else if([[first objectForKey: @"_begin_loc"] intValue] < [[first objectForKey: @"_begin_loc"] intValue]) return NSOrderedAscending; else return NSOrderedSame; } else { return [(MWFile *)[first objectForKey: @"_doc"] compare: [second objectForKey: @"_doc"]]; } } int locationFwdComp(id first, id second, void *key) { //compare the documents if([[first objectForKey: @"_doc"] isEqual: [second objectForKey: @"_doc"]]) { if([[first objectForKey: @"_begin_loc"] intValue] < [[first objectForKey: @"_begin_loc"] intValue]) return NSOrderedDescending; else if([[first objectForKey: @"_begin_loc"] intValue] > [[first objectForKey: @"_begin_loc"] intValue]) return NSOrderedAscending; else return NSOrderedSame; } else { return ([(MWFile *)[first objectForKey: @"_doc"] compare: [second objectForKey: @"_doc"]]); } } int nsStringComp(id first, id second, void *key) { return([(NSString *)first compare: second]); } int nsMWFileComp(id first, id second, void *key) { return nsStringComp([first name], [second name], key); } int stringComp(id first, id second, NSString *key) { return [[first objectForKey: key] compare: [second objectForKey: key]]; } int longFwdComp(id first, id second, NSString *key) { int a, b; a = [[first objectForKey: key] intValue]; b = [[second objectForKey: key] intValue]; if(a < b) return NSOrderedAscending; else if(a > b) return NSOrderedDescending; else return NSOrderedSame; } @implementation myResults -(void) updateOnlyRecCount { [recCount setStringValue: [NSString stringWithFormat: @"%d/%d", [myData count], [backData count]]]; } -(void) updateRecCountVertical { int n; n = [myData count]; [recCount setStringValue: [NSString stringWithFormat: @"%d/%d", n, [backData count]]]; [self updateChangeCount: NSChangeDone]; if([theResults selectedColumn] < 0) { [theResults selectRow: 0 byExtendingSelection: NO]; } [self displaySelData: 0]; } -(void) updateRecCount { int r, n; n = [myData count]; r = [theResults selectedRow]; [recCount setStringValue: [NSString stringWithFormat: @"%d/%d", n, [backData count]]]; [self updateChangeCount: NSChangeDone]; { [theResults selectRow: 0 byExtendingSelection: NO]; [self displaySelData: 0]; } } -(void) updateRecCountAtRow { int r, n; n = [myData count]; r = [theResults selectedRow]; [recCount setStringValue: [NSString stringWithFormat: @"%d/%d", n, [backData count]]]; [self updateChangeCount: NSChangeDone]; if(r < n && r >= 0) [self displaySelData: r]; else { [theResults selectRow: 0 byExtendingSelection: NO]; [self displaySelData: 0]; } } -(BOOL) isUniversal: (NSString *) name { FORALL(univList) { if([temp isEqualToString: name]) return YES; } ENDFORALL; return NO; } -(BOOL) isInnerRepeat: (NSString *) name { return [innerRepeat isEqualToString: name]; } -(BOOL) isRepeat: (NSString *) name { FORALL(repList) { if([temp isEqualToString: name]) return YES; } ENDFORALL; return NO; } -(BOOL) isBlocked: (NSString *) name { FORALL(blockList) { if([temp isEqualToString: name]) return YES; } ENDFORALL; return NO; } -(int) getDocType {return myDocType;} -(void) setCharEngineWithSource: (id) src andFileList: (NSArray *) myList { tce = [[TAMSCharEngine alloc] init]; [tce addArrayToSearchList: myList]; [tce setGCurrentDataSource: src]; [tce startSearch]; } -(void) setCharEngine: (TAMSCharEngine*) who {tce = who;} -(void) setGlobalInt: (id) key value: (int) v { [myGlobals setKey: key intValue: v]; } -(int) global: (NSString *)name { return [myGlobals findInt: name]; } -(void) setGlobal: (NSString *) name to: (int) val { [myGlobals setKey: name intValue: val]; } -(void) initVariables { [myGlobals setKey: @"eofIsEndFlag" intValue: [gPrefBoss EOFIsEndValue]]; [myGlobals setKey: @"firstwriteflag" intValue: 1]; [myGlobals setKey: @"quoteflag" intValue: 1]; [myGlobals setKey: @"tabflag" intValue: 0]; [myGlobals setKey: @"headerflag" intValue: 1]; [myGlobals setKey: @"lnumflag" intValue: 0]; [myGlobals setKey: @"lineflag" intValue: 0]; [myGlobals setKey: @"fastflag" intValue: 0]; [myGlobals setKey: @"blankflag" intValue: 1]; [myGlobals setKey: @"startflag" intValue: 1]; [myGlobals setKey: @"nameflag" intValue: 0]; [myGlobals setKey: @"noparflag" intValue: 1]; [myGlobals setKey: @"cleanflag" intValue: 1]; [myGlobals setKey: @"linecount" unsValue: 1L]; [myGlobals setKey: @"escapeflag" unsValue: [gPrefBoss escapeBracesValue]]; [myGlobals setKey: @"zeromark" unsValue: 0]; SETGLOBAL(@"backloadrepeatflag", [gPrefBoss backendRepeatValue]); SETGLOBAL(@"zapuniversal", [gPrefBoss zapUnivValue]); innerRFlag = 0; } -(id) init { [super init]; myDocType = RESULTTYPE; firstUpdateFlag = YES; stripTags = NO; //[[NSDocumentController sharedDocumentController] addDocument: self]; myGlobals = [[varRegistry alloc] init]; closePermission = NO; univVault = [[NSMutableDictionary alloc] init]; normVault = [[NSMutableDictionary alloc] init]; repVault = [[NSMutableDictionary alloc] init]; univList = [[NSMutableArray alloc] init]; fileList = [[NSMutableArray alloc] init]; codersList = [[NSMutableArray alloc] init]; colList = [[NSMutableArray alloc] init]; repList = [[NSMutableArray alloc] init]; blockList = [[NSMutableArray alloc] init]; myData = [[NSMutableArray alloc] init]; backData = [[NSMutableArray alloc] init]; fmode = [[NSMutableString alloc] init]; innerRepeat = [[NSMutableString alloc] init]; markedList = [[NSMutableArray alloc] init]; lgNewCodeName = [[NSMutableString alloc] init]; lgNewCodeDef = [[NSMutableString alloc] init]; sortStack = [[NSMutableArray alloc] init]; dfString = [[NSMutableString alloc] init]; [dfString setString: dateFmt[0]]; codersString = [[NSMutableString alloc] init]; namedSelSelected = [[NSMutableString alloc] init]; namedSelDict = [[NSMutableDictionary alloc] init]; repCont = [[NSMutableDictionary alloc] init]; autoSets = [[NSMutableDictionary alloc] init]; summReports = [[NSMutableDictionary alloc] init]; autoHistory = [[NSMutableArray alloc] init]; autoHistoryStart = [[NSMutableString alloc] init]; dfIndex = -1; limitString = nil; //These are set by the user and should maintain their value so we don't reset them in initVariable [myGlobals setKey: @"simpleflag" intValue: 0]; [myGlobals setKey: @"limitflag" intValue: 0]; [myGlobals setKey: @"rawflag" intValue: 1]; [myGlobals setKey: @"exactflag" intValue: 0]; [myGlobals setKey: @"emptyflag" intValue: 1]; [myGlobals setKey: @"regexcharflag" intValue: 1]; [myGlobals setKey: @"sectionsearch" intValue: 0]; [self initVariables]; return self; } - (void) reconnect { FORALL(fileList) { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleDirtySourceFlag:) name: @"TAMSDocDidChange" object: temp]; /* [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(addCodeHandler:) name: @"TAMSDocAddedCode" object: temp];*/ } ENDFORALL; } - (void) disconnect { [[NSNotificationCenter defaultCenter] removeObserver:self]; /* FORALL(fileList) { [[NSNotificationCenter defaultCenter] removeObserver:self name: @"TAMSDocDidChange" object: temp ]; }ENDFORALL; */ } - (void) close { [self disconnect]; [super close] ; } -(void) dealloc { [self disconnect]; [autoHistory release]; [autoHistoryStart release]; [autoSets release]; [univVault release]; [normVault release]; [repVault release]; [univList release]; [summReports release]; [fileList release]; [colList release]; [repList release]; [blockList release]; [myData release]; [backData release]; [fmode release]; [markedList release]; [lgNewCodeName release]; [lgNewCodeDef release]; [dfString release]; [codersList release]; [innerRepeat release]; [sortStack release]; [namedSelSelected release]; [namedSelDict release]; [repCont release]; [super dealloc]; } -(void) addCodeHandler: (NSNotification *) notification { NSDictionary *info; MWFile *who; who = [notification object]; info = [notification userInfo]; FORALL(backData) { if([temp objectForKey: @"_doc"] == who) { int b, e, l, loc; loc = [[info objectForKey: @"location"] intValue]; l = [[info objectForKey: @"length"] intValue]; b = [[temp objectForKey: @"_begin_loc"] intValue]; e = [[temp objectForKey: @"_end_loc"] intValue]; if(b >= loc) [temp setObject: [NSNumber numberWithLong: (b + l)] forKey: @"_begin_loc"]; if(e >= loc) [temp setObject: [NSNumber numberWithLong:( e + l)] forKey: @"_end_loc"]; } } ENDFORALL; [theResults reloadData]; } #ifdef NOTIFICATIONDIRTY -(void) handleDirtySourceFlag: (NSNotification *) notification { // if this is one of mine get dirty if([dirtySourceFlag state] == NSOnState) return; FORALL(fileList) { //if([(MWFile *)temp compare: [notification object]] == YES) if(temp == [notification object]) { [dirtySourceFlag setState: NSOnState]; return; } } ENDFORALL; } #else //update method - (void)windowDidBecomeKey:(NSNotification *)aNotification { //do the docs exist FORALL(fileList) { if([gWorkBench fileExists: temp] == YES) { //if yes are dirty [dirtySourceFlag setState: NSOnState]; return; } } ENDFORALL; //mark me and return if(gWorkBench != nil) { if([gWorkBench reanalysisMode] == YES) { [[[NSApp delegate] reanalysisMenu] setState: NSOnState]; } else { [[[NSApp delegate] reanalysisMenu] setState: NSOffState]; } } } #endif -(void) adjustBy: (int) amt startingAt: (int) loc for: (id) who { int newLoc; FORALL(myData) { if([[temp objectForKey: @"_doc"] isEqual: who]) { if([[temp objectForKey: @"_begin_loc"] intValue] > loc) { newLoc = [[temp objectForKey: @"_begin_loc"] intValue] + amt; [temp setObject: [NSNumber numberWithInt: newLoc] forKey: @"_begin_loc"]; } if([[temp objectForKey: @"_end_loc"] intValue] > loc) { newLoc = [[temp objectForKey: @"_end_loc"] intValue] + amt; [temp setObject: [NSNumber numberWithInt: newLoc] forKey: @"_end_loc"]; } } } ENDFORALL; } -(IBAction) doMarkAll: (id) sender { [markedList setArray: myData]; [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(IBAction) doUnmarkAll: (id) sender { [markedList removeAllObjects]; [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(void) markRecord: (int) row withReload: (BOOL) doit { if([markedList indexOfObject: [myData objectAtIndex: row]] == NSNotFound) { [markedList addObject: [myData objectAtIndex: row]]; } if(doit == YES) [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } //array of nsnumbers -(void) markArray: (NSArray *) rows { FORALL(rows) { [self markRecord: [temp intValue] withReload: NO]; } ENDFORALL; [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(void) markBackArray: (NSArray *) rows { FORALL(rows) { if([markedList indexOfObject: [backData objectAtIndex: [temp intValue]]] == NSNotFound) { [markedList addObject: [backData objectAtIndex: [temp intValue]]]; } } ENDFORALL; [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(IBAction) doMark: (id) sender { int row; row = [theResults selectedRow]; if([markedList indexOfObject: [myData objectAtIndex: row]] == NSNotFound) { [markedList addObject: [myData objectAtIndex: row]]; } [theResults reloadData]; [self updateChangeCount: NSChangeDone]; } -(IBAction) doUnmark: (id) sender { int row; int selObj; row = [theResults selectedRow]; selObj = [markedList indexOfObject: [myData objectAtIndex: row]]; if(selObj != NSNotFound) { [markedList removeObject: [myData objectAtIndex: row]]; } [theResults reloadData]; MAKEDIRTY; } -(IBAction) doDeleteMarked: (id) sender { if([markedList count]) { FORALL(markedList) { [myData removeObject: temp]; } ENDFORALL; [markedList removeAllObjects]; [theResults reloadData]; UPDATERECCOUNT; MAKEDIRTY; } } -(IBAction) doReverseMarked: (id) sender { NSMutableArray *newMarked = [[NSMutableArray alloc] init]; //save the total list into an array [newMarked setArray: myData]; //remove the marked FORALL(markedList) { [newMarked removeObject: temp]; } ENDFORALL; //set the new marked list [markedList setArray: newMarked]; [newMarked release]; //reload [theResults reloadData]; MAKEDIRTY; } -(IBAction) doShowComment: (id) sender { int row; id aRec; //get the key numbers row = [theResults selectedRow]; //make a range aRec = [myData objectAtIndex: row]; NSRunAlertPanel(@"Comment:", [aRec objectForKey: @"_comment"], @"Ok", nil, nil); } -(void) newCodeDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == 1) { [lgNewCodeName setString: [newCodeName stringValue]]; [lgNewCodeDef setString: [newCodeDef string]]; [arBossWindow orderOut: self]; [NSApp endSheet: arBossWindow returnCode: 1]; } } -(IBAction) deleteSourceCodes: (id) Sender { NSMutableArray *myLocalRecs; id myRec, ans; NSEnumerator *locList; if([self global: @"sectionsearch"] == YES || [self global: @"regexcharflag"] == YES || [self global: @"nonregexcharflag"] == YES) { NSWARNING(@"Cannot delete codes this type of search"); return; } if([self global: @"limitflag"] && ![self global: @"simpleflag"]) { NSWARNING(@"Only simple searches can have records removed"); return; } ans = NSYESNOQUESTION(@"This will delete information from your source files. Should I proceed?"); if(ans == NO) return; if([markedList count]) { //is there something there? //refresh? //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationComp context: nil]; //go through and call the main docuement locList = [markedList reverseObjectEnumerator]; while(myRec = [locList nextObject]) { if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; [[[myRec objectForKey: @"_doc"] filePointer ] deleteCodeFromResultStartingWith: [[myRec objectForKey: @"_begin_loc"] intValue] endingWith: [[myRec objectForKey:@"_end_loc"] intValue] from: self]; } //remove the files from here if([markedList count]) { FORALL(markedList) { [myData removeObject: temp]; [backData removeObject: temp]; } ENDFORALL; [markedList removeAllObjects]; } [theResults reloadData]; UPDATERECCOUNT; //have it reload if([gPrefBoss autoReloadValue]) [self refreshResults: self]; } else { } } -(void) recodeDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSMutableArray *myLocalRecs; NSMutableString *myNewCodeName; id myRec; NSEnumerator *locList; myNewCodeName = [[NSMutableString alloc] init]; if([markedList count]) { if(returnCode == 1) { //is there something there? if([lgNewCodeName isEqualToString: @""] == YES) return; //refresh? //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationComp context: nil]; //go through and call the main docuement locList = [markedList reverseObjectEnumerator]; while(myRec = [locList nextObject]) { if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; [[[myRec objectForKey: @"_doc"] filePointer] recode: lgNewCodeName first: [[myRec objectForKey:@"_begin_loc"] intValue] last: [[myRec objectForKey:@"_end_loc"] intValue] from: self withDef: lgNewCodeDef]; } if([gPrefBoss cancelAfterRecode] == 1) [self doUnmarkAll: nil]; //have it reload if([gPrefBoss autoReloadValue]) [self refreshResults: self]; } } else { } } //#define MODALWIND 1 -(void) setInnerRepeat: (NSString *) what { [innerRepeat setString: what]; trimNSS(innerRepeat); } -(void) buildCoderList { NSString *ss; NSMutableArray *tempArray; int n; //remove objects [codersList removeAllObjects]; //get the list ss = codersString; //split object tempArray = convertStringToArray(ss, ','); [tempArray retain]; n = [tempArray count]; FORALL(tempArray) { NSMutableString *tt; tt = [[NSMutableString alloc] init]; [tt setString: temp]; trimNSS(tt); [codersList addObject: tt]; } ENDFORALL; n = [codersList count]; //trim objects [tempArray release]; } -(IBAction) doAddCodeOK: (id) sender { lgNewCodeMode = CODEMODEOLD; [lgNewCodeName setString: [addCodeName titleOfSelectedItem]]; [lgNewCodeDef setString: @""]; [addCodeWindow orderOut: sender]; [NSApp endSheet: addCodeWindow returnCode: 1]; } -(IBAction) doNewCode: (id) sender { lgNewCodeMode = CODEMODENEW; lgNewCodeColor = [[codeColorMenu selectedItem] tag]; [lgNewCodeName setString: [newCodeName stringValue]]; [lgNewCodeDef setString: [newCodeDef string]]; [addCodeWindow orderOut: sender]; [NSApp endSheet: addCodeWindow returnCode: 1]; } -(IBAction) doAddCodeCancel: (id) sender { [addCodeWindow orderOut: sender]; [NSApp endSheet: addCodeWindow returnCode: 0]; } -(IBAction) doRecode: (id) sender { NSArray *clist; NSWindow *who; if(![markedList count]) return; if([self global: @"sectionsearch"] == YES || [self global: @"regexcharflag"] == YES || [self global: @"nonregexcharflag"] == YES) { NSWARNING(@"Cannot recode this type of search"); return; } if([self global: @"limitflag"] && ![self global: @"simpleflag"]) { NSWARNING(@"Only simple searches can be recoded"); return; } //delete the menu items if([addCodeName numberOfItems]) [addCodeName removeAllItems]; //get a fresh list //add new //[addCodeName addItemWithTitle: @"New"]; //build up the menu clist = [gWorkBench getHotCodeList]; [addCodeName addItemsWithTitles: clist]; [addCodeName selectItemAtIndex: 0]; recodeFlag = 1; [newCodeName setStringValue: @""]; [newCodeDef setString: @""]; [codeColorMenu selectItemAtIndex: [codeColorMenu indexOfItemWithTag: inheritedColor]]; [codePrompt setStringValue: @"Recode to:"]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: addCodeWindow modalForWindow: who modalDelegate: self didEndSelector: @selector(addCodeDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(BOOL) isOverlapped: (id) r1 and: (id) r2 { int b1, b2, e1, e2; b1 = TAMSTART(r1); b2 = TAMSTART(r2); e1 = TAMEND(r1); e2 = TAMEND(r2); if([r1 objectForKey: @"_doc"] != [r2 objectForKey: @"_doc"]) return NO; //if (r1 == r2) return NO; if( b1 <= b2 && e1 <= b2) return NO; if(b1 >= e2 && e1 >= e2) return NO; return YES; } -(NSString *) processRecodeWithOldCode: (NSString *) oldCode newCode: (NSString *) newCode onRecord: (NSString *) r1 range: (NSRange) rr { BOOL pmode, q4ct; int tcnt; TAMSCharEngine *tx = [[TAMSCharEngine alloc] initWithString: r1]; ctQChar *qq = [[ctQChar alloc] init]; NSMutableString *newData = [NSMutableString string]; [tx setEscFlag: 0]; [tx startSearch]; tcnt = 0; q4ct = NO; //[tx setCharLocation: rr.location]; if(([tx getCharLocation] <= rr.location + rr.length) && [tx getCharLocation] >= rr.location) pmode = YES; else pmode = NO; while([tx readnext: qq] != EOF) { switch([qq tokentype]) { case TOKEN: case ENDTOKEN: if( [[qq buff] isEqualToString: oldCode] == YES && ((pmode && tcnt < 2) || q4ct ==YES)) { tcnt++; if([qq tokentype] == TOKEN) q4ct = YES; [qq setBuff: newCode]; [newData appendString: stringForQChar(qq, NO)]; } else [newData appendString: stringForQChar(qq, NO)]; break; default: [newData appendString: stringForQChar(qq, NO)]; }; if(([tx getCharLocation] <= rr.location + rr.length) && [tx getCharLocation] >= rr.location) pmode = YES; else pmode = NO; } [tx release]; [qq release]; return newData; } -(NSString *) processAddcodeWithOldCode: (NSString *) oldCode newCode: (NSString *) newCode onRecord: (NSString *) r1 range: (NSRange) rr { TAMSCharEngine *tx = [[TAMSCharEngine alloc] initWithString: r1]; ctQChar *qq = [[ctQChar alloc] init]; NSMutableString *newData = [NSMutableString string]; int tcnt; BOOL pmode, q4ct; q4ct = NO; [tx setEscFlag: 0]; [tx startSearch]; //[tx setCharLocation: rr.location]; tcnt =0; if(([tx getCharLocation] <= rr.location + rr.length) && [tx getCharLocation] >= rr.location) pmode = YES; else pmode = NO; while([tx readnext: qq] != EOF) { switch([qq tokentype]) { case TOKEN: case ENDTOKEN: if( [[qq buff] isEqualToString: oldCode] == YES && ((pmode && tcnt < 2) || q4ct)) { if([qq tokentype] == TOKEN) q4ct = YES; tcnt++; [newData appendString: code2tag(newCode, (([qq tokentype] == TOKEN)? YES : NO), YES, nil)]; [newData appendString: stringForQChar(qq, NO)]; } else [newData appendString: stringForQChar(qq, NO)]; break; default: [newData appendString: stringForQChar(qq, NO)]; }; if(([tx getCharLocation] <= rr.location + rr.length) && [tx getCharLocation] >= rr.location) pmode = YES; else pmode = NO; } [tx release]; [qq release]; return newData; } -(void) adjustAllToRecodeWithNewCode: (NSString *) newCode oldCode: (NSString *) oldCode keyRecord: (id) rr keyData: (NSString *) kd { NSRange rrr; NSString * rstr; FORALL(backData) { int b1, b2, e1, e2, l1, l2; b1 = TAMSTART(rr); b2 = TAMSTART(temp); e1 = TAMEND(rr); e2 = TAMEND(temp); l2 = [[temp objectForKey: @"_data"] length]; l1 = [kd length]; if(TAMSTART(rr) == TAMSTART(temp) && TAMEND(rr) == TAMEND(temp)) { [temp setObject: [[newCode copy] autorelease] forKey: @"_code"]; } if([self isOverlapped: temp and: rr]) { if(b1 <= b2) rrr.location = 0; else rrr.location = b1 - b2; if(e1 >= e2) rrr.length = 1+e2 - (b2 + rrr.location) + ((l1 - (e2 - b2) > 0) ? l1 - (e2 -b2) : (e2-b2) - l1); else rrr.length = 1+e1 - (b2 + rrr.location) + ((l1 - (e2 - b2) > 0) ? l1 - (e2 -b2) : (e2-b2) - l1); rstr = [self processRecodeWithOldCode: oldCode newCode: newCode onRecord: [temp objectForKey: @"_data"] range: rrr]; [temp setObject: rstr forKey: @"_data"]; } } ENDFORALL; } -(void) adjustAllToAddcodeWithNewCode: (NSString *) newCode oldCode: (NSString *) oldCode keyRecord: (id) rr keyData: (NSString *) kd { NSRange rrr; NSString * rstr; FORALL(backData) { int b1, b2, e1, e2, l1, l2; b1 = TAMSTART(rr); b2 = TAMSTART(temp); e1 = TAMEND(rr); e2 = TAMEND(temp); l2 = [[temp objectForKey: @"_data"] length]; l1 = [kd length]; if([self isOverlapped: temp and: rr]) { if(b1 < b2) rrr.location = 0; else rrr.location = b2 - b1; if(e2 >= e1) rrr.length = 1+b2 - (b2 + rrr.location) + ((l1 - (e2 - b2) > 0) ? l1 - (e2 -b2) : (e2-b2) - l1); else rrr.length = 1+e1 - (b2 + rrr.location) + ((l1 - (e2 - b2) > 0) ? l1 - (e2 -b2) : (e2-b2) - l1); rstr = [self processAddcodeWithOldCode: oldCode newCode: newCode onRecord: [temp objectForKey: @"_data"] range: rrr]; [temp setObject: rstr forKey: @"_data"]; } } ENDFORALL; } -(void)handleResultsDidChange: (NSNotification *) not { NSDictionary *myDat = [not userInfo]; if([[myDat objectForKey: @"type"] isEqualToString: @"r"] == YES) { [self adjustAllToRecodeWithNewCode: [myDat objectForKey: @"newCode"] oldCode: [myDat objectForKey: @"oldCode"] keyRecord: [myDat objectForKey: @"keyRecord"] keyData: [myDat objectForKey: @"keyData"]];//[[myDat objectForKey: @"keyRecord"] objectForKey: @"_data"]]; } else { [self adjustAllToAddcodeWithNewCode: [myDat objectForKey: @"newCode"] oldCode: [myDat objectForKey: @"oldCode"] keyRecord: [myDat objectForKey: @"keyRecord"] keyData: [myDat objectForKey: @"keyData"]]; } } -(void) addCodeDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSMutableArray *myLocalRecs; id myRec; NSEnumerator *locList; NSMutableString *oldCode; NSMutableString *newData; oldCode = [NSMutableString string]; if(recodeFlag == 0) //this is addcode { if([markedList count]) { if(returnCode == 1) { //Something there? if([lgNewCodeName isEqualToString: @""] == YES) return; //is it a new definition? if(lgNewCodeMode == CODEMODENEW) [gWorkBench newCode: lgNewCodeName definition: lgNewCodeDef color: lgNewCodeColor]; //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationFwdComp context: nil]; //go through and call the main docuement locList = [myLocalRecs reverseObjectEnumerator]; while(myRec = [locList nextObject]) { if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; [[[myRec objectForKey: @"_doc"] filePointer] addCode: lgNewCodeName from: [[myRec objectForKey:@"_begin_loc"] intValue] to: [[myRec objectForKey:@"_end_loc"] intValue] from: self withDef: @""]; if([self global: @"simpleflag"]) { NSString *rstr; [oldCode setString: [myRec objectForKey: @"_code"]]; if([gPrefBoss guessUpdate] == NO) { rstr = [self processAddcodeWithOldCode: oldCode newCode: lgNewCodeName onRecord: [myRec objectForKey: @"_data"] range: NSMakeRange(0, [[myRec objectForKey: @"_data"] length])]; [myRec setObject: rstr forKey: @"_data"]; } else { NSMutableDictionary *mynots = [NSMutableDictionary dictionary]; [mynots setObject: self forKey: @"origin"]; [mynots setObject: [[lgNewCodeName copy] autorelease] forKey: @"newCode"]; [mynots setObject: @"a" forKey: @"type"]; [mynots setObject: [[oldCode copy] autorelease] forKey: @"oldCode"]; [mynots setObject: myRec forKey: @"keyRecord"]; [mynots setObject: [myRec objectForKey: @"_data"] forKey: @"keyData"]; [[NSNotificationCenter defaultCenter] postNotificationName: @"TAMSResultDidChange" object: gWorkBench userInfo: mynots]; /*[self adjustAllToAddcodeWithNewCode: lgNewCodeName oldCode: oldCode keyRecord: myRec];*/ } } } if([gPrefBoss cancelAfterAddCode] == 1) [self doUnmarkAll: nil]; //have it reload if([gPrefBoss autoReloadValue]) [self refreshResults: self]; [self displaySelData]; } } else { } } else if (recodeFlag == 1) { if([markedList count]) { if(returnCode == 1) { //is there something there? if([lgNewCodeName isEqualToString: @""] == YES) return; //refresh? if(lgNewCodeMode == CODEMODENEW) [gWorkBench newCode: lgNewCodeName definition: lgNewCodeDef color: lgNewCodeColor]; //copy records myLocalRecs = [[NSMutableArray alloc] init]; [myLocalRecs setArray: markedList]; //reverse sort [myLocalRecs sortUsingFunction: locationComp context: nil]; //go through and call the main docuement locList = [markedList reverseObjectEnumerator]; while(myRec = [locList nextObject]) { if([(MWFile *)[myRec objectForKey: @"_doc"] open] == NO) [gWorkBench openMWFile: [myRec objectForKey: @"_doc"] type: SOURCETYPE]; [[[myRec objectForKey: @"_doc"] filePointer] recode: lgNewCodeName first: [[myRec objectForKey:@"_begin_loc"] intValue] last: [[myRec objectForKey:@"_end_loc"] intValue] from: self withDef: @""]; [oldCode setString: [myRec objectForKey: @"_code"]]; /* This is too crude, but is the start of refreshing the actual data, what would need to happen is have tce or some such object translate this*/ { NSString *rstr; if([gPrefBoss guessUpdate] == NO) { [myRec setObject: [[lgNewCodeName copy] autorelease] forKey: @"_code"]; rstr = [self processRecodeWithOldCode: oldCode newCode: lgNewCodeName onRecord: [myRec objectForKey: @"_data"] range: NSMakeRange(0, [[myRec objectForKey: @"_data"] length])]; [myRec setObject: rstr forKey: @"_data"]; } else { NSMutableDictionary *mynots = [NSMutableDictionary dictionary]; [mynots setObject: self forKey: @"origin"]; [mynots setObject: [[lgNewCodeName copy]autorelease] forKey: @"newCode"]; [mynots setObject: @"r" forKey: @"type"]; [mynots setObject: [[oldCode copy] autorelease] forKey: @"oldCode"]; [mynots setObject: myRec forKey: @"keyRecord"]; [mynots setObject: [[[myRec objectForKey: @"_data"] copy] autorelease] forKey: @"keyData"]; /*[self adjustAllToRecodeWithNewCode: lgNewCodeName oldCode: oldCode keyRecord: myRec];*/ [[NSNotificationCenter defaultCenter] postNotificationName: @"TAMSResultDidChange" object: gWorkBench userInfo: mynots]; } } } //have it reload if([gPrefBoss cancelAfterRecode] == 1) [self doUnmarkAll: nil]; if([gPrefBoss autoReloadValue]) [self refreshResults: self]; [self displaySelData]; } } else { } } } -(IBAction) doAddCode: (id) sender { NSArray *clist; NSWindow *who; if(![markedList count]) return; //delete the menu items if([addCodeName numberOfItems]) [addCodeName removeAllItems]; //get a fresh list //add new //[addCodeName addItemWithTitle: @"New"]; //build up the menu clist = [gWorkBench getHotCodeList]; [addCodeName addItemsWithTitles: clist]; [addCodeName selectItemAtIndex: 0]; recodeFlag = 0; [codePrompt setStringValue: @"Code to add:"]; [newCodeName setStringValue: @""]; [newCodeDef setString: @""]; [codeColorMenu selectItemAtIndex: [codeColorMenu indexOfItemWithTag: inheritedColor]]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: addCodeWindow modalForWindow: who modalDelegate: self didEndSelector: @selector(addCodeDidEnd:returnCode:contextInfo:) contextInfo: nil]; //return if nothing there //copy the records //reverse sort them //go through and call the main document //have it add a code } -(BOOL) isMarked: (int) row { if([markedList indexOfObject: [myData objectAtIndex: row]] == NSNotFound) return NO; else return YES; } -(BOOL) isMarkedRecord: (id) theRecord { if([markedList indexOfObject: theRecord] == NSNotFound) return NO; else return YES; } -(void) printShowingPrintPanel: (BOOL) flag //-(IBAction) printDocument: (id) sender //-(IBAction) print: (id) Sender { NSPrintInfo *printInfo = [self printInfo]; NSPrintOperation *printOp; [printInfo setOrientation: NSLandscapeOrientation]; [printInfo setHorizontalPagination: NSFitPagination]; printOp = [NSPrintOperation printOperationWithView: theResults printInfo: printInfo]; [printOp setShowPanels: YES];//flag]; [printOp runOperation]; } - (NSString *)windowNibName { // Implement this to return a nib to load OR implement -makeWindowControllers to manually create your controllers. return @"myPanedResults"; } -(NSMutableArray *) arrayFromSubset: (NSArray *) who { int n; NSMutableArray *newArr = [[NSMutableArray alloc] init]; FORALL(who) { if((n = [backData indexOfObject: temp]) != NSNotFound) { [newArr addObject: [NSString stringWithFormat: @"%d", n]]; } } ENDFORALL; return newArr; } - (NSData *)dataRepresentationOfType:(NSString *)type { // Implement to provide a persistent data representation of your document OR remove this and implement the file-wrapper or file path based save methods. NSMutableData *dd; int first; int ab; int cnt; MWFile *theDPtr; NSMutableArray *nameList, *fixedDataArray, *rootArray, *nKeys; NSMutableDictionary *nSets; unichar newLineChar; dd = [[NSMutableData alloc] init]; if([type isEqualToString: @"TAMS Result"]) { rootArray = [[NSMutableArray alloc] init]; if(gWorkBench) { ab = [gWorkBench absPath]; } else ab = ABSPATHMODE; //1. save the version [rootArray addObject: @"9"]; FORALL(fileList) { if([temp hasFile] == NO) { NSWARNING(@"Cannot save in TAMS format until all source files have been saved."); return nil; } } ENDFORALL; //2. save the globals [rootArray addObject: [myGlobals getGlobals]]; //3. save the file list nameList = [[NSMutableArray alloc] init]; FORALL(fileList) { [nameList addObject: [[(MWFile *) temp name] copy]]; } ENDFORALL; [rootArray addObject: nameList]; //4. save the data fixedDataArray = [[NSMutableArray alloc] init]; FORALL(backData) { NSMutableDictionary *what; MWFile *myObj; what = [[NSMutableDictionary alloc] init]; [what addEntriesFromDictionary: temp]; myObj = [temp objectForKey: @"_doc"]; [what setObject: [[myObj name] copy] forKey: @"_doc"]; [fixedDataArray addObject: what]; } ENDFORALL; [rootArray addObject: fixedDataArray]; //5. save the visible data [rootArray addObject: [self arrayFromSubset: myData]]; //6. save the named sets nSets = [[NSMutableDictionary alloc] init]; nKeys = [namedSelDict allKeys]; FORALL(nKeys) { [nSets setObject: [self arrayFromSubset: [namedSelDict objectForKey: temp]] forKey: temp]; } ENDFORALL; [rootArray addObject: nSets]; //7. the limit string if(limitString) [rootArray addObject: limitString]; else [rootArray addObject: @""]; //8. the list of columns [rootArray addObject: colList]; //9. the current string [rootArray addObject: [[limitField stringValue] copy]]; //10. save the coder [rootArray addObject: [codersString copy]]; //11. save autosets [rootArray addObject: [self autoSets]]; //12. save the selected row [rootArray addObject: [NSNumber numberWithInt: [theResults selectedRow]]]; //13. save marked list [rootArray addObject: [self arrayFromSubset: markedList]]; //14. save summary reports [rootArray addObject: summReports]; //15. save date string [rootArray addObject: [dfString copy]]; [rootArray addObject: [NSNumber numberWithInt: dfIndex]]; //16. save auto history [rootArray addObject: autoHistory]; [rootArray addObject: [[autoHistoryStart copy] autorelease]]; dd = [NSArchiver archivedDataWithRootObject: rootArray]; return dd; } #ifdef HIER if([type isEqualToString: @"HierFormat1"] == YES) { //make an array unichar retChar; NSMutableArray aaa = [[NSMutableArray alloc] init]; NSMutableString sss = [[NSMutableString alloc] init]; if([gPrefBoss macNLValue]) { retchar = '\n'; newLineChar = '\r'; } else { retchar = '\r'; newLineChar = '\n'; } if([myData count] == 0) {[dd release]; [aaa release]; return nil;} [aaa addObjectsFromArray: myData]; //sort it [aaa sortUsingFunction: stringComp context: @"_code"]; //set the first tag [sss setString: [[myData objectAtIndex: 0] objectForKey @"_code"]]; //print the head of the tree DATASTRING(dd, limitString); DATACHAR(dd, newLineChar); //print the first tag DATATAB(dd); DATASTRING(dd, sss); //loop til end of array FORALL(aaa) { NSMutableString *thisTag = [[NSMutableString alloc] init]; //set this tag [thisTag setString: [temp objectForKey: @"_code"]]; //if this tag is != to last tag if([thisTag isEqualToString: sss] == NO) { //print new tag DATATAB(dd); DATASTRING(dd, thisTag); [sss setString: thisTag]; } //print the data DATATAB(dd);DATATAB(dd); DATASTRING(dd, [temp objectForKey: @"_data"]); //add all the extra stuff DATACHAR(dd, '['); DATASTRING(dd, thisTab); DATACHAR(dd, ']'); //and a return DATACHAR(dd, newLineChar); } } else #endif #ifdef XML ; if([type isEqualToString: @"XML"] == YES) { DATASTRING(dd,@""); DATANL(dd); DATASTRING(dd,@""); DATANL(dd); cnt = 0; FORALL(myData) { id key; id ans; NSEnumerator *ns; NSMutableString *sss=[[NSMutableString alloc] init]; // DATASTRING(dd, [[NSNumber numberWithInt: cnt] stringValue]); cnt++; ns = [colList objectEnumerator]; DATATAB(dd); DATASTRING(dd, @"");DATANL(dd); while(key = [ns nextObject]) { ans = [temp objectForKey: key]; //if([ans length] == 0) continue; DATATAB(dd); DATATAB(dd); if([key isEqualToString: @"_begin_loc"] == YES) { DATASTRING(dd, @"<");DATASTRING(dd, key); DATASTRING(dd, @">"); DATASTRING(dd, ans); DATASTRING(dd, @"");DATANL(dd); DATATAB(dd); DATATAB(dd); DATASTRING(dd, @"<_end_loc>"); DATASTRING(dd, [temp objectForKey: @"_end_loc"]); DATASTRING(dd, @"");DATANL(dd); //do the document stuff here } else if([key isEqualToString: @"_line_number"] == YES) { DATASTRING(dd, @"<");DATASTRING(dd, key); DATASTRING(dd, @">"); DATASTRING(dd, ans); DATASTRING(dd, @"");DATANL(dd); } else if([key isEqualToString: @"_doc"] == YES) { theDPtr = [temp objectForKey: @"_doc"]; DATATAB(dd); DATATAB(dd); DATASTRING(dd, @"<_document>"); if([gWorkBench mwFileExists: (MWFile*)theDPtr] == YES) { if([theDPtr hasFile] == YES) DATASTRING(dd, [theDPtr path]); else DATASTRING(dd, [theDPtr name]); } else { DATASTRING(dd,@"???"); } DATASTRING(dd, @"");DATANL(dd); } else { [sss setString: ans]; if([sss length] > 0) [sss replaceOccurrencesOfString: @">" withString: @":" options: NSCaseInsensitiveSearch range: NSMakeRange(0, [sss length])]; DATASTRING(dd, @"<");DATASTRING(dd, key); DATASTRING(dd, @">"); if([key isEqualToString: @"_data"] == YES) { //this just inserts the line number and an escaped tab if appropriate NSNumber * what; what = [temp objectForKey: @"_line_number"]; if(what != nil) { if([what intValue] > 0 && [gPrefBoss TAScanForLN] == 1) { DATASTRING(dd, what); DATASTRING(dd, @"\\t"); } } } DATASTRING(dd, sss); DATASTRING(dd, @"");DATANL(dd); } } [sss release]; DATATAB(dd); DATASTRING(dd, @"");DATANL(dd); } ENDFORALL; DATASTRING(dd,@""); DATANL(dd); } else #endif //This is text { if([gPrefBoss macNLValue]) newLineChar = '\r'; else newLineChar = '\n'; first = 1; cnt = 1; if([myData count] == 0) {[dd release]; return nil;} //write the headers if([self global: @"headerflag"]) { DATACHAR(dd, '#'); FORALL(colList) { DATACHAR(dd,'\t'); DATASTRING(dd, temp); } ENDFORALL; DATATAB(dd); DATASTRING(dd, @"_end_loc"); DATACHAR(dd, newLineChar); } FORALL(myData) { id key; id ans; NSEnumerator *ns; DATASTRING(dd, [[NSNumber numberWithInt: cnt] stringValue]); cnt++; ns = [colList objectEnumerator]; while(key = [ns nextObject]) { DATATAB(dd); ans = [temp objectForKey: key]; if([key isEqualToString: @"_data"] == YES) { //this just inserts the line number and an escaped tab if appropriate NSNumber * what; what = [temp objectForKey: @"_line_number"]; if(what != nil) { if([what intValue] > 0 && [gPrefBoss TAScanForLN] == 1) { DATASTRING(dd, what); DATASTRING(dd, @"\\t"); } } } if([key isEqualToString: @"_begin_loc"] == YES) { DATASTRING(dd, ans /*[ans stringValue] */); DATATAB(dd); DATASTRING(dd, [temp objectForKey: @"_end_loc"] ); //do the document stuff here } else if( [key isEqualToString: @"_line_number"] == YES) { DATASTRING(dd, ans /*[ans stringValue]*/); } else if([key isEqualToString: @"_doc"] == YES) { theDPtr = [temp objectForKey: @"_doc"]; if([gWorkBench mwFileExists: (MWFile *)theDPtr] == YES) { if([(MWFile *) theDPtr hasFile] == YES) { DATASTRING(dd, [theDPtr path]); } else { DATASTRING(dd, [theDPtr name]); } } else { DATASTRING(dd,@"???"); } } else { DATASTRING(dd, ans); } } DATACHAR(dd, newLineChar);; } ENDFORALL; } //[myWindow setDocumentEdited: NO]; //[self updateChangeCount: NSChangeCleared]; [dd retain]; return dd; } /* - (void)document:(NSDocument *)doc didSave:(BOOL)didSave contextInfo:(void *)contextInfo { if(didSave == YES) { [myWindow setDocumentEdited: NO]; [self updateChangeCount: NSChangeCleared]; [self autorelease]; } } */ -(IBAction) niceClose: (id) Sender { [myWindow performClose: self]; } -(void) setTitleFromFile { if([[self getMWFile] hasFile]) { [myWindow setTitle: [[self getMWFile] name]]; } } -(void) willClose { // [self saveDocumentWithDelegate: self didSaveSelector: // @selector(document:didSave:contextInfo:) contextInfo:(void *)nil]; if(gWorkBench) { if([self fileName]) { [[self getMWFile] setOpenFile: self]; [[self getMWFile] setHasFile: YES]; } else { [[self getMWFile] setOpen: NO]; [[self getMWFile] setHasFile: NO]; } } if(gWorkBench){ if([[self getMWFile] hasFile] == NO) { [[self getMWFile] setOpen: NO]; [gWorkBench unregisterResult: [self getMWFile]]; gWorkBench = nil; //should release it as well } else { [[self getMWFile] setOpen: NO]; } } else [[self getMWFile] setOpen: NO]; //[self disconnect]; [[NSNotificationCenter defaultCenter] removeObserver: self name: @"TAMSResultDidChange" object: nil ]; ; } - (void)windowWillClose:(NSNotification *)aNotification { #if CLOSEBUG #else [self willClose]; #endif } -(void)handleAnEOF: (MWFile *) mf { NSString *ss; if([self global: @"sectionsearch"] && ([gWorkBench isInitFile: mf] == YES)) { [[tce ctRunVault] removeAllObjects]; } if([self global: @"eofIsEndFlag"] && ([gWorkBench isInitFile: mf] == NO)) [self handleEnd: NO flush: NO]; if(mf) ss = [NSString stringWithFormat: @"%@ has unterminated coded passages", [mf name]]; else ss = [NSString stringWithString: @"There are unterminated coded passages"]; [tce ctDelAllZones]; if([self global: @"zapuniversal"]) //([gPrefBoss zapUnivValue]) { int i, n; NSArray *who; who = [univVault allKeys]; n = [who count]; for(i = 0; i < n; i++) { [univVault setObject: @"" forKey: [who objectAtIndex: i]]; } } FORALL([tce ctRunVault]) { if([temp openRun]) { [tce ctCloseAllOpenRuns]; if([self global: @"sectionsearch"] == YES && [gWorkBench isInitFile: mf] == YES) ; //don't do anything else NSWARNING(ss);//@"There are unterminated coded passages"); break; } } ENDFORALL; /* NSWARNING(ss); //NSWARNING(@"You have unterminated coded passages"); [self handleEnd: NO flush: YES]; */ } -(void)handleEachEOF: (NSNotification *)anote { NSString *ss; if([self global: @"sectionsearch"] && ([gWorkBench isInitFile: [anote object]] == YES)) { [[tce ctRunVault] removeAllObjects]; } if([self global: @"eofIsEndFlag"] && ([gWorkBench isInitFile: [anote object]] == NO)) [self handleEnd: NO flush: NO]; if([anote object]) ss = [NSString stringWithFormat: @"%@ has unterminated coded passages", [[anote object] name]]; else ss = [NSString stringWithString: @"There are unterminated coded passages"]; [tce ctDelAllZones]; if([self global: @"zapuniversal"]) //([gPrefBoss zapUnivValue]) { int i, n; NSArray *who; who = [univVault allKeys]; n = [who count]; for(i = 0; i < n; i++) { [univVault setObject: @"" forKey: [who objectAtIndex: i]]; } } FORALL([tce ctRunVault]) { if([temp openRun]) { [tce ctCloseAllOpenRuns]; if([self global: @"sectionsearch"] == YES && [gWorkBench isInitFile: [anote object]] == YES) ; //don't do anything else NSWARNING(ss);//@"There are unterminated coded passages"); break; } } ENDFORALL; /* NSWARNING(ss); //NSWARNING(@"You have unterminated coded passages"); [self handleEnd: NO flush: YES]; */ } -(id) subsetFromArray: (NSArray *) who { NSMutableArray *aa = [[NSMutableArray alloc] init]; FORALL(who) { id testValue; testValue = [backData objectAtIndex: [temp intValue]]; [aa addObject: [backData objectAtIndex: [temp intValue]]]; }ENDFORALL; return aa; } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)type { // Implement to load a persistent data representation of your document OR remove this and implement the file-wrapper or file path based load methods. NSArray *rootArray; if([type isEqualToString: @"TAMS Result"]) { rootArray = [NSUnarchiver unarchiveObjectWithData: data]; mySavedData = data; [mySavedData retain]; } return YES; } -(void) loadSavedData { { NSArray *rootArray; NSMutableArray *dataArray; NSMutableDictionary *theDict; NSArray *theSetNames, *fl; int selRow; NSDictionary *theSavedNS; // BOOL apm; // NSMutableString *wbPath = [[NSMutableString alloc] init]; if(!gWorkBench) { NSWARNING(@"Cannot open file directly. Must open through a workbench/project"); return; } rootArray = [NSUnarchiver unarchiveObjectWithData: mySavedData]; if([[rootArray objectAtIndex: 0] isEqualToString: @"2.0a"] ||[ [rootArray objectAtIndex: 0] intValue] >= 3) { //2. save the globals [myGlobals setGlobals: [rootArray objectAtIndex: 1]]; //need to load the flag values //3. save the file list; have to convert to absolute paths fl = [rootArray objectAtIndex: 2]; FORALL(fl) { if(![gWorkBench fileForName: temp]) { NSString *msg1 = [NSString stringWithFormat:@"Cannot continue. Missing source file \"%@\" for this result.", temp]; NSWARNING(msg1); return; } else [fileList addObject: [gWorkBench fileForName: temp]]; } ENDFORALL; //4. save the data dataArray = [rootArray objectAtIndex: 3]; FORALL(dataArray) { theDict = [[NSMutableDictionary alloc] initWithDictionary: temp]; [theDict setObject: [gWorkBench fileForName: [temp objectForKey: @"_doc"]] forKey: @"_doc"]; [backData addObject: theDict]; } ENDFORALL; //5. save the visible data [myData addObjectsFromArray: [self subsetFromArray: [rootArray objectAtIndex: 4]]]; //6. save the named sets //get the dictionary theSavedNS = [rootArray objectAtIndex: 5]; //get the keys theSetNames = [theSavedNS allKeys]; //work through them FORALL(theSetNames) { [namedSelDict setObject: [self subsetFromArray: [theSavedNS objectForKey: temp]] forKey: temp]; } ENDFORALL; //if([theSetNames count]) [self renewNamedSelMenu]; //7. get the limit string if(!limitString) limitString = [[NSMutableString alloc] init]; [limitString setString: [rootArray objectAtIndex: 6]]; //8. get colList [colList addObjectsFromArray: [rootArray objectAtIndex: 7]]; //[myWindow setTitle: [[[self getMWFile] path] lastPathComponent]]; //9. [limitField setStringValue: [rootArray objectAtIndex: 8]]; //10. get the Coder's list if([[rootArray objectAtIndex: 0] intValue] >= 3) [codersString setString: [rootArray objectAtIndex: 9]]; //11. get the automatic sets if([[rootArray objectAtIndex: 0] intValue] >= 4) { [autoSets addEntriesFromDictionary: [rootArray objectAtIndex: 10]]; } [self rebuildAutoSetMenu]; //12. get the selected row if([[rootArray objectAtIndex: 0] intValue] >= 5) { selRow = [[rootArray objectAtIndex: 11] intValue]; [self markBackArray: [rootArray objectAtIndex: 12]]; } //13. summary reports if([[rootArray objectAtIndex: 0] intValue] >= 6) { [summReports addEntriesFromDictionary: [rootArray objectAtIndex: 13]]; [self rebuildSummReportMenu]; } if([[rootArray objectAtIndex: 0] intValue] >= 7) { [dfString setString: [rootArray objectAtIndex: 14]]; dfIndex = [[rootArray objectAtIndex: 15] intValue]; } if([[rootArray objectAtIndex: 0] intValue] >= 8) { [autoHistory addObjectsFromArray: [rootArray objectAtIndex: 16]]; } if([[rootArray objectAtIndex: 0] intValue] >= 9) { [autoHistoryStart setString: [rootArray objectAtIndex: 17]]; } [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleResultsDidChange:) name: @"TAMSResultDidChange" object: gWorkBench]; FORALL(fileList) { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleDirtySourceFlag:) name: @"TAMSDocDidChange" object: temp]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(addCodeHandler:) name: @"TAMSDocAddedCode" object: temp]; }ENDFORALL; [self setupTables]; [dirtySourceFlag setState: NSOnState]; UPDATERECCOUNT; [self updateChangeCount: NSChangeCleared]; [self rebuildSummReportMenu]; [theResults reloadData]; if(selRow >= 0) { [theResults selectRow: selRow byExtendingSelection: NO]; [theResults scrollRowToVisible: selRow]; } } } } -(BOOL) windowShouldClose: (NSNotification *)aNotification { #if CLOSEBUG [self willClose]; #endif return YES; } - (void)windowControllerDidLoadNib:(NSWindowController *)windowController { [super windowControllerDidLoadNib: windowController]; [self rebuildSummReportMenu]; ;// [self executeTAMS]; } -(void) executeTAMS { //get the data if(!tce ) return; [self rebuildAutoSetMenu]; //only secure place to put it [self rebuildSummReportMenu]; if([tce gCurrentDataSource] != nil) { dataSource = [tce gCurrentDataSource]; //[[myWindow windowController] setShouldCloseDocument: YES]; //[self resetStorage]; //need to zero out the arrays, send inits to all the processes //ctInitRV(); //[tce initLimit]; [self clearTable]; [self setGlobal: @"firstwriteflag" to: 1]; [self setGlobal: @"rawflag" to: [dataSource rawF]]; [self setGlobal: @"emptyflag" to: [dataSource emptyF]]; [self setGlobal: @"exactflag" to: [dataSource exactF]]; [self setGlobal: @"simpleflag" to: [dataSource simpleF]]; [self setGlobal: @"regexcharflag" to: [dataSource regexCharF]]; [self setGlobal: @"nonregexcharflag" to: [dataSource nonRegexCharF]]; [self setGlobal: @"sectionsearch" to: [dataSource sectionF]]; [self setGlobal: @"raw1stflag" to: [dataSource rawF]]; [self setGlobal: @"empty1stflag" to: [dataSource emptyF]]; [self setGlobal: @"exact1stflag" to: [dataSource exactF]]; [self setGlobal: @"simple1stflag" to: [dataSource simpleF]]; [self setGlobal: @"section1stflag" to: [dataSource sectionF]]; [self setGlobal: @"regexchar1stflag" to: [dataSource regexCharF]]; [self setGlobal: @"nonregexchar1stflag" to: [dataSource nonRegexCharF]]; if([gPrefBoss countSectionsValue]) SETGLOBAL(@"emptysectionflag", 1); else SETGLOBAL(@"emptysectionflag",0); //[myWindow setReleasedWhenClosed: YES]; [fileList removeAllObjects]; [colList removeAllObjects]; [codersString setString: [dataSource codersList]]; [self buildCoderList]; //get the search if(limitString != nil) [limitString release]; limitString = [[NSMutableString alloc] init]; [limitString setString: [dataSource theLimitString]]; [fileList addObjectsFromArray: [tce hotFileList]]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleResultsDidChange:) name: @"TAMSResultDidChange" object: gWorkBench]; FORALL(fileList) { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleDirtySourceFlag:) name: @"TAMSDocDidChange" object: temp]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(addCodeHandler:) name: @"TAMSDocAddedCode" object: temp]; }ENDFORALL; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleEachEOF:) name: @"TAMSFileHasEnded" object: nil]; [self setOriginalStateString]; if([limitString length]) { /* if([self global: @"sectionsearch"] == 1) { [limitField setStringValue: [NSString stringWithFormat: @"Section: %@", limitString]]; } else [limitField setStringValue: limitString]; */ [self setGlobal: @"limitflag" to: 1]; [tce handlelimit: limitString]; [self doTamsSearch: limitString]; [tce ctCloseAllOpenRuns]; if([[tce ctRunVault] count]) [self handleEnd: NO flush: NO]; } else { /* if([self global: @"sectionsearch"] == 1) { [limitField setStringValue: [NSString stringWithFormat: @"Section: unlimited", limitString]]; } else [limitField setStringValue: @"Unlimited"]; */ [self setGlobal: @"limitflag" to: 0]; [self doTamsSearch: nil]; [tce ctCloseAllOpenRuns]; if([[tce ctRunVault] count]) [self handleEnd: NO flush: NO]; } [tce setGCurrentTAMS: nil]; //do the search //do the tables //reload [self setupTables]; [myWindow makeKeyAndOrderFront: self]; [backData removeAllObjects]; [backData addObjectsFromArray: myData]; [self updateChangeCount: NSChangeDone]; UPDATERECCOUNT; [theResults reloadData]; [[NSNotificationCenter defaultCenter] removeObserver:self name: @"TAMSFileHasEnded" object: nil]; } [tce release]; } #ifdef SECTIONSEARCH -(NSMutableDictionary *) token2Dictionary: (ctQChar *) qq { NSALLOC(NSMutableDictionary, myD); [myD setObject: [[[qq buff] copy] autorelease] forKey: @"code"]; [myD setObject: [[[qq coder] copy] autorelease] forKey: @"coder"]; [myD setObject: @"Open" forKey: @"state"]; return [myD autorelease]; } -(void) removeCloseTags: (NSMutableArray *) aa { int i, n; NSMutableDictionary *tt; n = [aa count]; for(i = n - 1; i >= 0; i--) { tt = [aa objectAtIndex: i]; if([[tt objectForKey: @"state"] isEqualToString: @"Closed"]) [aa removeObject: tt]; } } -(void) addTokenForChar: (ctQChar *) qq forSection: (coderec *) ms { NSMutableArray *aa = [ms sectionCodes]; FORALL(aa) { if([[temp objectForKey: @"code"] isEqualToString: [qq buff]] && [[temp objectForKey: @"coder"] isEqualToString: [qq coder]]) { if([[temp objectForKey: @"state"] isEqualTo: @"Closed"]) { [temp setObject: @"Open" forKey: @"state"]; return; } } } ENDFORALL; [aa addObject: [self token2Dictionary: qq]]; } -(void) closeTokenForChar: (ctQChar *) qq forSection: (coderec *) ms { NSMutableArray *aa = [ms sectionCodes]; FORALL(aa) { if([[temp objectForKey: @"code"] isEqualToString: [qq buff]] && [[temp objectForKey: @"coder"] isEqualToString: [qq coder]]) { [temp setObject: @"Close" forKey: @"Closed"]; } } ENDFORALL; } #endif - (void) doTamsSearch: (NSString *) aLimString { int nn; ctQChar *qq; #ifdef REGEXSEARCH AGRegex *regex; AGRegexMatch *match; NSArray *fl; int rsi, rsj, rsk, rsnn3, rsnn, rsnn2; int charZoom; unsigned opt; long rsln; NSRange rsr, rsr2, rsr3; #endif #ifdef SECTIONSEARCH coderec *mySect; mySect = nil; #endif #ifdef REGEXSEARCH #endif qq = [[ctQChar alloc] init]; nn = [self global: @"simpleflag"]; //setup(); [tce setGCurrentTAMS: self]; #ifdef REGEXSEARCH charZoom = [gPrefBoss zoomFactorValue]; if([self global: @"nonregexcharflag"]) { fl = [tce hotFileList]; [colList addObject: @"_code"]; [colList addObject: @"_data"]; [colList addObject: @"_begin_loc"]; [colList addObject: @"_doc"]; opt = 0; if([self global: @"exactflag"] == 0) opt = NSCaseInsensitiveSearch; rsnn = [fl count]; for(rsi = 0 ; rsi < rsnn; rsi++) { MWFile *rsFile; NSString *rsString; fl = [tce hotFileList]; rsFile = [fl objectAtIndex: rsi]; rsString = [rsFile string]; rsln = [rsString length]; rsnn2 = 1; rsr3 = NSMakeRange(0, rsln - 1); while(rsnn2) { rsr = [rsString rangeOfString: limitString options: opt range: rsr3]; if(rsr.location != NSNotFound) { NSALLOC(NSMutableDictionary,theRec); rsr2 = rsr; if(charZoom > rsr2.location) { rsr2.length += charZoom; rsr2.location = 0; } else { rsr2.length += charZoom; rsr2.location -= charZoom; } rsr2.length += charZoom; if(rsr2.location + rsr2.length >= rsln) rsr2.length = rsln - rsr2.location; [theRec setObject: rsFile forKey: @"_doc"]; [theRec setObject: [[limitString copy] autorelease] forKey: @"_code"]; [theRec setObject: [rsString substringWithRange: rsr2] forKey: @"_data"]; /*[theRec setObject: [[[match groupAtIndex: rsk] copy] autorelease] forKey: @"_data"];*/ [theRec setObject: [[NSNumber numberWithLong: rsr.location] stringValue] forKey: @"_begin_loc"]; [theRec setObject: [[NSNumber numberWithLong: rsr.location + rsr.length] stringValue] forKey: @"_end_loc"]; rsr3.location = rsr.location + rsr.length; rsr3.length = rsln - rsr3.location; [myData addObject: theRec]; } else rsnn2 = 0; } } return; } #define OLDREGEXSEARCHCODE #ifdef XXXXX if([self global: @"regexcharflag1"]) { opt = 0; if([self global: @"exactflag"] == 0) opt = AGRegexCaseInsensitive; regex = [[AGRegex alloc] initWithPattern: limitString options: opt]; fl = [tce hotFileList]; [colList addObject: @"_code"]; [colList addObject: @"_data"]; [colList addObject: @"_begin_loc"]; [colList addObject: @"_doc"]; rsnn = [fl count]; for(rsi = 0 ; rsi < rsnn; rsi++) { MWFile *rsFile; NSString *rsString; fl = [tce hotFileList]; rsFile = [fl objectAtIndex: rsi]; rsString = [rsFile string]; rsln = [rsString length]; fl = [regex findAllInString: rsString]; rsnn2 = [fl count]; for(rsj = 0; rsj < rsnn2; rsj++) { match = [fl objectAtIndex: rsj]; rsnn3 = [match count]; for(rsk = 0; rsk < rsnn3; rsk++) { NSALLOC(NSMutableDictionary,theRec); rsr2 = rsr = [match rangeAtIndex: rsk]; if(charZoom > rsr2.location) { rsr2.length += charZoom; rsr2.location = 0; } else { rsr2.length += charZoom; rsr2.location -= charZoom; } rsr2.length += charZoom; if(rsr2.location + rsr2.length >= rsln) rsr2.length = rsln - rsr2.location; [theRec setObject: rsFile forKey: @"_doc"]; [theRec setObject: [[limitString copy] autorelease] forKey: @"_code"]; [theRec setObject: [rsString substringWithRange: rsr2] forKey: @"_data"]; /*[theRec setObject: [[[match groupAtIndex: rsk] copy] autorelease] forKey: @"_data"];*/ [theRec setObject: [[NSNumber numberWithLong: rsr.location] stringValue] forKey: @"_begin_loc"]; [theRec setObject: [[NSNumber numberWithLong: rsr.location + rsr.length] stringValue] forKey: @"_end_loc"]; [myData addObject: theRec]; } } } [regex release]; return; } #endif XXXXX #define NEWREGEXSEARCHCODE if([self global: @"regexcharflag"]) { NSRange tr; opt = 0; if([self global: @"exactflag"] == 0) opt = AGRegexCaseInsensitive; //regex = [[AGRegex alloc] initWithPattern: limitString options: opt]; fl = [tce hotFileList]; [colList addObject: @"_code"]; [colList addObject: @"_data"]; [colList addObject: @"_begin_loc"]; [colList addObject: @"_doc"]; rsnn = [fl count]; for(rsi = 0 ; rsi < rsnn; rsi++) { MWFile *rsFile; NSString *rsString; fl = [tce hotFileList]; rsFile = [fl objectAtIndex: rsi]; rsString = [rsFile string]; rsln = [rsString length]; tr = NSMakeRange(0,0); for(;;) { //fl = [regex findAllInString: rsString]; rsr = rsr2 = [rsString findString: limitString selectedRange: tr options:opt wrap:NO regex: YES multiline: YES]; if(rsr.location == NSNotFound) break; { NSALLOC(NSMutableDictionary,theRec); if(charZoom > rsr2.location) { rsr2.length += charZoom; rsr2.location = 0; } else { rsr2.length += charZoom; rsr2.location -= charZoom; } rsr2.length += charZoom; if(rsr2.location + rsr2.length >= rsln) rsr2.length = rsln - rsr2.location; [theRec setObject: rsFile forKey: @"_doc"]; [theRec setObject: [[limitString copy] autorelease] forKey: @"_code"]; [theRec setObject: [rsString substringWithRange: rsr2] forKey: @"_data"]; /*[theRec setObject: [[[match groupAtIndex: rsk] copy] autorelease] forKey: @"_data"];*/ [theRec setObject: [[NSNumber numberWithLong: rsr.location] stringValue] forKey: @"_begin_loc"]; [theRec setObject: [[NSNumber numberWithLong: rsr.location + rsr.length] stringValue] forKey: @"_end_loc"]; [myData addObject: theRec]; } tr.location = rsr.location + rsr.length; tr.length = 0; } } } [regex release]; return; } #endif #ifdef SCANCODE while([tce scanNext: qq] != ENDOFALLFILES) #else while([tce readnext: qq] != EOF) #endif { #ifdef SECTIONSEARCH if([self global: @"sectionsearch"]) { //we need to add the open dictionary if([tce hasSectionRun] == NO) { [tce ctOpenSectionRun]; } switch([qq tokentype]) { case TOKEN: if([self isRepeat: [qq buff]] && [self isInnerRepeat: [qq buff]] && innerRFlag) [self handleEnd: YES flush: NO]; else innerRFlag = 1; if([tce hasSectionRun] == NO) { [tce ctOpenSectionRun]; } if([self isRepeat: [qq buff]] == YES) [tce ctOpenRun: qq]; [tce ctAddSectionTag: [self token2Dictionary:qq]]; [tce ctAddOpenChar: qq]; break; break; case ENDTOKEN: if([tce hasSectionRun] == NO) { [tce ctOpenSectionRun]; } [tce ctAddOpenChar: qq]; [tce ctCloseSectionTagForCode: [qq buff] Coder: [qq coder]]; [tce ctCloseRun: qq]; break; case CHAR: if([tce hasSectionRun] == NO) { [tce ctOpenSectionRun]; } [tce ctAddOpenChar: qq]; break; case META: [self handlemeta: qq]; break; if([tce hasSectionRun] == NO) { mySect = [tce ctOpenSectionRun]; } break; }; continue; } #endif // regular simple and non-simple searches if(/*![self global: @"limitflag"] || */[self global: @"simpleflag"]) { switch([qq tokentype]) { case TOKEN: if([self isRepeat: [qq buff]] && [self isInnerRepeat: [qq buff]] && innerRFlag) [self handleEnd: YES flush: NO]; else innerRFlag = 1; if([self global: @"simpleflag"] && aLimString) { //aCode = [[ctLimitCrit alloc] initWithString: aLimString]; //if(isStringTrue(aCode, [qq buff]) || [self isRepeat: [qq buff]]) if([tce isTagTrue: qq] || [self isRepeat: [qq buff]]) { [tce ctOpenRun: qq]; } } else [tce ctOpenRun: qq]; [tce ctAddZone: qq]; if([self global: @"rawflag"]) [tce ctAddOpenChar: qq]; break; case ENDTOKEN: [tce ctCloseRun: qq]; [tce ctDelZone: qq ]; if([self global: @"rawflag"]) [tce ctAddOpenChar: qq]; break; case CHAR: [tce ctAddOpenChar: qq]; break; case META: [self handlemeta: qq]; break; case ENDOFFILE: [self handleAnEOF: [qq source]]; break; }; } //here is the limit logic else if(/*[self global: @"limitflag"] && */ ![self global: @"simpleflag"]) { int zoneFlag; if([qq tokentype] == ENDOFFILE) { [self handleAnEOF: [qq source]]; continue; } if([qq tokentype] == TOKEN) { if([self isRepeat: [qq buff]] && [self isInnerRepeat: [qq buff]] && innerRFlag) [self handleEnd: YES flush: NO]; else innerRFlag = 1; } zoneFlag = [tce handleLimChar: qq]; if(zoneFlag == STARTLIM) { //if([self isRepeat: [qq buff]]) continue; [tce ctOpenLimRun: qq]; } else if (zoneFlag == ENDLIM) [tce ctCloseLimRun: qq]; else if (zoneFlag == INLIM) [tce ctAddLimChar:qq]; } } if([self global: @"eofIsEndFlag"]) //if([gPrefBoss EOFIsEndValue]) [self handleEnd: NO flush: NO]; [tce checkZones]; } - (void)savePanelDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { if(returnCode == NSCancelButton) return; if(returnCode == NSOKButton) { [self writeToFile:[[NSSavePanel savePanel] filename] ofType: @"DocumentType"]; } } -(NSMutableArray *) convertString: (NSString *) theString onChar: (unichar) breakChar { int i, len; unichar c; NSMutableString *ss = [[NSMutableString alloc] init]; NSMutableArray *ans = [[NSMutableArray alloc] init]; len = [theString length]; [ss setString: @""]; for(i = 0; i < len; i++) { c = [theString characterAtIndex: i]; if(c == ' ') { ; } else if (c == breakChar) { if([ss length] > 0) { [ans addObject: [ss copy]]; [ss setString: @""]; } } else { [ss ADDCHAR(c)]; } } if([ss length]) { [ans addObject: [ss copy]]; } return ans; } -(void) addToList: (NSMutableArray *) aList usingString: (NSString *) aString { NSMutableArray *ans; int i,n; ans = [self convertString: aString onChar: ',']; //ans = convertStringToArray(aString, ','); //[ans retain]; n = [ans count]; for(i = 0; i < n; i++) { if(arrayContainsString(aList , [ans objectAtIndex: i]) == NO) [aList addObject: [ans objectAtIndex: i]]; } //[aList addObjectsFromArray: ans]; } -(BOOL)isHotCoder: (NSMutableDictionary *) rec { if([codersList count] == 0) return YES; FORALL(codersList) { if([temp isEqualToString: @"*"] == YES) { if([[rec objectForKey: @"_coder"] isEqualToString: @""] == YES) return YES; } else if([temp isEqualToString: [rec objectForKey: @"_coder"]] == YES) return YES; } ENDFORALL; return NO; } -(void) doContWithDict: (NSMutableDictionary *) theVault { int iii, nnn, ii, nn; NSMutableDictionary *contList, *contValue; NSArray *myKeyArray, *myContArray; myKeyArray = [theVault allKeys]; nnn = [myKeyArray count]; for(iii = 0; iii < nnn; iii++) { //work through //look up the repeat variabl if((contList = [repCont objectForKey: [myKeyArray objectAtIndex: iii]]) != nil) { //get the contingency contValue = [contList objectForKey: [theVault objectForKey: [myKeyArray objectAtIndex: iii]]]; if(contValue != nil) { myContArray = [contValue allKeys]; //set for each nn = [myContArray count]; for(ii = 0; ii < nn; ii++) { //if it's a repeat if([self isRepeat: [myContArray objectAtIndex: ii]] || [self isUniversal: [myContArray objectAtIndex: ii]] ) { [theVault setObject: [contValue objectForKey: [myContArray objectAtIndex: ii]] forKey: [myContArray objectAtIndex: ii]]; } } } else //zap the contingent variables { } } } } int sectionTotCnt = 0; -(void) handleEnd: (BOOL) section flush: (BOOL) flushFlag { NSEnumerator *myenums ; coderec *mykey; NSString *ss, *st; NSMutableArray *doneList; int n; int realcnt; int fflag; fflag = 1; //first time through the emptys realcnt = 0; n= 0; if([self global: @"emptyflag"]) n = 1; if(section == YES && MYGLOBAL(@"emptysectionflag") == NO && [self global: @"sectionsearch"]) return; //we're not done if([self global: @"sectionsearch"]) { /* being here means that the section has ended, since this is called for !end*/ [tce ctCloseSectionRun]; /* filter results */ [tce filterSectionRuns]; } //|| (section == YES && [self global: @"emptysectionflag"]) //first handle all of the repeats //need to make this conditional on emptyflag /* if([self global: @"emptyflag"]) [repVault removeAllObjects]; */ //set the repeats FORALL([tce ctRunVault]) { st = [temp theName]; //for debugging //if([self isRepeat: [temp theName]]) if([temp runType] == REPEATRUN) { if(ss = [temp record]) { [repVault setObject: [ss copy] forKey: [temp theName]]; } else [repVault setObject: @"" forKey: [temp theName]]; } } ENDFORALL; [self doContWithDict: repVault]; if([self global: @"firstwriteflag"]) { //[colList addObject: @"#"]; FORALL(univList) { [colList addObject: temp]; } ENDFORALL; FORALL(repList) { [colList addObject: temp]; } ENDFORALL; [colList addObject: @"_code"]; [colList addObject: @"_data"]; [colList addObject: @"_comment"]; [colList addObject: @"_coder"]; [colList addObject: @"_doc"]; if([tce hasLineNumbers] && [gPrefBoss TAScanForLN]) [colList addObject: @"_line_number"]; [colList addObject: @"_begin_loc"]; [self setGlobal: @"firstwriteflag" to: 0]; sectionTotCnt = 0; } myenums = [[tce ctRunVault] objectEnumerator]; while(mykey = [myenums nextObject]) { NSMutableDictionary *myrec; //if([mykey openRun] == YES) continue; if([self isRepeat: [mykey theName]] == YES) continue; //if it isn't in our approved coder list nix it //if([self isValidCoder: [mykey theCoder]] == NO) // continue; //we're not a repeat so this one counts //make a dictionary of myrec = [[NSMutableDictionary alloc] init]; // the univerals FORALL(univList) { [myrec setObject: [univVault objectForKey: temp] forKey: temp]; } ENDFORALL; //the repeats FORALL(repList) { NSString *tt; if(tt = [repVault objectForKey: temp]) [myrec setObject: tt forKey: temp]; else [myrec setObject: @"" forKey: temp]; } ENDFORALL; //This is where we need to add handling for cross code stuff if([mykey hasInfo] == YES && [mykey openRun] ==NO) { if([mykey runType] != SECTIONRUN) [myrec setDictionary: [mykey affiliatedInfo]]; } //ask if it has cross code //use that instead //if it is open and doesn't have one give it one //otherwise //the code [myrec setObject: [[mykey theName] copy] forKey: @"_code"]; //the comment [myrec setObject: [[mykey comment] copy] forKey: @"_comment"]; //the comment [myrec setObject: [[mykey theCoder] copy] forKey: @"_coder"]; //the document [myrec setObject: [mykey doc] forKey: @"_doc"]; //the index [myrec setObject: [[NSNumber numberWithLong: [mykey beginLoc]] stringValue] forKey: @"_begin_loc"]; [myrec setObject: [[NSNumber numberWithLong: [mykey endLoc]] stringValue] forKey: @"_end_loc"]; if([tce hasLineNumbers] && [gPrefBoss TAScanForLN]) [myrec setObject: [[NSNumber numberWithInt: [mykey lineStart]] stringValue] forKey: @"_line_number"]; //the data [myrec setObject: [[mykey record] copy] forKey: @"_data"]; if( [mykey hasInfo] == NO && [mykey openRun] == YES && ![self global: @"backloadrepeatflag"]) { if([mykey runType] != SECTIONRUN) [mykey setAffiliatedInfo: myrec]; if([self isHotCoder: myrec] == YES) realcnt++; } else if([mykey openRun] == NO) { if([self isHotCoder: myrec] == YES) { [myData addObject: myrec]; realcnt++; } } } sectionTotCnt += realcnt; // empty flag case if(((section == NO) || (section == YES && MYGLOBAL(@"emptysectionflag"))) && n && sectionTotCnt == 0) { NSMutableDictionary *myrec; myrec = [[NSMutableDictionary alloc] init]; // the univerals FORALL(univList) { [myrec setObject: [univVault objectForKey: temp] forKey: temp]; } ENDFORALL; //the repeats FORALL(repList) { NSString *tt; if(tt = [repVault objectForKey: temp]) { [myrec setObject: tt forKey: temp]; } else [myrec setObject: @"" forKey: temp]; } ENDFORALL; //the code [myrec setObject: @"*EMPTY*" forKey: @"_code"]; //the data [myrec setObject: @"" forKey: @"_data"]; //the comment [myrec setObject: @"" forKey: @"_comment"]; //the document //the index if([[tce ctRunVault] count]) { mykey = [[tce ctRunVault] objectAtIndex: 0]; [myrec setObject: [[NSNumber numberWithLong: [mykey beginLoc]] stringValue] forKey: @"_begin_loc"]; [myrec setObject: [[NSNumber numberWithLong: [mykey endLoc]] stringValue] forKey: @"_end_loc"]; [myrec setObject: [mykey doc] forKey: @"_doc"]; } else { int tl; MWFile *www; [myrec setObject:( [NSNumber numberWithLong: tl = [tce getCharLocation]]) forKey: @"_begin_loc"]; [myrec setObject:([NSNumber numberWithLong: tl = [tce getCharLocation]]) forKey: @"_end_loc"]; [myrec setObject: www=[tce hotSearchDocument] forKey: @"_doc"]; tl = 0; #ifdef rightCode int tl; MWFile *www; [myrec setObject:( tl = [NSNumber numberWithLong: [tce getCharLocation]]) forKey: @"_begin_loc"]; [myrec setObject:( tl = [NSNumber numberWithLong: [tce getCharLocation]]) forKey: @"_end_loc"]; [myrec setObject: www=[tce hotSearchDocument] forKey: @"_doc"]; tl = 0; #endif } [myData addObject: myrec]; } // empty the data source //[ctRunVault removeAllObjects]; doneList = [[NSMutableArray alloc] init]; FORALL([tce ctRunVault]) { if([temp openRun] == NO) [doneList addObject: temp]; else if([self global: @"rawflag"]) [temp addString: @"{!end}"]; } ENDFORALL; FORALL(doneList) { [[tce ctRunVault] removeObject: temp]; } ENDFORALL; [doneList removeAllObjects]; [doneList release]; //if clean remove the repeats if(MYGLOBAL(@"cleanflag") && (section == NO)) { [repVault removeAllObjects]; } if(section == NO || MYGLOBAL(@"emptysectionflag") == 1) sectionTotCnt = 0; } /* This creates basically a tree structure using nsdictionaries. the first is a dictionary of repeat values and it returns a dictionary of possible values which returns a dictionary of contingent variables which returns a dictionary of their values */ #define IFVER2 -(void) handleIf: (NSString *) cList { AGRegex *myExpr, *myExpr2; AGRegexMatch *myMatch; NSArray *myMatch2; NSMutableDictionary *theBase, *tb2; //first look for the regex #ifdef IFVER1 myExpr = [[AGRegex alloc] initWithPattern: @"([a-zA-Z0-9\\_]+)[\\t\\ \\n\\r]*=[\\t\\ \\n\\r]*\\\"(.*)\\\"[\\t\\ \\n\\r]*=>[\\t\\ \\n\\r]*([a-zA-Z0-9\\_]+)[\\t\\ \\n\\r]*=[\\t\\ \\n\\r]*\\\"(.*)\\\""]; #endif #ifdef IFVER2 myExpr = [[AGRegex alloc] initWithPattern: @"^[\\t\\ \\n\\r]*([a-zA-Z0-9\\_]+)[\\t\\ \\n\\r]*=[\\t\\ \\n\\r]*\\\"([^\\\"]*)\\\"[\\t\\ \\n\\r]*=>"]; myExpr2 = [[AGRegex alloc] initWithPattern: @"=>[\\t\\ \\n\\r]*([a-zA-Z0-9\\_]+)[\\t\\ \\n\\r]*=[\\t\\ \\n\\r]*\\\"([^\\\"]*)\\\""]; #endif myMatch = [myExpr findInString: cList]; if( [myMatch count]) { theBase = [repCont objectForKey: [myMatch groupAtIndex: 1]]; #ifdef IFVER2 myMatch2 = [myExpr2 findAllInString: cList]; #endif if(theBase != nil) { if((tb2 = [theBase objectForKey: [myMatch groupAtIndex: 2]]) != nil) { #ifdef IFVER2 int n2, i2; n2 = [myMatch2 count]; for(i2 = 0; i2 < n2; i2++) { [tb2 setObject: [[myMatch2 objectAtIndex: i2] groupAtIndex: 2] forKey: [[myMatch2 objectAtIndex: i2] groupAtIndex: 1]]; } #endif #ifdef IFVER1 [tb2 setObject: [myMatch groupAtIndex: 4] forKey: [myMatch groupAtIndex: 3]]; #endif } else { int n2, i2; //tb2 = [[NSMutableDictionary alloc] init]; tb2 = [NSMutableDictionary dictionary]; #ifdef IFVER2 n2 = [myMatch2 count]; for(i2 = 0; i2 < n2; i2++) { [tb2 setObject: [[myMatch2 objectAtIndex: i2] groupAtIndex: 2] forKey: [[myMatch2 objectAtIndex: i2] groupAtIndex: 1]]; } #endif #ifdef IFVER1 [tb2 setObject: [myMatch groupAtIndex: 4] forKey: [myMatch groupAtIndex: 3]]; #endif [theBase setObject: tb2 forKey: [myMatch groupAtIndex: 2]]; } } else { theBase = [NSMutableDictionary dictionary];//[[NSMutableDictionary alloc] init]; tb2 = [NSMutableDictionary dictionary];// [[NSMutableDictionary alloc] init]; #ifdef IFVER1 [tb2 setObject: [myMatch groupAtIndex: 4] forKey: [myMatch groupAtIndex: 3]]; #endif #ifdef IFVER2 { int n2, i2; n2 = [myMatch2 count]; for(i2 = 0; i2 < n2; i2++) { [tb2 setObject: [[myMatch2 objectAtIndex: i2] groupAtIndex: 2] forKey: [[myMatch2 objectAtIndex: i2] groupAtIndex: 1]]; } } #endif [theBase setObject: tb2 forKey: [myMatch groupAtIndex: 2]]; [repCont setObject: theBase forKey: [myMatch groupAtIndex: 1]]; } } //apply changes to any universals [self doContWithDict: univVault]; } -(void) handleSetRepeat: (NSString *) namelist { NSMutableArray *myUList; int n; NSMutableString *s1, *s2, *s3; NSMutableArray *oneUVar; NSEnumerator *myen; s1 = [[NSMutableString alloc] init]; s2 = [[NSMutableString alloc] init]; myUList = convertStringToArray(namelist, ','); myen = [myUList objectEnumerator]; n = [myUList count]; [s1 setString: @""]; [s2 setString: @""]; while(s3 = [myen nextObject]) { oneUVar = convertStringToArray(s3, '='); if([oneUVar count] == 2) { [s1 setString: [oneUVar objectAtIndex: 0]]; trimNSS(s1); [s2 setString: [oneUVar objectAtIndex: 1]]; trimNSS(s2); //add to both the list and the dictionary trimNSS(s2); trimCharNSS(s2,'\"'); if(arrayContainsString(repList, s1) == NO) [repList addObject: [s1 copy]]; if([self isRepeat: s1] && [self isInnerRepeat: s1]) [self handleEnd: YES flush: NO]; [repVault setObject: [[s2 copy] autorelease] forKey: [[s1 copy] autorelease]]; [s1 setString: @""]; [s2 setString: @""]; } } //apply contingencies [self doContWithDict: repVault]; } -(void) handleUniversal: (NSString *) namelist { NSMutableArray *myUList; int n; NSMutableString *s1, *s2, *s3; NSMutableArray *oneUVar; NSEnumerator *myen; s1 = [[NSMutableString alloc] init]; s2 = [[NSMutableString alloc] init]; myUList = convertStringToArray(namelist, ','); myen = [myUList objectEnumerator]; n = [myUList count]; [s1 setString: @""]; [s2 setString: @""]; while(s3 = [myen nextObject]) { oneUVar = convertStringToArray(s3, '='); if([oneUVar count] == 2) { [s1 setString: [oneUVar objectAtIndex: 0]]; trimNSS(s1); [s2 setString: [oneUVar objectAtIndex: 1]]; trimNSS(s2); //add to both the list and the dictionary trimNSS(s2); trimCharNSS(s2,'\"'); if(arrayContainsString(univList, s1) == NO) [univList addObject: [s1 copy]]; [univVault setObject: [[s2 copy] autorelease] forKey: [[s1 copy] autorelease]]; [s1 setString: @""]; [s2 setString: @""]; } } //apply contingencies [self doContWithDict: univVault]; } /* switchboard for the meta commands */ -(void) handlemeta: (ctQChar *) myc { int i; NSMutableString *buff; buff = [[NSMutableString alloc] init]; /* trim the data */ if([[myc extra] length]) { i = 0; while([[myc extra] characterAtIndex: i] == ' ') { i++; if(i >= [[myc extra] length]) break; } [buff setString: [[myc extra] substringFromIndex: i]]; } else [buff setString: @""]; ON(@"end") { [self handleEnd: NO flush: NO]; innerRFlag = 0; } else ON(@"backloadrepeat") SETGLOBAL(@"backloadrepeatflag", 1); else ON(@"frontloadrepeat") SETGLOBAL(@"backloadrepeatflag", 0); else ON(@"endsection") [self handleEnd: YES flush: NO]; else ON(@"repeat") [self addToList: repList usingString: buff]; else ON(@"block") [self addToList: blockList usingString: buff]; else ON(@"universal") [self handleUniversal: buff]; else ON(@"setrepeat") [self handleSetRepeat: buff]; else ON(@"name") { if([self isUniversal: @"FileName"] == NO) [univList addObject: @"FileName"]; [univVault setObject: trimCharNSS(trimNSS(buff), '\"') forKey: @"FileName"]; } else ON(@"zapuniversal") SETGLOBAL(@"zapuniversal", 1); else ON(@"sectionsearch") SETGLOBAL(@"sectionsearch", 1); else ON(@"nozapuniversal") SETGLOBAL(@"zapuniversal", 0); else ON(@"nopar") SETGLOBAL(@"noparflag ", 0); else ON(@"par") SETGLOBAL(@"noparflag", 0); else ON(@"empty") SETGLOBAL(@"emptyflag", 0); else ON(@"noempty") SETGLOBAL(@"emptyflag", 0); else ON(@"emptysection") SETGLOBAL(@"emptysectionflag",1); else ON(@"noemptysection") SETGLOBAL(@"emptysectionflag",0); else ON(@"if") {[self handleIf: buff];} else ON(@"escapeon") SETGLOBAL(@"escapeflag", 1); else ON(@"escapeoff") SETGLOBAL(@"escapeflag", 0); else ON(@"start") SETGLOBAL(@"startflag", 1); else ON(@"stop") SETGLOBAL(@"startflag", 0); //else ON(@"zap") // handlezap(); else ON(@"clean") { SETGLOBAL(@"cleanflag", 1); [repVault removeAllObjects]; } else ON(@"dirty") SETGLOBAL(@"cleanflag", 0); else ON(@"tab") SETGLOBAL(@"tabflag", 1); else ON(@"notab") SETGLOBAL(@"tabflag", 0); else ON(@"eofisend") SETGLOBAL(@"eofIsEndFlag", 1); else ON(@"eofisnotend") SETGLOBAL(@"eofIsEndFlag", 0); else ON(@"inner") {[self setInnerRepeat: buff];} else ON(@"limit") { SETGLOBAL(@"limitflag", 0); if(limitString == nil) { limitString = [[NSMutableString alloc] init]; } [limitString setString: buff]; } //else ON(@"zero") // handlezero(); //else ON(@"zerozero") // zeromark = 0L; else ON(@"header") {SETGLOBAL(@"headerflag", 1); SETGLOBAL(@"firstwriteflag", 0);} else ON(@"noheader") {SETGLOBAL(@"headerflag", 0); SETGLOBAL(@"firstwriteflag", 0);} else ON(@"quote") SETGLOBAL(@"quoteflag", 1); else ON(@"noquote") SETGLOBAL(@"quoteflag", 0); else ON(@"exact") SETGLOBAL(@"exactflag", 1); else ON(@"notexact") SETGLOBAL(@"exactflag", 0); else ON(@"raw") SETGLOBAL(@"rawflag", 1); else ON(@"notraw") SETGLOBAL(@"rawflag", 0); else ON(@"append") [fmode setString: @"a"]; else ON(@"notappend") [fmode setString: @"w"]; //else ON(@"conname") handlecon(buff.val()); //else ON(@"datname") handledat(buff.val()); //else ON(@"macnl") setnewline(MACNL); //else ON(@"unixnl") setnewline(UNIXNL); else ON(@"noblank") SETGLOBAL(@"blankflag", 0); else ON(@"blank") SETGLOBAL(@"blankflag", 1); else ON(@"paranum") SETGLOBAL(@"lineflag", 0); else ON(@"noparanum") SETGLOBAL(@"lineflag", 0); else ON(@"recnum") SETGLOBAL(@"lnumflag", 1); else ON(@"norecnum") SETGLOBAL(@"lnumflag", 0); else ON(@"dummy") ; else ; } -(NSMutableString *) limString { if(limitString) return limitString; else return @""; } -(IBAction) sortUp: (id) Sender { //get the column int n; int tt; NSMutableDictionary *ssi; int myType; id key; n = [theResults selectedColumn]; if(n > 0) { key = [[[theResults tableColumns] objectAtIndex: n] identifier]; tt = [Sender tag]; if(tt < 10) //not within { [sortStack removeAllObjects]; myType = tt; } else myType = tt - 10; // ssi = [[MWSortStackItem alloc] initWithID: key direction: YES type: myType dateFormat: dfString codeLevel: aCodeLevel]; ssi = [NSMutableDictionary dictionary]; [ssi setObject: [[key copy] autorelease] forKey: @"col"]; [ssi setObject: [[dfString copy] autorelease] forKey: @"dateFormat"]; [ssi setObject: [NSNumber numberWithBool: YES] forKey: @"up"]; [ssi setObject: [NSNumber numberWithInt: myType] forKey: @"type"]; [ssi setObject: [NSNumber numberWithInt: aCodeLevel] forKey: @"codeLevel"]; // [ssi autorelease]; [sortStack addObject: ssi]; [myData sortUsingFunction: stackComp context: sortStack]; [theResults reloadData]; MAKEDIRTY; } else NSWARNING(@"No data column selected"); } -(void) sortData: (NSMutableArray *) who withStack: (NSArray *) stack { NSMutableArray *a = [[NSMutableArray alloc] init]; FORALL(stack) { [a addObject: temp]; [who sortUsingFunction: stackComp context: a]; } ENDFORALL; [a release]; } -(NSMutableArray *) sortStackCopy { return [[sortStack copy] autorelease]; } -(IBAction) sortDown: (id) Sender { //get the column int n; int tt; NSMutableDictionary *ssi; int myType; id key; n = [theResults selectedColumn]; if(n > 0) { key = [[[theResults tableColumns] objectAtIndex: n] identifier]; tt = [Sender tag]; if(tt < 10) //not within { [sortStack removeAllObjects]; myType = tt; } else myType = tt - 10; //ssi = [[MWSortStackItem alloc] initWithID: key direction: NO type: myType dateFormat: dfString codeLevel: aCodeLevel]; //[ssi autorelease]; ssi = [NSMutableDictionary dictionary]; [ssi setObject: [[key copy] autorelease] forKey: @"col"]; [ssi setObject: [[dfString copy] autorelease] forKey: @"dateFormat"]; [ssi setObject: [NSNumber numberWithBool: NO] forKey: @"up"]; [ssi setObject: [NSNumber numberWithInt: myType] forKey: @"type"]; [ssi setObject: [NSNumber numberWithInt: aCodeLevel] forKey: @"codeLevel"]; [sortStack addObject: ssi]; [myData sortUsingFunction: stackComp context: sortStack]; [theResults reloadData]; MAKEDIRTY; } else NSWARNING (@"No data column selected"); } -(IBAction) sortColumn: (id) Sender { //get the column int n; id key; n = [theResults selectedColumn]; if(n > 0) { key = [[[theResults tableColumns] objectAtIndex: n] identifier]; //sort if([key isEqualToString: @"_begin_loc"] == YES) [myData sortUsingFunction: longFwdComp context: key]; else [myData sortUsingFunction: stringComp context: key]; } UPDATERECCOUNT; [theResults reloadData]; } -(void) dateFmtDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == 1) { int dtag = [[dateFormatMenu selectedItem] tag]; dfIndex = dtag; if(dtag == 99) { [dfString setString: [dateFormatOther stringValue]]; } else { [dfString setString: dateFmt[dtag]]; } MAKEDIRTY; } } -(IBAction) okSetDateFmt: (id) Sender { [dateFormatSheet orderOut: Sender]; [NSApp endSheet: dateFormatSheet returnCode: 1]; } -(IBAction) cancelSetDateFmt: (id) Sender { [dateFormatSheet orderOut: Sender]; [NSApp endSheet: dateFormatSheet returnCode: 0]; } -(IBAction) doSetDateFmt: (id) Sender { NSWindow *who; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; if(dfIndex < 0) [dateFormatMenu selectItemAtIndex: 0]; else if( dfIndex < 99) { [dateFormatMenu selectItemWithTag: dfIndex]; [dateFormatOther setStringValue: @""]; } else { [dateFormatMenu selectItemWithTag: dfIndex]; [dateFormatOther setStringValue: dfString]; } [NSApp beginSheet: dateFormatSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(dateFmtDidEnd:returnCode:contextInfo:) contextInfo: nil]; } /*--------------------- Selected Records ----------------*/ -(NSMutableArray*) handleStep: (NSMutableDictionary *) who onArray: (NSMutableArray *) ss { NSMutableArray *ans = [NSMutableArray array]; if([[who objectForKey: @"stepType"] isEqualToString: @"sel"] == YES) { switch( [[who objectForKey: @"mode"] intValue]) { case SELECTREVERSE: case SELECTADDITIONAL: [ans setArray: ss]; [self handleSelect: [[who objectForKey: @"mode"] intValue] selectType: [[who objectForKey: @"type"] intValue] withString: [who objectForKey: @"searchValue"] withCol: [who objectForKey: @"col"] floatV: [[who objectForKey: @"float"] intValue] regexV: [[who objectForKey: @"regex"] intValue] startArray: backData endArray: ans]; break; default: [self handleSelect: [[who objectForKey: @"mode"] intValue] selectType: [[who objectForKey: @"type"] intValue] withString: [who objectForKey: @"searchValue"] withCol: [who objectForKey: @"col"] floatV: [[who objectForKey: @"float"] intValue] regexV: [[who objectForKey: @"regex"] intValue] startArray: ss endArray: ans]; break; }; } else { [self handleSet: [[who objectForKey: @"op"] intValue] withSet: [self getAutoSetWithName: [who objectForKey: @"obj"]] startArray: ss endArray: ans]; } return ans; } -(NSMutableArray*) getSetWithName: (NSString*) who { NSMutableArray *aa; aa = [namedSelDict objectForKey: who]; if(aa == nil) return [self getAutoSetWithName: who]; else return [NSMutableArray arrayWithArray: aa]; } -(NSMutableArray*) getAutoSetWithName: (NSString *) who { NSMutableArray *ans = [NSMutableArray array]; NSMutableDictionary *myMac; NSMutableArray *myProg; NSMutableArray *sData, *s2, *s1; NSArray *ss; sData = [[NSMutableArray alloc] init]; myMac = [self autoSetForName: who]; myProg = [myMac objectForKey: @"program"]; ss = [myMac objectForKey: @"sort"]; if([[myMac objectForKey: @"start"] isEqualToString: @"All"] == YES) [sData addObjectsFromArray: backData]; else if([[myMac objectForKey: @"start"] isEqualToString: @"Visible"] == YES) [sData addObjectsFromArray: myData]; else [sData addObjectsFromArray: [self getAutoSetWithName: [myMac objectForKey: @"start"]]]; s2 = sData; if(ss != nil) [self sortData: sData withStack: ss]; if(myProg) { FORALL(myProg) { s1 = [self handleStep: temp onArray: s2]; s2 = s1; //keep sending it back in } ENDFORALL; } [ans addObjectsFromArray: s2]; [sData release]; return ans; } -(void) handleSet: (int) opType withSet: (NSArray *) mm startArray: (NSMutableArray*) a1 endArray: (NSMutableArray*) a2 { int i,n; NSMutableArray *final = [[NSMutableArray alloc] init]; { //get subset //mm = [namedSelDict objectForKey: [[setMathSetMenu selectedItem] title]]; //opType = [[setMathOpMenu selectedItem] tag]; switch (opType) { case 1: //intersect with FORALL(mm) { if([a1 indexOfObject: temp] == NSNotFound) { } else [final addObject: temp]; } ENDFORALL; [a2 addObjectsFromArray: final]; break; case 2: //union FORALL(mm) { if([a1 indexOfObject: temp] == NSNotFound) { [final addObject: temp]; } } ENDFORALL; [a2 addObjectsFromArray: final]; break; case 3: //Don't intersect with n = [mm count]; for(i = 0; i < n; i++) { [a1 removeObject: [mm objectAtIndex: i]]; } break; case 4: //not in union with n = [backData count]; for(i = 0; i < n; i++) { if([a1 containsObject: [backData objectAtIndex: i]] == YES || [mm containsObject: [backData objectAtIndex: i]] == YES) { } else { [a1 addObject: [backData objectAtIndex: i]]; } } [a2 addObjectsFromArray: final]; break; case 5: // XOR n = [mm count]; for(i = 0; i < n ; i++) { [a2 addObjectsFromArray: a1]; if([a2 containsObject: [mm objectAtIndex: i]] == YES) { [a2 removeObject: [mm objectAtIndex: i]]; } else { [a2 addObject: [mm objectAtIndex: i]]; } } break; }; [final release]; } } -(void) handleSelect: (int) selectMode selectType: (int) st withString: (NSString *) compValue withCol: (NSString *) colName floatV: (int) fp regexV: (int) rf startArray: (NSMutableArray*) a1 endArray: (NSMutableArray*) a2 { NSMutableArray *findList, *findFromList; NSRange a; AGRegex *myRegex; AGRegexMatch *myRegexMatch; NSString *fString; int n, i, cres, frflag; findList = [[NSMutableArray alloc] init]; findFromList = [[NSMutableArray alloc] init]; if(selectMode == SELECTREVERSE) { [findList setArray: a1]; [findList removeObjectsInArray: a2]; [a2 setArray: findList]; [findList release]; [findFromList release]; return; } [findFromList addObjectsFromArray: a1]; n = [findFromList count]; for(i =0; i < n; i++) { if([@"_doc" isEqualToString: colName ] == YES) { fString = [(MWFile *)[[findFromList objectAtIndex: i] objectForKey: colName] name]; } else fString = [[findFromList objectAtIndex: i] objectForKey: colName]; switch(st) { case SELALPHA: if(rf) { myRegex = [[AGRegex alloc] initWithPattern: compValue options: AGRegexCaseInsensitive]; myRegexMatch = [myRegex findInString: fString]; if([myRegexMatch count]) { [findList addObject: [findFromList objectAtIndex: i]]; } [myRegex release]; //[myRegexMatch release]; } else { a = [fString rangeOfString: compValue options: NSCaseInsensitiveSearch]; if(a.location != NSNotFound) { [findList addObject: [findFromList objectAtIndex: i]]; } } break; case SELALPHACASE: if(rf) { myRegex = [[AGRegex alloc] initWithPattern: compValue]; myRegexMatch = [myRegex findInString: fString]; if([myRegexMatch count]) { [findList addObject: [findFromList objectAtIndex: i]]; } [myRegex release]; [myRegexMatch release]; } else { a = [fString rangeOfString: compValue ]; if(a.location != NSNotFound) { [findList addObject: [findFromList objectAtIndex: i]]; } } break; case SELEXACT: //no regex for this one { int ans; ans = [fString isEqualToString: compValue ]; if(ans == YES) { [findList addObject: [findFromList objectAtIndex: i]]; } } break; case SELEQUAL: if(fp) { if([fString doubleValue] == [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] == [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELGT: if(fp) { if([fString doubleValue] > [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] > [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELGTE: if(fp) { if([fString doubleValue] >= [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] >= [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELLT: if(fp) { if([fString doubleValue] < [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] < [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELLTE: if(fp) { if([fString doubleValue] <= [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] <= [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELBEFOREDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedAscending) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELAFTERDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedDescending) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELBEFOREEQDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedAscending || cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELAFTEREQDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedDescending || cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; default: ; } } if(selectMode == SELECTADDITIONAL) { n = [findList count]; if(n == 0) { NSWARNING(@"No records found"); frflag=0; } else { frflag = 1; for(i = 0; i [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] > [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELGTE: if(fp) { if([fString doubleValue] >= [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] >= [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELLT: if(fp) { if([fString doubleValue] < [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] < [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELLTE: if(fp) { if([fString doubleValue] <= [compValue doubleValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } } else if([fString intValue] <= [compValue intValue]) { [findList addObject: [findFromList objectAtIndex: i]]; } break; case SELDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELBEFOREDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedAscending) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELAFTERDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedDescending) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELBEFOREEQDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedAscending || cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; case SELAFTEREQDATE: cres = [(NSDate *) [NSCalendarDate dateWithString: fString calendarFormat: dfString] compare: [NSCalendarDate dateWithString: compValue calendarFormat: dfString]]; if(cres == NSOrderedDescending || cres == NSOrderedSame) [findList addObject: [findFromList objectAtIndex: i]]; break; default: ; } } if(selectMode == SELECTADDITIONAL) { n = [findList count]; if(n == 0) { NSWARNING(@"No records found"); frflag=0; } else { frflag = 1; for(i = 0; i= NAMEDSELBASE; i--) { [namedSelMenu removeItemAtIndex: i]; } theKeys = [NSMutableArray arrayWithArray: [namedSelDict allKeys]]; [theKeys sortUsingFunction: nsStringComp context: nil]; FORALL(theKeys) { NSMenuItem *mm; mm = [[NSMenuItem alloc] init]; [mm setTitle: temp]; [mm setAction: @selector(loadNamedSelection:)]; [namedSelMenu addItem: mm]; }ENDFORALL; } -(void) namedSelDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSMutableArray *mm; if(returnCode) { if([namedSelDict objectForKey: [namedSelField stringValue]] != nil) { NSWARNING(@"Name already exists; use unique name"); return; } mm = [[NSMutableArray alloc] init]; [mm addObjectsFromArray: myData]; [namedSelDict setObject: mm forKey: [namedSelField stringValue]]; [mm release]; [self rebuildAutoSetMenu]; //[self renewNamedSelMenu]; [self setStateString: [namedSelField stringValue]]; [self updateOnlyRecCount]; MAKEDIRTY; } } -(IBAction) cancelNamedSelection: (id) Sender { [namedSelSheet orderOut: Sender]; [NSApp endSheet: namedSelSheet returnCode: 0]; } -(IBAction) okNamedSelection: (id) Sender { if([self validSetName: [namedSelField stringValue]] == NO) { NSWARNING(@"You must use a unique set name"); return; } [namedSelSheet orderOut: Sender]; [NSApp endSheet: namedSelSheet returnCode: 1]; } -(IBAction) addNamedSelection: (id) Sender { NSWindow *who; [namedSelField setStringValue: @""]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: namedSelSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(namedSelDidEnd:returnCode:contextInfo:) contextInfo: nil]; } - (void) windowDidBecomeKey:(NSNotification *)aNotification { //[self renewNamedSelMenu]; [self rebuildAutoSetMenu]; [self rebuildSummReportMenu]; if(gWorkBench != nil) { if([gWorkBench reanalysisMode] == YES) { [[[NSApp delegate] reanalysisMenu] setState: NSOnState]; } else { [[[NSApp delegate] reanalysisMenu] setState: NSOffState]; } } [self displaySelData]; } /* ---------- Set Math with Named Sets ----------- */ -(void) setMathDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { NSArray *mm; NSString *sn; int opType, i,n; NSMutableArray *final = [[NSMutableArray alloc] init]; if(returnCode) { //get subset sn = [[setMathSetMenu selectedItem] title]; mm = [self getSetWithName: sn]; opType = [[setMathOpMenu selectedItem] tag]; //this block is for autohistory if([self isAutoSet: sn]) { NSMutableDictionary *ahd = [NSMutableDictionary dictionary]; [ahd setObject: @"set" forKey: @"stepType"]; [ahd setObject: [NSNumber numberWithInt: opType] forKey: @"op"]; [ahd setObject: [[sn copy] autorelease] forKey: @"obj"]; [autoHistory addObject: ahd]; } switch (opType) { case 1: //intersect with FORALL(mm) { if([myData indexOfObject: temp] == NSNotFound) { } else [final addObject: temp]; } ENDFORALL; [myData removeAllObjects]; [myData addObjectsFromArray: final]; break; case 2: //union FORALL(mm) { if([myData indexOfObject: temp] == NSNotFound) { [final addObject: temp]; } } ENDFORALL; [myData addObjectsFromArray: final]; break; case 3: //Don't intersect with n = [mm count]; for(i = 0; i < n; i++) { [myData removeObject: [mm objectAtIndex: i]]; } break; case 4: //not in union with n = [backData count]; for(i = 0; i < n; i++) { if([myData containsObject: [backData objectAtIndex: i]] == YES || [mm containsObject: [backData objectAtIndex: i]] == YES) { } else { [final addObject: [backData objectAtIndex: i]]; } } [myData removeAllObjects]; [myData addObjectsFromArray: final]; break; case 5: // XOR n = [mm count]; for(i = 0; i < n ; i++) { if([myData containsObject: [mm objectAtIndex: i]] == YES) { [myData removeObject: [mm objectAtIndex: i]]; } else { [myData addObject: [mm objectAtIndex: i]]; } } break; }; [final release]; UPDATERECCOUNT; [theResults reloadData]; [self addStateString: [NSString stringWithFormat: @"%@ w/ %@", [[setMathOpMenu selectedItem] title], [[setMathSetMenu selectedItem] title]]]; } } -(IBAction) cancelSetMath: (id) Sender { [setMathSheet orderOut: Sender]; [NSApp endSheet: setMathSheet returnCode: 0]; } -(IBAction) okSetMath: (id) Sender { [setMathSheet orderOut: Sender]; [NSApp endSheet: setMathSheet returnCode: 1]; } -(IBAction) doSetMath: (id) Sender { //Need to rebuild the named selections menu //are there any? NSMutableArray *namedSels; NSWindow *who; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; if([[self allSetNames] count] == 0) { NSWARNING(@"No named selections"); return; } [setMathOpMenu selectItemAtIndex: 0]; [setMathSetMenu removeAllItems]; namedSels = [NSMutableArray arrayWithArray: [self allSetNames]]; [namedSels sortUsingFunction: nsStringComp context: nil]; FORALL(namedSels) { [setMathSetMenu addItemWithTitle: temp]; } ENDFORALL; [namedSelField setStringValue: @""]; [NSApp beginSheet: setMathSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(setMathDidEnd:returnCode:contextInfo:) contextInfo: nil]; } /* find the record in the original file */ -(IBAction) fetchRow: (id) Sender { int row, b, e; NSMutableDictionary *aRec; MWFile *who; if(!gWorkBench) { NSWARNING(@"Project file has closed, cannot locate source files"); return; } //get the key numbers row = [theResults selectedRow]; //make a range aRec = [myData objectAtIndex: row]; b = [[aRec objectForKey: @"_begin_loc"] intValue]; e = [[aRec objectForKey: @"_end_loc"] intValue]; who = [aRec objectForKey: @"_doc"]; //call the window if([gWorkBench mwFileExists: who] == NO) { NSWARNING(@"Cannot find the source file."); } else { [gWorkBench openMWFile: who type: SOURCETYPE]; [[who filePointer] selectAndScrollRange: NSMakeRange(b, e-b) andMoveForward: YES]; } } -(IBAction) refreshResults: (id) Sender { int selRow; int tsim; //get the data FORALL(fileList) { if(FILEOPEN(temp) == NO) { NSWARNING(@"Cannot find one of the original source files."); return; } } ENDFORALL; //if(dataSource) { [self clearNamedSelMenu: nil]; tce = [[TAMSCharEngine alloc] initWithArrayAndStart: fileList]; selRow = [theResults selectedRow]; [self clearTable]; //do before the data goes away //clean my own lists [self initVariables]; //[myData removeAllObjects]; [myData autorelease]; myData = [[NSMutableArray alloc] init]; // [backData removeAllObjects]; [backData autorelease]; backData = [[NSMutableArray alloc] init]; [univList removeAllObjects]; [repList removeAllObjects]; [blockList removeAllObjects]; [colList removeAllObjects]; [markedList removeAllObjects]; [univVault removeAllObjects]; [repVault removeAllObjects]; [normVault removeAllObjects]; [sortStack removeAllObjects]; [repCont removeAllObjects]; [self buildCoderList]; if([gPrefBoss countSectionsValue]) SETGLOBAL(@"emptysectionflag", 1); else SETGLOBAL(@"emptysectionflag",0); tsim = [self global: @"simpleflag"]; SETGLOBAL(@"rawflag", [self global: @"raw1stflag"]); SETGLOBAL(@"simpleflag", [self global: @"simple1stflag"]); tsim = [self global: @"simpleflag"]; SETGLOBAL(@"exactflag", [self global: @"exact1stflag"]); SETGLOBAL(@"emptyflag", [self global: @"empty1stflag"]); SETGLOBAL(@"sectionsearch", [self global: @"section1stflag"]); [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleEachEOF:) name: @"TAMSFileHasEnded" object: nil]; tsim = [self global: @"simpleflag"]; //get the search /* all of this is now handlied when the object is init'd*/ //[limitString setString: [dataSource theLimitString]]; //clearSearchList(); //addArrayToSearchList(fileList); //startSearch(); if([limitString length]) { [self setGlobal: @"limitflag" to: 1]; [tce handlelimit: limitString]; tsim = [self global: @"simpleflag"]; [self doTamsSearch: limitString]; [tce ctCloseAllOpenRuns]; if([[tce ctRunVault] count]) [self handleEnd: NO flush: NO]; } else { [self setGlobal: @"limitflag" to: 0]; tsim = [self global: @"simpleflag"]; [self doTamsSearch: nil]; [tce ctCloseAllOpenRuns]; if([[tce ctRunVault] count]) [self handleEnd: NO flush: NO]; } //gCurrentTAMS = nil; //do the search //do the tables //reload [self setupTables]; [myWindow makeKeyAndOrderFront: self]; [backData removeAllObjects]; [backData addObjectsFromArray: myData]; UPDATERECCOUNT; [theResults reloadData]; [self setOriginalStateString]; [[NSNotificationCenter defaultCenter] removeObserver:self name: @"TAMSFileHasEnded" object: nil]; if([myData count] > 0) { [myWindow setDocumentEdited: YES]; [self updateChangeCount: NSChangeDone]; } if([theResults numberOfRows] > selRow ) [theResults selectRow: selRow byExtendingSelection: NO]; [dirtySourceFlag setState: NSOffState]; if(savedNamedSel) [self restoreNamedSel]; [tce release]; } } -(void) clearTable { NSArray *tc = [theResults tableColumns]; NSTableColumn *t; NSEnumerator *ten; ten = [tc objectEnumerator]; while(t = [ten nextObject]) [theResults removeTableColumn: t]; } -(void) setupTables { NSTableColumn *t; NSEnumerator *men; NSString *ss; //delete the existing columns //create the right number of columns with the right headers //send a refresh /* FORALL(tc) { [theResults removeTableColumn: temp]; } ENDFORALL; */ //create new ones if([myData count] == 0) return; //make the count stuff here t = [[NSTableColumn alloc] initWithIdentifier: @"#"]; [theResults addTableColumn: t]; [[t headerCell] setStringValue: @"#"]; // md = [myData objectAtIndex: 0]; men = [colList objectEnumerator]; while(ss = [men nextObject]) { //make column if([self isBlocked: ss]) continue; t = [[NSTableColumn alloc] initWithIdentifier: ss]; [theResults addTableColumn: t]; [[t headerCell] setStringValue: ss]; } // [theResults setTarget: self]; // [theResults setAction: @selector(displaySelData)]; [theResults setAllowsColumnReordering: YES]; } - (int)numberOfRowsInTableView:(NSTableView *)aTableView { return [myData count]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { NSMutableString *numStr; NSString *ss = [aTableColumn identifier]; NSDictionary *dd; if([ss isEqualToString: @"#"] == YES) { numStr = [[NSMutableString alloc] init]; [numStr setString: [[NSNumber numberWithInt: rowIndex + 1] stringValue]]; if([self isMarked: rowIndex] == YES) [numStr appendString: @"+"]; [numStr autorelease]; return numStr; } else if([ss isEqualToString: @"_doc"] == YES) { dd =[myData objectAtIndex: rowIndex]; return [(MWFile *)[dd objectForKey: @"_doc"] name]; } else { dd =[myData objectAtIndex: rowIndex]; return [dd objectForKey: ss]; } } -(void) setDataSource: (NSString *) theData{} -(BOOL)tableView: (NSTableView *) aTable shouldEditTableColumn: (NSTableColumn *) aCol row: (unsigned) arow { return NO; } - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { [self displaySelData]; } - (void)tableView:(NSTableView*)tableView didClickTableColumn:(NSTableColumn *)tableColumn { [self displaySelData]; } -(void) displaySelData { [self displaySelData: [theResults selectedRow]]; } -(void) displaySelData: (int) row { NSString *ss; NSMutableString *s2, *s3; //get the selected row //get the appropriate data if([myData count] == 0) { [thisCell setString: @""]; return; } if([myData count] - 1 < row) row = [myData count] - 1; if(row >= 0) { ss = [[myData objectAtIndex: row] objectForKey: @"_data"]; //set it to the textview s2 = [[NSMutableString alloc] init]; s3 = [[NSMutableString alloc] init]; [s2 setString: ss]; [s2 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; if(stripTags) { MWFakeFile *mf; TAMSCharEngine *tx; ctQChar *qq; qq = [[ctQChar alloc] init]; mf = [[MWFakeFile alloc] initWithString: s2]; tx = [[TAMSCharEngine alloc] initWithFile: mf]; [tx setAllowTab: 1]; [tx setNoPar: 0]; [tx startSearch]; while([tx readnext: qq] != EOF) { if([qq tokentype] == CHAR) { [s3 appendString: [qq buff]]; } } [tx release]; [qq release]; [mf release]; } else [s3 setString: s2]; [s3 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; [s3 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s3 length])]; if([gPrefBoss TAScanForLN] && [[[myData objectAtIndex: row] objectForKey: @"_line_number"] intValue]) { [thisCell setString: [NSString stringWithFormat: @"%d\t%@", [[[myData objectAtIndex: row] objectForKey: @"_line_number"] intValue], s3]]; } else { [thisCell setString: s3]; } [s2 release]; [s3 release]; } } - (BOOL)validateMenuItem:(NSMenuItem *)anItem { BOOL ans = [super validateMenuItem: anItem]; if([[anItem title] isEqualToString: @"Save"] == YES) { return YES; } if([[anItem title] isEqualToString: @"Save As..."] == YES) { return YES; } return ans; } - (void) moveForward { [myWindow makeKeyAndOrderFront: self]; } -(IBAction) moveWorkBenchForward: (id) sender { [gWorkBench front]; } -(IBAction) showCodeBrowser: (id) Sender { [gWorkBench showCodeBrowser: self]; } -(NSString *)getTitle { return [myWindow title]; } -(void) setMWFile: (MWFile *) who{ myMWFID = who;} -(MWFile *) getMWFile {return myMWFID;} -(void) setGWorkBench: (id) who {gWorkBench = who;} - (void)document:(NSDocument *)doc didSave:(BOOL)didSave contextInfo:(void *)contextInfo { MWFile *mw; mw = [self getMWFile]; if(didSave == YES) { [myWindow setDocumentEdited: NO]; [self updateChangeCount: NSChangeCleared]; [mw setOpenFile: self]; //reset the path [mw setHasFile: YES]; if(gWorkBench != nil) [gWorkBench setDirty]; } } -(IBAction) saveDocument: (id) Sender { MWFile *mw; NSString *path; //[self saveToFile:nil saveOperation: NSSaveAsOperation delegate: self didSaveSelector:@selector(document:didSave:contextInfo:) contextInfo:nil ]; [self saveDocumentWithDelegate: self didSaveSelector: @selector(document:didSave:contextInfo:) contextInfo: nil]; return; /* [super saveDocument: self]; path = [self fileName]; [gWorkBench setDirty];//kludge since we're too lazy to make our own save Doc if([self fileName]) if([[mw path] isEqualToString: [self fileName]] ==NO) { [mw setOpenFile: self]; //reset the path [mw setHasFile: YES]; [gWorkBench setDirty]; } */ } -(IBAction) saveDocumentAs: (id) Sender { MWFile *mw; [self runModalSavePanelForSaveOperation: NSSaveAsOperation delegate: self didSaveSelector: @selector(document:didSave:contextInfo:) contextInfo: nil]; //[self saveDocumentWithDelegate: self didSaveSelector: @selector(document:didSave:contextInfo:) contextInfo: nil]; return; /* [super saveDocumentAs: self]; mw = [self getMWFile]; [gWorkBench setDirty];//kludge since we're too lazy to make our own save Doc if([self fileName]) if([[mw path] isEqualToString: [self fileName]] ==NO) { [mw setOpenFile: self]; //reset the path [mw setHasFile: YES]; [gWorkBench setDirty]; } */ } -(void) setStateString: (NSString *) what { [limitField setStringValue: what]; } -(void) addStateString: (NSString *) what { NSString *old; old = [limitField stringValue]; [limitField setStringValue: [NSString stringWithFormat: @"%@; %@", old, what]]; } -(void) setOriginalStateString { if([self global: @"regexcharflag"] || [self global: @"nonregexcharflag"]) { [limitField setStringValue: [NSString stringWithFormat: @"Find: %@",limitString]]; return; } if([self global: @"sectionsearch"]) { if([limitString length]) { [limitField setStringValue: [NSString stringWithFormat: @"Section: %@",limitString]]; } else [limitField setStringValue: @"Section: unlimited"]; return; } else if(limitString) { if([limitString length]) { [limitField setStringValue: limitString]; return; } } [limitField setStringValue: @"Unlimited"]; } -(IBAction) doSetStripTags: (id) sender { if([self global: @"rawflag"] == NO) return; if(stripTags) { stripTags = NO; [sender setState: NSOffState]; } else { stripTags = YES; [sender setState: NSOnState]; } [self displaySelData]; } -(IBAction) doCollapseDown:(id) Sender { //loop through NSString * compareValue; NSString *recKey; id compareRec; NSALLOC(NSMutableArray, tempStorage); int fflag; recKey = SELECTEDCOLUMNID(theResults); fflag = 1; FORALL(myData) { if(fflag == 1) { compareValue = [temp objectForKey: recKey]; compareRec = temp; fflag = 2; } else if(fflag == 2) { if([[temp objectForKey: recKey] isEqualToString: compareValue] == YES) { compareRec = temp; } else { [tempStorage addObject: compareRec]; compareRec = temp; compareValue = [temp objectForKey: recKey]; } } }ENDFORALL; [tempStorage addObject: compareRec]; [myData removeAllObjects]; [myData addObjectsFromArray: tempStorage]; [tempStorage release]; UPDATERECCOUNT; [theResults reloadData]; //get the compare value if 1st time or compare with value if it's the second+ // is it different, save the new value } -(IBAction) doCollapseUp:(id) Sender { //loop through NSString * compareValue; NSString *recKey; id compareRec; NSALLOC(NSMutableArray, tempStorage); int fflag; recKey = SELECTEDCOLUMNID(theResults); fflag = 1; FORALL(myData) { if(fflag == 1) { compareValue = [temp objectForKey: recKey]; compareRec = temp; fflag = 2; } else if(fflag == 2) { if([[temp objectForKey: recKey] isEqualToString: compareValue] == YES) { ; //do nothing since we want the topmost one to represent everyone } else { [tempStorage addObject: compareRec]; compareRec = temp; compareValue = [temp objectForKey: recKey]; } } }ENDFORALL; [tempStorage addObject: compareRec]; [myData removeAllObjects]; [myData addObjectsFromArray: tempStorage]; [tempStorage release]; UPDATERECCOUNT; [theResults reloadData]; //get the compare value if 1st time or compare with value if it's the second+ // is it different, save the new value } /* auto sets routines */ -(IBAction) createAutoSet: (id) sender { [autoSetWatcher runMacroEditor]; } -(NSMutableDictionary *) autoSets { return autoSets; } -(NSWindow *) myWindow { return myWindow; } -(IBAction) doAutoSet: (id) sender { NSMutableDictionary *who; NSMutableArray *ans; ans = [self getAutoSetWithName: [sender title]]; who = [self autoSetForName: [sender title]]; #ifdef NOSHOWZEROCOUNT if([ans count]) #endif { [myData setArray: ans]; [theResults reloadData]; if([[who objectForKey: @"start"] isEqualToString: @"Visible"]) [self addStateString: [NSString stringWithFormat: @"->%@",[sender title]]]; else { [self setStateString: [sender title]]; } [autoHistoryStart setString: [sender title]]; [autoHistory removeAllObjects]; UPDATERECCOUNT; } if([ans count] == 0) NSWARNING(@"No records found"); #ifdef NOSHOWZEROCOUNT else { NSWARNING(@"No records found"); } #endif } -(IBAction) removeAllAutoSets: (id) sender { if(NSYESNOQUESTION(@"Delete all of this file's autosets?") ==NO) return; [[self autoSets] removeAllObjects]; [self rebuildAutoSetMenu]; UPDATERECCOUNT; } -(IBAction) doRunSet: (id) sender { if([namedSelDict objectForKey: [sender title]] == nil) [self doAutoSet: sender]; else [self loadNamedSelection: sender]; } -(void) rebuildAutoSetMenu { int i, n, m; NSMenu *asmn; NSMutableArray *w1, *w2; asmn = [[[NSApp delegate] autoSetMenu] submenu]; m = [asmn numberOfItems]; if(m > AUTOSETBASE) for(i = AUTOSETBASE; i < m; i++) { [asmn removeItemAtIndex: AUTOSETBASE]; } /* if(gWorkBench != nil) { who = [gWorkBench allAutoSetNames]; if(m = [who count]) for(i = 0; i 0) { for(i=0; i< m; i++) { [asmn addItemWithTitle: [w1 objectAtIndex: i] action: @selector(doRunSet:) keyEquivalent: @""]; } } n = [w2 count]; if(m > 0 && n > 0) [asmn addItem: [NSMenuItem separatorItem]]; if(n > 0) { for(i=0; i< n; i++) { [asmn addItemWithTitle: [w2 objectAtIndex: i] action: @selector(doRunSet:) keyEquivalent: @""]; } } } -(NSArray *) allSetNames { NSMutableArray *aa; aa = [NSMutableArray array]; [aa addObjectsFromArray: [self allAutoSetNames]]; [aa addObjectsFromArray: [namedSelDict allKeys]]; return aa; } -(NSArray *) allAutoSetNames { NSMutableArray *aa; aa = [NSMutableArray array]; if(gWorkBench != nil) { [aa addObjectsFromArray: [gWorkBench allAutoSetNames]]; } [aa addObjectsFromArray: [autoSets allKeys]]; return aa; } -(BOOL) validSetName: (NSString *) who { if(who == nil) return NO; if([who isEqualToString: @""] == YES) return NO; if([self validAutoSetName: who] && [namedSelDict objectForKey: who] == nil) return YES; else return NO; } -(NSMutableArray *) autoHistory{return autoHistory;} -(NSMutableString *) autoHistoryStart {return autoHistoryStart;} -(BOOL) isAutoSet: (NSString *) who { if([self autoSetForName: who] != nil) return YES; if(gWorkBench != nil) if([gWorkBench autoSetForName: who] != nil) return YES; return NO; } -(BOOL) validAutoSetName: (NSString *) who { if(who == nil) return NO; if([who isEqualToString: @""] == YES) return NO; if([self autoSetForName: who] == nil && [gWorkBench autoSetForName: who] == nil && [who isEqualToString: @"All"] == NO && [who isEqualToString: @"Visible"] == NO) return YES; else return NO; } -(void) addAutoSet: (NSMutableDictionary *) what withName: (NSString *) who { if([[what objectForKey: @"global"] intValue] == 0) { [autoSets setObject: what forKey: who]; UPDATERECCOUNT; } else if (gWorkBench != nil) {[gWorkBench addAutoSet: what withName: who];} else NSWARNING(@"Cannot save macro: not connected to a project"); } -(NSMutableDictionary *) myAutoSetForName: (NSString *) who { return [autoSets objectForKey: who]; } -(NSMutableDictionary *) autoSetForName: (NSString *) who { NSMutableDictionary *ans; if(gWorkBench != nil) ans = [gWorkBench autoSetForName: who]; else ans = nil; if(ans == nil) return [autoSets objectForKey: who]; else return ans; } -(void) removeAutoSetForName: (NSString *) who { if([self myAutoSetForName: who] != nil) { [autoSets removeObjectForKey: who]; UPDATERECCOUNT; } else if(gWorkBench != nil) [gWorkBench removeAutoSetForName: who]; } -(NSArray *) columns { return colList; } -(IBAction) doToggleReanalysisMode: (id) sender { if(gWorkBench) { [gWorkBench doToggleReanalysisMode: sender]; } } /*-----------------------------------------------*/ /* summary data routines */ -(NSMutableArray *) hotData {return myData;} -(IBAction) runSummaryReport: (id) sender { [summWatcher doSummary]; } -(void) codeLevelDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode) { aCodeLevel = [codeLevelField intValue]; } } -(IBAction) cancelCodeLevel: (id) Sender { [codeLevelPane orderOut: Sender]; [NSApp endSheet: codeLevelPane returnCode: 0]; } -(IBAction) okCodeLevel: (id) Sender { [codeLevelPane orderOut: Sender]; [NSApp endSheet: codeLevelPane returnCode: 1]; } -(IBAction) doCodeLevel: (id) Sender { NSWindow *who; [codeLevelField setIntValue: aCodeLevel]; if([gPrefBoss detachedSheetValue]) who = nil; else who = myWindow; [NSApp beginSheet: codeLevelPane modalForWindow: who modalDelegate: self didEndSelector: @selector(codeLevelDidEnd:returnCode:contextInfo:) contextInfo: nil]; } -(BOOL) isMySummReport: (NSString *) who { NSArray *a; a = [self mySummReports]; FORALL(a) { if([temp isEqualToString: who]) return YES; } ENDFORALL; return NO; } -(int) reportScope: (NSString *) who { if([self isMySummReport: who]) return 1; if([self isSummReport: who]) return 2; return 0; } -(NSMutableString *) dateFormat{return dfString;} -(BOOL) isSummReport: (NSString *) who { NSArray *a; a = [self allSummReports]; FORALL(a) { if([temp isEqualToString: who]) return YES; } ENDFORALL; return NO; } -(void) addSummReport:(NSString *) who report: (NSDictionary *) r global: (BOOL) g { if(g ==NO) { [summReports setObject:r forKey: who]; [self rebuildSummReportMenu]; MAKEDIRTY; } else { [gWorkBench addSummReport: who report: r global: g]; [self rebuildSummReportMenu]; } } -(void) delSummReport:(NSString *) who { if([self isMySummReport: who]) { [summReports removeObjectForKey: who]; [self rebuildSummReportMenu]; MAKEDIRTY; } else { [gWorkBench delSummReport: who]; } } -(NSArray *) mySummReports { return [summReports allKeys]; } -(NSArray *) allSummReports { NSMutableArray *ar = [NSMutableArray array]; [ar addObjectsFromArray: [self mySummReports]]; [ar addObjectsFromArray: [gWorkBench mySummReports]]; return ar; } -(NSDictionary *) summReport: (NSString *) who { NSDictionary *ans; ans = [summReports objectForKey: who]; if(ans == nil) return [gWorkBench summReport: who]; else return ans; } -(void) doRunSummRep: (id) sender { NSDictionary *r; r = [self summReport: [sender title]]; if(r != nil) [summWatcher runSummReport: r]; } -(void) rebuildSummReportMenu { int i, n, m; NSMenu *asmn; NSMutableArray *w1, *w2; asmn = [[[NSApp delegate] summReportMenu] submenu]; m = [asmn numberOfItems]; if(m > SUMMREPORTBASE) for(i = SUMMREPORTBASE; i < m; i++) { [asmn removeItemAtIndex: SUMMREPORTBASE]; } w1 = [NSMutableArray arrayWithArray: [self mySummReports]]; w2 = [NSMutableArray arrayWithArray: [gWorkBench mySummReports]]; [w1 sortUsingFunction: nsStringComp context: nil]; [w2 sortUsingFunction: nsStringComp context: nil]; //who = [self allSetNames]; [asmn addItem: [NSMenuItem separatorItem]]; if((m = [w1 count]) > 0) { for(i=0; i< m; i++) { [asmn addItemWithTitle: [w1 objectAtIndex: i] action: @selector(doRunSummRep:) keyEquivalent: @""]; } } n = [w2 count]; if(m > 0 && n > 0) [asmn addItem: [NSMenuItem separatorItem]]; if(n > 0) { for(i=0; i< n; i++) { [asmn addItemWithTitle: [w2 objectAtIndex: i] action: @selector(doRunSummRep:) keyEquivalent: @""]; } } } @end gtamsanalyzer.app-0.42/Source/newline.c0000555000175000017500000000112410162465511020412 0ustar brentbrent00000000000000/* * newline.cpp * xtams * * Created by matthew on Wed Dec 19 2001. * Copyright (c) 2001 Matthew Weinstein. All rights reserved. * */ #include "tams.h" #include "newline.h" char nlinechar = '\0'; char eorchar = '\n'; int isnewline(char c) { if((c == 0x0a) || (c == 0x0d)) { if(nlinechar == ' ') nlinechar = c; return 1; } return 0; } extern char eorchar; void setnewline(int flag) { if(flag == MACNL) nlinechar = 13; if(flag == UNIXNL) nlinechar = 10; eorchar = nlinechar; } char getnewline(){return nlinechar;}gtamsanalyzer.app-0.42/Source/newline.h0000555000175000017500000000037210162465511020423 0ustar brentbrent00000000000000/* * newline.h * xtams * * Created by matthew on Wed Dec 19 2001. * Copyright (c) 2001 Matthew Weinstein. All rights reserved. * */ #define MACNL 0 #define UNIXNL 1 int isnewline(char c); void setnewline(int flag); char getnewline(void); gtamsanalyzer.app-0.42/Source/nextTag.tif0000555000175000017500000000647410162465511020740 0ustar brentbrent00000000000000MM* iihh 휧ᝨ᰹籺簹篸殸氹簹絾44WWdd疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵\\WWXX矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰xx!!vv..ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻{//99((唠ޔޔޔޔޔޜᛦꮵ̇##..//::֔ޔޔޔߘߘߘߜᴽ誱Ň \\ll 00۔ޔޔޔޓޓޗߞᶾ骰Ѿ&& 44gg))II㔠ޔݑݙ࣭㶿骰Ѽ=> // 䔠ޔߞᡫ⵽谷دዚ....--zz痢ߒ⢭⧱ř04ll77 瑝ړ⡬⤮㪳Ή ccMM''SS铞ܔ⡬⣮㧱䫵肋&& 66ߔޔޔޔ⢭⤮㦱䪴孶카muaaꕡޔޔޔ㣮㤮㦱䪳孶決ļh{UVoo!!풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾ς%(\\ //哞ܔޔޔަ䧱䩳媴孶氹絾lKT))ꓟےۖޔޫ媳嫵孶殸沺^ndr4400菛׈ͩ갹籺糼跿źarw@@**GGAA**==}}jjSS)){|    5  @  , 4(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/nextTag.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/NoXML.tar.gz0000644000175000017500000013126610162465511020703 0ustar brentbrent00000000000000o@jctկ;<:<|W}w_Ao{gAg;Tz c_%BMMNaoz!;B-NIɚ-<)+[&?ٳgOUS\'l.ٞ#]0N%yzQĨU#."lח7 N^ts8 ].{ᩗLDQP[4o`͏ b-RJ[XtbD.e§'"uNxT8ry#>:yRkM"~; Sd:gaBJeƳS`&x_}#?.OVRjeUoox e{~FVFce6N֣$\,p`%Oxe^2(`wPt.Q@>x2n^웬lp 7oޝQV,gUә'X%>?n3ݠMjpCS,r?S~f kUG(< `"yc|,ɩtjq/cw;{yIoF5?yъfa[/a"d"pzmƠ]>W5j1-֣patɷ$_,'`)|8T OiX~mnBzt~^rhtFޜ"  B]zڠP^xk(HUEP269*Les`O0jLCJnm.0u$Fƙ%> dj!`k!is D/G> 6Fz[gyR/"s^7=ÐkSZaыB@ ԺWuDFM!0TS.xBZqF}5%Y{[a2ۨ,^zY\WӪGš{hEƀ*貖XzJ;> 0nkbPpO~kX߹],5v) 6 t#^δ@Q|iEz$~ -`h ,r->&^ ¸Ng| \ͥl<Ry|f11G.Oz$U~RP?QnH牖~#Az P H<(ޗ%}2$-WD^cOm'-ϼ g$K9o16BVoz<{FTmmIePAR60ASDsl6{-O@WJOv`aKE6P'ASR pY"Vrނ>wTp'v3YM&0ƞ~PO?x=l)åiPλ̪U,,E+- [^_Em_3k>[mV+&^: .öz{DhP%5&GLUz}O#mٜNiL 5Pfb죦zVR>{0olй|Uy]kRoFoںMNoj-"1{x_ WX?l` 4 fQ6b P[_fKV(˷jRL0=0F vQavkGf@3]mJxj _o%D~8Pp( wJ+Lyz$N/$-|_S?UF|tgw'q]Oub(WF}riL0{@ީ:,V*a];Oh;`7[Ħ9  >6Ԫq?;"fԡՆ;gB2 0" Nm`#Qa6*r[;c@x<8-V kCe|U`E r0Pf}'FHRZ>D/wWtꛤ.0{g6 DUhT:6.,PcxE_VͷJZjR/%g*,OWwD9(gap% pw.%5otoe(OwєH!d.RR)96 QOf6|Wx7V>'K"x௩n,}aaܸCG :Mu.wZwiڽ٭\ܼ~7%ctpS $H0Y<Ԍ&t9`$w!}Z6Iţ"jjQCfM?M41ե [.Y/؎M#Ɖ Z2PhQf:.p`&d ^?.xjH)D^Xܑa{1oK4'eF{AR9'~,-9*s۔*%s΍|?saaE R,\%U-ĥF[l{͎M#!=ZסI^-&)m.c(L$ݗ ܜ6!&1}D/'.{]fd-(C+\Z§ύhYEԮt4i?`fI\ɅyĸGWJ9P M7[ ˇlt:+[m_'TުՍZ9X1hM6žGvbhn<%(pr30} gX9u }rБPM0MnQ/;bUbd66^5]R18+y`\<2oy5^t &c%ӈ| r6ӂnAcJDWa;iȩVxݟxfYM֒tt*U;:٘ +?d^ƕ7 :J ʹkٯYPi BD{@EE1:x$Wkggb&:1/"$ FڥCJ^O+d'<~]F|'V@T0.DJp=aGkTp;rT=. }E&?t􅵚vWjpj|T+CՀ1D z}ҨXkFejDnAE1 =.nAfyաә<J, so.fx&­| j+Bg<&~|+Aq?LQZսS8HrjTT>`eL"h9_Oj9j¸ Sv+qyz9NvGHZxb%ݰun-Ancbk;<ckGo Y-;5ZrDŽk v1u4Sp*b>"A7b (T|T8bv Pm_pZruhᾡvlq@z{b=s.4*͔P68*/cWe&Sֵ;Ĥu~[) iZ QG6C3k!*yt@3SS +hSmͺda -Gv!MhB xx͜Xv|W  +6Rb~;)\K\:w(S~2*vD0Ȍq\e8e&4Si5Xm8Fݐo鈣0sJWWTaI6QV:ʞ^YEmTOBûY V5laD#j6R`"АG ~Ǔ?H!JÒn }rsQR[-mvT63q'4/ۯ趫ZZ٪6}!fOfڅpSvنW**UUJ[DS"ApyolLd}CJ;,-W$և3e]k4D\FBeU+$7@Ǩu*s5iNug[}(rCiTZp#1Z+ɒesLYJLda' ƎtwD^'3PaP Ƣ+G<-ea= ,$\$Ref ?soBaQ~vU lXX#doGpz hdWsӱ639mFt&u5 瀩k>9޽#y񧘰o~[$gM5u<4YKeF a{|U՗Hd'L_벙E5/KIuTm7gRS(kF㪂;X.=<uPsE b=!k40L˵'vQT0D@l;o|vWzyTB憵1CEU^X9 Jk׼ 䨲8R`\sޒd+")0(s7G /V01dT\j9{CnrG^:2̪:~V*5Ǵ8+GxV%l<06*TƋ%)b>,#G$P@B~LRp$WiIJj$<|h F5f207L ,!m]hh\4=#pfj&֠`!Iw/B=4)(6'd姟VáA(:'40$(;}fݰ$_aPHKNLL]k+^aHaçɊ*&C[NDv0_yo _ q ;3oF]d\8hKZgS̮7`^;ͷ2 ș[;t60okiay&1D'=u怄i2U&9#7,,^Yh)6d]X8Ec8LDj_18&/2z1y$jϼg[KV[ 6Bak.mTDjmkTB8DK ęFՌNͣSwbKdvY 1FwMjh^D< GY"nEuPu!֘S[ҫaZMJjVn vŔkTB_b6 lB%DMޢh! ʚ<ِi{0OtOK4JX InC]@=gg1Pu2id Ή8ޙ:_6Wg}ʎ3r :S"Ӝ̔Q:#݈8I$I<k ̍)J[x`jkUo}mlTx$؎\Q~ќ7ˈ3  sȘIrfMeL$օB Uqq$h?aox,0\R+ZȊ/4  7tWDc3mGG53q|j]v,[B(iTCWhQrzjQV6 ~{)caܖ֦ ;‡o%+3jELQE\MQT tSa<`aCp>.YdxiX܏X%j ,G&fҌJB X!RlĽTfZ_V,S{Qlcunәkq)*<[Llx$ۖ`eVwCSV{+Tnͱm<([`eB9|d"yI昼yzx,F <9j>S04b}q!LN<FLn>@i2wtv&Y^2Dp,eEtF\{|8?fGa6$snP}t+0B-*[1@4#2nMYRO!l ʡ>n$بIUɤT[(a4!j,1@ D lD$hTϳYsD'=ȃyuͷV[>d͹"\ʧ6ALMqb ہ9K"R\2X FJyxL ։K/Q)lHAv`.] BtPuYjGR|ci)H*4}PZPUOrջi}P'jbSΕvlz/LiYijM}YMNzɍx#1:`$LZ'%{[\܀;!+LnD^Wai-[K*֐$ŠE\oiB4;*D,VÊ_QX%yKpC% 'ܺؽj|UG!/cdf\̇30PXFc/­M霪ra2È4u wwluܳ]k:8]t z:nd'sHU ,}O&%܂(ZGur}g5h`^W~=GS,h_2ntt]2z/%P3{!0Y-{QVa3arl Y\>L V s:5\Іgr!>ũіdap!Dqgq/vP7Ӎt|2aJFyz=.w޹Od"A6]"m9em߃mݻXG 墄ԎLu`m+bNlsW, AÐ x=#aVؕ]վKbqK$f-pUF=i0(LQ+h6AOQ/oTF"őA3 j[ۇpm9֐Z[ϖKna3Uc|WS 4Ř= |ԍJt[LT@@S' k&݃"y#[&.zo l.&$IcH_+4S"E%ۮX-\Hl:GJѹ:@55arU}l36 鈟/]/:G&%G/WeK1O}1R5,5^QUf0Ǩ-s'kePu;utr>иq%RF"%SOL툑`0”6x;le1 `r@tiY#-W-UZll3ԭ烜Z4U4!XT~&R _b.]q 0n2˚`jT1 mb&)1-i[7NSUD]"}EwfD`ˣ=`<jf)ħ6_A] lAßynYcwwc[{Pg tʋ]_ctg7llmN_* :;Xb3ArFaG((ܚF6d}1 5E7qr|)$H0] ~SI2NEG[qZ^TC㗉 >]ˮ,hh^v0^kέ5~TGNW;RNU"Ի*0뢭O9<~'猤~uj`ctRh/@!޳etȳ fɧϞ0^^38曛 .s:na(7oV>a*GgX`!}.8jͨNexP-[B>Yd^+gRN^ .j[mSXCX7@?UWYNT|A&+(gUX@be#PA)pCݚʡ%q4).0Unᅚ3uH ,Iax ϐMX2 ^=OOr|Y(߮ms09j\Vo\yB0UbK J y8%U`sivG^>ڎAAq`t$C=AKP's2{6ؤzhd&mFFx o~cht sEF@"p yB;x*-!F`@)}D eH}>J=DK7*Cj6MwF<&i/+z v>̘[6 kK p:~^o3Py |ɇ]2tz_Dmq%OW5 Kz9eLҪaiEw臃 Tm[Ei}J(<0c9-ϴW-0'Oo&y_<pG1@湣tc]笴ԦOpm*<g! P\Ϯ?cYvˡ`~7@2#rD\\3!`DrL!R~vZtulعd5/G-4A]=#ˀc}7.Mwyff^`r.TUc=,/1JyMe2TyQ1p,Rt\\Yi:zIw3O b v&23ty APZ6S~;}N}S+K ,_N>Fba3 J'+u?X?KXEY=Z\kr'i@ѭ8ᘣ>c󚣗#Jop\!R'$_<0,-Up.1d!'`eĻ; _媭ař{ZJ.ĚjD1]p!7M'b7-B5/ֻN*F'X?#<\20%'M%){twj^b/|ڦd t, RTz2ujN٪/( h@3@[O fUc\cG8>@S<[4vN9'ʼnl>\$o.26rWaൄNMidn->_gze1by RYc!ݖ4m8"/L˾VmhEUZ*ob.*-ByMCZtJV)EȠ>UR `>^)!"CUKkWmZRgVbyCwUr_@ln(ILNtnпˮ`4e1ZY:e5uY!Ξ[}ܔ]yQ۠}Fg'MFxvcsr8듓3?!{+ "{%ir< “$"rUD@MJ.}zC"FQmҳJ8;Pmw4f]X]F^@i*< GW>_?\&Dua%MEYj~JةV`o:Xi&W)1@ؗS"ofHSeR4P렃:ܯx1Vh.Vr yV< Ph5 +=/QZ^N[/%ca;cN&9 pIjk lb8bԱny az˭ؑ5XnhL,ߩu^ðu+jg"҉($VW86O~9S%}qw+[hힹQfsrK.ӗnIþDh&3, |(]mqЁ}S473,<1s^i Yʣ}b3vE.ҹES .FJ^YrDڪAq^Y"緵J,jEN3bhGD"8FY5Km{TOFUmITll@fq\ğk|8W)X@?ޗ+EzyJ|@gV ŞH!m`ųfSL1~@~ћagvJ & "H3Q!/W8 ?4> {ŏcŹ}+Kxz\uZd5C]^z+k tL@eʹsm Ԡ2/ɇ84h|sp-EgVhHkKt Z\wwhe}H[ 1s#Oke(n}2fY÷S͠>jc|4۪_:tQW8DgSEo+[!5.%Uo[S;~GVo@HGa, 0nŚ{scp62S<$%ٞl utCR)55ሹEW}zwu-P^{;CBńk/%1n d܇ @wᚲS_ѽLV2dpY 2!= pO pI)Ͱ1vN>ϔz6e.XUgz]-^&@5?7;USt\6C%5&2bP}<6ƪ~ X egP#sk%@1A$ DFb$3^>kv."__W99IS'yHdӖ~"ܮ /8 `O\mn]p*Xuˇ:6kp|%A+!  h3,NE筳WAh0*t FZ.e6Eu*qN`q^wcM\^wN8_N{]?ąa=F*3-*w 2'y0$O#@c)bE1Ii\ba/)9t:.HGXIl r,3=sx&3:E,T5eXR}G%~#6k~µ:x'y!?2&X$UWe Jqt!~C>Ct0a=DD483gər~\iXd6%I)]%9<ù=ݻ}wQa> pBKgu7^S1X6h~4eW4n=|n̅[m\86wilC6 JU..g!t`ik"Zv:xmp^L uڹ(@'DQ*(jK1uwGcl -MC>j"* OS" EB1,rޢ{ R3]J&6je&>  ό)lL>|~ !h_GXj`|lŇ u? QZjM 5 ֦Ϋ4/ope", YZUvž}n\MLGZh:[$8ͨhc$C=L5H ?;x7wRaGoBamc-uyo`cw HG +EX@@.-.qm3d~j{^ \G!a~ JҠ<ŗH7Smu)XiCͩ;%m^B/|jP$O<'Jp%!Ɖ%c"Г@;1:2he%C]?-vm%fb^ t E?8rHkŖ.V[X.vPoMD)Snk,@1³nP[f"Wm3I:(5$o@ K*trFR↨JtڻGh JBxYdkuXޒȧ^MJjLT†\)xIм(߹ R "3"|`"{x%#YaAe֭;ij[c>[ Z?wzlVqiUxRd8ö\^kt3²P1O(uOM,#QF#:>{{jNX7H) -jP$JEuop22LvoM.=/h?*#zAezC?rTfP׃߬<[>\@yuw~tHBUcuS M.ЩdVWBeJ;d;`g㭡I_l"&&d÷kUJ%u޾(Jh&m1GW(wyNLYRѕUG`_\;O!B%8?t3Vh: Ao3@{Le`'0}*\!o5fVt0r2kPQJK3Vvp8V̚+Nr;$;hTfwdy͡ y2SqC.ւh&|Kω˺h.Zws<n8y/fq1ylyL"UE8miA Y.R*:%h-җXhlf"P ☜*?{9=_u#2 3#+r'{`PX\yoFdsiR"ؚhMWeEhTgm }X7kלM颤6E֖cb}r4yo#424ѵ"R[қ/1B#ʠBuZr  '~Gq?M+*OXw2%EO,dE_* }N %τ_"ZOތh2àJLjc@ Q4~>T8Ur#U5Mب! - ܜ|*s cľeLRnHCJ(b˘ez\2\ \dk 6 $m X.ڑExKEU@?x\T̑U<0Mm[ E:6y!C(,^ơ{NKm:"kTiS~nCdYw}A 1#VFpFPlNRtC5y. ~&4J ZcmL}IB%qhIAX&)JjR(2{]K֛M3{稚 g1l-/wT#Wɬ!MN8,q}q`Ջ; tx@qDӋ26X@}z Fa &J@7Y ɉ85r=,*5T7ϵ0T'+fcMΤ!Y; Q=.2 jg_}V0ޡ_Q&­--4er!C0 ^";>`"dh-YEt?\J {M<ت#&UrAs[[O9(V 4`7H7>312oZ'*BNhLNH`dgPΝ+$?Wp#9Nj'0Į1OmHBVC AUy{`K9CbXoy(n r̉G|vl#t{tn{Bfej:W.gb=+<"@qH(:҂Eq eqYeeHh7v2kO O:R?l.|n ˴yk Սp@9;(/vnVMzspuA vxxgsҊB @xc41f˛*X4҄M3 wj~0 \M dSD*~m[E'D"axy:O8vw Siv)ᇘSQ/zދOFӘg ộՐٲ_\eWFZ q$z :]~q\#)KqιXVrk:y(c0- 6LU [pC1JQ>eއuʷIΜ!+'Xg9Ko![B% H;W<[>0rhf׿vB!gTl|:4:*OYO砘 yZ:m)>sP,9ݪN 9) ,NBį:dxuAl ~.;KKqt9Y6i>`D:E[X: z a=-术J| i!_pEmn6ml::0>Snc'>9e EMy.(_%ٻXHaoFX2%^{lv;/Z/[qiZcй6: TԶq?q>M9aFDk`9geAƑLv,[B 4vobO-q@H9JH'|E0CQn&|ӅW+ctUO.v]N#]P4}q1UF\rC5*LN1v]]lXrśƚjD~v@E/"m{z. U}JThX'zc`h\ahXWb!Wr"hN v4*ٕC; ڣ0I܍? l7~۶~OWctiuBnSb=HPHT28!G}^ $ӵ>%r~ק>|n'AhZ>g1/9V |mtO W(a d9pSHa$1^F1: ׬iN2i [@OMuW7[Bu% dד͘2xDƳ)x)rYpS#MfHq> ,ebsαO8~k-5\p ;[1.3+ps~S,Ű PnRLT GӀ6g%:sʲ#ouSo<m eV1rw.;׊kZO5Ƭ8{]K$UeVqaQJ!KŇ1*j-&X.(˶?d1Q^nz5L0jiAW]bĈz1 ȅ3{b+.F;ywG B0gT`"QXOWioy8KcJˋ 2]yeم jEGE9'^"m*V N~8֡NRI=V%Q4n }'*ǯRH;MήAVf^WDK`y(Z(ގ|G@ ;Vf}wjцYt$bf ]&8k5)"$籍 t' q|AbB-')%Ks11ۇYH_u.Vl7ݓz52>BHXv 6u}kS4Sxr [Y}bɘ#Zk%Y0 ؏iCώNiʏ_Ype2 TFH#ETbB|W.g!cAv:\;yW'86 q,+ڹXoFWVP~4\@A>V;_hg~^> !~O`RCk}I 54#6KƑ (9| 6qp{$8eV5h]6aFAׄH~ 0'FA[ +ܙ ˟簟xEfXMzrcH*İAuaqS\o<Ѻm 0L`.:e\kn6Y ڂh$" -3cRHi~lѮrTkk.矀' nC(!DNŗB>D;ܖ dq614*$M0 spͩ9Ye[[]!hՕuLJڠJezk(%%X'6?uE jӇZU+d$g=E~qxAQ{80y?`/ӄ?@*x82bǞӍaɧʰ%dlxޢE78V]7X^#6/wF!qH# FC;wbC8⩶mXwpUs#q Xޮ6o{չ}$qfcPX_y6{z$Cb hKJ}t^,ۿs >t sVo KCh@(0(luwZ>25L/r?u޸]S#MϗEOPX̦1vR|l^k-#gNfxl00zO$7e,ܑ, eL a];+ë́|xqy=Iū4lo @Td5rJ" H&ɥۛBCz#V=IB&'t2 N>~;`> SΊ m<9zô$ דu RQ[V^ !G܆?J!O$ "W:SDk5TJa 8Kd]o9B٭;Bf'u<8u|5DЖ@' G+ԮabtQ9+Ev:FSQP<(rursMPr\>n3JG!M> !e_am)i)$ơظc2T 7q.[Y.FHe;F.b^@Ɓ$dd7aN@pC-l\PÅ]ٓ==wL:+rLӃu}%0K"^ ?%igAK+$'z i@&Yu;F,Sؽ o"i(m"Gq!=29vAWxRmZ[ƫ ?W6;Q8{ٰlѢ/gn4&*`'[J`sT}Y7èKXl[ 1?4f8poɶlR`b o#03ϟgt,@|4]}?~_1}?򋿮'Q/_66Dn|񝍈}f:H?E1+wtu:h6bzO$W*$_PDCtlMɆXGT\4YF*_i?>J 7G>T|4)iLWя.#3FtJOQe=Ma'ssNG?Mj#ų o3zhǬWd=7`Lf= h9m}9`goZ;chzݗv_~ϊKrwh[zk~=hsŶOwVw5ŞnVPUWWs6F,{;c3nwyB`6S:Cq@>$2R҅y UƠ,F(= Yq7T$VEһ(@"0-$E@B>7:մ ]bviJ+bR( ?Np 6;VZTE >LK ۞aM-3|aE3s{gIL0c-mY7i)6bDсtahmq,f SNSHMWnssG ڌDLpC+rqz;ܞ +JB^5K}54o -m~r©؍ ~#@t0qiXD\x] H /'M8S3ܨZ.nlԀBwD4< D +"VF-)G)!qj{"|ChOܨZ A-<[~QQzpJ./6b>E[c88ǽȉAs%M,|z4R#b1!tbmtFgYy8 n+;诧rIb%H6Z#‡Z9>zyjJ=+QׂC *48E\P=QhfoFBbsdeP\AczB-؇qCD4J5[JuEĝTBþ,#]@5;;\B0Hww#x6*D;4PնEWg]v@uf}kNQ(RDoEOleR$# 9qXoG.ӂ:9| Z9W))s֖_cy)2UZӉhLImmi+QTLxRNV*S'lL<=qΧJ(!_#x/^V*X#P7qOߨׯ&{{ Yxgvٓqo-:]FtMc2޻!JT@wGMss:dV:~@I뵜sk؈(9NjU[ɫ-3~-hAs"sOL\*90˲кmPM ѱ4</BB4ؿhHz[4΅r3u!Dr>{e[CQ?g!)Əׄ~Z%h`_:z ˫,jmWK>#IC̋ #c䲹xKbPZ kd7ìN/4/l?_JB8 xpN ׀Ky2y۵/g[*jڪuj[dpU\$Iyƹ|Mb\Ǎ%f.)|Fg5' w{aL X0ihZNuQ,-1^&HcVG"LBAFwocNdJD-KEE],aYP ><vd/=0ŏ:`:aq+ebBNqFLF잎̕Y:NWU^IJfޢFD0@@8a{AO^h QI y^e~@[UIkq#湦a4osӾc6.Kr\}UsIUBn;o`t8Yh,wFxM)zL?^VU|.æ%r2~>b ztbxK(+ ~7ϰ:e4q3(9k8#Ԙ<71\!6pg4ad)fhb6th$^F1s-~ɠNB\2:lRIS2{h,o%lK)ޚR"ˋTy?]`(m:tte7=]j[t1vΒ]a BH`*R3FH F,.C|&{눷~*jØί_@U4朄&Br)gIe!j1^Q@UjaP˼"cVM&mguTL`.YX,'+\A~^c{x:%Qk= ӤGF%F!M0(թA:*v5)6hp@4D33QS%*Bԥ%Z#P5!PţQ7XSCbehiEV/N{bT&x1 @ocKo m~| лfZcub[]C.9n@%!*fr Y >?E t1f9щ(Cj” 8au_m+v.3c_͈#8b+V^J` ]VIAWi>)vǣLKe0n@e0΋#'6e#>[>)l+DCeZ*$69L|6Og6bh3݈E'%C+u3l*> ~f(4̣R'msG%rE˩oG.fsyw)]z+4Zo@jNiu-hԁ;$q8-G&JwBY$Mbb 6NMc VipT|H Ft=m'+pbSӈ=?&J7OZ'X`*@~3X@"swQ L &-}yup?w/H!.W\O4 "$J!hM5<'~ITK{ҋ\SNG2dӂćRdyXFZyU9l2ikL^PA˫_ ӴN2C?24/yUa!Vf2/+!!SbGظ%'׹%7:ſcE]qQLqћ|IOg|~ ɱGe<:̎Hs_sV9WLR7SRjwB#BB%G輹U;<\&3 Zٸ5 @dQq+*͸[kFbr&ib9S&%:ҹBH}ђRu#naX@Wt 1pM:_hxx֤˃oOk)fUa Ư`_lj;֥;FPy .#snEkUsl'҆c.xӰϤǟP ffjpϹ )"F3) A]hxIHIt.8bU= Y&& YTI;|uKPP hU*Ȁ@.qO?ο+b'_Aȝi! =NL m9w'Σsl#0GQ: $y78wb[J˩MLLG:8= ZuzV2poC0Լu{"\A^B({ @A<>IY1|hct۞k5%PQS}*{X-$rlL^*q]J_ɜ^Ҁ魺(.7e#x_ B| A:үN7+fVM YLM\j \̷Nkw}eQU` :i`F-PR: M)J nRCj99/5.J$0p<cki<ˢ)L .LyE9 WkѢ|4L}\EIk<:Fird#a9 t2 U_@S\Q[i;fSfM1(tG Q:j]!sKSE0C2%DOAA[֘#5I2 ; DD/14=?(m/DL/U<)!@ CbIt M}ckA6 8׶RQ㗇ݭo_~M}mhBf ӈ i}M]֘׆xAx8q$=Fͽܦǿ278nwE^p{K2vS5:e\0Sh>x9(ʕ!W.A0gXYrhi 9}}J]ݪ ekgD})/:wsaݩ9٫B`:y|QR/3`ʒP:Jfa>H2? ]aryA-HfTvnzO]©%cqbH\Y,7BL`0x#Ct*FtR9ܜ*q+b*ÓX8MUd\p~=tR:6YߜUD{^1=:cExj[9Ni~zieOuPd# 'ѺO&$}zxb¢@M:Kh9LJnU\V(qpayW;v (3iHpY՞~%08.>JA;8 \oۦ/FI\@@u B `ML"!b-c]ۍ?ZK=@XjwD;6Apc2[؀zG1h''093Oj+'up PE&="%j u-ǔ fgd6=hlX)^j΂<}Cp=Y9}ꚜ<| 6%߸3۲z[)&#VYh4z{CaBqCW#37@r' yib6 2SEФV9_j awNEI/v6z3AgIf>oo/<ƱH|YIVN)!=enma͒{o%Øw16erKR11)XI"ohnn Zmބc a[idwQP=oueSIPoy9ODbBmETD .yKZt| Jw/dL!z0BE氐-k.}m:B kgy>4&Pk'/1$% V=4.PTSE.]K}Y3'+2 ,i2؊]+/XB,ٴL?X <.Ή`[3)e$`Р.['&ޒ1o+vkR *&X|x&D'NV Tx80JV\4ANUhI?k@rXU..̼ 308PZaˢURXO:rvsEq'u"3.0SkՌ"=Lboz2@R[39HVn}bӄWl`leUfU}h:)]5;뗗omܲlЈ. n-ot95.Υ9;n<1+f?VFE3 VQysdlM2{\"7[q@Ρ -5Rh0 A8tf栿f9cC:u?T|Kr7 cb[BUafv7sĚQͱNsrQV{5Uas4dMXpΑԡa7/:(^RcqOPr.pzp5M$KR!zo@%,b!mW?,4Fp^db+J2ލh[dC[ wo̭{9ݛ@xE࣫j/{6Wv}L1~diO VS;%BړWqNZ8,EFwJ$+7FJRHcr/|\m0 D!$_u.A=h2I ^"~uezjg4>cos9D9adCKs0w̯)n|>Qmn®_;GqB}JOL2K`׫[v ѨzPk-B ZB9~[mYn9ZQWCl84ҥh` \Muh][N9Xm6%4d$+J!偰07sDҩ< ,S]jk,k6Yxף-d0K|yjɾAC' 歳)s{ghQ`mtaQq&12л%D:q1V^}@!xmxҁT<@:?pBS/6M@٭8A6Ċ Adp8m'G\rfk~eZ!X鈩Sy=jUx֠E8ysg#}wGNu}Vly0n$+ze+p JUlPPbĪNǒxdٚ *emj25W<)ȧbF^1pg5TYCf3gcc8)Kiک;o\^itk ,/ioZ<XyZn@2d[<ԏ%Aun15U/uw'Gq>Ǥl 9lS.Q'G]~=[ 5o4 bK-7/`@؈i&ω&?,%@lK9g^8E]Mɕړ ̨o="GlXgU h34A\O9"E9V[$(jp1TUvT <$BҶNL>:N5˸|Z҆mڐ(oð\LU&X;lђ,#m1ƱM[Fd)-2WYǕ!,a.DO}n/] 9pLZ (J,hKjR;PsX{Qk/5lk&u3|E0IL5o[y┐a隑x ;Nc呥E/UgYa*Y>THNjY.o6ri$FHϳ^1`P)-Qy)!62mZT1"r5ZcBHCVʴe-vQL#cC}uc,jPQz9>:MF?`,ȉ) @."5` &x4BF~hњ '.Nγt|dF;-h:mD\0/|Fc]~ZgY\L%[[\B: 9p ]rrMo״Pzhh&K;X0jZVnu5 8rt]T> 8 pĔ()Hc8kl۳a9WńqĪ4~DlgǘഋpG,E3qފA(Zz-I 0Y=&l fGֆi 'ׇ慖Q CLf0*-obR[Mgkв:mi6sPl-HԵEoWRtZsdP& J5c08hspfȕkhMi%E&wSgބw]%=9E1DdUF -oNX\Lx$r(c MQ1ͨ-^I|ruȻ"!紎f"Oήv TtTϼ 7B a".,~Q"*lWȷYNVrp`F*SRQ~jujQP3L˥1n}sg$KzAR+6j)R)q <nTzNY)@ [JVdi';ojx*|S+fJ&c!QȄ䫖 o OFj6 W4IUrEowV woI%঴;_{O";>*:6v)kOU'{A-b .mA>אa{ 5X &gb6YH\>`In1,nk*vw3椹l-0sJ:v6rp͖?eU$\J+ J-[9ެ)"[&,OFټB zΘά<t4bY") 럶zg0`3ƒaoxL?Y0OZ0c31B [!;NT}[R%%ۻ`Av9PHZ6d2)fBp3_%8\L ex+Urc*cJ!eG&$R8T9b;^qP 2=M>0^^s$iYkrPVZr(UG(m/5b0g8RT&c6JKi ZWW좾QD=$V$0|&*ˤcp`6l:| 0x18;JnF~CɸL~倞Cx]q`k:Q)e`*H4En0K=>LUgIG/y"M#.uoΫ/z{@kylz(2/|>BUz:BvvQk dC1Cbmڬt[:Q)w@"?Iwi%!ތ6氓 ӏ]`9%*P.rK`zr |@}|[;@zC׫e ^sG\=ŤLBw\B a9qt3D;?A8wʬ|>*nwʱ*oG=)(JO4(?FSTk|oc9*ſ.!OG!Vݶr3f, {'rxޙ֑)1?G0 Lj"a'7:WXC#?=GQCdqBsZh!9G 8N;\&;_ ? #o} ox}\>NbWE[Jlup3N6T]@dwRk vm420X8B}+Wkċj f_Gj3 Ua+V48fֶ\ocZs6 jNL<&־7j W,}Z(fi`IhNF?;3ާ} Ӿ ~/G#: 0j D2 r.==f43 =r C?;*Y'"c Z}+z{@vw@QK=أDZΐ[^'$qĪ;\oڞ)fRa]\cbЗfzܯRttz΍Η7zkY&D$Kh#MpuP w \mHZC^Dr /v7e:p0Ћ4 dT.7UOuhL )ʷ$ "--p*EH9]q>?Yspqi!}5cr1'4燣|A6 OjD;Ѥ3MGz4LK1O=d'VLhz. 2`7dg"Ґ_/I3qx{ΐ~$|yCbyjcY 2AVL̪Jrq 3?O|UҏS a=5 {mhD&7vFo"AZMۅta">}:Vs܏T蒴q6 33K.N ¬L&ZXtu5=#ï*$@@Û,d> 5"\?#hސY<2 ,*KҷD֘/!qA~f3|$Nt:⸩0^ sGl8 1;l_5#r=V^R*!v hZcbm5tx atˈ6cCE!q;͏WeےTPg)NyEt^Qg?~6H_"Ȗ4pYoo݀W O: |F)G pxzH梒dg@9CRUDڥh&ӫ=|}{Wl)3ZlcY%x D py6 ioP9ϰ ؾ*6-~s#:F;^ {МHhD!>6}ğ?*Qz`QR 8M(S>XVZJP >r׵v~ۭ;?B`fʗ;0T@ ۝#sU-?g`|6pNllRaT*bPW*^խq&R@* q˝j^H¶.<{! aFÌyrڨiz~8rO/p=Mo^/{EZh<^/_|q/?뗏?|][XO@,i]ϟ9a8~ʬgb 4 E hx7d{π~Zea~n~aVJakUyC]zVy@#{2 H>%.m3Zڏqz&VϬn~| Z$=0lZw$(]VM_:)d-4A9PoTtGA 3ɞx0HSiH:=%!e倿ϊ- %7(|}Vӽ|OS c"倎>՗P4?t[@=cpM^a _y󪘼Ht<)fV(fx%ső/\U?S.#`ow|bW;Y+staO&~qβ ` \)aym ;h#,  zz6(Ju]Obɛ 8v1* pZ6?VWǏEcUr$d!׾y'+ Lv((<p1\W> >ڃRIgGo8:wtICeeE@B:w] eR,oR㴏\A*/]Ea|:)*9vc%dS7\<[~>-J raL% Z\/\ ;{`.w-T).!-,@rWoe㔐b aix4=Nzi ~[?L4LR[[p.L,W 'C!r(ZzO$$yXYV-O`A}giT=: xhK#{H{S8z0nHroiL߷Gr?>@/cu/_u/w5!b 62MFRr[b&2Y_ Wod̒-䟻Gݗ:X7GuíLJoٳwg$-3ȘeVowɺ{C6ql% _/g[{{MrϴG0}֏?3#;uwᎾu~ۅv6}2gtamsanalyzer.app-0.42/Source/NSMutableNumber.h0000555000175000017500000000212110162465511021757 0ustar brentbrent00000000000000// // NSMutableNumber.h // dataBoiler // // Created by matthew on Wed Sep 18 2002. // Copyright (c) 2002 __MyCompanyName__. All rights reserved. // #import #import "utils.h" #define FLOATTYPE 1 #define INTTYPE 0 @interface NSMutableNumber : NSObject { int _sign, _type, _exp; int _iValue; int _decPlaces; float _fValue; } -(id) initWithInt: (int) value; -(id) initWithFloat: (float) value; -(id) initWithString: (NSString *) value; -(id) initWithFloat: (float) value withDecPlaces: (int) dp; -(void) setStringValue: (NSString *) value; -(NSString *) description; -(void) inc; -(void) dec; -(void) add: (NSMutableNumber *) what; -(void) addInt: (int) what; -(void) addFloat: (float) what; -(void) addString: (NSString *) what; //converters -(void) toInt; -(void) toFloat; -(void) negate; -(void) zeroInt; -(void) zeroFloat; //accessors -(int) type; -(int) decPlaces; -(float) floatValue; -(int) intValue; -(void) setDecPlaces: (int) n; -(void) setInt: (int) what; -(void) setFloat: (float) what; -(void) setFloat: (float) what decPlaces: (int) howMany; @end gtamsanalyzer.app-0.42/Source/NSMutableNumber.m0000555000175000017500000001105210162465511021767 0ustar brentbrent00000000000000// // NSMutableNumber.m // dataBoiler // // Created by matthew on Wed Sep 18 2002. // Copyright (c) 2002 __MyCompanyName__. All rights reserved. // #import "NSMutableNumber.h" #import @implementation NSMutableNumber -(id) init { [super init]; [self zeroInt]; return self; } -(id) initWithInt: (int) value { [super init]; _iValue = value; _type = INTTYPE; return self; } -(id) initWithFloat: (float) value { [super init]; _fValue = value; _type = FLOATTYPE; _exp = 0; _decPlaces = 4; return self; } -(id) initWithString: (NSString *) value { [super init]; [self setStringValue: value]; return self; } -(void) setDecPlaces: (int) value { _decPlaces = value; } -(id) initWithFloat: (float) value withDecPlaces: (int) dp { [super init]; _fValue = value; _type = FLOATTYPE; _decPlaces = dp; return self; } -(void) setStringValue: (NSString *) value { int n; int i; int fflag, dcnt; int dflag; char c; dflag = dcnt= fflag = 0; n = [value length]; for(i = 0; i < n; i++) { c = [value characterAtIndex: i]; if(c == '.' || c == 'e' || c == 'E') fflag = 1; //do the counting before the flag check so it wont ++ for the decimal pt. if(dflag && isdigit(c)) dcnt++; if(c == '.') dflag = 1; if(c == 'e' || c == 'E' || c == ' ') dflag = 0; if(c == 'e' || c == 'E') _exp = 1; } if(fflag) { _type = FLOATTYPE; if(dcnt == 0) dcnt = 1; _decPlaces = dcnt; _fValue = [value floatValue]; } else { _type = INTTYPE; _iValue = [value intValue]; } } -(void) add: (NSMutableNumber *) what { switch(_type) { case INTTYPE: if([what type] == INTTYPE) [self addInt: [what intValue]]; else { _type = FLOATTYPE; _fValue = _iValue + [what floatValue]; _decPlaces = [what decPlaces]; } break; case FLOATTYPE: if([what type] == INTTYPE) [self addInt: [what intValue]]; else { _fValue += [what floatValue]; _decPlaces = ([what decPlaces] < _decPlaces)? [what decPlaces] : _decPlaces; } break; } } -(void) addString: (NSString *) what { NSMutableNumber *ss; ss = [[NSMutableNumber alloc] initWithString: what]; [self add: ss]; [ss release]; } -(void) toExp { _exp = 1; } -(void) fromExp { _exp = 0; } -(void) toInt { if(_type == FLOATTYPE) { _type = INTTYPE; _iValue = (int) _fValue; } } -(void) toFloat { if(_type == INTTYPE) { _type = FLOATTYPE; _fValue = (int) _iValue; } } -(void) negate { switch(_type) { case INTTYPE: _iValue *= -1; break; case FLOATTYPE: _fValue *= -1; break; default: ; } } -(void) zeroInt { _type = INTTYPE; _iValue = 0; _exp = 0; } -(void) zeroFloat { _type = FLOATTYPE; _fValue = 0.0; _decPlaces = 4; } -(void) addInt: (int) what { switch(_type) { case INTTYPE: _iValue += what; break; case FLOATTYPE: _fValue += what; break; default: ; } } /* -(void) template: (float) what { switch(_type) { case INTTYPE: break; case FLOATTYPE: break; default: ; } } */ -(void) addFloat: (float) what { switch(_type) { case INTTYPE: _type = FLOATTYPE; _fValue = _iValue + what; _decPlaces = 4; break; case FLOATTYPE: _fValue += what; break; default: ; } } -(NSString *) description { NSMutableString *rString, *fString; switch(_type) { case INTTYPE: rString = [NSString stringWithFormat: @"%d", (long) _iValue]; break; case FLOATTYPE: fString = [[NSMutableString alloc] init]; [fString ADDCHAR('\%')]; if(_exp) [fString appendString: [NSString stringWithFormat: @"0.%dg", _decPlaces]]; else [fString appendString: [NSString stringWithFormat: @"0.%df", _decPlaces]]; rString = [NSString stringWithFormat: fString, (double) _fValue]; [fString release]; break; } return rString; } -(void) inc { [self addInt: 1]; } -(void) dec { [self addInt: -1]; } //accessors -(int) type { return _type; } -(int) decPlaces { return _decPlaces; } -(float) floatValue { return _fValue; } -(int) intValue { return _iValue; } -(void) setInt: (int) value { _iValue = value; _type = INTTYPE; } -(void) setFloat: (float) value { _fValue = value; _type = FLOATTYPE; _decPlaces = 4; _exp = 0; } -(void) setFloat: (float) what decPlaces: (int) howMany { _fValue = what; _type = FLOATTYPE; _decPlaces = howMany; _exp = 0; } @end gtamsanalyzer.app-0.42/Source/NSRecordData.h0000555000175000017500000000056710162465511021241 0ustar brentbrent00000000000000// // NSRecordData.h // TamsAnalyzer // // Created by matthew on Mon Apr 29 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import @interface NSRecordData : NSMutableData { unsigned mlength; } -(void)addString: (NSString *) what; -(void)addChar: (char ) ch; -(void)addTab; -(void)addNL; //-(unsigned) length; @end gtamsanalyzer.app-0.42/Source/NSRecordData.m0000555000175000017500000000137310162465511021242 0ustar brentbrent00000000000000// // NSRecordData.m // TamsAnalyzer // // Created by matthew on Mon Apr 29 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "NSRecordData.h" @implementation NSRecordData -(void)addString: (NSString *) what { mlength+= [what cStringLength]; // [self setLength: mlength]; [self appendBytes: [what cString] length: [what cStringLength]]; } //-(unsigned) mlength {return mlength;} -(id) init { [super init]; mlength = 0; return self; } -(void)addChar: (char ) ch; { char ss[2]; ss[0] = ch; ss[1] = '\0'; mlength++; //[self increaseLengthBy: 1]; [self appendBytes: ss length: 1]; } -(void)addTab { [self addChar: '\t']; } -(void) addNL { [self addChar: '\n']; } @end gtamsanalyzer.app-0.42/Source/obj0000777000175000017500000000000010162465472021466 2./shared_objustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/pcre.c0000555000175000017500000076312710162465511017724 0ustar brentbrent00000000000000#define SUPPORT_UTF8 /************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2003 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* Define DEBUG to get debugging output on stdout. */ /* #define DEBUG */ /* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef inline, and there are *still* stupid compilers about that don't like indented pre-processor statements. I suppose it's only been 10 years... */ #ifdef DEBUG #define DPRINTF(p) printf p #else #define DPRINTF(p) /*nothing*/ #endif /* Include the internals header, which itself includes "config.h", the Standard C headers, and the external pcre header. */ #include "internal.h" /* Allow compilation as C++ source code, should anybody want to do that. */ #ifdef __cplusplus #define class pcre_class #endif /* Maximum number of items on the nested bracket stacks at compile time. This applies to the nesting of all kinds of parentheses. It does not limit un-nested, non-capturing parentheses. This number can be made bigger if necessary - it is used to dimension one int and one unsigned char vector at compile time. */ #define BRASTACK_SIZE 200 /* Maximum number of ints of offset to save on the stack for recursive calls. If the offset vector is bigger, malloc is used. This should be a multiple of 3, because the offset vector is always a multiple of 3 long. */ #define REC_STACK_SAVE_MAX 30 /* The number of bytes in a literal character string above which we can't add any more is set at 250 in order to allow for UTF-8 characters. (In theory it could be 255 when UTF-8 support is excluded, but that means that some of the test output would be different, which just complicates things.) */ #define MAXLIT 250 /* The maximum remaining length of subject we are prepared to search for a req_byte match. */ #define REQ_BYTE_MAX 1000 /* Table of sizes for the fixed-length opcodes. It's defined in a macro so that the definition is next to the definition of the opcodes in internal.h. */ static const uschar OP_lengths[] = { OP_LENGTHS }; /* Min and max values for the common repeats; for the maxima, 0 => infinity */ static const char rep_min[] = { 0, 0, 1, 1, 0, 0 }; static const char rep_max[] = { 0, 0, 0, 0, 1, 1 }; /* Table for handling escaped characters in the range '0'-'z'. Positive returns are simple data values; negative values are for special things like \d and so on. Zero means further processing is needed (for things like \x), or the escape is invalid. */ #if !EBCDIC /* This is the "normal" table for ASCII systems */ static const short int escapes[] = { 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */ 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */ '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E, 0, -ESC_G, /* @ - G */ 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ 0, -ESC_Q, 0, -ESC_S, 0, 0, 0, -ESC_W, /* P - W */ 0, 0, -ESC_Z, '[', '\\', ']', '^', '_', /* X - _ */ '`', 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, /* ` - g */ 0, 0, 0, 0, 0, 0, ESC_n, 0, /* h - o */ 0, 0, ESC_r, -ESC_s, ESC_tee, 0, 0, -ESC_w, /* p - w */ 0, 0, -ESC_z /* x - z */ }; #else /* This is the "abnormal" table for EBCDIC systems */ static const short int escapes[] = { /* 48 */ 0, 0, 0, '.', '<', '(', '+', '|', /* 50 */ '&', 0, 0, 0, 0, 0, 0, 0, /* 58 */ 0, 0, '!', '$', '*', ')', ';', '~', /* 60 */ '-', '/', 0, 0, 0, 0, 0, 0, /* 68 */ 0, 0, '|', ',', '%', '_', '>', '?', /* 70 */ 0, 0, 0, 0, 0, 0, 0, 0, /* 78 */ 0, '`', ':', '#', '@', '\'', '=', '"', /* 80 */ 0, 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, /* 88 */ 0, 0, 0, '{', 0, 0, 0, 0, /* 90 */ 0, 0, 0, 'l', 0, ESC_n, 0, 0, /* 98 */ 0, ESC_r, 0, '}', 0, 0, 0, 0, /* A0 */ 0, '~', -ESC_s, ESC_tee, 0, 0, -ESC_w, 0, /* A8 */ 0,-ESC_z, 0, 0, 0, '[', 0, 0, /* B0 */ 0, 0, 0, 0, 0, 0, 0, 0, /* B8 */ 0, 0, 0, 0, 0, ']', '=', '-', /* C0 */ '{',-ESC_A, -ESC_B, -ESC_C, -ESC_D,-ESC_E, 0, -ESC_G, /* C8 */ 0, 0, 0, 0, 0, 0, 0, 0, /* D0 */ '}', 0, 0, 0, 0, 0, 0, 0, /* D8 */-ESC_Q, 0, 0, 0, 0, 0, 0, 0, /* E0 */ '\\', 0, -ESC_S, 0, 0, 0, -ESC_W, 0, /* E8 */ 0,-ESC_Z, 0, 0, 0, 0, 0, 0, /* F0 */ 0, 0, 0, 0, 0, 0, 0, 0, /* F8 */ 0, 0, 0, 0, 0, 0, 0, 0 }; #endif /* Tables of names of POSIX character classes and their lengths. The list is terminated by a zero length entry. The first three must be alpha, upper, lower, as this is assumed for handling case independence. */ static const char *const posix_names[] = { "alpha", "lower", "upper", "alnum", "ascii", "blank", "cntrl", "digit", "graph", "print", "punct", "space", "word", "xdigit" }; static const uschar posix_name_lengths[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; /* Table of class bit maps for each POSIX class; up to three may be combined to form the class. The table for [:blank:] is dynamically modified to remove the vertical space characters. */ static const int posix_class_maps[] = { cbit_lower, cbit_upper, -1, /* alpha */ cbit_lower, -1, -1, /* lower */ cbit_upper, -1, -1, /* upper */ cbit_digit, cbit_lower, cbit_upper, /* alnum */ cbit_print, cbit_cntrl, -1, /* ascii */ cbit_space, -1, -1, /* blank - a GNU extension */ cbit_cntrl, -1, -1, /* cntrl */ cbit_digit, -1, -1, /* digit */ cbit_graph, -1, -1, /* graph */ cbit_print, -1, -1, /* print */ cbit_punct, -1, -1, /* punct */ cbit_space, -1, -1, /* space */ cbit_word, -1, -1, /* word - a Perl extension */ cbit_xdigit,-1, -1 /* xdigit */ }; /* Table to identify digits and hex digits. This is used when compiling patterns. Note that the tables in chartables are dependent on the locale, and may mark arbitrary characters as digits - but the PCRE compiling code expects to handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have a private table here. It costs 256 bytes, but it is a lot faster than doing character value tests (at least in some simple cases I timed), and in some applications one wants PCRE to compile efficiently as well as match efficiently. For convenience, we use the same bit definitions as in chartables: 0x04 decimal digit 0x08 hexadecimal digit Then we can use ctype_digit and ctype_xdigit in the code. */ #if !EBCDIC /* This is the "normal" case, for ASCII systems */ static const unsigned char digitab[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - ' */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ( - / */ 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 */ 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /* 8 - ? */ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* @ - G */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H - O */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* P - W */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* X - _ */ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* ` - g */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h - o */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* p - w */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* x -127 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ #else /* This is the "abnormal" case, for EBCDIC systems */ static const unsigned char digitab[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 10 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32- 39 20 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 30 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 40 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 72- | */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 50 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 88- */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 60 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 104- ? */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 70 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* 128- g 80 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144- p 90 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160- x A0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 B0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* { - G C0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* } - P D0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* \ - X E0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 F0 */ 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ static const unsigned char ebcdic_chartab[] = { /* chartable partial dup */ 0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 0- 7 */ 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 16- 23 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 32- 39 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 */ 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80, /* 72- | */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 */ 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, /* 88- */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 */ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80, /* 104- ? */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* 128- g */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* 144- p */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* 160- x */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 */ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x80,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* { - G */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* } - P */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* \ - X */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ #endif /* Definition to allow mutual recursion */ static BOOL compile_regex(int, int, int *, uschar **, const uschar **, const char **, BOOL, int, int *, int *, branch_chain *, compile_data *); /* Structure for building a chain of data that actually lives on the stack, for holding the values of the subject pointer at the start of each subpattern, so as to detect when an empty string has been matched by a subpattern - to break infinite loops. When NO_RECURSE is set, these blocks are on the heap, not on the stack. */ typedef struct eptrblock { struct eptrblock *epb_prev; const uschar *epb_saved_eptr; } eptrblock; /* Flag bits for the match() function */ #define match_condassert 0x01 /* Called to check a condition assertion */ #define match_isgroup 0x02 /* Set if start of bracketed group */ /* Non-error returns from the match() function. Error returns are externally defined PCRE_ERROR_xxx codes, which are all negative. */ #define MATCH_MATCH 1 #define MATCH_NOMATCH 0 /************************************************* * Global variables * *************************************************/ /* PCRE is thread-clean and doesn't use any global variables in the normal sense. However, it calls memory allocation and free functions via the four indirections below, and it can optionally do callouts. These values can be changed by the caller, but are shared between all threads. However, when compiling for Virtual Pascal, things are done differently (see pcre.in). */ #ifndef VPCOMPAT #ifdef __cplusplus extern "C" void *(*pcre_malloc)(size_t) = malloc; extern "C" void (*pcre_free)(void *) = free; extern "C" void *(*pcre_stack_malloc)(size_t) = malloc; extern "C" void (*pcre_stack_free)(void *) = free; extern "C" int (*pcre_callout)(pcre_callout_block *) = NULL; #else void *(*pcre_malloc)(size_t) = malloc; void (*pcre_free)(void *) = free; void *(*pcre_stack_malloc)(size_t) = malloc; void (*pcre_stack_free)(void *) = free; int (*pcre_callout)(pcre_callout_block *) = NULL; #endif #endif /************************************************* * Macros and tables for character handling * *************************************************/ /* When UTF-8 encoding is being used, a character is no longer just a single byte. The macros for character handling generate simple sequences when used in byte-mode, and more complicated ones for UTF-8 characters. */ #ifndef SUPPORT_UTF8 #define GETCHAR(c, eptr) c = *eptr; #define GETCHARINC(c, eptr) c = *eptr++; #define GETCHARINCTEST(c, eptr) c = *eptr++; #define GETCHARLEN(c, eptr, len) c = *eptr; #define BACKCHAR(eptr) #else /* SUPPORT_UTF8 */ /* Get the next UTF-8 character, not advancing the pointer. This is called when we know we are in UTF-8 mode. */ #define GETCHAR(c, eptr) \ c = *eptr; \ if ((c & 0xc0) == 0xc0) \ { \ int gcii; \ int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ int gcss = 6*gcaa; \ c = (c & utf8_table3[gcaa]) << gcss; \ for (gcii = 1; gcii <= gcaa; gcii++) \ { \ gcss -= 6; \ c |= (eptr[gcii] & 0x3f) << gcss; \ } \ } /* Get the next UTF-8 character, advancing the pointer. This is called when we know we are in UTF-8 mode. */ #define GETCHARINC(c, eptr) \ c = *eptr++; \ if ((c & 0xc0) == 0xc0) \ { \ int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ int gcss = 6*gcaa; \ c = (c & utf8_table3[gcaa]) << gcss; \ while (gcaa-- > 0) \ { \ gcss -= 6; \ c |= (*eptr++ & 0x3f) << gcss; \ } \ } /* Get the next character, testing for UTF-8 mode, and advancing the pointer */ #define GETCHARINCTEST(c, eptr) \ c = *eptr++; \ if (md->utf8 && (c & 0xc0) == 0xc0) \ { \ int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ int gcss = 6*gcaa; \ c = (c & utf8_table3[gcaa]) << gcss; \ while (gcaa-- > 0) \ { \ gcss -= 6; \ c |= (*eptr++ & 0x3f) << gcss; \ } \ } /* Get the next UTF-8 character, not advancing the pointer, incrementing length if there are extra bytes. This is called when we know we are in UTF-8 mode. */ #define GETCHARLEN(c, eptr, len) \ c = *eptr; \ if ((c & 0xc0) == 0xc0) \ { \ int gcii; \ int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ int gcss = 6*gcaa; \ c = (c & utf8_table3[gcaa]) << gcss; \ for (gcii = 1; gcii <= gcaa; gcii++) \ { \ gcss -= 6; \ c |= (eptr[gcii] & 0x3f) << gcss; \ } \ len += gcaa; \ } /* If the pointer is not at the start of a character, move it back until it is. Called only in UTF-8 mode. */ #define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--; #endif /************************************************* * Default character tables * *************************************************/ /* A default set of character tables is included in the PCRE binary. Its source is built by the maketables auxiliary program, which uses the default C ctypes functions, and put in the file chartables.c. These tables are used by PCRE whenever the caller of pcre_compile() does not provide an alternate set of tables. */ #include "chartables.c" #ifdef SUPPORT_UTF8 /************************************************* * Tables for UTF-8 support * *************************************************/ /* These are the breakpoints for different numbers of bytes in a UTF-8 character. */ static const int utf8_table1[] = { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff}; /* These are the indicator bits and the mask for the data bits to set in the first byte of a character, indexed by the number of additional bytes. */ static const int utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; static const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; /* Table of the number of extra characters, indexed by the first character masked with 0x3f. The highest number for a valid UTF-8 character is in fact 0x3d. */ static const uschar utf8_table4[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; /************************************************* * Convert character value to UTF-8 * *************************************************/ /* This function takes an integer value in the range 0 - 0x7fffffff and encodes it as a UTF-8 character in 0 to 6 bytes. Arguments: cvalue the character value buffer pointer to buffer for result - at least 6 bytes long Returns: number of characters placed in the buffer */ static int ord2utf8(int cvalue, uschar *buffer) { register int i, j; for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) if (cvalue <= utf8_table1[i]) break; buffer += i; for (j = i; j > 0; j--) { *buffer-- = 0x80 | (cvalue & 0x3f); cvalue >>= 6; } *buffer = utf8_table2[i] | cvalue; return i + 1; } #endif /************************************************* * Print compiled regex * *************************************************/ /* The code for doing this is held in a separate file that is also included in pcretest.c. It defines a function called print_internals(). */ #ifdef DEBUG #include "printint.c" #endif /************************************************* * Return version string * *************************************************/ #define STRING(a) # a #define XSTRING(s) STRING(s) EXPORT const char * pcre_version(void) { return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE); } /************************************************* * (Obsolete) Return info about compiled pattern * *************************************************/ /* This is the original "info" function. It picks potentially useful data out of the private structure, but its interface was too rigid. It remains for backwards compatibility. The public options are passed back in an int - though the re->options field has been expanded to a long int, all the public options at the low end of it, and so even on 16-bit systems this will still be OK. Therefore, I haven't changed the API for pcre_info(). Arguments: external_re points to compiled code optptr where to pass back the options first_byte where to pass back the first character, or -1 if multiline and all branches start ^, or -2 otherwise Returns: number of capturing subpatterns or negative values on error */ EXPORT int pcre_info(const pcre *external_re, int *optptr, int *first_byte) { const real_pcre *re = (const real_pcre *)external_re; if (re == NULL) return PCRE_ERROR_NULL; if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS); if (first_byte != NULL) *first_byte = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte : ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; return re->top_bracket; } /************************************************* * Return info about compiled pattern * *************************************************/ /* This is a newer "info" function which has an extensible interface so that additional items can be added compatibly. Arguments: external_re points to compiled code extra_data points extra data, or NULL what what information is required where where to put the information Returns: 0 if data returned, negative on error */ EXPORT int pcre_fullinfo(const pcre *external_re, const pcre_extra *extra_data, int what, void *where) { const real_pcre *re = (const real_pcre *)external_re; const pcre_study_data *study = NULL; if (re == NULL || where == NULL) return PCRE_ERROR_NULL; if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0) study = (const pcre_study_data *)extra_data->study_data; switch (what) { case PCRE_INFO_OPTIONS: *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS; break; case PCRE_INFO_SIZE: *((size_t *)where) = re->size; break; case PCRE_INFO_STUDYSIZE: *((size_t *)where) = (study == NULL)? 0 : study->size; break; case PCRE_INFO_CAPTURECOUNT: *((int *)where) = re->top_bracket; break; case PCRE_INFO_BACKREFMAX: *((int *)where) = re->top_backref; break; case PCRE_INFO_FIRSTBYTE: *((int *)where) = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte : ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; break; case PCRE_INFO_FIRSTTABLE: *((const uschar **)where) = (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)? study->start_bits : NULL; break; case PCRE_INFO_LASTLITERAL: *((int *)where) = ((re->options & PCRE_REQCHSET) != 0)? re->req_byte : -1; break; case PCRE_INFO_NAMEENTRYSIZE: *((int *)where) = re->name_entry_size; break; case PCRE_INFO_NAMECOUNT: *((int *)where) = re->name_count; break; case PCRE_INFO_NAMETABLE: *((const uschar **)where) = (const uschar *)re + sizeof(real_pcre); break; default: return PCRE_ERROR_BADOPTION; } return 0; } /************************************************* * Return info about what features are configured * *************************************************/ /* This is function which has an extensible interface so that additional items can be added compatibly. Arguments: what what information is required where where to put the information Returns: 0 if data returned, negative on error */ EXPORT int pcre_config(int what, void *where) { switch (what) { case PCRE_CONFIG_UTF8: #ifdef SUPPORT_UTF8 *((int *)where) = 1; #else *((int *)where) = 0; #endif break; case PCRE_CONFIG_NEWLINE: *((int *)where) = NEWLINE; break; case PCRE_CONFIG_LINK_SIZE: *((int *)where) = LINK_SIZE; break; case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD: *((int *)where) = POSIX_MALLOC_THRESHOLD; break; case PCRE_CONFIG_MATCH_LIMIT: *((unsigned int *)where) = MATCH_LIMIT; break; case PCRE_CONFIG_STACKRECURSE: #ifdef NO_RECURSE *((int *)where) = 0; #else *((int *)where) = 1; #endif break; default: return PCRE_ERROR_BADOPTION; } return 0; } #ifdef DEBUG /************************************************* * Debugging function to print chars * *************************************************/ /* Print a sequence of chars in printable format, stopping at the end of the subject if the requested. Arguments: p points to characters length number to print is_subject TRUE if printing from within md->start_subject md pointer to matching data block, if is_subject is TRUE Returns: nothing */ static void pchars(const uschar *p, int length, BOOL is_subject, match_data *md) { int c; if (is_subject && length > md->end_subject - p) length = md->end_subject - p; while (length-- > 0) if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c); } #endif /************************************************* * Handle escapes * *************************************************/ /* This function is called when a \ has been encountered. It either returns a positive value for a simple escape such as \n, or a negative value which encodes one of the more complicated things such as \d. When UTF-8 is enabled, a positive value greater than 255 may be returned. On entry, ptr is pointing at the \. On exit, it is on the final character of the escape sequence. Arguments: ptrptr points to the pattern position pointer errorptr points to the pointer to the error message bracount number of previous extracting brackets options the options bits isclass TRUE if inside a character class Returns: zero or positive => a data character negative => a special escape sequence on error, errorptr is set */ static int check_escape(const uschar **ptrptr, const char **errorptr, int bracount, int options, BOOL isclass) { const uschar *ptr = *ptrptr; int c, i; /* If backslash is at the end of the pattern, it's an error. */ c = *(++ptr); if (c == 0) *errorptr = ERR1; /* Non-alphamerics are literals. For digits or letters, do an initial lookup in a table. A non-zero result is something that can be returned immediately. Otherwise further processing may be required. */ #if !EBCDIC /* ASCII coding */ else if (c < '0' || c > 'z') {} /* Not alphameric */ else if ((i = escapes[c - '0']) != 0) c = i; #else /* EBCDIC coding */ else if (c < 'a' || (ebcdic_chartab[c] & 0x0E) == 0) {} /* Not alphameric */ else if ((i = escapes[c - 0x48]) != 0) c = i; #endif /* Escapes that need further processing, or are illegal. */ else { const uschar *oldptr; switch (c) { /* A number of Perl escapes are not handled by PCRE. We give an explicit error. */ case 'l': case 'L': case 'N': case 'p': case 'P': case 'u': case 'U': case 'X': *errorptr = ERR37; break; /* The handling of escape sequences consisting of a string of digits starting with one that is not zero is not straightforward. By experiment, the way Perl works seems to be as follows: Outside a character class, the digits are read as a decimal number. If the number is less than 10, or if there are that many previous extracting left brackets, then it is a back reference. Otherwise, up to three octal digits are read to form an escaped byte. Thus \123 is likely to be octal 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal value is greater than 377, the least significant 8 bits are taken. Inside a character class, \ followed by a digit is always an octal number. */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (!isclass) { oldptr = ptr; c -= '0'; while ((digitab[ptr[1]] & ctype_digit) != 0) c = c * 10 + *(++ptr) - '0'; if (c < 10 || c <= bracount) { c = -(ESC_REF + c); break; } ptr = oldptr; /* Put the pointer back and fall through */ } /* Handle an octal number following \. If the first digit is 8 or 9, Perl generates a binary zero byte and treats the digit as a following literal. Thus we have to pull back the pointer by one. */ if ((c = *ptr) >= '8') { ptr--; c = 0; break; } /* \0 always starts an octal number, but we may drop through to here with a larger first octal digit. */ case '0': c -= '0'; while(i++ < 2 && ptr[1] >= '0' && ptr[1] <= '7') c = c * 8 + *(++ptr) - '0'; c &= 255; /* Take least significant 8 bits */ break; /* \x is complicated when UTF-8 is enabled. \x{ddd} is a character number which can be greater than 0xff, but only if the ddd are hex digits. */ case 'x': #ifdef SUPPORT_UTF8 if (ptr[1] == '{' && (options & PCRE_UTF8) != 0) { const uschar *pt = ptr + 2; register int count = 0; c = 0; while ((digitab[*pt] & ctype_xdigit) != 0) { int cc = *pt++; count++; #if !EBCDIC /* ASCII coding */ if (cc >= 'a') cc -= 32; /* Convert to upper case */ c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10)); #else /* EBCDIC coding */ if (cc >= 'a' && cc <= 'z') cc += 64; /* Convert to upper case */ c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10)); #endif } if (*pt == '}') { if (c < 0 || count > 8) *errorptr = ERR34; ptr = pt; break; } /* If the sequence of hex digits does not end with '}', then we don't recognize this construct; fall through to the normal \x handling. */ } #endif /* Read just a single hex char */ c = 0; while (i++ < 2 && (digitab[ptr[1]] & ctype_xdigit) != 0) { int cc; /* Some compilers don't like ++ */ cc = *(++ptr); /* in initializers */ #if !EBCDIC /* ASCII coding */ if (cc >= 'a') cc -= 32; /* Convert to upper case */ c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10)); #else /* EBCDIC coding */ if (cc <= 'z') cc += 64; /* Convert to upper case */ c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10)); #endif } break; /* Other special escapes not starting with a digit are straightforward */ case 'c': c = *(++ptr); if (c == 0) { *errorptr = ERR2; return 0; } /* A letter is upper-cased; then the 0x40 bit is flipped. This coding is ASCII-specific, but then the whole concept of \cx is ASCII-specific. (However, an EBCDIC equivalent has now been added.) */ #if !EBCDIC /* ASCII coding */ if (c >= 'a' && c <= 'z') c -= 32; c ^= 0x40; #else /* EBCDIC coding */ if (c >= 'a' && c <= 'z') c += 64; c ^= 0xC0; #endif break; /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any other alphameric following \ is an error if PCRE_EXTRA was set; otherwise, for Perl compatibility, it is a literal. This code looks a bit odd, but there used to be some cases other than the default, and there may be again in future, so I haven't "optimized" it. */ default: if ((options & PCRE_EXTRA) != 0) switch(c) { default: *errorptr = ERR3; break; } break; } } *ptrptr = ptr; return c; } /************************************************* * Check for counted repeat * *************************************************/ /* This function is called when a '{' is encountered in a place where it might start a quantifier. It looks ahead to see if it really is a quantifier or not. It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd} where the ddds are digits. Arguments: p pointer to the first char after '{' Returns: TRUE or FALSE */ static BOOL is_counted_repeat(const uschar *p) { if ((digitab[*p++] & ctype_digit) == 0) return FALSE; while ((digitab[*p] & ctype_digit) != 0) p++; if (*p == '}') return TRUE; if (*p++ != ',') return FALSE; if (*p == '}') return TRUE; if ((digitab[*p++] & ctype_digit) == 0) return FALSE; while ((digitab[*p] & ctype_digit) != 0) p++; return (*p == '}'); } /************************************************* * Read repeat counts * *************************************************/ /* Read an item of the form {n,m} and return the values. This is called only after is_counted_repeat() has confirmed that a repeat-count quantifier exists, so the syntax is guaranteed to be correct, but we need to check the values. Arguments: p pointer to first char after '{' minp pointer to int for min maxp pointer to int for max returned as -1 if no max errorptr points to pointer to error message Returns: pointer to '}' on success; current ptr on error, with errorptr set */ static const uschar * read_repeat_counts(const uschar *p, int *minp, int *maxp, const char **errorptr) { int min = 0; int max = -1; while ((digitab[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0'; if (*p == '}') max = min; else { if (*(++p) != '}') { max = 0; while((digitab[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0'; if (max < min) { *errorptr = ERR4; return p; } } } /* Do paranoid checks, then fill in the required variables, and pass back the pointer to the terminating '}'. */ if (min > 65535 || max > 65535) *errorptr = ERR5; else { *minp = min; *maxp = max; } return p; } /************************************************* * Find first significant op code * *************************************************/ /* This is called by several functions that scan a compiled expression looking for a fixed first character, or an anchoring op code etc. It skips over things that do not influence this. For some calls, a change of option is important. Arguments: code pointer to the start of the group options pointer to external options optbit the option bit whose changing is significant, or zero if none are Returns: pointer to the first significant opcode */ static const uschar* first_significant_code(const uschar *code, int *options, int optbit) { for (;;) { switch ((int)*code) { case OP_OPT: if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit)) *options = (int)code[1]; code += 2; break; case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do code += GET(code, 1); while (*code == OP_ALT); /* Fall through */ case OP_CALLOUT: case OP_CREF: case OP_BRANUMBER: case OP_WORD_BOUNDARY: case OP_NOT_WORD_BOUNDARY: code += OP_lengths[*code]; break; default: return code; } } /* Control never reaches here */ } /************************************************* * Find the fixed length of a pattern * *************************************************/ /* Scan a pattern and compute the fixed length of subject that will match it, if the length is fixed. This is needed for dealing with backward assertions. In UTF8 mode, the result is in characters rather than bytes. Arguments: code points to the start of the pattern (the bracket) options the compiling options Returns: the fixed length, or -1 if there is no fixed length, or -2 if \C was encountered */ static int find_fixedlength(uschar *code, int options) { int length = -1; register int branchlength = 0; register uschar *cc = code + 1 + LINK_SIZE; /* Scan along the opcodes for this branch. If we get to the end of the branch, check the length against that of the other branches. */ for (;;) { int d; register int op = *cc; if (op >= OP_BRA) op = OP_BRA; switch (op) { case OP_BRA: case OP_ONCE: case OP_COND: d = find_fixedlength(cc, options); if (d < 0) return d; branchlength += d; do cc += GET(cc, 1); while (*cc == OP_ALT); cc += 1 + LINK_SIZE; break; /* Reached end of a branch; if it's a ket it is the end of a nested call. If it's ALT it is an alternation in a nested call. If it is END it's the end of the outer call. All can be handled by the same code. */ case OP_ALT: case OP_KET: case OP_KETRMAX: case OP_KETRMIN: case OP_END: if (length < 0) length = branchlength; else if (length != branchlength) return -1; if (*cc != OP_ALT) return length; cc += 1 + LINK_SIZE; branchlength = 0; break; /* Skip over assertive subpatterns */ case OP_ASSERT: case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do cc += GET(cc, 1); while (*cc == OP_ALT); /* Fall through */ /* Skip over things that don't match chars */ case OP_REVERSE: case OP_BRANUMBER: case OP_CREF: case OP_OPT: case OP_CALLOUT: case OP_SOD: case OP_SOM: case OP_EOD: case OP_EODN: case OP_CIRC: case OP_DOLL: case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: cc += OP_lengths[*cc]; break; /* Handle char strings. In UTF-8 mode we must count characters, not bytes. This requires a scan of the string, unfortunately. We assume valid UTF-8 strings, so all we do is reduce the length by one for every byte whose bits are 10xxxxxx. */ case OP_CHARS: branchlength += *(++cc); #ifdef SUPPORT_UTF8 if ((options & PCRE_UTF8) != 0) for (d = 1; d <= *cc; d++) if ((cc[d] & 0xc0) == 0x80) branchlength--; #endif cc += *cc + 1; break; /* Handle exact repetitions. The count is already in characters, but we need to skip over a multibyte character in UTF8 mode. */ case OP_EXACT: branchlength += GET2(cc,1); cc += 4; #ifdef SUPPORT_UTF8 if ((options & PCRE_UTF8) != 0) { while((*cc & 0x80) == 0x80) cc++; } #endif break; case OP_TYPEEXACT: branchlength += GET2(cc,1); cc += 4; break; /* Handle single-char matchers */ case OP_NOT_DIGIT: case OP_DIGIT: case OP_NOT_WHITESPACE: case OP_WHITESPACE: case OP_NOT_WORDCHAR: case OP_WORDCHAR: case OP_ANY: branchlength++; cc++; break; /* The single-byte matcher isn't allowed */ case OP_ANYBYTE: return -2; /* Check a class for variable quantification */ #ifdef SUPPORT_UTF8 case OP_XCLASS: cc += GET(cc, 1) - 33; /* Fall through */ #endif case OP_CLASS: case OP_NCLASS: cc += 33; switch (*cc) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: return -1; case OP_CRRANGE: case OP_CRMINRANGE: if (GET2(cc,1) != GET2(cc,3)) return -1; branchlength += GET2(cc,1); cc += 5; break; default: branchlength++; } break; /* Anything else is variable length */ default: return -1; } } /* Control never gets here */ } /************************************************* * Scan compiled regex for numbered bracket * *************************************************/ /* This little function scans through a compiled pattern until it finds a capturing bracket with the given number. Arguments: code points to start of expression utf8 TRUE in UTF-8 mode number the required bracket number Returns: pointer to the opcode for the bracket, or NULL if not found */ static const uschar * find_bracket(const uschar *code, BOOL utf8, int number) { #ifndef SUPPORT_UTF8 utf8 = utf8; /* Stop pedantic compilers complaining */ #endif for (;;) { register int c = *code; if (c == OP_END) return NULL; else if (c == OP_CHARS) code += code[1] + OP_lengths[c]; else if (c > OP_BRA) { int n = c - OP_BRA; if (n > EXTRACT_BASIC_MAX) n = GET2(code, 2+LINK_SIZE); if (n == number) return (uschar *)code; code += OP_lengths[OP_BRA]; } else { code += OP_lengths[c]; #ifdef SUPPORT_UTF8 /* In UTF-8 mode, opcodes that are followed by a character may be followed by a multi-byte character. The length in the table is a minimum, so we have to scan along to skip the extra characters. All opcodes are less than 128, so we can use relatively efficient code. */ if (utf8) switch(c) { case OP_EXACT: case OP_UPTO: case OP_MINUPTO: case OP_STAR: case OP_MINSTAR: case OP_PLUS: case OP_MINPLUS: case OP_QUERY: case OP_MINQUERY: while ((*code & 0xc0) == 0x80) code++; break; /* XCLASS is used for classes that cannot be represented just by a bit map. This includes negated single high-valued characters. The length in the table is zero; the actual length is stored in the compled code. */ case OP_XCLASS: code += GET(code, 1) + 1; break; } #endif } } } /************************************************* * Scan compiled regex for recursion reference * *************************************************/ /* This little function scans through a compiled pattern until it finds an instance of OP_RECURSE. Arguments: code points to start of expression utf8 TRUE in UTF-8 mode Returns: pointer to the opcode for OP_RECURSE, or NULL if not found */ static const uschar * find_recurse(const uschar *code, BOOL utf8) { #ifndef SUPPORT_UTF8 utf8 = utf8; /* Stop pedantic compilers complaining */ #endif for (;;) { register int c = *code; if (c == OP_END) return NULL; else if (c == OP_RECURSE) return code; else if (c == OP_CHARS) code += code[1] + OP_lengths[c]; else if (c > OP_BRA) { code += OP_lengths[OP_BRA]; } else { code += OP_lengths[c]; #ifdef SUPPORT_UTF8 /* In UTF-8 mode, opcodes that are followed by a character may be followed by a multi-byte character. The length in the table is a minimum, so we have to scan along to skip the extra characters. All opcodes are less than 128, so we can use relatively efficient code. */ if (utf8) switch(c) { case OP_EXACT: case OP_UPTO: case OP_MINUPTO: case OP_STAR: case OP_MINSTAR: case OP_PLUS: case OP_MINPLUS: case OP_QUERY: case OP_MINQUERY: while ((*code & 0xc0) == 0x80) code++; break; /* XCLASS is used for classes that cannot be represented just by a bit map. This includes negated single high-valued characters. The length in the table is zero; the actual length is stored in the compled code. */ case OP_XCLASS: code += GET(code, 1) + 1; break; } #endif } } } /************************************************* * Scan compiled branch for non-emptiness * *************************************************/ /* This function scans through a branch of a compiled pattern to see whether it can match the empty string or not. It is called only from could_be_empty() below. Note that first_significant_code() skips over assertions. If we hit an unclosed bracket, we return "empty" - this means we've struck an inner bracket whose current branch will already have been scanned. Arguments: code points to start of search endcode points to where to stop utf8 TRUE if in UTF8 mode Returns: TRUE if what is matched could be empty */ static BOOL could_be_empty_branch(const uschar *code, const uschar *endcode, BOOL utf8) { register int c; for (code = first_significant_code(code + 1 + LINK_SIZE, NULL, 0); code < endcode; code = first_significant_code(code + OP_lengths[c], NULL, 0)) { const uschar *ccode; c = *code; if (c >= OP_BRA) { BOOL empty_branch; if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */ /* Scan a closed bracket */ empty_branch = FALSE; do { if (!empty_branch && could_be_empty_branch(code, endcode, utf8)) empty_branch = TRUE; code += GET(code, 1); } while (*code == OP_ALT); if (!empty_branch) return FALSE; /* All branches are non-empty */ code += 1 + LINK_SIZE; c = *code; } else switch (c) { /* Check for quantifiers after a class */ #ifdef SUPPORT_UTF8 case OP_XCLASS: ccode = code + GET(code, 1); goto CHECK_CLASS_REPEAT; #endif case OP_CLASS: case OP_NCLASS: ccode = code + 33; #ifdef SUPPORT_UTF8 CHECK_CLASS_REPEAT: #endif switch (*ccode) { case OP_CRSTAR: /* These could be empty; continue */ case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: break; default: /* Non-repeat => class must match */ case OP_CRPLUS: /* These repeats aren't empty */ case OP_CRMINPLUS: return FALSE; case OP_CRRANGE: case OP_CRMINRANGE: if (GET2(ccode, 1) > 0) return FALSE; /* Minimum > 0 */ break; } break; /* Opcodes that must match a character */ case OP_NOT_DIGIT: case OP_DIGIT: case OP_NOT_WHITESPACE: case OP_WHITESPACE: case OP_NOT_WORDCHAR: case OP_WORDCHAR: case OP_ANY: case OP_ANYBYTE: case OP_CHARS: case OP_NOT: case OP_PLUS: case OP_MINPLUS: case OP_EXACT: case OP_NOTPLUS: case OP_NOTMINPLUS: case OP_NOTEXACT: case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEEXACT: return FALSE; /* End of branch */ case OP_KET: case OP_KETRMAX: case OP_KETRMIN: case OP_ALT: return TRUE; /* In UTF-8 mode, STAR, MINSTAR, QUERY, MINQUERY, UPTO, and MINUPTO may be followed by a multibyte character */ #ifdef SUPPORT_UTF8 case OP_STAR: case OP_MINSTAR: case OP_QUERY: case OP_MINQUERY: case OP_UPTO: case OP_MINUPTO: if (utf8) while ((code[2] & 0xc0) == 0x80) code++; break; #endif } } return TRUE; } /************************************************* * Scan compiled regex for non-emptiness * *************************************************/ /* This function is called to check for left recursive calls. We want to check the current branch of the current pattern to see if it could match the empty string. If it could, we must look outwards for branches at other levels, stopping when we pass beyond the bracket which is the subject of the recursion. Arguments: code points to start of the recursion endcode points to where to stop (current RECURSE item) bcptr points to the chain of current (unclosed) branch starts utf8 TRUE if in UTF-8 mode Returns: TRUE if what is matched could be empty */ static BOOL could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr, BOOL utf8) { while (bcptr != NULL && bcptr->current >= code) { if (!could_be_empty_branch(bcptr->current, endcode, utf8)) return FALSE; bcptr = bcptr->outer; } return TRUE; } /************************************************* * Check for POSIX class syntax * *************************************************/ /* This function is called when the sequence "[:" or "[." or "[=" is encountered in a character class. It checks whether this is followed by an optional ^ and then a sequence of letters, terminated by a matching ":]" or ".]" or "=]". Argument: ptr pointer to the initial [ endptr where to return the end pointer cd pointer to compile data Returns: TRUE or FALSE */ static BOOL check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd) { int terminator; /* Don't combine these lines; the Solaris cc */ terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */ if (*(++ptr) == '^') ptr++; while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++; if (*ptr == terminator && ptr[1] == ']') { *endptr = ptr; return TRUE; } return FALSE; } /************************************************* * Check POSIX class name * *************************************************/ /* This function is called to check the name given in a POSIX-style class entry such as [:alnum:]. Arguments: ptr points to the first letter len the length of the name Returns: a value representing the name, or -1 if unknown */ static int check_posix_name(const uschar *ptr, int len) { register int yield = 0; while (posix_name_lengths[yield] != 0) { if (len == posix_name_lengths[yield] && strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield; yield++; } return -1; } /************************************************* * Adjust OP_RECURSE items in repeated group * *************************************************/ /* OP_RECURSE items contain an offset from the start of the regex to the group that is referenced. This means that groups can be replicated for fixed repetition simply by copying (because the recursion is allowed to refer to earlier groups that are outside the current group). However, when a group is optional (i.e. the minimum quantifier is zero), OP_BRAZERO is inserted before it, after it has been compiled. This means that any OP_RECURSE items within it that refer to the group itself or any contained groups have to have their offsets adjusted. That is the job of this function. Before it is called, the partially compiled regex must be temporarily terminated with OP_END. Arguments: group points to the start of the group adjust the amount by which the group is to be moved utf8 TRUE in UTF-8 mode cd contains pointers to tables etc. Returns: nothing */ static void adjust_recurse(uschar *group, int adjust, BOOL utf8, compile_data *cd) { uschar *ptr = group; while ((ptr = (uschar *)find_recurse(ptr, utf8)) != NULL) { int offset = GET(ptr, 1); if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust); ptr += 1 + LINK_SIZE; } } /************************************************* * Compile one branch * *************************************************/ /* Scan the pattern, compiling it into the code vector. If the options are changed during the branch, the pointer is used to change the external options bits. Arguments: optionsptr pointer to the option bits brackets points to number of extracting brackets used code points to the pointer to the current code point ptrptr points to the current pattern pointer errorptr points to pointer to error message firstbyteptr set to initial literal character, or < 0 (REQ_UNSET, REQ_NONE) reqbyteptr set to the last literal character required, else < 0 bcptr points to current branch chain cd contains pointers to tables etc. Returns: TRUE on success FALSE, with *errorptr set on error */ static BOOL compile_branch(int *optionsptr, int *brackets, uschar **codeptr, const uschar **ptrptr, const char **errorptr, int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd) { int repeat_type, op_type; int repeat_min = 0, repeat_max = 0; /* To please picky compilers */ int bravalue = 0; int length; int greedy_default, greedy_non_default; int firstbyte, reqbyte; int zeroreqbyte, zerofirstbyte; int req_caseopt, reqvary, tempreqvary; int condcount = 0; int options = *optionsptr; register int c; register uschar *code = *codeptr; uschar *tempcode; BOOL inescq = FALSE; BOOL groupsetfirstbyte = FALSE; const uschar *ptr = *ptrptr; const uschar *tempptr; uschar *previous = NULL; uschar class[32]; #ifdef SUPPORT_UTF8 BOOL class_utf8; BOOL utf8 = (options & PCRE_UTF8) != 0; uschar *class_utf8data; uschar utf8_char[6]; #else BOOL utf8 = FALSE; #endif /* Set up the default and non-default settings for greediness */ greedy_default = ((options & PCRE_UNGREEDY) != 0); greedy_non_default = greedy_default ^ 1; /* Initialize no first char, no required char. REQ_UNSET means "no char matching encountered yet". It gets changed to REQ_NONE if we hit something that matches a non-fixed char first char; reqbyte just remains unset if we never find one. When we hit a repeat whose minimum is zero, we may have to adjust these values to take the zero repeat into account. This is implemented by setting them to zerofirstbyte and zeroreqbyte when such a repeat is encountered. The individual item types that can be repeated set these backoff variables appropriately. */ firstbyte = reqbyte = zerofirstbyte = zeroreqbyte = REQ_UNSET; /* The variable req_caseopt contains either the REQ_CASELESS value or zero, according to the current setting of the caseless flag. REQ_CASELESS is a bit value > 255. It is added into the firstbyte or reqbyte variables to record the case status of the value. */ req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0; /* Switch on next character until the end of the branch */ for (;; ptr++) { BOOL negate_class; BOOL possessive_quantifier; int class_charcount; int class_lastchar; int newoptions; int recno; int skipbytes; int subreqbyte; int subfirstbyte; c = *ptr; if (inescq && c != 0) goto NORMAL_CHAR; if ((options & PCRE_EXTENDED) != 0) { if ((cd->ctypes[c] & ctype_space) != 0) continue; if (c == '#') { /* The space before the ; is to avoid a warning on a silly compiler on the Macintosh. */ while ((c = *(++ptr)) != 0 && c != NEWLINE) ; if (c != 0) continue; /* Else fall through to handle end of string */ } } switch(c) { /* The branch terminates at end of string, |, or ). */ case 0: case '|': case ')': *firstbyteptr = firstbyte; *reqbyteptr = reqbyte; *codeptr = code; *ptrptr = ptr; return TRUE; /* Handle single-character metacharacters. In multiline mode, ^ disables the setting of any following char as a first character. */ case '^': if ((options & PCRE_MULTILINE) != 0) { if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; } previous = NULL; *code++ = OP_CIRC; break; case '$': previous = NULL; *code++ = OP_DOLL; break; /* There can never be a first char if '.' is first, whatever happens about repeats. The value of reqbyte doesn't change either. */ case '.': if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; zerofirstbyte = firstbyte; zeroreqbyte = reqbyte; previous = code; *code++ = OP_ANY; break; /* Character classes. If the included characters are all < 255 in value, we build a 32-byte bitmap of the permitted characters, except in the special case where there is only one such character. For negated classes, we build the map as usual, then invert it at the end. However, we use a different opcode so that data characters > 255 can be handled correctly. If the class contains characters outside the 0-255 range, a different opcode is compiled. It may optionally have a bit map for characters < 256, but those above are are explicitly listed afterwards. A flag byte tells whether the bitmap is present, and whether this is a negated class or not. */ case '[': previous = code; /* PCRE supports POSIX class stuff inside a class. Perl gives an error if they are encountered at the top level, so we'll do that too. */ if ((ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && check_posix_syntax(ptr, &tempptr, cd)) { *errorptr = (ptr[1] == ':')? ERR13 : ERR31; goto FAILED; } /* If the first character is '^', set the negation flag and skip it. */ if ((c = *(++ptr)) == '^') { negate_class = TRUE; c = *(++ptr); } else { negate_class = FALSE; } /* Keep a count of chars with values < 256 so that we can optimize the case of just a single character (as long as it's < 256). For higher valued UTF-8 characters, we don't yet do any optimization. */ class_charcount = 0; class_lastchar = -1; #ifdef SUPPORT_UTF8 class_utf8 = FALSE; /* No chars >= 256 */ class_utf8data = code + LINK_SIZE + 34; /* For UTF-8 items */ #endif /* Initialize the 32-char bit map to all zeros. We have to build the map in a temporary bit of store, in case the class contains only 1 character (< 256), because in that case the compiled code doesn't use the bit map. */ memset(class, 0, 32 * sizeof(uschar)); /* Process characters until ] is reached. By writing this as a "do" it means that an initial ] is taken as a data character. The first pass through the regex checked the overall syntax, so we don't need to be very strict here. At the start of the loop, c contains the first byte of the character. */ do { #ifdef SUPPORT_UTF8 if (utf8 && c > 127) { /* Braces are required because the */ GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */ } #endif /* Inside \Q...\E everything is literal except \E */ if (inescq) { if (c == '\\' && ptr[1] == 'E') { inescq = FALSE; ptr++; continue; } else goto LONE_SINGLE_CHARACTER; } /* Handle POSIX class names. Perl allows a negation extension of the form [:^name:]. A square bracket that doesn't match the syntax is treated as a literal. We also recognize the POSIX constructions [.ch.] and [=ch=] ("collating elements") and fault them, as Perl 5.6 and 5.8 do. */ if (c == '[' && (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && check_posix_syntax(ptr, &tempptr, cd)) { BOOL local_negate = FALSE; int posix_class, i; register const uschar *cbits = cd->cbits; if (ptr[1] != ':') { *errorptr = ERR31; goto FAILED; } ptr += 2; if (*ptr == '^') { local_negate = TRUE; ptr++; } posix_class = check_posix_name(ptr, tempptr - ptr); if (posix_class < 0) { *errorptr = ERR30; goto FAILED; } /* If matching is caseless, upper and lower are converted to alpha. This relies on the fact that the class table starts with alpha, lower, upper as the first 3 entries. */ if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) posix_class = 0; /* Or into the map we are building up to 3 of the static class tables, or their negations. The [:blank:] class sets up the same chars as the [:space:] class (all white space). We remove the vertical white space chars afterwards. */ posix_class *= 3; for (i = 0; i < 3; i++) { BOOL blankclass = strncmp((char *)ptr, "blank", 5) == 0; int taboffset = posix_class_maps[posix_class + i]; if (taboffset < 0) break; if (local_negate) { for (c = 0; c < 32; c++) class[c] |= ~cbits[c+taboffset]; if (blankclass) class[1] |= 0x3c; } else { for (c = 0; c < 32; c++) class[c] |= cbits[c+taboffset]; if (blankclass) class[1] &= ~0x3c; } } ptr = tempptr + 1; class_charcount = 10; /* Set > 1; assumes more than 1 per class */ continue; /* End of POSIX syntax handling */ } /* Backslash may introduce a single character, or it may introduce one of the specials, which just set a flag. Escaped items are checked for validity in the pre-compiling pass. The sequence \b is a special case. Inside a class (and only there) it is treated as backspace. Elsewhere it marks a word boundary. Other escapes have preset maps ready to or into the one we are building. We assume they have more than one character in them, so set class_charcount bigger than one. */ if (c == '\\') { c = check_escape(&ptr, errorptr, *brackets, options, TRUE); if (-c == ESC_b) c = '\b'; /* \b is backslash in a class */ if (-c == ESC_Q) /* Handle start of quoted string */ { if (ptr[1] == '\\' && ptr[2] == 'E') { ptr += 2; /* avoid empty string */ } else inescq = TRUE; continue; } else if (c < 0) { register const uschar *cbits = cd->cbits; class_charcount = 10; /* Greater than 1 is what matters */ switch (-c) { case ESC_d: for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_digit]; continue; case ESC_D: for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_digit]; continue; case ESC_w: for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_word]; continue; case ESC_W: for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_word]; continue; case ESC_s: for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_space]; class[1] &= ~0x08; /* Perl 5.004 onwards omits VT from \s */ continue; case ESC_S: for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_space]; class[1] |= 0x08; /* Perl 5.004 onwards omits VT from \s */ continue; /* Unrecognized escapes are faulted if PCRE is running in its strict mode. By default, for compatibility with Perl, they are treated as literals. */ default: if ((options & PCRE_EXTRA) != 0) { *errorptr = ERR7; goto FAILED; } c = *ptr; /* The final character */ } } /* Fall through if we have a single character (c >= 0). This may be > 256 in UTF-8 mode. */ } /* End of backslash handling */ /* A single character may be followed by '-' to form a range. However, Perl does not permit ']' to be the end of the range. A '-' character here is treated as a literal. */ if (ptr[1] == '-' && ptr[2] != ']') { int d; ptr += 2; #ifdef SUPPORT_UTF8 if (utf8) { /* Braces are required because the */ GETCHARLEN(d, ptr, ptr); /* macro generates multiple statements */ } else #endif d = *ptr; /* The second part of a range can be a single-character escape, but not any of the other escapes. Perl 5.6 treats a hyphen as a literal in such circumstances. */ if (d == '\\') { const uschar *oldptr = ptr; d = check_escape(&ptr, errorptr, *brackets, options, TRUE); /* \b is backslash; any other special means the '-' was literal */ if (d < 0) { if (d == -ESC_b) d = '\b'; else { ptr = oldptr - 2; goto LONE_SINGLE_CHARACTER; /* A few lines below */ } } } /* Check that the two values are in the correct order */ if (d < c) { *errorptr = ERR8; goto FAILED; } /* If d is greater than 255, we can't just use the bit map, so set up for the UTF-8 supporting class type. If we are not caseless, we can just set up a single range. If we are caseless, the characters < 256 are handled with a bitmap, in order to get the case-insensitive handling. */ #ifdef SUPPORT_UTF8 if (d > 255) { class_utf8 = TRUE; *class_utf8data++ = XCL_RANGE; if ((options & PCRE_CASELESS) == 0) { class_utf8data += ord2utf8(c, class_utf8data); class_utf8data += ord2utf8(d, class_utf8data); continue; /* Go get the next char in the class */ } class_utf8data += ord2utf8(256, class_utf8data); class_utf8data += ord2utf8(d, class_utf8data); d = 255; /* Fall through */ } #endif /* We use the bit map if the range is entirely < 255, or if part of it is < 255 and matching is caseless. */ for (; c <= d; c++) { class[c/8] |= (1 << (c&7)); if ((options & PCRE_CASELESS) != 0) { int uc = cd->fcc[c]; /* flip case */ class[uc/8] |= (1 << (uc&7)); } class_charcount++; /* in case a one-char range */ class_lastchar = c; } continue; /* Go get the next char in the class */ } /* Handle a lone single character - we can get here for a normal non-escape char, or after \ that introduces a single character. */ LONE_SINGLE_CHARACTER: /* Handle a multibyte character */ #ifdef SUPPORT_UTF8 if (utf8 && c > 255) { class_utf8 = TRUE; *class_utf8data++ = XCL_SINGLE; class_utf8data += ord2utf8(c, class_utf8data); } else #endif /* Handle a single-byte character */ { class [c/8] |= (1 << (c&7)); if ((options & PCRE_CASELESS) != 0) { c = cd->fcc[c]; /* flip case */ class[c/8] |= (1 << (c&7)); } class_charcount++; class_lastchar = c; } } /* Loop until ']' reached; the check for end of string happens inside the loop. This "while" is the end of the "do" above. */ while ((c = *(++ptr)) != ']' || inescq); /* If class_charcount is 1, we saw precisely one character with a value < 256. In UTF-8 mode, we can optimize if there were no characters >= 256 and the one character is < 128. In non-UTF-8 mode we can always optimize. The optimization throws away the bit map. We turn the item into a 1-character OP_CHARS if it's positive, or OP_NOT if it's negative. Note that OP_NOT does not support multibyte characters. In the positive case, it can cause firstbyte to be set. Otherwise, there can be no first char if this item is first, whatever repeat count may follow. In the case of reqbyte, save the previous value for reinstating. */ #ifdef SUPPORT_UTF8 if (class_charcount == 1 && (!utf8 || (!class_utf8 && class_lastchar < 128))) #else if (class_charcount == 1) #endif { zeroreqbyte = reqbyte; if (negate_class) { if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; zerofirstbyte = firstbyte; *code++ = OP_NOT; } else { if (firstbyte == REQ_UNSET) { zerofirstbyte = REQ_NONE; firstbyte = class_lastchar | req_caseopt; } else { zerofirstbyte = firstbyte; reqbyte = class_lastchar | req_caseopt | cd->req_varyopt; } *code++ = OP_CHARS; *code++ = 1; } *code++ = class_lastchar; break; /* End of class handling */ } /* End of 1-byte optimization */ /* Otherwise, if this is the first thing in the branch, there can be no first char setting, whatever the repeat count. Any reqbyte setting must remain unchanged after any kind of repeat. */ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; zerofirstbyte = firstbyte; zeroreqbyte = reqbyte; /* If there are characters with values > 255, we have to compile an extended class, with its own opcode. If there are no characters < 256, we can omit the bitmap. */ #ifdef SUPPORT_UTF8 if (class_utf8) { *class_utf8data++ = XCL_END; /* Marks the end of extra data */ *code++ = OP_XCLASS; code += LINK_SIZE; *code = negate_class? XCL_NOT : 0; /* If the map is required, install it, and move on to the end of the extra data */ if (class_charcount > 0) { *code++ |= XCL_MAP; memcpy(code, class, 32); code = class_utf8data; } /* If the map is not required, slide down the extra data. */ else { int len = class_utf8data - (code + 33); memmove(code + 1, code + 33, len); code += len + 1; } /* Now fill in the complete length of the item */ PUT(previous, 1, code - previous); break; /* End of class handling */ } #endif /* If there are no characters > 255, negate the 32-byte map if necessary, and copy it into the code vector. If this is the first thing in the branch, there can be no first char setting, whatever the repeat count. Any reqbyte setting must remain unchanged after any kind of repeat. */ if (negate_class) { *code++ = OP_NCLASS; for (c = 0; c < 32; c++) code[c] = ~class[c]; } else { *code++ = OP_CLASS; memcpy(code, class, 32); } code += 32; break; /* Various kinds of repeat */ case '{': if (!is_counted_repeat(ptr+1)) goto NORMAL_CHAR; ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorptr); if (*errorptr != NULL) goto FAILED; goto REPEAT; case '*': repeat_min = 0; repeat_max = -1; goto REPEAT; case '+': repeat_min = 1; repeat_max = -1; goto REPEAT; case '?': repeat_min = 0; repeat_max = 1; REPEAT: if (previous == NULL) { *errorptr = ERR9; goto FAILED; } if (repeat_min == 0) { firstbyte = zerofirstbyte; /* Adjust for zero repeat */ reqbyte = zeroreqbyte; /* Ditto */ } /* Remember whether this is a variable length repeat */ reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY; op_type = 0; /* Default single-char op codes */ possessive_quantifier = FALSE; /* Default not possessive quantifier */ /* Save start of previous item, in case we have to move it up to make space for an inserted OP_ONCE for the additional '+' extension. */ tempcode = previous; /* If the next character is '+', we have a possessive quantifier. This implies greediness, whatever the setting of the PCRE_UNGREEDY option. If the next character is '?' this is a minimizing repeat, by default, but if PCRE_UNGREEDY is set, it works the other way round. We change the repeat type to the non-default. */ if (ptr[1] == '+') { repeat_type = 0; /* Force greedy */ possessive_quantifier = TRUE; ptr++; } else if (ptr[1] == '?') { repeat_type = greedy_non_default; ptr++; } else repeat_type = greedy_default; /* If previous was a recursion, we need to wrap it inside brackets so that it can be replicated if necessary. */ if (*previous == OP_RECURSE) { memmove(previous + 1 + LINK_SIZE, previous, 1 + LINK_SIZE); code += 1 + LINK_SIZE; *previous = OP_BRA; PUT(previous, 1, code - previous); *code = OP_KET; PUT(code, 1, code - previous); code += 1 + LINK_SIZE; } /* If previous was a string of characters, chop off the last one and use it as the subject of the repeat. If there was only one character, we can abolish the previous item altogether. If a one-char item has a minumum of more than one, ensure that it is set in reqbyte - it might not be if a sequence such as x{3} is the first thing in a branch because the x will have gone into firstbyte instead. */ if (*previous == OP_CHARS) { /* Deal with UTF-8 characters that take up more than one byte. It's easier to write this out separately than try to macrify it. Use c to hold the length of the character in bytes, plus 0x80 to flag that it's a length rather than a small character. */ #ifdef SUPPORT_UTF8 if (utf8 && (code[-1] & 0x80) != 0) { uschar *lastchar = code - 1; while((*lastchar & 0xc0) == 0x80) lastchar--; c = code - lastchar; /* Length of UTF-8 character */ memcpy(utf8_char, lastchar, c); /* Save the char */ if (lastchar == previous + 2) /* There was only one character */ { code = previous; /* Abolish the previous item */ } else { previous[1] -= c; /* Adjust length of previous */ code = lastchar; /* Lost char off the end */ tempcode = code; /* Adjust position to be moved for '+' */ } c |= 0x80; /* Flag c as a length */ } else #endif /* Handle the case of a single byte - either with no UTF8 support, or with UTF-8 disabled, or for a UTF-8 character < 128. */ { c = *(--code); if (code == previous + 2) /* There was only one character */ { code = previous; /* Abolish the previous item */ if (repeat_min > 1) reqbyte = c | req_caseopt | cd->req_varyopt; } else { previous[1]--; /* adjust length */ tempcode = code; /* Adjust position to be moved for '+' */ } } goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ } /* If previous was a single negated character ([^a] or similar), we use one of the special opcodes, replacing it. The code is shared with single- character repeats by setting opt_type to add a suitable offset into repeat_type. OP_NOT is currently used only for single-byte chars. */ else if (*previous == OP_NOT) { op_type = OP_NOTSTAR - OP_STAR; /* Use "not" opcodes */ c = previous[1]; code = previous; goto OUTPUT_SINGLE_REPEAT; } /* If previous was a character type match (\d or similar), abolish it and create a suitable repeat item. The code is shared with single-character repeats by setting op_type to add a suitable offset into repeat_type. */ else if (*previous < OP_EODN) { op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */ c = *previous; code = previous; OUTPUT_SINGLE_REPEAT: /* If the maximum is zero then the minimum must also be zero; Perl allows this case, so we do too - by simply omitting the item altogether. */ if (repeat_max == 0) goto END_REPEAT; /* Combine the op_type with the repeat_type */ repeat_type += op_type; /* A minimum of zero is handled either as the special case * or ?, or as an UPTO, with the maximum given. */ if (repeat_min == 0) { if (repeat_max == -1) *code++ = OP_STAR + repeat_type; else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type; else { *code++ = OP_UPTO + repeat_type; PUT2INC(code, 0, repeat_max); } } /* The case {1,} is handled as the special case + */ else if (repeat_min == 1 && repeat_max == -1) *code++ = OP_PLUS + repeat_type; /* The case {n,n} is just an EXACT, while the general case {n,m} is handled as an EXACT followed by an UPTO. An EXACT of 1 is optimized. */ else { if (repeat_min != 1) { *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */ PUT2INC(code, 0, repeat_min); } /* If the mininum is 1 and the previous item was a character string, we either have to put back the item that got cancelled if the string length was 1, or add the character back onto the end of a longer string. For a character type nothing need be done; it will just get put back naturally. Note that the final character is always going to get added below, so we leave code ready for its insertion. */ else if (*previous == OP_CHARS) { if (code == previous) code += 2; else /* In UTF-8 mode, a multibyte char has its length in c, with the 0x80 bit set as a flag. The length will always be between 2 and 6. */ #ifdef SUPPORT_UTF8 if (utf8 && c >= 128) previous[1] += c & 7; else #endif previous[1]++; } /* For a single negated character we also have to put back the item that got cancelled. At present this applies only to single byte characters in any mode. */ else if (*previous == OP_NOT) code++; /* If the maximum is unlimited, insert an OP_STAR. Before doing so, we have to insert the character for the previous code. In UTF-8 mode, long characters have their length in c, with the 0x80 bit as a flag. */ if (repeat_max < 0) { #ifdef SUPPORT_UTF8 if (utf8 && c >= 128) { memcpy(code, utf8_char, c & 7); code += c & 7; } else #endif *code++ = c; *code++ = OP_STAR + repeat_type; } /* Else insert an UPTO if the max is greater than the min, again preceded by the character, for the previously inserted code. */ else if (repeat_max != repeat_min) { #ifdef SUPPORT_UTF8 if (utf8 && c >= 128) { memcpy(code, utf8_char, c & 7); code += c & 7; } else #endif *code++ = c; repeat_max -= repeat_min; *code++ = OP_UPTO + repeat_type; PUT2INC(code, 0, repeat_max); } } /* The character or character type itself comes last in all cases. */ #ifdef SUPPORT_UTF8 if (utf8 && c >= 128) { memcpy(code, utf8_char, c & 7); code += c & 7; } else #endif *code++ = c; } /* If previous was a character class or a back reference, we put the repeat stuff after it, but just skip the item if the repeat was {0,0}. */ else if (*previous == OP_CLASS || *previous == OP_NCLASS || #ifdef SUPPORT_UTF8 *previous == OP_XCLASS || #endif *previous == OP_REF) { if (repeat_max == 0) { code = previous; goto END_REPEAT; } if (repeat_min == 0 && repeat_max == -1) *code++ = OP_CRSTAR + repeat_type; else if (repeat_min == 1 && repeat_max == -1) *code++ = OP_CRPLUS + repeat_type; else if (repeat_min == 0 && repeat_max == 1) *code++ = OP_CRQUERY + repeat_type; else { *code++ = OP_CRRANGE + repeat_type; PUT2INC(code, 0, repeat_min); if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */ PUT2INC(code, 0, repeat_max); } } /* If previous was a bracket group, we may have to replicate it in certain cases. */ else if (*previous >= OP_BRA || *previous == OP_ONCE || *previous == OP_COND) { register int i; int ketoffset = 0; int len = code - previous; uschar *bralink = NULL; /* If the maximum repeat count is unlimited, find the end of the bracket by scanning through from the start, and compute the offset back to it from the current code pointer. There may be an OP_OPT setting following the final KET, so we can't find the end just by going back from the code pointer. */ if (repeat_max == -1) { register uschar *ket = previous; do ket += GET(ket, 1); while (*ket != OP_KET); ketoffset = code - ket; } /* The case of a zero minimum is special because of the need to stick OP_BRAZERO in front of it, and because the group appears once in the data, whereas in other cases it appears the minimum number of times. For this reason, it is simplest to treat this case separately, as otherwise the code gets far too messy. There are several special subcases when the minimum is zero. */ if (repeat_min == 0) { /* If the maximum is also zero, we just omit the group from the output altogether. */ if (repeat_max == 0) { code = previous; goto END_REPEAT; } /* If the maximum is 1 or unlimited, we just have to stick in the BRAZERO and do no more at this point. However, we do need to adjust any OP_RECURSE calls inside the group that refer to the group itself or any internal group, because the offset is from the start of the whole regex. Temporarily terminate the pattern while doing this. */ if (repeat_max <= 1) { *code = OP_END; adjust_recurse(previous, 1, utf8, cd); memmove(previous+1, previous, len); code++; *previous++ = OP_BRAZERO + repeat_type; } /* If the maximum is greater than 1 and limited, we have to replicate in a nested fashion, sticking OP_BRAZERO before each set of brackets. The first one has to be handled carefully because it's the original copy, which has to be moved up. The remainder can be handled by code that is common with the non-zero minimum case below. We have to adjust the value or repeat_max, since one less copy is required. Once again, we may have to adjust any OP_RECURSE calls inside the group. */ else { int offset; *code = OP_END; adjust_recurse(previous, 2 + LINK_SIZE, utf8, cd); memmove(previous + 2 + LINK_SIZE, previous, len); code += 2 + LINK_SIZE; *previous++ = OP_BRAZERO + repeat_type; *previous++ = OP_BRA; /* We chain together the bracket offset fields that have to be filled in later when the ends of the brackets are reached. */ offset = (bralink == NULL)? 0 : previous - bralink; bralink = previous; PUTINC(previous, 0, offset); } repeat_max--; } /* If the minimum is greater than zero, replicate the group as many times as necessary, and adjust the maximum to the number of subsequent copies that we need. If we set a first char from the group, and didn't set a required char, copy the latter from the former. */ else { if (repeat_min > 1) { if (groupsetfirstbyte && reqbyte < 0) reqbyte = firstbyte; for (i = 1; i < repeat_min; i++) { memcpy(code, previous, len); code += len; } } if (repeat_max > 0) repeat_max -= repeat_min; } /* This code is common to both the zero and non-zero minimum cases. If the maximum is limited, it replicates the group in a nested fashion, remembering the bracket starts on a stack. In the case of a zero minimum, the first one was set up above. In all cases the repeat_max now specifies the number of additional copies needed. */ if (repeat_max >= 0) { for (i = repeat_max - 1; i >= 0; i--) { *code++ = OP_BRAZERO + repeat_type; /* All but the final copy start a new nesting, maintaining the chain of brackets outstanding. */ if (i != 0) { int offset; *code++ = OP_BRA; offset = (bralink == NULL)? 0 : code - bralink; bralink = code; PUTINC(code, 0, offset); } memcpy(code, previous, len); code += len; } /* Now chain through the pending brackets, and fill in their length fields (which are holding the chain links pro tem). */ while (bralink != NULL) { int oldlinkoffset; int offset = code - bralink + 1; uschar *bra = code - offset; oldlinkoffset = GET(bra, 1); bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset; *code++ = OP_KET; PUTINC(code, 0, offset); PUT(bra, 1, offset); } } /* If the maximum is unlimited, set a repeater in the final copy. We can't just offset backwards from the current code point, because we don't know if there's been an options resetting after the ket. The correct offset was computed above. */ else code[-ketoffset] = OP_KETRMAX + repeat_type; } /* Else there's some kind of shambles */ else { *errorptr = ERR11; goto FAILED; } /* If the character following a repeat is '+', we wrap the entire repeated item inside OP_ONCE brackets. This is just syntactic sugar, taken from Sun's Java package. The repeated item starts at tempcode, not at previous, which might be the first part of a string whose (former) last char we repeated. However, we don't support '+' after a greediness '?'. */ if (possessive_quantifier) { int len = code - tempcode; memmove(tempcode + 1+LINK_SIZE, tempcode, len); code += 1 + LINK_SIZE; len += 1 + LINK_SIZE; tempcode[0] = OP_ONCE; *code++ = OP_KET; PUTINC(code, 0, len); PUT(tempcode, 1, len); } /* In all case we no longer have a previous item. We also set the "follows varying string" flag for subsequently encountered reqbytes if it isn't already set and we have just passed a varying length item. */ END_REPEAT: previous = NULL; cd->req_varyopt |= reqvary; break; /* Start of nested bracket sub-expression, or comment or lookahead or lookbehind or option setting or condition. First deal with special things that can come after a bracket; all are introduced by ?, and the appearance of any of them means that this is not a referencing group. They were checked for validity in the first pass over the string, so we don't have to check for syntax errors here. */ case '(': newoptions = options; skipbytes = 0; if (*(++ptr) == '?') { int set, unset; int *optset; switch (*(++ptr)) { case '#': /* Comment; skip to ket */ ptr++; while (*ptr != ')') ptr++; continue; case ':': /* Non-extracting bracket */ bravalue = OP_BRA; ptr++; break; case '(': bravalue = OP_COND; /* Conditional group */ /* Condition to test for recursion */ if (ptr[1] == 'R') { code[1+LINK_SIZE] = OP_CREF; PUT2(code, 2+LINK_SIZE, CREF_RECURSE); skipbytes = 3; ptr += 3; } /* Condition to test for a numbered subpattern match. We know that if a digit follows ( then there will just be digits until ) because the syntax was checked in the first pass. */ else if ((digitab[ptr[1]] && ctype_digit) != 0) { int condref; /* Don't amalgamate; some compilers */ condref = *(++ptr) - '0'; /* grumble at autoincrement in declaration */ while (*(++ptr) != ')') condref = condref*10 + *ptr - '0'; if (condref == 0) { *errorptr = ERR35; goto FAILED; } ptr++; code[1+LINK_SIZE] = OP_CREF; PUT2(code, 2+LINK_SIZE, condref); skipbytes = 3; } /* For conditions that are assertions, we just fall through, having set bravalue above. */ break; case '=': /* Positive lookahead */ bravalue = OP_ASSERT; ptr++; break; case '!': /* Negative lookahead */ bravalue = OP_ASSERT_NOT; ptr++; break; case '<': /* Lookbehinds */ switch (*(++ptr)) { case '=': /* Positive lookbehind */ bravalue = OP_ASSERTBACK; ptr++; break; case '!': /* Negative lookbehind */ bravalue = OP_ASSERTBACK_NOT; ptr++; break; } break; case '>': /* One-time brackets */ bravalue = OP_ONCE; ptr++; break; case 'C': /* Callout - may be followed by digits */ *code++ = OP_CALLOUT; { int n = 0; while ((digitab[*(++ptr)] & ctype_digit) != 0) n = n * 10 + *ptr - '0'; if (n > 255) { *errorptr = ERR38; goto FAILED; } *code++ = n; } previous = NULL; continue; case 'P': /* Named subpattern handling */ if (*(++ptr) == '<') /* Definition */ { int i, namelen; uschar *slot = cd->name_table; const uschar *name; /* Don't amalgamate; some compilers */ name = ++ptr; /* grumble at autoincrement in declaration */ while (*ptr++ != '>'); namelen = ptr - name - 1; for (i = 0; i < cd->names_found; i++) { int crc = memcmp(name, slot+2, namelen); if (crc == 0) { if (slot[2+namelen] == 0) { *errorptr = ERR43; goto FAILED; } crc = -1; /* Current name is substring */ } if (crc < 0) { memmove(slot + cd->name_entry_size, slot, (cd->names_found - i) * cd->name_entry_size); break; } slot += cd->name_entry_size; } PUT2(slot, 0, *brackets + 1); memcpy(slot + 2, name, namelen); slot[2+namelen] = 0; cd->names_found++; goto NUMBERED_GROUP; } if (*ptr == '=' || *ptr == '>') /* Reference or recursion */ { int i, namelen; int type = *ptr++; const uschar *name = ptr; uschar *slot = cd->name_table; while (*ptr != ')') ptr++; namelen = ptr - name; for (i = 0; i < cd->names_found; i++) { if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break; slot += cd->name_entry_size; } if (i >= cd->names_found) { *errorptr = ERR15; goto FAILED; } recno = GET2(slot, 0); if (type == '>') goto HANDLE_RECURSION; /* A few lines below */ /* Back reference */ previous = code; *code++ = OP_REF; PUT2INC(code, 0, recno); cd->backref_map |= (recno < 32)? (1 << recno) : 1; if (recno > cd->top_backref) cd->top_backref = recno; continue; } /* Should never happen */ break; case 'R': /* Pattern recursion */ ptr++; /* Same as (?0) */ /* Fall through */ /* Recursion or "subroutine" call */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { const uschar *called; recno = 0; while((digitab[*ptr] & ctype_digit) != 0) recno = recno * 10 + *ptr++ - '0'; /* Come here from code above that handles a named recursion */ HANDLE_RECURSION: previous = code; /* Find the bracket that is being referenced. Temporarily end the regex in case it doesn't exist. */ *code = OP_END; called = (recno == 0)? cd->start_code : find_bracket(cd->start_code, utf8, recno); if (called == NULL) { *errorptr = ERR15; goto FAILED; } /* If the subpattern is still open, this is a recursive call. We check to see if this is a left recursion that could loop for ever, and diagnose that case. */ if (GET(called, 1) == 0 && could_be_empty(called, code, bcptr, utf8)) { *errorptr = ERR40; goto FAILED; } /* Insert the recursion/subroutine item */ *code = OP_RECURSE; PUT(code, 1, called - cd->start_code); code += 1 + LINK_SIZE; } continue; /* Character after (? not specially recognized */ default: /* Option setting */ set = unset = 0; optset = &set; while (*ptr != ')' && *ptr != ':') { switch (*ptr++) { case '-': optset = &unset; break; case 'i': *optset |= PCRE_CASELESS; break; case 'm': *optset |= PCRE_MULTILINE; break; case 's': *optset |= PCRE_DOTALL; break; case 'x': *optset |= PCRE_EXTENDED; break; case 'U': *optset |= PCRE_UNGREEDY; break; case 'X': *optset |= PCRE_EXTRA; break; } } /* Set up the changed option bits, but don't change anything yet. */ newoptions = (options | set) & (~unset); /* If the options ended with ')' this is not the start of a nested group with option changes, so the options change at this level. Compile code to change the ims options if this setting actually changes any of them. We also pass the new setting back so that it can be put at the start of any following branches, and when this group ends (if we are in a group), a resetting item can be compiled. Note that if this item is right at the start of the pattern, the options will have been abstracted and made global, so there will be no change to compile. */ if (*ptr == ')') { if ((options & PCRE_IMS) != (newoptions & PCRE_IMS)) { *code++ = OP_OPT; *code++ = newoptions & PCRE_IMS; } /* Change options at this level, and pass them back for use in subsequent branches. Reset the greedy defaults and the case value for firstbyte and reqbyte. */ *optionsptr = options = newoptions; greedy_default = ((newoptions & PCRE_UNGREEDY) != 0); greedy_non_default = greedy_default ^ 1; req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0; previous = NULL; /* This item can't be repeated */ continue; /* It is complete */ } /* If the options ended with ':' we are heading into a nested group with possible change of options. Such groups are non-capturing and are not assertions of any kind. All we need to do is skip over the ':'; the newoptions value is handled below. */ bravalue = OP_BRA; ptr++; } } /* If PCRE_NO_AUTO_CAPTURE is set, all unadorned brackets become non-capturing and behave like (?:...) brackets */ else if ((options & PCRE_NO_AUTO_CAPTURE) != 0) { bravalue = OP_BRA; } /* Else we have a referencing group; adjust the opcode. If the bracket number is greater than EXTRACT_BASIC_MAX, we set the opcode one higher, and arrange for the true number to follow later, in an OP_BRANUMBER item. */ else { NUMBERED_GROUP: if (++(*brackets) > EXTRACT_BASIC_MAX) { bravalue = OP_BRA + EXTRACT_BASIC_MAX + 1; code[1+LINK_SIZE] = OP_BRANUMBER; PUT2(code, 2+LINK_SIZE, *brackets); skipbytes = 3; } else bravalue = OP_BRA + *brackets; } /* Process nested bracketed re. Assertions may not be repeated, but other kinds can be. We copy code into a non-register variable in order to be able to pass its address because some compilers complain otherwise. Pass in a new setting for the ims options if they have changed. */ previous = (bravalue >= OP_ONCE)? code : NULL; *code = bravalue; tempcode = code; tempreqvary = cd->req_varyopt; /* Save value before bracket */ if (!compile_regex( newoptions, /* The complete new option state */ options & PCRE_IMS, /* The previous ims option state */ brackets, /* Extracting bracket count */ &tempcode, /* Where to put code (updated) */ &ptr, /* Input pointer (updated) */ errorptr, /* Where to put an error message */ (bravalue == OP_ASSERTBACK || bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */ skipbytes, /* Skip over OP_COND/OP_BRANUMBER */ &subfirstbyte, /* For possible first char */ &subreqbyte, /* For possible last char */ bcptr, /* Current branch chain */ cd)) /* Tables block */ goto FAILED; /* At the end of compiling, code is still pointing to the start of the group, while tempcode has been updated to point past the end of the group and any option resetting that may follow it. The pattern pointer (ptr) is on the bracket. */ /* If this is a conditional bracket, check that there are no more than two branches in the group. */ else if (bravalue == OP_COND) { uschar *tc = code; condcount = 0; do { condcount++; tc += GET(tc,1); } while (*tc != OP_KET); if (condcount > 2) { *errorptr = ERR27; goto FAILED; } /* If there is just one branch, we must not make use of its firstbyte or reqbyte, because this is equivalent to an empty second branch. */ if (condcount == 1) subfirstbyte = subreqbyte = REQ_NONE; } /* Handle updating of the required and first characters. Update for normal brackets of all kinds, and conditions with two branches (see code above). If the bracket is followed by a quantifier with zero repeat, we have to back off. Hence the definition of zeroreqbyte and zerofirstbyte outside the main loop so that they can be accessed for the back off. */ zeroreqbyte = reqbyte; zerofirstbyte = firstbyte; groupsetfirstbyte = FALSE; if (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_COND) { /* If we have not yet set a firstbyte in this branch, take it from the subpattern, remembering that it was set here so that a repeat of more than one can replicate it as reqbyte if necessary. If the subpattern has no firstbyte, set "none" for the whole branch. In both cases, a zero repeat forces firstbyte to "none". */ if (firstbyte == REQ_UNSET) { if (subfirstbyte >= 0) { firstbyte = subfirstbyte; groupsetfirstbyte = TRUE; } else firstbyte = REQ_NONE; zerofirstbyte = REQ_NONE; } /* If firstbyte was previously set, convert the subpattern's firstbyte into reqbyte if there wasn't one, using the vary flag that was in existence beforehand. */ else if (subfirstbyte >= 0 && subreqbyte < 0) subreqbyte = subfirstbyte | tempreqvary; /* If the subpattern set a required byte (or set a first byte that isn't really the first byte - see above), set it. */ if (subreqbyte >= 0) reqbyte = subreqbyte; } /* For a forward assertion, we take the reqbyte, if set. This can be helpful if the pattern that follows the assertion doesn't set a different char. For example, it's useful for /(?=abcde).+/. We can't set firstbyte for an assertion, however because it leads to incorrect effect for patterns such as /(?=a)a.+/ when the "real" "a" would then become a reqbyte instead of a firstbyte. This is overcome by a scan at the end if there's no firstbyte, looking for an asserted first char. */ else if (bravalue == OP_ASSERT && subreqbyte >= 0) reqbyte = subreqbyte; /* Now update the main code pointer to the end of the group. */ code = tempcode; /* Error if hit end of pattern */ if (*ptr != ')') { *errorptr = ERR14; goto FAILED; } break; /* Check \ for being a real metacharacter; if not, fall through and handle it as a data character at the start of a string. Escape items are checked for validity in the pre-compiling pass. */ case '\\': tempptr = ptr; c = check_escape(&ptr, errorptr, *brackets, options, FALSE); /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values are arranged to be the negation of the corresponding OP_values. For the back references, the values are ESC_REF plus the reference number. Only back references and those types that consume a character may be repeated. We can test for values between ESC_b and ESC_Z for the latter; this may have to change if any new ones are ever created. */ if (c < 0) { if (-c == ESC_Q) /* Handle start of quoted string */ { if (ptr[1] == '\\' && ptr[2] == 'E') ptr += 2; /* avoid empty string */ else inescq = TRUE; continue; } /* For metasequences that actually match a character, we disable the setting of a first character if it hasn't already been set. */ if (firstbyte == REQ_UNSET && -c > ESC_b && -c < ESC_Z) firstbyte = REQ_NONE; /* Set values to reset to if this is followed by a zero repeat. */ zerofirstbyte = firstbyte; zeroreqbyte = reqbyte; /* Back references are handled specially */ if (-c >= ESC_REF) { int number = -c - ESC_REF; previous = code; *code++ = OP_REF; PUT2INC(code, 0, number); } else { previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; *code++ = -c; } continue; } /* Data character: reset and fall through */ ptr = tempptr; c = '\\'; /* Handle a run of data characters until a metacharacter is encountered. The first character is guaranteed not to be whitespace or # when the extended flag is set. */ NORMAL_CHAR: default: previous = code; *code = OP_CHARS; code += 2; length = 0; do { /* If in \Q...\E, check for the end; if not, we always have a literal */ if (inescq) { if (c == '\\' && ptr[1] == 'E') { inescq = FALSE; ptr++; } else { *code++ = c; length++; } continue; } /* Skip white space and comments for /x patterns */ if ((options & PCRE_EXTENDED) != 0) { if ((cd->ctypes[c] & ctype_space) != 0) continue; if (c == '#') { /* The space before the ; is to avoid a warning on a silly compiler on the Macintosh. */ while ((c = *(++ptr)) != 0 && c != NEWLINE) ; if (c == 0) break; continue; } } /* Backslash may introduce a data char or a metacharacter. Escaped items are checked for validity in the pre-compiling pass. Stop the string before a metaitem. */ if (c == '\\') { tempptr = ptr; c = check_escape(&ptr, errorptr, *brackets, options, FALSE); if (c < 0) { ptr = tempptr; break; } /* If a character is > 127 in UTF-8 mode, we have to turn it into two or more bytes in the UTF-8 encoding. */ #ifdef SUPPORT_UTF8 if (utf8 && c > 127) { uschar buffer[8]; int len = ord2utf8(c, buffer); for (c = 0; c < len; c++) *code++ = buffer[c]; length += len; continue; } #endif } /* Ordinary character or single-char escape */ *code++ = c; length++; } /* This "while" is the end of the "do" above. */ while (length < MAXLIT && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0); /* Update the first and last requirements. These are always bytes, even in UTF-8 mode. However, there is a special case to be considered when there are only one or two characters. Because this gets messy in UTF-8 mode, the code is kept separate. When we get here "length" contains the number of bytes. */ #ifdef SUPPORT_UTF8 if (utf8 && length > 1) { uschar *t = previous + 3; /* After this code, t */ while (t < code && (*t & 0xc0) == 0x80) t++; /* follows the 1st char */ /* Handle the case when there is only one multibyte character. It must have at least two bytes because of the "length > 1" test above. */ if (t == code) { /* If no previous first byte, set it from this character, but revert to none on a zero repeat. */ if (firstbyte == REQ_UNSET) { zerofirstbyte = REQ_NONE; firstbyte = previous[2]; } /* Otherwise, leave the first byte value alone, and don't change it on a zero repeat */ else zerofirstbyte = firstbyte; /* In both cases, a zero repeat resets the previous required byte */ zeroreqbyte = reqbyte; } /* Handle the case when there is more than one character. These may be single-byte or multibyte characters */ else { t = code - 1; /* After this code, t is at the */ while ((*t & 0xc0) == 0x80) t--; /* start of the last character */ /* If no previous first byte, set it from the first character, and retain it on a zero repeat (of the last character). The required byte is reset on a zero repeat, either to the byte before the last character, unless this is the first byte of the string. In that case, it reverts to its previous value. */ if (firstbyte == REQ_UNSET) { zerofirstbyte = firstbyte = previous[2] | req_caseopt; zeroreqbyte = (t - 1 == previous + 2)? reqbyte : t[-1] | req_caseopt | cd->req_varyopt; } /* If there was a previous first byte, leave it alone, and don't change it on a zero repeat. The required byte is reset on a zero repeat to the byte before the last character. */ else { zerofirstbyte = firstbyte; zeroreqbyte = t[-1] | req_caseopt | cd->req_varyopt; } } /* In all cases (we know length > 1), the new required byte is the last byte of the string. */ reqbyte = code[-1] | req_caseopt | cd->req_varyopt; } else /* End of UTF-8 coding */ #endif /* This is the code for non-UTF-8 operation, either without UTF-8 support, or when UTF-8 is not enabled. */ { /* firstbyte was not previously set; take it from this string */ if (firstbyte == REQ_UNSET) { if (length == 1) { zerofirstbyte = REQ_NONE; firstbyte = previous[2] | req_caseopt; zeroreqbyte = reqbyte; } else { zerofirstbyte = firstbyte = previous[2] | req_caseopt; zeroreqbyte = (length > 2)? (code[-2] | req_caseopt | cd->req_varyopt) : reqbyte; reqbyte = code[-1] | req_caseopt | cd->req_varyopt; } } /* firstbyte was previously set */ else { zerofirstbyte = firstbyte; zeroreqbyte = (length == 1)? reqbyte : code[-2] | req_caseopt | cd->req_varyopt; reqbyte = code[-1] | req_caseopt | cd->req_varyopt; } } /* Set the length in the data vector, and advance to the next state. */ previous[1] = length; if (length < MAXLIT) ptr--; break; } } /* end of big loop */ /* Control never reaches here by falling through, only by a goto for all the error states. Pass back the position in the pattern so that it can be displayed to the user for diagnosing the error. */ FAILED: *ptrptr = ptr; return FALSE; } /************************************************* * Compile sequence of alternatives * *************************************************/ /* On entry, ptr is pointing past the bracket character, but on return it points to the closing bracket, or vertical bar, or end of string. The code variable is pointing at the byte into which the BRA operator has been stored. If the ims options are changed at the start (for a (?ims: group) or during any branch, we need to insert an OP_OPT item at the start of every following branch to ensure they get set correctly at run time, and also pass the new options into every subsequent branch compile. Argument: options option bits, including any changes for this subpattern oldims previous settings of ims option bits brackets -> int containing the number of extracting brackets used codeptr -> the address of the current code pointer ptrptr -> the address of the current pattern pointer errorptr -> pointer to error message lookbehind TRUE if this is a lookbehind assertion skipbytes skip this many bytes at start (for OP_COND, OP_BRANUMBER) firstbyteptr place to put the first required character, or a negative number reqbyteptr place to put the last required character, or a negative number bcptr pointer to the chain of currently open branches cd points to the data block with tables pointers etc. Returns: TRUE on success */ static BOOL compile_regex(int options, int oldims, int *brackets, uschar **codeptr, const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int skipbytes, int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd) { const uschar *ptr = *ptrptr; uschar *code = *codeptr; uschar *last_branch = code; uschar *start_bracket = code; uschar *reverse_count = NULL; int firstbyte, reqbyte; int branchfirstbyte, branchreqbyte; branch_chain bc; bc.outer = bcptr; bc.current = code; firstbyte = reqbyte = REQ_UNSET; /* Offset is set zero to mark that this bracket is still open */ PUT(code, 1, 0); code += 1 + LINK_SIZE + skipbytes; /* Loop for each alternative branch */ for (;;) { /* Handle a change of ims options at the start of the branch */ if ((options & PCRE_IMS) != oldims) { *code++ = OP_OPT; *code++ = options & PCRE_IMS; } /* Set up dummy OP_REVERSE if lookbehind assertion */ if (lookbehind) { *code++ = OP_REVERSE; reverse_count = code; PUTINC(code, 0, 0); } /* Now compile the branch */ if (!compile_branch(&options, brackets, &code, &ptr, errorptr, &branchfirstbyte, &branchreqbyte, &bc, cd)) { *ptrptr = ptr; return FALSE; } /* If this is the first branch, the firstbyte and reqbyte values for the branch become the values for the regex. */ if (*last_branch != OP_ALT) { firstbyte = branchfirstbyte; reqbyte = branchreqbyte; } /* If this is not the first branch, the first char and reqbyte have to match the values from all the previous branches, except that if the previous value for reqbyte didn't have REQ_VARY set, it can still match, and we set REQ_VARY for the regex. */ else { /* If we previously had a firstbyte, but it doesn't match the new branch, we have to abandon the firstbyte for the regex, but if there was previously no reqbyte, it takes on the value of the old firstbyte. */ if (firstbyte >= 0 && firstbyte != branchfirstbyte) { if (reqbyte < 0) reqbyte = firstbyte; firstbyte = REQ_NONE; } /* If we (now or from before) have no firstbyte, a firstbyte from the branch becomes a reqbyte if there isn't a branch reqbyte. */ if (firstbyte < 0 && branchfirstbyte >= 0 && branchreqbyte < 0) branchreqbyte = branchfirstbyte; /* Now ensure that the reqbytes match */ if ((reqbyte & ~REQ_VARY) != (branchreqbyte & ~REQ_VARY)) reqbyte = REQ_NONE; else reqbyte |= branchreqbyte; /* To "or" REQ_VARY */ } /* If lookbehind, check that this branch matches a fixed-length string, and put the length into the OP_REVERSE item. Temporarily mark the end of the branch with OP_END. */ if (lookbehind) { int length; *code = OP_END; length = find_fixedlength(last_branch, options); DPRINTF(("fixed length = %d\n", length)); if (length < 0) { *errorptr = (length == -2)? ERR36 : ERR25; *ptrptr = ptr; return FALSE; } PUT(reverse_count, 0, length); } /* Reached end of expression, either ')' or end of pattern. Go back through the alternative branches and reverse the chain of offsets, with the field in the BRA item now becoming an offset to the first alternative. If there are no alternatives, it points to the end of the group. The length in the terminating ket is always the length of the whole bracketed item. If any of the ims options were changed inside the group, compile a resetting op-code following, except at the very end of the pattern. Return leaving the pointer at the terminating char. */ if (*ptr != '|') { int length = code - last_branch; do { int prev_length = GET(last_branch, 1); PUT(last_branch, 1, length); length = prev_length; last_branch -= length; } while (length > 0); /* Fill in the ket */ *code = OP_KET; PUT(code, 1, code - start_bracket); code += 1 + LINK_SIZE; /* Resetting option if needed */ if ((options & PCRE_IMS) != oldims && *ptr == ')') { *code++ = OP_OPT; *code++ = oldims; } /* Set values to pass back */ *codeptr = code; *ptrptr = ptr; *firstbyteptr = firstbyte; *reqbyteptr = reqbyte; return TRUE; } /* Another branch follows; insert an "or" node. Its length field points back to the previous branch while the bracket remains open. At the end the chain is reversed. It's done like this so that the start of the bracket has a zero offset until it is closed, making it possible to detect recursion. */ *code = OP_ALT; PUT(code, 1, code - last_branch); bc.current = last_branch = code; code += 1 + LINK_SIZE; ptr++; } /* Control never reaches here */ } /************************************************* * Check for anchored expression * *************************************************/ /* Try to find out if this is an anchored regular expression. Consider each alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then it's anchored. However, if this is a multiline pattern, then only OP_SOD counts, since OP_CIRC can match in the middle. We can also consider a regex to be anchored if OP_SOM starts all its branches. This is the code for \G, which means "match at start of match position, taking into account the match offset". A branch is also implicitly anchored if it starts with .* and DOTALL is set, because that will try the rest of the pattern at all possible matching points, so there is no point trying again.... er .... .... except when the .* appears inside capturing parentheses, and there is a subsequent back reference to those parentheses. We haven't enough information to catch that case precisely. At first, the best we could do was to detect when .* was in capturing brackets and the highest back reference was greater than or equal to that level. However, by keeping a bitmap of the first 31 back references, we can catch some of the more common cases more precisely. Arguments: code points to start of expression (the bracket) options points to the options setting bracket_map a bitmap of which brackets we are inside while testing; this handles up to substring 31; after that we just have to take the less precise approach backref_map the back reference bitmap Returns: TRUE or FALSE */ static BOOL is_anchored(register const uschar *code, int *options, unsigned int bracket_map, unsigned int backref_map) { do { const uschar *scode = first_significant_code(code + 1+LINK_SIZE, options, PCRE_MULTILINE); register int op = *scode; /* Capturing brackets */ if (op > OP_BRA) { int new_map; op -= OP_BRA; if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE); new_map = bracket_map | ((op < 32)? (1 << op) : 1); if (!is_anchored(scode, options, new_map, backref_map)) return FALSE; } /* Other brackets */ else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) { if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE; } /* .* is not anchored unless DOTALL is set and it isn't in brackets that are or may be referenced. */ else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) && (*options & PCRE_DOTALL) != 0) { if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE; } /* Check for explicit anchoring */ else if (op != OP_SOD && op != OP_SOM && ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC)) return FALSE; code += GET(code, 1); } while (*code == OP_ALT); /* Loop for each alternative */ return TRUE; } /************************************************* * Check for starting with ^ or .* * *************************************************/ /* This is called to find out if every branch starts with ^ or .* so that "first char" processing can be done to speed things up in multiline matching and for non-DOTALL patterns that start with .* (which must start at the beginning or after \n). As in the case of is_anchored() (see above), we have to take account of back references to capturing brackets that contain .* because in that case we can't make the assumption. Arguments: code points to start of expression (the bracket) bracket_map a bitmap of which brackets we are inside while testing; this handles up to substring 31; after that we just have to take the less precise approach backref_map the back reference bitmap Returns: TRUE or FALSE */ static BOOL is_startline(const uschar *code, unsigned int bracket_map, unsigned int backref_map) { do { const uschar *scode = first_significant_code(code + 1+LINK_SIZE, NULL, 0); register int op = *scode; /* Capturing brackets */ if (op > OP_BRA) { int new_map; op -= OP_BRA; if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE); new_map = bracket_map | ((op < 32)? (1 << op) : 1); if (!is_startline(scode, new_map, backref_map)) return FALSE; } /* Other brackets */ else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) { if (!is_startline(scode, bracket_map, backref_map)) return FALSE; } /* .* is not anchored unless DOTALL is set and it isn't in brackets that may be referenced. */ else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR) { if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE; } /* Check for explicit circumflex */ else if (op != OP_CIRC) return FALSE; code += GET(code, 1); } while (*code == OP_ALT); /* Loop for each alternative */ return TRUE; } /************************************************* * Check for asserted fixed first char * *************************************************/ /* During compilation, the "first char" settings from forward assertions are discarded, because they can cause conflicts with actual literals that follow. However, if we end up without a first char setting for an unanchored pattern, it is worth scanning the regex to see if there is an initial asserted first char. If all branches start with the same asserted char, or with a bracket all of whose alternatives start with the same asserted char (recurse ad lib), then we return that char, otherwise -1. Arguments: code points to start of expression (the bracket) options pointer to the options (used to check casing changes) inassert TRUE if in an assertion Returns: -1 or the fixed first char */ static int find_firstassertedchar(const uschar *code, int *options, BOOL inassert) { register int c = -1; do { int d; const uschar *scode = first_significant_code(code + 1+LINK_SIZE, options, PCRE_CASELESS); register int op = *scode; if (op >= OP_BRA) op = OP_BRA; switch(op) { default: return -1; case OP_BRA: case OP_ASSERT: case OP_ONCE: case OP_COND: if ((d = find_firstassertedchar(scode, options, op == OP_ASSERT)) < 0) return -1; if (c < 0) c = d; else if (c != d) return -1; break; case OP_EXACT: /* Fall through */ scode++; case OP_CHARS: /* Fall through */ scode++; case OP_PLUS: case OP_MINPLUS: if (!inassert) return -1; if (c < 0) { c = scode[1]; if ((*options & PCRE_CASELESS) != 0) c |= REQ_CASELESS; } else if (c != scode[1]) return -1; break; } code += GET(code, 1); } while (*code == OP_ALT); return c; } #ifdef SUPPORT_UTF8 /************************************************* * Validate a UTF-8 string * *************************************************/ /* This function is called (optionally) at the start of compile or match, to validate that a supposed UTF-8 string is actually valid. The early check means that subsequent code can assume it is dealing with a valid string. The check can be turned off for maximum performance, but then consequences of supplying an invalid string are then undefined. Arguments: string points to the string length length of string, or -1 if the string is zero-terminated Returns: < 0 if the string is a valid UTF-8 string >= 0 otherwise; the value is the offset of the bad byte */ static int valid_utf8(const uschar *string, int length) { register const uschar *p; if (length < 0) { for (p = string; *p != 0; p++); length = p - string; } for (p = string; length-- > 0; p++) { register int ab; register int c = *p; if (c < 128) continue; if ((c & 0xc0) != 0xc0) return p - string; ab = utf8_table4[c & 0x3f]; /* Number of additional bytes */ if (length < ab) return p - string; length -= ab; /* Check top bits in the second byte */ if ((*(++p) & 0xc0) != 0x80) return p - string; /* Check for overlong sequences for each different length */ switch (ab) { /* Check for xx00 000x */ case 1: if ((c & 0x3e) == 0) return p - string; continue; /* We know there aren't any more bytes to check */ /* Check for 1110 0000, xx0x xxxx */ case 2: if (c == 0xe0 && (*p & 0x20) == 0) return p - string; break; /* Check for 1111 0000, xx00 xxxx */ case 3: if (c == 0xf0 && (*p & 0x30) == 0) return p - string; break; /* Check for 1111 1000, xx00 0xxx */ case 4: if (c == 0xf8 && (*p & 0x38) == 0) return p - string; break; /* Check for leading 0xfe or 0xff, and then for 1111 1100, xx00 00xx */ case 5: if (c == 0xfe || c == 0xff || (c == 0xfc && (*p & 0x3c) == 0)) return p - string; break; } /* Check for valid bytes after the 2nd, if any; all must start 10 */ while (--ab > 0) { if ((*(++p) & 0xc0) != 0x80) return p - string; } } return -1; } #endif /************************************************* * Compile a Regular Expression * *************************************************/ /* This function takes a string and returns a pointer to a block of store holding a compiled version of the expression. Arguments: pattern the regular expression options various option bits errorptr pointer to pointer to error text erroroffset ptr offset in pattern where error was detected tables pointer to character tables or NULL Returns: pointer to compiled data block, or NULL on error, with errorptr and erroroffset set */ EXPORT pcre * pcre_compile(const char *pattern, int options, const char **errorptr, int *erroroffset, const unsigned char *tables) { real_pcre *re; int length = 1 + LINK_SIZE; /* For initial BRA plus length */ int runlength; int c, firstbyte, reqbyte; int bracount = 0; int branch_extra = 0; int branch_newextra; int item_count = -1; int name_count = 0; int max_name_size = 0; #ifdef SUPPORT_UTF8 int lastcharlength = 0; BOOL utf8; BOOL class_utf8; #endif BOOL inescq = FALSE; unsigned int brastackptr = 0; size_t size; uschar *code; const uschar *codestart; const uschar *ptr; compile_data compile_block; int brastack[BRASTACK_SIZE]; uschar bralenstack[BRASTACK_SIZE]; /* We can't pass back an error message if errorptr is NULL; I guess the best we can do is just return NULL. */ if (errorptr == NULL) return NULL; *errorptr = NULL; /* However, we can give a message for this error */ if (erroroffset == NULL) { *errorptr = ERR16; return NULL; } *erroroffset = 0; /* Can't support UTF8 unless PCRE has been compiled to include the code. */ #ifdef SUPPORT_UTF8 utf8 = (options & PCRE_UTF8) != 0; if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0 && (*erroroffset = valid_utf8((uschar *)pattern, -1)) >= 0) { *errorptr = ERR44; return NULL; } #else if ((options & PCRE_UTF8) != 0) { *errorptr = ERR32; return NULL; } #endif if ((options & ~PUBLIC_OPTIONS) != 0) { *errorptr = ERR17; return NULL; } /* Set up pointers to the individual character tables */ if (tables == NULL) tables = pcre_default_tables; compile_block.lcc = tables + lcc_offset; compile_block.fcc = tables + fcc_offset; compile_block.cbits = tables + cbits_offset; compile_block.ctypes = tables + ctypes_offset; /* Maximum back reference and backref bitmap. This is updated for numeric references during the first pass, but for named references during the actual compile pass. The bitmap records up to 31 back references to help in deciding whether (.*) can be treated as anchored or not. */ compile_block.top_backref = 0; compile_block.backref_map = 0; /* Reflect pattern for debugging output */ DPRINTF(("------------------------------------------------------------------\n")); DPRINTF(("%s\n", pattern)); /* The first thing to do is to make a pass over the pattern to compute the amount of store required to hold the compiled code. This does not have to be perfect as long as errors are overestimates. At the same time we can detect any flag settings right at the start, and extract them. Make an attempt to correct for any counted white space if an "extended" flag setting appears late in the pattern. We can't be so clever for #-comments. */ ptr = (const uschar *)(pattern - 1); while ((c = *(++ptr)) != 0) { int min, max; int class_optcount; int bracket_length; int duplength; /* If we are inside a \Q...\E sequence, all chars are literal */ if (inescq) goto NORMAL_CHAR; /* Otherwise, first check for ignored whitespace and comments */ if ((options & PCRE_EXTENDED) != 0) { if ((compile_block.ctypes[c] & ctype_space) != 0) continue; if (c == '#') { /* The space before the ; is to avoid a warning on a silly compiler on the Macintosh. */ while ((c = *(++ptr)) != 0 && c != NEWLINE) ; if (c == 0) break; continue; } } item_count++; /* Is zero for the first non-comment item */ switch(c) { /* A backslashed item may be an escaped "normal" character or a character type. For a "normal" character, put the pointers and character back so that tests for whitespace etc. in the input are done correctly. */ case '\\': { const uschar *save_ptr = ptr; c = check_escape(&ptr, errorptr, bracount, options, FALSE); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (c >= 0) { ptr = save_ptr; c = '\\'; goto NORMAL_CHAR; } } /* If \Q, enter "literal" mode */ if (-c == ESC_Q) { inescq = TRUE; continue; } /* Other escapes need one byte, and are of length one for repeats */ length++; #ifdef SUPPORT_UTF8 lastcharlength = 1; #endif /* A back reference needs an additional 2 bytes, plus either one or 5 bytes for a repeat. We also need to keep the value of the highest back reference. */ if (c <= -ESC_REF) { int refnum = -c - ESC_REF; compile_block.backref_map |= (refnum < 32)? (1 << refnum) : 1; if (refnum > compile_block.top_backref) compile_block.top_backref = refnum; length += 2; /* For single back reference */ if (ptr[1] == '{' && is_counted_repeat(ptr+2)) { ptr = read_repeat_counts(ptr+2, &min, &max, errorptr); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) length++; else length += 5; if (ptr[1] == '?') ptr++; } } continue; case '^': /* Single-byte metacharacters */ case '.': case '$': length++; #ifdef SUPPORT_UTF8 lastcharlength = 1; #endif continue; case '*': /* These repeats won't be after brackets; */ case '+': /* those are handled separately */ case '?': length++; goto POSESSIVE; /* A few lines below */ /* This covers the cases of braced repeats after a single char, metachar, class, or back reference. */ case '{': if (!is_counted_repeat(ptr+1)) goto NORMAL_CHAR; ptr = read_repeat_counts(ptr+1, &min, &max, errorptr); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; /* These special cases just insert one extra opcode */ if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) length++; /* These cases might insert additional copies of a preceding character. */ else { #ifdef SUPPORT_UTF8 /* In UTF-8 mode, we should find the length in lastcharlength */ if (utf8) { if (min != 1) { length -= lastcharlength; /* Uncount the original char or metachar */ if (min > 0) length += 3 + lastcharlength; } length += lastcharlength + ((max > 0)? 3 : 1); } else #endif /* Not UTF-8 mode: all characters are one byte */ { if (min != 1) { length--; /* Uncount the original char or metachar */ if (min > 0) length += 4; } length += (max > 0)? 4 : 2; } } if (ptr[1] == '?') ptr++; /* Needs no extra length */ POSESSIVE: /* Test for possessive quantifier */ if (ptr[1] == '+') { ptr++; length += 2 + 2*LINK_SIZE; /* Allow for atomic brackets */ } continue; /* An alternation contains an offset to the next branch or ket. If any ims options changed in the previous branch(es), and/or if we are in a lookbehind assertion, extra space will be needed at the start of the branch. This is handled by branch_extra. */ case '|': length += 1 + LINK_SIZE + branch_extra; continue; /* A character class uses 33 characters provided that all the character values are less than 256. Otherwise, it uses a bit map for low valued characters, and individual items for others. Don't worry about character types that aren't allowed in classes - they'll get picked up during the compile. A character class that contains only one single-byte character uses 2 or 3 bytes, depending on whether it is negated or not. Notice this where we can. (In UTF-8 mode we can do this only for chars < 128.) */ case '[': class_optcount = 0; #ifdef SUPPORT_UTF8 class_utf8 = FALSE; #endif if (*(++ptr) == '^') ptr++; /* Written as a "do" so that an initial ']' is taken as data */ if (*ptr != 0) do { /* Inside \Q...\E everything is literal except \E */ if (inescq) { if (*ptr != '\\' || ptr[1] != 'E') goto NON_SPECIAL_CHARACTER; inescq = FALSE; ptr += 1; continue; } /* Outside \Q...\E, check for escapes */ if (*ptr == '\\') { #ifdef SUPPORT_UTF8 int prevchar = ptr[-1]; #endif int ch = check_escape(&ptr, errorptr, bracount, options, TRUE); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; /* \b is backspace inside a class */ if (-ch == ESC_b) ch = '\b'; /* \Q enters quoting mode */ if (-ch == ESC_Q) { inescq = TRUE; continue; } /* Handle escapes that turn into characters */ if (ch >= 0) { #ifdef SUPPORT_UTF8 if (utf8) { if (ch > 127) class_optcount = 10; /* Ensure > 1 */ if (ch > 255) { uschar buffer[6]; if (!class_utf8) { class_utf8 = TRUE; length += LINK_SIZE + 1 + 1; } length += 1 + ord2utf8(ch, buffer); /* If this wide character is preceded by '-', add an extra 2 to the length in case the previous character was < 128, because in this case the whole range will be put into the list. */ if (prevchar == '-') length += 2; } } #endif class_optcount++; /* for possible optimization */ } else class_optcount = 10; /* \d, \s etc; make sure > 1 */ } /* Check the syntax for POSIX stuff. The bits we actually handle are checked during the real compile phase. */ else if (*ptr == '[' && check_posix_syntax(ptr, &ptr, &compile_block)) { ptr++; class_optcount = 10; /* Make sure > 1 */ } /* Anything else just increments the possible optimization count. If there are wide characters, we are going to have to use an XCLASS. */ else { NON_SPECIAL_CHARACTER: class_optcount++; #ifdef SUPPORT_UTF8 if (utf8) { int ch; int extra = 0; GETCHARLEN(ch, ptr, extra); if (ch > 127) class_optcount = 10; /* No optimization possible */ if (ch > 255) { if (!class_utf8) { class_utf8 = TRUE; length += LINK_SIZE + 1 + 1; } length += 2 + extra; /* If this wide character is preceded by '-', add an extra 2 to the length in case the previous character was < 128, because in this case the whole range will be put into the list. */ if (ptr[-1] == '-') length += 2; /* Advance to the end of this character */ ptr += extra; } } #endif } } while (*(++ptr) != 0 && (inescq || *ptr != ']')); /* Concludes "do" above */ if (*ptr == 0) /* Missing terminating ']' */ { *errorptr = ERR6; goto PCRE_ERROR_RETURN; } /* We can optimize when there was only one optimizable character. Repeats for positive and negated single one-byte chars are handled by the general code. Here, we handle repeats for the class opcodes. */ if (class_optcount == 1) length += 3; else { length += 33; /* A repeat needs either 1 or 5 bytes. If it is a possessive quantifier, we also need extra for wrapping the whole thing in a sub-pattern. */ if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2)) { ptr = read_repeat_counts(ptr+2, &min, &max, errorptr); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) length++; else length += 5; if (ptr[1] == '+') { ptr++; length += 2 + 2*LINK_SIZE; } else if (ptr[1] == '?') ptr++; } } continue; /* Brackets may be genuine groups or special things */ case '(': branch_newextra = 0; bracket_length = 1 + LINK_SIZE; /* Handle special forms of bracket, which all start (? */ if (ptr[1] == '?') { int set, unset; int *optset; switch (c = ptr[2]) { /* Skip over comments entirely */ case '#': ptr += 3; while (*ptr != 0 && *ptr != ')') ptr++; if (*ptr == 0) { *errorptr = ERR18; goto PCRE_ERROR_RETURN; } continue; /* Non-referencing groups and lookaheads just move the pointer on, and then behave like a non-special bracket, except that they don't increment the count of extracting brackets. Ditto for the "once only" bracket, which is in Perl from version 5.005. */ case ':': case '=': case '!': case '>': ptr += 2; break; /* (?R) specifies a recursive call to the regex, which is an extension to provide the facility which can be obtained by (?p{perl-code}) in Perl 5.6. In Perl 5.8 this has become (??{perl-code}). From PCRE 4.00, items such as (?3) specify subroutine-like "calls" to the appropriate numbered brackets. This includes both recursive and non-recursive calls. (?R) is now synonymous with (?0). */ case 'R': ptr++; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ptr += 2; if (c != 'R') while ((digitab[*(++ptr)] & ctype_digit) != 0); if (*ptr != ')') { *errorptr = ERR29; goto PCRE_ERROR_RETURN; } length += 1 + LINK_SIZE; /* If this item is quantified, it will get wrapped inside brackets so as to use the code for quantified brackets. We jump down and use the code that handles this for real brackets. */ if (ptr[1] == '+' || ptr[1] == '*' || ptr[1] == '?' || ptr[1] == '{') { length += 2 + 2 * LINK_SIZE; /* to make bracketed */ duplength = 5 + 3 * LINK_SIZE; goto HANDLE_QUANTIFIED_BRACKETS; } continue; /* (?C) is an extension which provides "callout" - to provide a bit of the functionality of the Perl (?{...}) feature. An optional number may follow (default is zero). */ case 'C': ptr += 2; while ((digitab[*(++ptr)] & ctype_digit) != 0); if (*ptr != ')') { *errorptr = ERR39; goto PCRE_ERROR_RETURN; } length += 2; continue; /* Named subpatterns are an extension copied from Python */ case 'P': ptr += 3; if (*ptr == '<') { const uschar *p; /* Don't amalgamate; some compilers */ p = ++ptr; /* grumble at autoincrement in declaration */ while ((compile_block.ctypes[*ptr] & ctype_word) != 0) ptr++; if (*ptr != '>') { *errorptr = ERR42; goto PCRE_ERROR_RETURN; } name_count++; if (ptr - p > max_name_size) max_name_size = (ptr - p); break; } if (*ptr == '=' || *ptr == '>') { while ((compile_block.ctypes[*(++ptr)] & ctype_word) != 0); if (*ptr != ')') { *errorptr = ERR42; goto PCRE_ERROR_RETURN; } break; } /* Unknown character after (?P */ *errorptr = ERR41; goto PCRE_ERROR_RETURN; /* Lookbehinds are in Perl from version 5.005 */ case '<': ptr += 3; if (*ptr == '=' || *ptr == '!') { branch_newextra = 1 + LINK_SIZE; length += 1 + LINK_SIZE; /* For the first branch */ break; } *errorptr = ERR24; goto PCRE_ERROR_RETURN; /* Conditionals are in Perl from version 5.005. The bracket must either be followed by a number (for bracket reference) or by an assertion group, or (a PCRE extension) by 'R' for a recursion test. */ case '(': if (ptr[3] == 'R' && ptr[4] == ')') { ptr += 4; length += 3; } else if ((digitab[ptr[3]] & ctype_digit) != 0) { ptr += 4; length += 3; while ((digitab[*ptr] & ctype_digit) != 0) ptr++; if (*ptr != ')') { *errorptr = ERR26; goto PCRE_ERROR_RETURN; } } else /* An assertion must follow */ { ptr++; /* Can treat like ':' as far as spacing is concerned */ if (ptr[2] != '?' || (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') ) { ptr += 2; /* To get right offset in message */ *errorptr = ERR28; goto PCRE_ERROR_RETURN; } } break; /* Else loop checking valid options until ) is met. Anything else is an error. If we are without any brackets, i.e. at top level, the settings act as if specified in the options, so massage the options immediately. This is for backward compatibility with Perl 5.004. */ default: set = unset = 0; optset = &set; ptr += 2; for (;; ptr++) { c = *ptr; switch (c) { case 'i': *optset |= PCRE_CASELESS; continue; case 'm': *optset |= PCRE_MULTILINE; continue; case 's': *optset |= PCRE_DOTALL; continue; case 'x': *optset |= PCRE_EXTENDED; continue; case 'X': *optset |= PCRE_EXTRA; continue; case 'U': *optset |= PCRE_UNGREEDY; continue; case '-': optset = &unset; continue; /* A termination by ')' indicates an options-setting-only item; if this is at the very start of the pattern (indicated by item_count being zero), we use it to set the global options. This is helpful when analyzing the pattern for first characters, etc. Otherwise nothing is done here and it is handled during the compiling process. [Historical note: Up to Perl 5.8, options settings at top level were always global settings, wherever they appeared in the pattern. That is, they were equivalent to an external setting. From 5.8 onwards, they apply only to what follows (which is what you might expect).] */ case ')': if (item_count == 0) { options = (options | set) & (~unset); set = unset = 0; /* To save length */ item_count--; /* To allow for several */ } /* Fall through */ /* A termination by ':' indicates the start of a nested group with the given options set. This is again handled at compile time, but we must allow for compiled space if any of the ims options are set. We also have to allow for resetting space at the end of the group, which is why 4 is added to the length and not just 2. If there are several changes of options within the same group, this will lead to an over-estimate on the length, but this shouldn't matter very much. We also have to allow for resetting options at the start of any alternations, which we do by setting branch_newextra to 2. Finally, we record whether the case-dependent flag ever changes within the regex. This is used by the "required character" code. */ case ':': if (((set|unset) & PCRE_IMS) != 0) { length += 4; branch_newextra = 2; if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED; } goto END_OPTIONS; /* Unrecognized option character */ default: *errorptr = ERR12; goto PCRE_ERROR_RETURN; } } /* If we hit a closing bracket, that's it - this is a freestanding option-setting. We need to ensure that branch_extra is updated if necessary. The only values branch_newextra can have here are 0 or 2. If the value is 2, then branch_extra must either be 2 or 5, depending on whether this is a lookbehind group or not. */ END_OPTIONS: if (c == ')') { if (branch_newextra == 2 && (branch_extra == 0 || branch_extra == 1+LINK_SIZE)) branch_extra += branch_newextra; continue; } /* If options were terminated by ':' control comes here. Fall through to handle the group below. */ } } /* Extracting brackets must be counted so we can process escapes in a Perlish way. If the number exceeds EXTRACT_BASIC_MAX we are going to need an additional 3 bytes of store per extracting bracket. However, if PCRE_NO_AUTO)CAPTURE is set, unadorned brackets become non-capturing, so we must leave the count alone (it will aways be zero). */ else if ((options & PCRE_NO_AUTO_CAPTURE) == 0) { bracount++; if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3; } /* Save length for computing whole length at end if there's a repeat that requires duplication of the group. Also save the current value of branch_extra, and start the new group with the new value. If non-zero, this will either be 2 for a (?imsx: group, or 3 for a lookbehind assertion. */ if (brastackptr >= sizeof(brastack)/sizeof(int)) { *errorptr = ERR19; goto PCRE_ERROR_RETURN; } bralenstack[brastackptr] = branch_extra; branch_extra = branch_newextra; brastack[brastackptr++] = length; length += bracket_length; continue; /* Handle ket. Look for subsequent max/min; for certain sets of values we have to replicate this bracket up to that many times. If brastackptr is 0 this is an unmatched bracket which will generate an error, but take care not to try to access brastack[-1] when computing the length and restoring the branch_extra value. */ case ')': length += 1 + LINK_SIZE; if (brastackptr > 0) { duplength = length - brastack[--brastackptr]; branch_extra = bralenstack[brastackptr]; } else duplength = 0; /* The following code is also used when a recursion such as (?3) is followed by a quantifier, because in that case, it has to be wrapped inside brackets so that the quantifier works. The value of duplength must be set before arrival. */ HANDLE_QUANTIFIED_BRACKETS: /* Leave ptr at the final char; for read_repeat_counts this happens automatically; for the others we need an increment. */ if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2)) { ptr = read_repeat_counts(ptr+2, &min, &max, errorptr); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; } else if (c == '*') { min = 0; max = -1; ptr++; } else if (c == '+') { min = 1; max = -1; ptr++; } else if (c == '?') { min = 0; max = 1; ptr++; } else { min = 1; max = 1; } /* If the minimum is zero, we have to allow for an OP_BRAZERO before the group, and if the maximum is greater than zero, we have to replicate maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting bracket set. */ if (min == 0) { length++; if (max > 0) length += (max - 1) * (duplength + 3 + 2*LINK_SIZE); } /* When the minimum is greater than zero, we have to replicate up to minval-1 times, with no additions required in the copies. Then, if there is a limited maximum we have to replicate up to maxval-1 times allowing for a BRAZERO item before each optional copy and nesting brackets for all but one of the optional copies. */ else { length += (min - 1) * duplength; if (max > min) /* Need this test as max=-1 means no limit */ length += (max - min) * (duplength + 3 + 2*LINK_SIZE) - (2 + 2*LINK_SIZE); } /* Allow space for once brackets for "possessive quantifier" */ if (ptr[1] == '+') { ptr++; length += 2 + 2*LINK_SIZE; } continue; /* Non-special character. For a run of such characters the length required is the number of characters + 2, except that the maximum run length is MAXLIT. We won't get a skipped space or a non-data escape or the start of a # comment as the first character, so the length can't be zero. */ NORMAL_CHAR: default: length += 2; runlength = 0; do { #ifdef SUPPORT_UTF8 lastcharlength = 1; /* Need length of last char for UTF-8 repeats */ #endif /* If in a \Q...\E sequence, check for end; otherwise it's a literal */ if (inescq) { if (c == '\\' && ptr[1] == 'E') { inescq = FALSE; ptr++; } else runlength++; continue; } /* Skip whitespace and comments for /x */ if ((options & PCRE_EXTENDED) != 0) { if ((compile_block.ctypes[c] & ctype_space) != 0) continue; if (c == '#') { /* The space before the ; is to avoid a warning on a silly compiler on the Macintosh. */ while ((c = *(++ptr)) != 0 && c != NEWLINE) ; continue; } } /* Backslash may introduce a data char or a metacharacter; stop the string before the latter. */ if (c == '\\') { const uschar *saveptr = ptr; c = check_escape(&ptr, errorptr, bracount, options, FALSE); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (c < 0) { ptr = saveptr; break; } /* In UTF-8 mode, add on the number of additional bytes needed to encode this character, and save the total length in case this is a final char that is repeated. */ #ifdef SUPPORT_UTF8 if (utf8 && c > 127) { int i; for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) if (c <= utf8_table1[i]) break; runlength += i; lastcharlength += i; } #endif } /* Ordinary character or single-char escape */ runlength++; } /* This "while" is the end of the "do" above. */ while (runlength < MAXLIT && (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0); /* If we hit a meta-character, back off to point to it */ if (runlength < MAXLIT) ptr--; /* If the last char in the string is a UTF-8 multibyte character, we must set lastcharlength correctly. If it was specified as an escape, this will already have been done above. However, we also have to support in-line UTF-8 characters, so check backwards from where we are. */ #ifdef SUPPORT_UTF8 if (utf8) { const uschar *lastptr = ptr - 1; if ((*lastptr & 0x80) != 0) { while((*lastptr & 0xc0) == 0x80) lastptr--; lastcharlength = ptr - lastptr; } } #endif length += runlength; continue; } } length += 2 + LINK_SIZE; /* For final KET and END */ if (length > MAX_PATTERN_SIZE) { *errorptr = ERR20; return NULL; } /* Compute the size of data block needed and get it, either from malloc or externally provided function. */ size = length + sizeof(real_pcre) + name_count * (max_name_size + 3); re = (real_pcre *)(pcre_malloc)(size); if (re == NULL) { *errorptr = ERR21; return NULL; } /* Put in the magic number, and save the size, options, and table pointer */ re->magic_number = MAGIC_NUMBER; re->size = size; re->options = options; re->tables = tables; re->name_entry_size = max_name_size + 3; re->name_count = name_count; /* The starting points of the name/number translation table and of the code are passed around in the compile data block. */ compile_block.names_found = 0; compile_block.name_entry_size = max_name_size + 3; compile_block.name_table = (uschar *)re + sizeof(real_pcre); codestart = compile_block.name_table + re->name_entry_size * re->name_count; compile_block.start_code = codestart; compile_block.req_varyopt = 0; /* Set up a starting, non-extracting bracket, then compile the expression. On error, *errorptr will be set non-NULL, so we don't need to look at the result of the function here. */ ptr = (const uschar *)pattern; code = (uschar *)codestart; *code = OP_BRA; bracount = 0; (void)compile_regex(options, options & PCRE_IMS, &bracount, &code, &ptr, errorptr, FALSE, 0, &firstbyte, &reqbyte, NULL, &compile_block); re->top_bracket = bracount; re->top_backref = compile_block.top_backref; /* If not reached end of pattern on success, there's an excess bracket. */ if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22; /* Fill in the terminating state and check for disastrous overflow, but if debugging, leave the test till after things are printed out. */ *code++ = OP_END; #ifndef DEBUG if (code - codestart > length) *errorptr = ERR23; #endif /* Give an error if there's back reference to a non-existent capturing subpattern. */ if (re->top_backref > re->top_bracket) *errorptr = ERR15; /* Failed to compile, or error while post-processing */ if (*errorptr != NULL) { (pcre_free)(re); PCRE_ERROR_RETURN: *erroroffset = ptr - (const uschar *)pattern; return NULL; } /* If the anchored option was not passed, set the flag if we can determine that the pattern is anchored by virtue of ^ characters or \A or anything else (such as starting with .* when DOTALL is set). Otherwise, if we know what the first character has to be, save it, because that speeds up unanchored matches no end. If not, see if we can set the PCRE_STARTLINE flag. This is helpful for multiline matches when all branches start with ^. and also when all branches start with .* for non-DOTALL matches. */ if ((options & PCRE_ANCHORED) == 0) { int temp_options = options; if (is_anchored(codestart, &temp_options, 0, compile_block.backref_map)) re->options |= PCRE_ANCHORED; else { if (firstbyte < 0) firstbyte = find_firstassertedchar(codestart, &temp_options, FALSE); if (firstbyte >= 0) /* Remove caseless flag for non-caseable chars */ { int ch = firstbyte & 255; re->first_byte = ((firstbyte & REQ_CASELESS) != 0 && compile_block.fcc[ch] == ch)? ch : firstbyte; re->options |= PCRE_FIRSTSET; } else if (is_startline(codestart, 0, compile_block.backref_map)) re->options |= PCRE_STARTLINE; } } /* For an anchored pattern, we use the "required byte" only if it follows a variable length item in the regex. Remove the caseless flag for non-caseable chars. */ if (reqbyte >= 0 && ((re->options & PCRE_ANCHORED) == 0 || (reqbyte & REQ_VARY) != 0)) { int ch = reqbyte & 255; re->req_byte = ((reqbyte & REQ_CASELESS) != 0 && compile_block.fcc[ch] == ch)? (reqbyte & ~REQ_CASELESS) : reqbyte; re->options |= PCRE_REQCHSET; } /* Print out the compiled data for debugging */ #ifdef DEBUG printf("Length = %d top_bracket = %d top_backref = %d\n", length, re->top_bracket, re->top_backref); if (re->options != 0) { printf("%s%s%s%s%s%s%s%s%s\n", ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "", ((re->options & PCRE_CASELESS) != 0)? "caseless " : "", ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "", ((re->options & PCRE_EXTENDED) != 0)? "extended " : "", ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "", ((re->options & PCRE_DOTALL) != 0)? "dotall " : "", ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "", ((re->options & PCRE_EXTRA) != 0)? "extra " : "", ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : ""); } if ((re->options & PCRE_FIRSTSET) != 0) { int ch = re->first_byte & 255; const char *caseless = ((re->first_byte & REQ_CASELESS) == 0)? "" : " (caseless)"; if (isprint(ch)) printf("First char = %c%s\n", ch, caseless); else printf("First char = \\x%02x%s\n", ch, caseless); } if ((re->options & PCRE_REQCHSET) != 0) { int ch = re->req_byte & 255; const char *caseless = ((re->req_byte & REQ_CASELESS) == 0)? "" : " (caseless)"; if (isprint(ch)) printf("Req char = %c%s\n", ch, caseless); else printf("Req char = \\x%02x%s\n", ch, caseless); } print_internals(re, stdout); /* This check is done here in the debugging case so that the code that was compiled can be seen. */ if (code - codestart > length) { *errorptr = ERR23; (pcre_free)(re); *erroroffset = ptr - (uschar *)pattern; return NULL; } #endif return (pcre *)re; } /************************************************* * Match a back-reference * *************************************************/ /* If a back reference hasn't been set, the length that is passed is greater than the number of characters left in the string, so the match fails. Arguments: offset index into the offset vector eptr points into the subject length length to be matched md points to match data block ims the ims flags Returns: TRUE if matched */ static BOOL match_ref(int offset, register const uschar *eptr, int length, match_data *md, unsigned long int ims) { const uschar *p = md->start_subject + md->offset_vector[offset]; #ifdef DEBUG if (eptr >= md->end_subject) printf("matching subject "); else { printf("matching subject "); pchars(eptr, length, TRUE, md); } printf(" against backref "); pchars(p, length, FALSE, md); printf("\n"); #endif /* Always fail if not enough characters left */ if (length > md->end_subject - eptr) return FALSE; /* Separate the caselesss case for speed */ if ((ims & PCRE_CASELESS) != 0) { while (length-- > 0) if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE; } else { while (length-- > 0) if (*p++ != *eptr++) return FALSE; } return TRUE; } #ifdef SUPPORT_UTF8 /************************************************* * Match character against an XCLASS * *************************************************/ /* This function is called from within the XCLASS code below, to match a character against an extended class which might match values > 255. Arguments: c the character data points to the flag byte of the XCLASS data Returns: TRUE if character matches, else FALSE */ static BOOL match_xclass(int c, const uschar *data) { int t; BOOL negated = (*data & XCL_NOT) != 0; /* Character values < 256 are matched against a bitmap, if one is present. If not, we still carry on, because there may be ranges that start below 256 in the additional data. */ if (c < 256) { if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0) return !negated; /* char found */ } /* Now match against the list of large chars or ranges that end with a large char. First skip the bit map if present. */ if ((*data++ & XCL_MAP) != 0) data += 32; while ((t = *data++) != XCL_END) { int x, y; GETCHARINC(x, data); if (t == XCL_SINGLE) { if (c == x) return !negated; } else { GETCHARINC(y, data); if (c >= x && c <= y) return !negated; } } return negated; /* char was not found */ } #endif /*************************************************************************** **************************************************************************** RECURSION IN THE match() FUNCTION The match() function is highly recursive. Some regular expressions can cause it to recurse thousands of times. I was writing for Unix, so I just let it call itself recursively. This uses the stack for saving everything that has to be saved for a recursive call. On Unix, the stack can be large, and this works fine. It turns out that on non-Unix systems there are problems with programs that use a lot of stack. (This despite the fact that every last chip has oodles of memory these days, and techniques for extending the stack have been known for decades.) So.... There is a fudge, triggered by defining NO_RECURSE, which avoids recursive calls by keeping local variables that need to be preserved in blocks of memory obtained from malloc instead instead of on the stack. Macros are used to achieve this so that the actual code doesn't look very different to what it always used to. **************************************************************************** ***************************************************************************/ /* These versions of the macros use the stack, as normal */ #ifndef NO_RECURSE #define REGISTER register #define RMATCH(rx,ra,rb,rc,rd,re,rf,rg) rx = match(ra,rb,rc,rd,re,rf,rg) #define RRETURN(ra) return ra #else /* These versions of the macros manage a private stack on the heap. Note that the rd argument of RMATCH isn't actually used. It's the md argument of match(), which never actually changes. */ #define REGISTER #define RMATCH(rx,ra,rb,rc,rd,re,rf,rg)\ {\ heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\ if (setjmp(frame->Xwhere) == 0)\ {\ newframe->Xeptr = ra;\ newframe->Xecode = rb;\ newframe->Xoffset_top = rc;\ newframe->Xims = re;\ newframe->Xeptrb = rf;\ newframe->Xflags = rg;\ newframe->Xprevframe = frame;\ frame = newframe;\ DPRINTF(("restarting from line %d\n", __LINE__));\ goto HEAP_RECURSE;\ }\ else\ {\ DPRINTF(("longjumped back to line %d\n", __LINE__));\ frame = md->thisframe;\ rx = frame->Xresult;\ }\ } #define RRETURN(ra)\ {\ heapframe *newframe = frame;\ frame = newframe->Xprevframe;\ (pcre_stack_free)(newframe);\ if (frame != NULL)\ {\ frame->Xresult = ra;\ md->thisframe = frame;\ longjmp(frame->Xwhere, 1);\ }\ return ra;\ } /* Structure for remembering the local variables in a private frame */ typedef struct heapframe { struct heapframe *Xprevframe; /* Function arguments that may change */ const uschar *Xeptr; const uschar *Xecode; int Xoffset_top; long int Xims; eptrblock *Xeptrb; int Xflags; /* Function local variables */ const uschar *Xcallpat; const uschar *Xcharptr; const uschar *Xdata; const uschar *Xlastptr; const uschar *Xnext; const uschar *Xpp; const uschar *Xprev; const uschar *Xsaved_eptr; recursion_info Xnew_recursive; BOOL Xcur_is_word; BOOL Xcondition; BOOL Xminimize; BOOL Xprev_is_word; unsigned long int Xoriginal_ims; int Xctype; int Xfc; int Xfi; int Xlength; int Xmax; int Xmin; int Xnumber; int Xoffset; int Xop; int Xsave_capture_last; int Xsave_offset1, Xsave_offset2, Xsave_offset3; int Xstacksave[REC_STACK_SAVE_MAX]; eptrblock Xnewptrb; /* Place to pass back result, and where to jump back to */ int Xresult; jmp_buf Xwhere; } heapframe; #endif /*************************************************************************** ***************************************************************************/ /************************************************* * Match from current position * *************************************************/ /* On entry ecode points to the first opcode, and eptr to the first character in the subject string, while eptrb holds the value of eptr at the start of the last bracketed group - used for breaking infinite loops matching zero-length strings. This function is called recursively in many circumstances. Whenever it returns a negative (error) response, the outer incarnation must also return the same response. Performance note: It might be tempting to extract commonly used fields from the md structure (e.g. utf8, end_subject) into individual variables to improve performance. Tests using gcc on a SPARC disproved this; in the first case, it made performance worse. Arguments: eptr pointer in subject ecode position in code offset_top current top pointer md pointer to "static" info for the match ims current /i, /m, and /s options eptrb pointer to chain of blocks containing eptr at start of brackets - for testing for empty matches flags can contain match_condassert - this is an assertion condition match_isgroup - this is the start of a bracketed group Returns: MATCH_MATCH if matched ) these values are >= 0 MATCH_NOMATCH if failed to match ) a negative PCRE_ERROR_xxx value if aborted by an error condition (e.g. stopped by recursion limit) */ static int match(REGISTER const uschar *eptr, REGISTER const uschar *ecode, int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb, int flags) { /* These variables do not need to be preserved over recursion in this function, so they can be ordinary variables in all cases. Mark them with "register" because they are used a lot in loops. */ register int rrc; /* Returns from recursive calls */ register int i; /* Used for loops not involving calls to RMATCH() */ register int c; /* Character values not kept over RMATCH() calls */ /* When recursion is not being used, all "local" variables that have to be preserved over calls to RMATCH() are part of a "frame" which is obtained from heap storage. Set up the top-level frame here; others are obtained from the heap whenever RMATCH() does a "recursion". See the macro definitions above. */ #ifdef NO_RECURSE heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe)); frame->Xprevframe = NULL; /* Marks the top level */ /* Copy in the original argument variables */ frame->Xeptr = eptr; frame->Xecode = ecode; frame->Xoffset_top = offset_top; frame->Xims = ims; frame->Xeptrb = eptrb; frame->Xflags = flags; /* This is where control jumps back to to effect "recursion" */ HEAP_RECURSE: /* Macros make the argument variables come from the current frame */ #define eptr frame->Xeptr #define ecode frame->Xecode #define offset_top frame->Xoffset_top #define ims frame->Xims #define eptrb frame->Xeptrb #define flags frame->Xflags /* Ditto for the local variables */ #define callpat frame->Xcallpat #define charptr frame->Xcharptr #define data frame->Xdata #define lastptr frame->Xlastptr #define next frame->Xnext #define pp frame->Xpp #define prev frame->Xprev #define saved_eptr frame->Xsaved_eptr #define new_recursive frame->Xnew_recursive #define cur_is_word frame->Xcur_is_word #define condition frame->Xcondition #define minimize frame->Xminimize #define prev_is_word frame->Xprev_is_word #define original_ims frame->Xoriginal_ims #define ctype frame->Xctype #define fc frame->Xfc #define fi frame->Xfi #define length frame->Xlength #define max frame->Xmax #define min frame->Xmin #define number frame->Xnumber #define offset frame->Xoffset #define op frame->Xop #define save_capture_last frame->Xsave_capture_last #define save_offset1 frame->Xsave_offset1 #define save_offset2 frame->Xsave_offset2 #define save_offset3 frame->Xsave_offset3 #define stacksave frame->Xstacksave #define newptrb frame->Xnewptrb /* When recursion is being used, local variables are allocated on the stack and get preserved during recursion in the normal way. In this environment, fi and i, and fc and c, can be the same variables. */ #else #define fi i #define fc c const uschar *callpat; /* Many of these variables are used ony */ const uschar *charptr; /* small blocks of the code. My normal */ const uschar *data; /* style of coding would have declared */ const uschar *lastptr; /* them within each of those blocks. */ const uschar *next; /* However, in order to accommodate the */ const uschar *pp; /* version of this code that uses an */ const uschar *prev; /* external "stack" implemented on the */ const uschar *saved_eptr; /* heap, it is easier to declare them */ /* all here, so the declarations can */ recursion_info new_recursive; /* be cut out in a block. The only */ /* declarations within blocks below are */ BOOL cur_is_word; /* for variables that do not have to */ BOOL condition; /* be preserved over a recursive call */ BOOL minimize; /* to RMATCH(). */ BOOL prev_is_word; unsigned long int original_ims; int ctype; int length; int max; int min; int number; int offset; int op; int save_capture_last; int save_offset1, save_offset2, save_offset3; int stacksave[REC_STACK_SAVE_MAX]; eptrblock newptrb; #endif /* OK, now we can get on with the real code of the function. Recursion is specified by the macros RMATCH and RRETURN. When NO_RECURSE is *not* defined, these just turn into a recursive call to match() and a "return", respectively. However, RMATCH isn't like a function call because it's quite a complicated macro. It has to be used in one particular way. This shouldn't, however, impact performance when true recursion is being used. */ if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT); original_ims = ims; /* Save for resetting on ')' */ /* At the start of a bracketed group, add the current subject pointer to the stack of such pointers, to be re-instated at the end of the group when we hit the closing ket. When match() is called in other circumstances, we don't add to this stack. */ if ((flags & match_isgroup) != 0) { newptrb.epb_prev = eptrb; newptrb.epb_saved_eptr = eptr; eptrb = &newptrb; } /* Now start processing the operations. */ for (;;) { op = *ecode; minimize = FALSE; /* Opening capturing bracket. If there is space in the offset vector, save the current subject position in the working slot at the top of the vector. We mustn't change the current values of the data slot, because they may be set from a previous iteration of this group, and be referred to by a reference inside the group. If the bracket fails to match, we need to restore this value and also the values of the final offsets, in case they were set by a previous iteration of the same bracket. If there isn't enough space in the offset vector, treat this as if it were a non-capturing bracket. Don't worry about setting the flag for the error case here; that is handled in the code for KET. */ if (op > OP_BRA) { number = op - OP_BRA; /* For extended extraction brackets (large number), we have to fish out the number from a dummy opcode at the start. */ if (number > EXTRACT_BASIC_MAX) number = GET2(ecode, 2+LINK_SIZE); offset = number << 1; #ifdef DEBUG printf("start bracket %d subject=", number); pchars(eptr, 16, TRUE, md); printf("\n"); #endif if (offset < md->offset_max) { save_offset1 = md->offset_vector[offset]; save_offset2 = md->offset_vector[offset+1]; save_offset3 = md->offset_vector[md->offset_end - number]; save_capture_last = md->capture_last; DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); md->offset_vector[md->offset_end - number] = eptr - md->start_subject; do { RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, match_isgroup); if (rrc != MATCH_NOMATCH) RRETURN(rrc); md->capture_last = save_capture_last; ecode += GET(ecode, 1); } while (*ecode == OP_ALT); DPRINTF(("bracket %d failed\n", number)); md->offset_vector[offset] = save_offset1; md->offset_vector[offset+1] = save_offset2; md->offset_vector[md->offset_end - number] = save_offset3; RRETURN(MATCH_NOMATCH); } /* Insufficient room for saving captured contents */ else op = OP_BRA; } /* Other types of node can be handled by a switch */ switch(op) { case OP_BRA: /* Non-capturing bracket: optimized */ DPRINTF(("start bracket 0\n")); do { RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, match_isgroup); if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode += GET(ecode, 1); } while (*ecode == OP_ALT); DPRINTF(("bracket 0 failed\n")); RRETURN(MATCH_NOMATCH); /* Conditional group: compilation checked that there are no more than two branches. If the condition is false, skipping the first branch takes us past the end if there is only one branch, but that's OK because that is exactly what going to the ket would do. */ case OP_COND: if (ecode[LINK_SIZE+1] == OP_CREF) /* Condition extract or recurse test */ { offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */ condition = (offset == CREF_RECURSE * 2)? (md->recursive != NULL) : (offset < offset_top && md->offset_vector[offset] >= 0); RMATCH(rrc, eptr, ecode + (condition? (LINK_SIZE + 4) : (LINK_SIZE + 1 + GET(ecode, 1))), offset_top, md, ims, eptrb, match_isgroup); RRETURN(rrc); } /* The condition is an assertion. Call match() to evaluate it - setting the final argument TRUE causes it to stop at the end of an assertion. */ else { RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, match_condassert | match_isgroup); if (rrc == MATCH_MATCH) { ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE+2); while (*ecode == OP_ALT) ecode += GET(ecode, 1); } else if (rrc != MATCH_NOMATCH) { RRETURN(rrc); /* Need braces because of following else */ } else ecode += GET(ecode, 1); RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, match_isgroup); RRETURN(rrc); } /* Control never reaches here */ /* Skip over conditional reference or large extraction number data if encountered. */ case OP_CREF: case OP_BRANUMBER: ecode += 3; break; /* End of the pattern. If we are in a recursion, we should restore the offsets appropriately and continue from after the call. */ case OP_END: if (md->recursive != NULL && md->recursive->group_num == 0) { recursion_info *rec = md->recursive; DPRINTF(("Hit the end in a (?0) recursion\n")); md->recursive = rec->prevrec; memmove(md->offset_vector, rec->offset_save, rec->saved_max * sizeof(int)); md->start_match = rec->save_start; ims = original_ims; ecode = rec->after_call; break; } /* Otherwise, if PCRE_NOTEMPTY is set, fail if we have matched an empty string - backtracking will then try other alternatives, if any. */ if (md->notempty && eptr == md->start_match) RRETURN(MATCH_NOMATCH); md->end_match_ptr = eptr; /* Record where we ended */ md->end_offset_top = offset_top; /* and how many extracts were taken */ RRETURN(MATCH_MATCH); /* Change option settings */ case OP_OPT: ims = ecode[1]; ecode += 2; DPRINTF(("ims set to %02lx\n", ims)); break; /* Assertion brackets. Check the alternative branches in turn - the matching won't pass the KET for an assertion. If any one branch matches, the assertion is true. Lookbehind assertions have an OP_REVERSE item at the start of each branch to move the current point backwards, so the code at this level is identical to the lookahead case. */ case OP_ASSERT: case OP_ASSERTBACK: do { RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, match_isgroup); if (rrc == MATCH_MATCH) break; if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode += GET(ecode, 1); } while (*ecode == OP_ALT); if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH); /* If checking an assertion for a condition, return MATCH_MATCH. */ if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH); /* Continue from after the assertion, updating the offsets high water mark, since extracts may have been taken during the assertion. */ do ecode += GET(ecode,1); while (*ecode == OP_ALT); ecode += 1 + LINK_SIZE; offset_top = md->end_offset_top; continue; /* Negative assertion: all branches must fail to match */ case OP_ASSERT_NOT: case OP_ASSERTBACK_NOT: do { RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, match_isgroup); if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH); if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode += GET(ecode,1); } while (*ecode == OP_ALT); if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH); ecode += 1 + LINK_SIZE; continue; /* Move the subject pointer back. This occurs only at the start of each branch of a lookbehind assertion. If we are too close to the start to move back, this match function fails. When working with UTF-8 we move back a number of characters, not bytes. */ case OP_REVERSE: #ifdef SUPPORT_UTF8 if (md->utf8) { c = GET(ecode,1); for (i = 0; i < c; i++) { eptr--; if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); BACKCHAR(eptr) } } else #endif /* No UTF-8 support, or not in UTF-8 mode: count is byte count */ { eptr -= GET(ecode,1); if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); } /* Skip to next op code */ ecode += 1 + LINK_SIZE; break; /* The callout item calls an external function, if one is provided, passing details of the match so far. This is mainly for debugging, though the function is able to force a failure. */ case OP_CALLOUT: if (pcre_callout != NULL) { pcre_callout_block cb; cb.version = 0; /* Version 0 of the callout block */ cb.callout_number = ecode[1]; cb.offset_vector = md->offset_vector; cb.subject = (const char *)md->start_subject; cb.subject_length = md->end_subject - md->start_subject; cb.start_match = md->start_match - md->start_subject; cb.current_position = eptr - md->start_subject; cb.capture_top = offset_top/2; cb.capture_last = md->capture_last; cb.callout_data = md->callout_data; if ((rrc = (*pcre_callout)(&cb)) > 0) RRETURN(MATCH_NOMATCH); if (rrc < 0) RRETURN(rrc); } ecode += 2; break; /* Recursion either matches the current regex, or some subexpression. The offset data is the offset to the starting bracket from the start of the whole pattern. (This is so that it works from duplicated subpatterns.) If there are any capturing brackets started but not finished, we have to save their starting points and reinstate them after the recursion. However, we don't know how many such there are (offset_top records the completed total) so we just have to save all the potential data. There may be up to 65535 such values, which is too large to put on the stack, but using malloc for small numbers seems expensive. As a compromise, the stack is used when there are no more than REC_STACK_SAVE_MAX values to store; otherwise malloc is used. A problem is what to do if the malloc fails ... there is no way of returning to the top level with an error. Save the top REC_STACK_SAVE_MAX values on the stack, and accept that the rest may be wrong. There are also other values that have to be saved. We use a chained sequence of blocks that actually live on the stack. Thanks to Robin Houston for the original version of this logic. */ case OP_RECURSE: { callpat = md->start_code + GET(ecode, 1); new_recursive.group_num = *callpat - OP_BRA; /* For extended extraction brackets (large number), we have to fish out the number from a dummy opcode at the start. */ if (new_recursive.group_num > EXTRACT_BASIC_MAX) new_recursive.group_num = GET2(callpat, 2+LINK_SIZE); /* Add to "recursing stack" */ new_recursive.prevrec = md->recursive; md->recursive = &new_recursive; /* Find where to continue from afterwards */ ecode += 1 + LINK_SIZE; new_recursive.after_call = ecode; /* Now save the offset data. */ new_recursive.saved_max = md->offset_end; if (new_recursive.saved_max <= REC_STACK_SAVE_MAX) new_recursive.offset_save = stacksave; else { new_recursive.offset_save = (int *)(pcre_malloc)(new_recursive.saved_max * sizeof(int)); if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY); } memcpy(new_recursive.offset_save, md->offset_vector, new_recursive.saved_max * sizeof(int)); new_recursive.save_start = md->start_match; md->start_match = eptr; /* OK, now we can do the recursion. For each top-level alternative we restore the offset and recursion data. */ DPRINTF(("Recursing into group %d\n", new_recursive.group_num)); do { RMATCH(rrc, eptr, callpat + 1 + LINK_SIZE, offset_top, md, ims, eptrb, match_isgroup); if (rrc == MATCH_MATCH) { md->recursive = new_recursive.prevrec; if (new_recursive.offset_save != stacksave) (pcre_free)(new_recursive.offset_save); RRETURN(MATCH_MATCH); } else if (rrc != MATCH_NOMATCH) RRETURN(rrc); md->recursive = &new_recursive; memcpy(md->offset_vector, new_recursive.offset_save, new_recursive.saved_max * sizeof(int)); callpat += GET(callpat, 1); } while (*callpat == OP_ALT); DPRINTF(("Recursion didn't match\n")); md->recursive = new_recursive.prevrec; if (new_recursive.offset_save != stacksave) (pcre_free)(new_recursive.offset_save); RRETURN(MATCH_NOMATCH); } /* Control never reaches here */ /* "Once" brackets are like assertion brackets except that after a match, the point in the subject string is not moved back. Thus there can never be a move back into the brackets. Friedl calls these "atomic" subpatterns. Check the alternative branches in turn - the matching won't pass the KET for this kind of subpattern. If any one branch matches, we carry on as at the end of a normal bracket, leaving the subject pointer. */ case OP_ONCE: { prev = ecode; saved_eptr = eptr; do { RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, match_isgroup); if (rrc == MATCH_MATCH) break; if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode += GET(ecode,1); } while (*ecode == OP_ALT); /* If hit the end of the group (which could be repeated), fail */ if (*ecode != OP_ONCE && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH); /* Continue as from after the assertion, updating the offsets high water mark, since extracts may have been taken. */ do ecode += GET(ecode,1); while (*ecode == OP_ALT); offset_top = md->end_offset_top; eptr = md->end_match_ptr; /* For a non-repeating ket, just continue at this level. This also happens for a repeating ket if no characters were matched in the group. This is the forcible breaking of infinite loops as implemented in Perl 5.005. If there is an options reset, it will get obeyed in the normal course of events. */ if (*ecode == OP_KET || eptr == saved_eptr) { ecode += 1+LINK_SIZE; break; } /* The repeating kets try the rest of the pattern or restart from the preceding bracket, in the appropriate order. We need to reset any options that changed within the bracket before re-running it, so check the next opcode. */ if (ecode[1+LINK_SIZE] == OP_OPT) { ims = (ims & ~PCRE_IMS) | ecode[4]; DPRINTF(("ims set to %02lx at group repeat\n", ims)); } if (*ecode == OP_KETRMIN) { RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup); if (rrc != MATCH_NOMATCH) RRETURN(rrc); } else /* OP_KETRMAX */ { RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup); if (rrc != MATCH_NOMATCH) RRETURN(rrc); RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); } } RRETURN(MATCH_NOMATCH); /* An alternation is the end of a branch; scan along to find the end of the bracketed group and go to there. */ case OP_ALT: do ecode += GET(ecode,1); while (*ecode == OP_ALT); break; /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating that it may occur zero times. It may repeat infinitely, or not at all - i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper repeat limits are compiled as a number of copies, with the optional ones preceded by BRAZERO or BRAMINZERO. */ case OP_BRAZERO: { next = ecode+1; RMATCH(rrc, eptr, next, offset_top, md, ims, eptrb, match_isgroup); if (rrc != MATCH_NOMATCH) RRETURN(rrc); do next += GET(next,1); while (*next == OP_ALT); ecode = next + 1+LINK_SIZE; } break; case OP_BRAMINZERO: { next = ecode+1; do next += GET(next,1); while (*next == OP_ALT); RMATCH(rrc, eptr, next + 1+LINK_SIZE, offset_top, md, ims, eptrb, match_isgroup); if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode++; } break; /* End of a group, repeated or non-repeating. If we are at the end of an assertion "group", stop matching and return MATCH_MATCH, but record the current high water mark for use by positive assertions. Do this also for the "once" (not-backup up) groups. */ case OP_KET: case OP_KETRMIN: case OP_KETRMAX: { prev = ecode - GET(ecode, 1); saved_eptr = eptrb->epb_saved_eptr; /* Back up the stack of bracket start pointers. */ eptrb = eptrb->epb_prev; if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || *prev == OP_ONCE) { md->end_match_ptr = eptr; /* For ONCE */ md->end_offset_top = offset_top; RRETURN(MATCH_MATCH); } /* In all other cases except a conditional group we have to check the group number back at the start and if necessary complete handling an extraction by setting the offsets and bumping the high water mark. */ if (*prev != OP_COND) { number = *prev - OP_BRA; /* For extended extraction brackets (large number), we have to fish out the number from a dummy opcode at the start. */ if (number > EXTRACT_BASIC_MAX) number = GET2(prev, 2+LINK_SIZE); offset = number << 1; #ifdef DEBUG printf("end bracket %d", number); printf("\n"); #endif /* Test for a numbered group. This includes groups called as a result of recursion. Note that whole-pattern recursion is coded as a recurse into group 0, so it won't be picked up here. Instead, we catch it when the OP_END is reached. */ if (number > 0) { md->capture_last = number; if (offset >= md->offset_max) md->offset_overflow = TRUE; else { md->offset_vector[offset] = md->offset_vector[md->offset_end - number]; md->offset_vector[offset+1] = eptr - md->start_subject; if (offset_top <= offset) offset_top = offset + 2; } /* Handle a recursively called group. Restore the offsets appropriately and continue from after the call. */ if (md->recursive != NULL && md->recursive->group_num == number) { recursion_info *rec = md->recursive; DPRINTF(("Recursion (%d) succeeded - continuing\n", number)); md->recursive = rec->prevrec; md->start_match = rec->save_start; memcpy(md->offset_vector, rec->offset_save, rec->saved_max * sizeof(int)); ecode = rec->after_call; ims = original_ims; break; } } } /* Reset the value of the ims flags, in case they got changed during the group. */ ims = original_ims; DPRINTF(("ims reset to %02lx\n", ims)); /* For a non-repeating ket, just continue at this level. This also happens for a repeating ket if no characters were matched in the group. This is the forcible breaking of infinite loops as implemented in Perl 5.005. If there is an options reset, it will get obeyed in the normal course of events. */ if (*ecode == OP_KET || eptr == saved_eptr) { ecode += 1 + LINK_SIZE; break; } /* The repeating kets try the rest of the pattern or restart from the preceding bracket, in the appropriate order. */ if (*ecode == OP_KETRMIN) { RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup); if (rrc != MATCH_NOMATCH) RRETURN(rrc); } else /* OP_KETRMAX */ { RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup); if (rrc != MATCH_NOMATCH) RRETURN(rrc); RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); } } RRETURN(MATCH_NOMATCH); /* Start of subject unless notbol, or after internal newline if multiline */ case OP_CIRC: if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH); if ((ims & PCRE_MULTILINE) != 0) { if (eptr != md->start_subject && eptr[-1] != NEWLINE) RRETURN(MATCH_NOMATCH); ecode++; break; } /* ... else fall through */ /* Start of subject assertion */ case OP_SOD: if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH); ecode++; break; /* Start of match assertion */ case OP_SOM: if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH); ecode++; break; /* Assert before internal newline if multiline, or before a terminating newline unless endonly is set, else end of subject unless noteol is set. */ case OP_DOLL: if ((ims & PCRE_MULTILINE) != 0) { if (eptr < md->end_subject) { if (*eptr != NEWLINE) RRETURN(MATCH_NOMATCH); } else { if (md->noteol) RRETURN(MATCH_NOMATCH); } ecode++; break; } else { if (md->noteol) RRETURN(MATCH_NOMATCH); if (!md->endonly) { if (eptr < md->end_subject - 1 || (eptr == md->end_subject - 1 && *eptr != NEWLINE)) RRETURN(MATCH_NOMATCH); ecode++; break; } } /* ... else fall through */ /* End of subject assertion (\z) */ case OP_EOD: if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH); ecode++; break; /* End of subject or ending \n assertion (\Z) */ case OP_EODN: if (eptr < md->end_subject - 1 || (eptr == md->end_subject - 1 && *eptr != NEWLINE)) RRETURN(MATCH_NOMATCH); ecode++; break; /* Word boundary assertions */ case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: { /* Find out if the previous and current characters are "word" characters. It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to be "non-word" characters. */ #ifdef SUPPORT_UTF8 if (md->utf8) { if (eptr == md->start_subject) prev_is_word = FALSE; else { lastptr = eptr - 1; while((*lastptr & 0xc0) == 0x80) lastptr--; GETCHAR(c, lastptr); prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; } if (eptr >= md->end_subject) cur_is_word = FALSE; else { GETCHAR(c, eptr); cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; } } else #endif /* More streamlined when not in UTF-8 mode */ { prev_is_word = (eptr != md->start_subject) && ((md->ctypes[eptr[-1]] & ctype_word) != 0); cur_is_word = (eptr < md->end_subject) && ((md->ctypes[*eptr] & ctype_word) != 0); } /* Now see if the situation is what we want */ if ((*ecode++ == OP_WORD_BOUNDARY)? cur_is_word == prev_is_word : cur_is_word != prev_is_word) RRETURN(MATCH_NOMATCH); } break; /* Match a single character type; inline for speed */ case OP_ANY: if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == NEWLINE) RRETURN(MATCH_NOMATCH); if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); #ifdef SUPPORT_UTF8 if (md->utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; #endif ecode++; break; /* Match a single byte, even in UTF-8 mode. This opcode really does match any byte, even newline, independent of the setting of PCRE_DOTALL. */ case OP_ANYBYTE: if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_NOT_DIGIT: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c < 256 && #endif (md->ctypes[c] & ctype_digit) != 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_DIGIT: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c >= 256 || #endif (md->ctypes[c] & ctype_digit) == 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_NOT_WHITESPACE: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c < 256 && #endif (md->ctypes[c] & ctype_space) != 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_WHITESPACE: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c >= 256 || #endif (md->ctypes[c] & ctype_space) == 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_NOT_WORDCHAR: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c < 256 && #endif (md->ctypes[c] & ctype_word) != 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_WORDCHAR: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c >= 256 || #endif (md->ctypes[c] & ctype_word) == 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; /* Match a back reference, possibly repeatedly. Look past the end of the item to see if there is repeat information following. The code is similar to that for character classes, but repeated for efficiency. Then obey similar code to character type repeats - written out again for speed. However, if the referenced string is the empty string, always treat it as matched, any number of times (otherwise there could be infinite loops). */ case OP_REF: { offset = GET2(ecode, 1) << 1; /* Doubled ref number */ ecode += 3; /* Advance past item */ /* If the reference is unset, set the length to be longer than the amount of subject left; this ensures that every attempt at a match fails. We can't just fail here, because of the possibility of quantifiers with zero minima. */ length = (offset >= offset_top || md->offset_vector[offset] < 0)? md->end_subject - eptr + 1 : md->offset_vector[offset+1] - md->offset_vector[offset]; /* Set up for repetition, or handle the non-repeated case */ switch (*ecode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: c = *ecode++ - OP_CRSTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; break; case OP_CRRANGE: case OP_CRMINRANGE: minimize = (*ecode == OP_CRMINRANGE); min = GET2(ecode, 1); max = GET2(ecode, 3); if (max == 0) max = INT_MAX; ecode += 5; break; default: /* No repeat follows */ if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); eptr += length; continue; /* With the main loop */ } /* If the length of the reference is zero, just continue with the main loop. */ if (length == 0) continue; /* First, ensure the minimum number of matches are present. We get back the length of the reference string explicitly rather than passing the address of eptr, so that eptr can be a register variable. */ for (i = 1; i <= min; i++) { if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); eptr += length; } /* If min = max, continue at the same level without recursion. They are not both allowed to be zero. */ if (min == max) continue; /* If minimizing, keep trying and advancing the pointer */ if (minimize) { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || !match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); eptr += length; } /* Control never gets here */ } /* If maximizing, find the longest string and work backwards */ else { pp = eptr; for (i = min; i < max; i++) { if (!match_ref(offset, eptr, length, md, ims)) break; eptr += length; } while (eptr >= pp) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr -= length; } RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ /* Match a bit-mapped character class, possibly repeatedly. This op code is used when all the characters in the class have values in the range 0-255. The only difference between OP_CLASS and OP_NCLASS occurs when a data character outside the range is encountered. First, look past the end of the item to see if there is repeat information following. Then obey similar code to character type repeats - written out again for speed. */ case OP_NCLASS: case OP_CLASS: { data = ecode + 1; /* Save for matching */ ecode += 33; /* Advance past the item */ switch (*ecode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: c = *ecode++ - OP_CRSTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; break; case OP_CRRANGE: case OP_CRMINRANGE: minimize = (*ecode == OP_CRMINRANGE); min = GET2(ecode, 1); max = GET2(ecode, 3); if (max == 0) max = INT_MAX; ecode += 5; break; default: /* No repeat follows */ min = max = 1; break; } /* First, ensure the minimum number of matches are present. */ #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (c > 255) { if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); } else { if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } } } else #endif /* Not UTF-8 mode */ { for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); c = *eptr++; if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } } /* If max == min we can continue with the main loop without the need to recurse. */ if (min == max) continue; /* If minimizing, keep testing the rest of the expression and advancing the pointer while it matches the class. */ if (minimize) { #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (c > 255) { if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); } else { if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } } } else #endif /* Not UTF-8 mode */ { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); c = *eptr++; if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ } /* If maximizing, find the longest possible run, then work backwards. */ else { pp = eptr; #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c > 255) { if (op == OP_CLASS) break; } else { if ((data[c/8] & (1 << (c&7))) == 0) break; } eptr += len; } for (;;) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr); } } else #endif /* Not UTF-8 mode */ { for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; c = *eptr; if ((data[c/8] & (1 << (c&7))) == 0) break; eptr++; } while (eptr >= pp) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); eptr--; if (rrc != MATCH_NOMATCH) RRETURN(rrc); } } RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ /* Match an extended character class. This opcode is encountered only in UTF-8 mode, because that's the only time it is compiled. */ #ifdef SUPPORT_UTF8 case OP_XCLASS: { data = ecode + 1 + LINK_SIZE; /* Save for matching */ ecode += GET(ecode, 1); /* Advance past the item */ switch (*ecode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: c = *ecode++ - OP_CRSTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; break; case OP_CRRANGE: case OP_CRMINRANGE: minimize = (*ecode == OP_CRMINRANGE); min = GET2(ecode, 1); max = GET2(ecode, 3); if (max == 0) max = INT_MAX; ecode += 5; break; default: /* No repeat follows */ min = max = 1; break; } /* First, ensure the minimum number of matches are present. */ for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (!match_xclass(c, data)) RRETURN(MATCH_NOMATCH); } /* If max == min we can continue with the main loop without the need to recurse. */ if (min == max) continue; /* If minimizing, keep testing the rest of the expression and advancing the pointer while it matches the class. */ if (minimize) { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (!match_xclass(c, data)) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } /* If maximizing, find the longest possible run, then work backwards. */ else { pp = eptr; for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (!match_xclass(c, data)) break; eptr += len; } for(;;) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr) } RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } #endif /* End of XCLASS */ /* Match a run of characters */ case OP_CHARS: { register int slen = ecode[1]; ecode += 2; #ifdef DEBUG /* Sigh. Some compilers never learn. */ if (eptr >= md->end_subject) printf("matching subject against pattern "); else { printf("matching subject "); pchars(eptr, slen, TRUE, md); printf(" against pattern "); } pchars(ecode, slen, FALSE, md); printf("\n"); #endif if (slen > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); if ((ims & PCRE_CASELESS) != 0) { while (slen-- > 0) if (md->lcc[*ecode++] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } else { while (slen-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH); } } break; /* Match a single character repeatedly; different opcodes share code. */ case OP_EXACT: min = max = GET2(ecode, 1); ecode += 3; goto REPEATCHAR; case OP_UPTO: case OP_MINUPTO: min = 0; max = GET2(ecode, 1); minimize = *ecode == OP_MINUPTO; ecode += 3; goto REPEATCHAR; case OP_STAR: case OP_MINSTAR: case OP_PLUS: case OP_MINPLUS: case OP_QUERY: case OP_MINQUERY: c = *ecode++ - OP_STAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; /* Common code for all repeated single-character matches. We can give up quickly if there are fewer than the minimum number of characters left in the subject. */ REPEATCHAR: #ifdef SUPPORT_UTF8 if (md->utf8) { length = 1; charptr = ecode; GETCHARLEN(fc, ecode, length); if (min * length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); ecode += length; /* Handle multibyte character matching specially here. There is no support for any kind of casing for multibyte characters. */ if (length > 1) { for (i = 1; i <= min; i++) { if (memcmp(eptr, charptr, length) != 0) RRETURN(MATCH_NOMATCH); eptr += length; } if (min == max) continue; if (minimize) { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || memcmp(eptr, charptr, length) != 0) RRETURN(MATCH_NOMATCH); eptr += length; } /* Control never gets here */ } else { pp = eptr; for (i = min; i < max; i++) { if (eptr > md->end_subject - length || memcmp(eptr, charptr, length) != 0) break; eptr += length; } while (eptr >= pp) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr -= length; } RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } /* If the length of a UTF-8 character is 1, we fall through here, and obey the code as for non-UTF-8 characters below, though in this case the value of fc will always be < 128. */ } else #endif /* When not in UTF-8 mode, load a single-byte character. */ { if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); fc = *ecode++; } /* The value of fc at this point is always less than 256, though we may or may not be in UTF-8 mode. The code is duplicated for the caseless and caseful cases, for speed, since matching characters is likely to be quite common. First, ensure the minimum number of matches are present. If min = max, continue at the same level without recursing. Otherwise, if minimizing, keep trying the rest of the expression and advancing one matching character if failing, up to the maximum. Alternatively, if maximizing, find the maximum number of characters and work backwards. */ DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max, max, eptr)); if ((ims & PCRE_CASELESS) != 0) { fc = md->lcc[fc]; for (i = 1; i <= min; i++) if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); if (min == max) continue; if (minimize) { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } else { pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break; eptr++; } while (eptr >= pp) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); eptr--; if (rrc != MATCH_NOMATCH) RRETURN(rrc); } RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } /* Caseful comparisons (includes all multi-byte characters) */ else { for (i = 1; i <= min; i++) if (fc != *eptr++) RRETURN(MATCH_NOMATCH); if (min == max) continue; if (minimize) { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || fc != *eptr++) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } else { pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || fc != *eptr) break; eptr++; } while (eptr >= pp) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); eptr--; if (rrc != MATCH_NOMATCH) RRETURN(rrc); } RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ /* Match a negated single one-byte character. The character we are checking can be multibyte. */ case OP_NOT: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); ecode++; GETCHARINCTEST(c, eptr); if ((ims & PCRE_CASELESS) != 0) { #ifdef SUPPORT_UTF8 if (c < 256) #endif c = md->lcc[c]; if (md->lcc[*ecode++] == c) RRETURN(MATCH_NOMATCH); } else { if (*ecode++ == c) RRETURN(MATCH_NOMATCH); } break; /* Match a negated single one-byte character repeatedly. This is almost a repeat of the code for a repeated single character, but I haven't found a nice way of commoning these up that doesn't require a test of the positive/negative option for each character match. Maybe that wouldn't add very much to the time taken, but character matching *is* what this is all about... */ case OP_NOTEXACT: min = max = GET2(ecode, 1); ecode += 3; goto REPEATNOTCHAR; case OP_NOTUPTO: case OP_NOTMINUPTO: min = 0; max = GET2(ecode, 1); minimize = *ecode == OP_NOTMINUPTO; ecode += 3; goto REPEATNOTCHAR; case OP_NOTSTAR: case OP_NOTMINSTAR: case OP_NOTPLUS: case OP_NOTMINPLUS: case OP_NOTQUERY: case OP_NOTMINQUERY: c = *ecode++ - OP_NOTSTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; /* Common code for all repeated single-character (less than 255) matches. We can give up quickly if there are fewer than the minimum number of characters left in the subject. */ REPEATNOTCHAR: if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); fc = *ecode++; /* The code is duplicated for the caseless and caseful cases, for speed, since matching characters is likely to be quite common. First, ensure the minimum number of matches are present. If min = max, continue at the same level without recursing. Otherwise, if minimizing, keep trying the rest of the expression and advancing one matching character if failing, up to the maximum. Alternatively, if maximizing, find the maximum number of characters and work backwards. */ DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max, max, eptr)); if ((ims & PCRE_CASELESS) != 0) { fc = md->lcc[fc]; #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { register int d; for (i = 1; i <= min; i++) { GETCHARINC(d, eptr); if (d < 256) d = md->lcc[d]; if (fc == d) RRETURN(MATCH_NOMATCH); } } else #endif /* Not UTF-8 mode */ { for (i = 1; i <= min; i++) if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } if (min == max) continue; if (minimize) { #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { register int d; for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); GETCHARINC(d, eptr); if (d < 256) d = md->lcc[d]; if (fi >= max || eptr >= md->end_subject || fc == d) RRETURN(MATCH_NOMATCH); } } else #endif /* Not UTF-8 mode */ { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ } /* Maximize case */ else { pp = eptr; #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { register int d; for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(d, eptr, len); if (d < 256) d = md->lcc[d]; if (fc == d) break; eptr += len; } for(;;) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr); } } else #endif /* Not UTF-8 mode */ { for (i = min; i < max; i++) { if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break; eptr++; } while (eptr >= pp) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr--; } } RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } /* Caseful comparisons */ else { #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { register int d; for (i = 1; i <= min; i++) { GETCHARINC(d, eptr); if (fc == d) RRETURN(MATCH_NOMATCH); } } else #endif /* Not UTF-8 mode */ { for (i = 1; i <= min; i++) if (fc == *eptr++) RRETURN(MATCH_NOMATCH); } if (min == max) continue; if (minimize) { #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { register int d; for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); GETCHARINC(d, eptr); if (fi >= max || eptr >= md->end_subject || fc == d) RRETURN(MATCH_NOMATCH); } } else #endif /* Not UTF-8 mode */ { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || fc == *eptr++) RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ } /* Maximize case */ else { pp = eptr; #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { register int d; for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(d, eptr, len); if (fc == d) break; eptr += len; } for(;;) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr); } } else #endif /* Not UTF-8 mode */ { for (i = min; i < max; i++) { if (eptr >= md->end_subject || fc == *eptr) break; eptr++; } while (eptr >= pp) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr--; } } RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ /* Match a single character type repeatedly; several different opcodes share code. This is very similar to the code for single characters, but we repeat it in the interests of efficiency. */ case OP_TYPEEXACT: min = max = GET2(ecode, 1); minimize = TRUE; ecode += 3; goto REPEATTYPE; case OP_TYPEUPTO: case OP_TYPEMINUPTO: min = 0; max = GET2(ecode, 1); minimize = *ecode == OP_TYPEMINUPTO; ecode += 3; goto REPEATTYPE; case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEQUERY: case OP_TYPEMINQUERY: c = *ecode++ - OP_TYPESTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; /* Common code for all repeated single character type matches. Note that in UTF-8 mode, '.' matches a character of any length, but for the other character types, the valid characters are all one-byte long. */ REPEATTYPE: ctype = *ecode++; /* Code for the character type */ /* First, ensure the minimum number of matches are present. Use inline code for maximizing the speed, and do the type test once at the start (i.e. keep it out of the loop). Also we can test that there are at least the minimum number of bytes before we start. This isn't as effective in UTF-8 mode, but it does no harm. Separate the UTF-8 code completely as that is tidier. */ if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); if (min > 0) { #ifdef SUPPORT_UTF8 if (md->utf8) switch(ctype) { case OP_ANY: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || (*eptr++ == NEWLINE && (ims & PCRE_DOTALL) == 0)) RRETURN(MATCH_NOMATCH); while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } break; case OP_ANYBYTE: eptr += min; break; case OP_NOT_DIGIT: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); } break; case OP_DIGIT: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || *eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); /* No need to skip more bytes - we know it's a 1-byte character */ } break; case OP_NOT_WHITESPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || (*eptr < 128 && (md->ctypes[*eptr++] & ctype_space) != 0)) RRETURN(MATCH_NOMATCH); while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } break; case OP_WHITESPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || *eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); /* No need to skip more bytes - we know it's a 1-byte character */ } break; case OP_NOT_WORDCHAR: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || (*eptr < 128 && (md->ctypes[*eptr++] & ctype_word) != 0)) RRETURN(MATCH_NOMATCH); while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } break; case OP_WORDCHAR: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || *eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); /* No need to skip more bytes - we know it's a 1-byte character */ } break; } else #endif /* Code for the non-UTF-8 case for minimum matching */ switch(ctype) { case OP_ANY: if ((ims & PCRE_DOTALL) == 0) { for (i = 1; i <= min; i++) if (*eptr++ == NEWLINE) RRETURN(MATCH_NOMATCH); } else eptr += min; break; case OP_ANYBYTE: eptr += min; break; case OP_NOT_DIGIT: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); break; case OP_DIGIT: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WHITESPACE: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WHITESPACE: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WORDCHAR: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WORDCHAR: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); break; } } /* If min = max, continue at the same level without recursing */ if (min == max) continue; /* If minimizing, we have to test the rest of the pattern before each subsequent match. Again, separate the UTF-8 case for speed. */ if (minimize) { #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); switch(ctype) { case OP_ANY: if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) RRETURN(MATCH_NOMATCH); break; case OP_ANYBYTE: break; case OP_NOT_DIGIT: if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); break; case OP_DIGIT: if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WHITESPACE: if (c < 256 && (md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WHITESPACE: if (c >= 256 || (md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WORDCHAR: if (c < 256 && (md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WORDCHAR: if (c >= 256 && (md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); break; } } } else #endif /* Not UTF-8 mode */ { for (fi = min;; fi++) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); c = *eptr++; switch(ctype) { case OP_ANY: if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) RRETURN(MATCH_NOMATCH); break; case OP_ANYBYTE: break; case OP_NOT_DIGIT: if ((md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); break; case OP_DIGIT: if ((md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WHITESPACE: if ((md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WHITESPACE: if ((md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WORDCHAR: if ((md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WORDCHAR: if ((md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); break; } } } /* Control never gets here */ } /* If maximizing it is worth using inline code for speed, doing the type test once at the start (i.e. keep it out of the loop). Again, keep the UTF-8 stuff separate. */ else { pp = eptr; #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (md->utf8) { switch(ctype) { case OP_ANY: /* Special code is required for UTF8, but when the maximum is unlimited we don't need it, so we repeat the non-UTF8 code. This is probably worth it, because .* is quite a common idiom. */ if (max < INT_MAX) { if ((ims & PCRE_DOTALL) == 0) { for (i = min; i < max; i++) { if (eptr >= md->end_subject || *eptr == NEWLINE) break; eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } } else { for (i = min; i < max; i++) { eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } } } /* Handle unlimited UTF-8 repeat */ else { if ((ims & PCRE_DOTALL) == 0) { for (i = min; i < max; i++) { if (eptr >= md->end_subject || *eptr == NEWLINE) break; eptr++; } break; } else { c = max - min; if (c > md->end_subject - eptr) c = md->end_subject - eptr; eptr += c; } } break; /* The byte case is the same as non-UTF8 */ case OP_ANYBYTE: c = max - min; if (c > md->end_subject - eptr) c = md->end_subject - eptr; eptr += c; break; case OP_NOT_DIGIT: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break; eptr+= len; } break; case OP_DIGIT: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break; eptr+= len; } break; case OP_NOT_WHITESPACE: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break; eptr+= len; } break; case OP_WHITESPACE: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break; eptr+= len; } break; case OP_NOT_WORDCHAR: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break; eptr+= len; } break; case OP_WORDCHAR: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break; eptr+= len; } break; } /* eptr is now past the end of the maximum run */ for(;;) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr); } } else #endif /* Not UTF-8 mode */ { switch(ctype) { case OP_ANY: if ((ims & PCRE_DOTALL) == 0) { for (i = min; i < max; i++) { if (eptr >= md->end_subject || *eptr == NEWLINE) break; eptr++; } break; } /* For DOTALL case, fall through and treat as \C */ case OP_ANYBYTE: c = max - min; if (c > md->end_subject - eptr) c = md->end_subject - eptr; eptr += c; break; case OP_NOT_DIGIT: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) break; eptr++; } break; case OP_DIGIT: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) break; eptr++; } break; case OP_NOT_WHITESPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) break; eptr++; } break; case OP_WHITESPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) break; eptr++; } break; case OP_NOT_WORDCHAR: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) break; eptr++; } break; case OP_WORDCHAR: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) break; eptr++; } break; } /* eptr is now past the end of the maximum run */ while (eptr >= pp) { RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0); eptr--; if (rrc != MATCH_NOMATCH) RRETURN(rrc); } } /* Get here if we can't make it match with any permitted repetitions */ RRETURN(MATCH_NOMATCH); } /* Control never gets here */ /* There's been some horrible disaster. Since all codes > OP_BRA are for capturing brackets, and there shouldn't be any gaps between 0 and OP_BRA, arrival here can only mean there is something seriously wrong in the code above or the OP_xxx definitions. */ default: DPRINTF(("Unknown opcode %d\n", *ecode)); RRETURN(PCRE_ERROR_UNKNOWN_NODE); } /* Do not stick any code in here without much thought; it is assumed that "continue" in the code above comes out to here to repeat the main loop. */ } /* End of main loop */ /* Control never reaches here */ } /*************************************************************************** **************************************************************************** RECURSION IN THE match() FUNCTION Undefine all the macros that were defined above to handle this. */ #ifdef NO_RECURSE #undef eptr #undef ecode #undef offset_top #undef ims #undef eptrb #undef flags #undef callpat #undef charptr #undef data #undef lastptr #undef next #undef pp #undef prev #undef saved_eptr #undef new_recursive #undef cur_is_word #undef condition #undef minimize #undef prev_is_word #undef original_ims #undef ctype #undef length #undef max #undef min #undef number #undef offset #undef op #undef save_capture_last #undef save_offset1 #undef save_offset2 #undef save_offset3 #undef stacksave #undef newptrb #endif /* These two are defined as macros in both cases */ #undef fc #undef fi /*************************************************************************** ***************************************************************************/ /************************************************* * Execute a Regular Expression * *************************************************/ /* This function applies a compiled re to a subject string and picks out portions of the string if it matches. Two elements in the vector are set for each substring: the offsets to the start and end of the substring. Arguments: external_re points to the compiled expression extra_data points to extra data or is NULL subject points to the subject string length length of subject string (may contain binary zeros) start_offset where to start in the subject string options option bits offsets points to a vector of ints to be filled in with offsets offsetcount the number of elements in the vector Returns: > 0 => success; value is the number of elements filled in = 0 => success, but offsets is not big enough -1 => failed to match < -1 => some kind of unexpected problem */ EXPORT int pcre_exec(const pcre *external_re, const pcre_extra *extra_data, const char *subject, int length, int start_offset, int options, int *offsets, int offsetcount) { int rc, resetcount, ocount; int first_byte = -1; int req_byte = -1; int req_byte2 = -1; unsigned long int ims = 0; BOOL using_temporary_offsets = FALSE; BOOL anchored; BOOL startline; BOOL first_byte_caseless = FALSE; BOOL req_byte_caseless = FALSE; match_data match_block; const uschar *start_bits = NULL; const uschar *start_match = (const uschar *)subject + start_offset; const uschar *end_subject; const uschar *req_byte_ptr = start_match - 1; const pcre_study_data *study; const real_pcre *re = (const real_pcre *)external_re; /* Plausibility checks */ if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; if (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; /* Fish out the optional data from the extra_data structure, first setting the default values. */ study = NULL; match_block.match_limit = MATCH_LIMIT; match_block.callout_data = NULL; if (extra_data != NULL) { register unsigned int flags = extra_data->flags; if ((flags & PCRE_EXTRA_STUDY_DATA) != 0) study = (const pcre_study_data *)extra_data->study_data; if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) match_block.match_limit = extra_data->match_limit; if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0) match_block.callout_data = extra_data->callout_data; } /* Now we have re supposedly pointing to the regex */ if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; anchored = ((re->options | options) & PCRE_ANCHORED) != 0; startline = (re->options & PCRE_STARTLINE) != 0; match_block.start_code = (const uschar *)re + sizeof(real_pcre) + re->name_count * re->name_entry_size; match_block.start_subject = (const uschar *)subject; match_block.start_offset = start_offset; match_block.end_subject = match_block.start_subject + length; end_subject = match_block.end_subject; match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; match_block.utf8 = (re->options & PCRE_UTF8) != 0; match_block.notbol = (options & PCRE_NOTBOL) != 0; match_block.noteol = (options & PCRE_NOTEOL) != 0; match_block.notempty = (options & PCRE_NOTEMPTY) != 0; match_block.recursive = NULL; /* No recursion at top level */ match_block.lcc = re->tables + lcc_offset; match_block.ctypes = re->tables + ctypes_offset; /* Check a UTF-8 string if required. Unfortunately there's no way of passing back the character offset. */ #ifdef SUPPORT_UTF8 if (match_block.utf8 && (options & PCRE_NO_UTF8_CHECK) == 0) { if (valid_utf8((uschar *)subject, length) >= 0) return PCRE_ERROR_BADUTF8; if (start_offset > 0 && start_offset < length) { int tb = ((uschar *)subject)[start_offset]; if (tb > 127) { tb &= 0xc0; if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET; } } } #endif /* The ims options can vary during the matching as a result of the presence of (?ims) items in the pattern. They are kept in a local variable so that restoring at the exit of a group is easy. */ ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL); /* If the expression has got more back references than the offsets supplied can hold, we get a temporary bit of working store to use during the matching. Otherwise, we can use the vector supplied, rounding down its size to a multiple of 3. */ ocount = offsetcount - (offsetcount % 3); if (re->top_backref > 0 && re->top_backref >= ocount/3) { ocount = re->top_backref * 3 + 3; match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int)); if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY; using_temporary_offsets = TRUE; DPRINTF(("Got memory to hold back references\n")); } else match_block.offset_vector = offsets; match_block.offset_end = ocount; match_block.offset_max = (2*ocount)/3; match_block.offset_overflow = FALSE; match_block.capture_last = -1; /* Compute the minimum number of offsets that we need to reset each time. Doing this makes a huge difference to execution time when there aren't many brackets in the pattern. */ resetcount = 2 + re->top_bracket * 2; if (resetcount > offsetcount) resetcount = ocount; /* Reset the working variable associated with each extraction. These should never be used unless previously set, but they get saved and restored, and so we initialize them to avoid reading uninitialized locations. */ if (match_block.offset_vector != NULL) { register int *iptr = match_block.offset_vector + ocount; register int *iend = iptr - resetcount/2 + 1; while (--iptr >= iend) *iptr = -1; } /* Set up the first character to match, if available. The first_byte value is never set for an anchored regular expression, but the anchoring may be forced at run time, so we have to test for anchoring. The first char may be unset for an unanchored pattern, of course. If there's no first char and the pattern was studied, there may be a bitmap of possible first characters. */ if (!anchored) { if ((re->options & PCRE_FIRSTSET) != 0) { first_byte = re->first_byte & 255; if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE) first_byte = match_block.lcc[first_byte]; } else if (!startline && study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0) start_bits = study->start_bits; } /* For anchored or unanchored matches, there may be a "last known required character" set. */ if ((re->options & PCRE_REQCHSET) != 0) { req_byte = re->req_byte & 255; req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0; req_byte2 = (re->tables + fcc_offset)[req_byte]; /* case flipped */ } /* Loop for handling unanchored repeated matching attempts; for anchored regexs the loop runs just once. */ do { register int *iptr = match_block.offset_vector; register int *iend = iptr + resetcount; /* Reset the maximum number of extractions we might see. */ while (iptr < iend) *iptr++ = -1; /* Advance to a unique first char if possible */ if (first_byte >= 0) { if (first_byte_caseless) while (start_match < end_subject && match_block.lcc[*start_match] != first_byte) start_match++; else while (start_match < end_subject && *start_match != first_byte) start_match++; } /* Or to just after \n for a multiline match if possible */ else if (startline) { if (start_match > match_block.start_subject + start_offset) { while (start_match < end_subject && start_match[-1] != NEWLINE) start_match++; } } /* Or to a non-unique first char after study */ else if (start_bits != NULL) { while (start_match < end_subject) { register int c = *start_match; if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break; } } #ifdef DEBUG /* Sigh. Some compilers never learn. */ printf(">>>> Match against: "); pchars(start_match, end_subject - start_match, TRUE, &match_block); printf("\n"); #endif /* If req_byte is set, we know that that character must appear in the subject for the match to succeed. If the first character is set, req_byte must be later in the subject; otherwise the test starts at the match point. This optimization can save a huge amount of backtracking in patterns with nested unlimited repeats that aren't going to match. Writing separate code for cased/caseless versions makes it go faster, as does using an autoincrement and backing off on a match. HOWEVER: when the subject string is very, very long, searching to its end can take a long time, and give bad performance on quite ordinary patterns. This showed up when somebody was matching /^C/ on a 32-megabyte string... so we don't do this when the string is sufficiently long. */ if (req_byte >= 0 && end_subject - start_match < REQ_BYTE_MAX) { register const uschar *p = start_match + ((first_byte >= 0)? 1 : 0); /* We don't need to repeat the search if we haven't yet reached the place we found it at last time. */ if (p > req_byte_ptr) { if (req_byte_caseless) { while (p < end_subject) { register int pp = *p++; if (pp == req_byte || pp == req_byte2) { p--; break; } } } else { while (p < end_subject) { if (*p++ == req_byte) { p--; break; } } } /* If we can't find the required character, break the matching loop */ if (p >= end_subject) break; /* If we have found the required character, save the point where we found it, so that we don't search again next time round the loop if the start hasn't passed this character yet. */ req_byte_ptr = p; } } /* When a match occurs, substrings will be set for all internal extractions; we just need to set up the whole thing as substring 0 before returning. If there were too many extractions, set the return code to zero. In the case where we had to get some local store to hold offsets for backreferences, copy those back references that we can. In this case there need not be overflow if certain parts of the pattern were not used. */ match_block.start_match = start_match; match_block.match_call_count = 0; rc = match(start_match, match_block.start_code, 2, &match_block, ims, NULL, match_isgroup); if (rc == MATCH_NOMATCH) { start_match++; #ifdef SUPPORT_UTF8 if (match_block.utf8) while((*start_match & 0xc0) == 0x80) start_match++; #endif continue; } if (rc != MATCH_MATCH) { DPRINTF((">>>> error: returning %d\n", rc)); return rc; } /* We have a match! Copy the offset information from temporary store if necessary */ if (using_temporary_offsets) { if (offsetcount >= 4) { memcpy(offsets + 2, match_block.offset_vector + 2, (offsetcount - 2) * sizeof(int)); DPRINTF(("Copied offsets from temporary memory\n")); } if (match_block.end_offset_top > offsetcount) match_block.offset_overflow = TRUE; DPRINTF(("Freeing temporary memory\n")); (pcre_free)(match_block.offset_vector); } rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2; if (offsetcount < 2) rc = 0; else { offsets[0] = start_match - match_block.start_subject; offsets[1] = match_block.end_match_ptr - match_block.start_subject; } DPRINTF((">>>> returning %d\n", rc)); return rc; } /* This "while" is the end of the "do" above */ while (!anchored && start_match <= end_subject); if (using_temporary_offsets) { DPRINTF(("Freeing temporary memory\n")); (pcre_free)(match_block.offset_vector); } DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n")); return PCRE_ERROR_NOMATCH; } /* End of pcre.c */ gtamsanalyzer.app-0.42/Source/pcre.h0000555000175000017500000001557610162465511017727 0ustar brentbrent00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* Copyright (c) 1997-2003 University of Cambridge */ #ifndef _PCRE_H #define _PCRE_H /* The file pcre.h is build by "configure". Do not edit it; instead make changes to pcre.in. */ #define PCRE_MAJOR 4 #define PCRE_MINOR 5 #define PCRE_DATE 01-December-2003 /* Win32 uses DLL by default */ #ifdef _WIN32 # ifdef PCRE_DEFINITION # ifdef DLL_EXPORT # define PCRE_DATA_SCOPE __declspec(dllexport) # endif # else # ifndef PCRE_STATIC # define PCRE_DATA_SCOPE extern __declspec(dllimport) # endif # endif #endif #ifndef PCRE_DATA_SCOPE # define PCRE_DATA_SCOPE extern #endif /* Have to include stdlib.h in order to ensure that size_t is defined; it is needed here for malloc. */ #include /* Allow for C++ users */ #ifdef __cplusplus extern "C" { #endif /* Options */ #define PCRE_CASELESS 0x0001 #define PCRE_MULTILINE 0x0002 #define PCRE_DOTALL 0x0004 #define PCRE_EXTENDED 0x0008 #define PCRE_ANCHORED 0x0010 #define PCRE_DOLLAR_ENDONLY 0x0020 #define PCRE_EXTRA 0x0040 #define PCRE_NOTBOL 0x0080 #define PCRE_NOTEOL 0x0100 #define PCRE_UNGREEDY 0x0200 #define PCRE_NOTEMPTY 0x0400 #define PCRE_UTF8 0x0800 #define PCRE_NO_AUTO_CAPTURE 0x1000 #define PCRE_NO_UTF8_CHECK 0x2000 /* Exec-time and get/set-time error codes */ #define PCRE_ERROR_NOMATCH (-1) #define PCRE_ERROR_NULL (-2) #define PCRE_ERROR_BADOPTION (-3) #define PCRE_ERROR_BADMAGIC (-4) #define PCRE_ERROR_UNKNOWN_NODE (-5) #define PCRE_ERROR_NOMEMORY (-6) #define PCRE_ERROR_NOSUBSTRING (-7) #define PCRE_ERROR_MATCHLIMIT (-8) #define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ #define PCRE_ERROR_BADUTF8 (-10) #define PCRE_ERROR_BADUTF8_OFFSET (-11) /* Request types for pcre_fullinfo() */ #define PCRE_INFO_OPTIONS 0 #define PCRE_INFO_SIZE 1 #define PCRE_INFO_CAPTURECOUNT 2 #define PCRE_INFO_BACKREFMAX 3 #define PCRE_INFO_FIRSTBYTE 4 #define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ #define PCRE_INFO_FIRSTTABLE 5 #define PCRE_INFO_LASTLITERAL 6 #define PCRE_INFO_NAMEENTRYSIZE 7 #define PCRE_INFO_NAMECOUNT 8 #define PCRE_INFO_NAMETABLE 9 #define PCRE_INFO_STUDYSIZE 10 /* Request types for pcre_config() */ #define PCRE_CONFIG_UTF8 0 #define PCRE_CONFIG_NEWLINE 1 #define PCRE_CONFIG_LINK_SIZE 2 #define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 #define PCRE_CONFIG_MATCH_LIMIT 4 #define PCRE_CONFIG_STACKRECURSE 5 /* Bit flags for the pcre_extra structure */ #define PCRE_EXTRA_STUDY_DATA 0x0001 #define PCRE_EXTRA_MATCH_LIMIT 0x0002 #define PCRE_EXTRA_CALLOUT_DATA 0x0004 /* Types */ struct real_pcre; /* declaration; the definition is private */ typedef struct real_pcre pcre; /* The structure for passing additional data to pcre_exec(). This is defined in such as way as to be extensible. */ typedef struct pcre_extra { unsigned long int flags; /* Bits for which fields are set */ void *study_data; /* Opaque data from pcre_study() */ unsigned long int match_limit; /* Maximum number of calls to match() */ void *callout_data; /* Data passed back in callouts */ } pcre_extra; /* The structure for passing out data via the pcre_callout_function. We use a structure so that new fields can be added on the end in future versions, without changing the API of the function, thereby allowing old clients to work without modification. */ typedef struct pcre_callout_block { int version; /* Identifies version of block */ /* ------------------------ Version 0 ------------------------------- */ int callout_number; /* Number compiled into pattern */ int *offset_vector; /* The offset vector */ const char *subject; /* The subject being matched */ int subject_length; /* The length of the subject */ int start_match; /* Offset to start of this match attempt */ int current_position; /* Where we currently are */ int capture_top; /* Max current capture */ int capture_last; /* Most recently closed capture */ void *callout_data; /* Data passed in with the call */ /* ------------------------------------------------------------------ */ } pcre_callout_block; /* Indirection for store get and free functions. These can be set to alternative malloc/free functions if required. Special ones are used in the non-recursive case for "frames". There is also an optional callout function that is triggered by the (?) regex item. Some magic is required for Win32 DLL; it is null on other OS. For Virtual Pascal, these have to be different again. */ #ifndef VPCOMPAT PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t); PCRE_DATA_SCOPE void (*pcre_free)(void *); PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t); PCRE_DATA_SCOPE void (*pcre_stack_free)(void *); PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *); #else /* VPCOMPAT */ extern void *pcre_malloc(size_t); extern void pcre_free(void *); extern void *pcre_stack_malloc(size_t); extern void pcre_stack_free(void *); extern int pcre_callout(pcre_callout_block *); #endif /* VPCOMPAT */ /* Exported PCRE functions */ extern pcre *pcre_compile(const char *, int, const char **, int *, const unsigned char *); extern int pcre_config(int, void *); extern int pcre_copy_named_substring(const pcre *, const char *, int *, int, const char *, char *, int); extern int pcre_copy_substring(const char *, int *, int, int, char *, int); extern int pcre_exec(const pcre *, const pcre_extra *, const char *, int, int, int, int *, int); extern void pcre_free_substring(const char *); extern void pcre_free_substring_list(const char **); extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); extern int pcre_get_named_substring(const pcre *, const char *, int *, int, const char *, const char **); extern int pcre_get_stringnumber(const pcre *, const char *); extern int pcre_get_substring(const char *, int *, int, int, const char **); extern int pcre_get_substring_list(const char *, int *, int, const char ***); extern int pcre_info(const pcre *, int *, int *); extern const unsigned char *pcre_maketables(void); extern pcre_extra *pcre_study(const pcre *, int, const char **); extern const char *pcre_version(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* End of pcre.h */ gtamsanalyzer.app-0.42/Source/pcredemo.c0000555000175000017500000002611210162465511020553 0ustar brentbrent00000000000000/************************************************* * PCRE DEMONSTRATION PROGRAM * *************************************************/ /* This is a demonstration program to illustrate the most straightforward ways of calling the PCRE regular expression library from a C program. See the pcresample documentation for a short discussion. Compile thuswise: gcc -Wall pcredemo.c -I/opt/local/include -L/opt/local/lib \ -R/opt/local/lib -lpcre Replace "/opt/local/include" and "/opt/local/lib" with wherever the include and library files for PCRE are installed on your system. Only some operating systems (e.g. Solaris) use the -R option. */ #include #include #include #define OVECCOUNT 30 /* should be a multiple of 3 */ int main(int argc, char **argv) { pcre *re; const char *error; char *pattern; char *subject; unsigned char *name_table; int erroffset; int find_all; int namecount; int name_entry_size; int ovector[OVECCOUNT]; int subject_length; int rc, i; /************************************************************************* * First, sort out the command line. There is only one possible option at * * the moment, "-g" to request repeated matching to find all occurrences, * * like Perl's /g option. We set the variable find_all non-zero if it is * * present. Apart from that, there must be exactly two arguments. * *************************************************************************/ find_all = 0; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-g") == 0) find_all = 1; else break; } /* After the options, we require exactly two arguments, which are the pattern, and the subject string. */ if (argc - i != 2) { printf("Two arguments required: a regex and a subject string\n"); return 1; } pattern = argv[i]; subject = argv[i+1]; subject_length = (int)strlen(subject); /************************************************************************* * Now we are going to compile the regular expression pattern, and handle * * and errors that are detected. * *************************************************************************/ re = pcre_compile( pattern, /* the pattern */ 0, /* default options */ &error, /* for error message */ &erroffset, /* for error offset */ NULL); /* use default character tables */ /* Compilation failed: print the error message and exit */ if (re == NULL) { printf("PCRE compilation failed at offset %d: %s\n", erroffset, error); return 1; } /************************************************************************* * If the compilation succeeded, we call PCRE again, in order to do a * * pattern match against the subject string. This just does ONE match. If * * further matching is needed, it will be done below. * *************************************************************************/ rc = pcre_exec( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ subject, /* the subject string */ subject_length, /* the length of the subject */ 0, /* start at offset 0 in the subject */ 0, /* default options */ ovector, /* output vector for substring information */ OVECCOUNT); /* number of elements in the output vector */ /* Matching failed: handle error cases */ if (rc < 0) { switch(rc) { case PCRE_ERROR_NOMATCH: printf("No match\n"); break; /* Handle other special cases if you like */ default: printf("Matching error %d\n", rc); break; } return 1; } /* Match succeded */ printf("\nMatch succeeded at offset %d\n", ovector[0]); /************************************************************************* * We have found the first match within the subject string. If the output * * vector wasn't big enough, set its size to the maximum. Then output any * * substrings that were captured. * *************************************************************************/ /* The output vector wasn't big enough */ if (rc == 0) { rc = OVECCOUNT/3; printf("ovector only has room for %d captured substrings\n", rc - 1); } /* Show substrings stored in the output vector by number. Obviously, in a real application you might want to do things other than print them. */ for (i = 0; i < rc; i++) { char *substring_start = subject + ovector[2*i]; int substring_length = ovector[2*i+1] - ovector[2*i]; printf("%2d: %.*s\n", i, substring_length, substring_start); } /************************************************************************* * That concludes the basic part of this demonstration program. We have * * compiled a pattern, and performed a single match. The code that follows* * first shows how to access named substrings, and then how to code for * * repeated matches on the same subject. * *************************************************************************/ /* See if there are any named substrings, and if so, show them by name. First we have to extract the count of named parentheses from the pattern. */ (void)pcre_fullinfo( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ PCRE_INFO_NAMECOUNT, /* number of named substrings */ &namecount); /* where to put the answer */ if (namecount <= 0) printf("No named substrings\n"); else { unsigned char *tabptr; printf("Named substrings\n"); /* Before we can access the substrings, we must extract the table for translating names to numbers, and the size of each entry in the table. */ (void)pcre_fullinfo( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ PCRE_INFO_NAMETABLE, /* address of the table */ &name_table); /* where to put the answer */ (void)pcre_fullinfo( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ PCRE_INFO_NAMEENTRYSIZE, /* size of each entry in the table */ &name_entry_size); /* where to put the answer */ /* Now we can scan the table and, for each entry, print the number, the name, and the substring itself. */ tabptr = name_table; for (i = 0; i < namecount; i++) { int n = (tabptr[0] << 8) | tabptr[1]; printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2, ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); tabptr += name_entry_size; } } /************************************************************************* * If the "-g" option was given on the command line, we want to continue * * to search for additional matches in the subject string, in a similar * * way to the /g option in Perl. This turns out to be trickier than you * * might think because of the possibility of matching an empty string. * * What happens is as follows: * * * * If the previous match was NOT for an empty string, we can just start * * the next match at the end of the previous one. * * * * If the previous match WAS for an empty string, we can't do that, as it * * would lead to an infinite loop. Instead, a special call of pcre_exec() * * is made with the PCRE_NOTEMPTY and PCRE_ANCHORED flags set. The first * * of these tells PCRE that an empty string is not a valid match; other * * possibilities must be tried. The second flag restricts PCRE to one * * match attempt at the initial string position. If this match succeeds, * * an alternative to the empty string match has been found, and we can * * proceed round the loop. * *************************************************************************/ if (!find_all) return 0; /* Finish unless -g was given */ /* Loop for second and subsequent matches */ for (;;) { int options = 0; /* Normally no options */ int start_offset = ovector[1]; /* Start at end of previous match */ /* If the previous match was for an empty string, we are finished if we are at the end of the subject. Otherwise, arrange to run another match at the same point to see if a non-empty match can be found. */ if (ovector[0] == ovector[1]) { if (ovector[0] == subject_length) break; options = PCRE_NOTEMPTY | PCRE_ANCHORED; } /* Run the next matching operation */ rc = pcre_exec( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ subject, /* the subject string */ subject_length, /* the length of the subject */ start_offset, /* starting offset in the subject */ options, /* options */ ovector, /* output vector for substring information */ OVECCOUNT); /* number of elements in the output vector */ /* This time, a result of NOMATCH isn't an error. If the value in "options" is zero, it just means we have found all possible matches, so the loop ends. Otherwise, it means we have failed to find a non-empty-string match at a point where there was a previous empty-string match. In this case, we do what Perl does: advance the matching position by one, and continue. We do this by setting the "end of previous match" offset, because that is picked up at the top of the loop as the point at which to start again. */ if (rc == PCRE_ERROR_NOMATCH) { if (options == 0) break; ovector[1] = start_offset + 1; continue; /* Go round the loop again */ } /* Other matching errors are not recoverable. */ if (rc < 0) { printf("Matching error %d\n", rc); return 1; } /* Match succeded */ printf("\nMatch succeeded again at offset %d\n", ovector[0]); /* The match succeeded, but the output vector wasn't big enough. */ if (rc == 0) { rc = OVECCOUNT/3; printf("ovector only has room for %d captured substrings\n", rc - 1); } /* As before, show substrings stored in the output vector by number, and then also any named substrings. */ for (i = 0; i < rc; i++) { char *substring_start = subject + ovector[2*i]; int substring_length = ovector[2*i+1] - ovector[2*i]; printf("%2d: %.*s\n", i, substring_length, substring_start); } if (namecount <= 0) printf("No named substrings\n"); else { unsigned char *tabptr = name_table; printf("Named substrings\n"); for (i = 0; i < namecount; i++) { int n = (tabptr[0] << 8) | tabptr[1]; printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2, ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); tabptr += name_entry_size; } } } /* End of loop to find second and subsequent matches */ printf("\n"); return 0; } /* End of pcredemo.c */ gtamsanalyzer.app-0.42/Source/pcregrep.c0000555000175000017500000003601310162465511020565 0ustar brentbrent00000000000000/************************************************* * pcregrep program * *************************************************/ /* This is a grep program that uses the PCRE regular expression library to do its pattern matching. On a Unix or Win32 system it can recurse into directories. */ #include #include #include #include #include #include "config.h" #include "pcre.h" #define FALSE 0 #define TRUE 1 typedef int BOOL; #define VERSION "3.0 14-Jan-2003" #define MAX_PATTERN_COUNT 100 /************************************************* * Global variables * *************************************************/ static char *pattern_filename = NULL; static int pattern_count = 0; static pcre **pattern_list; static pcre_extra **hints_list; static BOOL count_only = FALSE; static BOOL filenames = TRUE; static BOOL filenames_only = FALSE; static BOOL invert = FALSE; static BOOL number = FALSE; static BOOL recurse = FALSE; static BOOL silent = FALSE; static BOOL whole_lines = FALSE; /* Structure for options and list of them */ typedef struct option_item { int one_char; const char *long_name; const char *help_text; } option_item; static option_item optionlist[] = { { -1, "help", "display this help and exit" }, { 'c', "count", "print only a count of matching lines per FILE" }, { 'h', "no-filename", "suppress the prefixing filename on output" }, { 'i', "ignore-case", "ignore case distinctions" }, { 'l', "files-with-matches", "print only FILE names containing matches" }, { 'n', "line-number", "print line number with output lines" }, { 'r', "recursive", "recursively scan sub-directories" }, { 's', "no-messages", "suppress error messages" }, { 'u', "utf-8", "use UTF-8 mode" }, { 'V', "version", "print version information and exit" }, { 'v', "invert-match", "select non-matching lines" }, { 'x', "line-regex", "force PATTERN to match only whole lines" }, { 'x', "line-regexp", "force PATTERN to match only whole lines" }, { 0, NULL, NULL } }; /************************************************* * Functions for directory scanning * *************************************************/ /* These functions are defined so that they can be made system specific, although at present the only ones are for Unix, Win32, and for "no directory recursion support". */ /************* Directory scanning in Unix ***********/ #if IS_UNIX #include #include #include typedef DIR directory_type; static int isdirectory(char *filename) { struct stat statbuf; if (stat(filename, &statbuf) < 0) return 0; /* In the expectation that opening as a file will fail */ return ((statbuf.st_mode & S_IFMT) == S_IFDIR)? '/' : 0; } static directory_type * opendirectory(char *filename) { return opendir(filename); } static char * readdirectory(directory_type *dir) { for (;;) { struct dirent *dent = readdir(dir); if (dent == NULL) return NULL; if (strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0) return dent->d_name; } return NULL; /* Keep compiler happy; never executed */ } static void closedirectory(directory_type *dir) { closedir(dir); } /************* Directory scanning in Win32 ***********/ /* I (Philip Hazel) have no means of testing this code. It was contributed by Lionel Fourquaux. */ #elif HAVE_WIN32API #ifndef STRICT # define STRICT #endif #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #include typedef struct directory_type { HANDLE handle; BOOL first; WIN32_FIND_DATA data; } directory_type; int isdirectory(char *filename) { DWORD attr = GetFileAttributes(filename); if (attr == INVALID_FILE_ATTRIBUTES) return 0; return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) ? '/' : 0; } directory_type * opendirectory(char *filename) { size_t len; char *pattern; directory_type *dir; DWORD err; len = strlen(filename); pattern = (char *) malloc(len + 3); dir = (directory_type *) malloc(sizeof(*dir)); if ((pattern == NULL) || (dir == NULL)) { fprintf(stderr, "pcregrep: malloc failed\n"); exit(2); } memcpy(pattern, filename, len); memcpy(&(pattern[len]), "\\*", 3); dir->handle = FindFirstFile(pattern, &(dir->data)); if (dir->handle != INVALID_HANDLE_VALUE) { free(pattern); dir->first = TRUE; return dir; } err = GetLastError(); free(pattern); free(dir); errno = (err == ERROR_ACCESS_DENIED) ? EACCES : ENOENT; return NULL; } char * readdirectory(directory_type *dir) { for (;;) { if (!dir->first) { if (!FindNextFile(dir->handle, &(dir->data))) return NULL; } else { dir->first = FALSE; } if (strcmp(dir->data.cFileName, ".") != 0 && strcmp(dir->data.cFileName, "..") != 0) return dir->data.cFileName; } #ifndef _MSC_VER return NULL; /* Keep compiler happy; never executed */ #endif } void closedirectory(directory_type *dir) { FindClose(dir->handle); free(dir); } /************* Directory scanning when we can't do it ***********/ /* The type is void, and apart from isdirectory(), the functions do nothing. */ #else typedef void directory_type; int isdirectory(char *filename) { return FALSE; } directory_type * opendirectory(char *filename) {} char *readdirectory(directory_type *dir) {} void closedirectory(directory_type *dir) {} #endif #if ! HAVE_STRERROR /************************************************* * Provide strerror() for non-ANSI libraries * *************************************************/ /* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror() in their libraries, but can provide the same facility by this simple alternative function. */ extern int sys_nerr; extern char *sys_errlist[]; char * strerror(int n) { if (n < 0 || n >= sys_nerr) return "unknown error number"; return sys_errlist[n]; } #endif /* HAVE_STRERROR */ /************************************************* * Grep an individual file * *************************************************/ static int pcregrep(FILE *in, char *name) { int rc = 1; int linenumber = 0; int count = 0; int offsets[99]; char buffer[BUFSIZ]; while (fgets(buffer, sizeof(buffer), in) != NULL) { BOOL match = FALSE; int i; int length = (int)strlen(buffer); if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0; linenumber++; for (i = 0; !match && i < pattern_count; i++) { match = pcre_exec(pattern_list[i], hints_list[i], buffer, length, 0, 0, offsets, 99) >= 0; if (match && whole_lines && offsets[1] != length) match = FALSE; } if (match != invert) { if (count_only) count++; else if (filenames_only) { fprintf(stdout, "%s\n", (name == NULL)? "" : name); return 0; } else if (silent) return 0; else { if (name != NULL) fprintf(stdout, "%s:", name); if (number) fprintf(stdout, "%d:", linenumber); fprintf(stdout, "%s\n", buffer); } rc = 0; } } if (count_only) { if (name != NULL) fprintf(stdout, "%s:", name); fprintf(stdout, "%d\n", count); } return rc; } /************************************************* * Grep a file or recurse into a directory * *************************************************/ static int grep_or_recurse(char *filename, BOOL dir_recurse, BOOL show_filenames, BOOL only_one_at_top) { int rc = 1; int sep; FILE *in; /* If the file is a directory and we are recursing, scan each file within it. The scanning code is localized so it can be made system-specific. */ if ((sep = isdirectory(filename)) != 0 && dir_recurse) { char buffer[1024]; char *nextfile; directory_type *dir = opendirectory(filename); if (dir == NULL) { fprintf(stderr, "pcregrep: Failed to open directory %s: %s\n", filename, strerror(errno)); return 2; } while ((nextfile = readdirectory(dir)) != NULL) { int frc; sprintf(buffer, "%.512s%c%.128s", filename, sep, nextfile); frc = grep_or_recurse(buffer, dir_recurse, TRUE, FALSE); if (frc == 0 && rc == 1) rc = 0; } closedirectory(dir); return rc; } /* If the file is not a directory, or we are not recursing, scan it. If this is the first and only argument at top level, we don't show the file name (unless we are only showing the file name). Otherwise, control is via the show_filenames variable. */ in = fopen(filename, "r"); if (in == NULL) { fprintf(stderr, "pcregrep: Failed to open %s: %s\n", filename, strerror(errno)); return 2; } rc = pcregrep(in, (filenames_only || (show_filenames && !only_one_at_top))? filename : NULL); fclose(in); return rc; } /************************************************* * Usage function * *************************************************/ static int usage(int rc) { fprintf(stderr, "Usage: pcregrep [-Vcfhilnrsvx] [long-options] [pattern] [file1 file2 ...]\n"); fprintf(stderr, "Type `pcregrep --help' for more information.\n"); return rc; } /************************************************* * Help function * *************************************************/ static void help(void) { option_item *op; printf("Usage: pcregrep [OPTION]... [PATTERN] [FILE1 FILE2 ...]\n"); printf("Search for PATTERN in each FILE or standard input.\n"); printf("PATTERN must be present if -f is not used.\n"); printf("Example: pcregrep -i 'hello.*world' menu.h main.c\n\n"); printf("Options:\n"); for (op = optionlist; op->one_char != 0; op++) { int n; char s[4]; if (op->one_char > 0) sprintf(s, "-%c,", op->one_char); else strcpy(s, " "); printf(" %s --%s%n", s, op->long_name, &n); n = 30 - n; if (n < 1) n = 1; printf("%.*s%s\n", n, " ", op->help_text); } printf("\n -f or --file=\n"); printf(" Read patterns from instead of using a command line option.\n"); printf(" Trailing white space is removed; blanks lines are ignored.\n"); printf(" There is a maximum of %d patterns.\n", MAX_PATTERN_COUNT); printf("\nWith no FILE, read standard input. If fewer than two FILEs given, assume -h.\n"); printf("Exit status is 0 if any matches, 1 if no matches, and 2 if trouble.\n"); } /************************************************* * Handle an option * *************************************************/ static int handle_option(int letter, int options) { switch(letter) { case -1: help(); exit(0); case 'c': count_only = TRUE; break; case 'h': filenames = FALSE; break; case 'i': options |= PCRE_CASELESS; break; case 'l': filenames_only = TRUE; case 'n': number = TRUE; break; case 'r': recurse = TRUE; break; case 's': silent = TRUE; break; case 'u': options |= PCRE_UTF8; break; case 'v': invert = TRUE; break; case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break; case 'V': fprintf(stderr, "pcregrep version %s using ", VERSION); fprintf(stderr, "PCRE version %s\n", pcre_version()); exit(0); break; default: fprintf(stderr, "pcregrep: Unknown option -%c\n", letter); exit(usage(2)); } return options; } /************************************************* * Main program * *************************************************/ int main(int argc, char **argv) { int i, j; int rc = 1; int options = 0; int errptr; const char *error; BOOL only_one_at_top; /* Process the options */ for (i = 1; i < argc; i++) { if (argv[i][0] != '-') break; /* Missing options */ if (argv[i][1] == 0) exit(usage(2)); /* Long name options */ if (argv[i][1] == '-') { option_item *op; if (strncmp(argv[i]+2, "file=", 5) == 0) { pattern_filename = argv[i] + 7; continue; } for (op = optionlist; op->one_char != 0; op++) { if (strcmp(argv[i]+2, op->long_name) == 0) { options = handle_option(op->one_char, options); break; } } if (op->one_char == 0) { fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]); exit(usage(2)); } } /* One-char options */ else { char *s = argv[i] + 1; while (*s != 0) { if (*s == 'f') { pattern_filename = s + 1; if (pattern_filename[0] == 0) { if (i >= argc - 1) { fprintf(stderr, "pcregrep: File name missing after -f\n"); exit(usage(2)); } pattern_filename = argv[++i]; } break; } else options = handle_option(*s++, options); } } } pattern_list = (pcre **)malloc(MAX_PATTERN_COUNT * sizeof(pcre *)); hints_list = (pcre_extra **)malloc(MAX_PATTERN_COUNT * sizeof(pcre_extra *)); if (pattern_list == NULL || hints_list == NULL) { fprintf(stderr, "pcregrep: malloc failed\n"); return 2; } /* Compile the regular expression(s). */ if (pattern_filename != NULL) { FILE *f = fopen(pattern_filename, "r"); char buffer[BUFSIZ]; if (f == NULL) { fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pattern_filename, strerror(errno)); return 2; } while (fgets(buffer, sizeof(buffer), f) != NULL) { char *s = buffer + (int)strlen(buffer); if (pattern_count >= MAX_PATTERN_COUNT) { fprintf(stderr, "pcregrep: Too many patterns in file (max %d)\n", MAX_PATTERN_COUNT); return 2; } while (s > buffer && isspace((unsigned char)(s[-1]))) s--; if (s == buffer) continue; *s = 0; pattern_list[pattern_count] = pcre_compile(buffer, options, &error, &errptr, NULL); if (pattern_list[pattern_count++] == NULL) { fprintf(stderr, "pcregrep: Error in regex number %d at offset %d: %s\n", pattern_count, errptr, error); return 2; } } fclose(f); } /* If no file name, a single regex must be given inline */ else { if (i >= argc) return usage(2); pattern_list[0] = pcre_compile(argv[i++], options, &error, &errptr, NULL); if (pattern_list[0] == NULL) { fprintf(stderr, "pcregrep: Error in regex at offset %d: %s\n", errptr, error); return 2; } pattern_count++; } /* Study the regular expressions, as we will be running them may times */ for (j = 0; j < pattern_count; j++) { hints_list[j] = pcre_study(pattern_list[j], 0, &error); if (error != NULL) { char s[16]; if (pattern_count == 1) s[0] = 0; else sprintf(s, " number %d", j); fprintf(stderr, "pcregrep: Error while studying regex%s: %s\n", s, error); return 2; } } /* If there are no further arguments, do the business on stdin and exit */ if (i >= argc) return pcregrep(stdin, NULL); /* Otherwise, work through the remaining arguments as files or directories. Pass in the fact that there is only one argument at top level - this suppresses the file name if the argument is not a directory. */ only_one_at_top = (i == argc - 1); if (filenames_only) filenames = TRUE; for (; i < argc; i++) { int frc = grep_or_recurse(argv[i], recurse, filenames, only_one_at_top); if (frc == 0 && rc == 1) rc = 0; } return rc; } /* End */ gtamsanalyzer.app-0.42/Source/pcreposix.c0000555000175000017500000002423110162465511020771 0ustar brentbrent00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. This module is a wrapper that provides a POSIX API to the underlying PCRE functions. Written by: Philip Hazel Copyright (c) 1997-2003 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ #include "internal.h" #include "pcreposix.h" #include "stdlib.h" /* Corresponding tables of PCRE error messages and POSIX error codes. */ static const char *const estring[] = { ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10, ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20, ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, ERR40, ERR41, ERR42, ERR43, ERR44 }; static const int eint[] = { REG_EESCAPE, /* "\\ at end of pattern" */ REG_EESCAPE, /* "\\c at end of pattern" */ REG_EESCAPE, /* "unrecognized character follows \\" */ REG_BADBR, /* "numbers out of order in {} quantifier" */ REG_BADBR, /* "number too big in {} quantifier" */ REG_EBRACK, /* "missing terminating ] for character class" */ REG_ECTYPE, /* "invalid escape sequence in character class" */ REG_ERANGE, /* "range out of order in character class" */ REG_BADRPT, /* "nothing to repeat" */ REG_BADRPT, /* "operand of unlimited repeat could match the empty string" */ REG_ASSERT, /* "internal error: unexpected repeat" */ REG_BADPAT, /* "unrecognized character after (?" */ REG_BADPAT, /* "POSIX named classes are supported only within a class" */ REG_EPAREN, /* "missing )" */ REG_ESUBREG, /* "reference to non-existent subpattern" */ REG_INVARG, /* "erroffset passed as NULL" */ REG_INVARG, /* "unknown option bit(s) set" */ REG_EPAREN, /* "missing ) after comment" */ REG_ESIZE, /* "parentheses nested too deeply" */ REG_ESIZE, /* "regular expression too large" */ REG_ESPACE, /* "failed to get memory" */ REG_EPAREN, /* "unmatched brackets" */ REG_ASSERT, /* "internal error: code overflow" */ REG_BADPAT, /* "unrecognized character after (?<" */ REG_BADPAT, /* "lookbehind assertion is not fixed length" */ REG_BADPAT, /* "malformed number after (?(" */ REG_BADPAT, /* "conditional group containe more than two branches" */ REG_BADPAT, /* "assertion expected after (?(" */ REG_BADPAT, /* "(?R or (?digits must be followed by )" */ REG_ECTYPE, /* "unknown POSIX class name" */ REG_BADPAT, /* "POSIX collating elements are not supported" */ REG_INVARG, /* "this version of PCRE is not compiled with PCRE_UTF8 support" */ REG_BADPAT, /* "spare error" */ REG_BADPAT, /* "character value in \x{...} sequence is too large" */ REG_BADPAT, /* "invalid condition (?(0)" */ REG_BADPAT, /* "\\C not allowed in lookbehind assertion" */ REG_EESCAPE, /* "PCRE does not support \\L, \\l, \\N, \\P, \\p, \\U, \\u, or \\X" */ REG_BADPAT, /* "number after (?C is > 255" */ REG_BADPAT, /* "closing ) for (?C expected" */ REG_BADPAT, /* "recursive call could loop indefinitely" */ REG_BADPAT, /* "unrecognized character after (?P" */ REG_BADPAT, /* "syntax error after (?P" */ REG_BADPAT, /* "two named groups have the same name" */ REG_BADPAT /* "invalid UTF-8 string" */ }; /* Table of texts corresponding to POSIX error codes */ static const char *const pstring[] = { "", /* Dummy for value 0 */ "internal error", /* REG_ASSERT */ "invalid repeat counts in {}", /* BADBR */ "pattern error", /* BADPAT */ "? * + invalid", /* BADRPT */ "unbalanced {}", /* EBRACE */ "unbalanced []", /* EBRACK */ "collation error - not relevant", /* ECOLLATE */ "bad class", /* ECTYPE */ "bad escape sequence", /* EESCAPE */ "empty expression", /* EMPTY */ "unbalanced ()", /* EPAREN */ "bad range inside []", /* ERANGE */ "expression too big", /* ESIZE */ "failed to get memory", /* ESPACE */ "bad back reference", /* ESUBREG */ "bad argument", /* INVARG */ "match failed" /* NOMATCH */ }; /************************************************* * Translate PCRE text code to int * *************************************************/ /* PCRE compile-time errors are given as strings defined as macros. We can just look them up in a table to turn them into POSIX-style error codes. */ static int pcre_posix_error_code(const char *s) { size_t i; for (i = 0; i < sizeof(estring)/sizeof(char *); i++) if (strcmp(s, estring[i]) == 0) return eint[i]; return REG_ASSERT; } /************************************************* * Translate error code to string * *************************************************/ EXPORT size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) { const char *message, *addmessage; size_t length, addlength; message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))? "unknown error code" : pstring[errcode]; length = strlen(message) + 1; addmessage = " at offset "; addlength = (preg != NULL && (int)preg->re_erroffset != -1)? strlen(addmessage) + 6 : 0; if (errbuf_size > 0) { if (addlength > 0 && errbuf_size >= length + addlength) sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset); else { strncpy(errbuf, message, errbuf_size - 1); errbuf[errbuf_size-1] = 0; } } return length + addlength; } /************************************************* * Free store held by a regex * *************************************************/ EXPORT void regfree(regex_t *preg) { (pcre_free)(preg->re_pcre); } /************************************************* * Compile a regular expression * *************************************************/ /* Arguments: preg points to a structure for recording the compiled expression pattern the pattern to compile cflags compilation flags Returns: 0 on success various non-zero codes on failure */ EXPORT int regcomp(regex_t *preg, const char *pattern, int cflags) { const char *errorptr; int erroffset; int options = 0; if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS; if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE; preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL); preg->re_erroffset = erroffset; if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr); preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL); return 0; } /************************************************* * Match a regular expression * *************************************************/ /* Unfortunately, PCRE requires 3 ints of working space for each captured substring, so we have to get and release working store instead of just using the POSIX structures as was done in earlier releases when PCRE needed only 2 ints. However, if the number of possible capturing brackets is small, use a block of store on the stack, to reduce the use of malloc/free. The threshold is in a macro that can be changed at configure time. */ EXPORT int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags) { int rc; int options = 0; int *ovector = NULL; int small_ovector[POSIX_MALLOC_THRESHOLD * 3]; BOOL allocated_ovector = FALSE; if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL; if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL; ((regex_t *)preg)->re_erroffset = (size_t)(-1); /* Only has meaning after compile */ if (nmatch > 0) { if (nmatch <= POSIX_MALLOC_THRESHOLD) { ovector = &(small_ovector[0]); } else { ovector = (int *)malloc(sizeof(int) * nmatch * 3); if (ovector == NULL) return REG_ESPACE; allocated_ovector = TRUE; } } rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string), 0, options, ovector, nmatch * 3); if (rc == 0) rc = nmatch; /* All captured slots were filled in */ if (rc >= 0) { size_t i; for (i = 0; i < (size_t)rc; i++) { pmatch[i].rm_so = ovector[i*2]; pmatch[i].rm_eo = ovector[i*2+1]; } if (allocated_ovector) free(ovector); for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; return 0; } else { if (allocated_ovector) free(ovector); switch(rc) { case PCRE_ERROR_NOMATCH: return REG_NOMATCH; case PCRE_ERROR_NULL: return REG_INVARG; case PCRE_ERROR_BADOPTION: return REG_INVARG; case PCRE_ERROR_BADMAGIC: return REG_INVARG; case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; case PCRE_ERROR_NOMEMORY: return REG_ESPACE; case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE; case PCRE_ERROR_BADUTF8: return REG_INVARG; case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG; default: return REG_ASSERT; } } } /* End of pcreposix.c */ gtamsanalyzer.app-0.42/Source/pcreposix.h0000555000175000017500000000445310162465511021002 0ustar brentbrent00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* Copyright (c) 1997-2003 University of Cambridge */ #ifndef _PCREPOSIX_H #define _PCREPOSIX_H /* This is the header for the POSIX wrapper interface to the PCRE Perl- Compatible Regular Expression library. It defines the things POSIX says should be there. I hope. */ /* Have to include stdlib.h in order to ensure that size_t is defined. */ #include /* Allow for C++ users */ #ifdef __cplusplus extern "C" { #endif /* Options defined by POSIX. */ #define REG_ICASE 0x01 #define REG_NEWLINE 0x02 #define REG_NOTBOL 0x04 #define REG_NOTEOL 0x08 /* These are not used by PCRE, but by defining them we make it easier to slot PCRE into existing programs that make POSIX calls. */ #define REG_EXTENDED 0 #define REG_NOSUB 0 /* Error values. Not all these are relevant or used by the wrapper. */ enum { REG_ASSERT = 1, /* internal error ? */ REG_BADBR, /* invalid repeat counts in {} */ REG_BADPAT, /* pattern error */ REG_BADRPT, /* ? * + invalid */ REG_EBRACE, /* unbalanced {} */ REG_EBRACK, /* unbalanced [] */ REG_ECOLLATE, /* collation error - not relevant */ REG_ECTYPE, /* bad class */ REG_EESCAPE, /* bad escape sequence */ REG_EMPTY, /* empty expression */ REG_EPAREN, /* unbalanced () */ REG_ERANGE, /* bad range inside [] */ REG_ESIZE, /* expression too big */ REG_ESPACE, /* failed to get memory */ REG_ESUBREG, /* bad back reference */ REG_INVARG, /* bad argument */ REG_NOMATCH /* match failed */ }; /* The structure representing a compiled regular expression. */ typedef struct { void *re_pcre; size_t re_nsub; size_t re_erroffset; } regex_t; /* The structure in which a captured offset is returned. */ typedef int regoff_t; typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t; /* The functions */ extern int regcomp(regex_t *, const char *, int); extern int regexec(const regex_t *, const char *, size_t, regmatch_t *, int); extern size_t regerror(int, const regex_t *, char *, size_t); extern void regfree(regex_t *); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* End of pcreposix.h */ gtamsanalyzer.app-0.42/Source/pcretest.c0000555000175000017500000012047210162465511020612 0ustar brentbrent00000000000000/************************************************* * PCRE testing program * *************************************************/ /* This program was hacked up as a tester for PCRE. I really should have written it more tidily in the first place. Will I ever learn? It has grown and been extended and consequently is now rather untidy in places. */ #include #include #include #include #include #include /* We need the internal info for displaying the results of pcre_study(). Also for getting the opcodes for showing compiled code. */ #define PCRE_SPY /* For Win32 build, import data, not export */ #include "internal.h" /* It is possible to compile this test program without including support for testing the POSIX interface, though this is not available via the standard Makefile. */ #if !defined NOPOSIX #include "pcreposix.h" #endif #ifndef CLOCKS_PER_SEC #ifdef CLK_TCK #define CLOCKS_PER_SEC CLK_TCK #else #define CLOCKS_PER_SEC 100 #endif #endif #define LOOPREPEAT 50000 #define BUFFER_SIZE 30000 #define DBUFFER_SIZE BUFFER_SIZE static FILE *outfile; static int log_store = 0; static int callout_count; static int callout_extra; static int callout_fail_count; static int callout_fail_id; static int first_callout; static int show_malloc; static int use_utf8; static size_t gotten_store; static const int utf8_table1[] = { 0x0000007f, 0x000007ff, 0x0000ffff, 0x001fffff, 0x03ffffff, 0x7fffffff}; static const int utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; static const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; /************************************************* * Print compiled regex * *************************************************/ /* The code for doing this is held in a separate file that is also included in pcre.c when it is compiled with the debug switch. It defines a function called print_internals(), which uses a table of opcode lengths defined by the macro OP_LENGTHS, whose name must be OP_lengths. */ static uschar OP_lengths[] = { OP_LENGTHS }; #include "printint.c" /************************************************* * Read number from string * *************************************************/ /* We don't use strtoul() because SunOS4 doesn't have it. Rather than mess around with conditional compilation, just do the job by hand. It is only used for unpicking the -o argument, so just keep it simple. Arguments: str string to be converted endptr where to put the end pointer Returns: the unsigned long */ static int get_value(unsigned char *str, unsigned char **endptr) { int result = 0; while(*str != 0 && isspace(*str)) str++; while (isdigit(*str)) result = result * 10 + (int)(*str++ - '0'); *endptr = str; return(result); } /************************************************* * Convert character value to UTF-8 * *************************************************/ /* This function takes an integer value in the range 0 - 0x7fffffff and encodes it as a UTF-8 character in 0 to 6 bytes. Arguments: cvalue the character value buffer pointer to buffer for result - at least 6 bytes long Returns: number of characters placed in the buffer -1 if input character is negative 0 if input character is positive but too big (only when int is longer than 32 bits) */ static int ord2utf8(int cvalue, unsigned char *buffer) { register int i, j; for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) if (cvalue <= utf8_table1[i]) break; if (i >= sizeof(utf8_table1)/sizeof(int)) return 0; if (cvalue < 0) return -1; buffer += i; for (j = i; j > 0; j--) { *buffer-- = 0x80 | (cvalue & 0x3f); cvalue >>= 6; } *buffer = utf8_table2[i] | cvalue; return i + 1; } /************************************************* * Convert UTF-8 string to value * *************************************************/ /* This function takes one or more bytes that represents a UTF-8 character, and returns the value of the character. Argument: buffer a pointer to the byte vector vptr a pointer to an int to receive the value Returns: > 0 => the number of bytes consumed -6 to 0 => malformed UTF-8 character at offset = (-return) */ static int utf82ord(unsigned char *buffer, int *vptr) { int c = *buffer++; int d = c; int i, j, s; for (i = -1; i < 6; i++) /* i is number of additional bytes */ { if ((d & 0x80) == 0) break; d <<= 1; } if (i == -1) { *vptr = c; return 1; } /* ascii character */ if (i == 0 || i == 6) return 0; /* invalid UTF-8 */ /* i now has a value in the range 1-5 */ s = 6*i; d = (c & utf8_table3[i]) << s; for (j = 0; j < i; j++) { c = *buffer++; if ((c & 0xc0) != 0x80) return -(j+1); s -= 6; d |= (c & 0x3f) << s; } /* Check that encoding was the correct unique one */ for (j = 0; j < sizeof(utf8_table1)/sizeof(int); j++) if (d <= utf8_table1[j]) break; if (j != i) return -(i+1); /* Valid value */ *vptr = d; return i+1; } /************************************************* * Print character string * *************************************************/ /* Character string printing function. Must handle UTF-8 strings in utf8 mode. Yields number of characters printed. If handed a NULL file, just counts chars without printing. */ static int pchars(unsigned char *p, int length, FILE *f) { int c; int yield = 0; while (length-- > 0) { if (use_utf8) { int rc = utf82ord(p, &c); if (rc > 0 && rc <= length + 1) /* Mustn't run over the end */ { length -= rc - 1; p += rc; if (c < 256 && isprint(c)) { if (f != NULL) fprintf(f, "%c", c); yield++; } else { int n; if (f != NULL) fprintf(f, "\\x{%02x}%n", c, &n); yield += n; } continue; } } /* Not UTF-8, or malformed UTF-8 */ if (isprint(c = *(p++))) { if (f != NULL) fprintf(f, "%c", c); yield++; } else { if (f != NULL) fprintf(f, "\\x%02x", c); yield += 4; } } return yield; } /************************************************* * Callout function * *************************************************/ /* Called from PCRE as a result of the (?C) item. We print out where we are in the match. Yield zero unless more callouts than the fail count, or the callout data is not zero. */ static int callout(pcre_callout_block *cb) { FILE *f = (first_callout | callout_extra)? outfile : NULL; int i, pre_start, post_start; if (callout_extra) { fprintf(f, "Callout %d: last capture = %d\n", cb->callout_number, cb->capture_last); for (i = 0; i < cb->capture_top * 2; i += 2) { if (cb->offset_vector[i] < 0) fprintf(f, "%2d: \n", i/2); else { fprintf(f, "%2d: ", i/2); (void)pchars((unsigned char *)cb->subject + cb->offset_vector[i], cb->offset_vector[i+1] - cb->offset_vector[i], f); fprintf(f, "\n"); } } } /* Re-print the subject in canonical form, the first time or if giving full datails. On subsequent calls in the same match, we use pchars just to find the printed lengths of the substrings. */ if (f != NULL) fprintf(f, "--->"); pre_start = pchars((unsigned char *)cb->subject, cb->start_match, f); post_start = pchars((unsigned char *)(cb->subject + cb->start_match), cb->current_position - cb->start_match, f); (void)pchars((unsigned char *)(cb->subject + cb->current_position), cb->subject_length - cb->current_position, f); if (f != NULL) fprintf(f, "\n"); /* Always print appropriate indicators, with callout number if not already shown */ if (callout_extra) fprintf(outfile, " "); else fprintf(outfile, "%3d ", cb->callout_number); for (i = 0; i < pre_start; i++) fprintf(outfile, " "); fprintf(outfile, "^"); if (post_start > 0) { for (i = 0; i < post_start - 1; i++) fprintf(outfile, " "); fprintf(outfile, "^"); } fprintf(outfile, "\n"); first_callout = 0; if (cb->callout_data != NULL) { int callout_data = *((int *)(cb->callout_data)); if (callout_data != 0) { fprintf(outfile, "Callout data = %d\n", callout_data); return callout_data; } } return (cb->callout_number != callout_fail_id)? 0 : (++callout_count >= callout_fail_count)? 1 : 0; } /************************************************* * Local malloc functions * *************************************************/ /* Alternative malloc function, to test functionality and show the size of the compiled re. */ static void *new_malloc(size_t size) { void *block = malloc(size); gotten_store = size; if (show_malloc) fprintf(outfile, "malloc %3d %p\n", size, block); return block; } static void new_free(void *block) { if (show_malloc) fprintf(outfile, "free %p\n", block); free(block); } /* For recursion malloc/free, to test stacking calls */ static void *stack_malloc(size_t size) { void *block = malloc(size); if (show_malloc) fprintf(outfile, "stack_malloc %3d %p\n", size, block); return block; } static void stack_free(void *block) { if (show_malloc) fprintf(outfile, "stack_free %p\n", block); free(block); } /************************************************* * Call pcre_fullinfo() * *************************************************/ /* Get one piece of information from the pcre_fullinfo() function */ static void new_info(pcre *re, pcre_extra *study, int option, void *ptr) { int rc; if ((rc = pcre_fullinfo(re, study, option, ptr)) < 0) fprintf(outfile, "Error %d from pcre_fullinfo(%d)\n", rc, option); } /************************************************* * Main Program * *************************************************/ /* Read lines from named file or stdin and write to named file or stdout; lines consist of a regular expression, in delimiters and optionally followed by options, followed by a set of test data, terminated by an empty line. */ int main(int argc, char **argv) { FILE *infile = stdin; int options = 0; int study_options = 0; int op = 1; int timeit = 0; int showinfo = 0; int showstore = 0; int size_offsets = 45; int size_offsets_max; int *offsets; #if !defined NOPOSIX int posix = 0; #endif int debug = 0; int done = 0; unsigned char *buffer; unsigned char *dbuffer; /* Get buffers from malloc() so that Electric Fence will check their misuse when I am debugging. */ buffer = (unsigned char *)malloc(BUFFER_SIZE); dbuffer = (unsigned char *)malloc(DBUFFER_SIZE); /* Static so that new_malloc can use it. */ outfile = stdout; /* Scan options */ while (argc > 1 && argv[op][0] == '-') { unsigned char *endptr; if (strcmp(argv[op], "-s") == 0 || strcmp(argv[op], "-m") == 0) showstore = 1; else if (strcmp(argv[op], "-t") == 0) timeit = 1; else if (strcmp(argv[op], "-i") == 0) showinfo = 1; else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1; else if (strcmp(argv[op], "-o") == 0 && argc > 2 && ((size_offsets = get_value((unsigned char *)argv[op+1], &endptr)), *endptr == 0)) { op++; argc--; } #if !defined NOPOSIX else if (strcmp(argv[op], "-p") == 0) posix = 1; #endif else if (strcmp(argv[op], "-C") == 0) { int rc; printf("PCRE version %s\n", pcre_version()); printf("Compiled with\n"); (void)pcre_config(PCRE_CONFIG_UTF8, &rc); printf(" %sUTF-8 support\n", rc? "" : "No "); (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc); printf(" Newline character is %s\n", (rc == '\r')? "CR" : "LF"); (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc); printf(" Internal link size = %d\n", rc); (void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc); printf(" POSIX malloc threshold = %d\n", rc); (void)pcre_config(PCRE_CONFIG_MATCH_LIMIT, &rc); printf(" Default match limit = %d\n", rc); (void)pcre_config(PCRE_CONFIG_STACKRECURSE, &rc); printf(" Match recursion uses %s\n", rc? "stack" : "heap"); exit(0); } else { printf("** Unknown or malformed option %s\n", argv[op]); printf("Usage: pcretest [-d] [-i] [-o ] [-p] [-s] [-t] [ []]\n"); printf(" -C show PCRE compile-time options and exit\n"); printf(" -d debug: show compiled code; implies -i\n" " -i show information about compiled pattern\n" " -o set size of offsets vector to \n"); #if !defined NOPOSIX printf(" -p use POSIX interface\n"); #endif printf(" -s output store information\n" " -t time compilation and execution\n"); return 1; } op++; argc--; } /* Get the store for the offsets vector, and remember what it was */ size_offsets_max = size_offsets; offsets = (int *)malloc(size_offsets_max * sizeof(int)); if (offsets == NULL) { printf("** Failed to get %d bytes of memory for offsets vector\n", size_offsets_max * sizeof(int)); return 1; } /* Sort out the input and output files */ if (argc > 1) { infile = fopen(argv[op], "r"); if (infile == NULL) { printf("** Failed to open %s\n", argv[op]); return 1; } } if (argc > 2) { outfile = fopen(argv[op+1], "w"); if (outfile == NULL) { printf("** Failed to open %s\n", argv[op+1]); return 1; } } /* Set alternative malloc function */ pcre_malloc = new_malloc; pcre_free = new_free; pcre_stack_malloc = stack_malloc; pcre_stack_free = stack_free; /* Heading line, then prompt for first regex if stdin */ fprintf(outfile, "PCRE version %s\n\n", pcre_version()); /* Main loop */ while (!done) { pcre *re = NULL; pcre_extra *extra = NULL; #if !defined NOPOSIX /* There are still compilers that require no indent */ regex_t preg; int do_posix = 0; #endif const char *error; unsigned char *p, *pp, *ppp; const unsigned char *tables = NULL; int do_study = 0; int do_debug = debug; int do_G = 0; int do_g = 0; int do_showinfo = showinfo; int do_showrest = 0; int erroroffset, len, delimiter; use_utf8 = 0; if (infile == stdin) printf(" re> "); if (fgets((char *)buffer, BUFFER_SIZE, infile) == NULL) break; if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); fflush(outfile); p = buffer; while (isspace(*p)) p++; if (*p == 0) continue; /* Get the delimiter and seek the end of the pattern; if is isn't complete, read more. */ delimiter = *p++; if (isalnum(delimiter) || delimiter == '\\') { fprintf(outfile, "** Delimiter must not be alphameric or \\\n"); goto SKIP_DATA; } pp = p; for(;;) { while (*pp != 0) { if (*pp == '\\' && pp[1] != 0) pp++; else if (*pp == delimiter) break; pp++; } if (*pp != 0) break; len = BUFFER_SIZE - (pp - buffer); if (len < 256) { fprintf(outfile, "** Expression too long - missing delimiter?\n"); goto SKIP_DATA; } if (infile == stdin) printf(" > "); if (fgets((char *)pp, len, infile) == NULL) { fprintf(outfile, "** Unexpected EOF\n"); done = 1; goto CONTINUE; } if (infile != stdin) fprintf(outfile, "%s", (char *)pp); } /* If the first character after the delimiter is backslash, make the pattern end with backslash. This is purely to provide a way of testing for the error message when a pattern ends with backslash. */ if (pp[1] == '\\') *pp++ = '\\'; /* Terminate the pattern at the delimiter */ *pp++ = 0; /* Look for options after final delimiter */ options = 0; study_options = 0; log_store = showstore; /* default from command line */ while (*pp != 0) { switch (*pp++) { case 'g': do_g = 1; break; case 'i': options |= PCRE_CASELESS; break; case 'm': options |= PCRE_MULTILINE; break; case 's': options |= PCRE_DOTALL; break; case 'x': options |= PCRE_EXTENDED; break; case '+': do_showrest = 1; break; case 'A': options |= PCRE_ANCHORED; break; case 'D': do_debug = do_showinfo = 1; break; case 'E': options |= PCRE_DOLLAR_ENDONLY; break; case 'G': do_G = 1; break; case 'I': do_showinfo = 1; break; case 'M': log_store = 1; break; case 'N': options |= PCRE_NO_AUTO_CAPTURE; break; #if !defined NOPOSIX case 'P': do_posix = 1; break; #endif case 'S': do_study = 1; break; case 'U': options |= PCRE_UNGREEDY; break; case 'X': options |= PCRE_EXTRA; break; case '8': options |= PCRE_UTF8; use_utf8 = 1; break; case '?': options |= PCRE_NO_UTF8_CHECK; break; case 'L': ppp = pp; while (*ppp != '\n' && *ppp != ' ') ppp++; *ppp = 0; if (setlocale(LC_CTYPE, (const char *)pp) == NULL) { fprintf(outfile, "** Failed to set locale \"%s\"\n", pp); goto SKIP_DATA; } tables = pcre_maketables(); pp = ppp; break; case '\n': case ' ': break; default: fprintf(outfile, "** Unknown option '%c'\n", pp[-1]); goto SKIP_DATA; } } /* Handle compiling via the POSIX interface, which doesn't support the timing, showing, or debugging options, nor the ability to pass over local character tables. */ #if !defined NOPOSIX if (posix || do_posix) { int rc; int cflags = 0; if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE; if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE; rc = regcomp(&preg, (char *)p, cflags); /* Compilation failed; go back for another re, skipping to blank line if non-interactive. */ if (rc != 0) { (void)regerror(rc, &preg, (char *)buffer, BUFFER_SIZE); fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer); goto SKIP_DATA; } } /* Handle compiling via the native interface */ else #endif /* !defined NOPOSIX */ { if (timeit) { register int i; clock_t time_taken; clock_t start_time = clock(); for (i = 0; i < LOOPREPEAT; i++) { re = pcre_compile((char *)p, options, &error, &erroroffset, tables); if (re != NULL) free(re); } time_taken = clock() - start_time; fprintf(outfile, "Compile time %.3f milliseconds\n", (((double)time_taken * 1000.0) / (double)LOOPREPEAT) / (double)CLOCKS_PER_SEC); } re = pcre_compile((char *)p, options, &error, &erroroffset, tables); /* Compilation failed; go back for another re, skipping to blank line if non-interactive. */ if (re == NULL) { fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset); SKIP_DATA: if (infile != stdin) { for (;;) { if (fgets((char *)buffer, BUFFER_SIZE, infile) == NULL) { done = 1; goto CONTINUE; } len = (int)strlen((char *)buffer); while (len > 0 && isspace(buffer[len-1])) len--; if (len == 0) break; } fprintf(outfile, "\n"); } goto CONTINUE; } /* Compilation succeeded; print data if required. There are now two info-returning functions. The old one has a limited interface and returns only limited data. Check that it agrees with the newer one. */ if (log_store) fprintf(outfile, "Memory allocation (code space): %d\n", (int)(gotten_store - sizeof(real_pcre) - ((real_pcre *)re)->name_count * ((real_pcre *)re)->name_entry_size)); if (do_showinfo) { unsigned long int get_options; int old_first_char, old_options, old_count; int count, backrefmax, first_char, need_char; int nameentrysize, namecount; const uschar *nametable; size_t size; if (do_debug) { fprintf(outfile, "------------------------------------------------------------------\n"); print_internals(re, outfile); } new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options); new_info(re, NULL, PCRE_INFO_SIZE, &size); new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count); new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax); new_info(re, NULL, PCRE_INFO_FIRSTBYTE, &first_char); new_info(re, NULL, PCRE_INFO_LASTLITERAL, &need_char); new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize); new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount); new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable); old_count = pcre_info(re, &old_options, &old_first_char); if (count < 0) fprintf(outfile, "Error %d from pcre_info()\n", count); else { if (old_count != count) fprintf(outfile, "Count disagreement: pcre_fullinfo=%d pcre_info=%d\n", count, old_count); if (old_first_char != first_char) fprintf(outfile, "First char disagreement: pcre_fullinfo=%d pcre_info=%d\n", first_char, old_first_char); if (old_options != (int)get_options) fprintf(outfile, "Options disagreement: pcre_fullinfo=%ld pcre_info=%d\n", get_options, old_options); } if (size != gotten_store) fprintf(outfile, "Size disagreement: pcre_fullinfo=%d call to malloc for %d\n", size, gotten_store); fprintf(outfile, "Capturing subpattern count = %d\n", count); if (backrefmax > 0) fprintf(outfile, "Max back reference = %d\n", backrefmax); if (namecount > 0) { fprintf(outfile, "Named capturing subpatterns:\n"); while (namecount-- > 0) { fprintf(outfile, " %s %*s%3d\n", nametable + 2, nameentrysize - 3 - (int)strlen((char *)nametable + 2), "", GET2(nametable, 0)); nametable += nameentrysize; } } if (get_options == 0) fprintf(outfile, "No options\n"); else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s\n", ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "", ((get_options & PCRE_CASELESS) != 0)? " caseless" : "", ((get_options & PCRE_EXTENDED) != 0)? " extended" : "", ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "", ((get_options & PCRE_DOTALL) != 0)? " dotall" : "", ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "", ((get_options & PCRE_EXTRA) != 0)? " extra" : "", ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "", ((get_options & PCRE_UTF8) != 0)? " utf8" : "", ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : ""); if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0) fprintf(outfile, "Case state changes\n"); if (first_char == -1) { fprintf(outfile, "First char at start or follows \\n\n"); } else if (first_char < 0) { fprintf(outfile, "No first char\n"); } else { int ch = first_char & 255; const char *caseless = ((first_char & REQ_CASELESS) == 0)? "" : " (caseless)"; if (isprint(ch)) fprintf(outfile, "First char = \'%c\'%s\n", ch, caseless); else fprintf(outfile, "First char = %d%s\n", ch, caseless); } if (need_char < 0) { fprintf(outfile, "No need char\n"); } else { int ch = need_char & 255; const char *caseless = ((need_char & REQ_CASELESS) == 0)? "" : " (caseless)"; if (isprint(ch)) fprintf(outfile, "Need char = \'%c\'%s\n", ch, caseless); else fprintf(outfile, "Need char = %d%s\n", ch, caseless); } } /* If /S was present, study the regexp to generate additional info to help with the matching. */ if (do_study) { if (timeit) { register int i; clock_t time_taken; clock_t start_time = clock(); for (i = 0; i < LOOPREPEAT; i++) extra = pcre_study(re, study_options, &error); time_taken = clock() - start_time; if (extra != NULL) free(extra); fprintf(outfile, " Study time %.3f milliseconds\n", (((double)time_taken * 1000.0) / (double)LOOPREPEAT) / (double)CLOCKS_PER_SEC); } extra = pcre_study(re, study_options, &error); if (error != NULL) fprintf(outfile, "Failed to study: %s\n", error); else if (extra == NULL) fprintf(outfile, "Study returned NULL\n"); /* Don't output study size; at present it is in any case a fixed value, but it varies, depending on the computer architecture, and so messes up the test suite. */ else if (do_showinfo) { size_t size; uschar *start_bits = NULL; new_info(re, extra, PCRE_INFO_STUDYSIZE, &size); new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits); /* fprintf(outfile, "Study size = %d\n", size); */ if (start_bits == NULL) fprintf(outfile, "No starting character set\n"); else { int i; int c = 24; fprintf(outfile, "Starting character set: "); for (i = 0; i < 256; i++) { if ((start_bits[i/8] & (1<<(i%8))) != 0) { if (c > 75) { fprintf(outfile, "\n "); c = 2; } if (isprint(i) && i != ' ') { fprintf(outfile, "%c ", i); c += 2; } else { fprintf(outfile, "\\x%02x ", i); c += 5; } } } fprintf(outfile, "\n"); } } } } /* Read data lines and test them */ for (;;) { unsigned char *q; unsigned char *bptr = dbuffer; int *use_offsets = offsets; int use_size_offsets = size_offsets; int callout_data = 0; int callout_data_set = 0; int count, c; int copystrings = 0; int find_match_limit = 0; int getstrings = 0; int getlist = 0; int gmatched = 0; int start_offset = 0; int g_notempty = 0; options = 0; pcre_callout = callout; first_callout = 1; callout_extra = 0; callout_count = 0; callout_fail_count = 999999; callout_fail_id = -1; show_malloc = 0; if (infile == stdin) printf("data> "); if (fgets((char *)buffer, BUFFER_SIZE, infile) == NULL) { done = 1; goto CONTINUE; } if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); len = (int)strlen((char *)buffer); while (len > 0 && isspace(buffer[len-1])) len--; buffer[len] = 0; if (len == 0) break; p = buffer; while (isspace(*p)) p++; q = dbuffer; while ((c = *p++) != 0) { int i = 0; int n = 0; if (c == '\\') switch ((c = *p++)) { case 'a': c = 7; break; case 'b': c = '\b'; break; case 'e': c = 27; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': c -= '0'; while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9') c = c * 8 + *p++ - '0'; break; case 'x': /* Handle \x{..} specially - new Perl thing for utf8 */ if (*p == '{') { unsigned char *pt = p; c = 0; while (isxdigit(*(++pt))) c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'W'); if (*pt == '}') { unsigned char buff8[8]; int ii, utn; utn = ord2utf8(c, buff8); for (ii = 0; ii < utn - 1; ii++) *q++ = buff8[ii]; c = buff8[ii]; /* Last byte */ p = pt + 1; break; } /* Not correct form; fall through */ } /* Ordinary \x */ c = 0; while (i++ < 2 && isxdigit(*p)) { c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'W'); p++; } break; case 0: /* Allows for an empty line */ p--; continue; case 'A': /* Option setting */ options |= PCRE_ANCHORED; continue; case 'B': options |= PCRE_NOTBOL; continue; case 'C': if (isdigit(*p)) /* Set copy string */ { while(isdigit(*p)) n = n * 10 + *p++ - '0'; copystrings |= 1 << n; } else if (isalnum(*p)) { uschar name[256]; uschar *npp = name; while (isalnum(*p)) *npp++ = *p++; *npp = 0; n = pcre_get_stringnumber(re, (char *)name); if (n < 0) fprintf(outfile, "no parentheses with name \"%s\"\n", name); else copystrings |= 1 << n; } else if (*p == '+') { callout_extra = 1; p++; } else if (*p == '-') { pcre_callout = NULL; p++; } else if (*p == '!') { callout_fail_id = 0; p++; while(isdigit(*p)) callout_fail_id = callout_fail_id * 10 + *p++ - '0'; callout_fail_count = 0; if (*p == '!') { p++; while(isdigit(*p)) callout_fail_count = callout_fail_count * 10 + *p++ - '0'; } } else if (*p == '*') { int sign = 1; callout_data = 0; if (*(++p) == '-') { sign = -1; p++; } while(isdigit(*p)) callout_data = callout_data * 10 + *p++ - '0'; callout_data *= sign; callout_data_set = 1; } continue; case 'G': if (isdigit(*p)) { while(isdigit(*p)) n = n * 10 + *p++ - '0'; getstrings |= 1 << n; } else if (isalnum(*p)) { uschar name[256]; uschar *npp = name; while (isalnum(*p)) *npp++ = *p++; *npp = 0; n = pcre_get_stringnumber(re, (char *)name); if (n < 0) fprintf(outfile, "no parentheses with name \"%s\"\n", name); else getstrings |= 1 << n; } continue; case 'L': getlist = 1; continue; case 'M': find_match_limit = 1; continue; case 'N': options |= PCRE_NOTEMPTY; continue; case 'O': while(isdigit(*p)) n = n * 10 + *p++ - '0'; if (n > size_offsets_max) { size_offsets_max = n; free(offsets); use_offsets = offsets = (int *)malloc(size_offsets_max * sizeof(int)); if (offsets == NULL) { printf("** Failed to get %d bytes of memory for offsets vector\n", size_offsets_max * sizeof(int)); return 1; } } use_size_offsets = n; if (n == 0) use_offsets = NULL; /* Ensures it can't write to it */ continue; case 'S': show_malloc = 1; continue; case 'Z': options |= PCRE_NOTEOL; continue; case '?': options |= PCRE_NO_UTF8_CHECK; continue; } *q++ = c; } *q = 0; len = q - dbuffer; /* Handle matching via the POSIX interface, which does not support timing or playing with the match limit or callout data. */ #if !defined NOPOSIX if (posix || do_posix) { int rc; int eflags = 0; regmatch_t *pmatch = NULL; if (use_size_offsets > 0) pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets); if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL; if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL; rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags); if (rc != 0) { (void)regerror(rc, &preg, (char *)buffer, BUFFER_SIZE); fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer); } else { size_t i; for (i = 0; i < (size_t)use_size_offsets; i++) { if (pmatch[i].rm_so >= 0) { fprintf(outfile, "%2d: ", (int)i); (void)pchars(dbuffer + pmatch[i].rm_so, pmatch[i].rm_eo - pmatch[i].rm_so, outfile); fprintf(outfile, "\n"); if (i == 0 && do_showrest) { fprintf(outfile, " 0+ "); (void)pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo, outfile); fprintf(outfile, "\n"); } } } } free(pmatch); } /* Handle matching via the native interface - repeats for /g and /G */ else #endif /* !defined NOPOSIX */ for (;; gmatched++) /* Loop for /g or /G */ { if (timeit) { register int i; clock_t time_taken; clock_t start_time = clock(); for (i = 0; i < LOOPREPEAT; i++) count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets); time_taken = clock() - start_time; fprintf(outfile, "Execute time %.3f milliseconds\n", (((double)time_taken * 1000.0) / (double)LOOPREPEAT) / (double)CLOCKS_PER_SEC); } /* If find_match_limit is set, we want to do repeated matches with varying limits in order to find the minimum value. */ if (find_match_limit) { int min = 0; int mid = 64; int max = -1; if (extra == NULL) { extra = (pcre_extra *)malloc(sizeof(pcre_extra)); extra->flags = 0; } extra->flags |= PCRE_EXTRA_MATCH_LIMIT; for (;;) { extra->match_limit = mid; count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets); if (count == PCRE_ERROR_MATCHLIMIT) { /* fprintf(outfile, "Testing match limit = %d\n", mid); */ min = mid; mid = (mid == max - 1)? max : (max > 0)? (min + max)/2 : mid*2; } else if (count >= 0 || count == PCRE_ERROR_NOMATCH) { if (mid == min + 1) { fprintf(outfile, "Minimum match limit = %d\n", mid); break; } /* fprintf(outfile, "Testing match limit = %d\n", mid); */ max = mid; mid = (min + mid)/2; } else break; /* Some other error */ } extra->flags &= ~PCRE_EXTRA_MATCH_LIMIT; } /* If callout_data is set, use the interface with additional data */ else if (callout_data_set) { if (extra == NULL) { extra = (pcre_extra *)malloc(sizeof(pcre_extra)); extra->flags = 0; } extra->flags |= PCRE_EXTRA_CALLOUT_DATA; extra->callout_data = &callout_data; count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets); extra->flags &= ~PCRE_EXTRA_CALLOUT_DATA; } /* The normal case is just to do the match once, with the default value of match_limit. */ else count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets); if (count == 0) { fprintf(outfile, "Matched, but too many substrings\n"); count = use_size_offsets/3; } /* Matched */ if (count >= 0) { int i; for (i = 0; i < count * 2; i += 2) { if (use_offsets[i] < 0) fprintf(outfile, "%2d: \n", i/2); else { fprintf(outfile, "%2d: ", i/2); (void)pchars(bptr + use_offsets[i], use_offsets[i+1] - use_offsets[i], outfile); fprintf(outfile, "\n"); if (i == 0) { if (do_showrest) { fprintf(outfile, " 0+ "); (void)pchars(bptr + use_offsets[i+1], len - use_offsets[i+1], outfile); fprintf(outfile, "\n"); } } } } for (i = 0; i < 32; i++) { if ((copystrings & (1 << i)) != 0) { char copybuffer[16]; int rc = pcre_copy_substring((char *)bptr, use_offsets, count, i, copybuffer, sizeof(copybuffer)); if (rc < 0) fprintf(outfile, "copy substring %d failed %d\n", i, rc); else fprintf(outfile, "%2dC %s (%d)\n", i, copybuffer, rc); } } for (i = 0; i < 32; i++) { if ((getstrings & (1 << i)) != 0) { const char *substring; int rc = pcre_get_substring((char *)bptr, use_offsets, count, i, &substring); if (rc < 0) fprintf(outfile, "get substring %d failed %d\n", i, rc); else { fprintf(outfile, "%2dG %s (%d)\n", i, substring, rc); /* free((void *)substring); */ pcre_free_substring(substring); } } } if (getlist) { const char **stringlist; int rc = pcre_get_substring_list((char *)bptr, use_offsets, count, &stringlist); if (rc < 0) fprintf(outfile, "get substring list failed %d\n", rc); else { for (i = 0; i < count; i++) fprintf(outfile, "%2dL %s\n", i, stringlist[i]); if (stringlist[i] != NULL) fprintf(outfile, "string list not terminated by NULL\n"); /* free((void *)stringlist); */ pcre_free_substring_list(stringlist); } } } /* Failed to match. If this is a /g or /G loop and we previously set g_notempty after a null match, this is not necessarily the end. We want to advance the start offset, and continue. In the case of UTF-8 matching, the advance must be one character, not one byte. Fudge the offset values to achieve this. We won't be at the end of the string - that was checked before setting g_notempty. */ else { if (g_notempty != 0) { int onechar = 1; use_offsets[0] = start_offset; if (use_utf8) { while (start_offset + onechar < len) { int tb = bptr[start_offset+onechar]; if (tb <= 127) break; tb &= 0xc0; if (tb != 0 && tb != 0xc0) onechar++; } } use_offsets[1] = start_offset + onechar; } else { if (count == PCRE_ERROR_NOMATCH) { if (gmatched == 0) fprintf(outfile, "No match\n"); } else fprintf(outfile, "Error %d\n", count); break; /* Out of the /g loop */ } } /* If not /g or /G we are done */ if (!do_g && !do_G) break; /* If we have matched an empty string, first check to see if we are at the end of the subject. If so, the /g loop is over. Otherwise, mimic what Perl's /g options does. This turns out to be rather cunning. First we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the same point. If this fails (picked up above) we advance to the next character. */ g_notempty = 0; if (use_offsets[0] == use_offsets[1]) { if (use_offsets[0] == len) break; g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED; } /* For /g, update the start offset, leaving the rest alone */ if (do_g) start_offset = use_offsets[1]; /* For /G, update the pointer and length */ else { bptr += use_offsets[1]; len -= use_offsets[1]; } } /* End of loop for /g and /G */ } /* End of loop for data lines */ CONTINUE: #if !defined NOPOSIX if (posix || do_posix) regfree(&preg); #endif if (re != NULL) free(re); if (extra != NULL) free(extra); if (tables != NULL) { free((void *)tables); setlocale(LC_CTYPE, "C"); } } if (infile == stdin) fprintf(outfile, "\n"); return 0; } /* End */ gtamsanalyzer.app-0.42/Source/playMedia.tif0000555000175000017500000000647610162465511021235 0ustar brentbrent00000000000000MM* .............籺簹篸殸氹簹....ᔠޔޜ঱....᥯.ޔޔ.⡬...ᖡޔޔ..ᝩᝩᝩ.촻.ޔޔ  .     ._e.֔ޔ . .    .FI /-..ޔ. ...# ag\!..  .."u|+..  ..!痢... ... "%瑝ړݔ..... "%%铞ܔޔ    "%%ߔޔ   "%%ꕡ.....  "%...  ... !#..ܔ  ...  !;b.ےۖ ..    BF *s...ͩ...   `fPN....%%%%.%%%%%') ...................................    7  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/playMedia.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/prefBoss.h0000555000175000017500000001276610162465511020557 0ustar brentbrent00000000000000/* prefBoss */ #import #import extern NSString *TAPromptKey; extern NSString *TADateStampKey; extern NSString *TAMacNLKey; extern NSString *TAAutoReloadKey; extern NSString *TACodeFromList; extern NSString *TAUseToolTip; extern NSString *TACountSections; extern NSString *TAUseCoder; extern NSString *TACoderID; extern NSString *TAShowCoder; extern NSString *TASavedState; extern NSString *TASavedFileList; extern NSString *TAEOFIsEnd; extern NSString *TAZapUnivAtEOF; extern NSString *TABackendRepeat; extern NSString *TAScanInit; extern NSString *TANonSimpleRepeat; extern NSString *TAUnichar; extern NSString *TADetachedSheet; extern NSString *TATagColor; extern NSString *TAZoomFactor; extern NSString *TAEscapeBraces; extern NSString *TAAutoColor; extern NSString *TAScanForLN; extern NSString *TACommentForCode; extern NSString *TACancelAfterAddCode; extern NSString *TACancelAfterRecode; extern NSString *TAGuessUpdate; extern NSString *TASaveGraphviz; extern NSString *TAEnableBack; extern NSString *TACodeAV; extern NSString *TAAVCode; extern NSString *TAAVBackspace; extern NSString *TAAutoBackspace; extern NSString *TARealColor; extern NSString *TAMetaColor; extern NSString *TABatchOpenFiles; extern NSString *TADefaultUnstruct; extern NSString *TATimeFormatHHMMSS; extern NSString *TACheckCodeDefinition; extern NSString *TAHCLStackSize; extern NSString *TAGDotDir; extern NSString *TAGGVDir; extern NSString *TAGUseGV; @interface prefBoss : NSWindowController { IBOutlet id dateStamp; IBOutlet id panelWindow; IBOutlet id prompt; IBOutlet id macNLOption; IBOutlet id autoReloadOption; IBOutlet id codeFromListOption; IBOutlet id useToolTip; IBOutlet id countSections; IBOutlet id useCodeID; IBOutlet id codeID; IBOutlet id showCoderView; IBOutlet id EOFIsEndSwitch; IBOutlet id zapUniv; IBOutlet id backendRepeat; IBOutlet id scanInit; IBOutlet id nonSimpleRepeat; IBOutlet id charSwitch; IBOutlet id detachedSheetSwitch; IBOutlet id tagColorMenu; IBOutlet id zoomFactorView; IBOutlet id escapeBracesOption; IBOutlet id autoColorOption; IBOutlet id scanForLNOption; IBOutlet id commentForCodeOption; IBOutlet id cancelAfterRecode; IBOutlet id cancelAfterAddCode; IBOutlet id guessUpdateOption; IBOutlet id saveGraphviz; IBOutlet id enableBack; IBOutlet id codeAV; IBOutlet id AVCode; IBOutlet id AVBackspace; IBOutlet id autoBackspace; IBOutlet id realColorWell; IBOutlet id metaColorWell; IBOutlet id batchOpenFiles; IBOutlet id defaultUnstructSwitch; IBOutlet id timeFormat; IBOutlet id checkCodeDef; IBOutlet id hclStackSize; IBOutlet id dotDir; IBOutlet id gvDir; IBOutlet id useGV; } -(IBAction) tweedleDotDir: (id) sender; -(IBAction) tweedleGVDir: (id) sender; -(IBAction) tweedleUseGV: (id) sender; -(IBAction)tweedleDateStamp: (id) sender; -(IBAction)tweedleScanInit: (id) sender; -(IBAction)tweedlePrompt: (id) sender; -(IBAction)tweedleMacNL: (id) sender; -(IBAction)tweedleAutoReload: (id) sender; -(IBAction)tweedleCodeFromList: (id) sender; -(IBAction)tweedleUseToolTip: (id) sender; -(IBAction)tweedleCountSections: (id) sender; -(IBAction)tweedleUseCoder: (id) sender; -(IBAction)tweedleShowCoder: (id) sender; -(IBAction)tweedleEOFIsEnd: (id) sender; -(IBAction)tweedleZapUniv: (id) sender; -(IBAction)tweedleEscapeBraces: (id) sender; -(IBAction)tweedleDefaultUnstruct: (id) sender; -(IBAction) tweedleBackendRepeat: (id) sender; -(IBAction) tweedleNonSimpleRepeat: (id) sender; -(IBAction) tweedleUnichar: (id) sender; -(IBAction) tweedleDetachedSheet: (id) sender; -(IBAction) tweedleTagColor: (id) sender; -(IBAction) tweedleAutoColor: (id) sender; -(IBAction) tweedleMetaColor: (id) sender; -(IBAction) tweedleScanForLN: (id) sender; -(IBAction) tweedleCommentForCode: (id) sender; -(IBAction) tweedleCancelAfterRecode: (id) sender; -(IBAction) tweedleCancelAfterAddCode: (id) sender; -(IBAction) tweedleGuessUpdate: (id) sender; -(IBAction) tweedleSaveGraphviz: (id) sender; -(IBAction) tweedleEnableBack: (id) sender; -(IBAction) tweedleCodeAV: (id) sender; -(IBAction) tweedleAutoBackspace: (id) sender; -(IBAction) tweedleRealColor: (id) sender; -(IBAction) tweedleBatchOpenFiles: (id) sender; -(IBAction) tweedleTimeFormatHHMMSS: (id) sender; -(IBAction) tweedleCheckCodeDef: (id) sender; -(IBAction) tweedleHCLStackSize: (id) sender; -(int) promptValue; -(int) dateTimeValue; -(int) checkCodeDef; -(int) macNLValue; -(int) autoReloadValue; -(int) codeFromListValue; -(int) useToolTipValue; -(int) countSectionsValue; -(int) useCoderValue; -(int) showCoder; -(int) EOFIsEndValue; -(int) zapUnivValue; -(int) backendRepeatValue; -(int) scanInitValue; -(int) nonSimpleRepeatValue; -(int) unicharValue; -(int) detachedSheetValue; -(int) tagColorValue; -(int) zoomFactorValue; -(int) escapeBracesValue; -(int) autoColorValue; -(int) TAScanForLN; //should be scanForNLValue -(int) commentForCode; -(int) cancelAfterAddCode; -(int) cancelAfterRecode; -(int) guessUpdate; -(int) saveGraphviz; -(int) enableBack; -(int) codeAV; -(int) autoBackspace; -(int) batchOpenFiles; -(int) defaultUnstruct; -(int) timeFormatHHMMSS; -(int) hclStackSize; -(NSColor *) realColor; -(NSColor *) metaColor; -(NSString *) getAVCode; -(int) getAVBackspace; -(NSString *) getCoderID; -(int) useGV; -(NSString *) dotDir; -(NSString *) gvDir; -(NSArray *) savedState; -(void) saveState: (NSArray *) state withFiles: (NSArray *) fileList; -(NSArray *) savedFileList; @end extern prefBoss *gPrefBoss; gtamsanalyzer.app-0.42/Source/prefBoss.m0000555000175000017500000005151710162465511020561 0ustar brentbrent00000000000000#import "prefBoss.h" NSString *TAPromptKey=@"Do I Prompt"; NSString *TADateStampKey=@"Do I Time-Date Stamp"; NSString *TAMacNLKey=@"Do I Mac NL Stamp"; NSString *TAAutoReloadKey=@"Do I Reload Data Automatically"; NSString *TACodeFromList=@"Do I use the list or the text field"; /* to be implemented */ NSString *TAUseToolTip=@"Do I use the a tooltip in the code column"; NSString *TACountSections=@"Do I tally empty for every section"; NSString *TAUseCoder=@"Do I use a coder ID when coding"; NSString *TACoderID=@"Actual coder identification"; NSString *TAShowCoder=@"Show codes in raw runs identification"; NSString *TASavedState=@"Save the state of the workbench"; NSString *TASavedFileList=@"Saved files for the state"; NSString *TAEOFIsEnd=@"Should an EOF be a {!END}?"; NSString *TAZapUnivAtEOF=@"Should the universal list be zapped (removeAll) at EOF"; NSString *TABackendRepeat=@"Should repeat be evaluated at {!end} or at open tag"; NSString *TAScanInit=@"Should an opening file scan the init file as well as itself for !buttons"; NSString *TANonSimpleRepeat = @"Should isolated repeat values be returned by non-simple searches"; NSString *TAUnichar = @"Should I export using unichar"; NSString *TADetachedSheet = @"should sheets float or be detached"; NSString *TATagColor = @"What color should the tags be"; NSString *TAZoomFactor = @"How many characters to add on each side for a string search"; NSString *TAEscapeBraces = @"Recognize \\ as the escape character"; NSString *TAAutoColor = @"Should the program re-color tags when the file opens"; NSString *TAScanForLN = @"Should the program be looking for line numbers at each line start"; NSString *TACommentForCode = @"Should the program present a comment sheet when user hits code button"; NSString *TACancelAfterAddCode = @"should the program unmark everything after add code"; NSString *TACancelAfterRecode = @"after recoding, should the program remove all the marked"; NSString *TAGuessUpdate = @"At time of addcode and recode should I update all the records by guessing where the tags appear"; NSString *TASaveGraphviz = @"Should graphviz files be saved via nssavepanel or just opened automatically"; NSString *TAEnableBack = @"Should the data browser enable the back button (YES = lots of memory)"; NSString *TAAVCode = @"The actual code that surronds a time constant"; NSString *TAAVBackspace = @"The amount of backspace in seconds"; NSString *TACodeAV = @"Should AV be coded?"; NSString *TAAutoBackspace = @"Should I backspace when I tell AV to start?"; NSString *TARealColor = @"color saved as an NSColor"; NSString *TAMetaColor = @"sets the color of metas on refresh"; NSString *TABatchOpenFiles = @"should operattions like recode and add code open the files rather than make the changes in the background?"; NSString *TADefaultUnstruct=@"should the program assume that new projects/files are unstructured?"; NSString * TATimeFormatHHMMSS=@"should the program format time as hh:mm:ss?"; NSString *TACheckCodeDefinition=@"should code selections check the definitions as well?"; NSString *TAHCLStackSize =@"Hot code list stack size."; NSString *TAGUseGV = @"Should TAG use gv as its image viewer?"; NSString *TAGDotDir = @"What is the location of dot?"; NSString *TAGGVDir = @"What is the location of GV?"; prefBoss *gPrefBoss; @implementation prefBoss -(id) init { gPrefBoss = self = [super initWithWindowNibName: @"preference" owner: self]; return self; } -(int) promptValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAPromptKey]; } -(int) dateTimeValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TADateStampKey]; } -(int) checkCodeDef { return [[NSUserDefaults standardUserDefaults] integerForKey: TACheckCodeDefinition]; } -(int) hclStackSize { return [[NSUserDefaults standardUserDefaults] integerForKey: TAHCLStackSize]; } -(int) macNLValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAMacNLKey]; } -(int) autoReloadValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAAutoReloadKey]; } -(int) codeFromListValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TACodeFromList]; } -(NSColor *) realColor { NSData *dd = [[NSUserDefaults standardUserDefaults] objectForKey: TARealColor]; return (NSColor *)[NSUnarchiver unarchiveObjectWithData:dd]; } -(NSColor *) metaColor { NSData *dd = [[NSUserDefaults standardUserDefaults] objectForKey: TAMetaColor]; return (NSColor *)[NSUnarchiver unarchiveObjectWithData:dd]; } -(int) useToolTipValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAUseToolTip]; } -(int) countSectionsValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TACountSections]; } -(int) scanInitValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAScanInit]; } -(int) useCoderValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAUseCoder]; } -(int) backendRepeatValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TABackendRepeat]; } -(int) nonSimpleRepeatValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TANonSimpleRepeat]; } -(int) escapeBracesValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAEscapeBraces]; } -(int) batchOpenFiles { return [[NSUserDefaults standardUserDefaults] integerForKey: TABatchOpenFiles]; } -(int) unicharValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAUnichar]; } -(int) zoomFactorValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAZoomFactor]; } -(int) saveGraphviz { return [[NSUserDefaults standardUserDefaults] integerForKey: TASaveGraphviz]; } -(int) enableBack { return [[NSUserDefaults standardUserDefaults] integerForKey: TAEnableBack]; } -(NSString *) getAVCode { return [[NSUserDefaults standardUserDefaults] stringForKey: TAAVCode]; } -(int) getAVBackspace { return [[NSUserDefaults standardUserDefaults] integerForKey: TAAVBackspace]; } -(NSString *) getCoderID { return [[NSUserDefaults standardUserDefaults] stringForKey: TACoderID]; } -(int) useGV { return [[NSUserDefaults standardUserDefaults] integerForKey: TAGUseGV]; } -(NSString *) dotDir { return [[NSUserDefaults standardUserDefaults] stringForKey: TAGDotDir]; } -(NSString *) gvDir { return [[NSUserDefaults standardUserDefaults] stringForKey: TAGGVDir]; } -(int) showCoder { return [[NSUserDefaults standardUserDefaults] integerForKey: TAShowCoder]; } -(int) EOFIsEndValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAEOFIsEnd]; } -(int) zapUnivValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAZapUnivAtEOF]; } -(int) detachedSheetValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TADetachedSheet]; } -(int) autoColorValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TAAutoColor]; } -(int) tagColorValue { return [[NSUserDefaults standardUserDefaults] integerForKey: TATagColor]; } -(int) TAScanForLN { return [[NSUserDefaults standardUserDefaults] integerForKey: TAScanForLN]; } -(int) commentForCode { return [[NSUserDefaults standardUserDefaults] integerForKey: TACommentForCode]; } -(int) cancelAfterAddCode { return [[NSUserDefaults standardUserDefaults] integerForKey: TACancelAfterAddCode]; } -(int) cancelAfterRecode { return [[NSUserDefaults standardUserDefaults] integerForKey: TACancelAfterRecode]; } -(int) guessUpdate { return [[NSUserDefaults standardUserDefaults] integerForKey: TAGuessUpdate]; } -(int) autoBackspace { return [[NSUserDefaults standardUserDefaults] integerForKey: TAAutoBackspace]; } -(int) codeAV { return [[NSUserDefaults standardUserDefaults] integerForKey: TACodeAV]; } -(int) defaultUnstruct { return [[NSUserDefaults standardUserDefaults] integerForKey: TADefaultUnstruct]; } -(int) timeFormatHHMMSS { return [[NSUserDefaults standardUserDefaults] integerForKey: TATimeFormatHHMMSS]; } -(void) windowDidLoad { int myTag; [dateStamp setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TADateStampKey]]; [prompt setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAPromptKey]]; [macNLOption setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAMacNLKey]]; [checkCodeDef setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TACheckCodeDefinition]]; [autoReloadOption setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAAutoReloadKey]]; [codeFromListOption setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TACodeFromList]]; [useToolTip setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAUseToolTip]]; [countSections setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TACountSections]]; [useCodeID setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAUseCoder]]; [codeAV setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TACodeAV]]; [autoBackspace setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAAutoBackspace]]; [codeID setStringValue: [[NSUserDefaults standardUserDefaults] stringForKey: TACoderID]]; [AVCode setStringValue: [[NSUserDefaults standardUserDefaults] stringForKey: TAAVCode]]; [AVBackspace setStringValue: [[NSUserDefaults standardUserDefaults] stringForKey: TAAVBackspace]]; [showCoderView setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAShowCoder]]; [EOFIsEndSwitch setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAEOFIsEnd]]; [zapUniv setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAZapUnivAtEOF]]; [escapeBracesOption setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAEscapeBraces]]; [backendRepeat setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TABackendRepeat]]; [scanInit setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAScanInit]]; [zoomFactorView setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAZoomFactor]]; [scanForLNOption setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAScanForLN]]; [enableBack setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAEnableBack]]; [nonSimpleRepeat setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TANonSimpleRepeat]]; [detachedSheetSwitch setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TADetachedSheet]]; [commentForCodeOption setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TACommentForCode]]; [hclStackSize setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAHCLStackSize]]; [autoColorOption setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAAutoColor]]; [batchOpenFiles setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TABatchOpenFiles]]; [cancelAfterAddCode setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TACancelAfterAddCode]]; [cancelAfterRecode setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TACancelAfterRecode]]; [saveGraphviz setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TASaveGraphviz]]; [guessUpdateOption setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAGuessUpdate]]; [timeFormat setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TATimeFormatHHMMSS]]; [defaultUnstructSwitch setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TADefaultUnstruct]]; { NSData *dd; dd = [[NSUserDefaults standardUserDefaults] objectForKey: TARealColor]; [realColorWell setColor:(NSColor *)[NSUnarchiver unarchiveObjectWithData: dd]]; } { NSData *dd; dd = [[NSUserDefaults standardUserDefaults] objectForKey: TAMetaColor]; [metaColorWell setColor:(NSColor *)[NSUnarchiver unarchiveObjectWithData: dd]]; } [charSwitch setAutoenablesItems: YES]; myTag = [[NSUserDefaults standardUserDefaults] integerForKey: TAUnichar]; [dotDir setStringValue: [[NSUserDefaults standardUserDefaults] stringForKey: TAGDotDir]]; [gvDir setStringValue: [[NSUserDefaults standardUserDefaults] stringForKey: TAGGVDir]]; [useGV setIntValue: [[NSUserDefaults standardUserDefaults] integerForKey: TAGUseGV]]; [charSwitch selectItemAtIndex: [charSwitch indexOfItemWithTag: myTag]]; [tagColorMenu selectItemAtIndex: [[NSUserDefaults standardUserDefaults] integerForKey: TATagColor]]; } -(void) windowWillClose:(NSNotification *)aNotification { [[NSUserDefaults standardUserDefaults] setInteger: [zoomFactorView intValue] forKey: TAZoomFactor]; } -(IBAction)tweedleMacNL: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [macNLOption intValue] forKey: TAMacNLKey]; } -(IBAction)tweedleAutoReload: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [autoReloadOption intValue] forKey: TAAutoReloadKey]; } -(IBAction)tweedleAutoColor: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [autoColorOption intValue] forKey: TAAutoColor]; } -(IBAction)tweedleCheckCodeDef: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [checkCodeDef intValue] forKey: TACheckCodeDefinition]; } -(IBAction)tweedleHCLStackSize: (id) sender { int n; n = [hclStackSize intValue]; if(n <= 2) n = 2; [[NSUserDefaults standardUserDefaults] setInteger: n forKey: TAHCLStackSize]; } -(IBAction)tweedleSaveGraphviz: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [saveGraphviz intValue] forKey: TASaveGraphviz]; } -(IBAction)tweedleCommentForCode: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [commentForCodeOption intValue] forKey: TACommentForCode]; } -(IBAction)tweedleTimeFormatHHMMSS: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [timeFormat intValue] forKey: TATimeFormatHHMMSS]; } -(IBAction)tweedleDefaultUnstruct: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [defaultUnstructSwitch intValue] forKey: TADefaultUnstruct]; } -(IBAction)tweedleCodeFromList: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [codeFromListOption intValue] forKey: TACodeFromList]; } -(IBAction)tweedleRealColor: (id) sender { NSData *dd = [NSArchiver archivedDataWithRootObject: [realColorWell color]]; [[NSUserDefaults standardUserDefaults] setObject: dd forKey: TARealColor]; if([self autoColorValue]) [[NSNotificationCenter defaultCenter] postNotificationName: @"rootColorChanged" object: self]; } -(IBAction)tweedleMetaColor: (id) sender { NSData *dd = [NSArchiver archivedDataWithRootObject: [metaColorWell color]]; [[NSUserDefaults standardUserDefaults] setObject: dd forKey: TAMetaColor]; if([self autoColorValue]) [[NSNotificationCenter defaultCenter] postNotificationName: @"rootColorChanged" object: self]; } -(IBAction)tweedleDateStamp: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [dateStamp intValue] forKey: TADateStampKey]; } -(IBAction)tweedleScanInit: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [scanInit intValue] forKey: TAScanInit]; } -(IBAction)tweedleZapUniv: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [zapUniv intValue] forKey: TAZapUnivAtEOF]; } -(IBAction)tweedleScanForLN: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [scanForLNOption intValue] forKey: TAScanForLN]; } -(IBAction)tweedleEnableBack: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [enableBack intValue] forKey: TAEnableBack]; } -(IBAction)tweedleEscapeBraces: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [escapeBracesOption intValue] forKey: TAEscapeBraces]; } -(IBAction)tweedleBatchOpenFiles: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [batchOpenFiles intValue] forKey: TABatchOpenFiles]; } -(IBAction)tweedleBackendRepeat: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [backendRepeat intValue] forKey: TABackendRepeat]; } -(IBAction)tweedleNonSimpleRepeat: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [nonSimpleRepeat intValue] forKey: TANonSimpleRepeat]; } -(IBAction)tweedleGuessUpdate: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [guessUpdateOption intValue] forKey: TAGuessUpdate]; } -(IBAction)tweedlePrompt: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [prompt intValue] forKey: TAPromptKey]; } -(IBAction)tweedleUseToolTip: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [useToolTip intValue] forKey: TAUseToolTip]; } -(IBAction)tweedleCountSections: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [countSections intValue] forKey: TACountSections]; } -(IBAction)tweedleUseCoder: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [useCodeID intValue] forKey: TAUseCoder]; } -(IBAction)tweedleShowCoder: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [showCoderView intValue] forKey: TAShowCoder]; } -(IBAction)tweedleDetachedSheet: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [detachedSheetSwitch intValue] forKey: TADetachedSheet]; } - (void)controlTextDidChange:(NSNotification *) aNotification { [[NSUserDefaults standardUserDefaults] setObject: [codeID stringValue] forKey: TACoderID]; [[NSUserDefaults standardUserDefaults] setInteger: [AVBackspace intValue] forKey: TAAVBackspace]; [[NSUserDefaults standardUserDefaults] setObject: [AVCode stringValue] forKey: TAAVCode]; } -(IBAction)tweedleEOFIsEnd: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [EOFIsEndSwitch intValue] forKey: TAEOFIsEnd]; } -(IBAction)tweedleUnichar: (id) sender { int v; v = [[charSwitch selectedItem] tag]; [[NSUserDefaults standardUserDefaults] setInteger: v forKey: TAUnichar]; } -(IBAction)tweedleTagColor: (id) sender { int v; v = [tagColorMenu indexOfSelectedItem]; [[NSUserDefaults standardUserDefaults] setInteger: v forKey: TATagColor]; } -(IBAction) tweedleCancelAfterRecode: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [cancelAfterRecode intValue] forKey: TACancelAfterRecode]; } -(IBAction) tweedleCancelAfterAddCode: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [cancelAfterAddCode intValue] forKey: TACancelAfterAddCode]; } -(IBAction) tweedleCodeAV: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [codeAV intValue] forKey: TACodeAV]; } -(IBAction) tweedleAutoBackspace: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [autoBackspace intValue] forKey: TAAutoBackspace]; } -(IBAction)tweedleUseGV: (id) sender { [[NSUserDefaults standardUserDefaults] setInteger: [useGV intValue] forKey: TAGUseGV]; } -(IBAction)tweedleGVDir: (id) sender { [[NSUserDefaults standardUserDefaults] setObject: [gvDir stringValue] forKey: TAGGVDir]; } -(IBAction)tweedleDotDir: (id) sender { [[NSUserDefaults standardUserDefaults] setObject: [dotDir stringValue] forKey: TAGDotDir]; } -(NSArray *) savedState { return [[NSUserDefaults standardUserDefaults] objectForKey: TASavedState]; } -(NSArray *) savedFileList { return [[NSUserDefaults standardUserDefaults] objectForKey: TASavedFileList]; } -(void) saveState: (NSArray *) state withFiles: (NSArray *) fileList { [[NSUserDefaults standardUserDefaults] removeObjectForKey: TASavedState]; [[NSUserDefaults standardUserDefaults] setObject: state forKey: TASavedState]; if(fileList) { [[NSUserDefaults standardUserDefaults] setObject: fileList forKey: TASavedFileList]; } [[NSUserDefaults standardUserDefaults] synchronize]; } -(IBAction) niceClose: (id) sender { [panelWindow performClose: sender]; } @end gtamsanalyzer.app-0.42/Source/preference.gorm/0000755000175000017500000000000010162465511021667 5ustar brentbrent00000000000000gtamsanalyzer.app-0.42/Source/preference.gorm/data.classes0000644000175000017500000001430111062075652024161 0ustar brentbrent00000000000000{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "tweedleDateStamp:", "tweedleScanInit:", "tweedlePrompt:", "tweedleMacNL:", "tweedleAutoReload:", "tweedleCodeFromList:", "tweedleUseToolTip:", "tweedleCountSections:", "tweedleUseCoder:", "tweedleShowCoder:", "tweedleEOFIsEnd:", "tweedleZapUniv:", "tweedleEscapeBraces:", "tweedleDefaultUnstruct:", "tweedleBackendRepeat:", "tweedleNonSimpleRepeat:", "tweedleUnichar:", "tweedleDetachedSheet:", "tweedleTagColor:", "tweedleAutoColor:", "tweedleMetaColor:", "tweedleScanForLN:", "tweedleCommentForCode:", "tweedleCancelAfterRecode:", "tweedleCancelAfterAddCode:", "tweedleGuessUpdate:", "tweedleSaveGraphviz:", "tweedleEnableBack:", "tweedleCodeAV:", "tweedleAutoBackspace:", "tweedleRealColor:", "tweedleBatchOpenFiles:", "tweedleTimeFormatHHMMSS:", "tweedleCheckCodeDef:", "tweedleHCLStackSize:", "tweedleDotDir:", "tweedleGVDir:", "tweedleUseGV:" ); Super = NSObject; }; prefBoss = { Actions = ( "tweedleDateStamp:", "tweedleScanInit:", "tweedlePrompt:", "tweedleMacNL:", "tweedleAutoReload:", "tweedleCodeFromList:", "tweedleUseToolTip:", "tweedleCountSections:", "tweedleUseCoder:", "tweedleShowCoder:", "tweedleEOFIsEnd:", "tweedleZapUniv:", "tweedleEscapeBraces:", "tweedleDefaultUnstruct:", "tweedleBackendRepeat:", "tweedleNonSimpleRepeat:", "tweedleUnichar:", "tweedleDetachedSheet:", "tweedleTagColor:", "tweedleAutoColor:", "tweedleMetaColor:", "tweedleScanForLN:", "tweedleCommentForCode:", "tweedleCancelAfterRecode:", "tweedleCancelAfterAddCode:", "tweedleGuessUpdate:", "tweedleSaveGraphviz:", "tweedleEnableBack:", "tweedleCodeAV:", "tweedleAutoBackspace:", "tweedleRealColor:", "tweedleBatchOpenFiles:", "tweedleTimeFormatHHMMSS:", "tweedleCheckCodeDef:", "tweedleHCLStackSize:", "tweedleDotDir:", "tweedleGVDir:", "tweedleUseGV:" ); Outlets = ( dateStamp, panelWindow, prompt, macNLOption, autoReloadOption, codeFromListOption, useToolTip, countSections, useCodeID, codeID, showCoderView, EOFIsEndSwitch, zapUniv, backendRepeat, scanInit, nonSimpleRepeat, charSwitch, detachedSheetSwitch, tagColorMenu, zoomFactorView, escapeBracesOption, autoColorOption, scanForLNOption, commentForCodeOption, cancelAfterRecode, cancelAfterAddCode, guessUpdateOption, saveGraphviz, enableBack, codeAV, AVCode, AVBackspace, autoBackspace, realColorWell, metaColorWell, batchOpenFiles, defaultUnstructSwitch, timeFormat, checkCodeDef, hclStackSize, useGV, dotDir, gvDir ); Super = NSWindowController; }; }gtamsanalyzer.app-0.42/Source/preference.gorm/data.info0000644000175000017500000000027011062075652023457 0ustar brentbrent00000000000000GNUstep archive00002a96:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed Streamgtamsanalyzer.app-0.42/Source/preference.gorm/objects.gorm0000644000175000017500000005031211062075652024212 0ustar brentbrent00000000000000GNUstep archive00002a96:0000001f:0000020d:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&,01NSString&% Button501NSButton1 NSControl1NSView1 NSResponder% A0 C@ B A  B A&01 NSMutableArray1 NSArray&%01 NSButtonCell1 NSActionCell1NSCell0& %  Use coder ID:01NSImage0 1NSMutableString&% common_SwitchOff0 1NSFont%&&&&&&&&%0 &0 &0 0&% common_SwitchOn&&&0& %  GormNSPanel01NSPanel1NSWindow%  C C& % C D@0%  C C  C C&0 &01 NSTabView%  C C  C C&0 &0% ? ? C C@  C C@&0 &0% A0 C@ CJ A  CJ A&0 &%0 0&% Prompt for new code definition &&&&&&&&%0&0& &&&0% A0 C C A  C A&0 &%0 0 &*% *Use time-date stamp in new code definition &&&&&&&&%0!&0"& &&&0#% A0 C@ C A  C A&0$ &%0% 0&&%% %Take the code by double clicking list &&&&&&&&%0'&0(& &&&0)% A0 C C A  C A&0* &%0+ 0,&$% $Code list reveals codes as tool tips &&&&&&&&%0-&0.& &&&0/1 NSTextField% B C B` A  B` A&00 &%011NSTextFieldCell02& &&&&&&&&%031NSColor04&%NSNamedColorSpace05&% System06&% textBackgroundColor074508& %  textColor09% A0 C@ C A  C A&0: &%0; 0<&'% 'Scan init file when opening a data file &&&&&&&&%0=&0>& &&&0?% A0 C@ B A  B A&0@ &%0A0B& %  Color tags:0C% A`&&&&&&&&%0D40E&% System0F&% textBackgroundColor0G4E0H& %  textColor0I1 NSColorWell% B C BT A  BT A&0J &%0K0L& &&&&&&&&0M0N&%NSCalibratedWhiteColorSpace ?0O% A Cm B A  B A&0P &%0Q0R&% Color metatags:C&&&&&&&&%0S40T&% System0U&% textBackgroundColor0V4T0W& %  textColor0X% B Cf BT A  BT A&0Y &%0Z0[& &&&&&&&&0\N ?0]% A0 CQ C A  C A&0^ &%0_ 0`& %  Automatically refresh color tags &&&&&&&&%0a&0b& &&&0c% A0 C< C A  C A&0d &%0e 0f&% Display comment for code button &&&&&&&&%0g&0h& &&&0i% A0 C' C A  C A&0j &%0k 0l&6% 6Check definitions when selecting codes (hot code sets) &&&&&&&&%0m&0n& &&&0o% A C C- A  C- A&0p &%0q0r&% Size of hot code set stack:C&&&&&&&&%0s40t&% System0u&% textBackgroundColor0v4t0w& %  textColor0x% C7 C  B` A  B` A&0y &%0z0{& &&&&&&&&%0|40}&% System0~&% textBackgroundColor04}0& %  textColor0% A B C& A  C& A&0 &%0 0&% Use gv to view dot graphs: &&&&&&&&%0&0& &&&0% A B C A  C A&0 &%00&+% +gv's directory location (e.g.: /usr/bin/gv)C&&&&&&&&%040&% System0&% textBackgroundColor040& %  textColor0% C0 B B A  B A&0 &%00& &&&&&&&&%040&% System0&% textBackgroundColor040& %  textColor0% A B C A  C A&0 &%00&% dot's directory location:C&&&&&&&&%040&% System0&% textBackgroundColor040& %  textColor0% C! B B A  B A&0 &%00& &&&&&&&&%040&% System0&% textBackgroundColor040& %  textColor0 &01 NSTabViewItem0&% item 10&% Coding%00&% item 20& %  Searching0% ? ? C C@  C C@&0 &0% A C@ C A  C A&0 &%0 0&% Detached result sheets &&&&&&&&%0&0& &&&0% A C C A  C A&0 &%0 0&+% +Auto reload after recoding or adding a code &&&&&&&&%0&0& &&&0% A C@ C A  C A&0 &%0± 0ñ&,% ,Report empty searches for each {!endsection} &&&&&&&&%0ı&0ű& &&&0Ʊ% A C C A  C A&0DZ &%0ȱ 0ɱ&% Show coder ID in raw output &&&&&&&&%0ʱ&0˱& &&&0̱% A C@ C A  C A&0ͱ &%0α 0ϱ&% EOF is same as {!end} &&&&&&&&%0б&0ѱ& &&&0ұ% A C C A  C A&0ӱ &%0Ա 0ձ&#% #Evaluate repeat variables at {!end} &&&&&&&&%0ֱ&0ױ& &&&0ر% A C@ C A  C A&0ٱ &%0ڱ 0۱&"% "Universal variables zapped at EOF &&&&&&&&%0ܱ&0ݱ& &&&0ޱ% A C C A  C A&0߱ &%0 0&/% /Include repeat variables in non-simple searches &&&&&&&&%0&0& &&&0% A C] C A  C A&0 &%0 0&% Use \r for results &&&&&&&&%0&0& &&&0% A C1 C A  C A&0 &%00&*% *Number of chars to add for string searchesC&&&&&&&&%040&% System0&% textBackgroundColor040& %  textColor0% C C/ B` A  B` A&0 &%00& &&&&&&&&%040&% System0&% textBackgroundColor040& %  textColor0% A C C A  C A&0 &%0 0&$% $Recognize '\' as an escape character &&&&&&&&%P&P& &&&P% A C C A  C A&P &%P P&% Scan for line numbers &&&&&&&&%P&P& &&&P% A B C A  C A&P &%P P &% Unmark after add code &&&&&&&&%P &P & &&&P% C( B C A  C A&P &%P P&% Unmark after recode &&&&&&&&%P&P& &&&P% A B C A  C A&P &%P P&*% *Open sources when recoding/add coding/etc. &&&&&&&&%P&P& &&&P% A B C A  C A&P &%P P&,% ,Documents treated as unstructured by default &&&&&&&&%P&P& &&&P % A BD C A  C A&P! &%P" P#&)% )Guess at update after recoding/add coding &&&&&&&&%P$&P%& &&&P&% A A C A  C A&P' &%P( P)&% Save graphviz files &&&&&&&&%P*&P+& &&&% %%P,4P-&% SystemP.&% windowBackgroundColorP/&% WindowP0& %  Preferences0 ? A F@ F@%P1P2&%NSApplicationIconP3&% Button69P4&% Button7]P5&% Button8cP6&% Button9iP7&% ButtonP8&% Button20P9&% Button21P:&% Button10P;&% Button22P<& %  TextField/P=&% Button11P>&% Button23P?&% Button12P@&% Button24PA&% Button13PB&% Button25PC&% Button14PD&% Button26 PE&% GSCustomClassMapPF&PG&% Button15PH&% Button27&PI&% Button16PJ&% Button17PK&% Button18PL& %  ColorWell1XPM&% TabViewPN& %  TextField1?PO& %  TextField2OPP& %  TextField3oPQ& %  TextField4xPR& %  TextField5PS& %  TextField6PT& %  ColorWellIPU&%NSOwnerPV&% prefBossPW& %  TextField7PX& %  TextField8PY& %  TextField9PZ&% Button1P[& %  TextField10P\&% Button2#P]&% Button3)P^&% Button4P_ &kkP`1NSNibConnectorPa&%NSOwnerPbMPc7PdZaPe\aPf]aPgaPhaP@aPBaPDaPHaPa^P&% detachedSheetSwitchP^aP&% tweedleDetachedSheet:Pa:P&% autoReloadOptionP:aP&% tweedleAutoReload:P±a=Pñ& %  countSectionsPı=aPű&% tweedleCountSections:PƱa?PDZ& %  showCoderViewPȱ?aPɱ&% tweedleShowCoder:PʱaAP˱&% EOFIsEndSwitchP̱AaPͱ&% tweedleEOFIsEnd:PαaCPϱ& %  backendRepeatPбCaPѱ&% tweedleBackendRepeat:PұaGPӱ&% zapUnivPԱGaPձ&% tweedleZapUniv:PֱaIPױ&% nonSimpleRepeatPرIaPٱ&% tweedleNonSimpleRepeat:PڱaKP۱& %  macNLOptionPܱKaPݱ& %  tweedleMacNL:PޱaSP߱&% zoomFactorViewPa8P&% escapeBracesOptionP8aP&% tweedleEscapeBraces:Pa9P&% scanForLNOptionP9aP&% tweedleScanForLN:Pa;P&% cancelAfterAddCodePa>P&% cancelAfterRecodePa@P&% batchOpenFilesP@aP&% tweedleBatchOpenFiles:PaBP&% defaultUnstructSwitchPBaP&% tweedleDefaultUnstruct:PaDP&% guessUpdateOptionPDaP&% tweedleGuessUpdate:PaHP& %  saveGraphvizPHaP&% tweedleSaveGraphviz:PJPWPXPYP[PaJP&% useGVPJaP& %  tweedleUseGV:PXaP& %  tweedleGVDir:P[aP&% tweedleDotDir:P a[P &% dotDirP aXP &% gvDirP 1 GSMutableSet1 NSMutableSet1NSSet&gtamsanalyzer.app-0.42/Source/prevTag.tif0000555000175000017500000000647610162465511020740 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻唠ޔޔޔޔޔޜᛦꮵ׺֔ޔޔޔޔޙߘߘߘߜᴽ誱ҳ۔ޔޔޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔޔޔޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔތҔޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵ߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾哞ܔޔޔަ䧱䩳媴孶氹絾ꓟےۖޔޫ媳嫵孶殸沺菛׈ͩ갹籺糼跿    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/background.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/prevTag3.tif0000555000175000017500000000647410162465511021021 0ustar brentbrent00000000000000MM* iihh 휧ឦÈ(0AOŰ緦L[܇疢ߡCS9M~ۦ䧯uDQԸRjLg۔ޡ⡫ⴈ!)zi *~ޔޘߝᝩᯇ(3$ώq ){ޔޜᛦ}!*)4ț׺s Copyright (c) 1997-2003 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* This module contains a debugging function for printing out the internal form of a compiled regular expression. It is kept in a separate file so that it can be #included both in the pcretest program, and in the library itself when compiled with the debugging switch. */ static const char *OP_names[] = { OP_NAME_LIST }; /************************************************* * Print single- or multi-byte character * *************************************************/ /* These tables are actually copies of ones in pcre.c. If we compile the library with debugging, they are included twice, but that isn't really a problem - compiling with debugging is pretty rare and these are very small. */ static const int utf8_t3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; static const uschar utf8_t4[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; static int print_char(FILE *f, uschar *ptr, BOOL utf8) { int c = *ptr; if (!utf8 || (c & 0xc0) != 0xc0) { if (isprint(c)) fprintf(f, "%c", c); else fprintf(f, "\\x%02x", c); return 0; } else { int i; int a = utf8_t4[c & 0x3f]; /* Number of additional bytes */ int s = 6*a; c = (c & utf8_t3[a]) << s; for (i = 1; i <= a; i++) { s -= 6; c |= (ptr[i] & 0x3f) << s; } if (c < 128) fprintf(f, "\\x%02x", c); else fprintf(f, "\\x{%x}", c); return a; } } /************************************************* * Print compiled regex * *************************************************/ static void print_internals(pcre *external_re, FILE *f) { real_pcre *re = (real_pcre *)external_re; uschar *codestart = (uschar *)re + sizeof(real_pcre) + re->name_count * re->name_entry_size; uschar *code = codestart; BOOL utf8 = (re->options & PCRE_UTF8) != 0; for(;;) { uschar *ccode; int c; int extra = 0; fprintf(f, "%3d ", code - codestart); if (*code >= OP_BRA) { if (*code - OP_BRA > EXTRACT_BASIC_MAX) fprintf(f, "%3d Bra extra\n", GET(code, 1)); else fprintf(f, "%3d Bra %d\n", GET(code, 1), *code - OP_BRA); code += OP_lengths[OP_BRA]; continue; } switch(*code) { case OP_END: fprintf(f, " %s\n", OP_names[*code]); fprintf(f, "------------------------------------------------------------------\n"); return; case OP_OPT: fprintf(f, " %.2x %s", code[1], OP_names[*code]); break; case OP_CHARS: { int charlength = code[1]; ccode = code + 2; extra = charlength; fprintf(f, "%3d ", charlength); while (charlength > 0) { int extrabytes = print_char(f, ccode, utf8); ccode += 1 + extrabytes; charlength -= 1 + extrabytes; } } break; case OP_KETRMAX: case OP_KETRMIN: case OP_ALT: case OP_KET: case OP_ASSERT: case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: case OP_COND: case OP_REVERSE: fprintf(f, "%3d %s", GET(code, 1), OP_names[*code]); break; case OP_BRANUMBER: printf("%3d %s", GET2(code, 1), OP_names[*code]); break; case OP_CREF: if (GET2(code, 1) == CREF_RECURSE) fprintf(f, " Cond recurse"); else fprintf(f, "%3d %s", GET2(code,1), OP_names[*code]); break; case OP_STAR: case OP_MINSTAR: case OP_PLUS: case OP_MINPLUS: case OP_QUERY: case OP_MINQUERY: case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEQUERY: case OP_TYPEMINQUERY: fprintf(f, " "); if (*code >= OP_TYPESTAR) fprintf(f, "%s", OP_names[code[1]]); else extra = print_char(f, code+1, utf8); fprintf(f, "%s", OP_names[*code]); break; case OP_EXACT: case OP_UPTO: case OP_MINUPTO: fprintf(f, " "); extra = print_char(f, code+3, utf8); fprintf(f, "{"); if (*code != OP_EXACT) fprintf(f, ","); fprintf(f, "%d}", GET2(code,1)); if (*code == OP_MINUPTO) fprintf(f, "?"); break; case OP_TYPEEXACT: case OP_TYPEUPTO: case OP_TYPEMINUPTO: fprintf(f, " %s{", OP_names[code[3]]); if (*code != OP_TYPEEXACT) fprintf(f, "0,"); fprintf(f, "%d}", GET2(code,1)); if (*code == OP_TYPEMINUPTO) fprintf(f, "?"); break; case OP_NOT: if (isprint(c = code[1])) fprintf(f, " [^%c]", c); else fprintf(f, " [^\\x%02x]", c); break; case OP_NOTSTAR: case OP_NOTMINSTAR: case OP_NOTPLUS: case OP_NOTMINPLUS: case OP_NOTQUERY: case OP_NOTMINQUERY: if (isprint(c = code[1])) fprintf(f, " [^%c]", c); else fprintf(f, " [^\\x%02x]", c); fprintf(f, "%s", OP_names[*code]); break; case OP_NOTEXACT: case OP_NOTUPTO: case OP_NOTMINUPTO: if (isprint(c = code[3])) fprintf(f, " [^%c]{", c); else fprintf(f, " [^\\x%02x]{", c); if (*code != OP_NOTEXACT) fprintf(f, ","); fprintf(f, "%d}", GET2(code,1)); if (*code == OP_NOTMINUPTO) fprintf(f, "?"); break; case OP_RECURSE: fprintf(f, "%3d %s", GET(code, 1), OP_names[*code]); break; case OP_REF: fprintf(f, " \\%d", GET2(code,1)); ccode = code + OP_lengths[*code]; goto CLASS_REF_REPEAT; case OP_CALLOUT: fprintf(f, " %s %d", OP_names[*code], code[1]); break; /* OP_XCLASS can only occur in UTF-8 mode. However, there's no harm in having this code always here, and it makes it less messy without all those #ifdefs. */ case OP_CLASS: case OP_NCLASS: case OP_XCLASS: { int i, min, max; BOOL printmap; fprintf(f, " ["); if (*code == OP_XCLASS) { extra = GET(code, 1); ccode = code + LINK_SIZE + 1; printmap = (*ccode & XCL_MAP) != 0; if ((*ccode++ & XCL_NOT) != 0) fprintf(f, "^"); } else { printmap = TRUE; ccode = code + 1; } /* Print a bit map */ if (printmap) { for (i = 0; i < 256; i++) { if ((ccode[i/8] & (1 << (i&7))) != 0) { int j; for (j = i+1; j < 256; j++) if ((ccode[j/8] & (1 << (j&7))) == 0) break; if (i == '-' || i == ']') fprintf(f, "\\"); if (isprint(i)) fprintf(f, "%c", i); else fprintf(f, "\\x%02x", i); if (--j > i) { fprintf(f, "-"); if (j == '-' || j == ']') fprintf(f, "\\"); if (isprint(j)) fprintf(f, "%c", j); else fprintf(f, "\\x%02x", j); } i = j; } } ccode += 32; } /* For an XCLASS there is always some additional data */ if (*code == OP_XCLASS) { int ch; while ((ch = *ccode++) != XCL_END) { ccode += 1 + print_char(f, ccode, TRUE); if (ch == XCL_RANGE) { fprintf(f, "-"); ccode += 1 + print_char(f, ccode, TRUE); } } } /* Indicate a non-UTF8 class which was created by negation */ fprintf(f, "]%s", (*code == OP_NCLASS)? " (neg)" : ""); /* Handle repeats after a class or a back reference */ CLASS_REF_REPEAT: switch(*ccode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: fprintf(f, "%s", OP_names[*ccode]); extra = OP_lengths[*ccode]; break; case OP_CRRANGE: case OP_CRMINRANGE: min = GET2(ccode,1); max = GET2(ccode,3); if (max == 0) fprintf(f, "{%d,}", min); else fprintf(f, "{%d,%d}", min, max); if (*ccode == OP_CRMINRANGE) fprintf(f, "?"); extra = OP_lengths[*ccode]; break; } } break; /* Anything else is just an item with no data*/ default: fprintf(f, " %s", OP_names[*code]); break; } code += OP_lengths[*code] + extra; fprintf(f, "\n"); } } /* End of printint.c */ gtamsanalyzer.app-0.42/Source/reCode.tif0000555000175000017500000000647210162465511020525 0ustar brentbrent00000000000000MM* ǞՔ666 RRR򗗗)))444888SSS;;;%%%񸸸]]] |||666CCC휧ᝨ᰹籺簹瓚=AQ>ARµ<<=,,,???444疢ߖߪ垩ᔠv%'5'*6䫵𘞺445888eee皥ڈxr|\c((dj坣999///:::oooz+.@*-? ,&  ($&3$&3.1?օ777}}}CCC唠x+.@*-? ,&  (#&3#&3+/?׮ω'''$$$'''֏zxr|\c((_fxxᥫvz556$$$KKK۔ޔޔޔu!%2!%2t~ޗߞᶾ鋐()0aaalll 444㔠ޔޔޔޔy(+=(+=uݙ࣭㶿鋐"#)EEE'''444䔠ޔތҔޔޏtuטߞᡫ⵽誱ot $///......TTT痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱쪰hku../888TTTddd瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳{::;铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵尶KN\ 򆆆kkkߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶曡,.6++/򚚚???FFFꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決瘞+-5238::::::풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾蓚+-5-.3444???哞ܔޔޔަ䧱䩳媴孶氹絾ꚡ68B&',...GGGgggnnnꓟےۖޔޫ媳嫵孶殸沺坣kn...GGG***菛׈ͩ갹籺糼跿簶טhhhMMM@@@    4  @  * 2(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/reCode.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/reCode2.tif0000555000175000017500000000650010162465511020577 0ustar brentbrent00000000000000MM* ǞՔ666 RRR򗗗)))444888SSS;;;%%%񸸸]]] |||666CCC횥ߖڞܗהؖڗۖڗۥ߬ᶽ<<=,,,???444搛׌ьюӍҌььььььѨޗ445888eee᎘ҌььҌьѐՋ΍Җ999///:::ooo߅ōҌэҏԍҏԑ֌ўԅ777}}}CCC䐛׋ώҌՑҍҌюӌўԮω'''$$$'''ӌѐььՑՐԓԟvz556$$$KKK؍ьььӗۮ勐()0aaalll 444㔠ޒэҋϒ֕ٔآ⶿鋐"#)EEE'''444䔠ܒێ՜ߔ؍⵽誱ot $///......TTTޔޔޔݑ؍Ҏا쪰hku../888TTTdddݔޔޑՑՑՍҌё{::;尶KN\ 򆆆kkkߔޔޓ܏ՏԎҎӍҍҝݪ孶曡,.6++/򚚚???FFFꕡޔޔޒܚݖّՎҏӢ୶決瘞+-5238::::::풞ڔޔޔޤ㢬៩ߘڌѢ߰絾蓚+-5-.3444???哞ܔޔޔަ䧱䩳娲䣬߮浾ꚡ68B&',...GGGgggnnnꓟےۖޔޫ媳嫵孶殸沺坣kn...GGG***菛׈ͩ갹籺糼跿簶טhhhMMM@@@    :  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/templateCode.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/reColor.tif0000555000175000017500000000647410162465511020733 0ustar brentbrent00000000000000MM* [H5!zgSA-s`L:'lYF3 휧ᝨ᰹籺簹篸殸xeR?,疢ߖߪ垩ᔠޔަq^K7$矪᥯㔠tt}jᖡޔޔhh{|唠ޔޔޔ\\oo֔ޔ<<OPccvw誱ҳ۔10DCWWkj}~ᶾ骰ѻ㔠ޔ$%77KK]^qq࣭㶿骰Ѽ䔠++??RReeyxߞᡫ⵽谷ح痢  23FFYYllᡫ⢭⧱瑝&'9:ML⡫⡬⤮㪳铞.-@A⡬⣮㧱䫵!!54⤮㦱䪴孶춽ꕡ()㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾哞ܔޔޔަ䧱䩳媴孶氹絾ꓟےۖޔޫ媳嫵孶殸沺菛׈ͩ갹籺糼跿    5  @  , 4(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/reColor.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/refresh.tif0000555000175000017500000000642210162465511020755 0ustar brentbrent00000000000000MM* ᝨ簹篸殸氹簹絾ߖߪᔠ矪ޔ⡫⡬ᖡުޔޔޘߝᝩᝩᝩޔުޔޔޜᛦꮵ׺֔ުޔޔޙߘߘߘߜᴽ誱ҳ۔ުޔޗߞᶾ骰ѻޔުޔݐݑݙޔުޔޔޏݐݔޘߞᡫ⵽谷حߒ۪ޔޔޖߗߛᡫ⢭⧱ړݪޔޖߝ⡬⤮㪳ܔުޔޘ⡫ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡުޔ㣮䪳풞ڪޔ㧱哞ܪޔަ䧱䩳媴孶氹絾ے۪ޫ媳嫵孶殸沺׈ͪߗߗߗߗߗߗߗߗߗߗߗߗߗߗ      @   (refresh.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/RegexTest.m0000555000175000017500000000644710162465511020712 0ustar brentbrent00000000000000// RegexTest.m // // Copyright (c) 2002 Aram Greenman. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. // 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import int main(int argc, const char *argv[]) { NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init]; NSString *pat, *str, *sub; AGRegex *re; // Simple find pattern pat = @"(paran|andr)oid"; str = @"paranoid android"; re = [AGRegex regexWithPattern:pat]; NSLog(@"Found \"%@\" in \"%@\": %@", pat, str, [re findInString:str]); // Find pattern with unmatched subpatterns pat = @"(?:(paran)|(andr))oid"; re = [AGRegex regexWithPattern:pat]; NSLog(@"Found \"%@\" in \"%@\": %@", pat, str, [re findInString:str]); // Find all non-overlapping occurrences of pattern NSLog(@"Found all \"%@\" in \"%@\": %@", pat, str, [re findAllInString:str]); // Simple replace pattern pat = @"remote"; str = @"remote control"; sub = @"complete"; re = [AGRegex regexWithPattern:pat]; NSLog(@"Replaced \"%@\" with \"%@\" in \"%@\": %@", pat, sub, str, [re replaceWithString:sub inString:str]); // Replace pattern with captured subpattern in replacement string pat = @"[usr]"; str = @"Back in the ussr"; sub = @"\\u$&."; re = [AGRegex regexWithPattern:pat]; NSLog(@"Replaced \"%@\" with \"%@\" in \"%@\": %@", pat, sub, str, [re replaceWithString:sub inString:str]); // Replace pattern with named subpatterns in replacement string pat = @"(?P\\w+) is a (?P\\w+)"; str = @"Judy is a punk"; sub = @"Jackie is a $what, $who is a runt"; re = [AGRegex regexWithPattern:pat]; NSLog(@"Replaced \"%@\" with \"%@\" in \"%@\": %@", pat, sub, str, [re replaceWithString:sub inString:str]); // Simple split string pat = @"ea?"; str = @"Repeater"; re = [AGRegex regexWithPattern:pat]; NSLog(@"Split \"%@\" using \"%@\": %@", str, pat, [re splitString:str]); // Split string with captured subpattern pat = @"e(a)?"; re = [AGRegex regexWithPattern:pat]; NSLog(@"Split \"%@\" using \"%@\": %@", str, pat, [re splitString:str]); [p release]; return 0; }gtamsanalyzer.app-0.42/Source/removeFrom.tif0000555000175000017500000000642610162465511021444 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ+++      @   (removeFrom.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/result tiny icon.tif0000555000175000017500000000255010162465511022510 0ustar brentbrent00000000000000MM*WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWT|WWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWW TB@X`(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/proj icons/result tiny icon.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/result.png0000644000175000017500000004732010162465511020640 0ustar brentbrent00000000000000PNG  IHDR-B^NIDATx?|ֹ02PNV(SSTgj3ٞn<]k3bOIS)tQt3Yi4U 0MA/J /,t>|/^bJuCuez>Tnb݃ޛݝoڧ{M[dPb%avOeK ̯gPཬeKVt֜?<7rPBڧݥbQ\iŧVեe;Wo11|U^~{vZʿ\lq[̯\o Ǽ&K[츮^&XmRw[?&{-qJzIy}1|ۃ^?f X\v^zⲃvՒ&b6|Pu0DUGU\k]#*#|jW'֝>Tؙ._7wݝ¹xfB'c7w{;l}vwU0;A]}l{q@*eOkuaY(b B>UaTDK'2u[ i{1~Ec*,WUe^>ۧb\z%~,߾Z _\nx]Me5snR_撽⍩oG}'Ezs_Bg[gvge3nvx[A(^"_z9I^.w;vrC} T+J2+OewoEG%xMJ:ZxP}/.^=T*4xf}OoS\q?}{?[Oy=SUk"䓊]| YKozbgS;n:|2RZ[]VU-wבڦn|ZL\T_ܯOڣڡO^ݎ돲xo׺-vϩUF|sq{Y"Y\zK⥵~㟳v>-UܮRU$ZWӕgݳ Yg+7׻!lo~]c4xeq;MZg90ʩ@5=XNjXW kTܪiUB=R\խS_59uU-?6_4ֺ85Ihڧ{}p1>܉t$-2P$/UU]XkyUh]SN0*5 յB",T'U*kʝ-]=p`͎߁b%u}x;]F튵߭O} \_Gw-nr'v+(6:]cR}!;:}aV48\]5A Ve"9)m]9nuOb+dPnOcU#8bY!Ncb#+O'#GFFG:֕YdOcR-VySݞK*mRѼTO]qllu5P}Jl*_*/[LEZizF19N`=뼺3XuLUKLtj5v3H~_uWnoYųI~DYbPxXwq9H/eG/bϨ3\]|9n] SR2oڍ2֤.U{bbtk_4ƺrMrcqeb]Mn5/u{L<>:)6_.'=2ue6F{g[Ϳr|g`}2|"ќLTfФ :4F}gT?`TWpmb^uwYu窼|t-*$5]E!ÉGyb|=2|?XCd*LUOr ppi.~oO﮼t1 O+R[^`Uk=o<\^~oN$b*+/W^Ӡ":[Kiiӛ=X&7rki~lǣ_SiZ~ϯq{_XQø;Œ:C`VcOշzC^uԟG[r{k,U23*]yݻwﲿ7ˌh]y??eCU2 㷮4?ž^W}!>[Xu06]^[9Տ64}E:MLKXո\h^ j4{NU&q$5dhK|HŦS7Vy2⧋Ҙ:qZyYL3ʭ+ucE%o}h+/?]rtHդޱ~"!Ý٪G˔Ɇש:^O>5@U}Rw3(v:4[RtݯmQKu9S6t+b4}f-gdiiKi r̫Z+Tdqcaaa0;:OOMfVJb;4o4.@L Prn{հ_\׮R@&SU6߻N1o?)ѳ7xy *]74ּͤhrZR1'U#af+2Wak*pRբ̬t|{KbS׹lǺgҒr3cZK${5{MWdmru3X{.QiO!MxO;ad]`I9T| ucNFg˯?s~W>o|zLa`kt:X[UXŪ\(;UW'jTI;=ÿ0^H>VU}k5u ,AV'8.᭭1oubqoֹ+0 !owN'YL6g`|Pnş. c]vo=J6U-=׋|њaqKؠ4 4w<T4NjoNHbs= =a,:WsbqX|\=hz-DexF]TupT=b|_>vu$ߞb77QU{[7BrO!öj~.N8WU}b4wgt )wKݠ~BUcO c-WNkênq~õsWe q>9fcP擥UuhXzspPN6n*n9 TOQW/Bc˗xo_>]6|z@9-P[\3[\R?1~>gU? .=߶r #Y?GM7~{n_,rUwu;|d#*3\*G+wxp0\І{^?U}߷v$¤QIa/M<\,bVU>A65~r/RzF"э/VճIRW'Ȏk91( {gt'|ǰkWUU9\m :zV}G'n2 ߎˏku?pp6>| z+8 ш<.ϱ6[}խŁ(׫DѪvx&m5̰u%^FZW*jJ82Ս g9E 7+W;Suu]@ԟdg5m|Bkw .r}U❌XuUj\+?6;,:6ϷcIA{pׯ]|K1~Jcڊm5ov6;Qٚ#oW.[lc6T-_OU G1hSLlzN/^?TՊ:j;d;VϫpW'bE3|UZ?RMZbݼM ]|}R= tQU3,~ `efoֺRPWD+g쬭+ mQ?_JQ{j3umE bԬOufĶoYAcKbsr_OpNX5,~$ţ|Klް؉0?(?_thPU Op<\ԗӕb[~0gĦ چaթNsW{؊2 U}83`"LPL:;j2G_6iRg9jo>cu2U^_uM-o=AtnԌ1O}XUݎ3֤ 2D[zbiɣb ]k6W VKH ?|hf$$E(~8T`Vwks"蹸<~p(Lp))OԗQO\,^ٖ.GO=PmM.}n&g^gbn5SnԴ56;'U9n:5|~rDTBM;W1u] 쫷sx4̨ O/4hW9#7to+Աq`gtE=3mY|:X}R|7{) ?~8=nopxK/o+ R^3XݤUSqQ8 LVV~IZ,«7_̖9p?; ' /3|O ?21Nd;;kVȖq/dsEgĵux?kjrg=#4RI>K3{@6jQ#O}趗|wέ;]+'+Q'OZW'xo3B5"'I5cs׋RunLZFMzXW ^[|HwS+6nj?G?:SOkNb|_qGLͯgKiʊ,[kIV|lUm-!֓,v{_ip ?&u9^WoZY>[~]թ)׼$J| fA}Q_uf) ݔNZ&'OO4:n=~&n7k\7 >t4|QlΥueǮxq:iDU4]yܨ'<;'dPf|åbtQ9~Gt.2'[!Krgm2'͗Gf>7ܱ\s b;I%K 2*1Sˣ_՛۶]%zUSZzHqJuLݓ&&%>ūSlUeAlvgcNuL^\W3.WK՗fm,=N!կ9zuV]v٪ǽԥU7;mste1q ~`g(m]ʡ[wvwvtBB ߫BXz,6>_ -z{oz{!0dީ V[XXX(mݻwO-, >]MQsV}J'[Ow[Gk_nG!,^Ykm^ڸ,Qs0> tg!"DeRxdIH#LO)ʹhǫ/Cd?חBZ_/iq\]+ #ݻwC!8yt(Vv@Uh6;}4qh-uBu7!\Rjyp'_gӖG\?p?lwѾuXSe^o^Rq=m,h+ۢ-goZqR\[ll9\?z9 KG>t̃ m]rzݓ\aiky+R^v/~|c߷?q/8и[28O??le_? 9~y=[yZf^u߁~^t-\ e"Zm-un!.'*;D>Y>\?_ڋ7ZV[+{KVp뷯./=E{}eW{W{G뽽ڭI(غ%*NT tfwC8}d=Z_^iI8ɖ~2|~ߋo!1#KNz^]zxq>QO;!???{lA}ؾwǯlrŏ{~vv vpdVol;c((/~<_osvkhPre;lGz/'zNG{>˶h[[˝V;l !vKlF1墏ōōI&sar2((y˝V;z݇/bKNmV[Ïm# ]x?؃]Okg;Ur]{W[Vd{=.ˏnqYG~|;eoWy~g7QTe;ikBoKE[z{!vwNB8zOB?rGerSDWwݾ}ogϮ"u=o Ma޺~F3jĪB{ufJF~ޒjksS}^hƱh7w>_IHg瓭N՛<2e<}hd߾:Z;z~p=Փ:~e~4G.K#iĹ+$_B;Yo{Y;wWsz?ϻ޴s'>x~;ʃ>?>+Oj/;'zOǣ"E{b>:Qre9ڃ~x"}Z?\d?T{ol='Vk{dH+IBfd K'W%*ٲ پ7?egE!HT_˃=^|v^d+~gX'1fX̯^xf$:Z凣矽OLmA/kʢPAOZN<:ytpzpzpzj}/۱&ўD;"^t1hyuwwB~nKKyt292! 0MhV +S¯YNZ+tȆ+eـ߹C mX/~|lֵ[KatH]|}̯j$mP+YjeKӭFϖ;::h/'-M굷Svl,ў=a<_?:ytAg+!\uBkcu~I(ZWv;~\5sJ>UxN|yכ~矽,B%}OùoM3﹘/n~+?gm,UE,%Leuu0}+B pu{V+ VVa68$5ic~UdD;~n{̢}˿n=)Zˏ/?]vE?V2dCnQ5| _ovóOEޜ\`ɣ?l-?_ɢ}vkcq^o߾:\uhhOK'̓o~u*v6кf?ӌ?gsgC9Chm(4{Du0(_BXvoEX:S.9Ooo~|p~{wFGo>~q|F܏>ڃeBX_o09xp=ܿOX~vQ6j%n_iDFۭnjpζhYH(>.Ţ/FeNN;iZ{ɔ{?cBv =ph_óifz5"?/qyGoXXX~}%hW&|"ި[gJwno+hԹze^ZzbsHT&wWaBx6(D} N_2O?ٔ޼88ڋ^w.?UJ?L{+ܪړg{읧{W.ȟ4GG$*YDOeV<ڙͧO7n߾}j*Ӎv^}ٞO=uC8zB+V{W[v弍3J(LGmRDi+jkћp;[?u|^xll> t?/v-"Z;Z[~|+o[O!\{y.}e ~C⣝mE[^ǯOO{OB{ӥ[{󓴤ppo}.+xBnh^/L! A2Y9oc9Z;y;\?wH]"Hf>=k!ZUܺ"E;rf?-.Nwϱh_ ,w;˝ǝǝǝGOi^7y^vVjk4^^{yZp?hµWpܗ?|xiuG?olڿZ0r0Kehx_t)iF>^lf?}:֦rG燇wW:nG":u{^+pyn]zn{{jn&^Z_,uZ E]۾rmlz[a7piǏ~)'-WR:V\D+Gk_d(. ]Y_,uNyzp+VUd[n|U/i[I,6q,|\gNw?/N A?*9ϭ+"^mtV:˝V; ~_Djro/a}1?Ff+ӕn;?r 39_Gk!\{y^hm㗟_IuӉH3ڭvv V+0WZv\md_VW![MiN2GkGk\b{j !?7yb0y̛bh|ğ;ϭ+"k,=^|>]ۿY]\]l-aښZq{ٶ$^n//W '/=kUk/O_cT.C&I!ڽ^ozNK(6vt߄o>֎Nޏ˪tk/[),QBPi;;ZWDf|tw_}-0;;\6c΃;޻{ @g0ư&d W5]fܛYr`HWh$i=2qiFkgIHWCb7T/3E5T-5o+*ͷ_̳ R~yw~Kde/֚qh?[_+{vSVcJ*]_B,FV0nٛ:] IMɒU5te~{_8Lr} sN+v1zU/&O0(@s3IWt.Vq,sN\[?9UҼlC&/jb{ݻw۹s~ʫz8/擛O9D]pRTx ű߾Pk:khΧ_DI4I\XrʣXkv-h37:[_>vp/gvL./_/<|yͷ+7n$84 gے$L ䷼~LkӮF@KWΦ lK6^1OO^͏x)j B\"Y촢qd-&MR%|BӺVN김tevH&wbK6!}_4]~=MZ 5_XYoϸdm/&Ff2؞9KguڸuW+43-<epEV 0ȜYYǶ'-Wy>4.+5~XrZb"Y.=&v{f5a֖[$.6YǶI$%vj: v Ʈ42L*|/I7Lr>ykb>ϞmL&[vZmn,Ziz.P&'2&3c;vڭv^s;D }$+kQY,u:ܺs'러r[oݸu֍[7o+&u3Z5'kW`rƖQZT[ƛ7ovE IW[6>KQ_Ʈ0-皮l>|LEeQ6t%f/yhO)((~}6y~cDeeeee뻯ο3( ( ( ( 9MWo߾_˲5Qy@iǾg룱tqkkn[OM Ϳi͗p%lfye{6LrvkRJJ늋2G+lEE#;H%c_LK9Qw%ɾ(/do [5fymW&Y=5_sRt]3Q/(t>oC}uOcwSBly.c8~n%EIٕ.g]g0V3m#\泄UڃEҤؼ;b|&ufQҘl`f.:7)v+w>l_ɚEjqpy.5O3+4rc"eAdCh]Q9g6=zB y'Wg7|rI+)hlllll $J\i_R.2Wu?*3I{>5sR&YTG|8^ɦޙd61mFt”Z;veꑮe\ʣh.uY%[[[v+J(]Y$4e#uN Qf/R2˥Iu>[J9@e?:ծO_W.!tLXYz\׼VLu)Kb"ciI}dwL4pr>C%V6bjX鮿y+LeF\.]~iE>vX"d\޲Q_emEs*l%(3-3ӏ)55t>O<57=۷['bW.mϖ#ߤ~yc]n磄wwyDn! *wWH?bW̌mI$43i)Ϯ6z죫dܳXrZe&2S?&yTɵԇLљ$R]2;yk;ٕXnRK3^$&Mʏ&pyLe&F|{QKQff)1kIjׄB܇=u.Tf.oYss4yb}pʌ|}]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]gτ۾}o^R.|D|OI+MQb.uKRgWYr; y\r>)J8YJܺsέ;러[o]u֍[7nܿS7 +=>2xV 0kYJKWV_NN*#3  |w' 0kYG쟬E%hm}fWO u%l0}d]NNN+|Jz}0ܽw{24F%e1*;`]HQ }&]˧.~X) $R>ܺu-@م+ Y8d$&CDIWDIWDIWDIWDIWDIWDIWDIWD}Go;wH}Н;l۾}7y.+@+@+@+@+@?6ux%$2IENDB`gtamsanalyzer.app-0.42/Source/Save.tif0000555000175000017500000000647010162465511020220 0ustar brentbrent00000000000000MM* -------------------------------UUUUUUUUUUUUUUUUUUUUUUU--ᛧUݶ鱹絾U--U෾U--UⰹνU--࡬U㫴岺粺粺籸䵽U--॰U㧲䲺粺U--॰U㦱粺粺U--㥰U㥰㲺粺粺粺粺U--यU㥰㲺粺粺粺粺系綾U--࡬UUUUUUUUUUUUUUUUUUUUUUU--ࠬ⥰㥰㥰㮷沺粺粺粺--ᥰ㥰㥰㯸沺籺筶欵--॰㥰㥰㱹粺粺磮㧱䯸--य㥰㦱㲺粺粺禱----------------ᡭ⯸沺粺粺窳----ࢭⰸ沺粺籹筶----঱䫴尹簹篸氹-泼------ળ嫵孶殸沺-毸-----᧲䰹籺糼跿-鰹---------------------------------------------    1  @  ( 0(/Users/matthew/Documents/tams documents/Save.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/searchListMgr.h0000555000175000017500000000072310162465511021531 0ustar brentbrent00000000000000/* searchListMgr */ #import #import @interface searchListMgr : NSObject { IBOutlet id myProj; IBOutlet id mySource; } - (int)numberOfRowsInTableView:(NSTableView *)aTableView; - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; @end gtamsanalyzer.app-0.42/Source/searchListMgr.m0000555000175000017500000000077010162465511021540 0ustar brentbrent00000000000000#import "searchListMgr.h" #import "myProject.h" @implementation searchListMgr - (int)numberOfRowsInTableView:(NSTableView *)aTableView { return [[myProj searchList] count]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { return [[[myProj searchList] objectAtIndex: rowIndex] name]; } - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { return NO; } @end gtamsanalyzer.app-0.42/Source/sel2codeset.tif0000555000175000017500000000650010162465511021530 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪7777777777777777Ѫᖡު7777777777777777Ѫ唠ޔު7777777777777777Ѫ֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪ7777777777777777Ѫ铞ܔު7777777777777777Ѫߔު7777777777777777Ѫꕡު풞ڪ7777777777777777Ѫ哞ܪ7777777777777777Ѫꓟے۪7777777777777777Ѫ菛׈ͪ    9  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/selCodeSet3.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/selCodeSet.tif0000555000175000017500000000647610162465511021362 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪. . . . . . . . . . . . . . . . Ѫᖡު. . . . . . . . . . . . . . . . Ѫ唠ޔު. . . . . . . . . . . . . . . . Ѫ֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪ. . . . . . . . . . . . . . . . Ѫ铞ܔު. . . . . . . . . . . . . . . . Ѫߔު. . . . . . . . . . . . . . . . Ѫꕡު풞ڪ. . . . . . . . . . . . . . . . Ѫ哞ܪ. . . . . . . . . . . . . . . . Ѫꓟے۪. . . . . . . . . . . . . . . . Ѫ菛׈ͪ    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/selCodeSet.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/selCodeSet2.tif0000555000175000017500000000650010162465511021430 0ustar brentbrent00000000000000MM*  [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [휧ᝨ簹篸殸氹簹 [ [ [ [ [疢ߖߪ [ [ [矪77777777 [7777777Ѫᖡު7777777777777777Ѫ唠ޔު7777777777777777Ѫ֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪ7777777777777777Ѫ铞ܔު7777777777777777Ѫߔު7777777777777777Ѫꕡު풞ڪ7777777777777777Ѫ哞ܪ7777777777777777Ѫꓟے۪7777777777777777Ѫ菛׈ͪ    9  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/selCodeSet2.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/selectAll.tif0000555000175000017500000000647610162465511021240 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻唠ޔޔޔޔޔޜᛦꮵ׺֔ޔޔޔޔޙߘߘߘߜᴽ誱ҳ۔ޔޔޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔޔޔޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔތҔޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۔ޔޔޔޖߗߛᡫ⢭⧱瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵ߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾哞ܔޔޔަ䧱䩳媴孶氹絾ꓟےۖޔޫ媳嫵孶殸沺菛׈ͩ갹籺糼跿    7  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/selectAll.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/selectAll2.tif0000555000175000017500000000647610162465511021322 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪᔠޔޜ঱䦱䧱䫵矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ުޔޔޙߘߘߘߜᴽ誱ҳ۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪ޔޔޖߗߛᡫ⢭⧱瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡުޔޠ⣭㣮㤮㦱䪳孶決풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪޔަ䧱䩳媴孶氹絾ꓟے۪ޫ媳嫵孶殸沺菛׈ͪ갹籺糼跿    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/selectAll2.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/selectAll3.tif0000555000175000017500000000647610162465511021323 0ustar brentbrent00000000000000MM* -; ;%@.&k!휧ᝨ簹篸殸氹簹絾&4疢ߖߪae矪ޔޔޔޡ⡫⡬⢭⦰1ᖡުޔޔޘߝᝩᝩᝩᦰ촻>3唠ޔުޔޔޜᛦꮵ׺&+֔ު.@۔ުޔޔޔޔޓޓޗߞᶾ骰ѻA㔠ޔުޔޔސݏݐݑݙ࣭㶿骰ѼS?䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷حWA*{痢ߒ۪&@˥瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳D *铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵>&ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽'5ꕡު&7풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽p&ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ=8菛׈ͪJG=NCky@BE)k    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/selectAll3.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/selectReverse.tif0000555000175000017500000000650210162465511022131 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ    ;  @  2 :(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/selectReverse.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/selectSome.tif0000555000175000017500000000647610162465511021433 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪p{瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/selectSome.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/selOtherTag.tif0000555000175000017500000000650010162465511021535 0ustar brentbrent00000000000000MM*  휧 籺簹篸殸 絾 媴垩ᔠޔޜ ᫵彻 㔠ޔޔޔ ⡬⢭⦰ ޔޔޔޘ ᝩᝩᦰ촻唠 ޔޔޔޜ ꮵ׺֔ ޔޜ ߘҳ۔ޔޔޔޔޔޔޓ骰ѻ㔠ޔޔޔޔޔސݏݐѼ䔠ޔތҔޔޔޏݐݔ痢ߒ۔ޔޔޔޖߗߛᡫ⢭瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵ߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾 哞ܔޔޔަ䧱䩳媴孶氹絾 ꓟےۖޔޫ媳嫵孶殸沺 菛׈ͩ갹籺糼跿     9  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/twoTagBasic.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/setMacroWatcher.h0000555000175000017500000000256510162465511022063 0ustar brentbrent00000000000000/* setMacroWatcher */ #import #import @interface setMacroWatcher : NSObject { IBOutlet id fpOption; IBOutlet id macroMenu; IBOutlet id macroView; IBOutlet id nameView; IBOutlet id regexOption; IBOutlet id columnMenu; IBOutlet id selectModeMenu; IBOutlet id selectStringView; IBOutlet id selectTypeMenu; IBOutlet id setObjectMenu; IBOutlet id localAutosetMenu; IBOutlet id setOpMenu; IBOutlet id startMenu; IBOutlet id globalScope; IBOutlet id sortSwitch; IBOutlet id codeSetMenu; IBOutlet id codeSetSelMenu; IBOutlet id codeSetExact; IBOutlet id myOverLord; IBOutlet id macroSheet; NSMutableDictionary *currMacro; } /* initialization routines */ -(IBAction) zeroEditor: (id) sender; //-(void) setEditorFor: (NSString *) who; -(IBAction) addAutosetStep: (id) sender; -(IBAction) addAutoHistory: (id) sender; - (IBAction)addSelectStep:(id)sender; - (IBAction)addSetStep:(id)sender; -(IBAction) addCodeSetStep: (id) sender; - (IBAction)cancelMacro:(id)sender; - (IBAction)deleteAllSteps:(id)sender; - (IBAction)deleteStep:(id)sender; - (IBAction) deleteMacro: (id) sender; - (IBAction)loadMacro:(id)sender; - (IBAction)moveDown:(id)sender; - (IBAction)moveUp:(id)sender; - (IBAction)saveMacro:(id)sender; - (IBAction)runMacro:(id)sender; -(void) runMacroEditor; @end gtamsanalyzer.app-0.42/Source/setMacroWatcher.m0000555000175000017500000004135410162465511022067 0ustar brentbrent00000000000000#import "myResults.h" #import "prefBoss.h" #import "setMacroWatcher.h" #import "utils.h" @implementation setMacroWatcher -(id) init { currMacro = nil; return self; } -(IBAction) addAutoHistory: (id) sender { NSMutableArray *pr; if(!currMacro) currMacro = [[NSMutableDictionary alloc] init]; if((pr = [currMacro objectForKey: @"program"]) == nil) { pr = [[NSMutableArray alloc] init]; [currMacro setObject: pr forKey: @"program"]; } [pr addObjectsFromArray: [myOverLord autoHistory]]; if([startMenu indexOfItemWithTitle: [myOverLord autoHistoryStart]] >= 0) [startMenu selectItemWithTitle: [myOverLord autoHistoryStart]]; [macroView reloadData]; } - (IBAction) addCodeSetStep: (id)sender { BOOL ex; NSMutableDictionary *aa; NSMutableArray *pr; if(!currMacro) currMacro = [[NSMutableDictionary alloc] init]; if((pr = [currMacro objectForKey: @"program"]) == nil) { pr = [[NSMutableArray alloc] init]; [currMacro setObject: pr forKey: @"program"]; } if([codeSetExact state] == NSOnState) ex = YES; else ex = NO; aa = [[NSMutableDictionary alloc] init]; [aa setObject: @"sel" forKey: @"stepType"]; [aa setObject: [NSNumber numberWithInt: SELECTCODESET] forKey: @"mode"]; [aa setObject: [NSNumber numberWithInt: [[codeSetSelMenu selectedItem] tag]] forKey: @"type"]; [aa setObject: [[[codeSetMenu titleOfSelectedItem] copy] autorelease] forKey: @"name"]; [aa setObject: [NSNumber numberWithBool: ex] forKey: @"exact"]; [pr addObject: [aa autorelease]]; [macroView reloadData]; } - (IBAction)addSelectStep:(id)sender { NSMutableDictionary *aa; NSMutableArray *pr; if(!currMacro) currMacro = [[NSMutableDictionary alloc] init]; if((pr = [currMacro objectForKey: @"program"]) == nil) { pr = [[NSMutableArray alloc] init]; [currMacro setObject: pr forKey: @"program"]; } aa = [[NSMutableDictionary alloc] init]; [aa setObject: @"sel" forKey: @"stepType"]; [aa setObject: [NSNumber numberWithInt: [[selectModeMenu selectedItem] tag]] forKey: @"mode"]; [aa setObject: [NSNumber numberWithInt: [[selectTypeMenu selectedItem] tag]] forKey: @"type"]; [aa setObject: [[[selectStringView stringValue] copy] autorelease] forKey: @"searchValue"]; [aa setObject: [[[columnMenu titleOfSelectedItem] copy] autorelease] forKey: @"col"]; [aa setObject: [NSNumber numberWithInt: [fpOption intValue]] forKey: @"float"]; [aa setObject: [NSNumber numberWithInt: [regexOption intValue]] forKey: @"regex"]; [pr addObject: [aa autorelease]]; [macroView reloadData]; } -(IBAction) addAutosetStep: (id) sender { NSMutableDictionary *aa; NSMutableArray *pr; if([localAutosetMenu numberOfItems] == 0) { NSWARNING(@"No defined sets."); return; } if(!currMacro) currMacro = [[NSMutableDictionary alloc] init]; if((pr = [currMacro objectForKey: @"program"]) == nil) { pr = [[NSMutableArray alloc] init]; [currMacro setObject: pr forKey: @"program"]; } aa = [[NSMutableDictionary alloc] init]; [aa setObject: @"autoset" forKey: @"stepType"]; [aa setObject: [[[localAutosetMenu titleOfSelectedItem] copy] autorelease] forKey: @"name"]; [pr addObject: [aa autorelease]]; [macroView reloadData]; } - (IBAction)addSetStep:(id)sender { NSMutableDictionary *aa; NSMutableArray *pr; if([setObjectMenu numberOfItems] == 0) { NSWARNING(@"No defined sets."); return; } if(!currMacro) currMacro = [[NSMutableDictionary alloc] init]; if((pr = [currMacro objectForKey: @"program"]) == nil) { pr = [[NSMutableArray alloc] init]; [currMacro setObject: pr forKey: @"program"]; } aa = [[NSMutableDictionary alloc] init]; [aa setObject: @"set" forKey: @"stepType"]; [aa setObject: [NSNumber numberWithInt: [[setOpMenu selectedItem] tag]] forKey: @"op"]; [aa setObject: [[[setObjectMenu titleOfSelectedItem] copy] autorelease] forKey: @"obj"]; [pr addObject: [aa autorelease]]; [macroView reloadData]; } - (IBAction)cancelMacro:(id)sender { [macroSheet orderOut: sender]; [NSApp endSheet: macroSheet returnCode: 0]; } - (IBAction)deleteAllSteps:(id)sender { NSMutableArray *pr; if(!currMacro) currMacro = [[NSMutableDictionary alloc] init]; if((pr = [currMacro objectForKey: @"program"]) == nil) { pr = [[NSMutableArray alloc] init]; [currMacro setObject: pr forKey: @"program"]; } else [pr removeAllObjects]; [macroView reloadData]; } - (IBAction)deleteStep:(id)sender { int n; if((n = [macroView selectedRow]) >= 0 && [currMacro objectForKey: @"program"] != nil) { [[currMacro objectForKey: @"program"] removeObjectAtIndex: n]; } [macroView reloadData]; } - (IBAction)loadMacro:(id)sender { NSMutableArray *revProg; int n; if([macroMenu numberOfItems] == 0) return; //need to do memory mgmt here //[self zeroEditor: self]; [currMacro removeAllObjects]; revProg = [NSMutableArray array]; [currMacro addEntriesFromDictionary: [myOverLord autoSetForName: [macroMenu titleOfSelectedItem]]]; //[[myOverLord autoSets] objectForKey: [macroMenu titleOfSelectedItem]]]; [revProg setArray: [currMacro objectForKey: @"program"]]; n = [revProg count]; [currMacro setObject: revProg forKey: @"program"]; [nameView setStringValue: [macroMenu titleOfSelectedItem]]; [startMenu selectItemWithTitle: [currMacro objectForKey: @"start"]]; [globalScope setIntValue: [[currMacro objectForKey: @"global"] intValue]]; if([currMacro objectForKey: @"sort"] != nil) [sortSwitch setState: NSOnState]; else [sortSwitch setState: NSOffState]; [macroView reloadData]; } - (IBAction)moveDown:(id)sender { int n, m; NSMutableArray *where; n=0; if ((where = [currMacro objectForKey: @"program"]) != nil) { m = [where count]; n = [macroView selectedRow]; if(n < m - 1) { [where exchangeObjectAtIndex: n withObjectAtIndex: n+1]; } } [macroView reloadData]; [macroView selectRow: n + 1 byExtendingSelection: NO]; } - (IBAction)moveUp:(id)sender { int n; NSMutableArray *where; if((n = [macroView selectedRow]) >= 0 && (where = [currMacro objectForKey: @"program"]) != nil) { if(n > 0) { [where exchangeObjectAtIndex: n withObjectAtIndex: n-1]; } } [macroView reloadData]; [macroView selectRow: n - 1 byExtendingSelection: NO]; } - (IBAction) deleteMacro: (id) sender { if([macroMenu numberOfItems] == 0) return; if(NSYESNOQUESTION(@"Delete auto set?") == NO) return; //need to do memory mgmt here [myOverLord removeAutoSetForName: [macroMenu titleOfSelectedItem]]; [myOverLord rebuildAutoSetMenu]; [self zeroEditor: nil]; } - (IBAction)runMacro:(id)sender { [macroSheet orderOut: sender]; [NSApp endSheet: macroSheet returnCode: 1]; } -(void) rebuildMenus { int i, n, m; NSMutableDictionary *macros; NSArray *macroNames; macros = [myOverLord autoSets]; macroNames = [myOverLord allAutoSetNames]; //build menus //start menu n = [startMenu numberOfItems]; if(n >= 2) for(i = 2; i < n; i++) { [startMenu removeItemAtIndex: 2]; } m = [macroNames count]; if(m > 0) for(i = 0; i < m; i++) { [startMenu addItemWithTitle: [macroNames objectAtIndex: i]]; } //if(m>0)[startMenu selectItemAtIndex: 0]; //macro names [macroMenu removeAllItems]; if(m > 0) for(i = 0; i < m; i++) { [macroMenu addItemWithTitle: [macroNames objectAtIndex: i]]; } if(m>0) [macroMenu selectItemAtIndex: 0]; //set Objects [setObjectMenu removeAllItems]; if(m > 0) for(i = 0; i < m; i++) { [setObjectMenu addItemWithTitle: [macroNames objectAtIndex: i]]; } if(m>0) [setObjectMenu selectItemAtIndex: 0]; //set autosets [localAutosetMenu removeAllItems]; if(m > 0) for(i = 0; i < m; i++) { [localAutosetMenu addItemWithTitle: [macroNames objectAtIndex: i]]; } if(m>0) [localAutosetMenu selectItemAtIndex: 0]; //column names [columnMenu removeAllItems]; m = [[myOverLord columns] count]; if(m > 0) for(i = 0; i < m; i++) { [columnMenu addItemWithTitle: [[myOverLord columns] objectAtIndex: i]]; } if(m>0) [columnMenu selectItemAtIndex: 0]; [setOpMenu selectItemAtIndex: 0]; [selectTypeMenu selectItemAtIndex: 0]; [selectModeMenu selectItemAtIndex: 0]; } -(IBAction) zeroEditor: (id) sender { int i, n, m; NSMutableDictionary *macros; NSArray *macroNames; macros = [myOverLord autoSets]; macroNames = [myOverLord allAutoSetNames]; currMacro = [[NSMutableDictionary alloc] init]; [nameView setStringValue: @""]; [selectStringView setStringValue: @""]; [fpOption setState: NSOffState]; [regexOption setState: NSOffState]; //build menus //start menu n = [startMenu numberOfItems]; if(n >= 2) for(i = 2; i < n; i++) { [startMenu removeItemAtIndex: 2]; } m = [macroNames count]; if(m > 0) for(i = 0; i < m; i++) { [startMenu addItemWithTitle: [macroNames objectAtIndex: i]]; } if(m>0)[startMenu selectItemAtIndex: 0]; //macro names [macroMenu removeAllItems]; if(m > 0) for(i = 0; i < m; i++) { [macroMenu addItemWithTitle: [macroNames objectAtIndex: i]]; } if(m>0) [macroMenu selectItemAtIndex: 0]; //code sets [codeSetSelMenu selectItemAtIndex: 0]; [codeSetExact setState: NSOnState]; [codeSetMenu removeAllItems]; [codeSetMenu addItemsWithTitles: [[myOverLord getGWorkBench: nil] allCodeSetNames]]; if([codeSetMenu numberOfItems] >= 1) [codeSetMenu selectItemAtIndex: 0]; //set Objects [setObjectMenu removeAllItems]; if(m > 0) for(i = 0; i < m; i++) { [setObjectMenu addItemWithTitle: [macroNames objectAtIndex: i]]; } if(m>0) [setObjectMenu selectItemAtIndex: 0]; //set autosets [localAutosetMenu removeAllItems]; if(m > 0) for(i = 0; i < m; i++) { [localAutosetMenu addItemWithTitle: [macroNames objectAtIndex: i]]; } if(m>0) [localAutosetMenu selectItemAtIndex: 0]; //column names [columnMenu removeAllItems]; m = [[myOverLord columns] count]; if(m > 0) for(i = 0; i < m; i++) { [columnMenu addItemWithTitle: [[myOverLord columns] objectAtIndex: i]]; } if(m>0) [columnMenu selectItemAtIndex: 0]; [setOpMenu selectItemAtIndex: 0]; [selectTypeMenu selectItemAtIndex: 0]; [selectModeMenu selectItemAtIndex: 0]; [macroView reloadData]; } -(void) saveMacro: (id) sender { if([[nameView stringValue] isEqualToString: @""] == YES ) { NSWARNING(@"You need to give the auto set a unique name"); return; } if([myOverLord validAutoSetName: [nameView stringValue]] == NO) { if( NSYESNOQUESTION(@"Write on top of existing auto set with that name?") == YES) { [myOverLord removeAutoSetForName: [nameView stringValue]]; } else return; } [currMacro setObject: [[[startMenu titleOfSelectedItem] copy] autorelease] forKey: @"start"]; [currMacro setObject: [NSNumber numberWithInt: [globalScope intValue]] forKey: @"global"]; if([sortSwitch state] == NSOnState) [currMacro setObject: [myOverLord sortStackCopy] forKey: @"sort"]; [myOverLord addAutoSet: [[currMacro copy] autorelease] withName: [nameView stringValue]]; [self rebuildMenus]; [macroMenu selectItemWithTitle: [nameView stringValue]]; if([startMenu indexOfItemWithTitle: [currMacro objectForKey: @"start"]] >= 0) [startMenu selectItemWithTitle: [currMacro objectForKey: @"start"]]; [myOverLord rebuildAutoSetMenu]; } -(void) macroEditorDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode == 0) return; //put in runningstuff [myOverLord doAutoSet: [macroMenu selectedItem]]; [myOverLord rebuildAutoSetMenu]; } -(void) runMacroEditor { NSWindow *who; [self zeroEditor: self]; if([gPrefBoss detachedSheetValue]) who = nil; else who = [myOverLord myWindow]; [NSApp beginSheet: macroSheet modalForWindow: who modalDelegate: self didEndSelector: @selector(macroEditorDidEnd:returnCode:contextInfo:) contextInfo: nil]; } - (int)numberOfRowsInTableView:(NSTableView *)aTableView { if(currMacro) return [[currMacro objectForKey: @"program"] count]; else return 0; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { NSArray *arr; NSMutableDictionary *md; if(currMacro) { arr = [currMacro objectForKey: @"program"]; md = [arr objectAtIndex: rowIndex]; if([[md objectForKey: @"stepType"] isEqualToString: @"sel"] == YES) { NSMutableString *flagStr = [NSMutableString string]; int ff; ff = 0; if([[md objectForKey: @"mode"] intValue] == SELECTCODESET) { NSString *csItem; if([md objectForKey: @"type"] == nil) [md setObject: [NSNumber numberWithInt: SELECT] forKey: @"type"]; if([md objectForKey: @"exact"] == nil) [md setObject: [NSNumber numberWithBool: YES] forKey: @"exact"]; switch([[md objectForKey: @"type"] intValue]) { case SELECT: csItem = [NSString stringWithFormat: @"%d %@: %@", rowIndex+1, @"Code set", [md objectForKey: @"name"]]; break; case SELECTFEWER: csItem = [NSString stringWithFormat: @"%d %@: %@", rowIndex+1, @"-Code set", [md objectForKey: @"name"]]; break; case SELECTADDITIONAL: csItem = [NSString stringWithFormat: @"%d %@: %@", rowIndex+1, @"+Code set", [md objectForKey: @"name"]]; break; } if([[md objectForKey: @"exact"] boolValue] == YES) return [NSString stringWithFormat: @"%@ (x)", csItem]; return csItem; } if([[md objectForKey: @"mode"] intValue] == SELECTREVERSE) { return [NSString stringWithFormat: @"%d %@", rowIndex+1, @"Select reverse"]; } [flagStr setString: @"("]; if([[md objectForKey: @"float"] intValue] == 1) { ff++; [flagStr appendString: @"float"]; } if([[md objectForKey: @"regex"] intValue] == 1) { if(ff) [flagStr appendString: @", "]; [flagStr appendString: @"regex"]; ff++; } if(ff) [flagStr appendString: @")"]; else [flagStr setString: @""]; return [NSString stringWithFormat: @"%d %@: \"%@\" in %@ %@", rowIndex + 1, [[selectModeMenu itemAtIndex: [selectModeMenu indexOfItemWithTag: [[md objectForKey: @"mode"] intValue]]] title], [md objectForKey: @"searchValue"], [md objectForKey: @"col"], flagStr]; } else if ([[md objectForKey: @"stepType"] isEqualToString: @"set"] == YES) { return [NSString stringWithFormat: @"%d %@: \"%@\" with %@", rowIndex + 1, [md objectForKey: @"stepType"], [[setOpMenu itemAtIndex: [setOpMenu indexOfItemWithTag: [[md objectForKey: @"op"] intValue]]] title], [md objectForKey: @"obj"] ]; } else if([[md objectForKey: @"stepType"] isEqualToString: @"autoset"] == YES) { return [NSString stringWithFormat: @"%d %@: %@", rowIndex + 1, [md objectForKey: @"stepType"], [md objectForKey: @"name"] ]; } } return @""; } @end gtamsanalyzer.app-0.42/Source/smartSort.tif0000555000175000017500000000642410162465511021317 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ      @   (smartSort.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/sort09.tif0000555000175000017500000000647210162465511020464 0ustar brentbrent00000000000000MM* J1~~dddd휧ᝨ簹篸殸氹簹絾JJ疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪd1ddJdddd~J    4  @  * 2(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/sort09.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/sort09Within.tif0000555000175000017500000000650010162465511021637 0ustar brentbrent00000000000000MM* qS휧ᝨ簹篸殸氹簹絾~~疢ߖߪdd矪ޔޔޔޡ⡫⡬⢭⦰ddᖡުޔޔޘߝᝩᝩᝩᦰ촻EB唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽d1ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘdd菛׈ͪJddd~J    :  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/sort09Within.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/sortAZ.tif0000555000175000017500000000647210162465511020546 0ustar brentbrent00000000000000MM* ~~dd휧ᝨ簹篸殸氹簹絾~JdJ疢ߖߪdJ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪd~~d~    4  @  * 2(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/sortAZ.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/sortAZWithin.tif0000555000175000017500000000650010162465511021721 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾~~疢ߖߪdd矪ޔޔޔޡ⡫⡬⢭⦰~JdJᖡުޔޔޘߝᝩᝩᝩᦰ촻dJ唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾d哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ~    :  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/sortAZWithin.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/sortCode.tif0000555000175000017500000000647410162465511021110 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ    6  @  , 4(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/sortCode.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/sortCodeWithin.tif0000555000175000017500000000650210162465511022263 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ުޔޔޔޔޓޓޗߞᶾ骰ѻ㔠ޔުޔޔސݏݐݑݙ࣭㶿骰Ѽ䔠ޔުޔޔޏݐݔޘߞᡫ⵽谷ح痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ    <  @  2 :(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/sortCodeWithin.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/stringCategories.h0000555000175000017500000000215310162465511022275 0ustar brentbrent00000000000000#import #import #import "AGRegex.h" @interface AGRegex (NSEscapeReplace) - (NSString *)replaceWithString:(NSString *)rep inString:(NSString *)str limit:(int)lim range: (NSRange) r; - (NSString *)replaceWithStringWithEscape:(NSString *)rep inString:(NSString *)str raw: (int) rawflag; - (NSString *)replaceWithStringWithEscape:(NSString *)rep inString:(NSString *)str limit: (int) lim range: (NSRange) r raw: (int) rawflag; @end @interface NSMutableAttributedString(MGWAdditions) -(void) setColor: (NSColor *) myC; -(void) appendString: (NSString *) who; -(void) setString: (NSString *) who; @end @interface NSString (NSStringTextFinding) - (NSRange)findString:(NSString *)string selectedRange:(NSRange)selectedRange options:(unsigned)options wrap:(BOOL)wrap regex: (BOOL) regexFlag multiline: (BOOL) mlFlag substring: (int) sbstr; - (NSRange)findString:(NSString *)string selectedRange:(NSRange)selectedRange options:(unsigned)mask wrap:(BOOL)wrapFlag regex: (BOOL) regexFlag multiline: (BOOL) mlFlag; -(NSString *) stringUnescaped; -(BOOL) startsWith: (NSString *) who; @end gtamsanalyzer.app-0.42/Source/stringCategories.m0000555000175000017500000002154710162465511022312 0ustar brentbrent00000000000000#import "stringCategories.h" #import "utils.h" @implementation NSString (NSStringTextFinding) -(NSString *) stringUnescaped { NSMutableString *s2 = [NSMutableString string]; [s2 setString: self]; [s2 replaceOccurrencesOfString: @"\\n" withString: @"\n" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\t" withString: @"\t" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; [s2 replaceOccurrencesOfString: @"\\r" withString: @"\r" options: NSLiteralSearch range: NSMakeRange(0, [s2 length])]; return s2; } - (NSRange)findString:(NSString *)string selectedRange:(NSRange)selectedRange options:(unsigned)options wrap:(BOOL)wrap regex: (BOOL) regexFlag multiline: (BOOL) mlFlag { return [self findString: string selectedRange: selectedRange options: options wrap: wrap regex: regexFlag multiline: mlFlag substring: 0]; } - (NSRange)findString:(NSString *)string selectedRange:(NSRange)selectedRange options:(unsigned)options wrap:(BOOL)wrap regex: (BOOL) regexFlag multiline: (BOOL) mlFlag substring: (int) sbstr { BOOL forwards = (options & NSBackwardsSearch) == 0; unsigned length = [self length]; NSRange searchRange, range; int mycnt; if (forwards) { searchRange.location = NSMaxRange(selectedRange); searchRange.length = length - searchRange.location; if(regexFlag == YES) { AGRegex *regex; int regexOptions; AGRegexMatch *match; regexOptions = 0; if (options & NSCaseInsensitiveSearch) regexOptions |= AGRegexCaseInsensitive; if(mlFlag == YES) regexOptions |= AGRegexMultiline; regex = [[AGRegex alloc] initWithPattern: string options: regexOptions]; match = [regex findInString: self range: searchRange]; if((mycnt = [match count]) > 0) { if(sbstr <= mycnt - 1) range = [match rangeAtIndex: sbstr]; else { range.location = NSNotFound; range.length = 0; } } else if(wrap) { searchRange.location = 0; searchRange.length = selectedRange.location; match = [regex findInString: self range: searchRange]; if((mycnt = [match count]) > 0) { if(sbstr <= mycnt - 1) range = [match rangeAtIndex: sbstr]; else { range.length = 0; range.location = NSNotFound; } } else { range.length = 0; range.location = NSNotFound; } } else { range.length = 0; range.location = NSNotFound; } [regex release]; } else { range = [self rangeOfString:string options:options range:searchRange]; if ((range.length == 0) && wrap) { /* If not found look at the first part of the string */ searchRange.location = 0; searchRange.length = selectedRange.location; range = [self rangeOfString:string options:options range:searchRange]; } } } else { searchRange.location = 0; searchRange.length = selectedRange.location; range = [self rangeOfString:string options:options range:searchRange]; if ((range.length == 0) && wrap) { searchRange.location = NSMaxRange(selectedRange); searchRange.length = length - searchRange.location; range = [self rangeOfString:string options:options range:searchRange]; } } return range; } -(BOOL) startsWith: (NSString *) who { NSRange r; r = [self rangeOfString: who]; if(r.location == NSNotFound) return NO; else if (r.location == 0) return YES; return NO; } @end @implementation AGRegex (NSEscapeReplace) - (NSString *)replaceWithString:(NSString *)rep inString:(NSString *)str limit:(int)lim range: (NSRange) r { [self replaceWithString: rep inString: [str substringWithRange: r] limit: lim]; } - (NSString *)replaceWithStringWithEscape:(NSString *)rep inString:(NSString *)str limit: (int) lim range: (NSRange) r raw: (int) rawflag { int n, i; char ch, chn; NSRange rrr; NSMutableString *newString; if(rawflag) {return [self replaceWithString: rep inString: str limit: lim range: r] ;} newString = [[NSMutableString alloc] init]; //go through the replace string n = [rep length]; rrr.location = 0; rrr.length = 0; for(i = 0; i < n; i++) { ch = [rep characterAtIndex: i]; if(ch == '\\' && i < n - 1) { if(rrr.length) { [newString appendString: [rep substringWithRange: rrr]]; } chn = [rep characterAtIndex: ++i]; rrr.length = 0; rrr.location = 1+i; switch(chn) { case 't': [newString ADDCHAR('\t')]; break; case 'n': [newString ADDCHAR('\n')]; break; case 'r': [newString ADDCHAR('\r')]; break; default: [newString ADDCHAR('\\')]; [newString ADDCHAR(chn)]; break; } } else { rrr.length +=1; //[newString ADDCHAR( ch)]; } } if(rrr.length && rrr.location < n) { [newString appendString: [rep substringWithRange: rrr]]; } [newString autorelease]; return [self replaceWithString: newString inString: str limit: lim range: r] ; } - (NSString *)replaceWithStringWithEscape:(NSString *)rep inString:(NSString *)str raw: (int) rawflag { int n, i; char ch, chn; NSRange rrr; NSMutableString *newString; //go through the replace string if(rawflag) { return [self replaceWithString: rep inString: str] ;} newString = [[NSMutableString alloc] init]; n = [rep length]; rrr.location = rrr.length = 0; for(i = 0; i < n; i++) { ch = [rep characterAtIndex: i]; if(ch == '\\' && i < n - 1) { if(rrr.length) { [newString appendString: [rep substringWithRange: rrr]]; } chn = [rep characterAtIndex: ++i]; rrr.length = 0; rrr.location = i+1; switch(chn) { case 't': [newString ADDCHAR('\t')]; break; case 'n': [newString ADDCHAR('\n')]; break; case 'r': [newString ADDCHAR('\r')]; break; default: [newString ADDCHAR('\\')]; [newString ADDCHAR(chn)]; break; } } else { rrr.length +=1; //[newString ADDCHAR( ch)]; } } if(rrr.length && rrr.location < n) { [newString appendString: [rep substringWithRange: rrr]]; } [newString autorelease]; return [self replaceWithString: newString inString: str] ; } /* - (NSArray *)findAllInString:(NSString *)str range:(NSRange)range { int length = range.length; int location = range.location; AGRegexMatch *match; NSMutableArray *result = [NSMutableArray array]; NSRange matchRange; while (match = [self findInString:str range:range]) { [result addObject:match]; matchRange = [match range]; range.location = matchRange.location + matchRange.length; if (!matchRange.length) range.location++; range.length = location + length - range.location; if (range.location > length) break; } return result; } */ @end @implementation NSMutableAttributedString(MGWAdditions) -(void) setColor: (NSColor *) myC { NSMutableDictionary *dd = [NSMutableDictionary dictionary]; [dd setObject: myC forKey: NSForegroundColorAttributeName]; [self setAttributes: dd range: NSMakeRange(0, [self length])]; } -(void) appendString: (NSString *) who { [self appendAttributedString: [[[NSAttributedString alloc] initWithString: who] autorelease]]; } -(void) setString: (NSString *) who { [self setAttributedString: [[[NSAttributedString alloc] initWithString: who] autorelease]]; } @end gtamsanalyzer.app-0.42/Source/study.c0000555000175000017500000003242610162465511020132 0ustar brentbrent00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. See the file Tech.Notes for some information on the internals. Written by: Philip Hazel Copyright (c) 1997-2003 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- */ /* Include the internals header, which itself includes Standard C headers plus the external pcre header. */ #include "internal.h" /************************************************* * Set a bit and maybe its alternate case * *************************************************/ /* Given a character, set its bit in the table, and also the bit for the other version of a letter if we are caseless. Arguments: start_bits points to the bit map c is the character caseless the caseless flag cd the block with char table pointers Returns: nothing */ static void set_bit(uschar *start_bits, int c, BOOL caseless, compile_data *cd) { start_bits[c/8] |= (1 << (c&7)); if (caseless && (cd->ctypes[c] & ctype_letter) != 0) start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7)); } /************************************************* * Create bitmap of starting chars * *************************************************/ /* This function scans a compiled unanchored expression and attempts to build a bitmap of the set of initial characters. If it can't, it returns FALSE. As time goes by, we may be able to get more clever at doing this. Arguments: code points to an expression start_bits points to a 32-byte table, initialized to 0 caseless the current state of the caseless flag utf8 TRUE if in UTF-8 mode cd the block with char table pointers Returns: TRUE if table built, FALSE otherwise */ static BOOL set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless, BOOL utf8, compile_data *cd) { register int c; /* This next statement and the later reference to dummy are here in order to trick the optimizer of the IBM C compiler for OS/2 into generating correct code. Apparently IBM isn't going to fix the problem, and we would rather not disable optimization (in this module it actually makes a big difference, and the pcre module can use all the optimization it can get). */ volatile int dummy; do { const uschar *tcode = code + 1 + LINK_SIZE; BOOL try_next = TRUE; while (try_next) { /* If a branch starts with a bracket or a positive lookahead assertion, recurse to set bits from within them. That's all for this branch. */ if ((int)*tcode >= OP_BRA || *tcode == OP_ASSERT) { if (!set_start_bits(tcode, start_bits, caseless, utf8, cd)) return FALSE; try_next = FALSE; } else switch(*tcode) { default: return FALSE; /* Skip over callout */ case OP_CALLOUT: tcode += 2; break; /* Skip over extended extraction bracket number */ case OP_BRANUMBER: tcode += 3; break; /* Skip over lookbehind and negative lookahead assertions */ case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do tcode += GET(tcode, 1); while (*tcode == OP_ALT); tcode += 1+LINK_SIZE; break; /* Skip over an option setting, changing the caseless flag */ case OP_OPT: caseless = (tcode[1] & PCRE_CASELESS) != 0; tcode += 2; break; /* BRAZERO does the bracket, but carries on. */ case OP_BRAZERO: case OP_BRAMINZERO: if (!set_start_bits(++tcode, start_bits, caseless, utf8, cd)) return FALSE; dummy = 1; do tcode += GET(tcode,1); while (*tcode == OP_ALT); tcode += 1+LINK_SIZE; break; /* Single-char * or ? sets the bit and tries the next item */ case OP_STAR: case OP_MINSTAR: case OP_QUERY: case OP_MINQUERY: set_bit(start_bits, tcode[1], caseless, cd); tcode += 2; #ifdef SUPPORT_UTF8 if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++; #endif break; /* Single-char upto sets the bit and tries the next */ case OP_UPTO: case OP_MINUPTO: set_bit(start_bits, tcode[3], caseless, cd); tcode += 4; #ifdef SUPPORT_UTF8 if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++; #endif break; /* At least one single char sets the bit and stops */ case OP_EXACT: /* Fall through */ tcode++; case OP_CHARS: /* Fall through */ tcode++; case OP_PLUS: case OP_MINPLUS: set_bit(start_bits, tcode[1], caseless, cd); try_next = FALSE; break; /* Single character type sets the bits and stops */ case OP_NOT_DIGIT: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_digit]; try_next = FALSE; break; case OP_DIGIT: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_digit]; try_next = FALSE; break; case OP_NOT_WHITESPACE: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_space]; try_next = FALSE; break; case OP_WHITESPACE: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_space]; try_next = FALSE; break; case OP_NOT_WORDCHAR: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_word]; try_next = FALSE; break; case OP_WORDCHAR: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_word]; try_next = FALSE; break; /* One or more character type fudges the pointer and restarts, knowing it will hit a single character type and stop there. */ case OP_TYPEPLUS: case OP_TYPEMINPLUS: tcode++; break; case OP_TYPEEXACT: tcode += 3; break; /* Zero or more repeats of character types set the bits and then try again. */ case OP_TYPEUPTO: case OP_TYPEMINUPTO: tcode += 2; /* Fall through */ case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEQUERY: case OP_TYPEMINQUERY: switch(tcode[1]) { case OP_ANY: return FALSE; case OP_NOT_DIGIT: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_digit]; break; case OP_DIGIT: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_digit]; break; case OP_NOT_WHITESPACE: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_space]; break; case OP_WHITESPACE: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_space]; break; case OP_NOT_WORDCHAR: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_word]; break; case OP_WORDCHAR: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_word]; break; } tcode += 2; break; /* Character class where all the information is in a bit map: set the bits and either carry on or not, according to the repeat count. If it was a negative class, and we are operating with UTF-8 characters, any byte with a value >= 0xc4 is a potentially valid starter because it starts a character with a value > 255. */ case OP_NCLASS: if (utf8) { start_bits[24] |= 0xf0; /* Bits for 0xc4 - 0xc8 */ memset(start_bits+25, 0xff, 7); /* Bits for 0xc9 - 0xff */ } /* Fall through */ case OP_CLASS: { tcode++; /* In UTF-8 mode, the bits in a bit map correspond to character values, not to byte values. However, the bit map we are constructing is for byte values. So we have to do a conversion for characters whose value is > 127. In fact, there are only two possible starting bytes for characters in the range 128 - 255. */ if (utf8) { for (c = 0; c < 16; c++) start_bits[c] |= tcode[c]; for (c = 128; c < 256; c++) { if ((tcode[c/8] && (1 << (c&7))) != 0) { int d = (c >> 6) | 0xc0; /* Set bit for this starter */ start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */ c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */ } } } /* In non-UTF-8 mode, the two bit maps are completely compatible. */ else { for (c = 0; c < 32; c++) start_bits[c] |= tcode[c]; } /* Advance past the bit map, and act on what follows */ tcode += 32; switch (*tcode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: tcode++; break; case OP_CRRANGE: case OP_CRMINRANGE: if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 5; else try_next = FALSE; break; default: try_next = FALSE; break; } } break; /* End of bitmap class handling */ } /* End of switch */ } /* End of try_next loop */ code += GET(code, 1); /* Advance to next branch */ } while (*code == OP_ALT); return TRUE; } /************************************************* * Study a compiled expression * *************************************************/ /* This function is handed a compiled expression that it must study to produce information that will speed up the matching. It returns a pcre_extra block which then gets handed back to pcre_exec(). Arguments: re points to the compiled expression options contains option bits errorptr points to where to place error messages; set NULL unless error Returns: pointer to a pcre_extra block, with study_data filled in and the appropriate flag set; NULL on error or if no optimization possible */ EXPORT pcre_extra * pcre_study(const pcre *external_re, int options, const char **errorptr) { uschar start_bits[32]; pcre_extra *extra; pcre_study_data *study; const real_pcre *re = (const real_pcre *)external_re; uschar *code = (uschar *)re + sizeof(real_pcre) + (re->name_count * re->name_entry_size); compile_data compile_block; *errorptr = NULL; if (re == NULL || re->magic_number != MAGIC_NUMBER) { *errorptr = "argument is not a compiled regular expression"; return NULL; } if ((options & ~PUBLIC_STUDY_OPTIONS) != 0) { *errorptr = "unknown or incorrect option bit(s) set"; return NULL; } /* For an anchored pattern, or an unanchored pattern that has a first char, or a multiline pattern that matches only at "line starts", no further processing at present. */ if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0) return NULL; /* Set the character tables in the block which is passed around */ compile_block.lcc = re->tables + lcc_offset; compile_block.fcc = re->tables + fcc_offset; compile_block.cbits = re->tables + cbits_offset; compile_block.ctypes = re->tables + ctypes_offset; /* See if we can find a fixed set of initial characters for the pattern. */ memset(start_bits, 0, 32 * sizeof(uschar)); if (!set_start_bits(code, start_bits, (re->options & PCRE_CASELESS) != 0, (re->options & PCRE_UTF8) != 0, &compile_block)) return NULL; /* Get a pcre_extra block and a pcre_study_data block. The study data is put in the latter, which is pointed to by the former, which may also get additional data set later by the calling program. At the moment, the size of pcre_study_data is fixed. We nevertheless save it in a field for returning via the pcre_fullinfo() function so that if it becomes variable in the future, we don't have to change that code. */ extra = (pcre_extra *)(pcre_malloc) (sizeof(pcre_extra) + sizeof(pcre_study_data)); if (extra == NULL) { *errorptr = "failed to get memory"; return NULL; } study = (pcre_study_data *)((char *)extra + sizeof(pcre_extra)); extra->flags = PCRE_EXTRA_STUDY_DATA; extra->study_data = study; study->size = sizeof(pcre_study_data); study->options = PCRE_STUDY_MAPPED; memcpy(study->start_bits, start_bits, sizeof(start_bits)); return extra; } /* End of study.c */ gtamsanalyzer.app-0.42/Source/summary.png0000644000175000017500000004377510162465511021031 0ustar brentbrent00000000000000PNG  IHDRcRGIDATxݫ{$G0jinfC}VEHb+VGP|65057ЇYPS[2޷j"###/K<WΞ?l$n?osחgg.?}r]_?yu<'6{ꓒ-Kk4S{e7?=jQs0|b}+UlO[+_k ²1aمGlz>qW]\?Bi֣Wm}Iܖ珻lM{~X>jםxS{%Ϧx}K}.2oL}Uڮ=e^5o,?Ǝy$f9+v/?hCRk^7.lJMm{oUl:׍ZRs>vlwj_7sc= R",8m*XV3֖}{dz~_+#쿛ݑ6?o»4l.߾K|}ٽl._wL-2nc;Rk w.V䢂yڶ0CL6uf뻣Sg}Ej[v5=L9ϑݻ9(³kO>}y{wa7O_K/ @.[2k?~wy);,˧u,cܾLR%w?e=~(UeG=qSv}&ゝaCx;b02ׁ횿VKH~q oߎe{=sz A}9Gס|U3W9ǻQ{$.S~%.{5հ옝t3oξ~ W'jK._K1߳a`kb?Ϭ0oKR(Un^L4o˷O?]Mm9YD6TM%vhU^sI:QR|x}LQC'\X?mx^@gݵ7`o#H=-dx.|Nmrߣbwɱքo=-^7>GCvXIը!b6Nm/={t'6\Y+uFJ/ד[&#?w+!T~uݯ'uIsNkg9>/f]=ܩo &r?(mn]CRצع #L;Q~_Lp& lhuH߿tr{]2?C<ʇ;`7㱺{G9 p{!yXqj+mJjfxCN-yl-%C$> Ens8dž_pMoxQO-3GWxo9ٵNy(;Nmi^J[cOKO}M){i,}:wx[Kze0$]~9MN%c71ީ7zI. cu#r ˻9i6[maOdh`n,TNӮ~a #]a|"~ޟ޿ϡ) yNbAx71dj@V;x~w۳x4ϙ`/8ں;vwG7ڥI^ gv:5G[v,o=.ol/aTJ_G"{?nmmvL7:収pѭ!6wFfXX3L~}8\"y8J=a߁ݽWhơ-C-|l\ o;Jƶ<sm/HtoM'qOÖrB-h>LI2Y*1>-~e~wQwcO۷oTb%IOip|xɯ0E]jowM=h_c%פT͵ԪvzmAu]=v^*9mnDaςħpG ЃL;+ڕ풹bm襓6:?6}(;\K/9RӅ{4XX=w7gMl0dt+ם KsoSZhzq7dp_L}P^s1KUuXh?K';M };d\hDKlUQCɢ$йq!Z<Ց)tK-{>Gv.m%& kYoAII<]O^w[ko1>N>?Sb~0~ semk}/\H;fcs;@6l}ɷ)-dSf_˧ on0_Dbl~[kkk]wINծuSFt=rLsYPِD4r mةC'?.k?M-Ec[Ԝ'w)ok?iOwД8 ݝ,S/)OUYwo[_vc%/鋯?\8RIO6g_:/}>͍ &] >ݰz߀n݉Z?{[?T2ggggoeR4)jl?.}0,?ß?C*oo.Ja2%o?vˤ9P7o֜!6 @Ԟ}Rmf(/~- _3欕WVP?v~u?'5w[-Ubru:9Jy Ɍ.&a=*.Ok|?eԽN-:Ն^^_F-Rߦu/]YG Tm}jNɦ\wmHwϯw,C.|R/SSinwIwh}ɭIMI}PS$}3t!M-< F]2s]/f򏦆_JGoGR l@!5X;~3m-W}.w7oŏGSAp >S cylT0m_h/om!wc} cSwԸ+~S}Y<ީ3K]2\yoc!u??m]xߊTuLqW6>zŦ{cА;^efwrL (h(_zמ!uW2bj{eu5>? ~!472 oUFѧd>E.{Cd_C;,ϮSm XI|Ȟ(=]$?c'$DSj6.ukQcqBMo?2^b0}-?VoS妣?P/kv؟w7]{?>|:a,#Zo:-Y!6ȯG_`mI Y\bcɌ}sw 3WU>qixYaO*=DY7yK6 XNz yBzX_I]tJUҟ<*8v.x'\zWE6(X߁ӏb[J|(YاfCԔ?!YS\aWIWlإ"~ / NcGoA´OxTDs].J_n}e>>jjJ.}^W6J|%%;7^zPtϵ >N͊ ZWxjr[0r糧+.Ғiy״|wGHcf_C֗L7*ޓ{fnKc|IӏJҌ*]>}7ǫwݼYAVm{Ͽ4<Նq\4me])\tr2n=yI߸R~fYAjѾ~z547n*"]"?5z?zz=|h\:}wʋOq~]w-ϻ m;촿; eT/f4˭#|L0r_GaW^!mݗwWԤzͱ)r=퍩A;X|pLgj#:WW٣>} /_vϭsv_EwvNJdֆSuoNX;#?6lbn8B:'+xs3ySCLMIw|^0%LO1]fm(97 }Auڎ{FY&̿>c {n)-kNɓ*`>n5wvis>IѩTWܖih[l[7C;;dOKjog)cn /b'n9x[QkY[~]xh]E{c6߮eN6vЩSWnHT/e)L| m>ئ [{KlXyR(K97gs֩N6]=m?oVycy=C=RP{jOo|j3vk6wǞQ^r쑾wiUۿ ~ekEx]jI Sl?ƎM0F[&͔4 s, R{ۂ~ ҇x'Ŏ»\6˭{W3i֖L7i?};jsPħlL'}-}4kr`v$-'eۏǻGښs'iFwaOuRJi31r嚞%0rlo/HͼۗWsHң'5o輩a)c^_4[gxʱ`coe/-_8~>7ޮ=Ͷf[2c|c=pvrA;n_^joOkxocOϖbSO^徉sW̾vX{}TyoH+f>p߄o:mnxoNmIs!RRȷr}s$73=C^ֻ0^Jׄ|'z cțRŖʝFnjm+sw7h7?UGGˇ#z%wn݇.s |ٌ/Qh$:v>sTyL#_?^ˎyw4c>]HR)w)t>Hw%qK.CRnCnbSuGק?ٷgȏ׶kړͽėoJ{i9;>LM52J:[-B^!|딺ބJUwk/=r|$yqVmH?b+ +]oSJIMVzh14/H?2߾T9}'b}]nʘ=4 "B7nz[S'w@蚲-+9 5ےۗ\c37E|_:/gsskGԧb?e*1껓uCvm||~3hճvn[sjأpvyvGK/7[Sפ_0;$=6ymIb3>.xn)_g%3v}sUҶ߼*orӂ HkՌ崼U3L!7 R1Z4 JgU;ds:Ht/5]Tf/O16VKF[II!an/KFǮ1򒺲Ĭ4+o^8Zn|$Btcf+훌Uy]|WzRY d.tiOCoW95*|ڻN}OpcmA}3򜾑MuOaݲJFTJN>Civڥs/?^U?>%^x[i?7̈P0\ݯcst_̰ kGw_zۏY R z7WkI3'+Snq!wWTsBmwZv  TrHi=*ߦ_rbź{llL~s}Wܯjs EjpY_'rwCh:Ց;Nn`H5.v2}zg>'xy̌P =n?v0rxW}[o8쟕>m(qŜ?n~X՛\4~.?_2nW/xzRڅ&=)EjtJ+r<3ΏOaQX]ˏ)_&w:z ;D?!o:RNV)­0oP40B5ahnk)6VOߧ%ǩ}zeה-kU{3W#eS5,ƸϻkC3Kֲ9\"kTٖߡ˼TYHY,w%ZCWp_-QC}\w5?2J}gCAsբ);z,Ko/|JyN!~LR4%/Fq%N=r6;{~*zkNrηۧK%ց| Co-SJ$u|MH-y:@9{4uȸKqi:u:gjO9SS=?z>}7' %l]o 4F'C,-+S>#ZG^5jX|)]MJaܴa4K>|蒔˗[S#̸%ScO>yŇQCR~|K/3HfңZIvydr%5|h G=5Ғ=ͳ˫u7=u0}@y0cңÛZL7V %GA~~Jf rpg3= Y벖!/vCSXzɹ orڑpLLPyۨkOޛ~thFDAߦ~5rIࡓ!oI7/NC=S Xܼn*suBECѤG['O!/K=!Pt;߾ps*w@`(Goo m6wǺZH1@*& b{ؤ___+Dj;᧮-)r:'n0=k>fm9z @P}uttiXGßIbC'33@t3QB`I%Q̀v2Xs[r Jm a6 (4 qZШ8 eܒPyi.*V~/yϸojޔp~{</K`I J³y2.? d]攀jHϸTN%lC}T^sm]v/_|yJ"],Z@{_s|\ޛIy@^[V,O/yׄєw}<|y}ipօCDҥ@gPyzY!/mSJo?I} @|g5ު~Ýʿ@VrLZk?s.aQd^M&Zb$:8Д/c xGZOy\ݗ+%9zJR(ٳWENqԃc%FriG_-\y9\5=qܖH#b:0NjK׊T:e^Δ횲Ck˼~L -qtloK0=s4rɿzkEI -|6=\9ys:)A;bTl v/[H5mDtSRz9t-q#><<6hXj]&Ss-BRooo7ͭҀL2J|F{e k0~s)>ꗫ_~QkJ*l: XICv-kN0/Q+0eKKRZVc4xI]z _]5`ٓYj)ˏ=R[w/ٚ-W+|NyA~o{L-1Q"wba:~kjk^u?$jQQgb{GKzj!EMFmu@žRy۷%WJ}R3{NsD! #!}Tz4042%u۹mmqryXb-pzAj8L`P^XɷkW?0YH hW)ll8eG)Ia{;pXm|])k)I! X|-96!C`c`%AŸ㐿]Gp|t ?+>QcmTo`-PI-_?dvF55bbdt??N>>}çJi~~i,~w߿k~rttd^ٞC@P1[]=ӯJR.QK0v˨-8ZyaͰ6\ (vSRk:a<0TaU}#}3W7r'اB. ^C}+YtK6Nݰ#@Nqsd'C,)F.I~(u:T ˌ[25yCKjG9%Zy87}\7g=(?}yZqBL{:멇ZݵS<f33Ʃ,yyy5t8i b{*& b{*& b{*& b{*& b{*& b{*& b{*& b{*& b{*& b{*& b_){:?????|Ҁ ln7[1yxxPP;=zд>/{a=}^Lb0ߧ=)ʚ%p:ۻܖm2<85{`qzJ&_k+#WIoiĞB?nR3ȿyyyR&Rìw WS"m%S!"/{`)!t7SXOIn}-Mj3/P,Oi#eGy9"hKZ#SKA]•ozJ5|k\5yv v9nKO gz%w9vpmݞiqۮO?<'*APcLl3r+tVoUYƒ|yy:aQsTf}t])}^6wjZ~д$^nmw.i]lˇ?sljKnLy*|(+۟2۱ J>%q]1˃÷G~|>n_rYa.Sg/C mgS)PyLImGԟ&=lƗxղu xPڡwֵu zl_x&=@7@H/C`0^<`xX)*& b{*uw'^9}A'gs*Sppp8@P1cH~}%&]ۮtn[C';4&=0X>jSB ˩~dC)#sk GY3ȿyyyR&pRb_2?%'aP-㶺}~>ewLg<4C0T.I!mϵ-ӷz#ڧ>R 7,ԒmL=0ҸiR%۔Nڢ|~¿s^ct6/yja|v2* ]˸uSK NX>sSR9سaYQyi̵u)_|*4C|N/ʷb~z phS4&,~/{s^_u!E=0κM%J𩭳C_۶0~N`6%y%9߭4 >>^5,lq5H+T(=|g๦J%^|DJ` |Nyz>%%-Q,n)Y׭r"eK`=5 }h)Pg"á< ·nZ.߿ﶧ_~}n8M>|vsU&c lmcߏy8IiAD+z=$X5ۜ&-PyK@P1cpttdFwN`Tw8{࠴ü b{*&&~a ۵\mS5ᘎ)#momJWmq5auom:Dù|޲,ٔ/Yה^%i㕗1XV)/tlה?Z[Mcjhi{KЀc]yK[+JJlhI惷/Wo˞+yL Y?-ZtzKV(RcM2ݔ~(a)]8BK܈m;- 5:{:ZW>?\e '8B偙@e5^!{`6VTWwaJm)ߔm”Z)[Zǧ!vL ݩ{`%fZ$,Oy v/ٚ,W+|NyA~o{L-1Q" pppm}n{=ӯviӇO7ͭ2yY^:ΰ@H%/8>Y=0[[dxY{*& b{*& b{*& b{*& b{*& b_)`%RyyyRnn7spppmnܼy +>TL`~ۿyh s]Z'5x1ېo._?}߼-Oa{&zТYT2KoҌ^@3Nj?}Ӈ7goΊBfHZF)b,h;[~%62/_yT2C_<,6n+%3ڮޜ]uM픒Wؔid=!ﰻ~I/ÔJ֒r>tS7?/Y|镗%Dא=;4rG8 R)3)TH64)= |}wmkܑ߽R5 ˗/_^-᥂ۡ!bɾ˷r''kwD8 -KŒ|W'kP RݡS,qy{ٜu`! )0/-Ͽ\>GNoL)3ޒI~]HJ0nO>_CbsmOOew߿`{ק_6Ӵ on7[eKC9O;4j ] a9ٶ+IGwXۼX3up| nnnnܼqe=TL`@P1=TL`@P1=TL`@P1=TL`J]__/͓rvs+nsw% !]b{}_CS~Woɔ0[:n-j/k#^6o~_߼7oS؆oˬgͽt/_xŏ>|ٛ7gE!_3O-#h-F w/I*pqW%9/u2~w]@IaC.O!_[Cv+zieCpsd Ac*+˵~a\O%h˗/_l+uv|ƭ|=p ["/ /].|;鯡{srX-Ͽ\>^ܧ:r痟7Ƶ9'[zlR| cu>pppm}n{j~ק_6Ӵ on7[eKC9@HW|lmI`~m^i! <<<ݼysc$<1P1=TL`@P1=TL`@P1=TL`@P1=TL`@P1=TL`@P1=TL`@P1=TL`@P1=TL`@P1=TL`@P1=TL`@P1=TL`@P1=TL`@P1=TL`@ž;E 72ꗫ_ΞΞΞO>}n3{; C>c+>TL`@P1=T+E@Jj {!L=I͐>Xrk.s|[]{5{X=G+T[q~a מZoL}4n-dyNlj[RCv5JODx^cTO'/v))|ִZ2ԒrR|NCqC y7sub*nW*`ОVۻӜD>d-R9f't-Ŷp6ͭr8ՇEJ{ Ǭ1P1=TL`@&MgDgN -\oka6ջERwI ,WǴ&`l[uھBfsi{Mph*Yfiy7/&D( Kעv\j ̵ 83@X&XN%Ki~RԒOv+ݹOX(<#gujz My;m^#5t*֒G/W\a^[汙6,YL~0STKSe2ZX~ɑrʥ,q.?9afhV׹G^6oPKqzqhGك o2q ƕ 󦯴Kռ7-fttV=G]bAݥ[^UؗƝS. #import @interface summaryWatcher : NSObject { IBOutlet id compLevelField; IBOutlet id sortSwitch; IBOutlet id sortMenu; IBOutlet id countDupSwitch; IBOutlet id projWideSwitch; IBOutlet id countBlanksSwitch; IBOutlet id resultClass; IBOutlet id resultWindow; IBOutlet id summFieldPopMenu; IBOutlet id summGroupPopMenu; IBOutlet id summGroupTable; IBOutlet id summGroupTypePopMenu; IBOutlet id summName; IBOutlet id summPane; IBOutlet id summReportPopMenu; IBOutlet id summTypePopMenu; IBOutlet id summSumFieldPopMenu; IBOutlet id summFieldType; IBOutlet id summFieldCompLevel; NSMutableDictionary *currReport; NSMutableArray *currGroups; int firstTimeFlag; } -(IBAction) resetFields: (id) sender; - (IBAction)addGroup:(id)sender; - (IBAction)addSummRep:(id)sender; - (IBAction)cancelSumm:(id)sender; - (IBAction)delAllGroup:(id)sender; - (IBAction)delAllSummRep:(id)sender; - (IBAction)delGroup:(id)sender; - (IBAction)delSummRep:(id)sender; - (IBAction)loadReport:(id)sender; - (IBAction)myAction:(id)sender; - (IBAction)okSumm:(id)sender; - (IBAction)suffleDownGroup:(id)sender; - (IBAction)suffleUpGroup:(id)sender; -(void) runSummReport: (NSDictionary *) r; -(NSMutableDictionary *) getCurrReport; -(IBAction) addSortStackToGroups: (id) sender; -(NSArray *) sortStack2Group; -(void) doSummary; @end gtamsanalyzer.app-0.42/Source/summaryWatcher.m0000555000175000017500000003245410162465511022010 0ustar brentbrent00000000000000#import "summaryWatcher.h" #import "MWSummaryReport.h" #import "myResults.h" #import "prefBoss.h" #import "utils.h" #import "MGWPopUpButton.h" int sortGroupTranslateTable[5] = {2, 4, 3, 1, 5}; int groupSortTranslateTable[6] = {0,3,0,2,1,4}; @implementation summaryWatcher -(id) init { [super init]; currGroups = [[NSMutableArray alloc] init]; firstTimeFlag = 1; return self; } -(void) dealloc { [currGroups release]; [super dealloc]; } -(void) buildReportMenu { NSArray *d; NSMutableArray *sd = [NSMutableArray array]; [summReportPopMenu removeAllItems]; d = [resultClass allSummReports]; if([d count] == 0) return; [sd addObjectsFromArray: d]; [sd sortUsingFunction: menuStringComp context: nil]; [summReportPopMenu addItemsWithTitles: sd]; } -(void) buildFieldMenu: (NSPopUpButton *) who { NSArray *d; NSMutableArray *sd = [NSMutableArray array]; NSMutableDictionary *dd; [who removeAllItems]; d = [resultClass hotData]; if([d count] == 0) return; dd = [d objectAtIndex: 0]; [sd addObjectsFromArray: [dd allKeys]]; [sd sortUsingFunction: menuStringComp context: nil]; [who addItemsWithTitles: sd]; } -(void) buildFieldMenus { [self buildFieldMenu: summFieldPopMenu]; [self buildFieldMenu: summSumFieldPopMenu]; [self buildFieldMenu: summGroupPopMenu]; } -(IBAction) addSortStackToGroups: (id) sender { NSArray *ngrp; NSDictionary *lo; NSString *tt; ngrp = [self sortStack2Group]; [currGroups addObjectsFromArray: ngrp]; lo = [ngrp lastObject]; [sortMenu selectItemAtIndex: 1]; //tt = [lo objectForKey: @"field"]; [summFieldPopMenu selectItemWithTitle: [lo objectForKey: @"field"]]; [summFieldType selectItemWithTag: [[lo objectForKey: @"type"] intValue]]; [summFieldCompLevel setIntValue: [[lo objectForKey: @"compLevel"] intValue]]; [summGroupTable reloadData]; } -(NSArray *) sortStack2Group { NSMutableArray *grps; NSMutableDictionary *ssi; NSArray *sst; int i, n; grps = [NSMutableArray array]; sst = [resultClass sortStackCopy]; n = [sst count]; for(i = 0; i < n; i++) { NSMutableDictionary *who; who = [sst objectAtIndex: i]; ssi = [NSMutableDictionary dictionary]; [ssi setObject: [[[who objectForKey: @"col"] copy] autorelease] forKey: @"field"]; [ssi setObject: [NSNumber numberWithInt: groupSortTranslateTable[([[who objectForKey: @"type"] intValue]) ] ]forKey: @"type"]; if([who objectForKey: @"codeLevel"] != nil) [ssi setObject: [[[who objectForKey: @"codeLevel"] copy] autorelease] forKey:@"compLevel" ]; else [ssi setObject: [NSNumber numberWithInt: 0] forKey:@"compLevel" ]; [grps addObject: ssi]; } return grps; } -(NSArray *) group2SortStack { NSMutableDictionary *ssi; NSMutableArray *sst; int i, n; sst = [NSMutableArray array]; n = [currGroups count]; for(i = 0; i < n; i++) { NSMutableDictionary *who; who = [currGroups objectAtIndex: i]; ssi = [NSMutableDictionary dictionary]; [ssi setObject: [[[who objectForKey: @"field"] copy] autorelease] forKey: @"col"]; [ssi setObject: [[[resultClass dateFormat] copy] autorelease] forKey: @"dateFormat"]; [ssi setObject: [NSNumber numberWithBool: YES] forKey: @"up"]; // if(i > 0) // [ssi setObject: [NSNumber numberWithInt: [[who objectForKey: @"type"] intValue] + 10] forKey: @"type"]; //else [ssi setObject: [NSNumber numberWithInt: sortGroupTranslateTable[([[who objectForKey: @"type"] intValue]) ] ]forKey: @"type"]; [ssi setObject: [[[who objectForKey: @"compLevel"] copy] autorelease] forKey: @"codeLevel"]; [sst addObject: ssi]; } return sst; } - (IBAction)addGroup:(id)sender { NSMutableDictionary *newGrp; newGrp = [NSMutableDictionary dictionary]; [newGrp setObject: [[[summGroupPopMenu titleOfSelectedItem] copy] autorelease] forKey: @"field"]; [newGrp setObject: [NSNumber numberWithInt: [[summGroupTypePopMenu selectedItem] tag]] forKey: @"type"]; if([[newGrp objectForKey: @"type"] intValue] == SRCODETYPE) [newGrp setObject: [NSNumber numberWithInt: [compLevelField intValue]] forKey: @"compLevel"]; else [newGrp setObject: [NSNumber numberWithInt: 0] forKey: @"compLevel"]; [currGroups addObject: newGrp]; [summGroupTable reloadData]; } - (IBAction)addSummRep:(id)sender { if([[summName stringValue] isEqualToString: @""]) { NSWARNING(@"You must provide a name"); return; } if([resultClass isSummReport: [summName stringValue]] == YES) { NSString *q; q = [NSString stringWithFormat: @"Overwrite report named \"%@\"?", [summName stringValue]]; if(NSYESNOQUESTION(q) == YES) { [resultClass delSummReport: [summName stringValue]]; } else return; } [resultClass addSummReport: [summName stringValue] report: [self getCurrReport] global: (([projWideSwitch state] == NSOnState)? YES : NO)]; [self buildReportMenu]; [summReportPopMenu selectItemWithTitle: [summName stringValue]]; } - (IBAction)cancelSumm:(id)sender { [summPane orderOut: sender]; [NSApp endSheet: summPane returnCode: 0]; } - (IBAction)delAllGroup:(id)sender { [currGroups removeAllObjects]; [summGroupTable reloadData]; } - (IBAction)delAllSummRep:(id)sender { NSArray *a; if(NSYESNOQUESTION(@"Delete all data summary reports?") == NO) return; a = [resultClass allSummReports]; FORALL(a) { [resultClass delSummReport: temp]; } ENDFORALL; [self buildReportMenu]; } - (IBAction)delGroup:(id)sender { int r; r = [summGroupTable selectedRow]; if(r >=0) [currGroups removeObjectAtIndex: r]; [summGroupTable reloadData]; } - (IBAction)delSummRep:(id)sender { NSString *who, *q; who = [summReportPopMenu titleOfSelectedItem]; q = [NSString stringWithFormat: @"Delete summary report: %@?",who]; if(NSYESNOQUESTION(q) == NO) return; if([resultClass isSummReport: who]) { [resultClass delSummReport: who]; [self buildReportMenu]; } } - (IBAction)loadReport:(id)sender { NSDictionary *rep; NSString *t = [summReportPopMenu titleOfSelectedItem]; rep = [resultClass summReport:t]; int n; [summName setStringValue: t]; if(rep != nil) { [currGroups removeAllObjects]; [currGroups addObjectsFromArray: [rep objectForKey: @"groupData"]]; [summFieldPopMenu selectItemWithTitle: [rep objectForKey: @"summField"]]; [countDupSwitch setIntValue: [[rep objectForKey: @"countDup"] intValue]]; [summFieldCompLevel setIntValue: [[rep objectForKey: @"compLevel"] intValue]]; [countDupSwitch setIntValue: [[rep objectForKey: @"countDup"] intValue]]; [summTypePopMenu selectItemWithTagNumber: [rep objectForKey: @"summType"]]; [summFieldType selectItem: [summFieldType itemAtIndex: [summFieldType indexOfItemWithTag: [[rep objectForKey: @"summFieldType"] intValue]]]]; //[summFieldType selectItemWithTagNumber: [rep objectForKey: @"summFieldType"]]; if([resultClass reportScope: t] == 2) [projWideSwitch setState: NSOnState]; else [projWideSwitch setState: NSOffState]; if([rep objectForKey: @"sort"] == nil) [sortMenu selectItemWithTag: 0]; else { if([rep objectForKey: @"sortType"] == nil) { [sortMenu selectItemWithTag: 1]; } else { n = [[rep objectForKey: @"sortType"] intValue]; if(n >= 0 && n <= 2) [sortMenu selectItemWithTag: n]; } } [summGroupTable reloadData]; } } - (IBAction)myAction:(id)sender { } - (IBAction)okSumm:(id)sender { /* if([self validSetName: [namedSelField stringValue]] == NO) { NSWARNING(@"You must use a unique set name"); return; } */ [summPane orderOut: sender]; [NSApp endSheet: summPane returnCode: 1]; } - (IBAction)suffleDownGroup:(id)sender { int r; int n = [currGroups count]; r = [summGroupTable selectedRow]; if(r < n - 1){ [currGroups exchangeObjectAtIndex: r withObjectAtIndex:r + 1]; [summGroupTable selectRow: r + 1 byExtendingSelection: NO]; } } - (IBAction)suffleUpGroup:(id)sender { int r; r = [summGroupTable selectedRow]; if(r > 0){ [currGroups exchangeObjectAtIndex:r withObjectAtIndex:r -1]; [summGroupTable selectRow: r - 1 byExtendingSelection: NO]; } } -(void) runSummReport: (NSDictionary *) r { MWSummaryReport *myReport; /* myReport = [[MWSummaryReport alloc] init]; [myReport setData: [resultClass hotData] andReport: r]; [myReport setDateFormat: [resultClass dateFormat]]; [NSBundle loadNibNamed: @"MWSummaryReport" owner: myReport]; [myReport makeWindowControllers]; [myReport windowControllerDidLoadNib: nil]; [[myReport window] makeKeyAndOrderFront: self]; [myReport buildSummary]; */ myReport = [[[MWSummaryReport alloc] init] autorelease]; [myReport setData: [resultClass hotData] andReport: r]; [myReport setDateFormat: [resultClass dateFormat]]; [myReport makeWindowControllers]; [[NSDocumentController sharedDocumentController] addDocument:myReport]; [myReport showWindows]; //[doc updateChangeCount:NSChangeDone]; // mark as dirty //[document showWindows]; [[myReport window] makeKeyAndOrderFront: self]; [myReport buildSummary]; } -(NSMutableDictionary *) getCurrReport { NSMutableDictionary *thisRep; thisRep = [NSMutableDictionary dictionary]; [thisRep setObject: [[currGroups copy] autorelease] forKey: @"groupData"]; [thisRep setObject: [[[summFieldPopMenu titleOfSelectedItem] copy] autorelease] forKey: @"summField"]; [thisRep setObject: [NSNumber numberWithInt: [countDupSwitch intValue]] forKey: @"countDup"]; [thisRep setObject: [NSNumber numberWithInt: [countBlanksSwitch intValue]] forKey: @"countBlank"]; [thisRep setObject: [NSNumber numberWithInt: [summFieldCompLevel intValue]] forKey: @"compLevel"]; [thisRep setObject: [NSNumber numberWithInt: [[summTypePopMenu selectedItem] tag]] forKey: @"summType"]; [thisRep setObject: [NSNumber numberWithInt: [[summFieldType selectedItem] tag]] forKey: @"summFieldType"]; [thisRep setObject: [NSNumber numberWithInt: [sortMenu tagOfSelectedItem]] forKey: @"sortType"]; switch([sortMenu tagOfSelectedItem]) { case 1: [thisRep setObject: [resultClass sortStackCopy] forKey: @"sort"]; break; case 2: [thisRep setObject: [self group2SortStack] forKey: @"sort"]; break; default:; }; return thisRep; } -(void) summaryDidEnd: (NSWindow *) mySheet returnCode: (int) returnCode contextInfo: (void *) contextInfo { if(returnCode) { id myReport; NSMutableDictionary *thisRep; thisRep = [self getCurrReport]; [self runSummReport: thisRep]; } } -(IBAction) resetFields: (id) sender { [currGroups removeAllObjects]; [summGroupTable reloadData]; [self buildFieldMenus]; [self buildReportMenu]; [summName setStringValue: @""]; [compLevelField setStringValue: @"0"]; [summFieldCompLevel setStringValue: @"0"]; [summFieldPopMenu selectItemAtIndex: 0]; [summGroupPopMenu selectItemAtIndex: 0]; [summGroupTypePopMenu selectItemAtIndex: 0]; [summFieldType selectItemAtIndex: 0]; [countDupSwitch setState: NSOnState]; [summTypePopMenu selectItemAtIndex: 0]; [countBlanksSwitch setState: NSOnState]; [projWideSwitch setState: NSOffState]; } -(void) doSummary { NSWindow *who; if(firstTimeFlag) { [self resetFields: nil]; firstTimeFlag = 0; } if([gPrefBoss detachedSheetValue]) who = nil; else who = resultWindow; [NSApp beginSheet: summPane modalForWindow: who modalDelegate: self didEndSelector: @selector(summaryDidEnd:returnCode:contextInfo:) contextInfo: nil]; } - (int)numberOfRowsInTableView:(NSTableView *)aTableView { int n = [currGroups count]; //NSLog(@"there are %d items in summ table\n", n); return n; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { NSString *val = [[currGroups objectAtIndex: rowIndex] objectForKey: [aTableColumn identifier]]; NSString *ident = [aTableColumn identifier]; if([ident isEqualToString: @"type"] == YES) { int type = [[[currGroups objectAtIndex: rowIndex] objectForKey: @"type"] intValue]; NSString *typeString; typeString = [[summGroupTypePopMenu itemAtIndex: [summGroupTypePopMenu indexOfItemWithTag: type ]] title]; if(type == SRCODETYPE) { return [NSString stringWithFormat: @"%@ (%d)", typeString, [[[currGroups objectAtIndex: rowIndex] objectForKey: @"compLevel"] intValue]]; } else return typeString; } return val; } @end gtamsanalyzer.app-0.42/Source/ta-rslt.tiff0000555000175000017500000033261410162465511021060 0ustar brentbrent00000000000000MM*@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW27=XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW$3flMsWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW9>=\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 1JWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*?~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#5kqWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW-[aWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+W]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -Z`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW/^dWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW,X^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+W]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.\bWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWX^ejrylhiojhjnihlpllqlhinjhiojhjnihlpllv}j[WWWWWWWWWWWWWWWWW"2bfWWWWWWWWWWWWWWWWWWWWWW[j}phinjhkrmimrkhjnihlpllqlhinjhiojc[O9""<`gWWWWWWWWWWWWWWWW.\bWWWWWWWWWWWWWWWWWWWWWg`< -rpYWWWWWWWWWWWWWW)SYWWWWWWWWWWWWWWWWWWWYpr- apWWWWWWWWWWWWWW$JOWWWWWWWWWWWWWWWWWWWpa  rgWWWWWWWWWWWWW5:WWWWWWWWWWWWWWWWWWgr-[WWWWWWWWWWWW WWWWWWWWWWWWWWWWW[)`jWWWWWWWWWWWWWWWWWWWWWWWWWWWWWlO<}WWWWWWWWWWWWWWWWWWWWWWWWWWWWW"$WWWWWWWWWWWWWWWWWWWWWWWWWWWWgJWWWWWWWWWWWWWWWWWWWWWWWWWWW[!WWWWWWWWWWWWWWWWWWWWWWWWWWWj`$WWWWWWWWWWWWWWWWWWWWWWWWWWW}<<}WWWWWWWWWWWWWWWWWWWWWWWWWWW `jWWWWWWWWWWWWWWWWWWWWWWWWWWW-[WWWWWWWWWWWWWWWWWWWWWWWWWWWp rgWWWWWWWWWWWWWWWWWWWWWWWWWWWWh apWWWWWWWWWWWWWWWWWWWWWWWWWWWWWi-rpYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWp]WWWWWWWWWWWWWWWWWWWWWWWj`|bWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWk~XWWWWWWWWWWWWWWWWWWWWWW}<NfWWWWWWWWWWWWWWWW$WWWWWWWWWWWWWWWWWWjcWWWWWWWWWWWWWWWWWWWWWW?qXWWWWWWWWWWWWWWWWp0vWWWWWWWWWWWWWWWWWW}7wWWWWWWWWWWWWWWWWWWWWWW@qWWWWWWWWWWWWWWWWWW]?lWWWWWWWWWWWWWWWWWWoWWWWWWWWWWWWWWWWWWWWWWl?rWWWWWWWWWWWWWWWWWWWWXlWWWWWWWWWWWWWWWWWWh3N]WWWWWWWWWWWWWWWWWWWWWc)wYWWWWWWWWWWWWWWWWWWWWvjWWWWWWWWWWWWWWWWWWcf.pWWWWWWWWWWWWWWWWWWWWWeWWWWWWWWWWWWWWWWWWWWWWTWWWWWWWWWWWWWWWWWW[WWWWWWWWWWWWWWWWWWWWWiAWWWWWWWWWWWWWWWWWWWWWWW6WWWWWWWWWWWWWWWWWWWg><}WWWWWWWWWWWWWWWWWWWWWWWW]~n/`jWWWWWWWWWWWWWWWWWWWWWWWWWXcr+[WWWWWWWWWWWWWWWWWWWWWWWWWWW}<qgWWWWWWWWWWWWWWWWWWWWWWWWWWWWj`\pWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[+ kpYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWgr=gWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWpa #endif gtamsanalyzer.app-0.42/Source/tableBrowser.h0000555000175000017500000000156110162465511021416 0ustar brentbrent00000000000000// // tableBrowser.h // TamsAnalyzer // // Created by matthew on Sat Jun 15 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import #import "TAMSCharEngine.h" @interface tableBrowser : NSDocument { IBOutlet NSTableView *theTable; NSMutableArray *theAData; NSMutableDictionary *theDData; NSMutableString *dataType; NSMutableArray *hotCodeList; IBOutlet NSWindow *myWindow; TAMSCharEngine *tce; } -(NSWindow *) window; -(void) setAData: (NSMutableArray *) ad; -(void) setDData: (NSMutableDictionary *) dd; -(void) setHotCodeList: (NSMutableArray *) hc; -(void) setDataType: (NSString *) dt; -(void) clearWindow; -(void) setupTable; -(void) buildCrossReference; -(void)buildCount; -(void)setCharEngine: (TAMSCharEngine *) who; - (void)windowControllerDidLoadNib:(NSWindowController *)windowController; @end gtamsanalyzer.app-0.42/Source/tableBrowser.m0000555000175000017500000002020210162465511021414 0ustar brentbrent00000000000000// // tableBrowser.m // TamsAnalyzer // // Created by matthew on Sat Jun 15 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import "tams.h" #import "tableBrowser.h" #import "ctQChar.h" //#import "ctReadChar.h" #import "xrefTableColumn.h" #import "utils.h" #import "tamsutils.h" #define COLWIDTH 90 @implementation tableBrowser /* initializers and accessors */ -(id) init { [super init]; dataType = [[NSMutableString alloc] init]; hotCodeList = [[NSMutableArray alloc] init]; //theDData = nil; return self; } -(void) dealloc { [dataType release]; [hotCodeList release]; //if(theDData != nil) [theDData release]; [super dealloc]; } -(void) setCharEngine: (TAMSCharEngine *) who { tce = who; } -(void) setHotCodeList: (NSMutableArray *) hc { [hotCodeList addObjectsFromArray: hc]; } -(NSWindow *) window { return myWindow; } -(void) printShowingPrintPanel: (BOOL) flag { NSPrintInfo *printInfo = [self printInfo]; NSPrintOperation *printOp; printOp = [NSPrintOperation printOperationWithView: theTable printInfo: printInfo]; [printOp setShowPanels: flag]; [printOp runOperation]; } /* Main loop */ - (void)windowControllerDidLoadNib:(NSWindowController *)windowController { [self clearWindow]; if([dataType isEqualToString: @"xref"] == YES) [self buildCrossReference]; else if([dataType isEqualToString: @"count"] == YES) [self buildCount]; } /* REAL LOOP */ -(void)buildCount { NSMutableDictionary *myMatrix; NSNumber *n; int nn; ctQChar *q; theDData = myMatrix = [[NSMutableDictionary alloc] init]; q = [[ctQChar alloc] init]; while([tce scanNext: q] != ENDOFALLFILES) { if([q tokentype] == TOKEN) { if((n = [theDData objectForKey: [q buff]]) != nil) { nn = [n intValue] + 1; [theDData setObject: [NSNumber numberWithInt: nn] forKey: [q buff]]; } else [theDData setObject: [NSNumber numberWithInt: 1] forKey: [q buff]]; } } [self setupTable]; [tce release]; [self updateChangeCount: NSChangeDone]; } -(void)buildCrossReference { NSMutableArray *myCol, *zoneList; NSMutableDictionary *myMatrix; xrefTableColumn *md; ctQChar *q; myCol = [[NSMutableArray alloc] init]; theDData = myMatrix = [[NSMutableDictionary alloc] init]; zoneList = [[NSMutableArray alloc] init]; //set up the matrix //[myMatrix setObject: myCol forKey: @"codeList"]; FORALL(hotCodeList) { [myMatrix setObject: [[xrefTableColumn alloc] init] forKey: temp]; } ENDFORALL; //do the data run q = [[ctQChar alloc] init]; [q retain]; while([tce scanNext:q] != ENDOFALLFILES) { //if it's a tag if([q tokentype] == TOKEN) { if([zoneList count]) { FORALL(zoneList) { //MD is the column for a particular code if(md = [myMatrix objectForKey: temp]) if([md hasName: [q buff]] == YES) { [md incName: [q buff]]; } else { [md addName: [q buff] withValue: 1]; } if(md = [myMatrix objectForKey: [q buff]]) if([md hasName: temp] == YES) { [md incName: temp]; } else { [md addName: temp withValue: 1]; } } ENDFORALL; } [zoneList addObject: [[q buff] copy]]; } if([q tokentype] == ENDTOKEN) { id ss; FORALL(zoneList) { if([temp isEqualToString: [q buff]]) ss = temp; } ENDFORALL; if(ss) [zoneList removeObject: ss]; } } [self setupTable]; [q release]; [tce release]; [self updateChangeCount: NSChangeDone]; } /* Document portion */ - (BOOL)validateMenuItem:(NSMenuItem *)anItem { BOOL ans = [super validateMenuItem: anItem]; if([[anItem title] isEqualToString: @"Save"] == YES) { return NO; } if([[anItem title] isEqualToString: @"Save As..."] == YES) { return NO; } return ans; } - (NSString *)windowNibName { // Implement this to return a nib to load OR implement -makeWindowControllers to manually create your controllers. return @"FreqCount"; } - (NSData *)dataRepresentationOfType:(NSString *)type { // Implement to provide a persistent data representation of your document OR remove this and implement the file-wrapper or file path based save methods. NSMutableData *dd; if([dataType isEqualToString: @"xref"] == YES) { int i, cnt; cnt = [hotCodeList count]; dd = [[NSMutableData alloc] init]; //print the top FORALL(hotCodeList) { DATATAB(dd); DATASTRING(dd, temp); } ENDFORALL; DATANL(dd); //Go through the hotcode list for(i = 0; i < cnt; i++) { //print the code name DATASTRING(dd, [hotCodeList objectAtIndex: i]); //print the data FORALL(hotCodeList) { char myNum[50]; xrefTableColumn *ccc = [theDData objectForKey: temp]; //get the column DATATAB(dd); sprintf(myNum,"%d", [ccc cntForName: [hotCodeList objectAtIndex: i]]); DATASTRING(dd, [NSString stringWithCString: myNum]); //write the data } ENDFORALL; DATANL(dd); } return dd; } if([dataType isEqualToString: @"count"] == YES) { dd = [[NSMutableData alloc] init]; FORALL(hotCodeList) { DATASTRING(dd, temp); DATATAB(dd); DATASTRING(dd, [[theDData objectForKey: temp] stringValue]); DATANL(dd); } ENDFORALL; return dd; } return nil; } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)type { // Implement to load a persistent data representation of your document OR remove this and implement the file-wrapper or file path based load methods. return YES; } /* table portion */ - (int)numberOfRowsInTableView:(NSTableView *)aTableView { if([dataType isEqualToString: @"xref"] == YES) { return [hotCodeList count]; } if([dataType isEqualToString: @"count"] == YES) { return [hotCodeList count]; } return 0; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn: (NSTableColumn *)aTableColumn row:(int)rowIndex { if([dataType isEqualToString: @"xref"] == YES) { xrefTableColumn *m; if([[aTableColumn identifier] isEqualToString: @"Codes"] == YES) { return [hotCodeList objectAtIndex: rowIndex]; } if(m = [theDData objectForKey: [aTableColumn identifier]]) { return [NSNumber numberWithInt: [m cntForName: [hotCodeList objectAtIndex: rowIndex]]]; } } if([dataType isEqualToString: @"count"] == YES) { if([[aTableColumn identifier] isEqualToString: @"Codes"] == YES) { return [hotCodeList objectAtIndex: rowIndex]; } else { NSNumber *n; n = [theDData objectForKey: [hotCodeList objectAtIndex: rowIndex]]; if(n) return n; else return [NSNumber numberWithInt: 0]; } } return @""; } /* Data portion */ -(void) setupTable { NSTableColumn *t; //check for xref if([dataType isEqualToString: @"xref"] == YES) { //get code list //make it the first column t = [[NSTableColumn alloc] initWithIdentifier: @"Codes"]; [theTable addTableColumn: t]; [t setWidth: COLWIDTH]; [[t headerCell] setStringValue: @"Codes"]; //Add a column for each and FORALL(hotCodeList) { t = [[NSTableColumn alloc] initWithIdentifier: temp]; [t setWidth: COLWIDTH]; [theTable addTableColumn: t]; [[t headerCell] setStringValue: temp]; }ENDFORALL; } if([dataType isEqualToString: @"count"] == YES) { t = [[NSTableColumn alloc] initWithIdentifier: @"Codes"]; [t setWidth: COLWIDTH]; [theTable addTableColumn: t]; [[t headerCell] setStringValue: @"Codes"]; t = [[NSTableColumn alloc] initWithIdentifier: @"Count"]; [t setWidth: COLWIDTH]; [theTable addTableColumn: t]; [[t headerCell] setStringValue: @"Count"]; } } -(void) setAData: (NSMutableArray *) ad {theAData = ad;} -(void) setDData: (NSMutableDictionary *) dd {theDData = dd;} -(void) setDataType: (NSString *) dt {[dataType setString: dt];} -(void) clearWindow { NSArray *tc = [theTable tableColumns]; NSTableColumn *t; NSEnumerator *ten; ten = [tc objectEnumerator]; while(t = [ten nextObject]) [theTable removeTableColumn: t]; } -(IBAction) niceClose: (id) Sender { [myWindow performClose: self]; } @end gtamsanalyzer.app-0.42/Source/tag2.tif0000555000175000017500000000647210162465511020161 0ustar brentbrent00000000000000MM* 휧ᝨὕ簹篸殸疢ߖߪ垩ᔠޔ䫵矪᥯㔠ޔ⡬⢭ᖡޔޔޔᝩᝩᝩᦰ唠ޔޔޔᛦ׺֔ޔޔߘߘߘߜᴽ۔ޔޔޔޓޓޗߞѻ㔠ޔޔޔޔޔސݏݐ{骰Ѽ䔠ޔތҔޔޔޏݐݔ⵽谷ح痢ߒ۔ޔߗߛᡫ瑝ړݔޔឩᡫ⡫⡬⤮------铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵DDDDDDߔޔޔޔޛ࡫⡫⢭⤮㦱䪴SSS춽SSSꕡޔޔޔޠ⣭㣮㤮㦱䪳aaaaaa풞ڔޔޔޤ㤮㥯㧱䪳孶tttttt哞ܔޔޔަ䧱䩳媴孶悂ꓟےۖޔޫ媳嫵孶殸沺甔菛׈ͩ갹籺糼跿ꧧ    3  @  * 2(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/tags4.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tag3.tif0000555000175000017500000000647010162465511020160 0ustar brentbrent00000000000000MM* "-4>%)>H +1;/9]d5?pw7@4>휧ᝨ᰹緪To&oహ疢ߖߪ屇)@)@䫵矪᥯q$Dc⢭⦰ᖡޔ޶k=[ȝᝩꕡޔޔޔޥ[|$&決&OW풞ڔޔޔޤ㬞Hc#Idΰ絾qx.8`h哞ܔޔޕܰ_-Niñ嵾'$ꓟےۖޔ޴E_ [yγqx菛׈ͩ΁!~]d"{%&$=GAK0:9BOW#W_S[mt%0w}"6?Zb&CL*(2X`    2  @  ( 0(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/tag3.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tag4.tif0000555000175000017500000000647010162465511020161 0ustar brentbrent00000000000000MM* "-4>%)>H +1;/9]d5?pw7@4>휧ᝨ᰹緪To&oహ疢ߖߪ屇)@)@䫵矪᥯q$Dc⢭⦰ᖡޔ޶k=[ȝᝩꕡޔޔޔޥ[|$&決&OW풞ڔޔޔޤ㬞Hc#Idΰ絾qx.8`h哞ܔޔޕܰ_-Niñ嵾'$ꓟےۖޔ޴E_ [yγqx菛׈ͩ΁!~]d"{%&$=GAK0:9BOW#W_S[mt%0w}"6?Zb&CL*(2X`    2  @  ( 0(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/tag2.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tags.tif0000555000175000017500000000647010162465511020260 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᥯㔠ޔޔޔޡ⡫⡬⢭ᖡޔޔޔޔޘߝᝩᝩᝩᦰ唠ޔޔޔޔޔޜᛦ׺֔ޔޔޔޔޙߘߘߘߜᴽ۔ޔޔޔޔޔޔޓޓޗߞѻ㔠ޔޔޔޔޔސݏݐ{骰Ѽ䔠ޔތҔޔޔޏݐݔ⵽谷ح痢ߒ۔ޔޔޔޖߗߛᡫ瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮------铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵DDDDDDߔޔޔޔޛ࡫⡫⢭⤮㦱䪴SSS춽SSSꕡޔޔޔޠ⣭㣮㤮㦱䪳aaaaaa풞ڔޔޔޤ㤮㥯㧱䪳孶tttttt哞ܔޔޔަ䧱䩳媴孶悂ꓟےۖޔޫ媳嫵孶殸沺甔菛׈ͩ갹籺糼跿ꧧ    2  @  ( 0(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/tags.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tams app small.tif0000555000175000017500000001047610162465511022121 0ustar brentbrent00000000000000MM*WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW4MWWWWWWWWWWWWW4MWWWWWWWWWWWWWWWWWWWW4MWW4MWW4MWWWWWWWWWWW WW 4M4MWWW4MW4M4MWWWWWWWWWWW W4MWWW4MWWW4MWWWWWWWWWW6PWW:UWW4MWWWW4MWW4MWWWWWWWWW6P4M4MWWWWWWW4M4M4MWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW   *@.6(R/Users/matthew/Desktop/tams app small.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tams app tiny.tif0000555000175000017500000000247610162465511021775 0ustar brentbrent00000000000000MM* "#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW )@.6(R/Users/matthew/Desktop/tams app tiny.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tams result icon large.tif0000555000175000017500000002414410162465511023547 0ustar brentbrent00000000000000MM*' UzRpNeVW!!!NcQmTwUzU{U{U{U{U{TwQmNcNcQmTwUzU{U{U{U{U{TwQmNcW&&&L^OfQmRpRpRpRpRpRpQmOfL^L^OfQmRpRpRpRpRpRpQmOgM`,,,KYL^NcNdNeNeNeNeNeNcL^KYKYL^NcNdNeNeNeNeNeNcL_L\,,,KYL^Nc7Fu 4:JzL^JYJYL^MbNdNeNeNeNeNeNcL_L\&&&L^OfQm ,>LuK\NdPkQnQoQpQpRpRpQmOgM`NcRpU{VW!!!NcQmTw)1JNdPlRqSuSwTyTzTzTwQmNcNdRpU{VWNdRpUzVU~Ot\0"3NbPhQmRrTwU{U}UzRpNdNeRpU{VWNeRpU{WVV|CPw") -RvTzTxRsPhM]PkPkMcNdRpU{VW&&&L^OfQm2KeQoQmPkOeM^JVzNeNdL_NcRpU{VW,,,KYL^Nc 18PL\M`M`M_L[JX~ISpIQjL^L]K[NbRpU{VW,,,KYL^Nc+/u '6cQlOeN_M]QoPmNdNdRpU{VWNeRpU{VWWWVU|L[L\L\MbQpTzU}U{TwRoPgN`PjPjNcNdRpU{VWPhPiNcNdRpU{VWPlPjNcNdRpU{VW!!!NcQmTwUzU{U{U{U{TzQnPhMaMbQmTwUzU{U{TzTySvRpPkMcNdRpU{VW&&&L^OfQmRpRpRpRpRpQpQpQoPkNeL^L^OfQmRpRpRpRpQpQoQoQnPlNfL_NcRpU{VW,,,KZL_NcNdNeNeNeNeNeNeNdMbL^KZKZL_NcNdNeNeNeNeNeNdNdMbM_L\NbRpU{VW)))L\M`NcNdNeNeNeNeNeNeNdNcM`L\L\M`NcNdNeNeNeNeNeNeNdNcM`L^NeRrU{VWOgPkQoRpRpRpRpRpRpRpRpQoPkOgOgPkQoRpRpRpRpRpRpRpRpQoPlPiQlSuV|VW SuTxUzU{U{U{U{U{U{U{U{UzTxSuSuTxUzU{U{U{U{U{U{U{U{UzTxSuTvUzV~VWV}V~V~VVVVVVVVV~V~V}V}V~V~VVVVVVVVV~V~V}V}V~VWWVVWWWWWWWWWWVVVVWWWWWWWWWWVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW04' O'(>@'(T(\(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/tams result icon large.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tams result icon large.xcf0000555000175000017500000001352410162465511023545 0ustar brentbrent00000000000000gimp xcf file04BB/ gimp-commentCreated with The GIMPS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  , & ,R       gimp-text-layer(text "R") (font "Comic Sans MS") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "c") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) ,,DDDJ՗<+ uG 4. x C  VfYK;z04Empty Layer#2     0404               ! !                         ! !                         ! !  I             ! !                         ! !                         ! !  I(+ Drop-Shadow      (+ (+ EEE  $$$'OOOOORRRRPa..aa..aQaSQQSaaSQQSaRϳSϳSaSQQSaaSQQSaRa..aa..aQSSSSQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQSSSSQa..aa..aQaSQQSaaSQQSaRϳSϳSaSQQSaaSQQSaRa..aa..aQSSSSQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQSSSSQa..aa..aQaSQQSaaSQQSaRͲRKmYRQQRYmmYRQQRYl{h7:++::++82    04Empty Layer#1     0404    Drop-Shadow#1       hHhHhH   '?MRRNF8'  'XdE)?Żb; MƽvF ShcríHTϮe2%/FgĮy=TͧW -SĢ`& TͦT %T»9TͥT5wƓGTͥT2tʙKTͦV &PŎCTϭd0 ",=[ɱs2 Tg]bpŶLTIJ¬Q& TȣvI$ T༈S*TϭØf9 Tҷ}\eɼnA Tͪ_.)>_{I! T̥U &DmįGPşP 2[l/ EE'Ou7 .]u].  !EitW* +6+ -5)     00 Empty Layer     0000    00 Background     0000 W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W                                                                                f" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "gtamsanalyzer.app-0.42/Source/tams result icon small.tif0000555000175000017500000001054410162465511023564 0ustar brentbrent00000000000000MM*@WWWWWWWWWWWWWWWWW^^^WWWWWWWWWWWWWWWWWWW^^^WWWWWWWWWWWWWWWWWW^^^WWWWW.D  >4LT|WWWWWWWWW 'CbWWWWWWWWWWWWWWLp3K $3KWWWWWWWWWWWWWWWU}*>z4MWWWWWWWWWWWWWWWW6PKnWWWWWWWWWWWWWWWW"3c#4eWWWWWWWWWWWWWWWWIk WWWWWWWWWWWWWWWWT{WWWWWWWWWWWWWWWW2J WWWWWWWWWWWWWWW8R&8mWWWWWWWWWWU~RxGi5N!A "QwWWWWWWWWW3MqWWWWWWWWWW)4MU~WWWWWWWWWWW$F0HjWWWWWWWWWWWWWNs)=w 8SWWWWWWWWWWWWWWNs-W1IWWWWWWWWWWWWWWW8S :UWWWWWWWWWWWWWWWFg  WWWWWWWWW"B >WWWWWWWJm %'MWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW@@   O>@T\(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/tams result icon small.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tams result icon small.xcf0000555000175000017500000000435610162465511023566 0ustar brentbrent00000000000000gimp xcf file BB/ gimp-commentCreated with The GIMPS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) #R      gimp-text-layer(text "R") (font "Comic Sans MS") (font-size 24.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "c") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) ##~wf:ihd_#)kZ-bd+YmYU1%ٰa  Empty Layer         Background     \ p EW W W W W W W W W W W W W W W W W W W W W W W W W W WdE                          dE                          d$@@@@Bgtamsanalyzer.app-0.42/Source/tams.h0000555000175000017500000000077110162465511017731 0ustar brentbrent00000000000000/* * untitled.h * TAMS Edit * * Created by matthew on Thu Apr 18 2002. * Copyright (c) 2001 Matthew Weinstein. All rights reserved. * */ #define COCOATAMS #define COCOAVERSION //#define METROWERKS //#define MACINTOSH //#define SYMANTEC //These are for the parser #define CHAR 0 #define TOKEN 1 #define ENDTOKEN 2 #define META 3 #define ENDMETA 4 #define ENDOFFILE 5 #define ENDOFALLFILES 6 #define MWCHAR unichar #define SCHAR '>' #define TEXTKLUDGE 1 #define SECTIONSEARCH #define USESXML 1 gtamsanalyzer.app-0.42/Source/tamsanalysis-1.tiff0000555000175000017500000014422310162465511022335 0ustar brentbrent00000000000000MM*(12< $2|X4 a&0a:CMU^Yg.pMy`[6}Y5[7]9_;a=c?eAgCiE!kG#mI%oK'qM»)×sOŽ+ƙuQnnnnnnnQ"  1|  dknnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnBHHQuickTime 5.0.62002:04:28 10:54:13MacOS 10.1.4O/Me}'9EWco{%17=IOU[ag:s1&b1Nc)Y!!N8[YN8!XYs!N51XV!RN5BX[q!bGXYpR\R!GX\ss!UI[\tcLc1+s[_RB/cR8R1F!c,1^_Bc,Bs2c> )1R^_!B)s2B1:1&!1^_!&5ss2R&1^bs&cR>BB)sB&R!a_%sDss !Bs#Ra_#BPBB!!#11aY#BsVsscB!s1"1^Ss#B_ss#USBc#B!YssR#s!US#csSRRsUY"M1s s[_!"1Gs!( a\R 1ARR,sR^\!c 1s;1s/^\1 R2s!81Ba[1 c1!c,RRAcB aY1R 1R!s&1sGB s[Y!11 s!Ps s!^VB1 1cc 1!RY!1Bc!R#1R[V 11Bcs_s#11[Ss!k1&XS s!(XPc!csB BUP!fR cUPBBcRXSBBUVsB!R[a[UOI=71%{ocWE9'}eM/Ogtamsanalyzer.app-0.42/Source/tamsanalysis-2.tiff0000555000175000017500000033265410162465511022345 0ustar brentbrent00000000000000MM*@sss111111ccc!!!!!!!!!sss!!!111!!!RRRBBB!!!RRRRRR!!!sss!!!cccccc111sssRRRBBBcccRRRRRR111!!!ccc111BBBcccBBBsssccc111RRR!!!BBBsssBBB111111!!!111!!!ssssssRRR111ssscccRRRBBBBBBsssBBBRRR!!!sssssssss!!!BBBsssRRRBBBBBBBBB!!!!!!111111BBBssssssssscccBBB!!!sss111111sssBBBssssssBBBcccBBB!!!ssssssRRRsss!!!cccsssRRRRRRsss111ssssss!!!111sss!!!RRR111RRRRRRsssRRR!!!ccc111sss111sss111RRRsss!!!111BBB111ccc111!!!cccRRRRRRcccBBB111RRR111RRR!!!sss111sssBBBsss!!!111111sss!!!ssssss!!!BBB111111cccccc111!!!RRR!!!111BBBccc!!!RRR111RRR111111BBBcccsssssssss111111sss!!!111sss!!!ccc!!!cccsssBBBBBB!!!RRRcccBBBBBBcccRRRBBBBBBsssBBB!!!RRR00000000UUUU8888Ti G&n@(R/Users/matthew/prog/tamsanalysis.work/tamsanalysis/tamsanalysis-2.tiffCreated with The GIMP(8HHgtamsanalyzer.app-0.42/Source/tamsanalysis-3.tif0000555000175000017500000033264010162465511022173 0ustar brentbrent00000000000000MM*@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsss111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRR!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWccc111WWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRBBBWWWWWWWWWWWWWWWWcccRRRWWWWWWWWWWWWWWWWWWWRRR111WWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!cccWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBcccWWWWWWWWWWWWWWWBBBsssWWWWWWWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!BBBWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWBBB111WWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWW!!!111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWcccRRRWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWWWWWWWWsssBBBWWWWWWWWWWWWWRRR!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWWWW!!!WBBBsssWWWWWWWWWWWWRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWW!!!!!!WWWWWWWWWWWW111111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWcccBBB!!!sss111WWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBcccWWWWWWWWWWWWBBB!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWRRRWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRRRRWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWRRRRRRWWWWWWWWWWWWWWWsssRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!cccWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWRRRWWWWWWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWW111BBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWccc111!!!WcccWWWWWWWWWWWWWWWRRRRRRWWWWWWWWWWWWWWWWWWWWWWcccBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111RRRWWWWWWWWWWW111RRR!!!WWsssWWWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWWWWWWBBBWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!111WWWWWWWWWWWWWW111WWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBB111WWWWWWWWWWW111ccccccWWWW111!!!WWWWWWWWWWRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!111BBBccc!!!RRRWWWWWWWWWWWW111RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111111WWWWWBBBcccWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWWWWW111111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccWWWWWWW!!!WWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssBBBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0000WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0000UUUU8888WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWTWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWiWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW <&bx@(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/tamsanalysis-3.tifCreated with The GIMP(8HHgtamsanalyzer.app-0.42/Source/tamsanalysis-3.tiff0000555000175000017500000033262210162465511022341 0ustar brentbrent00000000000000MM*@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsss111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRR!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWccc111WWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRBBBWWWWWWWWWWWWWWWWcccRRRWWWWWWWWWWWWWWWWWWWRRR111WWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!cccWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBcccWWWWWWWWWWWWWWWBBBsssWWWWWWWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!BBBWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWBBB111WWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWW!!!111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWcccRRRWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWWWWWWWWsssBBBWWWWWWWWWWWWWRRR!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWWWW!!!WBBBsssWWWWWWWWWWWWRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWW!!!!!!WWWWWWWWWWWW111111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWcccBBB!!!sss111WWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBcccWWWWWWWWWWWWBBB!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWRRRWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRRRRWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWRRRRRRWWWWWWWWWWWWWWWsssRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!cccWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWRRRWWWWWWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWW111BBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWccc111!!!WcccWWWWWWWWWWWWWWWRRRRRRWWWWWWWWWWWWWWWWWWWWWWcccBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111RRRWWWWWWWWWWW111RRR!!!WWsssWWWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWWWWWWBBBWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!111WWWWWWWWWWWWWW111WWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBB111WWWWWWWWWWW111ccccccWWWW111!!!WWWWWWWWWWRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!111BBBccc!!!RRRWWWWWWWWWWWW111RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111111WWWWWBBBcccWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWWWWW111111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccWWWWWWW!!!WWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssBBBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0000WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0000UUUU8888WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWTWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWiWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW .&Tj@v(R/Users/matthew/prog/TEST2/tamsanalysis-3.tiffCreated with The GIMP(8HHgtamsanalyzer.app-0.42/Source/tamsanalysis-4.tif0000555000175000017500000033262210162465511022174 0ustar brentbrent00000000000000MM*@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsss111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRR!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWccc111WWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRBBBWWWWWWWWWWWWWWWWcccRRRWWWWWWWWWWWWWWWWWWWRRR111WWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!cccWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBcccWWWWWWWWWWWWWWWBBBsssWWWWWWWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!BBBWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWBBB111WWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWW!!!111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWcccRRRWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWWWWWWWWsssBBBWWWWWWWWWWWWWRRR!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWWWW!!!WBBBsssWWWWWWWWWWWWRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWW!!!!!!WWWWWWWWWWWW111111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWcccBBB!!!sss111WWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBcccWWWWWWWWWWWWBBB!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWRRRWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRRRRWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWRRRRRRWWWWWWWWWWWWWWWsssRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!cccWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWRRRWWWWWWWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWW111BBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWccc111!!!WcccWWWWWWWWWWWWWWWRRRRRRWWWWWWWWWWWWWWWWWWWWWWcccBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111RRRWWWWWWWWWWW111RRR!!!WWsssWWWWWWWWWWWWW111sssWWWWWWWWWWWWWWWWWWWWWWWWBBBWWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!111WWWWWWWWWWWWWW111WWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWWWWsss!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBB111WWWWWWWWWWW111ccccccWWWW111!!!WWWWWWWWWWRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!111BBBccc!!!RRRWWWWWWWWWWWW111RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111111WWWWWBBBcccWWWWWWWWWWsssWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWssssssWWWWWWWWWWWW111111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW111WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccWWWWWWW!!!WWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssBBBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWRRRWWWWWWWWWWWcccWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcccRRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWBBBBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWsssBBBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW!!!RRRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0000WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0000UUUU8888WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWTWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWiWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW .&Tj@v(R/Users/matthew/prog/TEST2/tamsanalysis-3.tiffCreated with The GIMP(8HHgtamsanalyzer.app-0.42/Source/tamsanalysis-proj.tiff0000555000175000017500000033262610162465511023155 0ustar brentbrent00000000000000MM*@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW37=YWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW$4glNtWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:>>]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 2KWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW$6lqWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.\aWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW,X]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW .[`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 0_dWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW-Y^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW,X]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW/]bWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"2bfWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW/]bWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*TYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW%KOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW6:WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWCc:UCcWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWCc:UCcWWWWWCc:UCcWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:U *TWWWWWWWMq:UCcWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*T*TWWWWW*T0GWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0G :UWWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*T*TWWWWWWWCc90GWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW MqWWWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWCc:UCcWWWWWWWWMq WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMqWWWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:UWWWWWWWWWW:U*TWWWWWWWWWWWW:U:UWWWWWWWWWWWWCc:UCcWWWWWWWMq:U:UWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*T*TWWWWWWWWWW:U*TWWWWW:UW:U  :UWW:U*TW*T9WWWW0G &9pWWWWW:U*TWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW&9p*TWWWWWWWWWW:U*TWWWWWMq:UCc&9p:U*TMqWMq:U:U&9p*T*T*T*TWWW&9p CcWMq*T*TWWWWMq:U:U:U:U&9p*TWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:U&9pWWWWWWWWWW:U*TWWWWWWW MqWWW9&9pWWWW:U  MqWW*TWWCcMqWWWW CcWWWWWWWW:U*TWWWWWWWWCc*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMq  MqWWWWWWWWWWW:UWWWWWWW:UWWWW&9p9WWWW:UMqWWW*TWW*T*TWWWWW*T*TWWWWWWWW:U*TWWWWWWWWW*TCcWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*TMqWWWWWWWWWWWW:UWWWWWWWWWWWW:UWWWW:U*TWWWWWWWW:UWWWWW:UWWWWWWWW:U*TWWWWWWWWWW&9pWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:U0G9:UWWWWWWWWWWWW:UWWWWWWWWWWWW:UWWWW:U*TWWWWWWWW:UWWWWW:UWWWWWWWW:U*TWWWWWWWWW:U 90G:UWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW&9pCcWWWWWWWWWWW:UWWWWWWWWWWWW:UWWWW:U*TWWWWWWWW:UWWWWW:UWWWWWWWW:U*TWWWWWWWWW  WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:U*TWWWWWWWWWWW:UMqWWWWWWWWWWWW0G9WWWW:U*TWWWWWWWW 0GWWWWW0G WWWWWWWW:U*TWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0G*TWWWWWWWWWWWWWWWWWWWWWWWWW9&9pWWWW:U*TWWWWWWWW&9p9WWWWW*T&9pWWWWWWWW:U*TWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*T:UWWWWWWWWWW0G*T*TWWWWWWWWWWWCc MqWWWW:U*TWWWWWWWWMqCcWWWMqMqWWWWWWWW:U*TWWWWWWWWMq9WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW CcWWWWWWWWWW*TWWWWWWW9&9p:U&9p:UWWCc*T*T9 *T*T*T0GWWWWW:U&9p:U0G :UWWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0G*T*TWWWWWWW*T*TMqWWWCc*T*T*T*T*T*T*T*T0GWWWWWWMq*T*TCcWWWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW9:UWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:UWWWW&9p&9pWWWWWWWW:U9WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMq 9&9pCcWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:U:UWWW9CcWWWWWCc&9p*TCcWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMq&9p*T*TWWWWWWWWWWWWWWWMq:U:U:UCcWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:U*TMqW*T9WWWWWW*T9&9pMqWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:U*TWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWCc9*TMqWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[sXUUUUUUUUUUUUUUUUUUUUUUUVXlaWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWZ8............................6WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW8..............................=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWl...............................2fWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWCWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW1......4tjWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW`G....1HrYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0...3yYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW....1[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW/....9oYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW|5.....1B]}]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWZU........0=d~_WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:..........1:\kWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWzW/...........2taWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW`E/..........5WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWeF/........XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWcV9......8WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWvL....4WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2...7WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWn2...GWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWk]....|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWrU....6zWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWiV..../[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[....0`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWp8...0YWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0...UWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWt....WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWYV...0~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq7...>\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW....GWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWz....;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW1...2lWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWu7....H]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[;.....2hWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWF......0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW/......hWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWZ1.....^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW9....\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWp....^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWn....nWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWa...0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWG...e`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWy/0]lWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWiaWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 1&Xn@z(R/Users/matthew/prog/TEST2/tamsanalysis-proj.tiffCreated with The GIMP(8HHgtamsanalyzer.app-0.42/Source/TAMSCharEngine.h0000555000175000017500000000715010162465511021453 0ustar brentbrent00000000000000// // TAMSCharEngine.h // TamsAnalyzer // // Created by matthew on Sun Nov 17 2002. // Copyright (c) 2002 __MyCompanyName__. All rights reserved. // #import #import "ctQChar.h" #import "coderec.h" #import "tams.h" #import "utils.h" #import "MyDocument.h" #import "ctLimitCrit.h" #import "MWFile.h" #define STARTLIM 1 #define ENDLIM 2 #define INLIM 3 #define OUTLIM 4 #define SCANCODE 1 @interface TAMSCharEngine : NSObject { NSString *gTheData; MWFile *hotSearchDocument; NSMutableArray *gFileSearchList; NSEnumerator *searchEnum; unsigned dsLen; long newlinecnt; id gCurrentDataSource; id deadDataSource; BOOL eofFlag; //for unlimited NSMutableArray *ctRunVault; //for ctlimitfunc NSMutableArray *ctZoneVault; //for section runs NSMutableArray *tagVault; int inLimFlag ; int singleLimFlag; int escFlag; NSMutableString *ctLimString; NSMutableArray *ctLimitVault; NSScanner *currScan; int scanMode; BOOL scanEndFlag; BOOL scanVeryEndFlag; id gCurrentTAMS; int noParFlag, allowTabFlag; //for line numbers unsigned cln; NSMutableString *clnBuff; BOOL clnMode; BOOL hasLineNumbers; } -(id) initWithArrayAndStart: (id) who; -(id) initWithString: (id) who; #ifdef SCANCODE -(int) scanNext: (ctQChar *) qc; #endif -(id) initWithFile: (id) who; -(id) initWithFileAndStart: (id) who; -(id) initWithStringAndStart: (id) who; -(int) readQChar: (ctQChar *) qc atIndex: (int) where; -(MWCHAR) readCharAtIndex: (unsigned) where; -(int) readnext: (ctQChar *) qc; -(void) resetDataStream; -(NSArray *)hotFileList; -(BOOL) getEOF; -(BOOL) hasLineNumbers; #ifdef SECTIONSEARCH -(coderec *) ctOpenSectionRun; -(void) ctCloseSectionRun; -(void) ctCloseSectionTagForCode: (NSString *) mycode Coder: (NSString *) mycoder; -(BOOL) hasSectionRun; -(int) checkAnd: (NSArray *) andGrp forSection: (NSMutableArray *) sCodes; -(void) filterSectionRuns; -(int) isCurrSectionCode:(ctLimitCrit *)elem forSectionArray: (NSMutableArray *) who; -(void) ctAddSectionTag: (NSMutableDictionary *) md; -(coderec *) hotSectionRun; #endif -(void) addArrayToSearchList: (NSArray *) who; -(void) initSearchListSystem; -(void) addFileToSearchList: (MWFile *)who; -(void) clearSearchList; -(void) startSearch; -(void) resetDataStream; -(NSString *) gTheData; -(void) setGTheData: (NSString *) dd; -(MWFile *) hotSearchDocument; -(void) setCharLocation: (int) loc; -(int) getCharLocation; -(void) setGCurrentDataSource: (id) theSource; -(id) gCurrentDataSource; -(void) setNoPar:(int) value; -(void) setAllowTab: (int) value; -(void) setEscFlag: (BOOL) value; /* for unlimited */ -(void) ctInitRV; -(void) ctAddOpenChar:(ctQChar *) qq; -(void) ctOpenRun:(ctQChar *) qq; -(void) ctCloseRun: (ctQChar *) qq; -(void) ctCloseAllOpenRuns; -(int) israw; -(int) isrepeat: (ctQChar *) qq; -(NSMutableArray*) ctRunVault; /* from limitfunc */ -(void) setGCurrentTAMS: (id) who; -(id) gCurrentTAMS; -(NSMutableArray *) ctZoneVault; -(int) isStringTrue: (ctLimitCrit *)elem withCode: (NSString *)code withCoder: (NSString *)coder; -(void) zeroRuns; -(void) checkZones; -(void) handlelimit:(NSString *)buff; -(int) isinlimit ; -(void) ctAddZone: (ctQChar *)who ; -(void) ctAddLimChar: (ctQChar *) qq ; -(void) ctOpenLimRun: (ctQChar *) qq ; -(void) ctCloseLimRun: (ctQChar *) qq ; -(void) ctDelZone: (ctQChar *)who; -(int) handleLimChar: (ctQChar *) qq; -(void) initLimit; -(int) isCurrTrue: (ctLimitCrit *)elem; -(int) isTagTrue: (ctQChar *)s; -(void) handlelimit: (NSString *)buff; -(void) ctDelAllZones; -(int) scanNext: (ctQChar *) qc withWarnings: (BOOL) warn; @end gtamsanalyzer.app-0.42/Source/TAMSCharEngine.m0000555000175000017500000014566710162465511021500 0ustar brentbrent00000000000000// // TAMSCharEngine.m // TamsAnalyzer // // Created by matthew on Sun Nov 17 2002. // Copyright (c) 2002 __MyCompanyName__. All rights reserved. // #define MWCHAR unichar #define SCANSTRING 0 #define SCANTAG 1 #import "TAMSCharEngine.h" #include "tams.h" #include #include "newline.h" #include #import "MyDocument.h" #import "myResults.h" #import "tamsutils.h" #import "utils.h" #import "MWFakeFile.h" #import "MGWScanner.h" //#import "ctQChar.h" /* for ctlimitfunc */ #import "ctLimitFunc.h" #import "ctLimitCrit.h" //#import "ctReadChar.h" //#import "ctUnlimitedRuns.h" #import "coderec.h" #import "myResults.h" #import "prefBoss.h" #define PRINTCODER(X, Y) {if([gPrefBoss showCoder] && [(NSString *)Y length]){[X appendString:@" ["]; [X appendString: Y]; [X appendString: @"]"];}} @implementation TAMSCharEngine /* These are the readchar functions */ -(id) init { [super init]; gTheData = nil; newlinecnt = 0L; dsLen = 0; searchEnum = 0; gFileSearchList = [[NSMutableArray alloc] init]; ctLimitVault = nil; ctZoneVault = nil; ctLimString = nil; eofFlag = NO; cln = 0; noParFlag = 1; currScan = nil; scanMode = SCANSTRING; scanEndFlag = NO; scanVeryEndFlag = NO; allowTabFlag = 0; clnMode = YES; hasLineNumbers = NO; escFlag = -1; //means not externally set ctRunVault = [[NSMutableArray alloc] init]; tagVault = [[NSMutableArray alloc] init]; clnBuff = [[NSMutableString alloc] init]; ctLimitVault = [[NSMutableArray alloc] init]; //[ctLimitVault retain]; ctLimString = [[NSMutableString alloc] init]; ctZoneVault = [[NSMutableArray alloc] init]; if([gPrefBoss macNLValue] == 1) setnewline(MACNL); else setnewline(UNIXNL); inLimFlag = 0; return self; } -(id) initWithFile: (id) who { [self init]; [self addFileToSearchList: who]; return self; } -(id) initWithString: (id) who { MWFakeFile *ff; ff = [[[MWFakeFile alloc] initWithString: who] autorelease]; return [self initWithFile: ff]; } -(id) initWithFileAndStart: (id) who { [self init]; [self addFileToSearchList: who]; [self startSearch]; return self; } -(id) initWithStringAndStart: (id) who { MWFakeFile *ff; ff = [[[MWFakeFile alloc] initWithString: who] autorelease]; return [self initWithFileAndStart: ff]; } -(id) initWithArrayAndStart: (id) who { [self init]; [self addArrayToSearchList: who]; [self startSearch]; return self; } -(void) dealloc { if(currScan != nil) [currScan release]; [gFileSearchList release]; [ctRunVault release]; [ctLimitVault release]; [ctZoneVault release]; [ctLimString release]; [tagVault release]; [clnBuff release]; if(gTheData) [gTheData release]; [super dealloc]; } -(void) setGTheData: (NSString *) dd {if(gTheData) [gTheData release]; gTheData = dd; [dd retain];} - (long)getnewlinecnt {return newlinecnt;} -(void) setnewlinecnt:(long) n {newlinecnt = n;} -(void) incnewlinecnt {newlinecnt++;} -(void) setNoPar:(int) value {noParFlag = value;} -(int) nopar{return noParFlag;} -(int) allowtab { if(gCurrentTAMS) return [gCurrentTAMS global: @"tabflag"]; else return allowTabFlag; } -(void) setAllowTab: (int) value {allowTabFlag = value;} -(int) isquoteok{ if (gCurrentTAMS) return [gCurrentTAMS global: @"quoteflag"]; else return 1; } -(void) initSearchListSystem { dsLen = 0; searchEnum = 0; if(!gFileSearchList) gFileSearchList = [[NSMutableArray alloc] init]; } -(void) addFileToSearchList: (MWFile *)who { [gFileSearchList addObject: who]; } -(void) addArrayToSearchList: (NSArray *)who { [gFileSearchList addObjectsFromArray: who]; } -(NSArray *)hotFileList { return gFileSearchList; } -(void)setGCurrentDataSource: (id) theSource; { gCurrentDataSource = theSource; } -(id) gCurrentDataSource { return gCurrentDataSource; } -(void) setCharLocation: (int) loc { dsLen = loc; #ifdef SCANCODE if(currScan) [currScan setScanLocation: loc]; #endif } -(int) getCharLocation { return dsLen; } -(void) clearSearchList { [gFileSearchList removeAllObjects]; if(searchEnum) [searchEnum release]; searchEnum = nil; dsLen = 0; } -(void) startSearch { MWFile *oldDoc; dsLen = 0; if(searchEnum) [searchEnum release]; searchEnum = [gFileSearchList objectEnumerator]; [searchEnum retain]; oldDoc = hotSearchDocument; if(hotSearchDocument = [searchEnum nextObject]) { [self setGTheData: [hotSearchDocument string]]; #ifdef SCANCODE if(currScan != nil) [currScan release]; currScan = [[NSScanner alloc] initWithString: [self gTheData]]; [currScan setCharactersToBeSkipped: [NSCharacterSet characterSetWithCharactersInString: @""]]; #endif //[self setGTheData: [hotSearchDocument getData]]; } else { #ifdef SCANCODE if(currScan) [currScan release]; scanVeryEndFlag = YES; #endif if(gTheData) [gTheData release]; gTheData = nil; hotSearchDocument = oldDoc; } } -(NSString *) gTheData {return gTheData;} -(MWFile *) hotSearchDocument {return hotSearchDocument;} -(void) setEOF: (BOOL) what { eofFlag = what; } -(BOOL) getEOF { return eofFlag; } -(void) resetDataStream { dsLen = 0; [self setEOF: NO]; } -(MWCHAR) getNextChar { unsigned localtest; MWCHAR c; id oldDoc; if(!gTheData) {[self setEOF: YES]; return EOF;} localtest = dsLen; dsLen++; if(dsLen > [gTheData length]) { oldDoc = hotSearchDocument; if(hotSearchDocument = [searchEnum nextObject]) { MWFile* tempSearchDocument = hotSearchDocument; hotSearchDocument = oldDoc; //need to implement message with the oldDoc if([gTheData length] > 0) [self setCharLocation: [gTheData length] - 1]; else [self setCharLocation: 0]; [[NSNotificationCenter defaultCenter] postNotificationName:@"TAMSFileHasEnded" object: oldDoc]; hotSearchDocument = tempSearchDocument; [self setGTheData: [hotSearchDocument string]]; dsLen = 0; if([gTheData length]) c = [gTheData characterAtIndex: dsLen ]; else { dsLen++; return [self getNextChar]; } dsLen++; clnMode = YES; return c; } else { //[[NSNotificationCenter defaultCenter] // postNotificationName:@"TAMSFileHasEnded" object: oldDoc]; hotSearchDocument = oldDoc; [self setEOF: YES]; return EOF; } } return [gTheData characterAtIndex: dsLen - 1]; } -(BOOL) hasLineNumbers {return hasLineNumbers;} -(void) setEscFlag: (BOOL) value { escFlag = value; } -(BOOL) readEscape { if(escFlag == -1) { if(gCurrentTAMS) return [gCurrentTAMS global: @"escapeflag"]; else return [gPrefBoss escapeBracesValue]; } else return escFlag; } #define CLOSEBRACEERR [NSString stringWithFormat: @"Probable missing close brace in tag, file: %@", [[self hotSearchDocument] name]] #ifdef SCANCODE -(void) handleFileEnd { id ds; NSString *sss; if ([currScan isAtEnd]) { #ifndef SCANCODE [[NSNotificationCenter defaultCenter] postNotificationName:@"TAMSFileHasEnded" object: hotSearchDocument]; #endif ds = hotSearchDocument; hotSearchDocument = [searchEnum nextObject]; if(hotSearchDocument != nil) { newlinecnt = 0L; deadDataSource = ds; scanMode = SCANSTRING; [self setCharLocation: 0]; scanEndFlag = YES; scanVeryEndFlag = NO; if(currScan != nil) [currScan release]; sss = [hotSearchDocument string]; [self setGTheData: sss]; currScan = [[NSScanner alloc] initWithString: sss]; [currScan setCharactersToBeSkipped: [NSCharacterSet characterSetWithCharactersInString: @""]]; } else { deadDataSource = ds; hotSearchDocument = ds; scanEndFlag = YES; scanVeryEndFlag = YES; //if(currScan != nil) [currScan release]; //currScan = nil; } } } -(void) addNewLineCnt: (unsigned) amt { newlinecnt += amt; } -(void) setLoc { [self setCharLocation: [currScan scanLocation]]; } -(int) scanNextChar: (MWCHAR *) c { unsigned loc; if([currScan isAtEnd] == YES) { return ENDOFFILE; } loc = [currScan scanLocation]; *c = [gTheData characterAtIndex: loc]; [currScan next]; return CHAR; } #define SKIPWHITESPACE {NSString *__dummy; [currScan scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString: @"\t "] intoString: &__dummy];} #define HANDLEFILEEND(X,Y) {NSString *err; if([X isAtEnd]){[self handleFileEnd]; if(Y){err = [NSString stringWithFormat: @"Unexpected file end in %@", [self hotSearchDocument]]; NSWARNING(err);} [qc setSource: [self hotSearchDocument]]; return ENDOFFILE;}} -(void) scanForLN: (NSMutableString *) ans { unsigned i,n; NSRange r; MWCHAR ch; int imode; n = [ans length]; //look for a new line r = [ans rangeOfCharacterFromSet: [NSCharacterSet characterSetWithCharactersInString: @"\r\n"] options: NSBackwardsSearch]; if(r.location == NSNotFound) /*&& newlinecnt == 0)*/ { r.location = -1; } // else if (r.location == NSNotFound) // return; clnMode = YES; imode = 0; //read from there to end [clnBuff setString: @""]; for(i = r.location + 1; i < n; i++) { ch = [ans characterAtIndex:i]; //is it a number? if(ch >= '0' && ch <= '9' && (imode == 0 || imode == 1)) { [clnBuff ADDCHAR(ch)]; if(!imode) imode = 1; } else if (ch == '\t' && imode == 1) { cln = [clnBuff intValue]; clnMode = NO; [clnBuff setString: @""]; hasLineNumbers = YES; return; } else { clnMode = NO; [clnBuff setString: @""]; cln = 0; return; } } // is it aa tab //else } -(int) parseString: (NSMutableString *) ans into: (ctQChar *) qc { int r, n; if([ans length] == 0) { [qc addBuff: ans]; [qc setTokenType: CHAR]; //[qc setSource: [self hotSearchDocument]]; return CHAR; } if([gPrefBoss TAScanForLN]) { [self scanForLN: ans]; //scan backwards for a return or cr //are there numbers after that? //is there a tab after that } if( ![self allowtab]) { [ans replaceOccurrencesOfString: @"\t" withString: @"\\t" options: NSCaseInsensitiveSearch range: NSMakeRange(0, [ans length])]; } if([self nopar]) { n = [ans replaceOccurrencesOfString: @"\n" withString: @"\\n" options: NSCaseInsensitiveSearch range: NSMakeRange(0, [ans length])]; r = [ans replaceOccurrencesOfString: @"\r" withString: @"\\n" options: NSCaseInsensitiveSearch range: NSMakeRange(0, [ans length])]; //handle line numbering [self addNewLineCnt: n+r]; } else { n = [ans replaceOccurrencesOfString: @"\n" withString: [NSString stringWithFormat: @"%c", getnewline()] options: NSCaseInsensitiveSearch range: NSMakeRange(0, [ans length])]; r = [ans replaceOccurrencesOfString: @"\r" withString: [NSString stringWithFormat: @"%c", getnewline()] options: NSCaseInsensitiveSearch range: NSMakeRange(0, [ans length])]; [self addNewLineCnt: n+r]; } if(![self isquoteok]) { [ans replaceOccurrencesOfString: @"\"" withString: @"\\Q" options: NSCaseInsensitiveSearch range: NSMakeRange(0, [ans length])]; [ans replaceOccurrencesOfString: @"\'" withString: @"\\q" options: NSCaseInsensitiveSearch range: NSMakeRange(0, [ans length])]; } [qc addBuff: ans]; [qc setTokenType: CHAR]; //[qc setSource: [self hotSearchDocument]]; return CHAR; } #define TAGSCANSTART 0 #define TAGSCANCODE 1 #define TAGSCANCODER 2 #define TAGSCANCOMMENT 3 #define TAGSCANLIMINAL 4 -(int) parseTag: (NSMutableString *) ans into: (ctQChar *) qc { NSRange tr, cr, cmr; unsigned i, n; int md; MWCHAR ch; tr.location = cr.location = cmr.location = 0; tr.length = cr.length = cmr.length = 0; n = [ans length]; md = TAGSCANSTART; [qc setTokenType: TOKEN]; for(i = 0; i< n; i++) { ch = [ans characterAtIndex: i]; switch (md) { case TAGSCANSTART: if(ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') break; if(ch == '!') { [qc setTokenType: META]; break; } if(ch == '/' || ch == '\\') { [qc setTokenType: ENDTOKEN]; break; } else { tr.location = i; tr.length = 1; //just in case there is no more } md = TAGSCANCODE; break; case TAGSCANCODE: if(isCharLegal(ch) == NO) { if(ch == '[') { cr.location = i+1; md = TAGSCANCODER; break; } md = TAGSCANLIMINAL; tr.length = i - tr.location; break; } break; case TAGSCANLIMINAL: if(ch == ' ' || ch == '\n' || ch == '\r' || ch == ':') break; if(ch == '[') { cr.location = i+1; md = TAGSCANCODER; break; } md = TAGSCANCOMMENT; cmr.location = i; cmr.length = n -i; break; case TAGSCANCODER: if(ch == ']') { cr.length = i - cr.location; md = TAGSCANLIMINAL; break; } break; case TAGSCANCOMMENT: break; default: break; } } if(md == TAGSCANCODE) { tr.length = n - tr.location; } if(tr.length > 0) [qc setBuff: [ans substringWithRange: tr]]; if(cr.length > 0) [qc setCoder: [ans substringWithRange: cr]]; if(cmr.length > 0) [qc setExtra: [ans substringWithRange: cmr]]; return [qc tokentype]; } -(int) scanNext: (ctQChar *) qc withWarnings: (BOOL) warn { NSString *tr; NSMutableString *ans; BOOL fnd; MWCHAR ch; int tst; [qc clean]; //is there a current scanner? if([currScan scanLocation] == 0 || scanMode == SCANSTRING) [qc setWhere: [currScan scanLocation]]; else [qc setWhere: [currScan scanLocation] - 1]; //[qc setWhere: [self getCharLocation]]; if(cln) [qc setLine: cln]; if(scanEndFlag) { scanEndFlag = NO; [qc setSource: deadDataSource]; scanMode = SCANSTRING; return ENDOFFILE; } else if(scanVeryEndFlag) { [qc setSource: deadDataSource]; return ENDOFALLFILES; } [qc setSource: [self hotSearchDocument]]; [qc setBuff: @""]; ans = [NSMutableString string]; [ans setString: @""]; switch(scanMode) { case SCANSTRING: if([self readEscape])//[gPrefBoss TAScanForLN]) { while(1) { fnd = [currScan scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString: @"\\{"] intoString: &tr]; if (fnd == NO) { tr = [NSMutableString string]; } [ans appendString: tr]; if([currScan isAtEnd] == YES){ [qc setEnd: [currScan scanLocation]];[self handleFileEnd]; break;} tst = [self scanNextChar: &ch]; if([currScan isAtEnd] == YES) { if(warn)NSWARNING(@"Probable error at end of file"); [qc setEnd: [currScan scanLocation]]; [self handleFileEnd]; break; } if(ch == '\\') { [ans ADDCHAR(ch)]; tst = [self scanNextChar: &ch]; [qc setEnd: [currScan scanLocation]]; [ans ADDCHAR(ch)]; if([currScan isAtEnd] == YES) { [self handleFileEnd]; break; } } else if(ch == '{') { scanMode = SCANTAG; [qc setEnd: [currScan scanLocation] - 1]; //[self setCharLocation: [currScan scanLocation] - 1]; break; } } } else { while(1) { fnd = [currScan scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString: @"{"] intoString: &tr]; if (fnd == NO) { tr = [NSMutableString string]; } [ans appendString: tr]; if([currScan isAtEnd] == YES){[qc setEnd: [currScan scanLocation]];[self handleFileEnd]; break;} tst = [self scanNextChar: &ch]; if([currScan isAtEnd] == YES) { [qc setEnd: [currScan scanLocation]]; if(warn)NSWARNING(@"Probable error at end of file"); [self handleFileEnd]; break; } if(ch == '{') { [qc setEnd: [currScan scanLocation] - 1]; scanMode = SCANTAG; //[self setCharLocation: [currScan scanLocation] - 1]; break; } } } [self setLoc]; return [self parseString: ans into: qc]; break; case SCANTAG: if([self readEscape])//[gPrefBoss TAScanForLN]) { BOOL inquote; inquote = NO; while(1) { if(inquote == NO) { fnd = [currScan scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString: @"\"}\\"] intoString: &tr]; } else { fnd = [currScan scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString: @"\""] intoString: &tr]; } if (fnd == NO) { tr = [NSMutableString string]; } [ans appendString: tr]; if([currScan isAtEnd] == YES) { [qc setEnd: [currScan scanLocation]]; [self handleFileEnd]; if(warn)NSWARNING(@"Tag missing close brace at end of file"); break; } tst = [self scanNextChar: &ch]; if([currScan isAtEnd] == YES && ch == '"') { [ans ADDCHAR(ch)]; scanMode = SCANSTRING; [qc setEnd: [currScan scanLocation]]; if(warn)NSWARNING(@"Tag missing close brace at end of file"); [self handleFileEnd]; break; } if([currScan isAtEnd] == YES && ch == '\\') { [qc setEnd: [currScan scanLocation]]; scanMode = SCANSTRING; if(warn)NSWARNING(@"Tag missing close brace at end of file"); [self handleFileEnd]; break; } if(ch == '\\') { [ans ADDCHAR(ch)]; tst = [self scanNextChar: &ch]; [ans ADDCHAR(ch)]; if([currScan isAtEnd] == YES) { [qc setEnd: [currScan scanLocation]]; scanMode = SCANSTRING; [self handleFileEnd]; break; }//else continue } if(ch == '"') { [ans ADDCHAR(ch)]; if([currScan isAtEnd] == YES) { [qc setEnd: [currScan scanLocation]]; scanMode = SCANSTRING; [self handleFileEnd]; break; } else { if(inquote == YES) inquote = NO; else inquote = YES; continue; } } else if(ch == '}') { [qc setEnd: [currScan scanLocation]]; if([currScan isAtEnd] == YES) [self handleFileEnd]; scanMode = SCANSTRING; break; } //else break; //there's some sort of error! } } else { BOOL inquote; inquote = NO; while(1) { if(inquote == NO) { fnd = [currScan scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString: @"\"}\\"] intoString: &tr]; } else { fnd = [currScan scanUpToCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString: @"\""] intoString: &tr]; } if (fnd == NO) { tr = [NSMutableString string]; } [ans appendString: tr]; if([currScan isAtEnd] == YES) { scanMode = SCANSTRING; [qc setEnd: [currScan scanLocation]]; [self handleFileEnd]; if(warn) NSWARNING(@"Tag missing close brace at end of file"); break; } tst = [self scanNextChar: &ch]; if([currScan isAtEnd] == YES && ch == '\"') { [ans ADDCHAR(ch)]; scanMode = SCANSTRING; if(warn) NSWARNING(@"Tag missing close brace at end of file"); [qc setEnd: [currScan scanLocation]]; [self handleFileEnd]; break; } if(ch == '"') { [ans ADDCHAR(ch)]; if([currScan isAtEnd] == YES) { [qc setEnd: [currScan scanLocation]]; scanMode = SCANSTRING; [self handleFileEnd]; break; } else { if(inquote == YES) inquote = NO; else inquote = YES; continue; } } if(ch == '}') { [qc setEnd: [currScan scanLocation]]; if([currScan isAtEnd] == YES) [self handleFileEnd]; scanMode = SCANSTRING; break; } } } [self setLoc]; //scanMode = SCANSTRING; return [self parseTag: ans into: qc]; break; } return 0; } -(int) scanNext: (ctQChar *) qc { return [self scanNext: qc withWarnings: YES]; } #endif -(int) readnext: (ctQChar *)qc { MWCHAR c; int i; int meta; int etag; c = [self getNextChar]; [qc setBuff: @""]; [qc setExtra: @""]; [qc setCoder: @""]; [qc setWhere: dsLen - 1]; if(c != '{' /*|| ([gCurrentTAMS global: @"startflag"] == 0)*/) { /* situation normal */ //handle line numbering if([gPrefBoss TAScanForLN]) { if(clnMode == YES) { if(c== '\t') { cln = [clnBuff intValue]; clnMode = NO; [clnBuff setString: @""]; hasLineNumbers = YES; } else if(c >= '0' && c <= '9') { [clnBuff ADDCHAR(c)]; } else { clnMode = NO; [clnBuff setString: @""]; cln = 0; } } else if(isnewline(c)) { clnMode = YES; } } if(isnewline(c)) [self incnewlinecnt]; if ([self getEOF]) { return EOF; } if(isnewline(c) && [self nopar]) { [qc setBuff: @"\\n"]; } else if(isnewline(c) && getnewline()) { c = getnewline(); } else if(c == '\t' && ! [self allowtab]) { [qc setBuff: @"\\t"]; } else if(c == '\"' && ![self isquoteok]) { [qc setBuff: @"\\Q"]; } else if(c == '\'' && ![self isquoteok]) { [qc setBuff: @"\\q"]; } else if(c == '\\' && [self readEscape]) { [[qc buff] ADDCHAR([self getNextChar])]; } else { [[qc buff] ADDCHAR(c)]; } [qc setTokenType: CHAR]; return 1; } /* we're in a tag so read the name */ i =0; c = [self getNextChar]; [qc setTokenType: TOKEN]; if(cln) [qc setLine: cln]; meta = etag = 0; if(c == '!') {meta = 1; [qc setTokenType: META];} else if(c == '\\' || c == '/') { etag =1; [qc setTokenType: ENDTOKEN]; [qc setExtra: @""]; } else { if(c == '{') NSWARNING(CLOSEBRACEERR); [[qc buff] ADDCHAR(c)]; } { //this is for everyone to read in the name for(;;) { c = [self getNextChar];//fgetc(getcurrfile()); if(!isCharLegal(c)) //(isalnum(c) || c == '_' || c == SCHAR) ) { break; } else { [[qc buff] ADDCHAR(c)]; } } } if(c == ' ') while((c = [self getNextChar]) == ' ') ; if(c == '{') NSWARNING(CLOSEBRACEERR); if(c == '[') { while((c = [self getNextChar]) != ']') [[qc coder] ADDCHAR(c)]; c = [self getNextChar]; } if(c == ' ') while((c = [self getNextChar]) == ' '); if(c == '}') return [qc tokentype]; if (c == ':' || c == ' ' || c == ';') c = [self getNextChar]; //else [[qc extra] ADDCHAR (c)]; { //this block is for reading the rest of the message int startflag; startflag = 1; i = 0; do //while((c = [self getNextChar]) != '}') { if(startflag && c == ' ') continue; startflag = 0; //if(c == '}') break; [[qc extra] ADDCHAR(c)]; if(c == '\"') //read til you find another { while((c = [self getNextChar]) != '\"' && [self getEOF] == NO) [[qc extra] ADDCHAR(c)]; if([self getEOF] == NO) [[qc extra] ADDCHAR(c)]; } if(c == '{') NSWARNING(CLOSEBRACEERR); } while((c = [self getNextChar]) != '}' && [self getEOF] == NO); } //if([qc tokentype] == ENDTOKEN) [qc setWhere: dsLen]; return [qc tokentype]; } -(NSString *) reformatString //string is set at init time { ctQChar *qq = [[ctQChar alloc] init]; NSMutableString *ans = [NSMutableString string]; while([self readnext: qq] != EOF && [self getEOF] == NO) { if([qq tokentype] == META) { if([[qq buff] isEqualToString: @"end"] == YES || [[qq buff] isEqualToString: @"endsection"]) ; else continue; } [ans appendString: stringForQChar(qq, NO)]; } return ans; } -(int) readQChar: (ctQChar *) qc atIndex: (int) where { int cloc; int ans; cloc = [self getCharLocation]; [self setCharLocation: where]; ans = [self readnext: qc]; [self setCharLocation: where]; return ans; } -(MWCHAR) readCharAtIndex: (unsigned) where { return [gTheData characterAtIndex: where]; } /* Functions for ctunlimitedruns */ -(void) ctInitRV { if(ctRunVault) { if(ctRunVault) [ctRunVault release]; //we may need to get rid of this stuff // [ctRunVault removeAllObjects]; } ctRunVault = [[NSMutableArray alloc] init]; [ctRunVault retain]; } -(void) ctAddOpenChar:(ctQChar *)qq { FORALL(ctRunVault) { if(([temp openRun] == YES) /*&& !isrepeat(qq)*/) { switch([qq tokentype]) { case CHAR: [(coderec *)temp addString: [qq buff]]; break; case TOKEN: if([self israw] && ( [gCurrentTAMS isRepeat: [temp theName]] == NO)) { [(coderec *)temp addString: @"{"]; [(coderec *)temp addString: [qq buff]]; //add coder PRINTCODER((coderec *)temp, [qq coder]); [(coderec *)temp addString: @"}"]; } break; case ENDTOKEN: if([self israw] && ( [gCurrentTAMS isRepeat: [temp theName]] == NO)) { [(coderec *)temp addString: @"{/"]; [(coderec *)temp addString: [qq buff]]; //add coder PRINTCODER((coderec *)temp, [qq coder]); if([temp runType] == SECTIONRUN && [[qq extra] isEqualToString: @""] == NO) [(coderec *) temp addString: [NSString stringWithFormat: @": %@", [qq extra]]]; [(coderec *)temp addString: @"}"]; } default:; }; } } ENDFORALL; } -(int) isrepeat: (ctQChar *)qq { if(gCurrentTAMS) return [gCurrentTAMS isRepeat: [qq buff]]; else return 0; } -(void) ctOpenRepeatRun: (ctQChar *)qq { coderec *cr; /* if ([self isrepeat: qq] && ![self issimple]) return;*/ cr = [[coderec alloc] init]; [cr setName: [qq buff]]; [cr setBegin: [qq where]]; [cr setCoder: [qq coder]]; [cr setLineStart: [qq line]]; [cr setDoc: hotSearchDocument]; [cr setOpen: YES]; [cr setRunType: REPEATRUN]; [cr autorelease]; [ctRunVault addObject: cr]; //need to add current state at this point! //need to add self tothe current state } #ifdef SECTIONSEARCH -(BOOL) hasSectionRun { FORALL(ctRunVault) { if( [(coderec *)temp runType] == SECTIONRUN) return YES; } ENDFORALL; return NO; } -(void) ctCloseSectionTagForCode: (NSString *) mycode Coder: (NSString *) mycoder { coderec *who; NSMutableArray *myCodes; who = [self hotSectionRun]; if(who == nil) return; myCodes = [who sectionCodes]; FORALL(myCodes) { if([[temp objectForKey: @"code"] isEqualToString: mycode] && [[temp objectForKey: @"coder"] isEqualToString: mycoder]) { if([[temp objectForKey: @"state"] isEqualTo: @"Open"]) { [temp setObject: @"Closed" forKey: @"state"]; } } } ENDFORALL; } -(void) ctAddSectionTag: (NSMutableDictionary *) md { coderec *who; NSMutableArray *myCodes; who = [self hotSectionRun]; myCodes = [who sectionCodes]; FORALL(myCodes) { if([[temp objectForKey: @"code"] isEqualToString: [md objectForKey:@"code"]] && [[temp objectForKey: @"coder"] isEqualToString: [md objectForKey: @"coder"]]) { if([[temp objectForKey: @"state"] isEqualTo: @"Closed"]) { [temp setObject: @"Open" forKey: @"state"]; return; } } } ENDFORALL; [myCodes addObject: md]; } -(coderec *) hotSectionRun { FORALL(ctRunVault) { if([temp runType] == SECTIONRUN) return temp; } ENDFORALL; return nil; } -(coderec *) ctOpenSectionRun { coderec *cr; /* if ([self isrepeat: qq] && ![self issimple]) return;*/ cr = [[coderec alloc] init]; [cr setName: @""]; [cr setBegin: [self getCharLocation]]; [cr setCoder: @""]; [cr setDoc: hotSearchDocument]; [cr setOpen: YES]; [cr setRunType: SECTIONRUN]; [self cleanUpTagVault]; [[cr sectionCodes] addObjectsFromArray: tagVault]; [cr autorelease]; [ctRunVault addObject: cr]; //need to add current state at this point! //need to add self tothe current state return cr; } -(void) cleanUpTagVault { NSALLOC(NSMutableArray, tempAr); FORALL(tagVault) { if([[temp objectForKey: @"state"] isEqualToString: @"Closed"] == YES) [tempAr addObject: temp]; } ENDFORALL; FORALL(tempAr) { [tagVault removeObject: temp]; }ENDFORALL ; [tempAr release]; //[tagVault removeAllObjects]; } -(void) ctCloseSectionRun { FORALL(ctRunVault) { if( ([(coderec *)temp runType] == SECTIONRUN) &&( [temp openRun] == YES)) //add coder here too { [self cleanUpTagVault]; [tagVault addObjectsFromArray: [temp sectionCodes]]; [temp setOpen: NO]; [temp setEnd: [self getCharLocation]]; return; } } ENDFORALL; //need to check out of the current state } -(BOOL) hasLimit { if([ctLimitVault count]) return YES; else return NO; } -(int) checkAnd: (NSArray *) andGrp forSection: (NSMutableArray *) sCodes { int ans; ans = 1; FORALL(andGrp) { if([self isCurrSectionCode:temp forSectionArray:sCodes]) ans = ans *1; else ans = ans *0; } ENDFORALL; if(ans) return 1; else return 0; } -(BOOL) isSectionRunOK: (coderec *) who { int ans; ans = 0; FORALL(ctLimitVault) { ans+= [self checkAnd: (NSArray *)temp forSection: (NSMutableArray *) [who sectionCodes]]; } ENDFORALL; if(ans) return YES; else return NO; } -(void) filterSectionRuns { NSALLOC(NSMutableArray, deleteme); if([self hasLimit] == NO) { [deleteme release]; return; } FORALL(ctRunVault) { if([temp runType] == SECTIONRUN) if([self isSectionRunOK: temp] == NO) [deleteme addObject: temp];/* { int i, j, n; NSArray *ma; NSString *what; ma = [temp sectionCodes]; n = [ma count]; for(i = 0; i < n; i++) what = [[ma objectAtIndex: i] objectForKey: @"code"]; }*/ }ENDFORALL; [ctRunVault removeObjectsInArray: deleteme]; [deleteme release]; } #endif -(void) ctOpenRun: (ctQChar *)qq { coderec *cr; /* if ([self isrepeat: qq] && ![self issimple]) return;*/ if([gCurrentTAMS isBlocked: [qq buff]] == YES) return; cr = [[coderec alloc] init]; if([self israw] && ![self isrepeat:qq]) { FORALL(ctZoneVault) { [[cr record] appendString: @"{"]; [[cr record] appendString: [temp objectForKey: @"codeName"]]; //add coder PRINTCODER([cr record], [temp objectForKey:@"coderName"]); [[cr record] appendString: @"}"]; }ENDFORALL; } [cr setName: [qq buff]]; [cr setBegin: [qq where]]; [cr setCoder: [qq coder]]; [cr setLineStart: [qq line]]; [cr setDoc: hotSearchDocument]; [cr setOpen: YES]; if([self isrepeat: qq]) [cr setRunType: REPEATRUN]; [cr autorelease]; [ctRunVault addObject: cr]; //need to add current state at this point! //need to add self tothe current state } -(void) ctCloseAllOpenRuns { FORALL(ctRunVault) { if([temp openRun] == YES) { if([self israw]) { [[temp record] appendString: @"{/EOF}"]; } [temp setOpen: NO]; [temp setComment: @"End of file found without close tag"]; [temp setEnd: [self getCharLocation]]; } } ENDFORALL; //need to check out of the current state } -(void) ctCloseRun: (ctQChar *)qq { FORALL(ctRunVault) { if(([[(coderec *)temp theName] isEqualToString: [qq buff]] == YES) &&( [temp openRun] == YES) && ([[(coderec *) temp theCoder] isEqualToString: [qq coder]])) //add coder here too { if([self israw] && ( [gCurrentTAMS isRepeat: [temp theName]] == NO)) { [[temp record] appendString: @"{/"]; [[temp record] appendString: [qq buff]]; //add coder PRINTCODER([temp record], [qq coder]); [[temp record] appendString: @"}"]; } [temp setOpen: NO]; [temp setComment: [qq extra]]; [temp setEnd: [qq where]]; return; } } ENDFORALL; //need to check out of the current state } -(int) issimple { if (gCurrentTAMS) return [gCurrentTAMS global: @"simpleflag"]; else return 0; } -(int) israw { if (gCurrentTAMS) return [gCurrentTAMS global: @"rawflag"]; else return 0; } /* functions from ctlimitfunc */ /***********/ -(NSMutableArray*) ctRunVault{return ctRunVault;} -(NSMutableArray *) ctZoneVault {return ctZoneVault;} -(void) setGCurrentTAMS: (id) who {gCurrentTAMS = who;} -(id) gCurrentTAMS {return gCurrentTAMS;} //zone management -(void) ctAddZone: (ctQChar *)who { NSMutableDictionary *dd; dd = [[NSMutableDictionary alloc] init]; [dd setObject: [[who buff] copy] forKey: @"codeName"]; [dd setObject: [[who coder] copy] forKey: @"coderName"]; [ctZoneVault addObject:dd]; } -(void) ctAddLimChar:(ctQChar *)qq { FORALL(ctRunVault) { if(([temp openRun] == YES) /*&& !isrepeat(qq)*/) { switch([qq tokentype]) { case CHAR: [(coderec *)temp addString: [qq buff]]; break; case TOKEN: if([self israw] && [(coderec *) temp runType] != REPEATRUN /*([gCurrentTAMS isRepeat: [temp theName]] == NO)*/) { [(coderec *)temp addString: @"{"]; [(coderec *)temp addString: [qq buff]]; //add coder PRINTCODER((coderec *)temp, [qq coder]); if([[qq coder] length]) {[(coderec *)temp appendString:@"["]; [(coderec *)temp appendString: [qq coder]]; [(coderec *)temp appendString: @"]"];} [(coderec *)temp addString: @"}"]; } break; case ENDTOKEN: if([self israw] && ([gCurrentTAMS isRepeat: [temp theName]] == NO)) { [(coderec *)temp addString: @"{/"]; [(coderec *)temp addString: [qq buff]]; //add coder PRINTCODER((coderec *)temp, [qq coder]); [(coderec *)temp addString: @"}"]; } default:; }; } } ENDFORALL; } -(void) ctOpenLimRun:(ctQChar *)qq { coderec *cr; cr = [[coderec alloc] init]; [cr setLineStart: [qq line]]; if([self israw] /*&& ![self isrepeat: qq]*/) { FORALL(ctZoneVault) { [[cr record] appendString: @"{"]; [[cr record] appendString: [temp objectForKey: @"codeName"]]; if([[temp objectForKey: @"coderName"] isEqualToString: @""] == YES) ; else //add coder { PRINTCODER([cr record], [temp objectForKey: @"coderName"]); } /* old code { [[cr record] appendString: @"["]; [[cr record] appendString: [temp objectForKey: @"coderName"]]; [[cr record] appendString: @"]"]; } */ [[cr record] appendString: @"}"]; }ENDFORALL; } if(singleLimFlag) { NSMutableString *sss = [[NSMutableString alloc] init]; [sss setString: @"+"]; [sss appendString: [qq buff]]; [cr setName: sss]; } else { NSMutableString *sss = [[NSMutableString alloc] init]; [sss setString: @"-"]; [sss appendString: [gCurrentTAMS limString]]; [cr setName: sss]; } [cr setBegin: [qq where]]; [cr setDoc: hotSearchDocument]; [cr setOpen: YES]; [cr autorelease]; [ctRunVault addObject: cr]; //need to add current state at this point! //need to add self tothe current state } -(void) ctCloseLimRun:(ctQChar *)qq { if([self israw]) { FORALL(ctRunVault) { if([temp openRun] == YES && ([gCurrentTAMS isRepeat: [temp theName]] == NO)) { [[temp record] appendString: @"{/"]; [[temp record] appendString: [qq buff]]; //add coder PRINTCODER([temp record], [qq coder]); [[temp record] appendString: @"}"]; } } ENDFORALL; } FORALL(ctRunVault) { if([temp openRun] == YES && ([gCurrentTAMS isRepeat: [temp theName]] == NO) ) { [temp setOpen: NO]; [temp setEnd: [qq where]]; [temp setComment: [qq extra]]; return; } } ENDFORALL; //need to check out of the current state } -(void) checkZones { if([ctZoneVault count]) NSWARNING(@"There are passages missing a close tag; run \"check code pairs\" on your files"); } -(void) ctDelAllZones { [ctZoneVault removeAllObjects]; } -(void) ctDelZone:(ctQChar *)who { id theOne; FORALL(ctZoneVault) { theOne = nil; if([[temp objectForKey: @"codeName"] isEqualToString: [who buff]] && [[temp objectForKey: @"coderName"] isEqualToString: [who coder]]) { theOne = temp; break; } } ENDFORALL; if (theOne != nil) [ctZoneVault removeObject: theOne]; else NSWARNING(@"There are formatting errors in your file; run check code pairs"); //[theOne release]; } -(int) handleLimChar:(ctQChar *)qq { if([qq tokentype] == META) [gCurrentTAMS handlemeta: qq]; if([qq tokentype] == TOKEN) { // if([gPrefBoss nonSimpleRepeatValue] == 0 && [self isrepeat: qq] && ![self issimple]) ; // else [self ctAddZone: qq]; if([gCurrentTAMS isRepeat: [qq buff]] && ([gCurrentTAMS isBlocked: [qq buff]] == NO)) { [self ctOpenRepeatRun: qq]; if([gPrefBoss nonSimpleRepeatValue] == 0 && ![self issimple]) { if(inLimFlag == 1) return INLIM; else return OUTLIM; } } } else if([qq tokentype ] == ENDTOKEN) { [self ctDelZone:qq]; if([gCurrentTAMS isRepeat: [qq buff]] && ([gCurrentTAMS isBlocked: [qq buff]] == NO)) { [self ctCloseRun: qq]; } } else if([qq tokentype] == CHAR) { if(inLimFlag) return INLIM; else { [self ctAddOpenChar: qq]; //cludge for repeats return OUTLIM; } } if(inLimFlag == 0 && [self isinlimit]) { inLimFlag = 1; return STARTLIM; } else if(inLimFlag == 1 && [self isinlimit]) { return INLIM; } else if (inLimFlag == 0 && ![self isinlimit]) { return OUTLIM; } else if (inLimFlag == 1 && ![self isinlimit]) { inLimFlag = 0; return ENDLIM; } return OUTLIM; } -(void) zeroRuns { ctLimitVault = nil; ctZoneVault = nil; ctLimString = nil; } -(void) initLimit { if(ctLimitVault) [ctLimitVault release]; ctLimitVault = [[NSMutableArray alloc] init]; //[ctLimitVault retain]; if(ctLimString) [ctLimString release]; ctLimString = [[NSMutableString alloc] init]; if(ctZoneVault) [ctZoneVault release]; ctZoneVault = [[NSMutableArray alloc] init]; inLimFlag = 0; } -(int) isStringTrue: (ctLimitCrit *)elem withCode: (NSString *)code withCoder: (NSString *)coder; { NSMutableArray *aa; NSRange rr; //get help from the current tams object NSMutableArray *bb; int matchflag; int lcnt; int ii, jj; int ncnt,tcnt; //first find out if we match the coder if([elem areCoders]==YES) //check coder against everyone { int foundFlag; NSRange r; foundFlag = 0; FORALL([elem getCoders]) { NSString *s1 = [NSString stringWithString: [temp objectForKey: @"coderName"]]; if([s1 isEqualToString: coder]) ii++; if([[temp objectForKey: @"modifier"] isEqualToString: @"~"] == YES) { //just check out the front part r = [coder rangeOfString: [temp objectForKey: @"coderName"]]; if(r.location == 0) { foundFlag = 1; break; } } else { //check out the rest, but make sure to do a null string check if([[temp objectForKey: @"coderName"] isEqualToString: @"*"] == YES) { if([coder isEqualToString: @""] == YES) { foundFlag = 1; break; } } else { if([coder isEqualToString: [temp objectForKey: @"coderName"]]) { foundFlag = 1; break; } } } } ENDFORALL; if(!foundFlag) return 0; } if([[elem name] isEqualToString: @""] == YES) return 1; switch([elem modif]) { case '>': //get help from the current tams object matchflag = 1; aa = convertStringToArray(code, '>'); bb = convertStringToArray([elem name], '>'); [aa retain]; [bb retain]; ncnt = [bb count]; tcnt = [aa count]; if(ncnt > tcnt) //the string must be equal at least to the test name { matchflag = 0; } else { for(ii = 0; ii <= tcnt - ncnt; ii++) { matchflag = 1; for(lcnt = 0, jj = ii; lcnt < ncnt; lcnt++, jj++) { if([[bb objectAtIndex: lcnt] isEqualToString: [aa objectAtIndex: jj]] == NO) { matchflag = 0; break; } } if(matchflag == 1) return matchflag; } } if(matchflag) return matchflag; //loop on bb, aa can be longer //if ([[aa objectAtIndex: 0] isEqualToString: [elem name]]) //return 1; break; case '*': rr = [code rangeOfString: [elem name]]; if(rr.location != NSNotFound) return 1; break; case '\'': if([code isEqualToString: [elem name]] == YES) return 1; break; default: if([gCurrentTAMS global: @"exactflag"]) { if([code isEqualToString: [elem name]] == YES) return 1; } else { NSMutableArray *bb; int matchflag; int lcnt; int ncnt,tcnt; matchflag = 1; aa = convertStringToArray(code, '>'); bb = convertStringToArray([elem name], '>'); [aa retain]; [bb retain]; ncnt = [bb count]; tcnt = [aa count]; if(ncnt > tcnt) //the zone must be equal at least to the test name { matchflag = 0; } else { for(lcnt = 0; lcnt < ncnt; lcnt++) { if([[bb objectAtIndex: lcnt] isEqualToString: [aa objectAtIndex: lcnt]] == NO) { matchflag = 0; break; } } } if(matchflag) return matchflag; //loop on bb, aa can be longer //if ([[aa objectAtIndex: 0] isEqualToString: [elem name]]) //return 1; } break; } ; return 0; } //compare this andgroup with the current list of codes and coders -(int) isCurrSectionCode:(ctLimitCrit *)elem forSectionArray: (NSMutableArray *) who { FORALL(who) { if([self isStringTrue: elem withCode: [temp objectForKey: @"code"] withCoder: [temp objectForKey: @"coder"]]) return 1; } ENDFORALL; return 0; } //compare this andgroup with the current zone -(int) isCurrTrue:(ctLimitCrit *)elem { FORALL(ctZoneVault) { if([self isStringTrue: elem withCode: [temp objectForKey: @"codeName"] withCoder: [temp objectForKey: @"coderName"]]) return 1; } ENDFORALL; return 0; } -(int) isTagTrue:(ctQChar *)who { int i,j, c1, c2; ctLimitCrit *elem; NSArray *andList; c1 = [ctLimitVault count]; for(i = 0; i< c1; i++) { andList = [ctLimitVault objectAtIndex: i]; c2 = [andList count]; for(j = 0; j < c2; j++) { elem = [andList objectAtIndex: j]; if([self isStringTrue: elem withCode: [who buff] withCoder: [who coder]]) return 1; } } return 0; } -(int) checkand:(NSArray *)a { int r, oldr; oldr = 1; FORALL(a) { r = [self isCurrTrue: temp]; oldr *= r; //and is like times if any are 0 it goes to 0 } ENDFORALL; return oldr ; } -(int) isinlimit { int rslt; int trslt; trslt = 0; if([ctZoneVault count] == 0) return 0; FORALL(ctLimitVault) { rslt = [self checkand: temp]; trslt += rslt; if(trslt) { return 1;} } ENDFORALL; if([ctLimitVault count] == 0) return 1; //this is a test of non-simple unlimited searches return 0; } /* handlers */ -(void) parseand:(NSString *)nsbuff { int i, j; MWCHAR c; NSMutableString *b; ctLimitCrit *elem; NSMutableArray *agp; #ifdef ldebug printf("in parseand: %s\n", buff); #endif agp = [[NSMutableArray alloc] init]; //agp = (andgroup *) new andgroup; b = [[NSMutableString alloc] init]; [b retain]; i = j = 0; for(;;) { if(i >= [nsbuff length]) c = '\0'; else c = [nsbuff characterAtIndex: i]; if(c == ' ') {i++; continue;} if(c == '+' || c == '\0') { if([b length]) { elem = [[ctLimitCrit alloc] initWithString: b]; [elem retain]; [agp addObject: elem]; //[elem release]; } j = 0; [b setString: @""]; if (c == '\0') break; } else [b ADDCHAR(c)]; i++; } [ctLimitVault addObject: agp]; //[agp release]; [b release]; } -(void) handlelimit:(NSString *)buff { MWCHAR c; unsigned i, j, n; NSMutableString *b; singleLimFlag = 0; [ctLimString setString: buff]; b = [[NSMutableString alloc] init]; [b retain]; n = [buff length]; if(n) { [gCurrentTAMS setGlobal: @"limitflag" to: 1]; i = 0; j = 0; for(;;) { if(i >= [buff length]) c = '\0'; else c = [buff characterAtIndex: i]; if(c == ' ') { i++; if(i >= [buff length]) break; c = [buff characterAtIndex: i]; } if(i >= n) break; while(c != ',' && i < n) { [b ADDCHAR(c)]; i++; j++; if(i < n) c = [buff characterAtIndex: i]; else break; } if ([b length]) {[self parseand: b]; [b setString: @""];} if (c == '\0') break; i++; } } if([ctLimitVault count] == 1) { NSArray *theOne; //may be a single name search theOne = [ctLimitVault objectAtIndex: 0]; //passes test 1 if([theOne count] == 1) { if([[theOne objectAtIndex: 0] modif] == ' ') { singleLimFlag = 1; } } } } @end gtamsanalyzer.app-0.42/Source/tamsutils.h0000555000175000017500000000346510162465511021015 0ustar brentbrent00000000000000/* * tamsutils.h * TEST2 * * Created by matthew on Sat May 03 2003. * Copyright (c) 2003 __MyCompanyName__. All rights reserved. * */ #import #import #import "tams.h" #import "ctQChar.h" #import "prefBoss.h" #import "utils.h" #define INSERTRESULTCODER(X) {NSMutableString *__cn=[[NSMutableString alloc] init]; [__cn setString: [gPrefBoss getCoderID]]; trimNSS(__cn); if([gPrefBoss showCoder] && [gPrefBoss useCoderValue] && [__cn length]) {[X appendString: @" ["]; [X appendString: __cn]; [X appendString: @"]"];} [__cn release];} #define INSERTCODER(X) {NSMutableString *__cn=[[NSMutableString alloc] init]; [__cn setString: [gPrefBoss getCoderID]]; trimNSS(__cn); if([gPrefBoss useCoderValue] && [__cn length]) {[X appendString: @" ["]; [X appendString: __cn]; [X appendString: @"]"];} [__cn release];} BOOL isCodeNameLegal(NSString *who); BOOL isCharLegal(unichar ch); NSString *extractFirstCode(NSString *what); void DATASTRING(NSMutableData *W, NSString *X) ; BOOL isParentOf(NSString *prnt, NSString *chld); NSString *parentOf(NSString *code); NSString *terminusOf(NSString *code); int codeLevel(NSString *code); NSString *uniqueFileName(); NSString *uniqueTmpFileName(); NSString *stringForQChar(ctQChar *qq, BOOL cflag); NSString *code2tag(NSString *mycode, BOOL open, BOOL result, NSString *comment); void DATACHAR(NSMutableData *W, unichar X) ; void DATATAB(NSMutableData *W); void DATANL(NSMutableData *W); NSColor *getColorForInt(int col); int compCodeByLevel(NSString *c1, NSString *c2); NSString *codeToLevel(NSString *mycode, int level); NSCharacterSet *tamsCharacterSet(void); BOOL isHHMMSS(NSString *tstr); unsigned hhmmss2sec(NSString *tstr); NSString *sec2hhmmss(unsigned l); enum {black, red, yellow, green, blue, ltgray, gray, dkgray, inheritedColor, otherColor}; gtamsanalyzer.app-0.42/Source/tamsutils.m0000555000175000017500000002436110162465511021020 0ustar brentbrent00000000000000/* * tamsutils.tamsCharSet * TEST2 * * Created by matthew on Sat May 03 2003. * Copyright (tamsCharSet) 2003 __MyCompanyName__. All rights reserved. * */ #include "tams.h" #import "prefBoss.h" #import #import #import "tamsutils.h" NSMutableCharacterSet *tamsCharSet=nil; //#define DATASTRING(W,X) {[W appendBytes: [X cString] length: [X cStringLength]];} //#define DATASTRING(W,X) {[W appendData: [X dataUsingEncoding: NSUnicodeStringEncoding allowLossyConversion: YES]];} void DATASTRING(NSMutableData *W, NSString *X) { NSStringEncoding se, n; n = [gPrefBoss unicharValue]; switch(n) { case 601: se = NSUnicodeStringEncoding; break; case 602: se = NSUTF8StringEncoding; break; case 603: se = NSNonLossyASCIIStringEncoding; break; case 604: se = NSISOLatin1StringEncoding; break; case 605: se = NSISOLatin2StringEncoding; break; case 606://this is the original form which does allow some foreign characters /* deprecated to 608 */ [W appendBytes: [X cString] length: [X cStringLength]]; return; break; case 607: se = NSNEXTSTEPStringEncoding; break; case 608: se = NSMacOSRomanStringEncoding; break; case 609: se = NSWindowsCP1252StringEncoding; break; default: se = NSMacOSRomanStringEncoding; break; }; [W appendData: [X dataUsingEncoding: se allowLossyConversion: YES]]; } //#define DATACHAR(W,X) {unichar _ss[2]; _ss[0] = X; [W appendBytes: _ss length: 1];} void DATACHAR(NSMutableData *W, unichar X) {NSString *_ssss = [NSString stringWithFormat: @"%C",X]; DATASTRING(W,_ssss);} void DATATAB(NSMutableData *W) {DATACHAR(W, '\t');} void DATANL(NSMutableData *W) {DATACHAR(W, '\n');} NSString *code2tag(NSString *mycode, BOOL open, BOOL result, NSString *comment) { NSMutableString *ans = [NSMutableString string]; if(open) { [ans appendString: [NSString stringWithFormat: @"{%@", mycode]]; } else { [ans appendString: [NSString stringWithFormat: @"{/%@", mycode]]; } if(result) { INSERTRESULTCODER(ans); } else { INSERTCODER(ans); } if(open == NO && comment != nil) { [ans appendString: [NSString stringWithFormat: @": %@}", comment]]; } else [ans appendString: @"}"]; return ans; } void makeTamsCharSet() { NSCharacterSet *b; b= [NSCharacterSet characterSetWithCharactersInString: @">_"]; tamsCharSet = [NSMutableCharacterSet alphanumericCharacterSet]; [tamsCharSet formUnionWithCharacterSet: b]; [tamsCharSet retain]; } NSCharacterSet *tamsCharacterSet(void) { if(!tamsCharSet) makeTamsCharSet(); return tamsCharSet; } BOOL isCharLegal(unichar ch) { if(!tamsCharSet) makeTamsCharSet(); return [tamsCharSet characterIsMember: ch]; } NSString *extractFirstCode(NSString *what) { NSRange r; int i, n; n = [what length]; if (n <= 0) return nil; r = NSMakeRange(NSNotFound,0); for(i = 0; i < n; i++) { if(isCharLegal([what characterAtIndex: i])) { if(r.location == NSNotFound) { r.location = i; } r.length++; } else { if(r.length > 0) { return [what substringWithRange: r]; } } } if(r.length > 0) { return [what substringWithRange: r]; } return nil; } BOOL isCodeNameLegal(NSString *who) { NSCharacterSet *ss; int i, n; if(!tamsCharSet) makeTamsCharSet(); // ss = [NSCharacterSet characterSetWithCharactersInString: who]; // return [tamsCharSet isSupersetOfSet: ss]; n = [who length]; for(i=0; i< n; i++) { if([tamsCharSet characterIsMember: [who characterAtIndex: i]] == NO) return NO; } return YES; } int codeLevel(NSString *code) { int i, l, cnt; l = [code length]; for(i = 0, cnt = 0; i < l; i++) { if([code characterAtIndex: i] == '>') cnt++; } return cnt + 1; } NSString *terminusOf(NSString *code) { //make array of string NSMutableArray *arr = [NSMutableArray arrayWithArray: [code componentsSeparatedByString: @">"]]; //return last element return [[[arr lastObject] copy] autorelease]; } NSString *parentOf(NSString *code) { //make array of string NSMutableArray *arr = [NSMutableArray arrayWithArray: [code componentsSeparatedByString: @">"]]; //remove last element if([arr count] >= 2){ [arr removeLastObject]; //return reassembled string return [arr componentsJoinedByString: @">"]; } else return nil;//I'm my own parent } BOOL isParentOf(NSString *prnt, NSString *chld) { NSRange r; /* NSArray *parray, *carray; parray = [NSArray arrayWithArray: [prnt componentsSeparatedByString: @">"]]; carray = [NSArray arrayWithArray: [chld componentsSeparatedByString: @">"]]; FORALL(parray) { if([temp isEqualToString: [carray objectAtIndex: __i]] == NO) return NO; } ENDFORALL; return YES; */ r = [chld rangeOfString: prnt]; if(r.location == 0) return YES; else return NO; } /* turn a qchar back into a string; cflag is whether to include the comment*/ NSString *stringForQChar(ctQChar *qq, BOOL cflag) { NSString *cdr, *cmt; switch([qq tokentype]) { case TOKEN: if([[qq coder] length] > 0) cdr = [NSString stringWithFormat: @" [%@]", [qq coder]]; else cdr = [NSString string]; if(cflag == YES) { if([[qq extra] length]) cmt = [NSString stringWithFormat: @": %@", [qq extra]]; else cmt = [NSString string]; } else cmt = [NSString string]; return [NSString stringWithFormat: @"{%@%@%@}", [qq buff], cdr, cmt]; break; case ENDTOKEN: if([[qq coder] length] > 0) cdr = [NSString stringWithFormat: @" [%@]", [qq coder]]; else cdr = [NSString string]; if(cflag == YES) { if([[qq extra] length]) cmt = [NSString stringWithFormat: @": %@", [qq extra]]; else cmt = [NSString string]; } else cmt = [NSString string]; return [NSString stringWithFormat: @"{/%@%@%@}", [qq buff], cdr, cmt]; break; case META: if([[qq extra] length]) return [NSString stringWithFormat: @"{!%@ %@}", [qq buff], [qq extra]]; else return [NSString stringWithFormat: @"{!%@}", [qq buff]]; break; default: return [qq buff]; }; } NSColor *getColorForInt(int col) { switch(col) { case red: return [NSColor redColor]; break; case yellow: return [NSColor yellowColor]; break; case green: return [NSColor greenColor] ; break; case blue: return [NSColor blueColor] ; break; case ltgray: return [NSColor lightGrayColor] ; break; case gray: return [NSColor grayColor] ; break; case dkgray: return [NSColor darkGrayColor]; break; case black: return [NSColor blackColor]; break; default: ; } } NSString *codeToLevel(NSString *mycode, int level) { NSArray *a1; NSMutableArray *farr = [NSMutableArray array]; int i,cl; if(level == 0) return mycode; cl = codeLevel(mycode); if(cl <= level) return mycode; a1 = [mycode componentsSeparatedByString: @">"]; for(i = 0; i < level; i++) [farr addObject: [a1 objectAtIndex: i]]; return [farr componentsJoinedByString: @">"]; } int compCodeByLevel(NSString *c1, NSString *c2) { NSArray *a1, *a2; int i,n,m, min, lev; a1 = [c1 componentsSeparatedByString: @">"]; a2 = [c2 componentsSeparatedByString: @">"]; n = [a1 count]; m = [a2 count]; min = (m > n) ? n : m; lev = 0; for(i = 0; i < min; i++) if([[a1 objectAtIndex: i] isEqualToString: [a2 objectAtIndex: i]] == YES) lev++; else break; return lev; } NSString *uniqueFileName() { NSString *dt = [[NSDate date] description]; NSMutableString *ut = [NSMutableString stringWithString: dt]; [ut replaceOccurrencesOfString: @":" withString: @"--" options: nil range: NSMakeRange(0, [ut length])]; return ut; } NSString *uniqueTmpFileName() { return [NSString stringWithFormat: @"%@fid%@",@"/tmp/", uniqueFileName()]; } NSString *sec2hhmmss(unsigned l) { int time[3]; time[2] = l/(60*60); time[1] = l%(60*60); time[0] = time[1]%60; time[1] = time[1]/60; return [NSString stringWithFormat: @"%u:%02u:%02u", time[2], time[1], time[0]]; } unsigned hhmmss2sec(NSString *tstr) { int tptr, factor, i, ndx, l; unsigned time[3], tt; unichar ch; l = [tstr length]; tptr = 0; factor = 1; time[2] = time[1] = time[0] = 0; for(i=0; i= '0' && ch <= '9') { time[tptr] += (ch - '0') * factor; factor *= 10; } } tt = 0; for(i = 0; i < 3; i++) { switch(i) { case 0: tt += time[i]; break; case 1: tt += time[i] * 60; break; case 2: tt += time[i] *60 * 60; break; } } return tt; } BOOL isHHMMSS(NSString *tstr) { int l, i; l = [tstr length]; for(i = 0; i < l; i++) { if ([tstr characterAtIndex: i] == ':') return YES; } return NO; } gtamsanalyzer.app-0.42/Source/taSmallestProj.tiff0000555000175000017500000033262210162465511022435 0ustar brentbrent00000000000000MM*@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW17=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW$2elLrWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW8><[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 0IWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW)>}WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWnwtrtt~y\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"4jqWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\goc;.00....././0.1:AMZert~y\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW,ZaWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWetN3......................././16C_y\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*V]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^|R5..................................5HjwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW ,Y`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^e6.......................................06C[ktwnWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.]dWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW|`0................................................2?XxWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+W^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWkt2....................................................4VbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*V]WWWWWWWWWWWWWWWWWWWWWWWWWWWW^7.......................................................1^}WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW-[bWWWWWWWWWWWWWWWWWWWWWWWWWWWWC..........................................................5n\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"2bfWWWWWWWWWWWWWWWWWWWWWWWWWWWet/............................................................FnZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW-[bWWWWWWWWWWWWWWWWWWWWWWWWWWWA..............................................................4eZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW(RYWWWWWWWWWWWWWWWWWWWWWWWWWWW1.............................................................../U^WWWWWWWWWWWWWWWWWWWWWWWWWWWWW#IOWWWWWWWWWWWWWWWWWWWWWWWWWWWf..................................................................I^WWWWWWWWWWWWWWWWWWWWWWWWWWWW4:WWWWWWWWWWWWWWWWWWWWWWWWWWWU...................................................................E^WWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWR....................................................................G^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV...............0>ZqtrtteQ:/11.//.....................................V|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW`..............HnWWWWWWWWWW`kq}p]I8/...............................3eWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWm..............mWWWWWWWWWWWWWWWWWWW\gogG5............................WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWs..............sWWWWWWWWWWWWWWWWWWWWWWWWWuZ@1.0/.....................6WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWs..............sWWWWWWWWWWWWWWWWWWWWWWWWWWWXcmwmQ7...................WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWp..............tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\n5.................YWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWg..............zWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW}Y1...............;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWeY............./WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWb=..............0nWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXZZXH.............5WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^...............WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW8.............9WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^9............./WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW/.............8WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWS..............WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW/.............2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWi..............wWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW5..............WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWt..............tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW?..............zWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWr..............rWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWeN............./tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWn..............tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWa..............sWWWWW`_WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWX............./tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWp..............sWWWW`nYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWtF..............~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWt..............tWWWW\[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW:.............0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWs..............sWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW1.............9WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWs..............sWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..............DyWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWt..............tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWp..............U\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWs..............sWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^\..............hWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWs..............sWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW9..............~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWt..............tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWll...............WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWs..............sWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW7............../WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWn..............sWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWlQ................tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\..............tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWZ1...............6WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWnI..............zWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWZB................aWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW=..............WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWfl.................WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2.............5WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\1................MWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..............AWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW|=................1WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWw..............OeWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^]................/WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWt..............cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^1................RlWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW1.............nWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^9................7WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWoM.............tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^A.................llWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.............tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWZD.................EWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.............rWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWZP.................8^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWr.............tWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWib.................1~^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWr............/tWWWWWWWWWWWWWWWWWWWWWWWWWWWWW_1................._mWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.............~WWWWWWWWWWWWWWWWWWWWWWWWWWWWW=.................;xWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW............1WWWWWWWWWWWWWWWWWWWWWWWW\yY4.................0\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW_L............CWWWWWWWWWW\go|ttqttpiUB5....................ojWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWm1............eyWWWWWWWWcxd=0//..............................S|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq.............oztsstspiQ9...................................G^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq............09/............................................<^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq..........................................................1^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq..........................................................b^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq.........................................................=xWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq........................................................2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq......................................................./jgWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq.......................................................YxWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq...................................................../ZsZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq....................................................9wpZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq..................................................:`gWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq............................................../8PzqWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWq......................................./.09Fbog\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWq.............................09Rjtqttqtt~y\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWq............71...........16Ei`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW29WWWWWWWWWWWWWWWWWWWWWWWWWWq............N6.......3^zeWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW=\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW 1JWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW*?~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#5kqWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW-[aWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+W]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW -Z`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW/^dWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW,X^WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+W]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.\bWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"2bfWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.\bWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW)SYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW`{aWWWWWWWWWWWWWW$JOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXdoD::::::::>U|WWWWWWWWWWWWWW5:WWWWWWWWWWWWWWWWWWWWWWWWWWWWXdlD<===============<5/..........7WWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWXjQ@============================================<5/..............................^oWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWgA/.............................................................................NZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWdD..............................................................................F[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbH..............................................................................B\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWaM..............................................................................=]WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWaM..............................................................................<`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW]Q....................................................................../0000001D`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWnp0................................................../01111111111111112?c|aWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWox<3111111111111111111111111111111111111111111111113Elw[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW]zw[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXjiYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW]pmNA=========@I]_WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXduL5/.............09======>AN}v\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXkF5/........................../9E^lYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWi6.............................../08?`|YWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWe4....................................0cvYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWc5......................................6{gWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWb6........................................J}WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWb8.........................................>WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW];.......1111111110.........................=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW{H......?svF531111111/..............7aWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW^0.....6WWWWWWWWWWYl}`A50.........../VwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWzH......;WWWWWWWWWWWWWWWWWWWWW]zhA1..........BWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[0......;WWWWWWWWWWWWWWWWWWWWWWWW]}m5.........=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWnQ.......;WWWWWWWWWWWWWWWWWWWWWWWWWWig0........=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW=.......;WWWWWWWWWWWWWWWWWWWWWWWWWWY9........=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW;.......;WWWWWWWWWWWWWWWWWWWWWWWWWWWB........=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW<.......;WWWWWWWWWWWWWWWWWWWWWWWWWWW~R/.......=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW<.......;WWWWWWWWWWWWWWWWWWWWWWWWWWW`y2.......=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW<.......;WWWWWWWWWWWWWWWWWWWWWWWWWWWW:.......=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW<.......;WWWWWWWWWWWWWWWWWWWWWWWWWWWW?.......=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW<.......;WWWWWWWWWWWWWWWWWWWWWWWWWWWW?.......=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW<.......;WWWWWWWWWWWWWWWWWWWWWWWWWWWW?.......=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW<.......;WWWWWWWWWWWWWWWWWWWWWWWWWWWW?.......=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW<.......;WWWWWWWWWWWWWWWWWWWWWWWWWWWW?.......=WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW<.......;WWWWWWWWWWWWWWWWWWWWWWWWWWWW?.........<`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWM.>`WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWc|aWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXdv\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW]olD<==========@LiWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWoqaXXaZWWWWWWWWWWWWWXdvSB===<5/.............1onWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWov\WWWWWXdlD<:60.....................=cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXd5.....0]lD<=<5/.........................7oXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXjQ@======================/.......6===<5/..............................4urXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWgA/...................................................................3owYWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWdD....................................................................1hzZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbH....................................................................1b[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWaM........................................................./01111111128e[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWaM................................................./0111113Elw[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW]Q............................................../18Mnw[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWnp0......................................../0113EmfXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWox<31111111111111111111111111111111/...113Elw[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW]zxag|w[WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW +&Rh@t(R/Users/matthew/prog/TEST2/taSmallProj.tiffCreated with The GIMP(8HHgtamsanalyzer.app-0.42/Source/template.plist0000644000175000017500000000242610162465511021502 0ustar brentbrent00000000000000{ ApplicationName = "Ink"; ApplicationDescription = "An Example of how to use NSTextView"; ApplicationRelease = "0.1"; Authors = ("Fred Kiefer "); Copyright = "Copyright (c) 2000 Fred Kiefer "; CopyrightDescription = "This program is released under the GNU General Public License"; NSIcon = Ink_app; NSTypes = ( { NSName = "rtf"; NSHumanReadableName = "RTF Document"; NSUnixExtensions = ("rtf"); NSDOSExtensions = ("rtf"); NSMIMETypes = ("text/rtf"); NSIcon = FileIcon_rtf; NSRole = Editor; NSDocumentClass = Document; }, { NSName = "rtfd"; NSHumanReadableName = "RTFD Document"; NSUnixExtensions = ("rtfd"); NSDOSExtensions = ("rtfd"); NSIcon = FileIcon_rtf; NSRole = Editor; NSDocumentClass = Document; }, { NSName = "text"; NSHumanReadableName = "Text Document"; NSUnixExtensions = ("txt"); NSDOSExtensions = ("txt"); NSMIMETypes = ("text/plain"); NSIcon = FileIcon_txt; NSRole = Editor; NSDocumentClass = Document; } ); } gtamsanalyzer.app-0.42/Source/testdat.rtf0000644000175000017500000000100510162465511020767 0ustar brentbrent00000000000000{\rtf1\ansi\ansicpg10000\cocoartf102{\fonttbl\f0\fswiss Helvetica;} {\colortbl;\red0\green0\blue255;\red255\green127\blue0;\red255\green127\blue0;} \cf1\pard\tx0\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\ql\f0\fs24 s\{!repeat e\}\cf0\cf2 \cf0\cf3 \{e\}\cf0\cf2 this\cf0\cf3 \{/e\}\cf0\cf2 \par \cf0\cf3 \{d\}\cf0 This\cf0\cf3 \{/d\}\cf0 is a \cf0\cf3 \{a\}\cf0 simple\cf0\cf3 \{/a\}\cf0 test of \cf0\cf3 \{c\}\cf0 some\cf0\cf3 \{/c\}\cf0 \cf0\cf3 \{d\}\cf0 things\cf0\cf3 \{/d\}}gtamsanalyzer.app-0.42/Source/testdatproj.xtprj0000644000175000017500000001463010162465511022246 0ustar brentbrent00000000000000 $archiver NSKeyedArchiver $objects $null 10 $class CF$UID 4 NS.objects CF$UID 3 /root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/testdat.rtf $classes NSMutableArray NSArray NSObject $classname NSMutableArray $class CF$UID 4 NS.objects CF$UID 6 /root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/testdat.rtf $class CF$UID 18 NS.keys CF$UID 9 CF$UID 10 CF$UID 11 NS.objects CF$UID 12 CF$UID 19 CF$UID 21 c d a $class CF$UID 18 NS.keys CF$UID 13 CF$UID 14 NS.objects CF$UID 15 CF$UID 16 active definition YES $0 0 $class CF$UID 17 $classes NSMutableString NSString NSObject $classname NSMutableString $classes NSMutableDictionary NSDictionary NSObject $classname NSMutableDictionary $class CF$UID 18 NS.keys CF$UID 13 CF$UID 14 NS.objects CF$UID 15 CF$UID 20 $0 0 $class CF$UID 17 $class CF$UID 18 NS.keys CF$UID 13 CF$UID 14 NS.objects CF$UID 15 CF$UID 22 $0 0 $class CF$UID 17 A $class CF$UID 4 NS.objects CF$UID 25 CF$UID 26 /root/xxx.xtrs /root/testopen.xtrs $class CF$UID 18 NS.keys CF$UID 29 NS.objects CF$UID 30 Results $class CF$UID 4 NS.objects CF$UID 31 testopen.xtrs $top codeList CF$UID 8 currCodeSet CF$UID 33 currFileSet CF$UID 32 fileList CF$UID 2 fileSets CF$UID 28 init CF$UID 7 pathMode CF$UID 23 resultList CF$UID 24 searchList CF$UID 5 selectedNamedSearchList CF$UID 27 version CF$UID 1 $version 100000 gtamsanalyzer.app-0.42/Source/testLarge.xcf0000555000175000017500000000662410162465511021253 0ustar brentbrent00000000000000gimp xcf file00BB/ gimp-commentCreated with The GIMPS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  { a > b }      $gimp-text-layer(text "{ a > b }") (font "Comic Sans MS") (font-size 50.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "c") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) \-"A &XE% t-% =oj-%_+>jFV 1-X\+;I9A  ARQ$ Drop-Shadow     $$&  &   '2 /L7. /L7>Q-    .M7%MFDJ (GM6 (:'  8idN2CJ!QI!Smq]% /YR% ;rpcU, ?Q% /aK 4eabb- -_b/ 8bOGW:=Y/ .`L :g[]e1 5UG 6\HBV;=V,  RL .aloh2 %. 3ef_U, @O#FR) =UVG" "KYQ6!KK 3L2  " +K:& ' $00 Background     H00\00l  !3@GLTWWSLGA/ 5NWWM3 .KVWWVJ+ ,PWWO) JWWH !RWWRUW!WS OW#WM4W%W.OW%WPVW&W SW%WVGW%WCVW#WU7W#W3EW!W@7VWWV5 #NWWL  .SWWQ,%CTWWTA# ";JRW WQJ9!  &1660& O  !-K^ip{zph`E.%NrqK#Com> @vt< li 1xx($}!zt#q L%D t%u~&z%h%b*~#}#Q#K e!^  Q~~N 3sp/ DzwA  6b|{`33Wmy wnT1.8IPPG8, O !,XʻZ&IܓD z }u 6- _NF!<#%%8&&'%%R#D#! cZ ~ic$bբ_ #OS :@@8 V߲Jul@7 +# `Q##s@%-'$(Z)J`)P`)PE)5 '&u%0#'0 ( 639ߕ2KɋF 9`~`3gtamsanalyzer.app-0.42/Source/testProject.h0000555000175000017500000000033310162465511021265 0ustar brentbrent00000000000000// // testProject.h // TEST2 // // Created by matthew on Wed Apr 09 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import @interface testProject : NSDocument { } @end gtamsanalyzer.app-0.42/Source/testProject.m0000555000175000017500000000153210162465511021274 0ustar brentbrent00000000000000// // testProject.m // TEST2 // // Created by matthew on Wed Apr 09 2003. // Copyright (c) 2003 __MyCompanyName__. All rights reserved. // #import "testProject.h" @implementation testProject - (NSString *)windowNibName { // Implement this to return a nib to load OR implement -makeWindowControllers to manually create your controllers. return @"myProject"; } - (NSData *)dataRepresentationOfType:(NSString *)type { // Implement to provide a persistent data representation of your document OR remove this and implement the file-wrapper or file path based save methods. return nil; } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)type { // Implement to load a persistent data representation of your document OR remove this and implement the file-wrapper or file path based load methods. return YES; } @end gtamsanalyzer.app-0.42/Source/testres.xtrs0000644000175000017500000000055110162465511021222 0ustar brentbrent00000000000000# _code _data _comment _coder _doc _begin_loc _end_loc 1 d {d}This{/d} /root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/testdat.rtf 0 7 2 a {a}simple{/a} /root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/testdat.rtf 17 26 3 c {c}some{/c} /root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/testdat.rtf 39 46 4 d {d}things{/d} /root/TAMS2/GTAMSAnalyzer/GTAMSAnalyzer/testdat.rtf 51 60 gtamsanalyzer.app-0.42/Source/TextFinder.h0000555000175000017500000000364310162465511021042 0ustar brentbrent00000000000000/* Reusable find panel functionality (find, replace). Need one shared instance of TextFinder to which the menu items and widgets in the find panel are connected. Loads UI lazily. Works on first responder, assumed to be an NSTextView. */ #import #import #define Forward YES #define Backward NO @interface TextFinder : NSObject { NSString *findString; id findTextField; id rawButton; id regexButton; id multilineButton; id replaceTextField; id ignoreCaseButton; id findNextButton; id findPrevButton; id replaceAllScopeMatrix; id statusField; IBOutlet id scopeFlag; BOOL lastFindWasSuccessful; } /* Common way to get a text finder. One instance of TextFinder per app is good enough. */ + (id)sharedInstance; /* Main method for external users; does a find in the first responder. Selects found range or beeps. */ - (BOOL)find:(BOOL)direction; /* Loads UI lazily */ - (NSPanel *)findPanel; /* Gets the first responder and returns it if it's an NSTextView */ - (NSTextView *)textObjectToSearchIn; /* Get/set the current find string. Will update UI if UI is loaded */ - (NSString *)findString; - (void)setFindString:(NSString *)string; - (void)setFindString:(NSString *)string writeToPasteboard:(BOOL)flag; /* Misc internal methods */ - (void)appDidActivate:(NSNotification *)notification; - (void)loadFindStringFromPasteboard; - (void)loadFindStringToPasteboard; /* Action methods, sent from the find panel UI; can also be connected to menu items */ - (void)findNext:(id)sender; - (void)findPrevious:(id)sender; - (void)findNextAndOrderFindPanelOut:(id)sender; - (void)replace:(id)sender; - (void)replaceAndFind:(id)sender; - (void)replaceAll:(id)sender; - (void)orderFrontFindPanel:(id)sender; - (void)takeFindStringFromSelection:(id)sender; - (void)jumpToSelection:(id)sender; -(NSString *)convertEscapeString: (NSString *) oString; @end gtamsanalyzer.app-0.42/Source/TextFinder.m0000555000175000017500000005712010162465511021046 0ustar brentbrent00000000000000/* TextFinder.m Copyright (c) 1995-2001 by Apple Computer, Inc., all rights reserved.f Author: Ali Ozer Find and replace functionality with a minimal panel... Would be nice to have the buttons in the panel validate; this would allow the replace buttons to become disabled for readonly docs */ /* IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apples copyrights in this original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Regular expression code added 3/11/2003 by Matthew Weinstein for the TAMS Analyzer project */ #import #import #import "TextFinder.h" #import "AGRegex.h" #import "utils.h" #import "stringCategories.h" #define COUNTSTRING @"REGEXCOUNT" //#define oldReplaceREGEX 1 #define oneAtATimeReplaceRegex 1 @implementation TextFinder static id sharedFindObject = nil; + (id)sharedInstance { if (!sharedFindObject) { [[self allocWithZone:[[NSApplication sharedApplication] zone]] init]; } return sharedFindObject; } - (id)init { if (sharedFindObject) { [super dealloc]; return sharedFindObject; } if (!(self = [super init])) return nil; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidActivate:) name:NSApplicationDidBecomeActiveNotification object:[NSApplication sharedApplication]]; [self setFindString:@"" writeToPasteboard:NO]; [self loadFindStringFromPasteboard]; sharedFindObject = self; return self; } - (BOOL) entireFile { return [scopeFlag state] == NSOnState; } - (void)appDidActivate:(NSNotification *)notification { [self loadFindStringFromPasteboard]; } - (void)loadFindStringFromPasteboard { NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:NSFindPboard]; if ([[pasteboard types] containsObject:NSStringPboardType]) { NSString *string = [pasteboard stringForType:NSStringPboardType]; if (string && [string length]) { [self setFindString:string writeToPasteboard:NO]; } } } - (void)loadFindStringToPasteboard { NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:NSFindPboard]; [pasteboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; [pasteboard setString:[self findString] forType:NSStringPboardType]; } - (void)loadUI { if(!findTextField)NSLog(@"no text field\n");else NSLog(@"yes text field\n"); if (!findTextField) { if (![NSBundle loadNibNamed:@"FindPanel" owner:self]) { NSLog(@"Failed to load FindPanel.nib"); NSBeep(); } if (self == sharedFindObject) [[findTextField window] setFrameAutosaveName:@"Find"]; } [findTextField setStringValue:[self findString]]; } - (void)dealloc { if (self != sharedFindObject) { [[NSNotificationCenter defaultCenter] removeObserver:self]; [findString release]; [super dealloc]; } } - (NSString *)findString { return findString; } - (void)setFindString:(NSString *)string { [self setFindString:string writeToPasteboard:YES]; } -(NSString *) getFindString { if([regexButton intValue] == 0) return[self convertEscapeString: [findTextField stringValue]]; else return [findTextField stringValue]; } -(NSString *) getReplaceString { return [self convertEscapeString: [replaceTextField stringValue]]; } -(NSString *)convertEscapeString: (NSString *) oString { int n, i; unichar ch, chn; NSMutableString *newString = [[NSMutableString alloc] init]; //go through the replace string n = [oString length]; for(i = 0; i < n; i++) { ch = [oString characterAtIndex: i]; if(ch == '\\' && i < n - 1) { chn = [oString characterAtIndex: ++i]; switch(chn) { case 't': [newString ADDCHAR('\t')]; break; case 'n': [newString ADDCHAR('\n')]; break; case 'r': [newString ADDCHAR('\r')]; break; default: [newString ADDCHAR('\\')]; [newString ADDCHAR(chn)]; break; } } else [newString ADDCHAR( ch)]; } [newString autorelease]; return newString; } - (void)setFindString:(NSString *)string writeToPasteboard:(BOOL)flag { if ([string isEqualToString:findString]) return; [findString autorelease]; findString = [string copyWithZone:[self zone]]; if (findTextField) { [findTextField setStringValue:string]; [findTextField selectText:nil]; } if (flag) [self loadFindStringToPasteboard]; } - (NSTextView *)textObjectToSearchIn { id obj = [[NSApp mainWindow] firstResponder]; return (obj && [obj isKindOfClass:[NSTextView class]]) ? obj : nil; } - (NSPanel *)findPanel { if (!findTextField) [self loadUI]; return (NSPanel *)[findTextField window]; } /* The primitive for finding; this ends up setting the status field (and beeping if necessary)... */ - (BOOL)find:(BOOL)direction { unsigned options; NSTextView *text = [self textObjectToSearchIn]; lastFindWasSuccessful = NO; if (text) { NSString *textContents = [text string]; unsigned textLength; if (textContents && (textLength = [textContents length])) { NSRange range; BOOL regexSrch; BOOL mlflag; if([regexButton state]) { regexSrch = YES; if([multilineButton state]) mlflag = YES; else mlflag = NO; } else { regexSrch = NO; mlflag = NO; } options = 0; if (direction == Backward) options |= NSBackwardsSearch; if ([ignoreCaseButton state]) options |= NSCaseInsensitiveSearch; range = [textContents findString:[self findString] selectedRange:[text selectedRange] options:options wrap:YES regex: regexSrch multiline: mlflag]; if (range.length) { [text setSelectedRange:range]; [text scrollRangeToVisible:range]; lastFindWasSuccessful = YES; } } } if (!lastFindWasSuccessful) { NSBeep(); [statusField setStringValue:NSLocalizedStringFromTable(@"Not found", @"FindPanel", @"Status displayed in find panel when the find string is not found.")]; } else { [statusField setStringValue:@""]; } return lastFindWasSuccessful; } - (void)orderFrontFindPanel:(id)sender { NSPanel *panel; NSLog(@"about to get panel\n"); panel = [self findPanel]; NSLog(@"in orderFront\n"); [findTextField selectText:nil]; [panel makeKeyAndOrderFront:nil]; } /**** Action methods for gadgets in the find panel; these should all end up setting or clearing the status field ****/ -(IBAction) setRegexState: (id) Sender { //turn off prev if([regexButton state]) { [findPrevButton setEnabled: NO]; [multilineButton setEnabled: YES]; } else { [findPrevButton setEnabled: YES]; [multilineButton setEnabled: NO]; } } - (void)findNextAndOrderFindPanelOut:(id)sender { [findNextButton performClick:nil]; if (lastFindWasSuccessful) { [[self findPanel] orderOut:sender]; } else { [findTextField selectText:nil]; } } - (void)findNext:(id)sender { if (findTextField) [self setFindString:[self getFindString]]; /* findTextField should be set */ (void)[self find:Forward]; } - (void)findPrevious:(id)sender { if (findTextField) [self setFindString:[self getFindString]]; /* findTextField should be set */ (void)[self find:Backward]; } - (void)replace:(id)sender { NSTextView *text = [self textObjectToSearchIn]; AGRegex *regex; // shouldChangeTextInRange:... should return NO if !isEditable, but doesn't... if (text && [text isEditable] && [text shouldChangeTextInRange:[text selectedRange] replacementString:[self getReplaceString]]) { int regexOpt; int rawflag; if([regexButton state]) { NSString *ss; regexOpt = 0; regexOpt |= ([ignoreCaseButton state])? AGRegexCaseInsensitive : 0; regexOpt |= ([multilineButton state])? AGRegexMultiline : 0; regex = [[AGRegex alloc] initWithPattern: [self findString] options: regexOpt]; ss = [regex replaceWithStringWithEscape: [replaceTextField stringValue] inString: [[text string] substringWithRange: [text selectedRange]] raw: 0]; if(!ss) NSBeep(); else [[text textStorage] replaceCharactersInRange:[text selectedRange] withString: ss]; [regex release]; [text didChangeText]; } else { [[text textStorage] replaceCharactersInRange:[text selectedRange] withString:[self getReplaceString]]; [text didChangeText]; } } else { NSBeep(); } [statusField setStringValue:@""]; } - (void)replaceAndFind:(id)sender { [self replace:sender]; [self findNext:sender]; } #define ReplaceAllScopeEntireFile 42 #define ReplaceAllScopeSelection 43 /* The replaceAll: code is somewhat complex. One reason for this is to support undo well --- To play along with the undo mechanism in the text object, this method goes through the shouldChangeTextInRange:replacementString: mechanism. In order to do that, it precomputes the section of the string that is being updated. An alternative would be for this method to handle the undo for the replaceAll: operation itself, and register the appropriate changes. However, this is simpler... Turns out this approach of building the new string and inserting it at the appropriate place in the actual text storage also has an added benefit of performance; it avoids copying the contents of the string around on every replace, which is significant in large files with many replacements. Of course there is the added cost of the temporary replacement string, but we try to compute that as tightly as possible beforehand to reduce the memory requirements. */ - (void)replaceAll:(id)sender { NSTextView *text = [self textObjectToSearchIn]; if (!text || ![text isEditable]) { [statusField setStringValue:@""]; NSBeep(); } else if([regexButton state]) { NSArray *foundStrings; AGRegex *reg; AGRegexMatch *match; NSString *regResult; NSMutableString *cntResult; int regexOpt, n; NSRange tr, br; NSTextStorage *textStorage = [text textStorage]; BOOL entireFile = [self entireFile]; /* Our strategy is different than the non regex We will do an array of found strings and then work our way backwards through it and pay the cost; without a find backwards we cannot simply modify the alorithm */ regexOpt = 0; regexOpt |= ([ignoreCaseButton state])? AGRegexCaseInsensitive : 0; regexOpt |= ([multilineButton state])? AGRegexMultiline : 0; tr = (entireFile )? NSMakeRange(0, [textStorage length]) : [text selectedRange]; { NSRange range, er, strPart; BOOL regexSrch; NSString *textContents = [text string]; BOOL mlflag; unsigned textLength; NSMutableAttributedString *temp; NSAutoreleasePool *ap; unsigned options; BOOL direction = Forward; NSString *ss; NSMutableString *ss2; int rgxcnt; unsigned long lastOne; textLength = [textContents length]; er = tr; temp = [[NSMutableAttributedString alloc] init]; if(!(textContents && textLength)) return; tr = (entireFile )? NSMakeRange(0, 0) : [text selectedRange]; strPart = (entireFile )? NSMakeRange(0, textLength) : [text selectedRange]; [temp beginEditing]; ap = [[NSAutoreleasePool alloc] init]; if (findTextField) [self setFindString:[self getFindString]]; [temp appendAttributedString:[textStorage attributedSubstringFromRange: strPart]]; reg = [[AGRegex alloc] initWithPattern: [self findString] options: regexOpt]; br = [text selectedRange]; //get the whole range //go forever n = 0; lastOne = 0; if([regexButton state]) { regexSrch = YES; if([multilineButton state]) mlflag = YES; else mlflag = NO; } options = 0; if (direction == Backward) options |= NSBackwardsSearch; if ([ignoreCaseButton state]) options |= AGRegexCaseInsensitive; rgxcnt = 1; for(;;) { int ssize; //find it in the range if(tr.length + tr.location <= [[temp string] length]) range = [[temp string] findString:[self findString] selectedRange:tr options:options wrap:NO regex: regexSrch multiline: mlflag]; else break; if (range.location == NSNotFound) //here's the great escape break; /* the problem here is that er was the orginal range but this is a moving target */ if(NSEqualRanges(er,NSUnionRange(er, range)) == NO) break; //are we out of range? ss = [reg replaceWithStringWithEscape: [replaceTextField stringValue] inString: [[temp string] substringWithRange: range] raw:0]; if([ss rangeOfString: COUNTSTRING].location != NSNotFound) { ss2= [NSMutableString stringWithString: ss]; [ss2 replaceOccurrencesOfString: COUNTSTRING withString: [NSString stringWithFormat: @"%d", rgxcnt] options: NSCaseInsensitiveSearch range: NSMakeRange(0, [ss length])]; rgxcnt++; ss = ss2; } ssize = [ss length]; if(ssize < range.length) er.length -= range.length - ssize; else if (ssize > range.length) er.length += ssize - range.length; //ss = [NSString string]; //if(range.location <= lastOne) break; //else lastOne = range.location; tr.length = 0; tr.location = range.location+ssize; //tr.location = range.location+range.length + (range.length - ssize); n++; if(!ss) NSBeep(); else [temp replaceCharactersInRange: range withString: ss]; //[statusField setStringValue: [NSString stringWithFormat: @"%d replaced", n]]; /* [statusField setStringValue:[NSString localizedStringWithFormat:NSLocalizedStringFromTable(@"%d replaced", @"FindPanel", @"Status displayed in find panel when indicated number of matches are replaced."), n]];*/ if(n%20 == 0) { [ap release]; ap = [[NSAutoreleasePool alloc] init]; } } [temp endEditing]; if(n) { if ([text shouldChangeTextInRange:strPart replacementString:[temp string]]) [textStorage replaceCharactersInRange:strPart withAttributedString:temp]; [text didChangeText]; } //[text didChangeText]; //make the replace string //replace it //have we done 20? //get re do it; [text setSelectedRange: br]; [reg release]; [ap release]; [temp release]; [statusField setStringValue:[NSString localizedStringWithFormat:NSLocalizedStringFromTable(@"%d replaced", @"FindPanel", @"Status displayed in find panel when indicated number of matches are replaced"), n]]; } } else { NSTextStorage *textStorage = [text textStorage]; NSString *textContents = [text string]; BOOL entireFile = [self entireFile]; NSRange replaceRange = entireFile ? NSMakeRange(0, [textStorage length]) : [text selectedRange]; unsigned searchOption = ([ignoreCaseButton state] ? NSCaseInsensitiveSearch : 0); unsigned replaced = 0; NSRange firstOccurence; if (findTextField) [self setFindString:[self getFindString]]; // Find the first occurence of the string being replaced; if not found, we're done! firstOccurence = [textContents rangeOfString:[self findString] options:searchOption range:replaceRange]; if (firstOccurence.length > 0) { NSAutoreleasePool *pool; NSString *targetString = [self findString]; NSString *replaceString = [self getReplaceString]; NSMutableAttributedString *temp; /* This is the temporary work string in which we will do the replacements... */ NSRange rangeInOriginalString; /* Range in the original string where we do the searches */ [replaceString retain]; // Find the last occurence of the string and union it with the first occurence to compute the tightest range... rangeInOriginalString = replaceRange = NSUnionRange(firstOccurence, [textContents rangeOfString:targetString options:NSBackwardsSearch|searchOption range:replaceRange]); temp = [[NSMutableAttributedString alloc] init]; [temp beginEditing]; // The following loop can execute an unlimited number of times, and it could have autorelease activity. // To keep things under control, we use a pool, but to be a bit efficient, instead of emptying everytime through // the loop, we do it every so often. We can only do this as long as autoreleased items are not supposed to // survive between the invocations of the pool! pool = [[NSAutoreleasePool alloc] init]; while (rangeInOriginalString.length > 0) { NSRange foundRange = [textContents rangeOfString:targetString options:searchOption range:rangeInOriginalString]; if (foundRange.length == 0) { [temp appendAttributedString:[textStorage attributedSubstringFromRange:rangeInOriginalString]]; // Copy the remainder rangeInOriginalString.length = 0; // And signal that we're done } else { NSRange rangeToCopy = NSMakeRange(rangeInOriginalString.location, foundRange.location - rangeInOriginalString.location + 1); // Copy upto the start of the found range plus one char (to maintain attributes with the overlap)... [temp appendAttributedString:[textStorage attributedSubstringFromRange:rangeToCopy]]; [temp replaceCharactersInRange:NSMakeRange([temp length] - 1, 1) withString:replaceString]; rangeInOriginalString.length -= NSMaxRange(foundRange) - rangeInOriginalString.location; rangeInOriginalString.location = NSMaxRange(foundRange); replaced++; if (replaced % 100 == 0) { // Refresh the pool... See warning above! [pool release]; pool = [[NSAutoreleasePool alloc] init]; } } } [pool release]; [replaceString autorelease]; [temp endEditing]; // Now modify the original string if ([text shouldChangeTextInRange:replaceRange replacementString:[temp string]]) { [textStorage replaceCharactersInRange:replaceRange withAttributedString:temp]; [text didChangeText]; } else { // For some reason the string didn't want to be modified. Bizarre... replaced = 0; } [temp release]; } if (replaced == 0) { NSBeep(); [statusField setStringValue:NSLocalizedStringFromTable(@"Not found", @"FindPanel", @"Status displayed in find panel when the find string is not found.")]; } else { [statusField setStringValue:[NSString localizedStringWithFormat:NSLocalizedStringFromTable(@"%d replaced", @"FindPanel", @"Status displayed in find panel when indicated number of matches are replaced."), replaced]]; } } } - (void)takeFindStringFromSelection:(id)sender { NSTextView *textView = [self textObjectToSearchIn]; if (textView) { NSString *selection = [[textView string] substringWithRange:[textView selectedRange]]; [self setFindString:selection]; } } - (void) jumpToSelection:sender { NSTextView *textView = [self textObjectToSearchIn]; if (textView) { [textView scrollRangeToVisible:[textView selectedRange]]; } } @end gtamsanalyzer.app-0.42/Source/TextFinderSemi.m0000555000175000017500000010775310162465511021674 0ustar brentbrent00000000000000/* TextFinder.m Copyright (c) 1995-2001 by Apple Computer, Inc., all rights reserved. Author: Ali Ozer Find and replace functionality with a minimal panel... Would be nice to have the buttons in the panel validate; this would allow the replace buttons to become disabled for readonly docs */ /* IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apples copyrights in this original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Regular expression code added 3/11/2003 by Matthew Weinstein for the TAMS Analyzer project */ #import #import #import "TextFinder.h" #import "AGRegex.h" #import "utils.h" #define COUNTSTRING @"REGEXCOUNT" //#define oldReplaceREGEX 1 #define oneAtATimeReplaceRegex 1 @interface AGRegex (NSEscapeReplace) - (NSString *)replaceWithString:(NSString *)rep inString:(NSString *)str limit:(int)lim range: (NSRange) r; - (NSString *)replaceWithStringWithEscape:(NSString *)rep inString:(NSString *)str; - (NSString *)replaceWithStringWithEscape:(NSString *)rep inString:(NSString *)str limit: (int) lim range: (NSRange) r; @end @interface NSString (NSStringTextFinding) - (NSRange)findString:(NSString *)string selectedRange:(NSRange)selectedRange options:(unsigned)mask wrap:(BOOL)wrapFlag regex: (BOOL) regexFlag multiline: (BOOL) mlFlag; @end @implementation TextFinder static id sharedFindObject = nil; + (id)sharedInstance { if (!sharedFindObject) { [[self allocWithZone:[[NSApplication sharedApplication] zone]] init]; } return sharedFindObject; } - (id)init { if (sharedFindObject) { [super dealloc]; return sharedFindObject; } if (!(self = [super init])) return nil; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidActivate:) name:NSApplicationDidBecomeActiveNotification object:[NSApplication sharedApplication]]; [self setFindString:@"" writeToPasteboard:NO]; [self loadFindStringFromPasteboard]; sharedFindObject = self; return self; } - (void)appDidActivate:(NSNotification *)notification { [self loadFindStringFromPasteboard]; } - (void)loadFindStringFromPasteboard { NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:NSFindPboard]; if ([[pasteboard types] containsObject:NSStringPboardType]) { NSString *string = [pasteboard stringForType:NSStringPboardType]; if (string && [string length]) { [self setFindString:string writeToPasteboard:NO]; } } } - (void)loadFindStringToPasteboard { NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:NSFindPboard]; [pasteboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; [pasteboard setString:[self findString] forType:NSStringPboardType]; } - (void)loadUI { if (!findTextField) { if (![NSBundle loadNibNamed:@"FindPanel" owner:self]) { NSLog(@"Failed to load FindPanel.nib"); NSBeep(); } if (self == sharedFindObject) [[findTextField window] setFrameAutosaveName:@"Find"]; } [findTextField setStringValue:[self findString]]; } - (void)dealloc { if (self != sharedFindObject) { [[NSNotificationCenter defaultCenter] removeObserver:self]; [findString release]; [super dealloc]; } } - (NSString *)findString { return findString; } - (void)setFindString:(NSString *)string { [self setFindString:string writeToPasteboard:YES]; } -(NSString *) getFindString { return [self convertEscapeString: [findTextField stringValue]]; } -(NSString *) getReplaceString { return [self convertEscapeString: [replaceTextField stringValue]]; } -(NSString *)convertEscapeString: (NSString *) oString { int n, i; unichar ch, chn; NSMutableString *newString = [[NSMutableString alloc] init]; //go through the replace string n = [oString length]; for(i = 0; i < n; i++) { ch = [oString characterAtIndex: i]; if(ch == '\\' && i < n - 1) { chn = [oString characterAtIndex: ++i]; switch(chn) { case 't': [newString ADDCHAR('\t')]; break; case 'n': [newString ADDCHAR('\n')]; break; case 'r': [newString ADDCHAR('\r')]; break; default: [newString ADDCHAR('\\')]; [newString ADDCHAR(chn)]; break; } } else [newString ADDCHAR( ch)]; } [newString autorelease]; return newString; } - (void)setFindString:(NSString *)string writeToPasteboard:(BOOL)flag { if ([string isEqualToString:findString]) return; [findString autorelease]; findString = [string copyWithZone:[self zone]]; if (findTextField) { [findTextField setStringValue:string]; [findTextField selectText:nil]; } if (flag) [self loadFindStringToPasteboard]; } - (NSTextView *)textObjectToSearchIn { id obj = [[NSApp mainWindow] firstResponder]; return (obj && [obj isKindOfClass:[NSTextView class]]) ? obj : nil; } - (NSPanel *)findPanel { if (!findTextField) [self loadUI]; return (NSPanel *)[findTextField window]; } /* The primitive for finding; this ends up setting the status field (and beeping if necessary)... */ - (BOOL)find:(BOOL)direction { unsigned options; NSTextView *text = [self textObjectToSearchIn]; lastFindWasSuccessful = NO; if (text) { NSString *textContents = [text string]; unsigned textLength; if (textContents && (textLength = [textContents length])) { NSRange range; BOOL regexSrch; BOOL mlflag; if([regexButton state]) { regexSrch = YES; if([multilineButton state]) mlflag = YES; else mlflag = NO; } else { regexSrch = NO; mlflag = NO; } options = 0; if (direction == Backward) options |= NSBackwardsSearch; if ([ignoreCaseButton state]) options |= NSCaseInsensitiveSearch; range = [textContents findString:[self findString] selectedRange:[text selectedRange] options:options wrap:YES regex: regexSrch multiline: mlflag]; if (range.length) { [text setSelectedRange:range]; [text scrollRangeToVisible:range]; lastFindWasSuccessful = YES; } } } if (!lastFindWasSuccessful) { NSBeep(); [statusField setStringValue:NSLocalizedStringFromTable(@"Not found", @"FindPanel", @"Status displayed in find panel when the find string is not found.")]; } else { [statusField setStringValue:@""]; } return lastFindWasSuccessful; } - (void)orderFrontFindPanel:(id)sender { NSPanel *panel = [self findPanel]; [findTextField selectText:nil]; [panel makeKeyAndOrderFront:nil]; } /**** Action methods for gadgets in the find panel; these should all end up setting or clearing the status field ****/ -(IBAction) setRegexState: (id) Sender { //turn off prev if([regexButton state]) { [findPrevButton setEnabled: NO]; [multilineButton setEnabled: YES]; } else { [findPrevButton setEnabled: YES]; [multilineButton setEnabled: NO]; } } - (void)findNextAndOrderFindPanelOut:(id)sender { [findNextButton performClick:nil]; if (lastFindWasSuccessful) { [[self findPanel] orderOut:sender]; } else { [findTextField selectText:nil]; } } - (void)findNext:(id)sender { if (findTextField) [self setFindString:[self getFindString]]; /* findTextField should be set */ (void)[self find:Forward]; } - (void)findPrevious:(id)sender { if (findTextField) [self setFindString:[self getFindString]]; /* findTextField should be set */ (void)[self find:Backward]; } - (void)replace:(id)sender { NSTextView *text = [self textObjectToSearchIn]; AGRegex *regex; // shouldChangeTextInRange:... should return NO if !isEditable, but doesn't... if (text && [text isEditable] && [text shouldChangeTextInRange:[text selectedRange] replacementString:[self getReplaceString]]) { int regexOpt; if([regexButton state]) { NSString *ss; regexOpt = 0; regexOpt |= ([ignoreCaseButton state])? AGRegexCaseInsensitive : 0; regexOpt |= ([multilineButton state])? AGRegexMultiline : 0; regex = [[AGRegex alloc] initWithPattern: [self findString] options: regexOpt]; ss = [regex replaceWithStringWithEscape: [replaceTextField stringValue] inString: [[text string] substringWithRange: [text selectedRange]]]; if(!ss) NSBeep(); else [[text textStorage] replaceCharactersInRange:[text selectedRange] withString: ss]; [regex release]; [text didChangeText]; } else { [[text textStorage] replaceCharactersInRange:[text selectedRange] withString:[self getReplaceString]]; [text didChangeText]; } } else { NSBeep(); } [statusField setStringValue:@""]; } - (void)replaceAndFind:(id)sender { [self replace:sender]; [self findNext:sender]; } #define ReplaceAllScopeEntireFile 42 #define ReplaceAllScopeSelection 43 /* The replaceAll: code is somewhat complex. One reason for this is to support undo well --- To play along with the undo mechanism in the text object, this method goes through the shouldChangeTextInRange:replacementString: mechanism. In order to do that, it precomputes the section of the string that is being updated. An alternative would be for this method to handle the undo for the replaceAll: operation itself, and register the appropriate changes. However, this is simpler... Turns out this approach of building the new string and inserting it at the appropriate place in the actual text storage also has an added benefit of performance; it avoids copying the contents of the string around on every replace, which is significant in large files with many replacements. Of course there is the added cost of the temporary replacement string, but we try to compute that as tightly as possible beforehand to reduce the memory requirements. */ - (void)replaceAll:(id)sender { NSTextView *text = [self textObjectToSearchIn]; if (!text || ![text isEditable]) { [statusField setStringValue:@""]; NSBeep(); } else if([regexButton state]) { NSArray *foundStrings; AGRegex *reg; AGRegexMatch *match; NSString *regResult; NSMutableString *cntResult; int regexOpt, n; NSRange tr, br; NSTextStorage *textStorage = [text textStorage]; BOOL entireFile = replaceAllScopeMatrix ? ([replaceAllScopeMatrix selectedTag] == ReplaceAllScopeEntireFile) : YES; /* Our strategy is different than the non regex We will do an array of found strings and then work our way backwards through it and pay the cost; without a find backwards we cannot simply modify the alorithm */ regexOpt = 0; regexOpt |= ([ignoreCaseButton state])? AGRegexCaseInsensitive : 0; regexOpt |= ([multilineButton state])? AGRegexMultiline : 0; tr = (entireFile )? NSMakeRange(0, [textStorage length]) : [text selectedRange]; #ifdef newReplaceREGEX ans = [reg replaceWithStringWithEscape: [replaceTextField stringValue] inString: [text string] limit: 0 range: tr]; [text insertText: ans]; #endif #ifdef oldReplaceREGEX reg = [[AGRegex alloc] initWithPattern: [findTextField stringValue] options: regexOpt]; foundStrings = [reg findAllInString: [text string] range: tr]; br = [text selectedRange]; if((n = [foundStrings count]) > 0) { //count down so that we're substituting the last first //otherwise range will be off for(i = n - 1; i>= 0; i--) { [statusField setStringValue: [NSString stringWithFormat: @"%d/%d", n - i, n]]; match = [foundStrings objectAtIndex: i]; regResult = [reg replaceWithStringWithEscape: [replaceTextField stringValue] inString: [[text string] substringWithRange: [match rangeAtIndex: 0]]]; /* [[text textStorage] replaceCharactersInRange: [match rangeAtIndex: 0] withString: regResult]; */ [text setSelectedRange: [match rangeAtIndex: 0]]; cntResult = [NSMutableString stringWithString: regResult]; [cntResult replaceOccurrencesOfString: COUNTSTRING withString: [NSString stringWithFormat: @"%d", i+1] options: 0 range: NSMakeRange(0, [cntResult length])]; [text insertText: cntResult]; } [text didChangeText]; [text setSelectedRange: br]; [reg release]; [statusField setStringValue:[NSString localizedStringWithFormat:NSLocalizedStringFromTable(@"%d replaced", @"FindPanel", @"Status displayed in find panel when indicated number of matches are replaced."), n]]; } else { [statusField setStringValue:@""]; NSBeep(); } #endif #define realRegexReplaceCode #ifdef oneAtATimeReplaceRegex { NSRange range, er; BOOL regexSrch; NSString *textContents = [text string]; BOOL mlflag; unsigned textLength; NSAutoreleasePool *ap; unsigned options; BOOL direction = Forward; NSString *ss; unsigned long lastOne; textLength = [textContents length]; er = tr; if(!(textContents && textLength)) return; tr = (entireFile )? NSMakeRange(0, 0) : [text selectedRange]; [[text textStorage] beginEditing]; ap = [[NSAutoreleasePool alloc] init]; reg = [[AGRegex alloc] initWithPattern: [findTextField stringValue] options: regexOpt]; br = [text selectedRange]; //get the whole range //go forever n = 0; lastOne = 0; if([regexButton state]) { regexSrch = YES; if([multilineButton state]) mlflag = YES; else mlflag = NO; } options = 0; if (direction == Backward) options |= NSBackwardsSearch; if ([ignoreCaseButton state]) options |= AGRegexCaseInsensitive; for(;;) { //find it in the range range = [textContents findString:[self findString] selectedRange:tr options:options wrap:NO regex: regexSrch multiline: mlflag]; if (range.location == NSNotFound) //here's the great escape break; if(NSEqualRanges(er,NSUnionRange(er, range)) == NO) break; //are we out of range? ss = [reg replaceWithStringWithEscape: [replaceTextField stringValue] inString: [[text string] substringWithRange: range]]; //ss = [NSString string]; if(range.location <= lastOne) break; else lastOne = range.location; tr.length = 0; tr.location = range.location+range.length + (range.length - [ss length]); n++; if(!ss) NSBeep(); else [[text textStorage] replaceCharactersInRange: range withString: ss]; //[statusField setStringValue: [NSString stringWithFormat: @"%d replaced", n]]; /* [statusField setStringValue:[NSString localizedStringWithFormat:NSLocalizedStringFromTable(@"%d replaced", @"FindPanel", @"Status displayed in find panel when indicated number of matches are replaced."), n]];*/ if(n%20 == 0) { [ap release]; ap = [[NSAutoreleasePool alloc] init]; } } [[text textStorage] endEditing]; [text didChangeText]; //make the replace string //replace it //have we done 20? //get re do it; [text setSelectedRange: br]; [reg release]; [ap release]; [statusField setStringValue:[NSString localizedStringWithFormat:NSLocalizedStringFromTable(@"%d replaced", @"FindPanel", @"Status displayed in find panel when indicated number of matches are replaced"), n]]; } #endif #ifdef newestReplaceRegex { NSTextStorage *textStorage = [text textStorage]; NSString *textContents = [text string]; BOOL entireFile = replaceAllScopeMatrix ? ([replaceAllScopeMatrix selectedTag] == ReplaceAllScopeEntireFile) : YES; NSRange replaceRange = entireFile ? NSMakeRange(0, [textStorage length]) : [text selectedRange]; unsigned searchOption = ([ignoreCaseButton state] ? NSCaseInsensitiveSearch : 0); unsigned replaced = 0; NSRange firstOccurence; if (findTextField) [self setFindString: [findTextString stringValue]]; // Find the first occurence of the string being replaced; if not found, we're done! //need to do this with regex match = [regex findInString: textContents range: replaceRange]; if([match count]) { firstOccurence = [match rangeAtIndex: 0]; } if (firstOccurence.length > 0) { NSAutoreleasePool *pool; NSString *targetString = [self findString]; NSString *replaceString = [self getReplaceString]; [replaceString retain]; NSMutableAttributedString *temp; /* This is the temporary work string in which we will do the replacements... */ NSRange rangeInOriginalString; /* Range in the original string where we do the searches */ // Find the last occurence of the string and union it with the first occurence to compute the tightest range... //--change this //need to figure out the target string by using regex rangeInOriginalString = replaceRange = NSUnionRange(firstOccurence, [textContents rangeOfString:targetString options:NSBackwardsSearch|searchOption range:replaceRange]); temp = [[NSMutableAttributedString alloc] init]; [temp beginEditing]; // The following loop can execute an unlimited number of times, and it could have autorelease activity. // To keep things under control, we use a pool, but to be a bit efficient, instead of emptying everytime through // the loop, we do it every so often. We can only do this as long as autoreleased items are not supposed to // survive between the invocations of the pool! pool = [[NSAutoreleasePool alloc] init]; while (rangeInOriginalString.length > 0) { //-- change me NSRange foundRange = [textContents rangeOfString:targetString options:searchOption range:rangeInOriginalString]; if (foundRange.length == 0) { //--change me [temp appendAttributedString:[textStorage attributedSubstringFromRange:rangeInOriginalString]]; // Copy the remainder rangeInOriginalString.length = 0; // And signal that we're done } else { NSRange rangeToCopy = NSMakeRange(rangeInOriginalString.location, foundRange.location - rangeInOriginalString.location + 1); // Copy upto the start of the found range plus one char (to maintain attributes with the overlap)... [temp appendAttributedString:[textStorage attributedSubstringFromRange:rangeToCopy]]; //-- change me [temp replaceCharactersInRange:NSMakeRange([temp length] - 1, 1) withString:replaceString]; rangeInOriginalString.length -= NSMaxRange(foundRange) - rangeInOriginalString.location; rangeInOriginalString.location = NSMaxRange(foundRange); replaced++; if (replaced % 100 == 0) { // Refresh the pool... See warning above! [pool release]; pool = [[NSAutoreleasePool alloc] init]; } } } [pool release]; [replaceString autorelease]; [temp endEditing]; // Now modify the original string if ([text shouldChangeTextInRange:replaceRange replacementString:[temp string]]) { [textStorage replaceCharactersInRange:replaceRange withAttributedString:temp]; [text didChangeText]; } else { // For some reason the string didn't want to be modified. Bizarre... replaced = 0; } [temp release]; } if (replaced == 0) { NSBeep(); [statusField setStringValue:NSLocalizedStringFromTable(@"Not found", @"FindPanel", @"Status displayed in find panel when the find string is not found.")]; } else { [statusField setStringValue:[NSString localizedStringWithFormat:NSLocalizedStringFromTable(@"%d replaced", @"FindPanel", @"Status displayed in find panel when indicated number of matches are replaced."), replaced]]; } } #endif } else { NSTextStorage *textStorage = [text textStorage]; NSString *textContents = [text string]; BOOL entireFile = replaceAllScopeMatrix ? ([replaceAllScopeMatrix selectedTag] == ReplaceAllScopeEntireFile) : YES; NSRange replaceRange = entireFile ? NSMakeRange(0, [textStorage length]) : [text selectedRange]; unsigned searchOption = ([ignoreCaseButton state] ? NSCaseInsensitiveSearch : 0); unsigned replaced = 0; NSRange firstOccurence; if (findTextField) [self setFindString:[self getFindString]]; // Find the first occurence of the string being replaced; if not found, we're done! firstOccurence = [textContents rangeOfString:[self findString] options:searchOption range:replaceRange]; if (firstOccurence.length > 0) { NSAutoreleasePool *pool; NSString *targetString = [self findString]; NSString *replaceString = [self getReplaceString]; NSMutableAttributedString *temp; /* This is the temporary work string in which we will do the replacements... */ NSRange rangeInOriginalString; /* Range in the original string where we do the searches */ [replaceString retain]; // Find the last occurence of the string and union it with the first occurence to compute the tightest range... rangeInOriginalString = replaceRange = NSUnionRange(firstOccurence, [textContents rangeOfString:targetString options:NSBackwardsSearch|searchOption range:replaceRange]); temp = [[NSMutableAttributedString alloc] init]; [temp beginEditing]; // The following loop can execute an unlimited number of times, and it could have autorelease activity. // To keep things under control, we use a pool, but to be a bit efficient, instead of emptying everytime through // the loop, we do it every so often. We can only do this as long as autoreleased items are not supposed to // survive between the invocations of the pool! pool = [[NSAutoreleasePool alloc] init]; while (rangeInOriginalString.length > 0) { NSRange foundRange = [textContents rangeOfString:targetString options:searchOption range:rangeInOriginalString]; if (foundRange.length == 0) { [temp appendAttributedString:[textStorage attributedSubstringFromRange:rangeInOriginalString]]; // Copy the remainder rangeInOriginalString.length = 0; // And signal that we're done } else { NSRange rangeToCopy = NSMakeRange(rangeInOriginalString.location, foundRange.location - rangeInOriginalString.location + 1); // Copy upto the start of the found range plus one char (to maintain attributes with the overlap)... [temp appendAttributedString:[textStorage attributedSubstringFromRange:rangeToCopy]]; [temp replaceCharactersInRange:NSMakeRange([temp length] - 1, 1) withString:replaceString]; rangeInOriginalString.length -= NSMaxRange(foundRange) - rangeInOriginalString.location; rangeInOriginalString.location = NSMaxRange(foundRange); replaced++; if (replaced % 100 == 0) { // Refresh the pool... See warning above! [pool release]; pool = [[NSAutoreleasePool alloc] init]; } } } [pool release]; [replaceString autorelease]; [temp endEditing]; // Now modify the original string if ([text shouldChangeTextInRange:replaceRange replacementString:[temp string]]) { [textStorage replaceCharactersInRange:replaceRange withAttributedString:temp]; [text didChangeText]; } else { // For some reason the string didn't want to be modified. Bizarre... replaced = 0; } [temp release]; } if (replaced == 0) { NSBeep(); [statusField setStringValue:NSLocalizedStringFromTable(@"Not found", @"FindPanel", @"Status displayed in find panel when the find string is not found.")]; } else { [statusField setStringValue:[NSString localizedStringWithFormat:NSLocalizedStringFromTable(@"%d replaced", @"FindPanel", @"Status displayed in find panel when indicated number of matches are replaced."), replaced]]; } } } - (void)takeFindStringFromSelection:(id)sender { NSTextView *textView = [self textObjectToSearchIn]; if (textView) { NSString *selection = [[textView string] substringWithRange:[textView selectedRange]]; [self setFindString:selection]; } } - (void) jumpToSelection:sender { NSTextView *textView = [self textObjectToSearchIn]; if (textView) { [textView scrollRangeToVisible:[textView selectedRange]]; } } @end @implementation NSString (NSStringTextFinding) - (NSRange)findString:(NSString *)string selectedRange:(NSRange)selectedRange options:(unsigned)options wrap:(BOOL)wrap regex: (BOOL) regexFlag multiline: (BOOL) mlFlag { BOOL forwards = (options & NSBackwardsSearch) == 0; unsigned length = [self length]; NSRange searchRange, range; if (forwards) { searchRange.location = NSMaxRange(selectedRange); searchRange.length = length - searchRange.location; if(regexFlag == YES) { AGRegex *regex; int regexOptions; AGRegexMatch *match; regexOptions = 0; if (options & NSCaseInsensitiveSearch) regexOptions |= AGRegexCaseInsensitive; if(mlFlag == YES) regexOptions |= AGRegexMultiline; regex = [[AGRegex alloc] initWithPattern: string options: regexOptions]; match = [regex findInString: self range: searchRange]; if([match count]) { range = [match rangeAtIndex: 0]; } else if(wrap) { searchRange.location = 0; searchRange.length = selectedRange.location; match = [regex findInString: self range: searchRange]; if([match count]) { range = [match rangeAtIndex: 0]; } else { range.length = 0; range.location = NSNotFound; } } else { range.length = 0; range.location = NSNotFound; } [regex release]; } else { range = [self rangeOfString:string options:options range:searchRange]; if ((range.length == 0) && wrap) { /* If not found look at the first part of the string */ searchRange.location = 0; searchRange.length = selectedRange.location; range = [self rangeOfString:string options:options range:searchRange]; } } } else { searchRange.location = 0; searchRange.length = selectedRange.location; range = [self rangeOfString:string options:options range:searchRange]; if ((range.length == 0) && wrap) { searchRange.location = NSMaxRange(selectedRange); searchRange.length = length - searchRange.location; range = [self rangeOfString:string options:options range:searchRange]; } } return range; } @end @implementation AGRegex (NSEscapeReplace) - (NSString *)replaceWithString:(NSString *)rep inString:(NSString *)str limit:(int)lim range: (NSRange) r { [self replaceWithString: rep inString: [str substringWithRange: r] limit: lim]; } - (NSString *)replaceWithStringWithEscape:(NSString *)rep inString:(NSString *)str limit: (int) lim range: (NSRange) r { int n, i; char ch, chn; NSRange rrr; NSMutableString *newString = [[NSMutableString alloc] init]; //go through the replace string n = [rep length]; rrr.location = 0; rrr.length = 0; for(i = 0; i < n; i++) { ch = [rep characterAtIndex: i]; if(ch == '\\' && i < n - 1) { if(rrr.length) { [newString appendString: [rep substringWithRange: rrr]]; } chn = [rep characterAtIndex: ++i]; rrr.length = 0; rrr.location = 1+i; switch(chn) { case 't': [newString ADDCHAR('\t')]; break; case 'n': [newString ADDCHAR('\n')]; break; case 'r': [newString ADDCHAR('\r')]; break; default: [newString ADDCHAR('\\')]; [newString ADDCHAR(chn)]; break; } } else { rrr.length +=1; //[newString ADDCHAR( ch)]; } } if(rrr.length && rrr.location < n) { [newString appendString: [rep substringWithRange: rrr]]; } [newString autorelease]; return [self replaceWithString: newString inString: str limit: lim range: r] ; } - (NSString *)replaceWithStringWithEscape:(NSString *)rep inString:(NSString *)str { int n, i; char ch, chn; NSRange rrr; NSMutableString *newString = [[NSMutableString alloc] init]; //go through the replace string n = [rep length]; rrr.location = rrr.length = 0; for(i = 0; i < n; i++) { ch = [rep characterAtIndex: i]; if(ch == '\\' && i < n - 1) { if(rrr.length) { [newString appendString: [rep substringWithRange: rrr]]; } chn = [rep characterAtIndex: ++i]; rrr.length = 0; rrr.location = i+1; switch(chn) { case 't': [newString ADDCHAR('\t')]; break; case 'n': [newString ADDCHAR('\n')]; break; case 'r': [newString ADDCHAR('\r')]; break; default: [newString ADDCHAR('\\')]; [newString ADDCHAR(chn)]; break; } } else { rrr.length +=1; //[newString ADDCHAR( ch)]; } } if(rrr.length && rrr.location < n) { [newString appendString: [rep substringWithRange: rrr]]; } [newString autorelease]; return [self replaceWithString: newString inString: str] ; } /* - (NSArray *)findAllInString:(NSString *)str range:(NSRange)range { int length = range.length; int location = range.location; AGRegexMatch *match; NSMutableArray *result = [NSMutableArray array]; NSRange matchRange; while (match = [self findInString:str range:range]) { [result addObject:match]; matchRange = [match range]; range.location = matchRange.location + matchRange.length; if (!matchRange.length) range.location++; range.length = location + length - range.location; if (range.location > length) break; } return result; } */ @end gtamsanalyzer.app-0.42/Source/toolBarDelagate.h0000555000175000017500000000144010162465511022010 0ustar brentbrent00000000000000/* toolBarDelagate */ #import #import @interface toolBarDelagate : NSObject { IBOutlet id theDocument; IBOutlet id mainWindow; int buttonNdx; NSMutableArray *myButtons; NSMutableArray *allButtons; NSMutableArray *textPool, *codePool; NSToolbar *myToolBar; } - (void)setupToolbar; -(void) addItem: (NSString *) ss; -(void) addText: (NSString *) ss; -(void) addBar; - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag; - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar; - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar; -(IBAction) setCode: (id) Sender; -(BOOL) isButton: (NSString *) who; -(void) clearButtons; @end gtamsanalyzer.app-0.42/Source/toolBarDelagate.m0000555000175000017500000003227110162465511022023 0ustar brentbrent00000000000000#import "toolBarDelagate.h" #import "myProject.h" #import "utils.h" #import "prefBoss.h" #import "tams.h" #define GSTEPTOOLBAR1 1 NSString *MGWDTBDelPair=@"Del. pair"; NSString *MGWDTBFindNext=@"Next tag"; NSString *MGWDTBFindPrev=@"Prev tag"; NSString *MGWDTBFindMate=@"Find mate"; NSString *MGWDTBColorTags=@"Color"; NSString *MGWDTBDecolorTags=@"Decolor"; NSString *MGWDTBSelectToButton=@"Txt to button"; NSString *MGWDTBSelCodeDef=@"Sel. code def."; NSString *MGWDTBCodeBrowser=@"Code browser"; NSString *MGWDTBCodeDef=@"Code def."; NSString *MGWDTBRecolorTags=@"Recolor"; int uniqueNumber = 1; NSString *uniqueString() { return [NSString stringWithFormat: @"TAMSSTRING %d", uniqueNumber++]; } @implementation toolBarDelagate -(void) dealloc { [myButtons dealloc]; [allButtons dealloc]; [codePool dealloc]; [textPool dealloc]; } -(id) init { [super init]; codePool = [[NSMutableArray alloc] init]; textPool = [[NSMutableArray alloc] init]; myButtons = [[NSMutableArray alloc] init]; #ifdef GSTEPTOOLBAR1 [myButtons addObject: @"Save..."]; [myButtons addObject: @"Workbench"]; [myButtons addObject: MGWDTBFindNext]; [myButtons addObject: MGWDTBFindPrev]; [myButtons addObject: MGWDTBFindMate]; [myButtons addObject: MGWDTBDelPair]; [myButtons addObject: MGWDTBRecolorTags]; #else [myButtons addObject: NSToolbarCustomizeToolbarItemIdentifier]; [myButtons addObject: NSToolbarSeparatorItemIdentifier]; [myButtons addObject: @"Save..."]; [myButtons addObject: @"Workbench"]; [myButtons addObject: NSToolbarSeparatorItemIdentifier]; #endif allButtons = [[NSMutableArray alloc] init]; [allButtons addObject: NSToolbarCustomizeToolbarItemIdentifier]; [allButtons addObject: NSToolbarSpaceItemIdentifier]; [allButtons addObject: NSToolbarFlexibleSpaceItemIdentifier]; [allButtons addObject: NSToolbarSeparatorItemIdentifier]; [allButtons addObject: @"Save..."]; [allButtons addObject: @"Workbench"]; [allButtons addObject: MGWDTBDelPair]; [allButtons addObject: MGWDTBFindNext]; [allButtons addObject: MGWDTBFindPrev]; [allButtons addObject: MGWDTBFindMate]; [allButtons addObject: MGWDTBRecolorTags]; [allButtons addObject: MGWDTBColorTags]; [allButtons addObject: MGWDTBDecolorTags]; [allButtons addObject: MGWDTBSelectToButton]; [allButtons addObject: MGWDTBCodeDef]; [allButtons addObject: MGWDTBSelCodeDef]; [allButtons addObject: MGWDTBCodeBrowser]; buttonNdx = 1; return self; } /* ghost routines */ -(BOOL) isInCodePool: (NSString *)s { FORALL(codePool) { if([temp isEqualToString: s] == YES) return YES; } ENDFORALL; return NO; } -(BOOL) isInTextPool: (NSString *)s { FORALL(textPool) { if([temp isEqualToString: s] == YES) return YES; } ENDFORALL; return NO; } - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag { NSMenuItem *m; NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; if ( [itemIdentifier isEqualToString:MGWDTBDelPair] ) { [item setLabel:MGWDTBDelPair]; [item setPaletteLabel:MGWDTBDelPair]; [item setImage:[NSImage imageNamed:@"twoTagBasicNot.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(doDeleteCodePair:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBCodeDef] ) { [item setLabel:MGWDTBCodeDef]; [item setPaletteLabel:MGWDTBCodeDef]; [item setImage:[NSImage imageNamed:@"def.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(requestCodeDefinition:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBCodeBrowser] ) { [item setLabel:MGWDTBCodeBrowser]; [item setPaletteLabel:MGWDTBCodeBrowser]; [item setImage:[NSImage imageNamed:@"codeBrowser.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(showCodeBrowser:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBFindNext] ) { [item setLabel:MGWDTBFindNext]; [item setPaletteLabel:MGWDTBFindNext]; [item setImage:[NSImage imageNamed:@"nextTag.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(doFindNextCode:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBFindPrev] ) { [item setLabel:MGWDTBFindPrev]; [item setPaletteLabel:MGWDTBFindPrev]; [item setImage:[NSImage imageNamed:@"prevTag3.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(doFindCurrentCode:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBRecolorTags] ) { [item setLabel:MGWDTBRecolorTags]; [item setPaletteLabel:MGWDTBRecolorTags]; [item setImage:[NSImage imageNamed:@"reColor.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(recolorTags:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBFindMate] ) { [item setLabel:MGWDTBFindMate]; [item setPaletteLabel:MGWDTBFindMate]; [item setImage:[NSImage imageNamed:@"selOtherTag.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(doFindMate:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBColorTags] ) { [item setLabel:MGWDTBColorTags]; [item setPaletteLabel:MGWDTBColorTags]; [item setImage:[NSImage imageNamed:@"colorTags.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(doColorize:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBSelectToButton] ) { [item setLabel:MGWDTBSelectToButton]; [item setPaletteLabel:MGWDTBSelectToButton]; [item setImage:[NSImage imageNamed:@"txt2Button.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(doTurnTextToButton:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBSelCodeDef] ) { [item setLabel:MGWDTBSelCodeDef]; [item setPaletteLabel:MGWDTBSelCodeDef]; [item setImage:[NSImage imageNamed:@"defFromSel.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(requestCodeDefinitionOfSelection:)]; } else if ( [itemIdentifier isEqualToString: MGWDTBDecolorTags] ) { [item setLabel:MGWDTBDecolorTags]; [item setPaletteLabel:MGWDTBDecolorTags]; [item setImage:[NSImage imageNamed:@"decolorTags.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(doColorOff:)]; } else if ( [itemIdentifier isEqualToString:@"Workbench"] ) { [item setLabel:@"Workbench"]; [item setPaletteLabel:[item label]]; [item setImage:[NSImage imageNamed:@"wbicn.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(moveWorkBenchForward:)]; } else if( [itemIdentifier isEqualToString:@"Save..."] ) { [item setLabel:@"Save"]; [item setPaletteLabel:[item label]]; [item setImage:[NSImage imageNamed:@"Save.tif"]]; [item setTarget:theDocument]; [item setAction:@selector(saveDocument:)]; } else if ([self isInCodePool: itemIdentifier] == YES && [theDocument isACode: itemIdentifier] == YES) { NSMutableString *mys = [[NSMutableString alloc] init]; if([itemIdentifier length] > 10) { [mys setString: [itemIdentifier substringToIndex: 3]]; [mys appendString: @""]; [mys appendString: [itemIdentifier substringFromIndex: ([itemIdentifier length] - 7)]]; } else [mys setString: itemIdentifier]; [item setLabel: mys]; [item setPaletteLabel: mys]; [item setImage:[NSImage imageNamed:@"codeicn.tif"]]; [item setTarget:self]; [item setAction:@selector(setCode:)]; [item setToolTip: [itemIdentifier copy]]; #ifdef TBCONTROLKEY if(buttonNdx <= 9) { m = [item menuFormRepresentation]; [m setKeyEquivalent: [NSString stringWithFormat: @"%d", buttonNdx]]; [m setKeyEquivalentModifierMask: NSControlKeyMask];//|NSCommandKeyMask buttonNdx++; } #endif } else if ([self isInCodePool: itemIdentifier] == YES && [theDocument isACode: itemIdentifier] == NO) { NSWARNING(@"You've asked to make a button from a not registered code."); } else if([self isInTextPool: itemIdentifier] == YES) { NSMutableString *mys = [[NSMutableString alloc] init]; if([itemIdentifier length] > 10) { [mys setString: [itemIdentifier substringToIndex: 8]]; [mys appendString: @""]; } else [mys setString: itemIdentifier]; [item setLabel: mys]; [item setPaletteLabel: mys]; [item setImage:[NSImage imageNamed:@"metaicn.tif"]]; [item setTarget:self]; [item setToolTip: [itemIdentifier copy]]; [item setAction:@selector(setText:)]; #ifdef TBCONTROLKEY if(buttonNdx <= 9) { m = [[NSMenuItem alloc] initWithTitle: mys action: NULL keyEquivalent:[NSString stringWithFormat: @"%d", buttonNdx]]; [m setKeyEquivalentModifierMask: NSControlKeyMask];//|NSCommandKeyMask [item setMenuFormRepresentation: m]; buttonNdx++; } #endif [mys release]; } return [item autorelease]; } -(IBAction) setCode: (id) Sender { [theDocument applyCode: [Sender itemIdentifier]]; } -(IBAction) setText: (id) Sender { [theDocument insertString: [Sender itemIdentifier]]; if([gPrefBoss autoColorValue]) [theDocument doColorize: nil]; } - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar { return allButtons; } - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar { //return myButtons; return myButtons; } -(void) clearButtons { [allButtons removeAllObjects]; [codePool removeAllObjects]; [textPool removeAllObjects]; } -(void) addCmd: (NSString *) ss { if([ss isEqualToString: @"cmd::delTagPair"]) [myToolBar insertItemWithItemIdentifier: MGWDTBDelPair atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::findNextTag"]) [myToolBar insertItemWithItemIdentifier: MGWDTBFindNext atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::findPrevTag"]) [myToolBar insertItemWithItemIdentifier: MGWDTBFindPrev atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::findMate"]) [myToolBar insertItemWithItemIdentifier: MGWDTBFindMate atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::colorTags"]) [myToolBar insertItemWithItemIdentifier: MGWDTBColorTags atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::decolorTags"]) [myToolBar insertItemWithItemIdentifier: MGWDTBDecolorTags atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::selectedTextToButton"]) [myToolBar insertItemWithItemIdentifier: MGWDTBSelectToButton atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::selectedTextCodeDefinition"]) [myToolBar insertItemWithItemIdentifier: MGWDTBSelCodeDef atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::codeBrowser"]) [myToolBar insertItemWithItemIdentifier: MGWDTBCodeBrowser atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::codeDef"]) [myToolBar insertItemWithItemIdentifier: MGWDTBCodeDef atIndex: [[myToolBar items] count]]; else if([ss isEqualToString: @"cmd::recolorTags"]) [myToolBar insertItemWithItemIdentifier: MGWDTBRecolorTags atIndex: [[myToolBar items] count]]; } -(void) addItem: (NSString *) ss { [allButtons addObject: [[ss copy] autorelease]]; [codePool addObject: [[ss copy] autorelease]]; //[myButtons addObject: ss]; [myToolBar insertItemWithItemIdentifier: [ss copy] atIndex: [[myToolBar items] count]]; } -(void) addText: (NSString *) ss { [allButtons addObject: [[ss copy] autorelease]]; [textPool addObject: [[ss copy] autorelease]]; //[myButtons addObject: ss]; [myToolBar insertItemWithItemIdentifier: [ss copy] atIndex: [[myToolBar items] count]]; } -(void) addBar { [myToolBar insertItemWithItemIdentifier: NSToolbarSeparatorItemIdentifier atIndex: [[myToolBar items] count]]; } -(BOOL) isButton: (NSString *) who { NSArray *theList; theList = [myToolBar items]; FORALL(theList) { if([who isEqualToString: [temp itemIdentifier]] == YES) return YES; } ENDFORALL; return NO; } - (void)setupToolbar { NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier: @"tamsDocumentToolbar"];//uniqueString()]; [toolbar autorelease]; [toolbar setDelegate:self]; [toolbar setAllowsUserCustomization:YES]; [toolbar setAutosavesConfiguration: NO]; [mainWindow setToolbar: toolbar]; myToolBar = toolbar; } -(void) awakeFromNib { [self setupToolbar]; } @end gtamsanalyzer.app-0.42/Source/tproj large icon.tif0000555000175000017500000002255010162465511022441 0ustar brentbrent00000000000000MM*$@ >+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?| >+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|W+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|+?|+?|+?|+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|W\=Z '?\DeKnA`:V;VDdGiGhCc>[DeNsS{LoGiLoSzV~+?|+?|V~QwGh@^Fg?][Il@^8S\JlRxHjCbHjRxV~+?|+?|V~7IkCbGiEf>[BaIlGi?]=ZKnCc=YBaHj JlHj@_?\HjQwGh@^GhQwV~+?|+?|V~SzLpHjKoEf=ZA`IkGh?\=ZEfLoEf?]EeKnBb?]DdLpLpEeA`HjQwFg@^FhQwV~+?|+?|VT|QwNsPuDd:U;W@^?];V>[HjMqFg@^EfLpEf=Y?\GhIlEePvFg@^FhQwV~+?|+?|WU}RyPvQx #Dd8R6P;W[DeMqOtGiBaGiMrHj=Z:U>\BbDdHjOtSzPvFg@^FhQwV~+?|+?|WU}RyPvQxOtDe:V\CbLpPvRyT|U~T|QwOtQwT{SzNrIkGiJmOtRxPvKnEfA`BaJmSzV~+?|+?|WVV~U}U}QxHjBbHjQwU}V~VWV~U}T|U}V~V~T|RyRxSzT|T{OtGiBaBaGiOtT|V+?|+?|WWWWV~SzMqHjMqSzV~WWWWWVWWWVV~V~V~VU}QxLpIkKnOtS{V~W+?|+?|WWWWVU}RxPuRxU}VWWWWWWWWWWWWWWV~U}SzRxSzT|V~WW+?|+?|WWWWWVU~T|U~VWWWWWWWWWWWWWWWWWVV~VWWWW+?|+?|WWWWWWWVWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?|+?|WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+?| >+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?|+?| >@@00$ T$%B@$%X%`(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/proj icons/tproj large icon.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tproj small icon.tif0000555000175000017500000001055010162465511022454 0ustar brentbrent00000000000000MM*@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW T{WWWWWWWWWWWWWWWWWQxWWWWWWWWWWWWWWWWRxWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW. &WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWV~WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW@@   TB@X`(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/proj icons/tproj small icon.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tproj tiny icon.tif0000555000175000017500000000255010162465511022330 0ustar brentbrent00000000000000MM*WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWT|WWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWW SB@X`(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/proj icons/tproj tiny icon.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/tproj2 icon.tif0000555000175000017500000020356410162465511021456 0ustar brentbrent00000000000000MM* :2 Y~/6"?jZ!nlcaf`sd_ u k<&@ZtH\; s: ZlT6 ?Ib3x^47fyqP>/ ^2F'J pqP\. os ^uT/)B !U <h5vg 0.} R  3;`*2<C)m HglW[<}7C:UWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW{'LWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~V~VWWWWWWWWW7QWWWVV~U}T{RyRxQxRxSzT|U~V~VVWWWWWWWWWWWVVV~V~V~V~VVVWWWVVVVVWWVV~U}T{RyQwPuPuQwRyT|U}V~WWWWWW0v:VWWV~U}SzPvLpIkFgEfGiJmMqOtPvPvPuPuPuPvPvQxRySzS{SzSzRxPvOtNsMrMqMqNrOtPvQwRxRxQxPvOuOtOtOtPvQxSzT{T|T|SzPvNsLpKnLoNrPvRyT|U~VWWWWW&x WWVU}S{QwMrIkDdA`@^A`CcDeEfDdA`?]>[>[>[?]@_BbDeFhHjHjGhEeBa@^>[=Z>[?]A_CbEeFgGhFgDeCbA_?]?\>\?\@_CcFhJmMrOtOuNsKoHjFhEfGiKnNsQwS{U}V~WWWWWT|WWV~U}SzPvMqIkEfBbA`A`BaBaA`?\\?\?\=Z;W;V;V\A`EfIkKnKoIlFhCcA`BaDdHjLpPvSzT|V~WWWW5O!1`WWVV~U}S{RxOtLoIkFhEfEeDeDdBb@^=Z;W;V;W=Z>\?]?\>[=Y[A`DeHjKoMqMqKnGiCc@^=Z=Y=Z?]A_A`A`@^>[=Z=Z?]CbFgIlJmJlGiDdA`@^A`DdGiLpPuSzT|U~VWWW ?vWWWVV~U}T|RyPvNrKoJlHjGhFgEfCc@_=Z;V9T8S9T;V[=Y[>[>[=Z=Y=Z>\A_DdGhJlKnJlHjEfBb@^@^A`DdHjLpPvRyT|U~VWWW:VWWWVV~U}T|SzQwOtMqKnJlHjGiEfDdA_=Z:V7R6P6P7Q9T;V\@^BaDdEfGhGiGiGhFgEfFgGiJlLpOtQwRxRxPvNrKnGiDdA`?\=Z\@^BaDdFhHjIlIlHjFgDdA`?]?\?]A`EfIlMqPvSzT|V~VWWRxI(WWWWVV~V~U}T|SzQxPvOtNrLpKnIlGhDd@_=Z;V9T9T;V=Y?]BaDeGhIkKnMqNrOtOtOtNrMrMqMqMrOtPvRxSzT{T|T{SzQxOuMrKnHjFgEeCcCbCbCcDeFgGiIkJmKnJmJlHjFgDdA`?]>[>[?\A`DdHjKoOtQxS{U}V~VWW5N tPvWWWWWWV~V~U~U}T|S{SzRxQwOtMrKnHjDeA`?]>\>\@^BbEfHjKnMqOtQwRxSzSzS{T{S{SzSzRyRySzSzT{T|U}U~U~V~U~U}T|SzRyQwPvOtNrMrMqMqMrNrNsOtOuOuOtNrLpJmHjEfCcA`A_A_A`CcFgIkLpOtQxSzT|U~V~VWW&J&8mWWWWWWWWVVV~V~U~U}T|S{RyPvNsLoIkFgDdCcCcDdFhIkLoNsPvRyS{T|U}U~V~V~V~V~U~U~U~U~U~U~V~V~V~VVVVVV~V~U~U}U}T|T|S{SzSzSzSzS{S{T{T{SzSzRxPvOtMqKoJlIkHjHjHjJlKnMqOtPvRyT{U}U~V~VWWWWWWWWWWWWWWWWVV~U~U}T{RyQwOtMqKnIlHjHjIkJmLpNsPvRyS{T|U~V~VWWWWWWVVVVVVWWWWWWWWWWVVVV~V~V~V~V~V~V~V~V~V~V~U~U}T|T{SzRyQwPvOuOtOtOtOuPvQwRxSzT|U}U~V~VWWWWMrs:VWWWWWWWWWWWWWWVV~V~U}T|SzRxPvOtNsMrMqMrNsOtPvRxSzT|U}V~V~VWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~U}U}T|T|T{S{S{S{S{T{T|T|U}U~V~V~VVWWWWW4M`=WWWWWWWWWWWWWWWWVV~V~U~U}T|SzSzRxRxQxQxRxRySzS{T|U}U~V~VVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVV~V~V~V~V~V~V~V~V~V~V~V~VVVWWWWWWWW*R,5OT@\dl(R/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/icon files/proj icons/tproj2 icon.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/twoTagBasic.tif0000555000175000017500000000650010162465511021523 0ustar brentbrent00000000000000MM*  휧 籺簹篸殸 絾 媴垩ᔠޔޜ ᫵彻 㔠ޔޔޔ ⡬⢭⦰ ޔޔޔޘ ᝩᝩᦰ촻唠 ޔޔޔޜ ꮵ׺֔ ޔޜ ߘҳ۔ޔޔޔޔޔޔޓ骰ѻ㔠ޔޔޔޔޔސݏݐѼ䔠ޔތҔޔޔޏݐݔ痢ߒ۔ޔޔޔޖߗߛᡫ⢭瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳铞ܔޔޔޔޘߡ⡫⡫⡬⣮㧱䫵ߔޔޔޔޛ࡫⡫⢭⤮㦱䪴孶ꕡޔޔޔޠ⣭㣮㤮㦱䪳孶決풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾 哞ܔޔޔަ䧱䩳媴孶氹絾 ꓟےۖޔޫ媳嫵孶殸沺 菛׈ͩ갹籺糼跿     9  @  0 8(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/twoTagBasic.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/twoTagBasicNot.tif0000555000175000017500000000650210162465511022206 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺氹簹絾疢ߖߪޤ Ө᬴ 矪ޔ ⡫⡬⢭⦰ ᖡޔޔ ᝩᝩᝩᦰ 唠ޔޔ ׺ޔޙ 昤ߘߘߘߜ ޔޔޔ ޓޓޗߞ ѻޔޔޔޔ ݐݑݙ࣭ ѼތҔޔޔ ݔޘߞᡫ ح۔ޔޔޔޖ ᨞ ݔޔޔޖߝឩᡫ⡫⡬⤮㪳 ޔޔޔޘߡ⡫⡫⡬⣮㧱䫵 ޔޔޔޛ࡫⡫⢭⤮㦱䪴 ޔޔޔޠ⣭㣮㤮㦱䪳 ޔޔޤ㤮㥯㧱䪳辺߾ ޔޔަ䧱䩳媴 ꓟޫ媳嫵孶 菛׈갹籺     <  @  2 :(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/twoTagBasicNot.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/txt2Button.tif0000555000175000017500000000647610162465511021425 0ustar brentbrent00000000000000MM* 휧ᝨ᰹籺簹篸殸氹簹絾疢ߖߪ垩ᔠޔޜ঱䦱䧱䫵矪᥯㔠ޔޔޔޡ⡫⡬⢭⦰ᖡޔޔޔޔޘߝᝩᝩᝩᦰ촻唠ޔޔޔޔޔޜᛦ֔ޔޔޔޔޙߘߘ۔ޔޔޔޔޔޔޓ㔠ޔޔޔޔޔސݏ䔠ޔތҔޔޔޏ⵽痢ߒ۔ޔޔޔޖߗ⢭⧱瑝ړݔޔޔޖߝឩᡫ⡫⡬⤮㪳풞ڔޔޔޤ㤮㥯㧱䪳孶氹絾哞ܔޔޔަ䧱䩳媴孶氹絾    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/txt2Button.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/unmarkRec.tif0000555000175000017500000000647610162465511021257 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ު۔ު5555555555555555ު5555555555555555ޔު5555555555V=55555痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ    7  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/unmarkRec.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/unmarkRec2.tif0000555000175000017500000000647610162465511021341 0ustar brentbrent00000000000000MM* 휧ᝨ簹篸殸氹簹絾疢ߖߪ矪ޔޔޔޡ⡫⡬⢭⦰ᖡުޔޔޘߝᝩᝩᝩᦰ촻唠ޔުޔޔޜᛦꮵ׺֔ުޗ۔ު5555555555555555"""""""ޔޔު5555555555555555"""""""ޔޔު5555555555V=55555"""""""痢ߒ۪瑝ړݪޔޖߝឩᡫ⡫⡬⤮㪳铞ܔުޔޘߡ⡫⡫⡬⣮㧱䫵ߔުޔޛ࡫⡫⢭⤮㦱䪴孶춽ꕡު풞ڪޔޤ㤮㥯㧱䪳孶氹絾哞ܪߘߘߘߘߘߘߘߘߘ߽ꓟے۪ߘߘߘߘߘߘߘߘߘߘߘ菛׈ͪ    8  @  . 6(/Volumes/Kerouac/prog/TAMSAnalyzer2/avTA/unmarkRec2.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/utils.h0000555000175000017500000000244510162465511020125 0ustar brentbrent00000000000000// // utils.h // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2002 M. Weinstein. All rights reserved. // #import #import #define ADDCHAR(X) appendFormat: @"%C",X //#define ADDCHAR(X) appendString: charToNSS(X) #define FORALL(X) {id temp; unsigned __cnt, __i; __cnt = [X count]; for( __i = 0; __i < __cnt; __i++) {temp = [X objectAtIndex: __i]; #define ENDFORALL }} #define ISQUOTE(X) ([X characterAtIndex: 0] == '\"' && [X characterAtIndex: ([X length] -1)] == '\"') #define NSWARNING(X) NSRunAlertPanel(@"Warning!", X, @"Ok", nil, nil); #define NSMESSAGE(X) NSRunAlertPanel(@"Note:", X, @"Ok", nil, nil); #define NSYESNOQUESTION(X) ((NSRunAlertPanel(@"Question:", X, @"No", @"Yes", nil) == 0) ? YES : NO) #define NSSETHEADER(T,C,S) [[[T tableColumnWithIdentifier: C] headerCell] setStringValue: S] NSString *charToNSS(char c); NSMutableString *trimNSS(NSMutableString *s); NSMutableString *trimCharNSS(NSMutableString *s, unichar ch); NSMutableArray *convertStringToArray(NSString *theString, char breakChar); int nsSubString(NSString *first, NSString *sec, BOOL caseInsensitive); int menuStringComp(id first, id second, void *key); #define NSALLOC(X,Y) X *Y = [[X alloc] init] BOOL addUniqueToArray(NSMutableArray *who, NSString *what); gtamsanalyzer.app-0.42/Source/utils.m0000555000175000017500000000605310162465511020131 0ustar brentbrent00000000000000// // utils.m // CocoaTams // // Created by matthew on Mon Apr 15 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "utils.h" int menuStringComp(id first, id second, void *key) { return [[first lowercaseString] compare: [second lowercaseString]];//[first caseInsensitiveCompare: second]; } NSString *charToNSS(char c) { NSString *tmp; char ss[2]; ss[0] = c; ss[1] = '\0'; tmp = [NSString stringWithCString: ss]; //[tmp retain]; return tmp; } NSMutableString *trimNSS(NSMutableString *s) { char c; //keep checking the first character for(;;) { if([s length] == 0) break; c = [s characterAtIndex: 0]; if(c == ' ' || c == '\t' || c == '\n' || c == '\r') [s deleteCharactersInRange: NSMakeRange(0, 1)]; else break; } for(;;) { if([s length] == 0) break; c = [s characterAtIndex: ([s length] - 1)]; if(c == ' ' || c == '\t' || c == '\n' || c == '\r') [s deleteCharactersInRange: NSMakeRange([s length] - 1, 1)]; else break; } return s; } NSMutableString *trimCharNSS(NSMutableString *s, unichar ch) { unichar c; //keep checking the first character for(;;) { if([s length] == 0) break; c = [s characterAtIndex: 0]; if(c == ch) [s deleteCharactersInRange: NSMakeRange(0, 1)]; else break; } for(;;) { if([s length] == 0) break; c = [s characterAtIndex: ([s length] - 1)]; if(c == ch) [s deleteCharactersInRange: NSMakeRange([s length] - 1, 1)]; else break; } return s; } NSMutableArray *convertStringToArray(NSString *theString, char breakChar) { int i, len; int inString; char c; NSMutableString *ss = [[NSMutableString alloc] init]; NSMutableArray *ans = [[NSMutableArray alloc] init]; len = [theString length]; [ss setString: @""]; inString = 0; for(i = 0; i < len; i++) { c = [theString characterAtIndex: i]; if(c == '\"' && !inString) { [ss ADDCHAR(c)]; inString = 1; } else if(inString) { [ss ADDCHAR(c)]; if(c == '\"') inString = 0; } else if (c == breakChar) { if([ss length] > 0) { [ans addObject: [ss copy]]; [ss setString: @""]; } } else { [ss ADDCHAR(c)]; } } if([ss length]) { [ans addObject: [ss copy]]; } [ss release]; return [ans autorelease]; } BOOL addUniqueToArray(NSMutableArray *who, NSString *what) { int cnt; int i; cnt = [who count]; for(i = 0; i < cnt; i++) { if([[who objectAtIndex: i] isEqualToString: what] == YES) return NO; } [who addObject: what]; return YES; } int nsSubString(NSString *first, NSString *sec, BOOL caseInsensitive) { NSRange rng; NSRange nulRange = {NSNotFound, 0}; if(caseInsensitive == YES) { if((rng = [first rangeOfString: sec options: caseInsensitive]).location == NSNotFound) return -1; else return rng.location; } else { if((rng = [first rangeOfString: sec ]).location == NSNotFound) return -1; else return rng.location; } } gtamsanalyzer.app-0.42/Source/varRegistry.h0000555000175000017500000000120210162465511021274 0ustar brentbrent00000000000000// // varRegistry.h // TAMS Edit // // Created by matthew on Sun Apr 21 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import struct regObject { NSMutableString *key; NSNumber *value; }; @interface varRegistry : NSObject { NSMutableDictionary *theVault; } -(NSNumber*) find: (NSString*) key; -(int) findInt: (NSString*) key; -(unsigned) findUns: (NSString* ) key; -(void) setKey: (NSString *) key intValue: (int) myValue; -(void) setKey: (NSString *) key unsValue: (unsigned) myValue; -(NSMutableDictionary *) getGlobals ; -(void) setGlobals: (NSDictionary *) who ; @end gtamsanalyzer.app-0.42/Source/varRegistry.m0000555000175000017500000000175310162465511021314 0ustar brentbrent00000000000000// // varRegistry.m // TAMS Edit // // Created by matthew on Sun Apr 21 2002. // Copyright (c) 2001 Matthew Weinstein. All rights reserved. // #import "varRegistry.h" @implementation varRegistry -(id) init { [super init]; theVault = [[NSMutableDictionary alloc] init]; return self; } -(NSMutableDictionary *) getGlobals {return theVault;} -(void) setGlobals: (NSDictionary *) who {[theVault addEntriesFromDictionary: who];} -(NSNumber *) find: (NSString*) key { return [theVault objectForKey: key]; } -(int) findInt: (NSString*) key { return [[theVault objectForKey: key] intValue]; } -(unsigned) findUns: (NSString* ) key { return [[theVault objectForKey: key] unsignedIntValue]; } -(void) setKey: (NSString *) key intValue: (int) myValue { [theVault setObject: [NSNumber numberWithInt: myValue] forKey: key]; } -(void) setKey: (NSString *) key unsValue: (unsigned) myValue { [theVault setObject: [NSNumber numberWithUnsignedInt: myValue] forKey: key]; } @end gtamsanalyzer.app-0.42/Source/wbicn.tif0000555000175000017500000000647010162465511020424 0ustar brentbrent00000000000000MM* 贽豺簹簹絾篸栫䧱䫵榰랥Ⱥ-ឩᘞ-噝㰹Ϛߚߛޗߠ͛ߙߐݏݐݑݙ࣭㫵尹簹؛ޖߗᡫ⢭⧱䰹웧ߛឩ⡬⤮횦ܛᡫ⡫⣮㧱䯸对࡫⡫㦱䪴孷宷尹ᣭ㣮䪳孶歷宷尹ࢭ⤮㥯孶氹箷宸ᦰ䦱䧱䩳媴孶氹絾诸毸ᚦ䪳媳嫵孶殸沺꯸毸簹簹籺糼跿鰹    2  @  ( 0(/Users/matthew/Documents/tams documents/wbicn.tifCreated with The GIMPHHgtamsanalyzer.app-0.42/Source/workbench.png0000644000175000017500000003735510162465511021313 0ustar brentbrent00000000000000PNG  IHDR:ɻ>IDATx/ʝ |6|l>yewOo/j^l>݆ͷ7[݆RiOK<=_~=ty~PS?^v2)a5ݒl> SۯkK5/^\<_9z^\cHEkn>ncLc˧΄뛵==n*_\[_f[OeO5%lC4od}GF_D%YfOܔfkOټ>26Y{Kf~KT=[!g__/GA%3;vҿ{Q-P^&ܛs$:Kt%5lmۭiZ˸E/!6 3#OݫW6oכuHXKK(zkJSt Ӿ~)].Šk_GtK5ڵ6-Q#ȵvψ|v[?}zA4߸zw~~}oÛ5L-^cS0}U1Sq_fmZq7 |H\_mcnu2ausx}6<~vqua^nE=}uzgx-P Ѿl صJ/ws<6awr7q{? &ZYNzmOWAW)?}rvvnKK}cgrNxm?O`HS6sj'>pS =;?=!K(5'^|O=EF?f}o?}>:'K2ϯ#]Ev׹Iݻmg6Gp{eК绩{͝پWz~_YY+#\\3w{Q?L׿|yts`Pi7ےZ>MsZm>jRMk͚mǯE✯;YlϷ ںuz;ü-撼[\ T^M;5Zcw6;u,r}-lN܎Wv4ux~۰}.៪_ODG|{|ft'_fޤA=Ogg/K;si7 m}e'W1s2bnF9S(}Aq^{mq>Bu]iW ڋ8^>~:Sx]~??ӭ I.S;j1)]&߭~ϼRTGvN kct>˴)vξND޾uf]}ݨۥU {uX]{}zm/.Ghm2KqvLXLʷ½Wq+ILnx٘s}][nv۶{C>j1Si; C ӨT*}]7rSKn3W5=Yv ےT]t ˻_u*wm>i4upA?KYnRӐkUTs ?. }4_7Q"$5"hиPOJw}*]mOݻbwЮ 3/./³0 C\yS88i꒧xv T,kS*k;Sʉ*rQ^qU Rc8se{a9?JT橿4NRuRk^w5_/"JmJ6<0L0=حaҶEX.TWʷs|6^m kه8Mx+6ÒyZ//Vuϰo-p =On~?^}Rs<}tQFTx,Si5w⪠,w(75黏5eots=˗;TN.ik\ՌI|e[.#_]2N r)6O!mT 1Am͗/Oߟyoͻߟn|yڮW՟?o7lٞfK<[]O%ã_W* G1şoK;h,:?75R!v-uv:\k ַ;_Pֻ ߕ`%ʓwrQdEpw\748 zߩDa>20,OnZfϚh^Oտ>Њ[rw{_傫o߾}w[WjZd>;I*v g ϭn\]}Q^';}ZƯ c|[(W=Nc'LςRRtV#l5Yk%jTkpi$XX[u,]΁͗Ԍj䂨\ rI)L_HZP6vͩLfoonwʷO2^3eE:P,,WrVPW_w;ץfBJlU].1Ł\"h2NLˮ~ؽ߮asݺ8]CNS@ co߾}/k) KbvhoO궭Y>D Sb7R';ぼ軕ahя!^ܷ;,[wvK"Z[B ++}Gsj>lfuavKKOM=6|6Y4q} +$Bi7OJMrd7a xT*@jUߛmqu3W/./7Oq_q8׭ gj/O_# 644Aݟe7|j/_j'l۬M?|y/ lukvXu~=}7<^ue|skym֮+3jW j\zQV,TB#]gUgszw4Qu$yv/ۮG\"P-0oloZE|nuJռI-U&.)_ xnmM0ݖgwKRMAowwϕF|Tn-MXU?jZ.wZn-YsP%6 I-p1W=|hLjf3Wө+\T^(uw07eBzLNcZYRjt&4O=]]NTunJeԗ|O.߅ukwNV-~L{R<.|WS'=!7aك .#OG85A`;'{=]0ޒK~E;d{lF5Ͽ穖+5.+—~ws[qg}7Wc΢\Tw|W3wC}uIX_usMsʘe^3qE2l=f'趀%n &w`>] UL}Ct97_a\ \0g^0goܷ})lHIn҆TH7gOMz8Ҏ3!aԞMMZ{,惱R檻/yqZ{kYf; /=)\yh:˴Tj#Mz'^O_GtT?n0w=0dv&,ɾXzK>UZ|3?f7h=6kcd;\6.>/g>m].x?, l͔0^i_WV\._l 11=ORZzH[RۺJKa#.n׷\Xn%}=s0rF-MR:@ϸlrYmw&3wrwBәgIi>MZI'״mW*}l+-m#"duIכ;uۺyoxRLfp#cKuy@$\_uןK\RrOHm'p?]ǻ\Hu2o_&āM\?Gg|S/6"D-e_ Tz7u]gknz3[@v9k8ogzj_.q]j_w>vO]沘@=u-oDrk^x ͑l$GE7q|TTx(vT?ا{Du&̭gA2WOq1WeʳcFO*nKz|2}U5Q~hW}J;}Ir֯fU2F3'${= ;=݀6aK߷tgxsK]pJ<9v]?rC՟׊Gj,vNYO\wêٶLO m}ۉ1S3 EmQ5C._m )m(廽),~o<&zv/O*ܮۥ'ъN]=8ZEݻz*=VK껩wm_,k٩qT.bM͐os#tHԵW* ~v͗TRL#!HT?5 JnVyҵrwX2]2W)۸k^ラ.sޞA<sk+֦Or@M?!'|4;*4$QB7Z 'U!2/}MӟںMeiBv '^gc'mzs7J{.O77`ϗٌGn8|T}.5w_ln2Wzhm3`qNkqvgߟo'CuԮ3XzwjOtQnkrcн֞$,nr3n[T}IM=/-49秝]DŽ&ҥBP' j^*;m+|0\ԜRaN*ԌG\\Z5OzM͠|K)XM;ED>ծݞ ?*QpSm܎j]a?ls`&==qYMH x尙f}%Q$*b s{ƿ]mFw[og,9Nl}OseߒB}vLtɸmH=|_Ǘ n֗ߟo۷̷ͯ#;ILk[z;;{FF1:} ҹ>/<:Iwx"<Пs0?frZIe_6kܕ^_=wO^SgyǿRiڮ5|U;<{V\YSP=a1ǹn_|7 ooOڋmܞ=mܞ=Oc=-Kinls@jX\혛vosJJ[E黮H]|.?l׸0)OO_3'lSszvRidjy*Z)SOkQڳV>w;[ۮfᳳϹ*7o/UA}qptlꃟz&[/grv9h'TQZP]} fr gTɥ. J'VKJ:5jiZ8(]ĸyRb[iv2-]!7Q+MDboT@c/qY]{p+&Ʌp2),1!V}6͆ڝNM|mO3a* (ݰeTj.s#tsyR5psAT)xM:Jk&mMEv;vY&_fhi?(x Umpq1,?^'skR!2s5ᮿsGXd7?PR9ԚJUjTQ|!P =]i3W~S#Ҩ6j{:&ȗ_[Ȩpu5vgXuGOř8IO绺!vTg֣}R V 3u5{Ub۵K\@fJmP"w/ʷVVvahhԷ5TnI%+6mJg)L=#䂢t{|U0_ԾR{].>)ߺ%^~Y{ܜO,][Ľ~\B2WFqX{檯UI‰2tUe K# \}i85V]{~it 1XGX3 4uw&NQt]{H G].0'|6v3`DNˏ}},u+gê}=jX omY[Tl{Ru.| U[2ݾɷ\mA_SyTgoC|V'rI5Sm!#7>/sl(~ Ju~.S[7s{9,OU}W,nowmo?WH,__>o:\&}%dä/Ν7uךf;u$zfӾfK/nMӺ-<Rǟ>[jfK|N[(C.D~>~|NSu5k;*vL/E,T^R>Φ}o܎ݶnL r{Ws-Smaڗ㨟s E0 `+ &  `+ & /󺺻SVjkia!f}vsqq]j0W0 rc(& rwO'ެYg<".rquYžb_zϯ>g3& &RC/Y>kewsgӘ-𚰪N=ULKp,xϥ|/s\qa'aXR^2^g.)5Y~ɡ[pnnn{r;K&G,Σh%GԜ5>WrVi.yG-ߵ_ޏn"s,wj ;kל}[Ϙ U͒q1y}| s+-{P3^%^~9+rLQdnDn]h[CpH5Qg6hY3~G2#Xr \&^>Lܡk+dw~a3ʹï>K!@ 2.X &3>.4 ƝI:,j2O϶O6OXjZa&P?mHp뷰߲Y0! &{j{yDgx ̓j/rAԘLscT ,j5#ʝǨ8L)fbkLx58 䂓2i0rx:f,ڡkv)Xe&777ʄY߬o7WwWwWw`<W_}~Y&%\1 rʚafEx.+fA cxJs`W\L+fx K3Gr<8nvv\'4r 8M+fǴTĹ݃y1WG&5 `Z+R2 `Wd s ]Hp@B.^Lf? wwwX Ƿ"r mJ FYVTzo!V{rBUyS])?:+OE*7't:S5?X!^r_q [\j›17Pr1.frK׬y ej 1 !Sn8mYR&P0ّ sf dB5Spe%!l9~2:h1`)WlYL e $\Y8V!7l^7 z5#jFX 팷H l3_rNft+#ws-I5ߒoᔝDpb*O.f: sK>ooNL>oyPvrL\Q|#jYYxC 4B2NMh1B5OΡ:L .85llZV+K'bF^}~fmZ[N/9!p\ 2 [ hi_~ݞݞ*2Oo?vym`]_(Wr u((-gvuwuwu5_]]5ӻ+g{DiR4hK!b-bffW_ n5_n,Y~fkkYCy259tԼ;Ui\-FMusjI{w~ۏ?ǿݻ}Ni;5_cM\HP]50^sJN+ 5_\-L9ʨ .ݻwf>3wىܘlrØvTkVqLW,L+>g^\8.;pjWGB.M/Ȼ,jjZ5ߘ P);cB-Sk|Q]>Gj#Ϭ9$5unGi<5-δ{N-0O)WڏªP}uƽ=#aԄCvG@Z՟euf\KugS 5[^fT-,sUߋy/+[5[4#5wLǏ4agJnk[j>we;TG+t|۷o߾}['9qs`'%su\,aj$4)+ SWk\}/UĿoyênyvќ\s J:*@́ZOpC{-VN{_|Ƿ| K~|cxv´Nǧ~zS##![ۗ/oK 尛}d?0gv}w}w}~~~s%0sB?hCv]W_}~WF{Di!+ \{WG&ۆ $\ G OpTMȱے5A]r7KX'f-PnyVw i~`WwH#ddB `T8>2W3u-SRQpt]o) Oo?_޾}y\/?|i^ y@Xc4uH|^-X\Lg@[ ̔"sϬXy>tyb>bZf  `rHKX Gq\]_0*pWGNLcqfh Vs. __ʵrr[~Lץ#\%9-TtܫܖHʡG1T` * N P/rXn s\ִ̍9sff$ rWQKּ[ W\L1)8 bnW|j+Y3 `+ & OLdҏS;5\ |;,mv2ՌYNKY߬on{*= X&  `+ Ђ <<<MB%v[8&)` TÚ wr]ejޭQ1 `SaL ߱%o7Yb|7}N6\LǪ*'Y|Ϳ\ iN1OɌb_߬o7s+ 뜿Nʜ5r)vn",eơr_Es0کڴS0"LVtf=%sMl>"ӄ%5IPn_*e9#V%ܮ_z(`W !Ja KrDn 3Nw[2m6 }X\w[pd+9|&WVɛOo?vymsya]]]]]])1oooԄCiLjZ)'bsfW\L@p0Z,F3rw!LKp0F9B9L`wtс}p%|Lf-p]t `\ &  `+ & `/?l) Nb` Q85+vTB)X|rQC} pxf^isMWV\pHƄLi^p j̕&`>18$Wsp$ רp \ χn8nbtN+9 `G-___(bVj`Wa2ٌ+]8M,+]8M,+]8M&`B ŸS5p-`Z+Y߬o7a7?L@p0W\L@p0W\0%"^=~xz̒pWärT$S+z9\%*G P*_N Q3QrV7+ &  `+ -`a///̍ `1VjR0O+(3c& A+ "]=v `dYqЮ `+ &  `+ c]W"/o_*I;P`<&  `+ &  `+ &  `+ 8p4b_|c-)-0/=~x:|iNG}<<+(n~ʡT F}mYS'|K\m_^ cơʿ`( _ Z:9|}z@\ia߸[k2B+}P ǭ~Uzs4Yy 5;jLkRs+`(`/d7 `N!gre\'fܗRvcZybC+Oy\GfdVl[j2BC,dt5Vz's0W\L@p0W\L@p0W\L@p0Wco `q_翡77o^?~oZ1W\L@p0W>M`JIENDB`gtamsanalyzer.app-0.42/Source/xrefTableColumn.h0000555000175000017500000000070710162465511022056 0ustar brentbrent00000000000000// // xrefTableColumn.h // TamsAnalyzer // // Created by matthew on Sun Jun 16 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import @interface xrefTableColumn : NSObject { NSMutableArray *colData; } -(BOOL) hasName: (NSString *) n; -(int) cntForName: (NSString *) n; -(void) incName: (NSString *) n; -(void) addName: (NSString *) n; -(void) addName: (NSString *) n withValue: (int) amt; @end gtamsanalyzer.app-0.42/Source/xrefTableColumn.m0000555000175000017500000000234210162465511022060 0ustar brentbrent00000000000000// // xrefTableColumn.m // TamsAnalyzer // // Created by matthew on Sun Jun 16 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import "xrefTableColumn.h" #import "xrefTableInfo.h" #import "tams.h" #import "utils.h" @implementation xrefTableColumn -(id) init { [super init]; colData = [[NSMutableArray alloc] init]; return self; } -(void) incName: (NSString *) n { FORALL(colData) { if([[temp theName] isEqualToString: n] == YES) { [temp inc]; } } ENDFORALL; } -(int) cntForName: (NSString *) n { FORALL(colData) { if([[temp theName] isEqualToString: n] == YES) { return [temp cnt]; } } ENDFORALL; return 0; } -(void) addName: (NSString *) n { xrefTableInfo *tt = [[xrefTableInfo alloc] init]; [tt setTheName: n]; [tt setCnt: 1]; [colData addObject: tt]; } -(void) addName: (NSString *) n withValue: (int) amt { xrefTableInfo *tt = [[xrefTableInfo alloc] init]; [tt setTheName: n]; [tt setCnt: amt]; [colData addObject: tt]; } -(BOOL) hasName: (NSString *) n { FORALL(colData) { if([[temp theName] isEqualToString: n] == YES) { return YES; } } ENDFORALL; return NO; } @end gtamsanalyzer.app-0.42/Source/xrefTableInfo.h0000555000175000017500000000060710162465511021513 0ustar brentbrent00000000000000// // xrefTableInfo.h // TamsAnalyzer // // Created by matthew on Sun Jun 16 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import @interface xrefTableInfo : NSObject { int cnt; NSMutableString *name; } -(int) cnt; -(NSMutableString *) theName; -(void) setTheName: (NSString *) n; -(void) inc; -(void) setCnt: (int) c; @end gtamsanalyzer.app-0.42/Source/xrefTableInfo.m0000555000175000017500000000100510162465511021511 0ustar brentbrent00000000000000// // xrefTableInfo.m // TamsAnalyzer // // Created by matthew on Sun Jun 16 2002. // Copyright (c) 2002 Matthew Weinstein. All rights reserved. // #import "xrefTableInfo.h" @implementation xrefTableInfo -(id) init { [super init]; name = [[NSMutableString alloc] init]; cnt = 0; return self; } -(int) cnt{return cnt;} -(NSMutableString *) theName{return name;} -(void) setTheName: (NSString *) n { [name setString: n]; } -(void) inc {cnt++;} -(void) setCnt: (int) c { cnt = c; } @end gtamsanalyzer.app-0.42/Source/shared_obj0000644000175000017500000000000010162465511020617 0ustar brentbrent00000000000000