[comp.sys.amiga] P: pipe-handler - README and executables

qix@ihlpa.ATT.COM (Puckett) (06/24/87)

I am posting the executables for P: now.  The sources have been
sent to comp.sources.amiga, but that group isn't working right now.

Have fun!

			-Ed Puckett.
			..!ihnp4!ihlpa!qix		<-- until 8/14/87
			..!ihnp4!mit-eddie!mit-oz!qix	<-- after

#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:    Shell Archiver
#	Run the following text with /bin/sh to create:
#	README
#	tap_demo
#	phl.uue
#	ph.uue
# This archive created: Wed Jun 24 13:41:35 1987
cat << \SHAR_EOF > README
README file for pipe-handler (version 1.2 13-Jun-87)
====================================================

This program and source are freely distributable, provided the file headers
remain intact (i.e., my name is on them!!!).

Ed Puckett accepts no responsibility for others' use of this program.

...but you shouldn't have any problems!


WHAT IS THIS?
-------------
Pipe-handler is an AmigaDOS device.  It supports OPEN, CLOSE, READ and
WRITE (of course), and also LOCK, EXAMINE, EXNEXT.  Therefore, you can
CD to the handler, use Dir and List on it, and ASSIGN to it as well as
to individual pipes in it.  Here is a complete list of the packet
types it supports:

	MODE_READWRITE
	ACTION_FINDINPUT  (syn: MODE_READONLY, MODE_OLDFILE)
	ACTION_FINDOUTPUT (syn: MODE_NEWFILE)
	ACTION_END
	ACTION_READ
	ACTION_WRITE
	ACTION_LOCATE_OBJECT
	ACTION_COPY_DIR
	ACTION_FREE_LOCK
	ACTION_EXAMINE_OBJECT
	ACTION_EXAMINE_NEXT
	ACTION_PARENT

You cannot Seek() pipes nor can you create pipe subdirectories.


INSTALLATION
------------
1. Perform the following:
	<uudecode phl.uue to produce pipe-handler-l>
	<uudecode ph.uue  to produce pipe-handler>
	Copy pipe-handler-l L:pipe-handler-loader
	Copy pipe-handler   L:pipe-handler

2. Add to S:Startup-Sequence (do not include !'s - they denote start of line):
	!Mount P:
	!Dir >NIL: P:

3. Add to DEVS:Mountlist (do not include !'s - they denote start of line):
	!P:	 Handler = L:pipe-handler-loader
	!	 Stacksize = 3000
	!	 Priority = 5
	!#

4. Reboot


NOTES ON INSTALLATION
---------------------
* The handler, once installed, requires approximately 18k of memory.  This
  memory cannot be reclaimed (unless you reboot and do not load the handler).
  Each pipe requires additional memory while it exists (its buffer size +
  about 100 bytes or so).

* You can skip the reboot, and just perform the "Mount" and "Dir" from the
  startup-sequence manually.

* After the "Dir", the pipe-handler is loaded into the system, and the files
  "L:pipe-handler-loader" and "L:pipe-handler" will not be accessed until the
  next reboot.	This means you may remove them from L: if you want (until
  next	reboot).  I do this because I copy L: into Ram:.

* TO CHANGE THE HANDLER NAME: change "P:" to whatever you want (e.g., "PIPE:")
  in the following 2 files:
	DEVS:Mountlist		(1 occurrence)
	S:Startup-Sequence	(2 occurrences)

* Feel free to shorten or otherwise change the names "pipe-handler-loader"
  and "pipe-handler".  Just be sure to reflect those changes in
  "S:Startup-Sequence" and "DEVS:Mountlist".


TAPS
----
The handler also supports "taps".  These are essentially tees off of the
pipe, and can specify any destination to which a copy of the pipe's stream
is to be sent.	One interesting application of this is tapping to a
CON: window; you can then see what is going through the pipe, and you
can also stop pipe throughput by typing a character into this window.
Taps can also be other pipes.

For an interesting demo of taps, EXECUTE the file "tap_demo".

All pipe I/O is asynchronous, so you will not be able to lock up the
handler by stopping one of its pipes.  A single reader / single writer
discipline in enforced.

Pipe buffers are dynamically allocated.  A pipe is removed from memory
when all openers have closed it and it is empty.  The size of a pipe buffer
may be specified as part of its name.  Otherwise, pipe buffers have a default
size of 4096 bytes.

Pipes behave in most respects like ordinary files.  Some differences follow:
Pipes block for writing (i.e., the write request is suspended) when the
pipe's buffer is full, and block for reading when the pipe's buffer is
empty.	Thus, pipes are sort of like bounded ram: files.  EOF is returned
for reading when the pipe's buffer is empty and no process has the pipe
open for writing.


NAME SYNTAX
-----------
In addition to the pipe's identifier, its name can specify its size
and a tap.  The syntax is

	name[/size][/[tapname]]

where the parts enclosed in "[]" are optional.  The size must begin with
a digit in the range 0-9.  If first digit is not "0", the size is
interpreted as decimal.  If the size begins with "0x", it is interpreted
as hexadecimal.  Otherwise, if the size begins with "0" but not "0x", it
is interpreted as octal.

If an empty tapname is specified, the default tap CON:10/15/300/70/name
is used (where "name" is the pipe's name given).


EXAMPLES OF PIPE NAMES
----------------------

The following assume that the pipe-handler is mounted as device P:

P:x				Opens a pipe named "x" with buffer size 4096

P:x/100 			Opens a pipe named "x" with buffer size 100

P:hold/ 			Opens a pipe named "hold" with buffer size
				4096, and also opens a window which displays
				the data which passes through the pipe.

P:xyzzy/plugh			Opens a pipe named "xyzzy" with buffer size
				4096, and also directs the data passing
				through into the file "plugh".  (Note that
				taps may be specified without specifying
				a size.)

P:thru/0x40/ram:thru-log	Opens a pipe named "thru" with buffer size
				64 (decimal), and also directs the data
				passing through the pipe into the file
				"ram:thru-log".


WHAT IS THIS SILLY "LOADER" FILE?
---------------------------------
According to _The_AmigaDOS_Manual_ (Bantam Books, Feb 1986), page 291:

	If you write your device handler in C, you cannot use the automatic
	load and process creation provided by the kernel.  In this case you
	must load the code yourself . . . .

Well, I know others have gotten around this, and I did, too.  The "prelude"
version of the handler (see the Makefile) does it all with one file.
However, I noticed that doing it this way, the handler would take about
3 seconds to "Mount" (after first access to it).  This made me very nervous -
visions of wild linking through memory, etc.  The loader version mounts
almost immediately.

Anyway, due to my (possibly unfounded) paranoia, I instead use the BCPL-like
assembly module "pipe-handler-loader" which LoadSeg()'s pipe-handler.  There
are undoubtedly better ways of handling this, but this works and, for me,
it is not too annoying to put up with the extra file.


COMPILATION
-----------
The supplied C source files were compiled with Lattice v3.03.
The assembly programs were assembled using the Commodore Assembler.

See the Makefile for information on creating a debugging version
(this puts up a window and tells you what packets are received by
the handler - fun!).  Basically, you just compile with a -DDEBUG
option and link in the debugging modules.

The Makefile will make either a "prelude" version (no "loader file)
or a "loader" version (the default).

I use an EXECUTE file "cc" to driver the compiler.  It is supplied.


INQUIRIES / COMMENTS / SUGGESTIONS
----------------------------------
Ed Puckett

US Mail:  MIT Branch PO - PO Box 61
	  Cambridge, MA  02139

E Mail:  ...!ihnp4!mit-eddie!mit-oz!qix
SHAR_EOF
cat << \SHAR_EOF > tap_demo
dir >P:a/P:b/P:c/P:d/CON:0/0/400/100/a->b->c->d
list P:
dir >P:a/CON:10/10/100/50/a
list P:
dir >P:b/CON:20/20/100/50/b
list P:
dir >P:c/CON:30/30/100/50/c
list P:
dir >P:d/CON:40/40/100/50/d
list P:
type P:a
list P:
type P:b
list P:
type P:c
list P:
type P:d
list P:
SHAR_EOF
cat << \SHAR_EOF > phl.uue
begin 777 pipe-handler-l
M   #\P         !               R   #Z0   #(    RG_P    0Y8DO
M00  0J\ !$/Z (9"@"QX  1.KOW8+T  "&8   XO?    'H !&   %A#^@!P
M(@DL;P (3J[_:B]   QF   .+WP   #-  1@   J0_H /B*/("\ #.6(($ @
M+P  +P!.J  $+GH )B(O  PL;P (3J[_9")O  @L>  $3J[^8B O  3?_   
M !!.=0    !D;W,N;&EB<F%R>0!,.G!I<&4M:&%N9&QE<@            $ 
+   $     0   _(N
 
end
SHAR_EOF
cat << \SHAR_EOF > ph.uue
begin 777 pipe-handler
M   #\P         4         !,   #R    "     T    <    Z@    D 
M   @    D    ><   &!   !/     $    &    #0   !$    ,    !0  
M #D    .    1P   ^D   #R3E;_Y$CG(  C^0    0    ,0J=(>0   !1.
MN0   .A0CR/     $$J 9P "QB!N  @@*  4Y8!R'B\!2'D     +P!.N0  
M 2!/[P ,+7P     __P@;O_\$!!* &<0#   .F8$0A!@!E*N__Q@YD*G3KD 
M   P6(\M0/_X!H    !<(\     $(&[_^'( (4$ F"!Y    !! H  E(@$C 
M+P O 4ZY     %"/(\     (2H!G  (Z<  @>0    00*  /<@'AH7  (GD 
M   ($"D #W0!X:(M0?_T@H(B;@ (("D '.6 (\      (GD     (T@ ")'(
M(\@    >(\@    B2'D    F+4'_["U"__!.N0   "18CR!N  @O$"\H  1.
MN0   *A0CR\N_^Q.N0   $18CRU _^C KO_P2H!G("\Y    "&$  >98CRU 
M_^1*@&<,+P!.N0  !*Y8CV#@("[_Z,"N__1*@&>\+SD    $80 !NEB/+4#_
MY$J 9Z@@0" H  AR8 2!    "&L  3BPNQ@(9O!.^Q@&    '6   18    8
M8   _@   !=@  #F    #V   ,X    38   M@    A@  ">    5V   (( 
M  !28   :    ^]@  !0   #[F   #8   /M8   '    ^Q@   "0J<O+O_D
M3KD     4(]@ /]@0J<O+O_D3KD     4(]@ /].0J<O+O_D3KD     4(]@
M /\\+R[_Y$ZY   $9EB/8 #_+$*G+R[_Y$ZY     %"/8 #_&G !+P O+O_D
M3KD     4(]@ /\&+R[_Y$ZY    *%B/8 #^]B\N_^1.N0   5!8CV  _N8O
M+O_D3KD   &@6(]@ /[6+R[_Y$ZY   ""EB/8 #^QB\N_^1.N0   MA8CV  
M_K8O+O_D3KD   /,6(]@ /ZF(&[_Y$*H  PA?    -$ $"\0+R@ !$ZY    
MJ%"/8 #^A)'((GD     (T@ "$JY    "&<2<"(O "\Y    "$ZY    &%"/
M2KD    09PXO.0   !!.N0   -18CTS?  1.7DYU3E;__$CG  PJ;@ (+PU.
MN0   ,!8CRA N?P     9@1P & &(&P "B (3-\P $Y>3G5.5O_X+7D    >
M__Q*KO_\9T8@;O_\6(@O""\N  A.N0   EQ0CR! $A M0/_X2@%F'"(N  B0
M@2!N__Q8B-' $!!* &8(("[__$Y>3G4@;O_\+5#__&"T< !.7DYU      /L
M    $0    $   ,B   #&@   PP   ,    "]@   78   %*    \@   .P 
M  #.    O@   +    "6    A@   "0    6    #@    8    "   #;@  
M 0H   $$    _@   %     ^     @    0   .(    1@    0    (   "
M0    C    (>   "#     ,    )   "9@   E(   %@    !@    H   +&
M   "M@   J8   *6   "A@   G8    !    $0   *@    !    $@   1@ 
M   (    $P   T8   ,H   #$@   38   +H   !*@   '0    <        
M _(   /J    "                           9&]S+FQI8G)A<GD    #
M\@   ^L    -   #\@   ^D    <3E8  "!N  @B;@ ,(I @B4Y>3G5.5O_\
M2.< !"IN  A*E6<$*E5@^"JN  P@;@ ,0I!,WR  3EY.=4Y6__PM;@ (__P@
M;O_\2I!G'B 0(FX #+/ 9@H@0")N__PBD& *(&[__"U0__Q@VDY>3G4     
M _(   /I    ZDY6__Q(>0    !(>0    !A  (D4(]!^0   !$B;@ ,(H@B
M;@ 0(KP  !  (&X %$*0<&PO "!N  PO$"\N  AA  #>3^\ #' Z+P @;@ ,
M+Q!A  &Z4(\@0!(0+4#__ P! #IF%%*(+P@B;@ ,+Q$M2/_\80 !P%"/<"\O
M "!N  PO$&$  8A0CRU __P@0$H09P  AD(04J[__"!N__P0$$B 2,!R.2\!
M<C O 2\ 80  \$_O  Q*@&=(+RX $"\N__QA  'B4(]*@&<,(&X $ R0    
M &(&< !.7DYU<"\O "\N__QA  $D4(\@0!(0+4#__$H!9@9P 4Y>3G52KO_\
M(&[__")N !0BB! 02@!F!B*\     ' !3EY.=4Y6__A(YP,,*FX ""AN  P<
M%4B&2,92C2 N !!3@+R ;P(L 'X OH9L"AB54HU2C%*'8/)"%$S?,,!.7DYU
M3E;_]$CG PPJ;@ ((&X #%*(*$@@+@ 04X L 'X OH9L$B!,4HP0%1" 4HU*
M &<$4H=@ZB '(&X #!" 3-\PP$Y>3G5.5@  2.<' "XN  @L+@ ,*BX $+Z&
M;0B^A6X$< %@ G  3-\ X$Y>3G5.5@  2.<! !XN  L@!TB 2,!R>B\!<F$O
M 2\ 8;A/[P ,2H!G#B '2(!(P : ____X& &( =(@$C 3-\ @$Y>3G5.5@  
M2.<!!"IN  @>+@ /$!5* &<(L =G!%*-8/(@#4S?((!.7DYU3E8  $CG  PJ
M;@ (*&X #"!-4HT0%!" 4HQ* &;R3-\P $Y>3G5.5O_^2.< #"IN  @H;@ ,
M2A5G+A 52(!(P"\ 80#_4EB/$A1(@4C!+P$?0  ,80#_0%B/$B\ "+( 9@92
MC5*,8,X@#4S?, !.7DYU3E;_]' *+4#__"U\    $O_X(&X "! 0#   ,&8B
M$"@  4B 2, O &$ _OI8CPP  %AF#' 0+4#__%2N  A@%B!N  @0$ P  #!F
M"G (+4#__%*N  @@;@ ,0I @;@ ($!!(@$C +P!A /ZZ6(](@$C +P O+O_X
M80#^[%"/(B[_^)"!(B[__%.!+P%"IR\ +4#_]&$ _F1/[P ,2H!G1" \ 0  
M )"N__0B+O_\3KD     (&X #"(0LH!C!G  3EY.=2 N__P@;@ ,(A!.N0  
M   @@" N__31D%*N  A@ /]Z(&X "! 0#   +V<(2@!G!'  8 )P 4Y>3G4 
M     ^P    "    !0   K0    &     P    8   $6    &     P    !
M    #@   U@    !    #P   W@        #\@   ^H    )0T]..C$P+S$U
M+S,P,"\W,"\ ,#$R,S0U-C<X.4%"0T1%1@     #\@   ^L    @   #\@  
M ^D   "03E;__)'(+4C__" N  @,@     !C. R  0   &(P!H     /<@$O
M 2\ 3KD     4(\M0/_\2H!G%'( ($ A00 $((%"*  ((6X "  *("[__$Y>
M3G5.5O_T2.<!#"IN  P,K@      $&,2(&X "" 0L*@ !&802B@ "&8*< !,
MWS" 3EY.=2 N ! @;@ (T/P #B)N  @B*0 $T<$H2"U __2RD65(("D "I"!
M+@ @+O_TOH!C BX +P<O#2\,3KD   $ 3^\ #"!N  @@*  $T(<B*  *3KD 
M    (4$ !)^N__30_  .T<$H2-O'#*X     __1C-"!N  @@$)"H  0N &<F
M("[_]+Z 8P(N "\'+PTO#$ZY   ! $_O  P@;@ (WZ@ !)^N__0@;@ (0B@ 
M"" N !"0KO_T3-\P@$Y>3G5.5O_T2.<!#"IN  P,K@      $&,2(&X "" 0
ML*@ !&802B@ "&<*< !,WS" 3EY.=2 N ! @;@ (T/P #B)N  @B$='!*$@M
M0/_TLJD !&5$("D "I"!+@ @+O_TOH!C BX +P<O#"\-3KD   $ 3^\ #"!N
M  @@$-"'(B@ "DZY     ""!GZ[_]-O'T/P #M'!*$@,K@    #_]&,R(&X 
M"" H  20D"X 9R0@+O_TOH!C BX +P<O#"\-3KD   $ 3^\ #"!N  C?D)^N
M__0@;@ ((!"PJ  $5\%$ 4B!2,$100 (("X $)"N__1,WS" 3EY.=0     #
M[     (    -   !R    -H    %    $P   @8   &R   !&@   ,(    L
M         _(   /I   !YTY6_^!(YP @D<@M2/_P+4C_[")N  @C2  ,("D 
M'.6 2&[_[$AN_^A(;O_P+P!.N0    !/[P 02H!F$"!N  @A?    -( $&  
M T)*K@ ,9B1*KO_L9QX@;O_L$!!* &<4+P@O+@ (80 %!%"/3-\$ $Y>3G4@
M;@ (+6@ "/_\("@ &.6 D<@M0/_T+4C_X$J 9Q(D0")J  0M2?_@L_P     
M9BP@;O_P$!!* &80(&X ""%\    T@ 08  "SB\N__!.N0   VA8CRU _^!@
M)"!N__ 0$$H 9Q @;@ ((7P   #2 !!@  *B(&[_X%B(+4C_\"!N  @@*  4
MY8!R 2\!<@PO 2U __A.N0    !0CRU _^1*@&8.<&<@;@ ((4  $&   F1*
MKO_@9@ !6 RN   #[?_\9A @;@ ((7P   #- !!@  )"<&<@;@ ((4  $' !
M+P O/    )9.N0    !0CRU _^!*@&<  APO+O_H3KD     6(\@;O_@(4  
M<$J 9S9P 2\ <!0O $ZY     %"/(&[_X"%  (9*@&8P(&@ <" H  H&@   
M  \O "\(3KD    84(\O/    )8O+O_@3KD    84(]@  &X(&[_X%B(+R[_
M\"\(3KD   (V4(\@;O_D(*[_X" N__PA0  $#(    /M9A9"J  ((&[_X! H
M '0    !$4  =& T#*X   /N__QF%G !(&[_Y"%   @@;O_@$7P  @!T8!1P
M B!N_^0A0  ((&[_X!%\  , =)'((F[_X"-( '8C2 !Z(VX # !^(T@ @B\)
M+RD ADZY   $6E"/+R[_X$AY    'DZY    %%"/8   [B\N_^ O+@ ,80 !
M4E"/2H!G$"!N  @A?    -( $&   .0@;O_D(*[_X" N__PA0  $(&X ""%\
M    R@ 0#(    /M9BH@;O_@$"@ = @   !F  "P(&[_Y$*H  @@;O_@$"@ 
M=     $10 !T8%@,K@   ^[__&8J(&[_X! H '0(   !9GQP 2!N_^0A0  (
M(&[_X! H '0    "$4  =& D(&[_X! H '0"   #2@!F4' "(&[_Y"%   @@
M;O_@$7P  P!T2JX #&<>(&[_X$JH 'YG"B\H 'YA  . 6(\@;O_@(6X # !^
M(&[_^"%N_^0 )' !(&X ""%   Q"J  0(&X "$JH  QF*$JN_^1G$' ,+P O
M+O_D3KD    84(]*K@ ,9Q@O+@ ,80 #+EB/8 PO+O_@3KD     6(\@;@ (
M+Q O*  $3KD   "H4(],WP0 3EY.=4Y6__!"KO_P2JX "&=N#*X  "<0__!L
M9" N  CE@"U __PB0"!I  BQ^0    1F0"!I "0M2/_XL?P     9PX@4"U(
M__2Q_     !F!G  3EY.=2!N__2Q[@ ,9@9P 4Y>3G4@;O_T+6@ ?@ (8 9P
M $Y>3G52KO_P8(QP $Y>3G5.5O_X(&X ""UH !3__"!N__PM4/_X2J@ "&<*
M#*@    "  AF$"!N__@0* !T @#__A%  '0@;O_\("@ " R      6<$58!F
M$"!N__@0* !T @#__1%  '1P#"\ +R[__$ZY    &%"/+R[_^$ZY   !#%B/
M< $@;@ ((4  #$*H ! O$"\H  1.N0   *A0CTY>3G5.5@  +RX "$AY    
M'DZY    .E"/(FX ""!I ' @*  *!H     /+P O"$ZY    &%"/<!0O "!N
M  @O* "&3KD    84(\@;@ (2J@ ?F<*+R@ ?F$  9)8CR\\    EB\N  A.
MN0   !A0CTY>3G5.5O_H2.<@,$JN  QG  "T< $O '!L+P!.N0    !0CRU 
M__Q*@&<  )HO/  !  %P+"\ 3KD     4(\M0/_X2H!G;G !+P!P%"\ 3KD 
M    4(\M0/_T2H!G1B\Y    "$ZY   #OEB/+4#_\$J 9R O+@ ,3KD    0
M6(\M0/_L2H!F8B\N__!.N0  !$A8CW 4+P O+O_T3KD    84(]P+"\ +R[_
M^$ZY    &%"/<&PO "\N__Q.N0   !A0CR!N  A"J  ,(7P   #2 ! O$"\H
M  1.N0   *A0CTS?# 1.7DYU3KD     <FPO 2\N__PO+@ ,+4#_Z$ZY   !
M7D_O  QP_R!N__@A0  0(4  %")N_^PA20 ()&[_\"9N__0G2@ $)VX "  (
M)T@ #" (Y(@B+O_HY(DD+O_\Y(HO"2\"+P$O "\\   #[B\*3KD   1\3^\ 
M&"\N__1(>0   ").N0    !0CTS?# 1.7DYU3E;_]$CG " @+@ (Y8 O.0  
M  @M0/_\3KD   .^6(\M0/_X2H!G)' !+P!P%"\ 3KD     4(\M0/_T2H!F
M)"\N__A.N0  !$A8CW L+P O+O_\3KD    84(],WP0 3EY.=2!N__@B;O_T
M(T@ !"-N__P #"1N__PO*@ (<  O "\ +RH )"\\   #[R\(3KD   1\3^\ 
M&"\N__1(>0   ").N0    !0CTS?! !.7DYU      /L     0        #&
M     P    $   ;V   %S   ! X    $     @  !X8   ;2   %!@   G@ 
M   $     P  !XP   ;8   %#    GX    #    !   !FX   'D    ,   
M  $    '   !>     <    )   '>   !L0   <L   %^@  !P    72   $
MU@    (    *   #Q    FP    "    $@  !E@   7F    %0   !,   9(
M   $\@   ]8   <\   &*@  !AH   8*   %9   !3X   4J   $R@   Z8 
M  ',   !N@  !Q@   6\   %I   !8@   &4   !8@   0X        #\@  
M ^D   &!3E;_]$JN  QG,@RN     0 ,9R@@;@ ((7P   #1 !!P_R!N  @A
M0  ,+Q O*  $3KD   "H4(].7DYU(&X ""UH !3__"!N__PM4/_X< $O ' 4
M+P!.N0    !0CRU __1*@&8,<&<@;@ ((4  $&"N(&X ""%\    TP 02JX 
M#&8L(&[__$JH  AG"@RH     @ (9H@@;O_XT/P =B\N__0O"$ZY    %%"/
M8"P@;O_\("@ " R      6<&58!F /]<(&[_^-#\ 'HO+O_T+PA.N0   !10
MCR!N__0A;@ (  0A;@ , ! @;@ ((F[_]"-H !@ ""-H !P #"\N__AA!EB/
M3EY.=4Y6__8O+@ (3KD     6(\=?  !__]*+O__9P  [$(N__\B;@ ((&D 
M<" 0L*@ !&8&2B@ "&=<(FX ""!I '8M2/_ZL?P     9T@O*  ,+R@ ""\I
M '!.N0   %9/[P ,+4#_]DJ 9Q(@;O_ZT:@ ")&H  P=?  !__\@;O_Z2J@ 
M#&:<+P@O+@ (80  X%"/8(XB;@ ((&D <" 0L*@ !&8(2B@ "&8 _VPB;@ (
M(&D >BU(__JQ_     !G /]6+R@ #"\H  @O*0!P3KD   %&3^\ #"U __9*
M@&<2(&[_^M&H  B1J  ,'7P  ?__(&[_^DJH  QFF"\(+RX "&%J4(]@C")N
M  @@:0!P(!"PJ  $9E)**  (9DP0*0!T"    69"2JD >F8\(FX ""!I '8M
M2/_ZL?P     9PHO""\)8290CV#B(&X "! H '0(    9A!*J ""9@HO"$ZY
M   $_%B/3EY.=4Y6__1(YP P(&X #"UH  3__")N__P@*0 <D*@ #"-   QP
M "-  !!*J  09CHD;@ (U/P =B\(+PI.N0   #I0CR!N__PO$"\H  1.N0  
M *A0CW 4+P O+@ ,3KD    84(]@  #6(&X "-#\ 'HO+@ ,+PA.N0   #I0
MCR!N  A*J !^9P  DB\Y    "&$  +)8CRU __A*@&8D(&[__"\0+R@ !$ZY
M    J%"/<!0O "\N  Q.N0   !A0CV!Z(&[_^")N  PC2  $(V[__  ()&X 
M"" J '[E@"1 +RH ""9N__PO*P <+RL &"\J "1R5R\!+P@M0/_T80 ! D_O
M !@O+@ ,2'D    B3KD     4(]@(B!N__PO$"\H  1.N0   *A0CW 4+P O
M+@ ,3KD    84(],WPP 3EY.=4Y6__A(YP @+SP  0 !<!0O $ZY     %"/
M+4#__$J 9@IP $S?! !.7DYU+SP  0 !<# O $ZY     %"/+4#_^$J 9AIP
M%"\ +R[__$ZY    &%"/< !,WP0 3EY.=2!N__P1?  %  @B;O_X(4D "B1N
M  @A2@ .(H@C2@ $( E,WP0 3EY.=4Y6  !*K@ (9R8@;@ (2I!G#G 4+P O
M$$ZY    &%"/<# O "\N  A.N0   !A0CTY>3G5.5@  (&X ""%N  P ""%N
M !  %"%N !0 &"%N !@ '"\0+RX '$ZY    J%"/3EY.=4Y6__PM>0   "+_
M_$JN__QG*B)N__P@:0 $L>X "&82+PE(>0   ").N0   #I0CV *(&[__"U0
M__Q@T$JN__QF#B\N  AA /]26(].7DYU(&X "" H  AR* 2!    "&L  -2P
MNQ@(9O!.^Q@&    5V   *P   /O8   C@   ^Y@   2   #[6    H   /L
M8    B!N  A*J  ,9Q8O*  4(&[__"\H  A.N0    !0CV Z<"PO "!N__PO
M*  ,3KD    84(\@;@ (0J@ #"%\    T@ 0(F[__"!I  @O$"\H  1.N0  
M *A0CR!N  @@*  <Y8!R;"\!+P!.N0   !A0CV L<"PO "!N__PO*  ,3KD 
M   84(]@%B)N__P@:0 (+Q O*  $3KD   "H4(\O+@ (80#^7EB/<!0O "\N
M__Q.N0   !A0CTY>3G4      ^P    !     0   P8    #     @  !-( 
M  2T   #A@    8    #   #C   !-@   +R   "M@   -8   "H     @  
M  <   '<   !9@    (    (   %7    G     !    "@   18    4    
M$P  !?@   7&   %L   !7(   1R   $8@  ! X   .P   #-    M@   /V
M   #T@   %@   7>   %F   !*0   .@   #)    L@    R         _( 
M  /I   !/$Y6   @;@ (T/P BB\(3KD    D6(](>0   "9.N0   "18CTY>
M3G5.5O_L80 $!'  (&X ""%   PA0  0("@ %.6 +4#_\ RH_____@ <9PPA
M?    -0 $&   -X@;@ (("@ &.6 2&[_^$AN__1(;O_\+P!.N0    !/[P 0
M2H!F$"!N  @A?    -( $&   *A*KO_P9Q0B;O_P(&D !"U(_^RQ_     !F
M6B!N__P0$$H 9A(@.0    #DB"!N  @A0  ,8' O+O_\3KD   -H6(\M0/_L
M2H!F#B!N  @A?    ,T $&!.(&[_[" H (;DB"!N  @A0  ,(&[_[%*H ()@
M,B!N__P0$$H 9PX@;@ ((7P   #2 !!@&B!N_^P@* "&Y(@@;@ ((4  #"!N
M_^Q2J ""(&X ""\0+R@ !$ZY    J%"/3EY.=4Y6__@@;@ (("@ %"%   QP
M "%  ! @*  4Y8 M0/_\2H!G%B) (&D !"U(__BQ_     !G!%*H ((@;@ (
M+Q O*  $3KD   "H4(].7DYU3E;_^"!N  @@*  4Y8 M0/_\2H!F#D*H  PA
M?    -, $& P(F[__"!I  0M2/_XL?P     9PY3J ""+PA.N0   0Q8CW !
M(&X ""%   Q"J  0(&X ""\0+R@ !$ZY    J%"/3EY.=4Y6__1(YP @< $@
M;@ ((4  #'  (4  $" H !CE@"(H !3E@2U __PM0?_X2H%F#D*H  PA?   
M ,T $&!V(F[_^"!I  0M2/_TL?P     9BY(>0   "9P "\ +P!P 2\ < ,O
M $AY     "\Y    'B\N__QA  (&3^\ (& T(&[_]%B()&[_]")J '#4_ "*
M+PIP 2\ +RD "G#_+P!P R\ +PA"IR\N__QA  '03^\ ("!N  @O$"\H  1.
MN0   *A0CTS?! !.7DYU3E;_\$CG #!P "!N  @A0  ,("@ %.6 +4#__$J 
M9@PA?    -, $&   + @;O_\2J@ !&<0(&X ""%\    U  08   EB!N  @A
M?    .@ $" H !CE@") (%$M0/_X+4C_]+'\     &=N+7D    >__!*KO_P
M9Q0@;O_TL>[_\&<*(&[_\"U0__!@YB N__0@;O_PL<!F0"! 6(@D0")J '#4
M_ "*+PIR 2\!+RD "G+_+P%R R\!+P@F0"\3+R[_^&$  .I/[P @< $@;@ (
M(4  #$*H ! @;@ (+Q O*  $3KD   "H4(],WPP 3EY.=4Y6__QA8'  (&X 
M""%  ! @*  4Y8 M0/_\2H!F#D*H  PA?    -, $& D(&[__$JH  1F"B!N
M  A"J  ,8! @.0    #DB"!N  @A0  ,(&X ""\0+R@ !$ZY    J%"/3EY.
M=4JY     &8>0?D     ( A6@ * _____$*G+P CP     !A!%"/3G5.5@  
M(&X "$*0(6X #  $</XA0  ((7D    $  P@.0    #DB"%  !!.7DYU3E8 
M "!N  @@K@ ,(6X &  $4(AP;"\ +P@O+@ 03KD   %>3^\ #"!N  @A;@ 4
M '0A;@ 8 '@A;@ < 'PA;@ @ (#0_ "$< PO "\(+RX )$ZY   ! $_O  P@
M;@ (0B@ D$Y>3G4   /L     0        #0     @    $   1Z   $<@  
M  4    "   #1@   G@   )R   "7@   !@    "    !   !*@   !X    
M 0    D   '@    !     L   10   $-   ! X   "Z     0    P   0\
M     @   !(    >    $     <    3   $W   !"@   .^   "R@   @  
M  &6   !1@        /R   #Z@    $        #\@   ^L    &   #\@  
M ^D    -+P(O TJ!9R)*@&<<0H)V'^. XY*T@64(E('0O     %1R__N(@)@
M!$*!0H F'R0?3G4      _(   /I    $4CG/  J 6<R:@)$@2@ 9RAJ D2 
M0H)V'^. XY*T@64$E(%2@%'+__(B KF%:@)$@+.$:@A$@6 $0H%"@$S? #Q.
M=0     #\@   ^D    ,2.=P "0 9R!*@68$0H!@&"8 QL%(0L3!2$)"0M:"
M2$' P4A 0D#0@TS?  Y.=0     #\@   ^D    %(&\ !""(6)!"J  $(4@ 
M"$YU      /P     E].97=,:7-T              /R   #Z0   #E(YS\@
M*"\ (!8O "<O//____].N0   %@J "P%=/^TA5B/9@9P &   &XO/  !  %(
M>  B3KD     )$#/BDJ'SXI0CV8.+P9.N0   &QP %B/8$(E1  *%4, "15\
M  0 "$(J  X51@ /0J=.N0   # E0  02H18CV<,+PI.N0   (!8CV ,2&H 
M%$ZY     %B/( I,WP3\3G5(YR @)&\ #$JJ  IG"B\*3KD   "46(\5? #_
M  AT_R5" !1T !0J  \O DZY    ;$AX "(O"DZY    &$_O  Q,WP0$3G4 
M  /L     0   !    ".    "    !,    V    %    &X   #*    2@  
M (    "N    U@        /P     2Y,.0     ,     2Y,.      J    
M 2Y,-P    !4     2Y,-@    "(     2Y,-0    !\     2Y,-     "4
M     2Y,,P    !&     2Y,,@     D     2Y,,0    "6     2Y,,3< 
M  "@     2Y,,38   "<     2Y,,34   "D     2Y,,30   "J     2Y,
M,3,   "T     2Y,,3(   #>     2Y,,3$    $     2Y,,3          
M U]$96QE=&50;W)T     )P    #7T-R96%T95!O<G0               /R
M   #Z0    XO#BQY    $$ZN_WPL7TYU+PXL>0   ! B+P (3J[_4BQ?3G4O
M#BQY    $"(O  A.KO] +%].=0   ^P    #     0   "@    4    !   
M      /P     U]$871E4W1A;7       "0    #7T1E=FEC95!R;V,     
M$     )?26]%<G(                #\@   ^D   !'+PXL>0    Q,[P #
M  A.KO\Z+%].=0  +PXL>0    PB;P (("\ #$ZN_RXL7TYU+PXL>0    PB
M;P (3J[^VBQ?3G4O#BQY    #" O  A.KO["+%].=2\.+'D    ,("\ "$ZN
M_K8L7TYU+PXL>0    P@+P (3J[^L"Q?3G4O#BQY    #")O  A.KOZ>+%].
M=2\.+'D    ,(F\ "$ZN_I@L7TYU+PXL>0    Q,[P,   A.KOZ2+%].=0  
M+PXL>0    P@;P (3J[^C"Q?3G4O#BQY    #")O  A.KOYB+%].=2\.+'D 
M   ,(F\ "" O  Q.KOW8+%].=2\.+'D    ,3.\#   (("\ $$ZN_9 L7TYU
M      /L    #0    $   $$    [    -@   #$    K    )@   "$    
M<    %P   !(    -    !P    $         _     "7T-O<'E-96T   $ 
M     U]/<&5N3&EB<F%R>0   .@    $7T-L;W-E3&EB<F%R>0       -0 
M   "7T=E=$US9P    #      E]0=71-<V<     J     )?4F5M4&]R=   
M )0    "7T%D9%!O<G0   "      U]&<F5E4VEG;F%L     &P    #7T%L
M;&]C4VEG;F%L    6     )?5V%I=        $0    #7T9I;F1487-K    
M    ,     )?1G)E94UE;0   !@    #7T%L;&]C365M                
#  /R
 
end
SHAR_EOF
#	End of shell archive
exit 0