Path: utzoo!hoptoad!amdcad!decwrl!labrea!agate!eos!ames!killer!tness7!tness1!sugar!amiga-sources
From: amiga-sources@sugar.uu.net (alt.sources.amiga)
Newsgroups: alt.sources.amiga
Subject: Bind -- generate bindings for libraries from .fd files.
Keywords: binary bindings function definition files libraries
Message-ID: <2304@sugar.UUCP>
Date: 13 Jul 88 17:37:08 GMT
Sender: amiga-sources@sugar.UUCP
Distribution: alt
Organization: Hackercorp
Lines: 952
Approved: amiga-sources@sugar.uu.net (alt.sources.amiga)

Archive: uunet!~uucp/amiga-sources/vol1/bind.shar.Z


Bind, written by Bill Barton, takes a standard .fd (function definition) 
file and generates a binding library for the functions defined in the 
.fd file. The bindings are generated based on a set of rules for a 
target compiler defined in a file called "bindfile".  These rules 
specifiy which registers need to be preserved, how the arguments 
are passed on the stack, and the syntax to call an assembler and 
a librarian.  It is anticipated that this program will be of great
use to those hacking on redistributable C compilers such as PD C
and gcc.

We apologise to everyone who does not have an Amiga for the binary nature
of this posting, but this program seems so incredibly useful to Amiga
developers that we feel it's worth making an exception for. 

---------------------- cut here --------------------------
:
#! /bin/sh
# This is a shell archive,
# created by Karl Lehenbauer on Tue Jul 12 11:16:19 1988
# Remove anything before the "#! /bin/sh" line, then unpack it by saving
# it into a file and typing "sh file".  If you do not have sh, you need 
# unshar, a dearchiving program which is widely available.  In the absolute
# wost case, you can crack the files out by hand.
# If the archive is complete, you will see the message "End of archive."
# at the end.
# This archive contains the following files...
#    'bind.doc'
#    'bindfile'
#    'midi_lib.fd'
#    'makefile'
#    'bind.UU'
#    'zlib.UU'
echo x - bind.doc
sed 's/^X//' > bind.doc << '//END_OF_FILE'
XBind - Binding routine builder
X
XOverview
X--------
X
XThis program takes a standard .fd (function definition) file and
Xgenerates a binding library for the functions defined in the .fd file.
XThe bindings are generated based on a set of rules for a target compiler
Xdefined in a file called "bindfile".  These rules specifiy which
Xregisters need to be preserved, how the arguments are passed on the
Xstack, and the syntax to call an assembler and a librarian.
X
X
XFile Contents
X-------------
X
X    Bind -- the AutoDoc program
X    bind.doc -- this file
X    bindfile -- a sample bindfile containing rules for Aztec (small
X		code/data and large code/data version) and Lattice.
X    midi_lib.fd -- the .FD file for the MIDI Library.  It's included here
X		   as a sample non-Rom-Kernal library that use to try
X		   bind on.
X    zlib -- simple Amiga object module librarian
X
XUsage
X-----
X
XThe syntax for Bind is:
X
X    Bind [opts] <.fd file>
X
X    <.fd file> - name of the function definition file to use as a
X		 source.  The ".fd" portion may be left off of the name.
X		 The output library name is derived from the portion of
X		 the .fd file to the left of the period (e.g.
X		 midi_lib.fd will generate midi_lib.lib)
X
X    opts:
X	-a	generate assembly only
X	-c	generate object modules only
X	-f	specify alternate bindfile
X	-o	specify output library name
X	-r	specify rule name
X	-w	specify work directory
X
X
X
XA library is built by first generating an object module for each binding
Xroutine and an LVO definition module.  Each module is created by writing
Xan assembly file to the work directory and then assembling it.	Once all
Xthe object modules are generated they are collected into a library.
XTemporary files (assembly and object) are deleted from the work
Xdirectory as soon as they are no longer needed.  The actual invocations
Xfor the assembler and librarian depend on the selected set of rules.
X
XBinding rules are defined in a "bindfile".  By default this file is
Xcalled bindfile and resides in the current directory or the s:
Xdirectory.  An alternate bindfile may be specified with the -f switch.
XA bindfile contains entries for target compilers.  Each entry contains
Xrule definitions that specify how to build a binding routine for the
Xtarget compiler.  The syntax is as follows:
X
X:
X     = 
X	.
X	.
X	.
X     = 
X
X:
X     = 
X	.
X	.
X	.
X     = 
X
X    .
X    .
X    .
X
X
XThe target name can contain any name but must not contain embedded
Xspaces.  It should begin in the first column and be terminated with a
Xcolon.	Target name matching is case insensitive.
X
XRule keys must be preceded with white space and spelled exactly as
Xfollows (case is not significant).  They may be placed in any order
Xwithin a rule set.
X
X    StackOffset = 
X
X	Specifies how many bytes preceded arguments in the stack frame
X	when the routine first becomes active.	If nothing is pushed on
X	the stack between the arguments and the return location (pushed
X	by jsr) then  would be 4.  This depends very heavily on
X	how the target compiler calls routines.  The default value is 0.
X
X
X    SaveRegs = 
X
X	This specifies the registers that the compiler expects to have
X	preserved.  Use a standard 68000 MOVEM register set here (e.g.
X	d2-d7/a2-a5).  The default is to preserve no registers.
X	Currently you are not allowed to preserve D0 or A7 this way.  D0
X	is where return values from placed by standard Kernal routines.
X	A7 is the stack and is automatically preserved.
X
X
X    Assembler = 
X
X	Specifies the name of the assembler to use and its syntax.  Two
X	string substitutions are performed here.
X
X	    $a - gets replaced by the name of the assembly file
X		 generated by bind.
X
X	    $o - gets replaced by the name of the object module that
X		 should be produced by the assembler.
X
X	(e.g. as $a -o $o)  Bind generates assembly files suffixed with
X	.asm and expects object files to suffixed by .o.  These suffixes
X	are supplied with the $a and $o string substitutions.
X
X	The assembler used should be capable of generating a
X	non-zero return code on failure in order to shut down bind.
X	Both Aztec's as and MCC's assem behave well.
X
X	The assembler is loaded using fexecl() so that the current path
X	will be searched in order to find the assembler.
X
X	The default is no assembler.  This will not permit you to make
X	anything other than assembly files.
X
X
X    Librarian = 
X
X	Specifies the name of the librarian to use and its syntax.  Two
X	string substitutions are performed here.
X
X	    $l - is replaced by the selected name of the output library.
X
X	    $o - is replaced by the entire list of object modules to
X		 place in the library.
X
X	(e.g. lb $l $o)  By default bind will generate a library name
X	based on the .fd file name (e.g. midi_lib.fd becomes
X	midi_lib.lib).	You can select another output library name using
X	the -o option.	.lib is not automatically attached to the name;
X	you need to specify it.
X
X	As with the assembler, the librarian should be capable of
X	generating a non-zero return code on failure in order.	Aztec's
X	lb utility and zlib both work this way.
X
X	The default is no librarian.  This will prevent you from
X	going beyond the object module stage.
X
X
XComments may be placed in the bindfile if they are preceeded with a
Xpound sign (#) in the first column (like makefile comments).  Also,
Xblank lines are considered comments.
X
XThere is a sample bindfile contained in the .arc file.
X
X
XWork files
X----------
X
XWork files are placed in the "work directory".  The work directory is
Xdetermined in one of two ways.	If none is specified, the directory
Xassociated with the environment variable CCTEMP is used (this is set by
Xeither the Aztec or the ARP set command).  You may override this by
Xusing the -w switch to specify any directory.  The default is the
Xcurrent directory.
X
XWork files are automatically deleted when they are no longer needed or
Xwhen the program fails or is aborted using Control-C.
X
X
XThe options
X-----------
X
X-a causes bind to stop after generating the assembly code for the
Xbindings.  They appear in the work directory.
X
X-c causes bind to assemble the modules that it generates but leave just
Xthe object modules without making a library.
X
X-f allows you to specify some other file to use as a bindfile.	The
Xdefault bindfile may exist in the current directory or in the s:
Xdirectory.
X
X-o allows you to specify another name for the output library.  The
Xdefault is made by replacing .fd in the source file name with .lib.  A
Xfile comment is set for the output library indicating which rules were
Xused to create it.
X
X-r specifies a rule name.  The default is to use the first rule in the
Xbind file.
X
X-w specifies an alternate work directory.
X
X
XTech info
X---------
X
XThe program was compiled using Aztec C3.4B.  Everything described works.
XAt the very least this can be used to generate bindings for Aztec (any
Xmodel) and Lattice.
X
XCompilers that don't use A7 for a stack, don't return values in D0, pack
Xthe arguments in reverse order, or require that the bindings pop
Xarguments off the stack are not currently supported by Bind.  This may
Xchange if there is demand for this and the appropriate technical data is
Xavailable.
X
X.fd files are not described in this document.
X
X
Xzlib
X----
X
XThis is a quick and dirty means of generating a Lattice (Amiga) object
Xmodule library.  These appear to be little more than a concatenation of
Xthe constituent object modules.  So this program simply joins all of the
Xfiles specified into one file.	Its syntax is:
X
X    zlib  ...
X
XThe source code is included.
X
X(btw AmigaDOS (or ARP) join command doesn't work since it is limited to
Xonly 10 (I think) files)
X
X
XLast words
X----------
X
XThere were several inspirations for this program.  I was requested to
Xmake an .fd file for the MIDI Library and also someone told me that the
XAztec bindings for the MIDI Library failed with Lattice (mainly because
XLattice expects A6 to be preserved and Aztec doesn't).  Also, I got
Xtired of waiting for C bindings for C. Heath's ARP library and hopefully
Xthis will speed things along.
X
XBind is copyright 1987 by Pregnant Badger Software, but feel free to
Xdistribute it without profit.
X
X	Bill Barton
X
X	Bix: peabody
X	delphi: bbarton
X	plink: peabody
X
//END_OF_FILE
echo x - bindfile
sed 's/^X//' > bindfile << '//END_OF_FILE'
X# Aztec C small code/data
XAztec:
X	stackoffset = 4
X	saveregs = d2-d7/a2-a5
X	assembler = as $A -o $O
X	librarian = lb $L $O
X
X# Aztec C large code/data
XAztecL:
X	stackoffset = 4
X	saveregs = d2-d7/a2-a5
X	assembler = as -cd $A -o $O
X	librarian = lb $L $O
X
X# Lattice C
XLattice:
X	stackoffset = 4
X	saveregs = d2-d7/a2-a6
X	assembler = assem $A -o $O
X	librarian = zlib $L $O
X
//END_OF_FILE
echo x - midi_lib.fd
sed 's/^X//' > midi_lib.fd << '//END_OF_FILE'
X*  midi_lib.fd - version 1.2
X*
X##base _MidiBase
X##bias 30
X##public
X*-------------- locking
XLockMidiBase()()
XUnlockMidiBase()()
X*-------------- source
XCreateMSource(name,image)(A0/A1)
XDeleteMSource(source)(A0)
XFindMSource(name)(A0)
X*-------------- dest
XCreateMDest(name,image)(A0/A1)
XDeleteMDest(dest)(A0)
XFindMDest(name)(A0)
X*-------------- route
XCreateMRoute(source,dest,routeinfo)(A0/A1/A2)
XModifyMRoute(route,newrouteinfo)(A0/A1)
XDeleteMRoute(route)(A0)
XMRouteSource(source,destname,routeinfo)(A0/A1/A2)
XMRouteDest(sourcename,dest,routeinfo)(A0/A1/A2)
XMRoutePublic(sourcename,destname,routeinfo)(A0/A1/A2)
X*-------------- msg
XGetMidiMsg(dest)(A0)
XPutMidiMsg(source,msg)(A0/A1)
XFreeMidiMsg(msg)(A0)
XMidiMsgType(msg)(A0)
XMidiMsgLength(msg)(A0)
XPutMidiStream(source,fillbuffer,buf,bufsize,cursize)(A0/A1/A2,D0/D1)
X*-------------- v1.2 routines
XLockMRoutes()()
XUnlockMRoutes()()
XFlushMDest(dest)(A0)
X##end
//END_OF_FILE
echo x - makefile
sed 's/^X//' > makefile << '//END_OF_FILE'
X# makefile for midi.library bindings
X
Xall: midi.lib midil.lib midi-lattice.lib
X
X
X# Aztec C small code/data
Xmidi.lib: midi_lib.fd
X    bind midi_lib.fd -omidi.lib -rAztec
X
X
X# Aztec C large code/data
Xmidil.lib: midi_lib.fd
X    bind midi_lib.fd -omidil.lib -rAztecL
X
X
X# Lattice C
Xmidi-lattice.lib: midi_lib.fd
X    bind midi_lib.fd -omidi-lattice.lib -rLattice
X
X
//END_OF_FILE
echo x - bind.UU
sed 's/^X//' > bind.UU << '//END_OF_FILE'
Xbegin 644 bind
XM   #\P         #          (  !$\   !6     $   /I   1/$[Z,&A.
XM50  3EU.=4Y5_V8[?  !_VI(;(!:+RT "C\M  A.NAV23^\ "CM   @,;0 "
XM  AL6DAZ 41.NB;.6$](>@KHFQ%A/2'H!DTZZ)KI83TAZ :I.NB:P6$](
XM>@'&3KHFIEA/2'H!X4ZZ)IQ83TAZ ?U.NB:26$](>@(/3KHFB%A//SP  4ZZ
XM0 143R!M  HO*  $2&W_P$ZZ-;903S\\ "Y(;?_ 3KHOI%Q/2H!F#DAZ ?A(
XM;?_ 3KHU/%!/""P  ( ]9Q O+( ^2&W_@$ZZ-8!03V N2&W_P$AM_X!.NC5P
XM4$\_/  N2&W_@$ZZ+UY<3RM _WQ(;( 5+RW_?$ZZ-5!03P@L  " ,6<&("R 
XM,F "<  O  @L  " 26<&("R 2F "<  O $ZZ%T103RM _V9G,DAM_VQ(;?_ 
XM3KH!LE!/L'S__V<>2&W_;"\M_V9(;?^ 3KH&X$_O  RP?/__9P1";?]J3KH4
XM,#\M_VI.NC\<5$].74YU8FEN9" M(&)I;F1I;F<@0H (" M8R @(" @9V5N97)A=&4@;V)J96-T(&UO9'5L92!O
XM;FQY"@ @("UF/',^("!S<&5C:69Y(&%L=&5R;F%T92!B:6YD9FEL90H (" M
XM;SQS/B @2!O=71P=70@;&EB2!N86UE"@ @("UR/',^("!S
XM<&5C:69Y(')U;&4@;F%M90H (" M=SQS/B @2!W;W)K(&1I0H +F9D $Y5  !(>@ :3KHD3EA/3KH2VC\\  %.NCW&5$].74YU7D,*
XM &)ADZZ H183TI 9P !"DAZ 8X_/ ! 2&W_-DAM_WQ.NB(N3^\ #B\ 
XM3KHB=EA/*T#_,DAM_S9(;(!F3KH"<%!/2,!@  "^(&T #$J09PY(>@%03KHC
XM*%A/8  !&$AZ 5X_/ ! 2&W_-B\M_S).NB'@3^\ #DAM_S9.NCBJ6$]20#\ 
XM3KH=;E1/(&T #"" 9@Y(>@$L3KHBYEA/8   UDAM_S8@;0 ,+Q!.NC(<4$]@
XM9$IM_WAG#DAZ 15.NB+ 6$]@  "P+RW_,DZZ) I83T1 .T#_>& ^".T  /]W
XM8#8";?_^_W9@+F!@2&W_>DAZ /M.NB**4$]@>O\T_Y[_Q/_,_]2PO     5D
XMWN. ,#L ZD[[  !@+C\M_W8_+?]X2&W_>DZZ =)03RM _W)G1"\M_W(@;0 ,
XM6(@O"$ZZ/>Y03UUM_WA@ /Z$(&T #$J09@Q(>@"N3KHB)EA/8!9*;?]X9@Q(
XM>@"U3KHB%%A/8 1";?_Z2JW__&<*+RW__$ZZ.%Y83S M__I.74YU<@!C86XG
XM="!O<&5N("5S.B E

@$,3KH@'%A/8 TDAM_\ @;?^\+R@ "$ZZ+U!03R!M_[PQ XM;0 , P@;?^\,6T #@ .2'H YTZZ"OQ83R!M_[PQ0 R2'H Y$AZ -T_/ ! XM2&W_P"\M A.NAZ83^\ #B\ 3KH?#%!/*T "$HM_\!G2DAM_\!.N@J\6$\[ XM0/^Z9A!(;?_ 2'H I$ZZ'Y103V!*(&W_O")M_[PP*0 04FD $$C XX L0-WM XM_[P];?^Z !(P+?^Z@6@ ,F"((&W_O"\(2'H B$ZZ"FQ83T9 (%_!: R("W_ XMO$Y=3G5*K?^\9R(@;?^\2J@ "&<.(&W_O"\H A.NAFT6$\O+?^\3KH9JEA/ XM< !@T"@ *0!O=70@;V8@;65M;W)Y"@!D,2]A,"UA,2]A-@ L*0 L &)A9"!R XM96=I""P (!A9B8(+ @%5F'B\M ! O+0 ,+RT "$ZZ!VA/[P , XML'S__V8$@ @3KHFS%A/*T#_ XM_&<.+RW__$ALA.9.NBUX4$].74YU0T-414U0 !.5?_\(&T $"MH 3__& V XM(&W__ @H #V/RR% XM)DZZ&]943R\ 2&W_@$AZ #1.NAUT3^\ #& @""P (!A9A1(;?^ +RT #$ZZ XM!;A03[!\__]G!$)M_WXP+?]^3EU.=6-A;B=T('=R:71E(&%SDZZ+#A03TAL@!!(;?]Z3KHKT%!/2'H!\$AM_WI. XMNB"64$\K0/_\9P !Q@@L " 868*2&W_>DZZ"H183R\M ! @;0 8+R@ ""\M XM @O+?_\3KH$3D_O ! @;0 4+Q!(>@&H+RW__$ZZ(.A/[P ,(&T &"\H A( XM>@&;+RW__$ZZ(-!/[P ,(&T &"\H A(>@&.+RW__$ZZ(+A/[P ,2FW_5&= XM/RW_5$AM_U9.N@BD7$\O #\M_U1.N@'*5$\O $AZ 6$O+?_\3KH@AD_O !!P XM # M_U0O $ZZ'3Q83^5 T6W_=D)M_WA@7# M_WA(P.. ($#1[0 8.V@ $O]2 XM/RW_4DAM_U9.N@A*7$\O #\M_W8_+?]23KH!;%1/+P!(>@$1+RW__$ZZ("A/ XM[P 2< P+?]2+P!.NAS>6$_E0-%M_W92;?]X(&T &# M_WBP: 0;98@;0 4 XM+Q!(>@#D+RW__$ZZ'^Q/[P ,2FW_5&=4(&T &#\H Q(>@#5+RW__$ZZ'\Y/ XM[P */RW_5$AM_U9.N@? 7$\O #\M_U1.N@#F5$\O $AZ +8O+?_\3KH?HD_O XM !!(>@"T+RW__$ZZ'Y)03V 8(&T &#\H Q(>@"B+RW__$ZZ'WI/[P *2'H XMGR\M__Q.NA]J4$]";?_Z2JW__&<*+RW__$ZZ,5983S M__I.74YU=P )>')E XM9@DE@!T2&R$YDAM_X!.NA*R3^\ #"\M ! O+0 ,2&W_@"\M AA XM>$_O !"P?/__9AX_+(4F3KH81%1/+P!(;?^ 2'H .$ZZ&>)/[P ,8" (+ XM@&%F%$AM_X O+0 ,3KH")E!/L'S__V<$0FW_?C M_WY.74YU;'9O &-A;B=T XM('=R:71E(&%SDZZ*,!03TAL@!!(;?]Z3KHH6%!/2'H YDAM_WI.NAT>4$\K0/_\9P XMO @L " 868*2&W_>DZZ!PQ83R\M !!(>@"\+RT ""\M__Q.N@#:3^\ $"!M XM !0K: $_W9@*"!M_W8_* ,(&W_=B\H A(>@"0+RW__$ZZ'5Y/[P .(&W_ XM=BM0_W8@;?]V2I!FT$AZ '\O+?_\3KH=/E!/(&T %"MH 3_=F @(&W_=B\H XM A(>@!?+RW__$ZZ'1Q/[P ,(&W_=BM0_W8@;?]V2I!FV$AZ $TO+?_\3KH< XM_%!/0FW_^DJM__QG"B\M__Q.NB[H6$\P+?_Z3EU.=7< ;'9O %],5D\E2!B:6YD("T@ XM)7,* ES96-T:6]N"5\EW_?BE(@(Y![?[^*4B A$AL@(@@;0 (+R@ "DZZ!X)03[!\__]G*DAM_WY. XMNB_F6$](;?]^3KH%C%A/""P (!59@I(;?[^3KH$XEA/0FW__C M__Y.74YU XM3E7__CM\_____BEM B HB\M !!A2EA/*4" F&DZZ)5103TAM_WI.NBP"6$]20-%M XM__H@;?]V*U#_=B!M_W9*D&:N2'H!!$ALA.9(;?]Z3KH.RD_O Q(;( :2&W_ XM>DZZ)1)03TAM_WI.NBO 6$_1;?_Z,"W_^E) /P!.NA!\5$\K0/_\9P KB!M XM @K: $_W8@;?_\< 0@$B 8%8@;?]V""@ /9T(@;?]V+R@ "$ALA.9( XM;?]Z3KH.7D_O Q(;( :2&W_>DZZ)*903TAZ 'I(;?]Z3KHDF%!/2&W_>B\M XM__Q.NB2*4$\@;?]V*U#_=B!M_W9*D&:B2'H 4$ALA.9(;?]Z3KH.$$_O Q( XM;( :2&W_>DZZ)%A03TAM_WHO+?_\3KHD2E!/("W__$Y=3G5*K?_\9PHO+?_\ XM3KH/S%A/< !@Z&QV;P @ &QV;P!.5?^ (&T #"\02'H ($AM_X!.NB4D3^\ XM#$AM_X O+0 (3KHP@E!/3EU.=6)I;F1I;F<@;&EB2!F;W(@)7, $Y5 XM__)";?_^0FW_]CM\____]$AZ (X_/ %2&W_^2\M A.NA.:3^\ #BM A* XM+?_Y9V)(;?_Y86Y83SM __*P?/__9UA*;?_V9Q _+?_R/RW_]$ZZ +A83V ( XM< $R+?_RXV"!;?_^.VW_\O_T(&T " P0 "U7P,!\ $[0/_V2'H (R\M A. XMNA.R4$\K0 (8 #_?C M__Y.74YU< !@^"\M "\M $Y5__Q";?_^(&T "! 0 XM2( _ $ZZ%EI43TC 8# [? (__X@;0 (4H@O"$ZZ%7!83SM __Q*0&TJ#&T XM!__\;B(P+?_\T6W__F 08!:0O &%GR%> 9\I@\# M__Y.74YU@ P+0 (L&T "F\.."T "#MM H "#M$ HX+0 (8 AP >E@BD!2 XM1+AM IO\C %3-\ ,$Y=3G5.50 (&T "$(0/SP 9#\\ ="9S\M PO+0 ( XM829/[P ,/SP 83\\ \_/ (/RT #"\M AA#$_O P@+0 (3EU.=4Y5__@[ XM;0 .__Y@ "H< $R+?_^XV# ;0 ,9P E"!M A*$&<.2'H G"\M A.NB(: XM4$\P+?_^D&T #C\ $"T $TB /P!(;?_Y87Q03R\ +RT "$ZZ(?103S\M ! _ XM+?_^/RT #$ZZ (9<3SM __RP;?_^9SI(>@!.+RT "$ZZ(^6$]20#\ 3KH,@E1/(&W__"% IG)B\M @@;?_\+R@ "DZZ(3I0 XM3R\M__Q(;( "3KHMD%!/< !.74YU+RW__&$&6$]P_V#P3E4 $JM AG(B!M XM A*J *9PX@;0 (+R@ "DZZ##A83R\M A.N@PN6$].74YU3E7__"\M A( XM;( "3KHND%!/*T#__&<2+RW__$ZZ+R983R\M__QAJ%A/3EU.=4Y5__Q(;( " XM3KHO %A/*T#__&<:(&W__"\H I.NBH$6$\O+?_\3KK_>EA/8-9.74YU3E7_ XM^B\M PO+0 (3KH HE!/.T#__D*M__HP+?_^4D _ $ZZ"XY43RM __IG'"\M XM PO+0 (+RW_^DZZ -9/[P ,("W_^DY=3G5*K?_Z9PHO+?_Z3KH+<%A/< !@ XMZ$Y5 0+0 -2( _ $ZZ$OI43QM U@,"!M @0* $2( _ $ZZ$N)43Q(M XM U(@;!!9@P@;0 (("@ !DY=3G4@;0 (*U "$JM AFRG 8.I.5?_Z0FW_ XM^F!((&T " P0 "1F-E*M @@;0 (2A!G*B!M @0$$B /P O+0 ,3KK_?EQ/ XM*T#__&<.+RW__$ZZ)?183]%M__I@!%)M__I2K0 ((&T "$H09K P+?_Z3EU. XM=4Y5__Q(YP P)&T ""9M Q*$V=,#!, )&8Z4HM*$V@"V3KH/8%A//SP ("\M__Q.NAB87$\K0/_X XM9PH@;?_X4JW_^$(00J&5C(&9A:6QU@ S2'H )DZZ$.!03RM __QG!B M__Q@XDAZ "9(>@ 73KH0 XMQE!/8-)R &)I;F1F:6QE '( R"3@@P 0 &8V2'H .C\M !0O+0 02&W_@$ZZ"OY/[P .2JT #&<2 XM+RT $"\M Q.N@O"4$]*0&8&< !.74YU8(1P_V#V(#H %-T86-K3V9F6$]@ #.+RW_?"!M PO* *3KH:$E!/8&HO+?]\3KH@9%A/ XM4D _ $ZZ!2A43R!M PA0 .9@Y(>@#+3KH*GEA/8 CB\M_WP@;0 ,+R@ XM#DZZ&=)03V J2&W_@$AZ +1.N@IX4$]@:/\8_R[_6/^8L+P $9.#C@# [ XM .Q.^P 8 #^A@@L " 8686(&T #$JH IF#$AZ )9.N@H\6$]@+ @L " XM868>""P (!59A8@;0 ,2J@ #F8,2'H B$ZZ"A983V &< !.74YU0H XM;W5T(&]F(&UE;6]R>0H =6YK;F]W;B!K97EW;W)D(&EN(')U;&5S.B EB\M X0$DB /P 2 XM+?_U2($_ 4ZZ -Q03RM __9G6B!M__8(Z <@;?_V,"@ !L!\ PR ' XM, %@,$HJ %F'$ZZ (H@;?_V(4 "&8,(&W_]D/Z %0A20 (8!H@;?_V( I2 XM@"% A@#EF 9^Y9@&?.68!GQ&" 8 Y8K0 *(&T "B"*4FT "& _TQ8K0 * XM(&T "D*0+RW__$ZZ L!83S M A@ /\0 !.50 +P0X+0 (N'P +6<&N'P XM*V8$< %@ G *!].74YU3E4 $ILA(YG!E-LA(YF!G 3EU.=5BLA(H@;(2* XM(!!@\$Y5 O"B1M Q@9! M E(@#\ ""H ! '9P1P*V "<"TR'[) 9D8( XM*@ ! =G$A J 2P+0 +9@1P 6 "< !@*A0J 1(@C\"3KH)PE1//P 0+0 + XM2( _ $ZZ";)43S(?LD!F!' !8 )P &8&)%(@"F:8( HD7TY=3G5.5?_\+RT XM#"\M A.NA:D4$\@;0 02A!G3B!M A*$&)"M_WPD0-7M PO XM+?]\+RT #$ZZ%>Y03R!*4XI"$+7M QG$@PJ "___V<*#"H .O__9P)"$BMM XM_WC_?&!0/SP .B\M_WQ.N@>H7$\K0/]X9S!2K?]X2JT #&<>+RW_?"\M Q. XMNA6<4$\@+?]XD*W_?"!M Q", *VW_>/]\8 Q*K0 ,9P8@;0 ,0A!*K0 0 XM9PXO+?]\+RT $$ZZ%6103R1?3EU.=4Y5 !(YP P)&R$D& 4)E(@*@ $4( O XM "\*3KHC)%!/)$L@"F;H0JR$D$S?# !.74YU3E4 "\*0?K_QBE(A2@O+0 , XM("T "%" +P!.NB*@4$\D0$J 9@AP "1?3EU.=22LA) E;0 ( 0I2H20( I0 XM@&#F3E4 $*G+RT "&&R4$].74YU3E4 ' ,"T ""\ 8>!83TY=3G5.50 XM2.< ,)?+)&R$D& .(&T "%&(L7!E &1I2!N;W0@96UP='D 9&5V:6-E("AO@ 62&R$E$ZZ$8I/[P *0>R$E" (8.!ER"3@@P 0 &<$4HI@YB *)%]. XM74YU3E4 "\*)&T "$H29Q@0$DB /P O+0 ,3KH)W%Q/2H!G!%**8.0@"B1? XM3EU.=4Y5 O"B1M A*$F<8$!)(@#\ +RT #$ZZ":Y<3TJ 9@12BF#D( HD XM7TY=3G5.50 2.<,,"1M @F;0 ,8!)*!&8*< !,WPPP3EU.=5**4HL0$DB XM/P!.N@)25$\8 !\ $!-(@#\ 3KH"0E1/&@ 2'[( 9\H0!$B $@5(@9!!8,1. XM5?X +P1![?X *4B$J$AM PO+0 (2'H )$ZZ$6$\@+?_XT+P !Z$@(CP #T) XM3KH4:M"M__0K0/_\2&W_U$ZZ&N!83R\M_^).NAM^6$]*K0 (9P@@;0 ((*W_ XM_" M__Q.74YU=&EM97(N9&5V:6-E D+P $<@!P .**T4%*@F;X3G4@;P $ XM(DA*&&;\4X@0+P )L\AG"+ @9O@@"$YU< !.=4Y5 !(YPP@)&T " P2 "!G XM!@P2 EF!%**8/!Z P2 "UF!GH!4HI@" P2 "MF E**> !@%B!*4HH0$$B XM,@3"_ *T$$X )A\ # 0$DB 4D!![()."# @ 9MA*16<&, 1$0& ", 1, XMWP0P3EU.=4Y5 !(YP@@."T ",CM H_!$ZZ^)@D0$J 5$]G#$)G/P0O"DZZ XM Y03R *3-\$$$Y=3G4@;P $3*\ P (8 (0P5'(__Q.=7 $"\ !; \ &!C XM"K \ 'IB!) \ "!.=7 $"\ !; \ $!C"K \ %IB!- \ "!.=4Y5 !(YP@@ XM)&T "%-M Q*;0 ,;R O+0 .3KH .#@ L'S__UA/9PX@2E**$(2X? *9P)@ XMUD(2N'S__V80M>T "&8*< !,WP003EU.=2 M A@\DY5 !(YP@@)&T ""\* XM3KH ,C@ L'S__UA/9R(P!$C 8!13D@CJ , #'#_3-\$$$Y=3G5@UDJ 9_I9 XM@&?D, 1@ZDY5 O"B1M @@4K'J 1E#"\*81983R1?3EU.=2!24I(0$$B XMP'P _V#L3E4 $CG"# D;0 ($"H #, \ !AG"G#_3-\,$$Y=3G4(J@ " Q* XMJ@ (9@@O"DZZ%,I83Q J Q(@ @ =G,$'L@M F2! K Q(@,!\ (2P? "$ XM9@P_//__+PM.NA."7$_7_ !9![(2(M\AEUC\J ! O*@ ($"H #4B /P!. XMN@J^. !*0%!/;A1*1&8$< A@ G 0@2H #'#_8 #_>C $2, DJ@ (T*H ""5 XM 0@4E*2$!!(@,!\ /]@ /]:3E4 "\*3KH3^B1 2H!F"' )%].74YU+PHO XM+0 ,+RT "&$&3^\ #&#H3E4 $CG"" O+0 03KH29$'L@:(D2%A/2A)F$#E\ XM 6%)G 3-\$$$Y=3G4O+0 ,+PI.N@KX2D!03V<$7(I@V#\J 0O+0 (3KH( XMQC@ L'S__UQ/9@1P &#*(&T $!%$ T@;0 0$7P 0 ,("T $&"R3E4 "EM XM B$K$AM ! O+0 ,2'H #DZZ#6Y/[P ,3EU.=4Y5 O+(2L/RT "$ZZ$2I< XM3TY=3G5.50 ("R$L$Y=3G5.50 2&T #"\M AA!E!/3EU.=4Y5_Z9(YPPP XM0J=.NAA,*T#__"!M__P@* "LY8 D0$J 6$]F"G#_3-\,,$Y=3G5(> A2'H# XM-DZZ&) K0/_F4$]F,"!LA2XB: ((&D !")H__0@:?_TT?P &L*TC_MB!M XM_[8@*@ \L)!G!'#_8+9@#B\M_^9.NA:P0JW_MEA/+RT "$ZZ%>@K0/_J6$]F XM?BMJ C_LDJM_[)G0B M_[+E@"M _[(@;?^R+R@ !$ZZ%8(K0/_F+RT "$ZZ XM%;(K0/_J+RW_YDZZ%6I*K?_J3^\ #&8Z(&W_LBM0_[)@N$AZ I9(;?^Z3KH) XMJB\M A(;?^Z3KH)1$AM_[I.NA5R*T#_ZD_O !1F!G#_8 #_&B J #3E@"M XM_^)"IR M_^)0@"\ 3KH6_BM _ZY03V80+RW_ZDZZ%9AP_UA/8 #^ZBM\ XM ?_N)FT #%B+8!(O$TZZ#YY20$C T:W_[EA/6(M*DV;J0J0!C.@ @ !.50 2.@"D3KH4ZB1 XM2H!03V8*< !,WPPP3EU.=2\*3KH3,DZZ%&HF:@ B+RT "$ZZ#.8Z %!/2A-G XM9#\\ #TO"TZZ '(H %Q/9T0@!)"+L$5F/#\%+RT ""\+3KH&,DI 3^\ "F8H XM4H0O!$ZZ#*I83U) /P!.NO%N)D O!"\+3KH&.$ZZ%'X@"T_O I@AB\+3KH, XMA%) 2,#7P%A/8)A.NA1B< !@ /]N96YV:7)O;FUE;G0 (&\ !# O @2&&<* XML@!F^" (4X!.=7 3G5A<$/LA(I%[(2*M @ @N 0!*6<02_H "$ZN_^)@!D*G\U].0!)^0 ?_Y. XM=4Y5 O"DAY $ # LA(C!_ &+P!.NA+L*4"%.E!/9A1"ITAY $ $ZZ XM$;903RYLA2Y.=2!LA3I": $(&R%.C%\ $ $"!LA3HQ? ! H@;(4N("R% XM+I"H 10@"E A3X@;(4^(+Q-04Y80J=.NA+()$!*J@"L6$]G+B\M PO+0 ( XM+PI.N@"N.7P 84L(&R%.@!H@ !"!LA3H :( I/[P ,8$)(:@!<3KH3 XM3DAJ %Q.NA*X*4"%0B!LA4)*J D4$]G$"!LA4(B: D+Q%.NA \6$\O+(5" XM+PI.NLX\*6R%0H5&4$].NA \(&R%.B" 3KH0?B!LA3HA0 &9Q9(> /M2'H XM*DZZ$%8@;(4Z(4 #%!/+RR%1C\LA4I.NLX"0F=.N@Z 4$\D7TY=3G4J $Y5 XM !(YPPP)&T $"!M @@* "LY8 H "!$("@ $.6 )D 0$TB 2,#0K0 ,5( Y XM0(5,0J !@#C $P?P !DJS" !G#E)$N&R$B&WL>@9@ #$ XM""T 0 ,9S!(>/__+PI.N@WR+ !03V<@+P9.N@Y$+PI.N@VH2H!03V8.3KH- XMMCH L'P S68 (Q(> /M+PI.N@W0+ !*AE!/9F (+0 QF!'H!8&Q(> /N XM+PI.N@VR+ !03V8(3KH->CH 8%1(> A2'H DDZZ#]PN %!/9PHO!TZZ#C!8 XM3V >2'@ 4AZ ((O!DZZ#=I(>/__0J&" P!,'\ 8@ XM0-'+,6T # $""T P ,9Q!(> !0JR%.DI$;0JX;(2(; 1* XMDF80.7P H4FR$M" (3^\ &DY=3G4E(CP 6U( 1.N@0VY8#0O $XY0(3<(CP 6U( 1. XMN@1&* !*A&<>*CP %M,"R$W,!\ -F E*%N(5M")B%4FR$W&#>4H0Y1(3@ XM? P!DC XX!![((D,C ( $C!*@&\? !9@PP+(3R$TB (3-\ <$Y=3G5.50 2.<(("1M X,;0 $ XM !)F""!M @H$& <2FT #&\,(&T "' ,! H & *(&T "# 02, H $)M !)* XM;0 ,;!!$;0 ,2H1L"$2$.WP 0 2,BT #$C!( 1.N@..0>R"/%.*%+ #(M XM Q(P2 $3KH#A"@ 9MI*;0 29P93BA2\ "T@"DS?!!!.74YU3E7_(DCG"# D XM;0 ()FT #$)M__HK;0 0__P@2U*+$!!(@#@ 9P "[+A\ "5F +*0BW_,#M\ XM '_^#M\ "#_]CM\)Q#_]"!+4HL0$$B . "P? M9@Y";?_X($M2BQ 02( X XM +A\ #!F$#M\ ##_]B!+4HL0$$B . "X? J9A@@;?_\5*W__#M0__(@2U*+ XM$!!(@#@ 8#)";?_R8!PP+?_RP?P "M!$D'P ,#M __(@2U*+$!!(@#@ , 12 XM0$'L@DX(, " !FU+A\ "YF6B!+4HL0$$B . "P? J9A@@;?_\5*W__#M0 XM__0@2U*+$!!(@#@ 8#)";?_T8!PP+?_TP?P "M!$D'P ,#M __0@2U*+$!!( XM@#@ , 120$'L@DX(, " !FU#M\ +_\+A\ &QF$B!+4HL0$$B . [? $ XM__!@$+A\ &AF"B!+4HL0$$B . P!$C 8'@[? (_^Y@%CM\ K_[F ..WP XM$/_N8 8[?/_V_^X_+?_P2&W_,#\M_^XO+?_\3KK]Y"M _^HP+?_P2,#1K?_\ XM3^\ #&!:(&W__%BM__PK4/_J+RW_ZDZZ @P[0/_P6$]@2B!M__Q4K?_\.!!! XM[?\O*TC_ZA"$8"B0O &-GXE. 9Y20O MG /]T68!GM%6 9P#_ XM9P#_=&#,0>W_,)'M_^H[2/_P,"W_\+!M__1O!CMM__3_\$IM__AG:"!M_^H, XM$ M9PH@;?_J#! *V8N#&T ,/_V9B93;?_R(&W_ZE*M_^H0$$B /P!.DK!\ XM__]43V8* @"F8*XO*@ 23KKCO%!/0I)"J@ $0JH XM"$(J PP!&"03E7__DCG"" D;0 (0?K_1BE(A5((*@ $ QG"G#_3-\$$$Y= XM3G4(*@ " QG," 2D*H "#@ /P0O*@ ($"H #4B /P!.N@&NL$103V<0".H XM! ,0I)"J@ $ !@"C\$3KH T%1/4D2X;(2(;? P+(2(P?P !B\ XM+RR%.DZZ U)03TJLA2AG!B!LA2A.D$JLA59G"B\LA59.N@'J6$]*K(5:9PHO XM+(5:3KH!VEA/2JR%7F<*+RR%7DZZ @#, B XMD #- BI #. BM0#1 BT #2 B[ #3 C"@#4 C'@#5 C.@#6 XM C30#7 C8@#8 C@@#: CE@#; CM0#< CP@#= CT@#> C XMW #? C_ #@ D% #A D*P#B D0 #H D40 ! D;@ " D?P # XM DDP $ DIP % DO0 & DS@ ' DW0 ( D_ ) E$P * E XM.7( '(K G< # 7 !\P,3(S-#4V-S@Y86)C9&5F (" @(" @ XM(" @,# P,# @(" @(" @(" @(" @(" @(""00$! 0$! 0$! 0$! 0$! # P, XM# P,# P,#$! 0$! 0$ )"0D)"0D! 0$! 0$! 0$! 0$! 0$! 0$! 4! 0$! XM0 H*"@H*"@(" @(" @(" @(" @(" @(" @("0$! 0" XM 0 ! $! 0 ! XM @ $ XM XM XM XM XM XM XM XM % ^P ) 0 ( XM * #0 ! 3 %@ "& F@ "\ 9 &@ XM !L < '0 "D J *P "P O@ ,0 #* T XM -8 #< X@ .@ #N ] /H $ !!@ 0P $2 ! XM& 1X $D !*@ 3 $V !/ 4( %( !3@ 50 %: XM !8 68 %L !<@ 7@ %^ !A 8H &0 !E@ 9P X3 #\@ ^L ! #\G@ X Xend //END_OF_FILE echo x - zlib.UU sed 's/^X//' > zlib.UU << '//END_OF_FILE' Xbegin 644 zlib XM #\P # ( 49 L0 $ /I %&4[Z JQ. XM50 3EU.=4Y5__P,;0 # AL%$AZ &9.N@A@6$\_/ !3KH1LE1/2'H ;B!M XM HO* $3KH!V%!/*T#__&842'H 6$ZZ"#183S\\ %.NA&&5$\@;0 *4(@O XM"# M A50#\ +RW__&%$3^\ "B\M__Q.N@U 6$].74YU=7-A9V4Z('IL:6(@ XM/&QI8CX@/&]B:BXN+CX* '< 8V%N)W0@;W!E;B!O=71P=70* !.5?_\8#!( XM>@ ^(&T #B\03KH!3E!/*T#__&C $ XM2, DJ@ (T*H ""5 0@4E*2$!!(@,!\ /]@ /]:3E4 "\*3KH-!"1 2H!F XM"' )%].74YU+PHO+0 ,+RT "&$&3^\ #&#H3E4 $CG"" O+0 03KH+;D'L XM@ (D2%A/2A)F$#E\ 6"BG 3-\$$$Y=3G4O+0 ,+PI.N@7.2D!03V<$7(I@ XMV#\J 0O+0 (3KH#QC@ L'S__UQ/9@1P &#*(&T $!%$ T@;0 0$7P 0 , XM("T $&"R87!#[(*&1>R"AK7)9@XR/ /:PAT "+"4 $*4Z" XMD$CG@( (+@ $ 2EG$$OZ A.KO_B8 9"I_-?3G-#^@ @3J[^:"E @I1F#"X\ XM . !TZN_Y1@!$ZZ !I03TYU9&]S+FQI8G)A0 ! P+(*$P?P !B\ 3KH0L"E @IA03V840J=(>0 ! !.NA!X4$\N;(*, XM3G4@;(*80F@ !"!L@I@Q? ! ! @;(*8,7P 0 *(&R"C" L@HR0J $4( I XM0(*<(&R"G""\34%.6$*G3KH09"1 2JH K%A/9RXO+0 ,+RT ""\*3KH KCE\ XM &"H"!L@I@ :( 0@;(*8 &B *3^\ #&!"2&H 7$ZZ$'Y(:@!<3KH0 XM0"E @J(@;(*B2J@ )%!/9Q @;(*B(F@ )"\13KH//EA/+RR"HB\*3KK[^"EL XM@J*"IE!/3KH//B!L@I@@@$ZZ#VP@;(*8(4 !F<62'@#[4AZ "I.N@]((&R" XMF"% Q03R\L@J8_+(*J3KK[OD)G3KH-AE!/)%].74YU*@!.50 2.<,,"1M XM ! @;0 (("@ K.6 * @1" H !#E@"9 $!-(@$C T*T #%2 .4""K$*G,"R" XMK$C +P!.N@]2*4""KE!/9@A,WPPP3EU.=1 32( Z #\%($M2B"\(+RR"KDZZ XM 4Y(>@%(, 5(P-"L@JXO $ZZ Y@_+0 .+PHO+(*N3KH#-B!L@JY",% .7P XM 8*J, 5(P-"L@JXF0%*+)$M/[P <$!-(@#H L'P (&<8NGP "6<2NGP #&<, XMNGP #6<&NGP "F8$4HM@V P3 "!M>@P3 ")F+E*+($M2BQ 02( Z &<>($I2 XMBA"%NGP (F80#!, (F8$4HM@!D(J__]@ F#68#@@2U*+$!!(@#H 9R:Z? @ XM9R"Z? )9QJZ? ,9Q2Z? -9PZZ? *9P@@2E**$(5@SB!*4HI"$$I%9@)3 XMBU)L@JI@ /]:0A)"IS L@JI20$C Y8 O $ZZ#C I0(*F4$]F"$)L@JI@ /[8 XM>@ F;(*N8!XP!4C Y8 @;(*F(8L( "\+3KH&_E) 2,#7P%A/4D6Z;(*J;=PP XM!4C Y8 @;(*F0K ( & _IH@ $SO P !" (,B\ #& "$-E7R?_\9P9206 " XM0AA1R?_\3G5.50 /RT ##\\ P$O+0 (80903TY=3G5.50 2.@""+P9.N@RJ2'C__T*G+P9.N@R$3^\ && F,"T #,!\!0"P? 4 9A@O!DZZ XM"_AZ!%A/.46"BG#_3-\,\$Y=3G4P!,'\ 8GA@@ , 3!_ &($#1RS%M P XM! @M , #&<02'@ 4*G+P9.N@PJ3^\ ## $8,)D;W,N;&EB0 $Y5 XM !(YPP@."T "$ZZ"> P!,'\ 8D0-7L@IA*1&T*N&R"A&P$2I)F$#E\ *" XMBG#_3-\$,$Y=3G4P*@ $P'P [!\ %F"CE\ 6"BG#_8.!P # M XO "\M XM HO$DZZ"Z(J +"\_____T_O QF#$ZZ"U@Y0(**R 2@@P ( &;4N'P +F9:($M2BQ 02( X +!\ "IF&"!M XM__Q4K?_\.U#_]"!+4HL0$$B . !@,D)M__1@'# M__3!_ *T$20? P.T#_ XM]"!+4HL0$$B . P!%) 0>R 2@@P ( &;4.WP O_PN'P ;&82($M2BQ 0 XM2( X #M\ 3_\& 0N'P :&8*($M2BQ 02( X # $2,!@>#M\ C_[F 6.WP XM"O_N8 X[? 0_^Y@!CM\__;_[C\M__!(;?\P/RW_[B\M__Q.NOWD*T#_ZC M XM__!(P-&M__Q/[P ,8%H@;?_\6*W__"M0_^HO+?_J3KH"##M __!83V!*(&W_ XM_%2M__PX$$'M_R\K2/_J$(1@*)"\ 8V?B4X!GE)"\ "V< _W19@&>T XM58!G /]R5X!G /]T8,Q![?\PD>W_ZCM(__ P+?_PL&W_]&\&.VW_]/_P2FW_ XM^&=H(&W_Z@P0 "UG"B!M_^H,$ K9BX,;0 P__9F)E-M__(@;?_J4JW_ZA 0 XM2( _ $Z2L'S__U1/9@IP_TS?#!!.74YU8!8_+?_V3I*P?/__5$]F!'#_8.12 XM;?_Z,"W_\E-M__*P;?_P;MQ";?_N8" @;?_J4JW_ZA 02( _ $Z2L'S__U1/ XM9@1P_V"P4FW_[B!M_^I*$&<*,"W_[K!M__1MSC M_^[1;?_Z2FW_^&8H8!@_ XM/ @3I*P?/__5$]F!G#_8 #_>%)M__HP+?_R4VW_\K!M__!NVF 6/P1.DK!\ XM__]43V8& @"F8*PY0(** !@"C\$3KH T%1/4D2X;(*$ XM;? P+(*$P?P !B\ +RR"F$ZZ >!03TJL@K9G!B!L@K9.D$JL@KIG"B\L@KI. XMN@&66$]*K(*^9PHO+(*^3KH!AEA/2JR"PF<*+RR"PDZZ 7983RQX 0(+@ $ XM 2EG%"\-2_H "DZN_^(J7V &0J?S7TYS2JR"HF8P2JR"KF 4!>"L 4" ,#$R,S0U-C