Hello Below is a first implementation of the new style completion stuff we were discussing. This is *very* experimental, it may change completely, in some places it may be not working, it may be slow, wrong, not powerful enough or too powerful, it may be... This is just to give you something to play with over the next two weeks ;-) Comments: The thing below contains a patch and a file called `example' which will be created in the Src directory. This file contains a first implementation of the main loop for completion and everything else you need to start. There should be more examples for completion functions for commands, though... The patch will apply on top of 3.1.5-pws3 plus all recent patches or on top of 3.1.5-pws4. To use all this new stuff you define a completion widget (since this name is already used for Peter's `zle -c' stuff I need a different name, but during this mail I will use it...), e.g.: zle -c my-comp expand-or-complete main-complete `my-comp' is the name of the widget to be defined, `main-complete' is the name of a shell function that will be called from the completion code to generate the matches. The `expand-or-complete' can be the name of any the well known names of widgets that call the completion code. The newly defined widget will behave like the widget thus named, except for generating the matches (for which it uses the shell function, not the compctl's). [Peter, would this be interesting to use for your `zle -C' stuff?] In fact the behaviour is inherited by using most of the existing code (this is one of the reasons why the patch is so relatively small). The shell function will generate the matches, anything else, including displaying the matches, inserting them into the command line, deciding to use RECEXACT, AUTOMENU, and whatever else is still done by the shell itself. To use the above widget you then use: bindkey `\C-i' my-comp (Or whichever key you like.) Inside the shell function the completion code sets some variables to report context information and it makes available two new builtins to produce the matches and a couple of condition codes. The variables are: PREFIX the prefix of the current word from the command line IPREFIX an ignored prefix (see below) SUFFIX the suffix of the current word COMMAND the name of the command we are currently completing for CONTEXT the context we are currently completing in, this can be any of: `cmd' we are completing in command position `arg' we are completing in argument position `redir' ... after a redirection operator `math' ... in a math environment `subscr' ... in a subscript `value' ... in the value of an variable assignment `cond' ... inside `[[...]]' argv the positional parameters are set to the *arguments* of the command we are completing for (*not* including the command name) CURRENT this is the index into `argv' pointing to the current word NMATCHES this is the number of matches produced (and accepted) so far These variables are settable, the example file contains two convenient aliases to save and restore them. The completion code uses a wrapper function to rest them to their old values at the end of each function executed from the completion widget. The conditions work on the contents of these variables, probably changing them, they are modelled directly after the `compctl -x' condition code: -prefix str is true if PREFIX starts with str -iprefix str like `-prefix', but makes the matched portion be ignored; this is done by appending the matched portion to IPREFIX and removing it from PREFIX -position beg [end] is true if we are currently in position `beg' (or between `beg' and `end' if that is given); if `end' is given COMMAND, CONTEXT, CURRENT, and argv are changed so that they contain only the range of words between these positions (as always when one of these condition takes an integer argument an expression may be given, like `-position a+1') -word index str is true if the `index'th argument is `str' -mword index pat like `-word' but with pattern matching -current index str -mcurrent index pat like `-word' and `-mword' but the `index' is take relative to the current position -string str -string index str true if the current word contains `str'; anything up to the `index'th occurrence of `str' is ignored (or anything up to the last occurrence if no `index' is given, again this sets IPREFIX and PREFIX) -class str -class index str like `-string' but the `str' is taken as a character class -words min [max] true if we have at least `min' arguments (and less than or equal to `max' arguments if that is given) -between s1 s2 true if we are between an argument equal to `s1' and before an argument equal to `s2' (if there is such an argument) -mbetween p1 p2 like `-between' but with pattern matching -after str true if we are after an argument equal to `str' -mafter pat like `-after' but with pattern matching -nmatches num true if we have generated `num' matches Of course, tests can also be done by using the normal condition stuff and the above variables (probably changing them), but these condition codes may be faster and/or easier to use. The builtins are: complist ... This gets almost the same arguments as compctl, except the more complicated ones (like xor'ed completions, `-x', `-l', ...). When using this builtin the completion code uses the current values of the variables above, so that the combination of this builtin and the condition codes make life really simple... compadd [options] matches... This allows access to the structure used internally used for storing matches. When using this builtin the variables are not used and the completion code does not check if the strings added match what is one the command line, so you should know what you are doing. Supported options are: -q, -Q, -U, -P str, -S str, -J name, -V name these are used like the options with the same names in compctl and complist -f if this option is given the strings are treated like filenames (showing files types with LISTTYPES) -n this keeps the strings from appearing in the list of matches -i str this gives an ignored previous to use when inserting the match; such a string is not listed and inserted before a prefix given with the `-p' option -p str this gives another prefix that is not listed; but it is inserted and used for testing file types -s str like `-p' but giving a suffix Note that this builtin is the most experimental part. Here, almost everything may change and many things may still be not working. I suggest to have a look at the example file to see how all this can be used. Mixed comments: - I have put the whole thing into the compctl module for now. - I haven't used an associative array for the variables since I would then like to put [LR]BUFFER and so on into it and I didn't want to change to many parts of the shell for this first version. Also: using separate variables makes handling them so easy... - When using `complist' the completion code still does normal completion after `~', `=', and `$' (unless that is in IPREFIX, of course). - Also, when using `complist' the global matches defined by `compctl -M' are used, this at least should be changed one day. - Later we may add a way to access the matches produced and to control what is done with the collected data (inserting, listing, ...) - With `complist' you can make functions be called with `-K' and `-y' put they can't use `read' to get at the comamnd line data. This is because the new style completion uses a different way to store them (the above parameters). - When using conditions that change the parameter values the behavior may be irritating since following tests use the changed values. To avoid this you have to put the test into a separte function so that the previous state is automatically restored by the completion code or you have to restore the state by hand. Since I expect that many users will want to put all their tests for a command in one function (making things better readable) restoring by hand and forgetting to do so in the right places will become inconvenient. - The condition codes behave a bit different from their `compctl -x' counterparts since they can only access the arguments (not the command name). - The attentive reader of the patch will notice some hunks in zsh.h and in mem.c. This implement a way to re-use older heaps. In fact there are functions that allow one to temporarily switch to another heap, go back to an older heap, and to temporarily switch to another heap. The patch for zsh.h implements some macros like HEAPALLOC that make it easy to use this mechanism. Whew. Ok. Have a look at it, if you like. Play with it if you like. And then I would be glad about all comments, suggestions, and criticisms I get. Like Peter I will now leave for the next two weeks, so... fröhliche Weihnachten und einen guten Rutsch ins neue Jahr! Bye Sven begin 600 newcomp.tar.gz M'XL("-YT>C8"`VYE=V-O;7`N=&%R`.P]_7?;.([]U?TKF-S;1([EU/)G$D^[ M+YNF<[E-TUR3SLQNKR\KRW*B5UER)3ENT^9_/P#\$"E+;II^S.S[],V8XPRI=1?&B$BX*WJ?Q)'OPY_H; M!Y,):WH)V]Y^=#/^\"A.'_TS]!^A,#C;'CM+//WYX=;65CED[?QJSI[Z'G,& MS&GOM5M['8;6T]@J\@RN`_Q.YEX60>>4,H?-B`UVSM,6NQ8,(6/G,3'Z"8RT#<69I] M"'V&54(_"^*(837Z`1@;O#+]RG%SQ.(=NPSCD1NR:S<)W%'HIVP2)RR]\L.0 MS=S$G?J9GZ387FEKA4;".+JDU]X\2?PHLZ&,_K`LFN(D]=.A4<6[`KG=HCIQ ME/GO\SJB<#IUH[%9.$O\2?#>+$OGDZ6R@`,2%9'([/PJ2-50&>!EV96O2):R MQ)^.TM!-KZPZO7TWCS,_`B+`LP=?;)+$4X[_(7ZPF]"_R)+`>_MAV[/9:)X1 M=V#^L7GJCY%L@IOX.HOC;5;U!\0HDYINMV-WNSNYW'3[+;O;'TC)(>)Z%Y,@ M2;-M&*W''C-05*W6L/ARZJ9OX67YBS:\.3BX.#@X>'%R/A1$U)@"KS5NB"=. M7?'`Z<\>0]V:1GMX>_+J^%@VFOC9/(EX)VZ1+:5C[N_:W4%7&_/.CMW=W='' M//9!`OTK8%6&O+0$F>&A+MNZF20^O`@7<3).;08_TN#&!Z;A5SRQN.35%;Q` MD?CN>)8ET/&)&X8CUWM[H;V1M+E).?:<1/725T2OLE>K3O!^Y*30T"=U+KO5RO;;W4,Y*C@T0@;Y%2*CH9E(+1S'J5`;, M]Z,Q3/<<@4TDDF,4N'O,]92_NYV[6ZK+?E;"R:6FUQ>OVZ]81L; M3/S$I\>/V69S$SM>PU[@FT8#);H&(X=9B`5#(%,-9X&BDU?',E`U7ABDJ)X. M7CP_O7AY^/S%+X<$K<\-_+OE#,"_J3]-_AD_ M>ZV>W7-:N5+NM7:A0"GE6NTC?5(727)GPGKA96+@,#XLJ=WX20)B;G%17P_" MT+\$,R2>D5G1_(NW;M/"84.#2#S2AE`O)YA$?*N:Q28L#OW:>5-GO$.U&=!* M%+,&UJ12*H`WZ^NLB85E8^YW>W:_YR@9KO&V1K`0O!U*7GLN<&TSW-Q#DM?* M^\#YEFVG\Y$W'9?UAR9@H4O4(B.I0+1K)&\<*3*@W^O8X&#D#+A;[S@3UD2; M]^"#K&K(KM[1'S#^4@,;N#7H:1(ZZ/7M0;^7$ZBL@3)R'0"Y&@:Y&OD?8>2THJ$=.ZPBQM/#9_NOCL_+9RTXY3#<5N6LU<=[3A/#_"OO6GE'GAV] M/#OG2'.F*.";A9M$&M&F03H+70]63XY?JYY/C+RI4MKLM.S!3B^GS4YK8.\XN4%3*W#M^(@SK9Q8 M[^]*K!(KD0Q(<*CBA3\V1O)9HFEJOXI@X(*-`VK%?S_SO0Q:=B>9G^ALXLL^ MK3.27V4DVW$DZJZ2P`6;)H&EY&L"+[!0O@"5RZ`IS$XQPD;^>!*^&P: M7P?1)8,N93'Y#-MYO?*HAM/:Z=I.:S=7TM96A#YT\PFR$G3_E$1/LZ.A[X?P M!J8#NC.*X4-TGW@4AWP;'!T?XQH5%T![SN/(16A.?&73`* MINC!NR`*TBM@,_0:9<]QG%W;<=JY#?,'HA-*W!^#5*4B!KZ)[?3:725B6C?A M2UJ`#\F)1)-4^-AU=N.AGO(LX11M@?=5'WZ6.NB:.T03KJA*?;@2:H&J(U;W MP)R'#Q4M^%']O5^72TG>=UHV?/0ER35G5?CAZ56\T`.19'Q]"5GY7TDGC8A8 M'G(4Q$5/SNGG6OQ;]NQK.E=.QDX;.MO1+'BGWQ_8;4T/*&2>IX)_*J2N19<: M;!1$U'T<;5EX28R%'N)9*L)+\\BK0^6/(@29AY]D4!*A4"J)6A3/ERO86K[+ M():RPDKFP=H31^$'6#X82BX:?1A6+]G$**YM^M+&"2@BU7>9$!(TYSLO,3EO MC.4.O'?J==$S[K'PRLII%:JOE`Y"J>%C6K6:%_!R2QI?3-VWON0K#I>+FNK] MDA`VF*E/L.36V(DI%1MW/+ZWU(@P$!K(*7[Z0^,%QKG%]@"\G)E/Z7RBM@X, M;#I4#@0/ETD\GQ7J4*^0KS9[Q[^F_"M*_R"2B[%8:RA"'[!`YJ8B!A2'(I(H MND/`.$8.A,$3#+.QF8(@>=:IP$M@E?>N0!AG&A@WZ=\)DWY"+L#S9RJ@V,A] M`*/"?XL*[Z18EH--BGB?'1VOP!H5P4]><%>DJL(K46&ZNANG`HQHL@'"PT%1 MAM;3+$&SM<1CJ,9W9N`#^?M*?/]EX",1UC!RD4;A^S*LOVA^VAHAJ2LWBR1? M4.S;MAH88PF^GM@SDWE?CS`U$7X-^X21NE?FJHW4NZI$FQD/S,K"F18S;9A!6#ZR]8-7 M+U\>GIP#74Z?7QR=G!_^?/C2IKYI61YU=FMK55X`V&^BRMG!_O&^7D/LE1=J M4&B[J@;?0C=JG+X\?';T6WD%L7MNP)^]>E8)+_;4#?BC50T$92V#.9L4$X MALR;-9^0?,`O93N<4O49KJ@>Z+K,)VA+PMI4"Z6(?2*R"-^=)@K-M=FT+BOSL\0$4Q//AJ,&J8^;3V;A%B7 MUFYM-FT^"?UK/X0FP>I'NPP>AO+5?'OL9BX."IH2(E_C%I$%PSC_Q^FA)4=6 M%Z2@Y4*Q?B\?5?,)=";=]B81(`327^,&>S:)ACK(91'DT@#)%Q+9C!"7Y78" M0@*SM[H=':2JG5M%BXBP"&D03[IR*_4(4.0P4RNO8DE9X88_K)FZ2*(PB*): MFHUE'83&XL]X'MC,Q2)Q9S,_L8[15T,7QV;/P++^%8K9PM8T7+%=W88OT^#Y MFB.<%R_#F!9\3\?X15@@,Z.X*B1@@!"E M>LI;C9J"%^/YC-L:2]E#M9COCA8A\B2B6LP=(!-"2QBJQ=PI,@%4WA`"!&4H M]*0CHAMP[0JI:''J`]'5-)4I7F+,@`L),93%XS?]I;Q**> M2IO,J^1CP6Q'-[.@(2T3$PR[8KI:7!]6-`D=++:XW.`2[<`B#OY[1>3=OOU6T&W5MM(K7B8]3T\LN$C>Z](G9(Z%JC3%@ M^A?0R`>K>F3&2;8HZT7\SB-B5H"6?7TY"1*#-._P8[9D/:"G/T,3%[_YX@M( M1CS\$,"_9A,,W$8#0<"8P/%OOWB%+D[8H="W6?,S'Q.-YI9II'9;87-!E)*X<%)31^N?%,QK+"2T#:R*I M;TE6-5&NZRL;",IL`M41%?RV7!1"?7*NN;B\ MTZG13WTGU-!U`!WZD97R(.ZR'WA;/LON--!9G-),O\](:5K*<5Z[H:0]KJZ6 M"UXQ^ZOQ#N;='AL)@QGU-R4&TMBD+-L,LSI-FT*ZS))X(_8$FE%67K.I+'#? M>.-K;T;L)[T.:X"IK%737_KY2Y1G;`[/'FQL,$02X@]?%?FR*,"B$?_U$VHD M#@^_#,93Y@B2IIYSTE!UH.9\0X=FPZ_@+J9^WY>SN#:!OARS#=S,_ZO!D3V@ M%VL4&+^*KT-M9NCTB`W2QXKT9*AI_",XW$N-DC M&(I3ET))5AJ))=@,*)EKP`AO.N.S,I^YH!#K7\,#Q!I^A2)19`UTPKEFZD11 MW3BYJ@B69BA7&IHK4(:A96)HYJJFAL_@:GDSL(.HWUB%K__X"9,X`)+:.$K% MP`!/\#2=2AT7?`?=1@&3"YI= MH9KYWM&(?R$Q0A7.Q+U'YBD)+=?@0A+$5`Y63V6"%5/6D%+W=>M-OK4##EPZ M'UD;:2Y`N!DZPX!!XE]:J2[NJX5=;3&116>:>VCGD=8?LAF^!9!"YI*N8,8Q MURZX^>DV]8!DLY3)BC-0,\G!S5K6?0FH.+!<0T3;1GT,Q9@(>'#&N3,&=SPV$4#!BOHR'EW<<8C&F*'MQ?EH19[( MBY.G3P^?6>M\5>--:5X.-479/':Q1K!4)?AL'6F\Z^V((JK2+JV%RZ)6`Q\) MM!QZN@+<6087LZ:B0KL$_^H:G>4:/&JGP9.%M6+`7NBF:16\4TZ@M-"?=`7^ MD9\M?%_G`DWV58/^3)624=-V[#)\I6Q,5U8H&;74`UH5660V4SXI,!2TH/`T M#UT;\^+7E_NGV(@>VZYC1O+M4#L76)X,UL.![Z M;,H/_ZT)K6>MP=P6FBFUIK3-8@L5I0Y\\1T[ETW!3STMI. MIV^WG:XZR/X%O;.^HGOL$QUX`PQ"%^482"GE!]IBHSY_E-610'*C`6I*OMQE M\.6LZF/>7E\[Y-]V@'OPH8YK>Z'O1O-9!7'TH\WW)8UY''1%%"H2\] M?WP3^MM7ZL`P/96<.Z;RNYTYYJ"_^F,.VF=.=Z^]N]=UJL\;=P=V7YTVK@&2 MHRC#+24VB8:8-#V+@8!^@BGL]"-RP_`#"S#4.P7U#$TM@C'F4-,!7N$X3/`0 M`E6G=!F1=,UO3U`7,:`M.`=3LLEW]DU$\D_+L)2'=T4]GJ+MLE^/GOY\>([G MP$Z7,-RR^5#3)C*'0%0Y.CFO67QX\?SPY-6!J-Z6O7CZXF3S''H`]E8P=C/C7@G*T5Q" M\X_]D[\3CDZ]\.;XZ(3RUNAM5[8@X\ETHCD$V&:GO*\ M!'J_:Y(E\;&'J.&@LV+_R>`*HGAU=HB4Y5PA[F+]&!'5271@A'-COP)$BBWC M.7F1HW$4FF@S`S2"IS8/ER!2D?I4VIV?CU_\C>-IEW0'[QJY4W=R-)W[=^?D MQ;G(+.&,=+IU0_S3JW@>CL6Y))SZQ,[IF#.17QB278&I%8!S0-@?JG0+*O\@ M#N*":AGD)S3^-*J%=N]IM,J]-L>&F.2`9#W5-1@L[CD)1/G&%,"I;LB1B;I5 M5>C"FD*5`B',JCRC:?AOH!Q%]1,BO5`X2D&6WKAS%Q7;^08JMKM2Q?:^J8KM M?QL5._A_%?MOI6)U3$=G<@H(3#V!:9[274TXCJH;J.ZFJ:MMTPL4-^URG+RH MW$H5+TM,U7:IJ5H.WVKM=5O5]FJOW[-[\L(P6!7HE$IZ:<%__%"6V-M6SQ/? MGUG\5A05J41'RUK@54:@*)M/.%?JS2?\#.`&LW(E^$G39/(\&`;3%ASV,5N( M:D-U"!9\N(7$9$XW_5P@3C(^NRS>T>6*0G>!7_9)7&1BY0!ZOS`^B;P7XK4& MO=+/KH$8'*DKTL8Q)O>Z+%W2Q+:Z^8OCT4ZY@AI#8<5W,4BFB,W@`A#13*#+ MT981ZN=D>>MX'5_&.X!BF\-N\\M3B+OYE0S?@[OR3AA6Q6;VR5A__E!C,BVY;QAYH M&=H3B;=1CK=AXJ43:)S18H]$-+S`!-Q)I(2`%:4@7T)`?$H/Y/=Z]DY?7<+S MY9%W>#=^ZW_(X]ZB0(^\K_O7[O-P_'3_9)JDQR_750R\@.L:V(K18"9Q40$^ M`QXVT&+H^I_`M6;B@I5AG<,)7%"@GF6_0NC2P?'T^>7/`E;URP@=TD4%O5T@ ME)*6_[.$\CAP.:%66`'<4BC8`;*PPA*0K^]N"Z@:9O2JT]WKKK@MK]WMV^V> MNDU-LHXV#1?Y>EY<*VGV>1[I9?U$J"R7ZXE<3=9*D,&BP16[6)+$C`9'K'#3 MXD*%%;<6_%9%$22FOBNY_$Y]9R6XE!);,WN/J+87E)Y1]H;R09>7VF].G-)K M\SH#N]-MYVM`I]N"@OS&EH]LTI8):^/1$@YPH@'`PF/S2:`J">`40U/(VZ\`_A::%\TS!P`H@%`4'(.))(@@M%,]PSS5" MQS.>4;K];%AQ>V#/[K:TN[PZN[M0L&LNA17"HQ9#.N"6@,838\1K/0N252N\ M%WD\`L1FIR^!Q70M3C%SZ#,B)Q,!9O/,LS894#/-QO$\RY,)Z'+9\0T`I*98 M+H-^,18480V6:;VV1!)!)G8$-)'5KX$H:9%5M$B5-;C2\'L+&*I?']AUNG:W MW35NNY@0SG76/%A?;O:;,1-/_-R?F=0_CZTOJNIJ1\_4C1Q\[Q`0NQY= M7(1Y5/J-V6+8A:.>W')-6$V%'FMCB>A5IH"?MHG2?W05,^DG MRM)YE/@34OEQ6A%EE*&??_TEW5RGXZ[8B<^>J,6^W9BW M=BSRG4C5C\?&U/RDN9&?3%]4KTF7KID70VBSBT[#">%??@VCR9/ZBQ0UYV@! MKOW&H";:TIPT:`L8/&J]4;E<:"M(*''"J$R2>1@<28QB.TM`(>.9=4GOUN?I M?:&72?/P!MM"V=I:"M%NJ_]+@.A*?N6_F#9R9LJ^8%1]^K_M77ES&[>2 MS[_BIX!E54A:'(67[E4215$2;_SLE*V\I,I2R3R&XCR1,UP.:4F6N)]]^\(U M,U1B6\GNVQ*K$H\PF$8#:#2`1O&TQG4!G;(J@)_S<(.(ZE-;]"*@[47 M15[=,';FI:X[S>UVK;GMH#@U=UJUYNYV?LYP`FR-,24;K^8TE[7%>/K'C:3* MOHXK7J!5IMT7N:CSDC7M4`P%M`%NP M@F^[J/Z;V[7VUFY>5$4^QGU8W61$=)B,^CGQ-!^PA?C1MS:CONK-IRGHIZL.GAJG43_TNYG` M-/$LU"V??,21B=EL7T7P33RK/$NK^RI=7_>W/>EEA"[D89Q6GL?=::<'6_Y7 M\YD\?9E6,>X+Y\P4'F8SC$Q*5:"NNH0S3Z[J/.U%,<%X'JCG+\__<7CRDRG% MXI61'W3YH*SA5E/!E5RYHJ@QI`O\,BI=?7>[UF@TFMXF[F]I?=<_@.*)__+N MT)$3%%TM44F,=N-$4:\X0:?>8"#0%3,@I-XS9^-'9-R:_*7]7E/.4&Q\NA04 MCLD&HD`VFBT[)M'A)'E[KJZF"*-0B6&YJN)$K<$LZIS5^%JW!K-N"#Q',[EM M!\E`?W9#TJD(!S(;_J$RS*E&,1U)@SPQ+5*U%R_HJ.KZOB<:%$Z1[JOU=7CZ M#Y7:UMZO&G3L9Y@+B')O52VD.;8?9C)-'!':&V?7?>KDQ]B_)T[T"K\J'+^+ M3*4.O$HYIV+<9N$89['."*>4:0A#`<_"KLR**G0&"B,35D*ZK!4J2&BN4&UP-#\Q-VID MROI8615F\M)*@4Z>YM&A3\`1E,&M;[8:[P=O9@1U>O>W>AJ5A/?-8L+*U<`#++/BF MWKA/W&="OC%8F_K12650,VDB`MA$RPQ'7I%IF!]Q>\!/<0)S\@YHP@Q5&H+ADG#I%SU?T2$)]&EY#%`YH8\)H5 M:%:G!).>+2$M*$'7-\=_MK9(E0,F,WQXQ=%A(/4]A4M.#1*7C)@`6K9Y[. M,WV4_;Q^EEV5.AWJ9,SV'4QV^/\]#>CCQ;/N\_I8;D_PH6E7="7)VCIV%3CU M+8Y5ITZ<*_@:2J905I@KB:MIB`&CW"0K3@IN2O?S%-,_I`A2!CD<@IQ@Z2U, M?&MJNWSB]0N!=MW$"'O$JM*5#AKP.#U&SK#6W1%KL*VZSSR^BWHP9P M1XD'F%CT04H?I/X'-#HAL>"#C@B[YRK)2P(D'L)7MN\CK.X?<\G)U;3)=I3_( M=);)[?>3R>WWE,[M=9+.6]!-2WLI5X_[^F@X/M1ZH`?[]!DG<.0[`3?R M1%I50^]$1H?_\DL=*C]F92)ZVTEDA6]1=BE1J_BIR4M'3;1PL$V`:L;>O9JZ M<<=S+Z\'$JSY'/I'#C)#';'M?Z[$D\(75R=TK]C_^XB2DG MZGZ&I14ZO2-O@K'*EBOQSF-:IH!3%#H:T\K M%@LAS^N;[PZ/?J8U#EN`O2MR@6?TY^?E%%WJ$G*\0#)04H<-1986L7%"'O@& M399L^C07Y,)>#JJ+WQ-RJ/[>YH0,9#'UKR%&:K3:1@LIW[=;;&)O[M::VZU- M;6O0%>@G(5M=*>C?W'B)83#!M7H7EXGPNY=E6([/,,HCS1CTG_CG8`;NA1>K M.,?0A9N0%L7]\%JO;C%!W\7925/79)Y9Y^[+D`IS8X`N@&"K$@]Z!U>Y=%[W`GZ=YMP()1H0T&872. M4G9?0#KY-1VDD[M0L]&NM5J.:?+3N=$`$OHH4K:Z!IITW[4MC'"?BE$.[SLC ML@XX&^.*W#R!QY:,K6G(5M%:\65_/A[?G&,NO5-_`=Q007C0FF<0LVB\/^P> M#'HB*P-PTL$!288.J'A'[_?IM:N2Y`17,V+R%$+GY5YH##]BQ$/PPRE4&SQ& MU'558V#P$?,(*B]C'=.'$4N_H;?.5R:?ONN`=^NN=870=F'K?OSRGWQ?7@:Y M;Q6Z;!X*S4QMS(D1O9,&%4N-!JK)EH,F`BF(S0=L]S!&F():<0[-0AX649LQ MOC%/>Z:A]8IF&6TT3JQ^5`40&J&XI3"L?+7X8P.,;RHN1T?W5!MA%9?669\# M.G6\AY37A_92-3Y@J)^Q/&5[U[[7Q?`_,H0:6=-8(>)C?J3`Y]]D4K MFB?^SA8^+QQ9^O3`O,8J4H_2773$]-V=4ZFJ'47F!A%YJ]9)3WC7B%#5F7>[ MJGJF"ROFL$"EV)>VX8J`>3/I!GO7U`SAHROZO?Z^ZH[K;#.G2QN7 M_9T*V%^&.IO/D84"IGWR$Y613&?6I',=:.9D,$AK;&,4#;N$]R_3=`GK^NPI MM4E,G_<"#U!#89>9S%%+TS]H#),AU]N1U]V%Z,BF)7UH:9;L;V@0X]$P6N(# M$EI$Q&HXWSBXT[C+T3.AX^\@`YG"1:AF9>> M)@6PUI/[(,^=P78?\+E[\=2]\.<.O=G4-T5CJV$7NQC)UA+I`(:!`(Y0!IQ$ M.XR*\J7Y?%$A02=UE%KKK?U^1-639#>WDVQ3>?UVA9H>3BU+2:L<5'LM'%'D>YC2:NEZ1^*885YUL+=[S$8VE=Y:Y$ ML\@'KDA]I'D?H6!1>2.EP8+DFO*UXLB*N62347U*N+T<3SXPJ='0[6Q*] MX&L0P)YL]CDIB6>>W=VM7C*M],@I?(K\R(#&$AW84LTT_NL%[.44Y4<9"M9= M0X'Q#"173+YQE-J<'0.M+Y1>OB!$`&U=Q3[`EH:1&TAI/AWK+6VA)FIO[=1: M[>U=QP_=MML=@I]#H^*]?DT,)STZ.C\ZPJMIU)V"Y^^/?[!__')X@G]4JYY_ M*EYU'?=I02,;1+SVSP6'VK>ENLL?-W>&(E04WNHX6[<(?L,EV&/%.0Y\CR99 M>MRD:O:*3C8LM+:W80.,=S];][H';AX'/1]7G@_?6ID"_I[&*W1=;-2W:^U& MH^6YF8G-S/H=X7@8=2[XENL4MMW:=15OA5;!B.0^Z.F[=EF[N%[/KB]..K`[ MC#<_')WK!;#KZG2$`\=UT'7]F>S:!#IZZ=J$'#';C5:MW6[6/3^N!ZE>]D86 MNZCY7ZQS81>CMVZ[N5._KXM?)C!33L?DS(*-@)9/O_(*K]>&O4^2/$PG>Q6Z MX;H4U*B`7)+VI'9NK;'9LCB?V:G\7EVIZ,M4%%[]6[`?(G1.Q7-`#%X\;%(<%\I2C MLKW($:>:0V^+H%Z'`09SZ(E#\P3KSHM.%-?H2AD>7%PQD,DTQZOL,>!CX95X M@S_S_-94G+U#Q]8!F*,:Q;+E0%>$8?`U#0M[!1ZDX)7)J]_]^N.>4V:5$=M0 M0D.IQ*J$B9&I96BCS(?Y6QMTHP$]OX%.PO$DF7:FT>A&V\]!\A-HCZE\5(%* M='&P4)-5E_4D?^PV$+3G1W4HY%_:GW]R"!3,`I!%`$CI*3,+4%K!+)!!<"C, MMKW7:-\S"[3JF[5&RXU[EJ2F";R`3=`_.-H)-DB="X%,HQ=%OZ],0,SGS1L2 MT9*;-]8_?]Y8S\\;[M66V7DCRTD1$Y\\;ZP_P+RQ_H#SQOHGSANZ`95Z&@UB M1%___AB4`_ZMA*`Q7JST$W4KKI%V7ZSMK!_DXES-AK'8#JN\IH3&T,I:JYDAJQJM5JD)'!+:5BLR M<#6,1J&JU"&?U<6:&B0NG!P99EQC$_)3R(VG-H$E2F M!Q`7Z2+Z^YS&PF1]G9@N%J%6"^2EM>.*T.86)&TW_W(1*I(@E^\@J-6K($X/ M+$VGHC.*?@7-]J/ MOW_G'Z[/PNL.FI#_LC(:]?I6O:Z^`+';WM[B?[?:]"_"FC4W6YM*;6VUMMI; M[>WM-B2UFLW-+U3][VB`.1YJ*O7%593VAK`=6YHOCJ[39##[?];_3V%-SJLJ MVL$)2D8W'';>X_)W%%V&ZAW'4`?)--#!.&75G<\(TD#V?Z6G]DCC'<*V.EEA M42=0`Z%Q@BR5/H"6"7IJ?$,Y5;X,Y9$IE0143Y5/CX*HK#\LE:#H[\(1;*0) M2GDR328)KAGQ:S5*DHG!JR3HD!1CY^(P[",/3]4KK'J:)KVH0X`:=$,J0R8D M./5YQRM("-?/^-IX#Y9*Z*")5ZT'AWRXC^_H@7@[@>IB7>Q5N-`>HLT=,(8A M$!^%4Z0'+_%%A4WR,(._?:O6GJH@_"_54&=G6)>X9%P)WJXUS@Y6S\_7&JLE MI2$DO7=K37PSB$H+HBW<"7G-J\VZ<-A&C!"'[;"3TE87E^C8&!AAD$QYN[NC)M`N61*TD,LM8[& MZ&?,(#[`ZYSVQ[B;3<8A#06,KKM(9KR1`[D&2M)]N1$!M>@F[\,-4RD8KH2< M@S4"`0DCLGEHN`:FU+%>R3`485V!(6;H(G?%Z-C1+)5-'E17SR=4!FUF^LDL+:%7EGPW[DPO^S`V MZ"6ZCR+H.KGV00?@CHYREFB/=0@C.)Y->5YX%P0TIH*@K*5R&DY&G1X;H"B+ M\3@_*1,!;-]W[K#%+UFI#J?)_&*8S&=[*"^.7,-$UI_W<)C*>"9*L)4+/H33 MQ,`(T5T+T)$X%J%]W\$.A#"8IZ1LF`C("VIIH<,L532!^RLP*UW'K_H!`2$:&1#<@5^\V#=.E MR5X$^GW4(3%$0KTD?A_&41A#A5F'OA,E6J8ZR$R*9_+'OY_@B(1BD1\W"=W( M,?HO$IDG7:TMB-M*?WO:DP<6XZ0>W,+K8I!&AOXOR8/ ME2,IE+$>LJ5\(\V(K8CKT?D$!@`0D)`7)`./K$=F5XF$(*5&@-.P,\4(HSB[ M1'.$6%8#E7#C8H,((3X,WH4C:VQTK.04FJJ1"*PLXEEUR0@L&FZ>R%`5'Z83 M+7@?C68]/0N*^MO&V:J`MW@<\;P,S7AZH+,RI]">U62L4*G.T%:_;/)M13KP+Z=A\[&YKY%./+DRZLBF[DS"BOO:BHC]99 MGR'LI*R^3_3.PM54L%8(S'5!23\:1-ZN4P7J'"^=A:J;I#BA155!NMPNE'\5 M7H>]?*HN-_="H^R;%_I!5*((-#05[7+3833`&+U*1HG@,LPQE;.ADT2=*-OZ-EQ+ M@"H_^^KW1N.K9V4HY/I<%M,EYUEZP>Q.@O]4>LD=7*IR)>A'L&R&_6U`6C^X MGHZK96ZY0UBO(4>ZY+WLS/D.O1'+3B/AWU`X_N.4BU8!.X4$^B)<%522RSN4 MMJHZ/3W=7[IVD^]T]$20R\@52U6Y#Q,GB! MU(_"SD"]AV&#=;CNA^_5:6GEME/KU19Q>`5UI>?QXA8_GD7C<`%[FB^B/JBI^1BW2ITZ$GK/;QI!1(T9X"B-#PNQW4%@3L#0_UVD*!BIQ,Y[`C&]$>0%G+ MA]M"9LW26-)$%ZJ\H38VRBKXROU.W\>,./9!I=*YZ]U5J37N!L1$Y:Y^-ZA6 MEQ`=N*1<2H.4VJGX*Y2]^2!5[8TF_-=2,3QC9-`8_GVSV?@9_M?\N5I>1IN: M=&DMZ6VZ[%OLDR6?SO6"\?%XX?'W^'O\/?X>?X^_Q]_C[_'W^'O\/?X>?_]' +?O\#D`GKB0#(``"? ` end -- Sven Wischnowsky wischnow@informatik.hu-berlin.de