[comp.sources.3b1] v01i014: The Vid Pal Emulator, Part01/01

dhb@uunet.UU.NET ( comp.sources.3b1) (03/11/91)

Submitted-by: John Milton <uncle!jbm>
Posting-number: Volume 1, Issue 14
Archive-name: vidpal-em/part01

[A little bit extracted from the README file. See the README file for details.]

First, the vidpal. 

Now, the vidpal emulator. This is a tiny software patch, written in assembler,
which allows user programs to access the video RAM without hardware. It is
installed as a loadable device driver. 

The end result is that you can run MGR unmodified on a machine without a vidpal
so you can see how good MGR is and wish you had a real vidpal. The performance
is a lot better than I expected, but is still FAR below what one will get with a
real vidpal. 


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  README Makefile vpe.s rops.Z.uue
# Wrapped by jbm@uncle on Sun Mar  3 20:07:42 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(11454 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X
X
X			Vid Pal Emulator
X
XFirst, the vidpal. This is a hardware addition to the UNIXpc which defeats part
Xof the normal memory protection hardware to allow access to the UNIXpc video
XRAM. This makes implementation of programs that access the screen trivial in
Xcomparison device drivers in the kernel.
X
XNow, the vidpal emulator. This is a tiny software patch, written in assembler,
Xwhich allows user programs to access the video RAM without hardware. It is
Xinstalled as a loadable device driver. This is how it works: in the driver
Xinit routine, the 68010 BERR vector is patched in low memory to point to
Xa routine in the driver which will get first crack at all BERR traps. The
Xoriginal value of the vector is kept to allow normal processing of all non-
Xvideo access, and to restore the BERR trap vector when the driver is unloaded.
XOnce patched in, the new BERR handler checks all faulted addresses to see if
Xthey are in the range $420000 to $428000, video RAM. If they aren't, then
Xcontrol is passed on to the old trap handler for further processing. If the
Xaccess is to video RAM, then the special status register in the BERR exception
Xframe is check to see if the access is a read or a write. If it is a write,
Xthen the word in the output buffer in the exception frame is written to
Xvideo memory. If the access is a read, then the accessed word is read from
Xvideo RAM and put into the exception frame data input buffer. Next, the 
Xre-run (RR) bit in the exception frame special status register is set to
Xsignal that the read or write has been taken care of and that the memory
Xcycle should NOT be re-run when the processor returns from the exception.
XNext, a very important, UNIXpc specific operation needs to be done. A write
Xmust be done to the Clear Status Register (CSR) register ($4C0000), which
Xclears the BSR0, BSR1 and GSR registers. This needs to be done, because the
XUNIXpc MMU circuitry latches some important information used by the Page Fault
Xcode whenever there is a Bus ERRor. If this register is not cleared, then a
Xlater page fault will have the status of a video RAM access in it and all kinds
Xof weird things will happen (I know, this was how it ran until I found this).
XThe last thing do be done is to return back to the user program. This must be
Xdone with an RTE (ReTurn from Exception) instruction instead of an RTS (ReTurn
Xfrom Subroutine), so that the state of the processor when the BERR happened
Xcan be completely restored.
X
XFor more information about exception handling on the 68010, you should get a
Xcopy of "MC68010/MC68012 16-/32-BIT VIRTUAL MEMORY MICROPROCESSORS", #ADI942R2
Xfrom Motorola. This is basically an overgrown data sheet.
X
XThe end result is that you can run MGR unmodified on a machine without a vidpal
Xso you can see how good MGR is and wish you had a real vidpal. The performance
Xis a lot better than I expected, but is still FAR below what one will get with a
Xreal vidpal. For the more observant, you will notice that I said "the word" a
Xlot above. The code as is will not take care of high byte/low byte write
Xaccesses, but after playing with MGR for a while, it doesn't look like MGR
Xdoes any byte accesses.
X
XThis code could easily be modified to provide various kinds of access to other
Xparts of the machine to user processes.
X
XVIDPAL Blurb:
X>VIDPAL KIT - $25
X>  This kit contains a PC board, a programmed PAL, a capacitor, a socket, 66
X>pin sockets, ~1 inch of wire wrap wire, and complete instructions.
X>  What this kit does is it allows you to access the video ram of you 3B1/7300
X>directly from any user process.  The significance of this is you can now write
X>your own window manager with a lot less hassle.  The reason I came up with this
X>kit was because Brad Bosch and I wanted to run Mgr on our 3B1's and we didn't
X>want to write a new wind.o for Mgr.
X>  Vidpal is a little daughter board that is placed between the 68010 and the
X>mother board which intercepts and modifies the supervisor signal.  The PAL
X>checks to see if you are addressing the video ram, and if you are, the
X>supervisor signal is forced active.  This means the memory management PAL will
X>not cause a bus error because it thinks your are in kernel mode.  The vidpal
X>PAL makes sure that ONLY the video ram is made accessible, otherwise you would
X>loose all hardware protection.
X>  One of my design goals was there had to be NO modifications to the mother
X>board, and the daughter board allows this.  The kit requires a modest amount
X>of soldering skill and for your machine to be mostly disassembled.  Most
X>people will find that it isn't difficult to assemble and install.
X>
X>  Send a mailing label and a check in US funds to my NEW ADDRESS:
X>
X>	Brian D. Botton
X>	1748 Paddington Ave.
X>	Naperville, IL. 60563-2028
X>--
X>     ...     ___	     ***
X>   _][_n_n___i_i ________  *******		Brian D. Botton
X>  (____________I_I______I_I_______I		laidbak!botton  or
X>  /ooOOOO OOOOoo  oo oooo  oo   oo		laidbak!bilbo!brian
X
X
X
X
XHowdy,
X
XI have worked up an assembly routine which can be spliced into the 68010
XBERR trap vector, which appears to emulate the functionality of the vidpal.
XIt is spliced into the vector in the init routine of a loadable device
Xdriver and spliced back out in the release. I did say "appears" I pulled mgr
Xdown from osu and built it. Since then, mgr, kdb and I have been fighting it
Xout. I can get mgr started up and running the copyright screen. When I hit
Xa key, the first few parts of erase_win -> Bit_pattern run, I get a whole
Xline of:
X
X*  *  *  *  *  *  *
X *  *  *  *  *  *  *
X
Xand a whole line of:
X
X  *  *  *  *  *  *
X *  *  *  *  *  *
X
XAbout the time it starts to replicate those two sets of lines down the screen,
XI get a SIGSEGV. I have a breakpoint set in the kernal debugger on my trap
Xhandler, and the address that's being trapped on is not an access to video
Xmemory. Debugging this thing is a real pain with page faults rolling in on the
Xsame trap. By running mgr with sdb and using (c)ontinue, I can get the screen
Xfilled with the pattern, get the 4 sample windows up and usable and be able
Xto move around and size/move/create windows. All this runs through about 20
XSIGSEGVs and (c)ontinue commands. Eventually I run into something that gets
Xand illegal instruction and I can't continue. It behaves almost the same way
Xeach time it's run, but page faulting going on with other processes can cause
Xan increase in SIGSEGVs within MGR. Other processes on the system do not seem
Xto be getting SIGSEGVs, only MGR.
X
XAs far as performance goes, I was VERY surprised. I expected this thing to
Xrun totally doggie-doo, but it runs much faster than expected. The copyright
XMGR takes about 2 seconds to make a full revolution. I called up Tim Lipetz
Xhere in Columbus and he ran it and it seemed to run a little under a second.
X
XMy intention, once I got rolling on this was to come up with something that
Xcan be posted to the net so that people can "test-drive" MGR to see if they
Xlike it. Once they do, I think they'll be hooked. This should end up in a
Xjump in vidpal kit sales for you (I don't know whether that's good or bad),
Xand it should get more people writing software.
X
XI would like to have you test the VidPalEmu routine on a known good working
Xcopy of MGR. If it seems to be working, try to cause more page faults on the
Xsystem (a few "compress -c /unix >/dev/null &" is my favorite).
X
XI noticed that the 3b1 kit is still very rough, even for the non end user.
XThere seem to be some things half implemented and some of the build stuff
Xis weird. I can understand the use of the BUILD scripts to speed up hacking,
Xbut a top level make should still do the right thing. A lot of the debug
Xcode does not have "#ifdef DEBUG".
X
XI just bumped into the port/rops stuff, and it seems to be having the same
Xproblems as mgr. The test_{rop,line,pixel} programs all work fine. I was also
Xjust playing around with MGR again, and it seemed to be stable once all the
Xparts I was using got paged in. Once a cron job came up and paged out some
Xof MGR, it started having trouble again. Hmm.
X
XOh well, the code is below, please let me know what you find out. If you don't
Xhave time to look at it, please pass me the names of some of the more active
XMGR hackers you're in touch with.
X
XThe driver source is below. The last_bad is only for debugging. It holds the
Xlast fault address to pass through. My reference material for the format of
Xthe 68010 BERR exception frame format is "MC68010/MC68012 16-/32-BIT VIRTUAL
XMEMORY MICROPROCESSORS", MAY 1985; ADI942R2.
X
XInstall thus:
Xas vpe.s
Xmv vpe.o /etc/lddrv
Xcd /etc/lddrv
X../masterupd -a char init release vpe
X./lddrv -av vpe
X
XSince the patch happens in the init routine, no /dev files need to be created,
X
X
XSome good kdb breakpoints: (3.51m)
X
Xbr 23E6 # a piece of code shared by two error routines which moves 11 (SIGSEGV)
X	# to a register to be passed on to cause a signal.
X
Xbr 23DE # part of a test to see if this is a bad access.
X
XSo what is this 3.52jmC kernel I'm hearing about? Drives 3 and 4?
X
XJohn
X-- 
XJohn Bly Milton IV, jbm@uncle.UUCP, n8emr!uncle!jbm@osu-cis.cis.ohio-state.edu
X(614) h:252-8544, w:785-1110; N8KSN, AMPR: 44.70.0.52; Don't FLAME, inform!
X---
X#! /bin/sh
X# This is a shell archive.  Remove anything before this line, then unpack
X# it by saving it into a file and typing "sh file".  To overwrite existing
X# files, type "sh file -c".  You can also feed this as standard input via
X# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
X# will see the following message at the end:
X#		"End of shell archive."
X# Contents:  vpe.s
X# Wrapped by jbm@uncle on Sat Mar  2 04:44:53 1991
XPATH=/bin:/usr/bin:/usr/ucb ; export PATH
Xif test -f 'vpe.s' -a "${1}" != "-c" ; then 
X  echo shar: Will not clobber existing file \"'vpe.s'\"
Xelse
Xecho shar: Extracting \"'vpe.s'\" \(1235 characters\)
Xsed "s/^X//" >'vpe.s' <<'END_OF_FILE'
XX	file	"vpe.s"
XX	data
XX	lcomm	berr_vect,4
XX      lcomm	last_bad,4
XX	even 2
XX	text
XX	global	vpeinit
XXvpeinit:
XX	mov.l	&8,%a0			# Get address of BERR trap vector
XX	mov.l	(%a0),berr_vect		# Save the current value
XX	mov.l	&hand,(%a0)		# Point the BERR trap vector to hand
XX	rts
XX
XX	set	S%1,4			# stack offset with a1 saved
XXhand:
XX	mov.l	%a5,-(%sp)		# save a5
XX	mov.l	10+S%1(%sp),%a5 	# set up a pointer to the fault address
XX	cmp.l	%a5,&0x428000		# was the access above video?
XX	blt.b	tvhi			# it was below the end
XXfail:
XX      mov.l	%a5,last_bad		# Save the current value
XX	mov.l	(%sp)+,%a5		# restore a5
XX	mov.l	berr_vect,-(%sp)	# push the addr of the orig trap hand
XX	rts				# and jump to it
XXtvhi:
XX	cmp.l	%a5,&0x420000		# was the access below video?
XX	blt.b	fail			# was below, pass to old trap hand
XX
XX	btst	&8,8+S%1(%sp)		# test the R/W* bit
XX	beq.b	write			# RW clear, access was write
XX	mov.w	(%a5),20+S%1(%sp)	# read video, write to the data inp
XX	br.b	leave
XXwrite:
XX	mov.w	16+S%1(%sp),(%a5)	# move data out buffer to video
XXleave:
XX	or.w	&0x8000,8+S%1(%sp)	# set RR to 1, suppress cycle re-run
XX	mov.l	(%sp)+,%a5		# restore a5
XX	rte
XX
XX	text
XX	global	vperelease
XXvperelease:
XX	mov.l	&8,%a0
XX	mov.l	berr_vect,(%a0)		# restore the old BERR handler
XX	rts
XX	data
XX	fpused	0
XX
XEND_OF_FILE
Xif test 1235 -ne `wc -c <'vpe.s'`; then
X    echo shar: \"'vpe.s'\" unpacked with wrong size!
Xfi
X# end of 'vpe.s'
Xfi
Xecho shar: End of shell archive.
Xexit 0
X--
XJohn Bly Milton IV, jbm@uncle.UUCP, n8emr!uncle!jbm@osu-cis.cis.ohio-state.edu
X(614) h:252-8544, w:785-1110; N8KSN, AMPR: 44.70.0.52; Don't FLAME, inform!
END_OF_FILE
if test 11454 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(472 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
XSHELL=/bin/sh
XCPP=cc -E
X
Xall: vpe.o
X
Xvpe.o: vpe.s
X	$(CPP) vpe.s > Tvpe.s
X	as Tvpe.s
X	mv Tvpe.o vpe.o
X	rm -f Tvpe.s
X
Xinstall: vpe.o
X	rm -f /etc/lddrv/vpe.o /etc/lddrv/vpe /etc/lddrv/ifile.vpe
X	cp vpe.o /etc/lddrv
X	if masterupd -c vpe; then :; else masterupd -a char init release vpe; fi
X	-cd /etc/lddrv; ./lddrv -dv vpe
X	cd /etc/lddrv; ./lddrv -av vpe
X	@echo "add the line \"vpe\" to /etc/lddrv/drivers if you want"
X
Xshar:
X	shar README Makefile vpe.s rops.Z.uue > vpe.shar
END_OF_FILE
if test 472 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'vpe.s' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'vpe.s'\"
else
echo shar: Extracting \"'vpe.s'\" \(1314 characters\)
sed "s/^X//" >'vpe.s' <<'END_OF_FILE'
X
X#include <sys/hardware.m>
X
X	file	"vpe.s"
X	data
X	lcomm	berr_vect,4
X #    lcomm	last_bad,4
X	even 2
X	text
X	global	vpeinit
Xvpeinit:
X	mov.l	&8,%a0			# Get address of BERR trap vector
X	mov.l	(%a0),berr_vect		# Save the current value
X	mov.l	&hand,(%a0)		# Point the BERR trap vector to hand
X	rts
X
X	set	S%1,4			# stack offset with a1 saved
Xhand:
X	mov.l	%a5,-(%sp)		# save a5
X	mov.l	10+S%1(%sp),%a5 	# set up a pointer to the fault address
X	cmp.l	%a5,&0x428000		# was the access above video?
X	blt.b	tvhi			# it was below the end
Xfail:
X #    mov.l	%a5,last_bad		# Save the current value
X	mov.l	(%sp)+,%a5		# restore a5
X	mov.l	berr_vect,-(%sp)	# push the addr of the orig trap hand
X	rts				# and jump to it
Xtvhi:
X	cmp.l	%a5,&0x420000		# was the access below video?
X	blt.b	fail			# was below, pass to old trap hand
X
X	btst	&8,8+S%1(%sp)		# test the R/W* bit
X	beq.b	write			# RW clear, access was write
X	mov.w	(%a5),20+S%1(%sp)	# read video, write to the data inp
X	br.b	leave
Xwrite:
X	mov.w	16+S%1(%sp),(%a5)	# move data out buffer to video
Xleave:
X	or.w	&0x8000,8+S%1(%sp)	# set RR to 1, suppress cycle re-run
X	mov.l	(%sp)+,%a5		# restore a5
X	clr.w	CSR_ADDR		# reset the fault status registers
X	rte
X
X	text
X	global	vperelease
Xvperelease:
X	mov.l	&8,%a0
X	mov.l	berr_vect,(%a0)		# restore the old BERR handler
X	rts
X	data
X	fpused	0
X
END_OF_FILE
if test 1314 -ne `wc -c <'vpe.s'`; then
    echo shar: \"'vpe.s'\" unpacked with wrong size!
fi
# end of 'vpe.s'
fi
if test -f 'rops.Z.uue' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rops.Z.uue'\"
else
echo shar: Extracting \"'rops.Z.uue'\" \(22451 characters\)
sed "s/^X//" >'rops.Z.uue' <<'END_OF_FILE'
Xbegin 644 rops.Z
XM'YV0`:0`('#BF0(8`!(J5,A!P(,`"Q9F`Y>0`*2$`A``T)B0(X`$"5W0*8.'
XMSD*/'@%,K+BPI4L`(%R0"4,GS$*0"7%6O`B`XLN?0%R(F3.G90*+'Y$"R/BS
XM:4)`+MBD$6/4`*:/5IUJW<JUJ]>O8,.*'4NVK-FS:-.J7<NVK=NW<./*G4NW
XMKMV[>,^^X($5DY-<`&(DQ/((Q),HCUQ@>H%DH!),9@#\X\=XXPAD`&!`(/!W
XM(P`>+P!T%HP'!M\`3H`XL?(/&1)W!/C](^>"UT<`1$8+8#4"V.V@MD$JZ8R`
XM&CT20.`,@.5JXYN$($"X`<#`!:2]MZV,'L`)RQ,X`5P`&@T`CW3J+E`-'$W`
XM2@L@_ZB=KZX>`7OW\*'-3T_]_OM_S,04'W/_0--&0@P(2(T4@/RGGPL%0N)*
XM?/]Q(R`T$E(('S8",C/%A,PH`<AS`/@R&@)JR/$`,(&P(!I@,:#HPH3<L&<+
XM-!-2@\*+@<DX(38VXAB?"CS&J(8,1#*`1#"2$.)"(#:24"2*2`+@P)*2%/*D
XMC29,>6226#H))8P$V.*"EU5>R:268P96YG_@S/@/."\<@(04+QCP0@$O$/#"
XM`"\(<"=Q`2#SQ#LP@2$9#DS`)ALY3GCA1!U.Q+%::Z]Q(!LW/)RI@1+-@1`9
XM`(`H`1A(0)R1D!5PK-@<!R+P<9LQ$,0(`!*`(`&,'``(\ZHP@*@*@`VM`O-J
XMK+/6JA&NNHI7[*NA80>2/=@AA,MVHAQ*W;,`P"HK2+3:RNRN*P;R7K>*XL:M
XMM[=9HX2MPL)@ZF_"F@`J3,)ZL*YXT@900;4`7`OC`*)`\<2]%+"1D`WSHBJL
XM!C,"0$&_,P`L<&`$&QR3Q-$TE^"9%!#1(!`2*V&$P@#(`(,!NG8,``0K$P$$
XM7PT#D&I"&L!@A`N(]#N$Q=@:?"\#*`-1\\T`0.QQOU,`/7#!!X<JK`(;,Q!)
XM<R14[3(%0GA\+P0H\W#TPQ%#T.\93F,,];T@3+TQ!%<#@`(WTTG0]<MLJQK`
XMIUBCC,/8.$=,0K][I!U#QD]L3$+<'P-`PM9WDW`O"BC3`'C2$:/0[R.&([XQ
XM"G%#0#<`*MR-@N(X2BS"="#(D`)U2T)B;GXD_GVJS?5N3$&&T/`+<K^C=)XM
XMHA\7&#<%*^N:.@JKP^2ZE;'/7B")EM^.M`G)`\.[>#J_@$"_R`BO+0.<N/&/
XM-%6G3D'S"#RO9#"R.UC[Y2;HOCT@+_S.5P(!M",^\1<Z7O92!P'V/4]-\:-=
XM0JI'KX1@CV7:FU#O`-&][^U/`!;X'W7*=S[P,$=BTP&``AA@!``$`&4RN!P(
XM=,:S_$E,6@+X@089`(=_."$?&Z$&.LZ#`!CL"`$M\Q@/?2C"(+ZL:P7B(0C0
XM,!`$[$@``(B`L)2@1"82@(A*(A<T`H$.0+!/!&D8R`&7M"4R>4(\/'P!!(B3
XM#0%XIXH#$0`3!_"R]#6'`E,`1!=%<"8&H",0LF/0F4#`%\G\0T6^HLXX4-$#
XM^&BC57RDCC3N.(5`""`0"GF`[$10R'_,*14]",(_.#0=!"QQ(%C4E8JVV,6R
XML<<3T!@9@*K6Q5A^,0K3<`>`BA`/C<#QBCO*XBJY"(@=Y<V$4#A/=*SHQ*5$
XM<8K*/"4P8:=%8C8/!&`4X^O45$8WG1$0RE0C&]V8.-9)4XX`H",$E$E$(`+#
XM95EC'1$58,33F=.*J:QF*YN#@E?&\C\!.A,):NE%UHD`E[IDQA%Z"9-[HC*8
XMJGP`*P%!)!B<R00"(-D#9'`F!P@@"`#09!`:^0]WF<\:)((`'"``B9.2E!KI
XM4H$23HHR#EBTI#)[Z4I;&A^26J,*2T@7`A#@#@`<X!_3B"84V!>+:(RJ?F>"
XMP`=10**A%I4`2*W:!TE05:("H`!(!8\O`!%""'C5`$B]*3:"83YM7.B&.>0`
XM)@X!@@,P2!.`6)>B-$!!"#H(5--+B!Y0L`0J+.&FVLAH0CCZ#VT8(0C"8%`0
XM:``,*C"AKE4``@VH(X2-'*A;0M!":$<KVM*2-@I"8$!G$:"P?Z!#"4(@D0)"
XM.P4A1.8?^E"K8E,&(6P\-K*`F"PP0%"`6%YCN`2(936`\:$"*>H?@MBK"K+W
XM5PD^)P#T(*QAX9"9#3"6&HLD*3.XBUC&6F.1O)(!`)00"&%9@+P4,*\X4"$`
XM0"3$D^DB`'?)"B!`2,$(0`!&6QGK6,A*EK*6Q:QF.>M9$W*`O-Z%$'@9"9_Q
XM9H8#\D4%?YGA7P!3%L+?#6^%R8MA"%ECOAONL&:!`6()BQA`),YPBO^[XA;'
XMY\46AD&)2XIB\W&8QA_N;H@I#.,+R]C'*@XR#")\8R+G>,<GUC"2@<QB(;O8
XMR3$V<8_[2V4;3UB\6>:QE+GL86"@5K4;49@_7AO;A*C`RS@.<Y1G7.;:WO:1
XM5FXRF(VLY3'_&,`"'B5C?6O@X%*6N,9%KG*9*T%%^0,!BL(`":B;'\!"X[K9
XM+>P2X(SES$!(&^9%;\K6V]Z$O#<S\>US?>_[C_SNU\>`ED*@0?WIWQZXLI<]
XM0&8WBV8$'"@`#\[SET?,9S%O.-9*9O*PBZSC(P,(V55>\I#WW.P^'SO`4DCV
XMM(E=;6/#&MO:OC*UH;QE9D";T^-VMKG!'6UEQ[G8<_XV,++=[FTSF]Q^AO:9
XM5ZMF-I/HS<)^=[?C_6QVVUDR>):VN+F-[VO/.]#8&+2M#3W<X@+BN"!(+B"6
XMVUQH.!K2`+"`!RA=($M?UQO:W73`.UU>$XM:O>QU+WPSO&I#NII4\AYPK0LM
XMW`3K>L&]_C4-5YYN:W\[W'IFN+K+C&ZE&[W@2%_VDY=>8Z([W=M0K_?"[TWU
XMJ`N\X4?7>M*Y_O1U4W;?:0:`/_`!6Q*AH.EDQ[K9F6M;R7`#[E,O.Z#-%_'>
XM3ERXB+ZXHC?.:.>JW0.*HH`+2`X-DR]%`2G'.WD_'6I4I)?4,D<US>UK\XJ\
XM&D`RD,!O@2",MB(VUH+0;#!\OFL&^]J$+)`\O,L=^M'3(!BR'SCM10]9U><>
XM[*#GO3!\;_6X$YP9M>_][7^O[N0/?_G%S[O<G4]\A8]=^L>G/O2M+W4Y[][V
XMP4`[:]6.C;8G)/;1][Z?M1^,@X^2^66G?NE'J5;4JS[P&-<XQQL-@'[(0U$2
XM(`&,YW@`X`DI!P.B%V`ZUUA_AV"YUGI!EQ`\@(!E1H$K9H&4A8'`H($<F(`9
XMZ(%FEEK\)AG(8'Y6HH'N9P\6"'$2QW.'9G'YMV@=]UQ>H"@1(`8#:%TFE&G;
XME7Z>UEB5=WDQ9VHSIVJ<AU^>AW/!%PN097JUAFVI=WNL!W2K]6O!QGU?UWP2
XMP(3;YVXL!WS(MX63A7L^J'OK)X9=:&_8MWM<2(98^(5:V(;P-WUHZ(9>6'1T
XM*(=E"(:AUX;BUV\F"'!OB(?95X?NEW!W>'6%R(3SAPWU!X7W!X.#MW^&]VB*
XM\@!<D(.!A5V15X:4YW*6-VI#&')%*&8UAX0#\7G,,&][!X0[!UP]]X!4V&#`
XM-H?'QXI5-XB*6&ZXZ'5P6':]*';=-WM^%HRVR(M=MH?J9HS*"(S)J(O&AXQE
XM]H=JYV]N=HS%2&6'B(T;AHLLZ'<N6'&)EG$RR'^6"``-8`6:>&DFA'*:EGN?
XM6%(OAWE$J'E&R&HWUXVRMH`%!HL.J&"\5H4F-'30N(;9Z(N$B(P(N8L'*8Q9
XMZ(P+&8T-R8T^-F\1:9#Z>)'JEY$AV&MJQG9M)C<4"2`627>W=7?-*'</QW<M
XMZ(_B*'CD2'@S>'B*L@!FL([/(0"0]XZ>Z(KR&(HP5VJD:(^F>(2MEH0;UH=!
XM\%M.R("0*(6R&)"TB'X%N9$^II2/E89;AY%7*899:8=J:)5+N)1C.))AR(1?
XM:998698IN8ADJ977)Y9G^99@N95RN9:W1XW^4'XA296)*)%)Z95CZ'[8H):"
XMV8B/.&]1&`SX-XF%YW']]W\?H00XF1!V<(`2,&L$UH"X!I"N]UD<0`/2()JD
XM.9JF69K4Z%HFJ`"BZ7ZYE9DL"8XNV9@Q28F0^0^&H"@((`R5R8D\694_2&L_
XM*81">6HPD&I%B8](^6W^I9FO>&M3*)6O5XMM66X`YE\:28S7AIT.^8MR=YWT
XM9I;@F9UFN)WA69WY!@3<*9[J>9[`69[,26]Z:8VDPY[<N8WH:9[?.$J<29OZ
XM]Y@?IR@&P`N]B0R=^)[Q>%Y`28]#>9R;IYRIJ(2KR(^<&9V?F1#\8);D"88;
XMJFX=6G8?*G<A>GPC6FXEZF=G)X)I]P\(8((FH*$F*1G>8);[26BS*8FU":!J
XM1P.*0@#B4)DZ>:!_F6,).H^C:)S(&66G>)01&IB/%5S.R8#A:*$1&`!^&9;:
XMV95/*ER&N:4GZJ1!0'%=&J9<FI]:2J9?>J9B:J;!YZ7=F9!GZ*9ZR9<D<J5V
XMF:5MBJ8Q^GYL&H9;6J/]B:/_.9/^IR@"8`R]Z8X]B*`^J:#$F7D.>H^=UZ13
XM%J7]")U1>:$!0)!#*I?KV:>?^IY@&*J=BJ<_EJ9<AJJG^J8,.6.JRIUZ"9)N
XM9Y;W67?_@)*BJF[-&9O\&8[^68Z5B'@)80V5"0",<("?EE&>M)E3FJD1"``L
XM0`.R\0_2ZDG52JW3>JW:FJW3FIITBB#7ZG[XH%OP\0\M>6N_*I/\]P]PD"XX
XMH"*P$`A4D1G0``0PL`,BY`3[```&H`3\\#+EP`;E@`_GX`_J0`#K0`_N``'N
XM``SP8`SRP`STP`OV@`WW``;Y8`;[``3]P`7_P`1P51SB4%=YA`F`H`F'H%<?
XMX0N3UZB+)"P3Z%?Y`0*:A@)(@%B[Q:S^"$Z""JS0<%LPM4",9U@X2S*\):4[
XMFZZV>5O8H"@)0`<M*YP**BQ8P'@T:U@V2UX3@*61*G<J9JD-R+/C.*@2=%NX
XMD"X^,+0J!P-;>V5?2Z$N*+8P2;8%<EO.H)O.$+651[566[-(H+5<FZ36B6U@
XM&[=*^YAFB[9J"[A7%FN%F[0]JZYU*QEWNQ%O%YQ[NRI]B[5_FQEM&Y=$>7RM
XM*)R7:FAR&X.2^[.2H0OI$K.ZXB"+^KD3-KHZ>V"GZY@==UN0>0"&H+>@*"Q:
XML+E+D+6>&[A:.'KSIPVG]Y2!<+BY*QFVD"[V*K,%$KM#)G]-Z5C,Z[QE*QG,
XM(*"X6J2H`+/":[,K"+>0.[8^"[3I0@-J>[X^6;J3=;LY^KRC)*!<X+L_R;?4
XMJQ]^R[B@V[5NF;S+JYB:U;R1N[22<;8)D;;]:[U7II0$_(0&3`,(K+ZI:[>*
XM4@"VH+]3.QCEV[EL:[S.2+O/:;K<.[G_P,``X,"OFQ\0W&3>B+ZVF\*J^P^5
XM6P`JA;F_J[G]>[7#*\*R*W""FXV/6\,)C+BKV[J+6[Q7MI+Q&[8VK+L]Z@8>
XM_+()$;P__+].',!%')AHV82-5<!2$(47/+?K"[W2V\0C',&'F;WV9\%3[+V*
XM,@#$<,7CFQ`Z$,((>,0HG,3V:PWIHC(/?%BP&<6&"\C=VUAU+,+BR[\OG$1<
XMW,9>3'6[BLCIB\89O,"*6\@`/+OMZ<?S.\<X;*BB@,?"0@4A_,E$O(PT_,<8
XMK,#_P`OILL>>W,43)LHT0+]T>\/28*CZQ</[F\6KC,NM''^\!Z6O/,J*K,+1
XMFQ#3&\G0$,,3EGRI-\%.6<%GC+JR_+TFI`6H[,/2#,3$2\G#*,#E=LFD*\7-
XM?,.L*X%L/,0:MH^8C,2QK,2&%S#A_!E\G*SE6KNPK,FR'+0`X+Z%7+3+>L+,
XM?,_VV[0)\:X/$*_S"@/U>J_YNJ_]^J\08`\N8`^N<`]4<`_Z@`^<D`]&D`_&
XMH`]LL`\2L`^TP`]>P`_:T`^`X`\>X`_(\`]J$++4(`YSA;(JJP`XV+]%NU@*
XM?6@_)YV@25I,;5JEE9KT.5M:X)KD:M2]>J,,O<B0H"@*D#-$+0&`L`4FC+3H
XMFM07"@!,@(!A78%@+=87V-9LO=9O+=<?2-<;"-=S[=8IZI$+;((P@]>4Y7[T
XMH-9N#:B^VLZW905..]32O&2.N\Q(#8$"B=:.S6Z579*736^9G8$;`&V;O8&=
XM;=FA79*IB0M^_=F"G=F&C=4"C<^*O1&JP'B7#=G#9=;/.H&AS=D5F-N@O=N^
XM?8&\7=E[/8*M88(.(-Q[JH*CS:LVBJZ(+1ELH)L]]-6`M@6Z7-N2W6"4G8#`
XML`4?6-W?'6#>?=?@3=[B'=[=C=[CO8+C7=JGS=WCG=KPO=K.G=4J_-H'``6R
XMS=VT[9FWW8%L'>!O+>#A7>`=2=PE&)+'#8(I"+]]=]7UW=KV&]W\Z@K[+0,;
XM,`L*6,\4Y]^3G=82@.$:_H$B_M8E3N(9;N(ICN(C?M<G[N(K?N`K:MHA^=<O
XM+M\E3M\=_MS_\-H%H()?W=UC+;^1/8NOM]U"_M9)_H%+?M=-WL=Z[>11#N5L
XMW>3N7>-4OF+RG>0Z#G@\[N,N#`P.`N77[>':/8&9N=YISN1JGMY2SN9P_N8R
XM/G[%K>!0'MBVJH)IWN4O:-\W3.$$P`D7GN)#WI^V/=F9&.*$KN(:SM8E[NB+
XMSN)``.F-SNB3;NG3J*)TC@HF*("*7NEX?EOR@("/ON$/WMP[[N>W!01U[`S[
XM7>:'KMVA>9JT7IJB"=6KV9JV^II\_I+<C,^44,>J3-2AK<X`#7BQ?N1I7>R:
XMS>RZW9[/SIV5+>W.WMO0;NVPJNFM1>,I->WTEMK,WNND_-H"(.C$#NO9?>2A
XMN0TTP.[NWN[P[NZX'I*LN0U4O0'BSN/!OA0BL-_7:=W]G>R?!>+_'MYA;?!J
XM7O#F??`+G_#JZ?`,?^7=GH`,+]__GN^J+AFO'0!JL-]AC>Y&_EEHSO"$7==J
XM3O)M;?(J?]<1K^TD:-PEG]R$C?$2OL@4#@#((-O^G-!DW>$"?W[;:JW<*O1$
XMCZU%[ZTFR`#A:JOCVEO*:JZR&>&_;K]^X*[P*J\)0='VBJ\*H*_\ZJ\O4P^*
XM8`\(8`_`<`]X@`\:@`_2D`]TH`\LH`_DL`^&P`]4P`_.T`^&X`]JAPO_H`4\
XM[=.'`-2N@B[I!`W%.EW^;-5$[NNXNZZ_G$[*4*PL0-B%?MA^_ER0.0",0/FJ
XMW=_MK/EU[`2)/]L<[N69+QF1/P`"V+\$6/GS#?JI;W@"0`VES]^GW^<U;WCG
XM8ZB8X/F?ON'KC/F[?YN0*0!:+,VOG^5E'OJ2<?PVY?HZ2#ID+OO%_UR1'P#@
XM4*R+%_R7S]I3OZZ5&P"@4*PHT,?6'_Z\'[0!<)/2'UC0ZNW-/_N0&0#G__[L
XM*#=+-O_7+QD$[0[`[^*EO\?'^R`3`(`%M^_C#<#Z!?G2!1TH?3L/ZO4\U-?_
XM>M]#NWH3K:)Q/:^7T5X&/]`46(`?6`)^0`WZ`03H!TZ@'RB"?H`,_($!\`="
XMP!\(`G_`"_R!/J!6A^0?N(+`ESWR"!KA#&9DT9"C0R`RC(G4@`X]$"KP+'\"
XMDXK+(6`0(H-(J"R^4JP&BZ8I:D>K\5&IR<8!FIH7?&HN3S71.]JRZZK:T4)U
XM%%#]W:;HDC2F"_[#-$**:XFO1U6/T!E],4KY:,I\/TQEYJ;3%2I5\(G,Y")`
XM.*J>$2'458:0:Q5"I@.J$N&="H1_9A`J0D3("'-5V4DR<PX0A21!=`@OH3:R
XM58AH$GK"5G3J`E7J.T>2IC?QH+4%".>@*"I.I4A)X<'E5'"@V/!S25N0%OU!
XM4?B=V`U[*DF_T#UUPEX(#/O4N3&&OA`9%D-+2`SED\M;,X$H&(8ZA!,,:9X:
XM#%`A9^2\P784!Q^A*PQ*D*J(+:D\6`MI6RZ<3IR*%XHN2?@(P5`E'(;K4%6]
XM0W4XN.0A.PQ@[O`>GK-\.-S2SMHQ09>+&<;#/86KX.'@LH8$$#+9M,2S>+9A
XMD/I-K=!E+:@C%0OGRSBDA7ZJ]V`S[57!5H^S$DA6:DP]G[J$#X^7\B&)^]`D
XMCD216'T,8IPZB2P1+J5$9`9^8F+X>8;?"EK91,+$$A&3WWE*C,GY%2H`$("*
XME0&Z@KCO%O+!G\?/0!"`&W!0T<`]Q7Y(YQ(<B5AP=2;/.;ASE>HJ8`V*(HQ-
XMS%4:'>2;%E5$E%I&"A:&+HLX"RG56-J(<<PC]D$K9)CTD$!D0VSI+IXAN^@2
XMP5A>[(M=B2_2P[WX%P>C7Y2)#RD/C:'Y%`W[E%*Z/?A)+_I%G\B?@*(-PX:8
XM2!5VPP#V#1D4DGI0DRJ8Z:,]2''.(5WL4\Q(,E8D1U@22Y@^3(RWB#7.1)4D
XM&V&C-'J-WBDVSL-VN(RH#&/<A#3J$]Z9X$@*N6(:3(C8,!TEJLUXSCHC15R+
XM=Q!"B<;5>-U,XT`*CJIJ&0)&DB0,#>-JS([=D3=")%8%F+XC>>1*W)$J?B2`
XMB!T)8G!$B`PP6-4D]Z?\=-!#-(MR4"+2P08E#MOB=!Q+3&F,4;`RIGJL8TAT
XMC((),>9&O)B6$&084Y!PRB\V2-4((`NC>%2,$W([SJ4,Z1TK9%["B2;(3K5&
XM##F8;%5A<I!DB3+Z%LLH%"53`J!,VQ``7":D6!T_HJRS=;6.ULT[V:+K;@NO
XM8VZFL`+FIHW`F[9A662%^1$M3D2U:`<OHEM<-\;NJ'6FGT>=*"24#(\C<AV2
XMJ@YY)>WAEKR06A)+SL8PZ27%I&U,3]F.KT%#X(@,:]5P;)/TK!02OVNH=D#.
XM@"I0S%'@.$<FV1^EHRJJD7,10\&H0=FG5)6A/(]RZ5#"J-34HD+2BRJ4>VI&
XMH48@.2>1XX[J43_*(>XD_.@-]>,K#(>@$17]QXRHS'+?E$QWOT9$CLGOHZ?&
XMU)JRDLGG56K(6%FF8&4RJY6S\E:J*EJY*W5E)B0_(=)5"A>>B"#_%*4$?Y9R
XM*!ZJY0@1DV00^I1UL$^&1E44)2?@/Z*2Z1!,IC,SN2#]S)?,DMOR57'+"#EE
XMQ*6Y1)2F*DV.H'\8D@*BAG23=H=6Q4GCJ/OHY$(<5L7J6%W!"'CLKB6J!'I#
XMS^@)S*`W,+M5&,R)2F]:B2MRQ?/08+VTE.S*ZD4TK$>OMMY%^WH:+6`-K()U
XML!+6PFI8#RMB3:R*=;$RUL;J6!]+4?B!20-!?"`X`8+>1`@FET.01XK@>CF"
XM`$`;Z@J725R8(,9Q@E$0`*BL!,"RA-D'XV=;C'-AP7[)R])8?&A?[VOQ94%V
XMEO'NUT>`6D83BP&`JI4T@Q@K8SE?3`\*/Z9)REA8F(-=:TN>O:W<US0W62G;
XM"'DK:^:QK5G,S-DQ:X:ZK&W*,K,9SX;,8V.;I*QR.9%]IHZZ9CF39]0F;)9#
XMP,GCWAG2E&;4;)&0QH56_*B84>E=<A-XU4W$R6T49T8</G!Q>_&X9V8S^J8;
XM0UYP3'1636]F`,*71"1?AO-F)46RR>,(FD&#G(9L<NXR4N;0#$#^RIP@+'9^
XMS<09A\28\AJ09JQL=C+<^34E6.K49H%S@W4PX$DWA:<Q`YN]47?J37S&-V^9
XMW40%,XQQ5LT<ML-:SC`#`(5SG$TRSLEL/*<MI)U5TW&Z+K%8O=+FD'F?1VU[
XMVB_(1`"L&/5,?O33?W&NX=DYBV>`/)[9C$#*L=&YQKRG/%M+H1-Z\CAO9L?V
XMF2U3GTKSD"G%@*8&;XL@6RSO2X/"S\J)<!K9/N.:&-1K7D_BJ7="&633GXNL
XM>S+/ZPF>\F;T7`JGC'H.NQ1Z.$F82GJAI(R6Z3'3*<.`*(^+?`(@F)G/HPE`
XM'00Y$V(^M!`92_%)0O\!Z8QF`31RH@)K1GJ>IP+=9@GQMGBS``#.J&?Z#*!/
XME("V3T1H0QLG$W.@0Z9:$CD8JL(,("[89_/3B?HMA"8!YR@ILYU1L[$\O1':
XM026#0P,`$$VB93T->#$[X$;K:!\MI(VTDG;24MI*:VDO+:;-M)IVTW*:&E`4
XM<R!3[DPEF'&8X'(9@C;SF.3,)(A&"H#/%$=$D*((S<+'`;A:6!QS4K-?8K>0
XMEQ"ZH%/[@J%E1R8$J4;5G)[1HI>.+S[>L*TF0KQ:8\-K($^I)0009]<L7UZ+
XM:U,.L+&\;%I-M:G$2PA_S:[)-[D&'WM98EMLLFVTT;,-BNS^)653I\\.L\%3
XM:R=//=L\_6R?[9N^#-1FJP:;.BVG3O.U(8#81NQTYRZ5IOPLN"G4W_;L&JJU
XM<ZBIR2HFA./&VQK<<A,T4:\K%M)_0.&&BK\3;]'TK!&\\V;>W!Q[4V\HM:0Z
XM/),*W]1C7\-R+75/#;;8AU$AG$8-HQI/4>2WCQI2_YM3_*D$SKQ)1:"Z8B(J
XMS&-P6A'WR4EDJ4QO"X4S`!;NJ^6X@.=.0=R+(W4Q#JNV.*UJZ22=5X5Q+4Z?
XMVK@8A^-2'$!UFSX.R#U3+D=5>2F2RZ9/+LU5.;A*5^>J72VJ89#;@=,L-PW_
XMP4QEJS758293<YI3O\K9S`_5SU0&RJ;(4AMKFWNL<>[.R3FC:N?6G,S;<\=2
XMZN%4CMJCS-TS+74]%=%Q54IWZ20=:3VMF"ZUFE:\RM?^`:<+29ZNU/754>?]
XM3!TR)66L+IVXNB#75A'JK,.1P%4:"%,1TB,EPX\,K$%RH^Z[`;!#`ZC\ZZTB
XMU=M%NV8WGK`==;UVTM6Z3E>7NL).6[4#=S4TL][4IEI8RUTZ#:TW\MVIUWC7
XM[H9KO;MW9U66[3L!T.^HV\-#K\K.`J$\A:=?(9Y_17@`MN%Q5[VZ3RE>?.NG
XM_36^NC9%P?$\'L!3K$QQY)V\";OR8IZ%37G;E+M*U!.$81M<6U.P$RY=Y#RB
XMQB^EY&*-5@&38*K8@(GT0E+"]"0+TY@VS.2Z6:O>!9R8&=!B=CV,!O8@@-@C
XM>V8/[:D]MN?VX)[<HWMV#^_I/;[G#_R>%E`4:,`?L-*7:4H532PU@O@B(>A,
XMYD)*76D0;(+0()9*05I:QQ!?C%1\@O28FECG9P$'P.2+D;"/G"[`7B;ZTDGG
XM@[.?3[&RV<U'^LZLZ6.G#U.98K\ZUOKJ(_R#?=6-_]%)VF?[_.SL7+.S#XG^
XM/CP;_!0MQ#Q^370L'EKF-V=]5IT5`-'/T.:_Z8)9]6RD9;#;+T9V/]#::5/7
XM<QE_Y2]&GC\1"FDK(/NCCP%T^86[5FN;ZJS],W_[C]?JJ*>9$``@I16`IK8"
XM&D`$Z&@58+)=M)$/`#Q`/UMBK>5@];2J3V(JTHIIT78LQO2`(%`$DD`3B`)5
XM(`MT@3!0!M)`&X@#Y8`.5!1D@!60+$"P:+#!(5"E5.,`)!IMD++(+``(`3<K
XM1IH"PE(%TIHQM6IH4`0H@2J@!&0`.(FP(&#API9D(G&%`,5EN!8WXF+<BSMQ
XM-6['K;@<U^)2UJOH<2UN@\NE"DWA,ER'6W`O8V$%`8C*(<[(EKL$@$IZ@1D2
XM)AR`$E$2()A`P;VY-\4:@(-4(`A\C"#X+V+,$?U$`^9Q84#SHI)\@&;9W)2!
XM<^.#S@TEL\3G,@&@:V*&;M$%$$?WL33=YE5SEP#7M;H[-^O^7*H;=+VNT46Z
XM8U?JFEVVFW/3;L]=NS*@Z@I=HOMVQ:[$=;IR]^Q2@ZO+<T&`UCV[>_?K,H.P
XM&P3B;MD5O(17[6Y=NEM2W"[8A;M_E^Q.W;Q[4P:OW36\>%?O6M[%BWD9+N!]
XMO)37\V+=NSMY.6_7Y;N7U^^:7LT[=UTOVEV]H+?UBE[82WIE+V4*!'H)$9@@
XM&Q!X4V_D9;V(=_0RWK'K?IQ!\;6]JI?GXK']B`%R;_)-!>0E`)##2"C*5&[#
XM!00M5R@.20]P6$N.?9RYEP7U0M_C:WTI;^*%-09&1=J?N`MUGV_5C;Z2]_HJ
XM7EOC>#?O_66_A]?]CE[^FWGM;^<%P*&W[?)>`CQ[#7#=Q;T!V/:^WV=C8/IO
XM[?V_GS<"[][]6X$+L/K%P!`X`;]>#AQ9+##DS<`BN/(NX`[<@#_P`4;!NE<!
XMDV`I,':#[_!UP+>W\&I@&0Q_2W#F;;XX&/\2*4\)#A-"]=W!KS?[;M^_R4Z]
XM+\N]+.)746P`6P"DP`#!3;_^]P6'X!@\@GLPWTE,!)+^_LL3$H01,!=6P1S8
XM!!M?&*Q_X:\:7K]L6`"OX#<,@G5P"I[`YJ;Q>N`L_(#M\!G&P[[W]/+A')Q_
XMY7`:WL,76`O[X39,@>FP(B[$$G@`Z^'9JY<P@0FB`64X#D?B.?R#;97_&L1"
XM>/I"2P!PA._PT%7"&'%R.F'P"X537S_@!(HB`Q`!(*4O:2XH-L.,F!FLH"#0
XMY59QH`P`C"`3;^%<O(M]L0ONPY!X`_N88BQQ':XP7L2&>!ESMR!@C&^Q)E;&
XM`((9KUQP<HP),?*-QMEX&E?C1(R,O_$F5KS:^/L^XV3,@\,QH*'&S9@;6^-A
XM#(YUL3B.QWH)#Y@@'+".S3$VML?O>!6[GP#1C4.QW*2^[7<3H^(GB;T$9`)-
XM/6,W_+KB=A5R3$&Q4@97>"MF5'B\C1<K%_"XR0?P-F/>(Y)7+DEN7B/YL93D
XMAGN207)+3LE!8"6'9.`;!E\KB9``+EDE!P+W0UM5<3R6R!50!BB*"O!F16U.
XM0K_]."'_8P2DX7IQ//[%4;<@X^)ZS)2!P#@^P?3X'$MC#7>5UW!67LH2@"L_
XM9:E\C=NQ/1;+'9DL?V6S7)6[,AQ>RUTX'*-E=:R6H;%6ELM6>2S/8[L,EN>R
XMP[7!(8GXUF5V')?/<E[>QD!X,`]A)8F0D;`*7LBCTGDZ9(X8AC,O4*:3>D]1
XM3``A`*20LF)6RF8YL@1(I5L9F6X!KK^?V3'C8=$\B7]O4E;-HY<U.^)R#)H+
XMLVQ&Q%B9+X?FTNN:4[,IYKVWN07O9<*,AGU,<.[-P]D?[^9`3'MS,W%>S;S9
XMZ0)F$B&8DW-M+LX`XC@[W<2<G$5Q$2;%UWGO0N8_26.Z[T]NQ?TO,[\,75"%
XMK_!K_LV*-[+(7T@DAGDI&?;-?S@VTV#<[)5ULVW>S\*9''OC\*R?9_.`ALW`
XM&4`C9P$MA`ET@C;0#1I!QV<%+8@9]%2^R\S`!P=HYZR<_W,-?H:6."1A8OR<
XMBS7T[W4_G]A"VUWOS*!*<7[&OIE!^V)$_#D!5_%E3I:P&'K08O=,HJER6+YT
XM3KDC4\E@W*,Q=%4&,&ZY#C_GT7ND#S-=MLX2>BM?NB3]B#LT=C;,2%HOJVBX
XM?*6;-)6FS5$:+V?IM`REX;.4'M-/>DO[YR[]H]'T7WZ&^C@D\>,BW9>G=#P>
XMR/V818\B%WU]Q[.$@J!>%");9O2,F2GR`B"H1CDAB(*,?,B6JF3QQ1#W[TJ"
XMICNI)36EOM26.E.;7DDP<B<JI?:PYGD;WVA!*QF>K`A1J[GV_/+H,OVB.?#1
XMG<^FN0&C9E:=BQ_+T870%_H?VVH*W9S[\Y)>P;>:/[_E-0V(@T"PWM"^VDH7
XMZV.]H#FT@W;5O/H]MVKXRZPKM+,.TWFX6M-D-2E\`[.TKM7&FE=S9S7-;/:D
XML.#3<MA/ZZ=E9J,)=;(<D@C`#0`I);"JR;6RCLU?>.E69ED]AC\RG3;+N+HL
XM%^:`S:7Q,,$FUJ/W8/]JQ:NP[S7O;=C/VL=`;&S]H=6D35XLW[H>,U];A3X4
XMLYX62NA:(<?H[1NJO^^HIK/]1Q8(J$*;J@.+`*C%6-A>1VQW#`2N6;XNS?O:
XM-0_IC&VD$Y"@1M;#>F%+8P#SLYMULI[9`+EF`X&);:9I=M&VUD<;6UN@I]VK
XM@[;#1L<^>VD+:R5]M8>VTF;:T]II:VU*#*?W,<\&RT1[;)]H6T60N_-!'L4A
XM>_>J:S7%B]GU>7:Y_8`B#X!IFZ@%@!6NN3'[6C=MT@NK<S;@I9)LX&R;96VM
XMN`LSX_[7CCM:0^XK_;AI=3VNW#(;6V-NP1VV22_8SL7:NA)?XL9-N<6U)\[3
XM;_L[QVT%/+>Y3,E^PG@[1P<``5"L<$%&EK$2,.$^9:9X6?XN+_`D3?=W_X/@
XM#;Q]=_$VO<*;>`]OX[V\D;<G$:O*.[556_G5KEWN/R`"VI9B:KUNRP%[K#<@
XM!=^`"X0#<D`.V(`Y\`;I@`^H`RS`#L#!.T`#\4`;T`,\4`]8P#V@!?H``O"#
XM"0$"%,40,"4'((_4VWN+,Q-$`*>W@H??JJP'(`N*5?D[N&?P[T!J=\H#2F[(
XMO>`6/(.#7`V^<3NUE;#@)S?-,CX)_I39+!>X1#:@-QD`!"0"RBX@B`+%<2-/
XM<+<:C"5N"P<J,B`",-Z5?,.70`[?X2B9X?;P'XYT>7C9)>(ZV>,.<1U>Q(.X
XM$ECB0%R)'W$FGL1M^!0'XJDI3I.(ZFO%<3@5C\D[V5:Q`Q;NPF'XV$RY)?P4
XMV@-%X0"V;'791`9`[FJ&O^FH@\L,1Z@U7(A/<5MCQ+TX'W?B2_R/2W$_;F#Z
XMN`^/`(*\BQ_R1*['"7ED,>0Y_(]G<1/$Q1OY(B_D8?RVL`,Y#@&8\+'SQ<[/
XM'ZQQ=+3"8R0\X.0QW*9R9'7,%*.N(H_D8'R07W)(CLAC^2NOY;2\BEMR6)[+
XM;?DNQ^7;FKAU:Q)A`60Y+\_DDL$=H/(S7J/3>`5D`(J"`5P1([G"$U`/-S-!
XMFI6[T\YGS<NNF5G%%NB:1P%PWLV!RC>/Q^'<FX]S=%[.E\`YW\;IW)RO<WC>
XMSM_Y]XWG[GR>?]])'I(P`#ZWYP[7_8SQ>AX%7C<=58BC7`&,\1A)##2R*K_C
XM9^TCPV29_))-LBYGR1=])N=D7X[1.?I,3DT7FRAN].ULJWHR,Z?>SGS1X@"N
XM9@%4.!GWXDU9O*YR9\P4N?D2]\L41`+<="?M<%_Z(<?I/CV'`W6=/L6'^DXG
XMYT>=G2?U;<S/MWA0CP`X7:`_]9A^^D"Y&M=-4I::^W0SD\IUMY#>YL8\`K!F
XM6C[6`?D4+^MA':W?<K7^R]GZ$S_K33RM-_&F;H3ENDZ6ZD1=GOODCAS*1_D!
XM,`?%"AYL]8(NTR'ZLW+E;5T*D'7%;M:]^"-O[(?\L<OUQ4[9(7L.?^RI:9B;
XMFLF.S/\!`,SK^=R@6V]HSJ_(06^R*:!=J`/IPKZ[W:F@2^U0W4[3\YWNIG,Z
XM;>?IMKVHR_9[#MLK'5+7[;5]JN_VGM[;A_L+#X-HP`3EC.)>V]V/.A#N>UT=
XMAW)P(#V+U6O/YC2=@F/J3;W=*5.EYNZ:VKM3:@_N`#YU4A7M;!8,;+#IEJ@#
XM0!PONW/<A2)7GF/8)UL>?^N$_.CV<OUNV6LY?P_KNWJ_,W8`'ZX%O($/YBM*
XMB]?U6Q[@._LFA^^=7+XWX91N*45Y'1/L,1(9<'+L_G#=J42WY#`@$LCR$#_B
XM1;PB)_$GWL2#>!6/WP\+B^_A(1ZD=[H2SY,WO-WFZ[./1Z63EJ[5V_D+Y_"+
XME9LCZ3).SH<\4'GA1=XJ$WEV;N27`))G\DK^R.MSXM[DGSP]K_)3/J=C^55,
XMUTDQ/K?RWQ>O8WGT?M5-2%9/U`!`L(/V'\_:O[I;1>PMGHC3\O]^R^G\+[?S
XM<9Z)S_D!7^?Y_)UG[)G=!!7S/D_2;\MG[^%LOJI3>%+]#T@[`.`'Q:J!XV[C
XM6-^U6^]VWLV;,B5OYJV\.SVG__28'GHS;^F=9GD>2L?Q%5`)9.\<R[UYK$:#
XM!SH`'K`#>4``Y@$'H`<>H![8`'O``.X!"<`'/"`?^`"5M@\T`#^0`?V``?@#
XM$O`/3("BD`'CJF624I@9`P@`+*&9"/R46H0K>S.S+$R8LCTS"!Z"<50`((&8
XMG:7&PO`!W&(U<`&W&:3TK=VM5O`-3N\W+@?_N/:^WD]<\@["M2+*;>:BVETS
XM^M<&<SMSO>;<H!OI%FZJ#95)-QY>OEN[2B-MB`^TN?;$C\Y5V^)K;HSO\)4O
XMQY_<#__C6VX,3?&-MM6^^,QY.B^,CL][2WZAIURH>XFFQ7/MH%LW][WQ)EO@
XMHVSU3'X-/N!F^3-XX:OMPSV&H_+(U]4LV.1K_,'-@)6^Q,?631]JGWRHG_2E
XM_M+OW%$_XS]]IE_UM3Z8YOHFVNIO?:S?]57^L`#Z/=ATVZV8;Z[K.H*V^9X<
XMC0=\O#TDIW![_OD@7Q(+_?HL3>_ST3?+S!GM-^*(__7)_N>NQX$_[W/BBC_V
XMP?7AQ]")_^\7YI0/HD>WXC_$LQ=%LWTBW*)K_LA.Q2>=A,]]H9BC9?&.QON2
XMGTV_8R"_LR^_UP8&,UT>9^[!G8Z=L>NGV;#_2Q]HVG^/R?3L[]RU7_8C?!\=
XMD+7T\._9Q=_W'W^T'6!B?SXVV[<_:>?^.\VV-S]CAMN>'P;(:(8L?+KH9)Z_
XM@QIO4V0+8)%C)$9V]TH5WKMYA/KA.SI%S^@5W?T[<8T^T>=__/_H-7G&UW^>
XM#+\F_.B??4(9`$"4^7RVV.]'C/UHK%_1)_@99KI?A,;[X70+8%MF_$5M#R!N
XM%P'^:`U@KL:688`3X-17`6:``AN;AM.9?=69`>BC176VBO/EL:5NG=_;]_EQ
XM?XQ(H#;T!0(G&[:EGFUF!&#@1@%V;JS9WG>:*8#1GW;F]>U^/*#(9P)B:$+@
XM`I@$!H%&X/*WG+5F8E_A5Z(U@3O@%$CY<6LW&!/(G(UK'-K'1O.Y@-H?R5:>
XMX7RP6Q2VGMU]!:`3^)_Y@/R:?9:X,8&/WS\6]@V!#F`1&`?N9G>@AT;X$8%3
XM8!YXI<V!2B"O)KJ):('@QJ:[6'_/DNJ6_6U_HQ*-=NKE?+$;&Q=P]6TPVP58
XMZ22`]AF1EOKA85Y:!WCU'8"^G2?8^)V`QITE6`I&?YV@\E<%DH*UG2G8"J*"
XM;1IN]_S)::X@;H>GK8`RWY+T!?YF-A^@]OW19^&?4&2H(6HM6_ZSJ*%_F"!"
XM->^!=\R@>!?>P0#?G3/8#$*#_)ZD!JJ1@:R8]6:J*0"HVAO'C@@`GMDF*(F]
XM:C?;BA2KZ6Q`H#@(K$ENZB"TY@<N:^S@$8CT;6ZK(.07KKV#XV`\J`9>:;L:
XM/K@.5FSKDF9W]D5__6`GMO;A@FT?>`8&,H*J2'BEZ/U_Z1F\)J\Y1/0:ZB</
XMAF;E(/C7!O9]_EH[*+'M@75@+N8/,FP@H08XL)6$(:#!AA(6;`G;2HBP/6PN
XMH=`V2V1>>DE()P,L@(:@ZH,(@B*-&2_X`C:"V&`-Z&JE;"O;Z9<&UH/,G\U&
XM?^AK#%_KYQ&*;2.AU\;PP8)I6U0(%<:$7=M5R/A)@<3?UX85(FU3VPQX`5:%
XM-&'91@M2A5YAYE?](82<WYZV"&Y?M))!)Q3V6OV'WL:W%8,YR=]V%'J`G1LY
XMN!3B;$WA&/8&/H6>VU>X\5F%A>%6R`=>;OH@4KBX-89\8<*'&-*#D2%C"!#Z
XM0R$:];``:FN:'UMX_2F""^'V)4>)?I`@Z<=@T6XQDNWF[DUZ,ER\AU!=>IK>
XM\18;9GHPP*:'Z7EZMR&H-QN*>I@>J9=8_#-R7VDX^V!O-]:VM;UM0*[>R_"]
XMA6_C6_EVOJ5OZUO[]K[%;_-;_7:_Y6_[V_!F@]P_H]0/Y$]@>S*3N9=*X4PK
XM!`312GV'`EP3)![*4@M<`Q<C/7"C1,[2&JY_9\TRB._=AQF7OI<?YGO\X;X7
XM!FU8Y1W(%<+]AB,<?;?HH6S_P`D74J1P/1ZB9\8E@V?-?0?%Q75]WD4W(5J(
XM5QR%^.=AB%Y<%%<A<G07(AC7Y55R>1X0A]<YB-&=,];7L7%NG*;%CKAWRQP4
XM4\?%?D$>@2?9,7B8G(WHY^5YC!R/F"/BB#?B+]<C!G*8W(BH([Y\_\"#!U3$
XM=XX@::@BEGD-0"F'YIUR$%Y7YR1V>&\>@=?+;8G]'8<XRW6)(.(>%R82<M)9
XM&"00#GI"(ACG?BAS56+H9R"B>HL6:2?-N70$'83XK`AY45X^E^2)<WNB.M<G
XMRG-_HIX(Y?&)@Z*?6"@"BOA8&*3@>7D$G4`FQOUSA-U#*-V5>0I=L=+0I7_S
XMH3;G5K5_])]%Y]'=?Z`B_"<J?HHZF8P'6XUTG9U)1^950"N=",'CM7?5W$YG
XM)]IWPMUO!]/A=K6B4J?;V8H_':Y8W/&*JAVP&-MQ>8HB)9<K(F:/8G&W*MI+
XMHQP"<.;AA29$K*C.68EOHJ:(Q]EU8V)DIR'F>6[=$M<MPG5>XF6W+7J+XR*X
XM*"(6B_T<MH@D#G3B7(IXT#D:?AU@9\H-=K.B=@/GD8N5'6>G+ZYU.R*^V-\%
XMB=PBH&<F"GJ<W9I(+V*#HYV`8MH92:C=;5<O'CFOW6TG+(:"LQUPYRM*C+KB
XMK1C<,7<7H\4X,1IWJ4ER%Y(L=Q@CLGA;/'<<X[)8X5%W7P45%B-==VV>M5@?
XM=G?0(,T8#=:,S^#-R*G]A\:->7=;Z#DJ(Z.GWGT5[!VT"".VB9?,C%CI'3D2
XMHIB(YQ&)3Z/3V"]*C0<>@1<UYG=3(]98)K96BR*)"#4R=@+=,C<:5HM/8O]C
XMX:43&!Z:I^%!>`_C9]'^P7@O'GP7-RZ)<Z.+5^+=C2E>B6<JWF0T7DEGXTF*
XM9>.BI>,-`*^BT5C-C7DQ8W9'PWUY61[C&"B">51>G@@Y:GF28^/HXUF.6]ZA
XMZ.1E>2.BXTC]:7*,8]"(LIV-`<"SZ`V2"&J>@]@V)@3W8H:XY[V._=W5>,C)
XMCG)>[)@USHX"8VMU)H9U_)W!N.9%BO[?I/C,I0N07HPDZ<6'P.%#YQJ*5+CA
XM;-@\UH:R(?1(&]J&SB/SQAO.AK[A(!4<!HX0DZI7'&IOC)2WY4C!>K(>K6?K
XMX7JZ'J_GZP%[PAZQ9^PA>\H>L^?L%5N7@])0(,`07X#P8#"(6'(`'!"OJ`J"
XM@"<00E`!<@`,\#\"`,V`+Q!"2`Z`@!E@`(0L"``)(`=(%8&``QFR[`"\@!P`
XM`AR0FP`Z\%R(`G(`$!"O6)`X!`(@`L`#<@`4<$`*`EB`'``&C)`/9`EY0CX7
XM?@`#P'D<0*K".Z`#A!`H@`VI$#20,>1&$/?XD`D!)*`J,`)D`!$)`(`"JD(O
XMH./]`TJ`$@D,D)`;P0U`"BB1T("J<`F(`$HD.$!%(@!6I!()#VB1"L!S<6JD
XM"P)`HZ`IW"J1PJ10*5P*^,!KL!`@$?Q`_1@Q6!`?P0"`"^B/!X/U("RH`+7!
XM4R`T!0"A`1S@)\Q2T<+^,``<`QH$!0`'2`#BP78@!(``0$`+@`1,!J,"`A`)
XM(`/I@B$@'4P&(8#Y\*\0`)\D/P`"V`:=14,Q&0@!3(0I(4JRDB)$*1D#\`$"
XM`#1`'<B2?$``P`5\<*+D+&E"X`U^),8F2L(`3(0#P#.4DL0D=>`]E))JA+0P
XM`-`#&L0Z(4JBD2```M`H+`1M)*7`&O`#<J1"<#E8`('D4=``"`_>P;V``&22
XM-42Z<%F4$@P`$P%%0`#H)$,(`,@!`P"PD"_\$K%`47%.>FJEA'6P'2`!=^0_
XMR5V@D=>D0I!-PI&O`0$@&=21P63($4X2`!L`.9DX]!'J@P'Q.KP/\0J)0`$,
XM$1!%!$$=G`L;9521.F``%B7T$`QDE`G!1EE*$!%7@D<)`9P+&(`'<4>$$#1$
XM`/!!8`!5Q2:9+G@"CV0D.3`(`<@!"*``9)(Z94+@2982)``DP%%N!-#`=.``
XMU``D@RNY$<P33251!%6*$#7`=&`!4`=99=+`2VX$)8`5,1#P$#4`$P$!`),-
XM1&8``Z@!5@+/L%8JDST$6ZD`>`]OY?>`1QX%F@-?8"U@"]K"1ND]+@759*.@
XM4$X&!R5K0`\DE%@%V]%0@I/!`0$@0^B5`0.VX!WTE./!3QE4#I4=0<25+L`#
XM0@!;B0!TEEBE4VDE=)4*P+;@:8@0PX0(``"8`XD`"!``I!<=Q9,0&K`'U(!W
XM("5\#?D""=`<K!/T%0`@#K26X0'^$%4X`;H``&`*>`?I@@O@`@@"DB0E20(@
XM`J,"!.`"*`+_9%$I(RV70L`I\`)(`-L!'F`P*`?`@"3@7CR42X!$60(H`0-!
XM#2`KO).7`T<A"+R5#@!=R58R`/*E"%%?VI72`@$@!V@07!PU:4W"!HEE8>E:
XM))0\0))(`B"5?00((`!,`8*`B$`B4`+DA00`#B`"BL4_H"L@"PF``(`+*`M+
XM`<E@80(#X0`B8`,(39F!W0`$(`%`0(5Y87X+&B:'J6("`RBF$``$X``D)@(B
XM8Z*8X``2\&)BF"VFK?!BA@-(0(P)!.@`-:8$L&.RF!NFC^EA`@)#`"`@,A0!
XM9<9S808(E@4F.W!06@I6`'3P+1``F(`(@`6``"0E`%`.!`+10#``!@@`+P`(
XM$`7D-/R`$Q`)M)%!0*60%\R9=&:=:6?>F7AFGJEG[IE\IEI``DP!;T`=(`>,
XM`66`#@`"O`!T0!L`![P`;<`9(`?,`8/F"P!IC@$OP!L@!D@%=,`+(`4,`4V#
XM&)`&))IA`!S@`J`!+(`=``*0`"2`%%`&V`%IP!R0!KP!;H"A20.X`#>AE+`0
XM$`%%@!!0!1P!`,`+0`:LFB^`&'`'T`%WP!N`$-0!<T`8<`84FB!`"3`'@`!M
XM0!K@!GP!KJ8>4`9`FV$`'D!MI@'6)@@P!@2:;@`=4%HJ!']FH#EH%IH)0;DI
XM:!*:AB:BJ6@RFH[FI"EI1IJ6)J:I:7*:P>:GV0:$FJ-FJ7EJIIJK9JOY:L::
XM(,"L66NV!`5`PED`*``,IP+P`#R<#\%"$`!(G!+G`W``+``#0`-0`/`/#H`!
XMH``(`-*<1N`&O`$@P*3Y!>R;<``+4'*6`70`'2!MG@$@P!L`!S2;9$`+X`.4
XM`&1`:2ES]@`XI\HY!["<+J<;`'.:G"BGS>D$%%Q,0&DY!$@%<("A>0=,("``
XM"H!SI@!*)]-I:*(!4*?42090G0#`TID&-)T@@+9)!LP!=$#6.756G5^GH9D'
XM?`%C9]D)`T2=9V?7:76&G=3FH&EV;IUH)]BY=DZ:=R?7Z76"G7=`&O!K@@!T
XMP!M`<GJ:,*<9\`9HD),FW%ESWIQXI]R9=BX1:<`9@`80GH8G"(!XB@J+9\DY
XM:#J>-F?<^7<ZG8+GM5EX'IZ5)^>I0;:=)V>H"7I"GG[GW(D&5)Z7Y^FI>::>
XMBN?J27:VGC.GUAEZ1IZC)^5I><:<&F3@.7A6<#&`X\D"Q)U)@!M@!X0!4@$9
XM``*0`6F`'%`&C`$N)ZQI:,(`>$`)@`>4ENKFN=EN)IJ+9J/Y:$::\F:]^6G>
XMFYVFOLEODIJF)JJI:K*:KJ;V67#2FJ?F4Q!@@`"@`!@`#K`44`#B`PO``?``
XM`H`((`$&"BJ`!J`#&``F@`5@`S@`+I#V$`"$`!%`#)``I``90`Y0`)0`%4`-
XMT`"T`!U`#S``C``3P`RP`*P`&\`.<`"<`!?`*?`"?``_(``(`D*`,"`"B`)B
XM@#@@`4@"4H`T(`/(`G*`/*``*`)*@#*@`J@":H`ZH`%H`EJ`-J`#Z`)Z@#Y@
XM`!@"1H`Q8`*8`F:`.6`!6`)6@#5@`]@"=H`]X``X`DZ`,S`CN`'N@`?@"7@!
XMWH`/X`OX`?Y``!`(!`'!0`@0"H0!X4`$$`E$`=%`#!`+Q`'Q0`*0""0!R4`*
XMD`JD`>E`!I`)9`'90`Z0"^0!^4`!4`@4`<5`"5`*E`'E0`50"50!U4`-4`O4
XM`?5``]`(-`'-0`O0"K0![4`'T`ET`=U`#]`+]`']P``P"`P!P\`(,`J,`>/`
XM!#`)3`'3P`PP"\P!\\`"L`@L`<O`"K`*K`'KP`:P"6P!V\`.L`OL`?O``7`(
XM'`''P`EP"IP!Y\`%<`E<`=?`#7`+W`'WP`/P"#P!S\`+\`J\`>_`!_`)?`'?
XMP`_P"_P!_X"G20=\`3)G&1!K2IUS`-<9'0@!20`5,`7L,=VG><`$/`%'`#_J
XMCP*DWJ>AV034%@BI0,J0<I_>9VD9'3P!+L`2X`*</]TG&X`'4)V.9]A)<[X.
XM\BC;60:0G7+`&Y`'Z`"E94@Z!EB?-$&A*9&"`$,`2SH22)\])\Y)<RZ?.2<`
XM$))"GVS`&S`&H*0ZZ:?Y!?"D/BD*D`(8FF(`N#D3R`%Y``@`?5:>;D`;8(_2
X?`2!`&2`'E*1RP$L:DY8!+2E-2@;@I#>I3:IU<IT)`0%Y
X`
Xend
END_OF_FILE
if test 22451 -ne `wc -c <'rops.Z.uue'`; then
    echo shar: \"'rops.Z.uue'\" unpacked with wrong size!
fi
# end of 'rops.Z.uue'
fi
echo shar: End of shell archive.
exit 0
-- 
John Bly Milton IV, jbm@uncle.UUCP, n8emr!uncle!jbm@osu-cis.cis.ohio-state.edu
(614) h:252-8544, w:785-1110; N8KSN, AMPR: 44.70.0.52; Don't FLAME, inform!
-- 
David H. Brierley
Home: dave@galaxia.newport.ri.us; Work: dhb@quahog.ssd.ray.com
Send comp.sources.3b1 submissions to comp-sources-3b1@galaxia.newport.ri.us
%% Can I be excused, my brain is full. **