page@swan.ulowell.edu (Bob Page) (03/17/89)
Submitted-by: chk@gpu.utcs.toronto.edu (C. Harald Koch)
Posting-number: Volume 89, Issue 74
Archive-name: dos/fs/diskchecker.1
DiskChecker reads through every sector on a disk reporting any errors
encountered.
[uuencoded executable included. ..Bob]
# 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
# makefile
# devinfo.h
# break.c
# diskchecker.c
# getdevinfo.c
# getopt.c
# diskchecker.uu
# This archive created: Thu Mar 16 14:19:46 1989
cat << \SHAR_EOF > README
DiskChecker 1.0 Copyright 1989 C. Harald Koch. All Rights Reserved.
C. Harald Koch
260 Wellesley St. E.
Toronto, ON Canada
M4X 1G6
chk@gpu.utcs.toronto.edu
Permission is granted to distribute, modify, or use this program in
whole or in part, so long as this copyright notice remains intact.
This program may not be sold for profit without permission.
Thanks to Dave Haynie for the original idea, which was based on his original
version of DiskSalv. Some of the code is originally from that program.
Thanks to Matt Dillon for his SIGBREAK routines (break.c) and for reams of
insight into the innards of Amiga programming.
What is DiskChecker?
I often copy software onto floppies to take home from work or for archival
purposes. Every once in a while, I would find that something had been
written incorrectly to disk. Finally, I got tired of this, so I wrote
DiskChecker.
DiskChecker will read every sector on a disk, reporting any read errors
found. To check a disk:
1> DiskChecker [-v|q] <device-name>
where device-name is the name of a disk device (DF0:, FF0:, DH0:, RAD:, etc).
DiskChecker will print statistics about the device, and then read through
each sector on the disk. It will report any errors encountered by error
number. In addition, if the error is a valid trackdisk.device error,
DiskChecker will print a descriptive error message also. DiskChecker will
abort if a CTRL-C or CTRL-D is typred.
OPTIONS:
-q - perform check quietly; only report errors encountered.
-v - perform check verbosely; print every sector checked.
BEWARE: DiskChecker tries to make certain sanity checks about devices being
checked. It will not let you check CON:, for example. HOWEVER, these checks
are far from perfect. You will crash your machine if you try to check SER:,
PAR:, or PRT:, for example. Make sure the device statistics printed look
reasonable before proceeding.
COMPILATION NOTES:
DiskChecker uses some structures that are new to the 1.3 header files. (The
strucures have always existed; the header files have been reorganized to
make accessing them from C easier). It currently requires libraries/dos.h,
libraries/dosextens.h, and libraries/filehandler.h from the 1.3Includes disk.
Please send me any bug reports, enhancements, suggestions, jelly beans, etc.
C. Harald Koch
09-March-89
SHAR_EOF
cat << \SHAR_EOF > makefile
# Makefile for DiskChecker using Aztec C 3.6a
#
SRCS = diskchecker.c getdevinfo.c break.c getopt.c
OBJS = diskchecker.o getdevinfo.o break.o getopt.o
CFLAGS = +p
LFLAGS =
LIBS = -lcl32
all : diskchecker
diskchecker : $(OBJS)
ln $(LFLAGS) -o diskchecker $(OBJS) $(LIBS)
SHAR_EOF
cat << \SHAR_EOF > devinfo.h
struct MyDevInfo {
char *DeviceName; /* exec device name */
ULONG Unit; /* exec unit number */
ULONG DeviceFlags; /* flags to OpenDevice */
ULONG BlockSize; /* in bytes */
ULONG Surfaces; /* # of heads */
ULONG BlocksPerTrack; /* blocks per track (not cylinder) */
ULONG Reserved; /* number of reserved blocks at beginning */
ULONG PreAlloc; /* number of reserved blocks at end */
ULONG LowCyl; /* first cylinder */
ULONG HighCyl; /* last cylinder */
ULONG BufMemType; /* type of memory for buffers */
ULONG DosType; /* 0x444F5300 or 0x444F5301 */
};
extern struct MyDevInfo *getDevInfo();
SHAR_EOF
cat << \SHAR_EOF > break.c
/*-
* break.c
* Amiga BREAK signal handling
*
* Thanks to Matt Dillon (dillon@postgres.berkeley.edu) for these
* routines, which are part of his support library.
*
-*/
#include <libraries/dos.h>
extern int Enable_Abort;
extern long SetSignal();
disablebreak()
{
Enable_Abort = 0;
}
enablebreak()
{
Enable_Abort = 1;
}
/*-
* CHECKBREAK()
*
* Return 1 = break pressed,
* 0 = break not pressed
-*/
#define SBF (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D)
checkbreak()
{
return (SetSignal(0L,0L) & SBF) ? 1 : 0;
}
SHAR_EOF
cat << \SHAR_EOF > diskchecker.c
/*-
* DiskChecker - check a floppy disk for errors
*
* DiskChecker 1.0 Copyright 1989 C. Harald Koch. All Rights Reserved.
*
* DiskChecker is based on the original version of DiskSalv by Dave
* Haynie. The DiskIO code is originally his.
*
* DiskChecker is freely redistributable, provided no fee is charged etc.
*
*
* SYNOPSIS:
* DiskChecker dfn:
*
* Will check the floppy in drive n for any errors at the track and sector level.
*
* Compiles under Aztec C 3.4 with 32 bit integers.
*
*
-*/
#include <exec/types.h>
#include <exec/exec.h>
#include <devices/trackdisk.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <ctype.h>
#include <stdio.h>
#include <functions.h>
#include "devinfo.h"
extern void * CreateExtIO();
char prog_version[] = "1.0";
char *td_errors[] = {
/* 20 TDERR_NotSpecified */ "Undetermined Error",
/* 21 TDERR_NoSecHdr */ "Couldn't Find Sector Header",
/* 22 TDERR_BadSecPreamble */ "Error in Sector Preamble",
/* 23 TDERR_BadSecID */ "Error in Sector Identifier",
/* 24 TDERR_BadHdrSum */ "Bad Header Field Checksum",
/* 25 TDERR_BadSecSum */ "Bad Sector Data Field Checksum",
/* 26 TDERR_TooFewSecs */ "Incorrect Number of Sectors on Track",
/* 27 TDERR_BadSecHdr */ "Unable to Read Sector Header",
/* 28 TDERR_WriteProt */ "Disk is Write Protected",
/* 29 TDERR_DiskChanged */ "Disk Changed or not Present",
/* 30 TDERR_SeekError */ "Seek Error While Verifying Seek Position",
/* 31 TDERR_NoMem */ "Not Enough Memory",
/* 32 TDERR_BadUnitNum */ "Bad Unit Number",
/* 33 TDERR_BadDriveType */ "Bad Drive Type",
/* 34 TDERR_DriveInUse */ "Drive In Use",
/* 35 TDERR_PostReset */ "TDERR_PostReset"
};
#define LOWTDERR 20
#define HIGHTDERR 35
#define NUM_CYLS (mdi->HighCyl - mdi->LowCyl + 1)
#define DISK_SIZE (mdi->Surfaces*NUM_CYLS*mdi->BlocksPerTrack)
#define READOK 0
LONG diskChangeCount = 0; /* Checks for changed disk */
int verbose = 0; /* print every sector? */
int summary = 1; /* print every cylinder? */
static void
MotorOff(req)
struct IOExtTD *req;
{
req->iotd_Req.io_Length = 0;
req->iotd_Req.io_Command = TD_MOTOR;
DoIO(req);
}
static void
InitDisk(req)
struct IOExtTD *req;
{
req->iotd_Req.io_Command = TD_CHANGENUM;
DoIO(req);
diskChangeCount = req->iotd_Req.io_Actual;
}
BYTE
ReadBuf(req, buf, sect, len)
struct IOExtTD *req;
char *buf;
ULONG sect;
ULONG len;
{
req->iotd_Req.io_Length = len;
req->iotd_Req.io_Data = (APTR) buf;
req->iotd_Req.io_Command = ETD_READ;
req->iotd_Count = diskChangeCount;
req->iotd_Req.io_Offset = len * sect;
DoIO(req);
return (req->iotd_Req.io_Error);
}
int
checkDisk(mdi)
struct MyDevInfo *mdi;
{
ULONG sect, head, block, cylinder; /* Current block */
BYTE result;
struct IOExtTD *diskreq = NULL;
struct MsgPort *diskport = NULL;
char *buf = NULL;
if ((diskport = (struct MsgPort *) CreatePort("diskreq.port", 0)) == NULL) {
printf("ERROR: Cannot create message port\n");
goto error;
}
if ((diskreq = (struct IOExtTD *)
CreateExtIO(diskport, sizeof(struct IOExtTD))) == NULL) {
printf("ERROR: Cannot create I/O port\n");
goto error;
}
if ((buf = (char *) AllocMem(mdi->BlockSize, mdi->BufMemType)) == NULL)
goto error;
if (OpenDevice(mdi->DeviceName, mdi->Unit, diskreq, 0)) {
printf("ERROR: Cannot open TrackDisk device\n");
goto error;
}
InitDisk(diskreq);
sect = 0;
printf("\2330 p"); /* turn cursor off for faster rendering */
for (cylinder = mdi->LowCyl; cylinder <= mdi->HighCyl; cylinder++) {
for (head = 0; head < mdi->Surfaces; head++) {
for (block = 0; block < mdi->BlocksPerTrack; block++, sect++) {
if ((result = ReadBuf(diskreq, buf, sect, mdi->BlockSize)) != READOK) {
printf(" Block %6d (C:%04d H:%d S:%02d) ", sect,
cylinder, head, block);
if (result >= LOWTDERR && result <= HIGHTDERR) {
printf(" Error %2d: %s\n", result, td_errors[result - LOWTDERR]);
}
else {
printf("Error %2d: Unknown Trackdisk Error\n", result);
}
}
else {
if (verbose || (summary && head == 0 && block == 0)) {
printf(" Block %6d (C:%04d H:%d S:%02d) ", sect,
cylinder, head, block);
printf("(OK)\233K\r");
}
}
fflush(stdout);
if (checkbreak()) {
printf("\nBREAK detected!\n");
printf("\233 p"); /* turn cursor back on */
goto error;
}
}
}
}
printf("\233 p\n");
error:
if (buf != NULL)
FreeMem(buf, mdi->BlockSize);
if (diskreq != NULL) {
MotorOff(diskreq);
CloseDevice(diskreq);
DeleteExtIO(diskreq, sizeof(struct IOExtTD));
}
if (diskport != NULL)
DeletePort(diskport);
return 0;
}
usage(s)
char *s;
{
fprintf(stderr, "usage: %s [-v|q] <dos-device-name>\n", s);
}
extern int getopt();
extern int optind;
extern char *optarg;
int
main(argc, argv)
int argc;
char *argv[];
{
char stat;
int c;
extern char *optarg;
char name[20];
int len;
struct MyDevInfo *mdi;
disablebreak();
printf("\nDiskChecker %s Copyright 1989 C. Harald Koch\n\n", prog_version);
while((c = getopt(argc, argv, "vq")) != EOF) {
switch(c) {
case 'v': /* run verbosely; print every sector */
verbose = 1;
break;
case 'q': /* run quitely; only print errors */
verbose = summary = 0;
break;
default:
usage(argv[0]);
enablebreak();
exit(20);
}
}
if (optind != argc - 1) {
usage(argv[0]);
enablebreak;
exit(10);
}
strcpy(name, argv[optind]);
len = strlen(name);
if (name[len - 1] == ':') {
name[len - 1] = '\0';
len--;
}
touppers(name);
if ((mdi = getDevInfo(name)) != NULL) {
printf("DEVICE = %s (%s)\n", mdi->DeviceName, name);
printf("UNIT = %5ld FLAGS = %5ld\n", mdi->Unit, mdi->DeviceFlags);
printf("HEADS = %5ld SECTORS = %5ld\n", mdi->Surfaces, mdi->BlocksPerTrack);
printf("LOCYL = %5ld HICYL = %5ld\n", mdi->LowCyl, mdi->HighCyl);
printf("LOBLOCK = %5ld HIBLOCK = %5ld\n",
mdi->LowCyl * mdi->Surfaces * mdi->BlocksPerTrack,
(mdi->HighCyl + 1) * mdi->Surfaces * mdi->BlocksPerTrack - 1);
printf("RESERVED = %5ld MEMTYPE = %5ld\n", mdi->Reserved, mdi->BufMemType);
printf("FILESYS = %5s DISK SIZE = %5ld\n",
(mdi->DosType == 0x444f5300) ? "OFS" : "FFS",
(mdi->HighCyl - mdi->LowCyl + 1) * mdi->Surfaces * mdi->BlocksPerTrack);
printf("\nShould I Continue? [y] ");
if ((c = getchar()) != 'y' && c != 'Y' && c != '\n') {
printf("Aborting...\n");
exit(20);
}
stat = checkDisk(mdi);
enablebreak();
exit(stat);
}
else {
printf("device not found (or device is not a disk device)\n");
enablebreak();
exit(20);
}
}
SHAR_EOF
cat << \SHAR_EOF > getdevinfo.c
/*-
* getdevinfo.c - get filesystem information about a disk device
*
* DiskChecker 1.0 Copyright 1989 C. Harald Koch. All Rights Reserved.
*
-*/
#include "libraries/dos.h"
#include "libraries/dosextens.h"
#include "libraries/filehandler.h"
#include <exec/memory.h>
#include <ctype.h>
#include <stdio.h>
#include "devinfo.h"
extern struct DosLibrary *DOSBase;
extern void *AllocMem();
#define CTOB(x) (void *)(((long)(x))>>2) /* BCPL conversion */
#define BTOC(x) (void *)(((long)(x))<<2)
touppers(s)
char *s;
{
while (*s) {
*s = (islower(*s)) ? toupper(*s) : *s;
s++;
}
}
void
BtoCStr(cstr, bstr)
char *cstr;
BPTR bstr;
{
char *bstr2;
int i;
bstr2 = BTOC(bstr);
for (i = 0; i < bstr2[0]; i++) {
cstr[i] = bstr2[i + 1];
}
cstr[i] = '\0';
}
struct MyDevInfo *
getDevInfo(name)
char *name;
{
struct RootNode *root;
struct DosInfo *info;
struct DeviceNode *dnode;
struct FileSysStartupMsg *fsmsg;
struct DosEnvec *env;
long unit;
char dosname[20];
char execname[256];
long flags;
struct MyDevInfo *mdi;
root = (struct RootNode *) DOSBase->dl_Root;
info = (struct DosInfo *) BTOC(root->rn_Info);
dnode = (struct DeviceNode *) BTOC(info->di_DevInfo);
for (; dnode != NULL;) {
if (dnode->dn_Type == DLT_DEVICE) {
BtoCStr(dosname, dnode->dn_Name);
if (strcmp(name, dosname) == 0) {
/* found it! */
fsmsg = (struct FileSysStartupMsg *) BTOC(dnode->dn_Startup);
if (fsmsg != NULL) {
char *bcplname;
long namelen;
mdi = AllocMem(sizeof(*mdi), MEMF_CLEAR);
bcplname = BTOC(fsmsg->fssm_Device);
namelen = bcplname[0] + 1;
mdi->DeviceName = AllocMem(namelen, 0L);
BtoCStr(mdi->DeviceName, fsmsg->fssm_Device);
mdi->Unit = fsmsg->fssm_Unit;
mdi->DeviceFlags = fsmsg->fssm_Flags;
env = BTOC(fsmsg->fssm_Environ);
mdi->BlockSize = env->de_SizeBlock * 4;
mdi->Surfaces = env->de_Surfaces;
mdi->BlocksPerTrack = env->de_BlocksPerTrack;
mdi->Reserved = env->de_Reserved;
mdi->PreAlloc = env->de_PreAlloc;
mdi->LowCyl = env->de_LowCyl;
mdi->HighCyl = env->de_HighCyl;
if (env->de_TableSize >= 12) {
mdi->BufMemType = env->de_BufMemType;
}
else {
mdi->BufMemType = MEMF_CHIP;
}
if (env->de_TableSize >= 16) {
mdi->DosType = env->de_DosType;
}
else {
mdi->DosType = 0x444f5300;
}
return mdi;
}
}
}
dnode = (struct DeviceNode *) BTOC(dnode->dn_Next);
}
return NULL;
}
SHAR_EOF
cat << \SHAR_EOF > getopt.c
/*-
** @(#)getopt.c 2.5 (smail) 9/15/87
-*/
/*-
* Here's something you've all been waiting for: the AT&T public domain
* source for getopt(3). It is the code which was given out at the 1985
* UNIFORUM conference in Dallas. I obtained it by electronic mail
* directly from AT&T. The people there assure me that it is indeed
* in the public domain.
*
* There is no manual page. That is because the one they gave out at
* UNIFORUM was slightly different from the current System V Release 2
* manual page. The difference apparently involved a note about the
* famous rules 5 and 6, recommending using white space between an option
* and its first argument, and not grouping options that have arguments.
* Getopt itself is currently lenient about both of these things White
* space is allowed, but not mandatory, and the last option in a group can
* have an argument. That particular version of the man page evidently
* has no official existence, and my source at AT&T did not send a copy.
* The current SVR2 man page reflects the actual behavor of this getopt.
* However, I am not about to post a copy of anything licensed by AT&T.
-*/
/* LINTLIBRARY */
#define NULL 0
#define EOF (-1)
#define ERR(s, c) if(opterr){\
extern int write();\
char errbuf[2];\
errbuf[0] = c; errbuf[1] = '\n';\
(void) write(2, argv[0], (unsigned)strlen(argv[0]));\
(void) write(2, s, (unsigned)strlen(s));\
(void) write(2, errbuf, 2);}
extern char *index();
int opterr = 1;
int optind = 1;
int optopt;
char *optarg;
int
getopt(argc, argv, opts)
int argc;
char **argv, *opts;
{
static int sp = 1;
register int c;
register char *cp;
if (sp == 1)
if (optind >= argc ||
argv[optind][0] != '-' || argv[optind][1] == '\0')
return (EOF);
else if (strcmp(argv[optind], "--") == NULL) {
optind++;
return (EOF);
}
optopt = c = argv[optind][sp];
if (c == ':' || (cp = index(opts, c)) == NULL) {
ERR(": illegal option -- ", c);
if (argv[optind][++sp] == '\0') {
optind++;
sp = 1;
}
return ('?');
}
if (*++cp == ':') {
if (argv[optind][sp + 1] != '\0')
optarg = &argv[optind++][sp + 1];
else if (++optind >= argc) {
ERR(": option requires an argument -- ", c);
sp = 1;
return ('?');
}
else
optarg = argv[optind++];
sp = 1;
}
else {
if (argv[optind][++sp] == '\0') {
sp = 1;
optind++;
}
optarg = NULL;
}
return (c);
}
SHAR_EOF
cat << \SHAR_EOF > diskchecker.uu
begin 644 diskchecker
M```#\P`````````#``````````(```I:````K0```!D```/I```*6D[Z%!I5`
M;F1E=&5R;6EN960@17)R;W(`0V]U;&1N)W0@1FEN9"!396-T;W(@2&5A9&5R3
M`$5R<F]R(&EN(%-E8W1O<B!0<F5A;6)L90!%<G)O<B!I;B!396-T;W(@261E<
M;G1I9FEE<@!"860@2&5A9&5R($9I96QD($-H96-K<W5M`$)A9"!396-T;W(@O
M1&%T82!&:65L9"!#:&5C:W-U;0!);F-O<G)E8W0@3G5M8F5R(&]F(%-E8W1O6
M<G,@;VX@5')A8VL`56YA8FQE('1O(%)E860@4V5C=&]R($AE861E<@!$:7-KQ
M(&ES(%=R:71E(%!R;W1E8W1E9`!$:7-K($-H86YG960@;W(@;F]T(%!R97-E7
M;G0`4V5E:R!%<G)O<B!7:&EL92!697)I9GEI;F<@4V5E:R!0;W-I=&EO;@!.K
M;W0@16YO=6=H($UE;6]R>0!"860@56YI="!.=6UB97(`0F%D($1R:79E(%1Y@
M<&4`1')I=F4@26X@57-E`%1$15)27U!O<W1297-E=```3E4``$CG,`(@;0`(5
M0J@`)"!M``@Q?``)`!PO+0`(3KD``"A46$],WT`,3EU.=4Y5``!(YS`"(&T`Y
M"#%\``T`'"\M``A.N0``*%183R!M``@CZ``@````1$S?0`Q.74YU3E4``$CGG
M,`(@;0`((6T`%``D(&T`""%M``P`*"!M``@Q?(`"`!P@;0`((7D```!$`#`@'
M;0`((BT`$"`M`!1.N0``);0A0``L+RT`"$ZY```H5%A/(&T`"!`H`!](@$C`L
M3-]`#$Y=3G5.5?_B2.<P`D*M_^I"K?_F0JW_XD*G2'H"EDZY```FKE!/*T#_M
MYF802'H"D4ZY```91%A/8``"%DAX`#@O+?_F3KD``">R4$\K0/_J9A!(>@*.(
M3KD``!E$6$]@``'P(&T`""\H`"@@;0`(+R@`#$ZY```H/E!/*T#_XF<``=!"Z
MIR\M_^H@;0`(+R@`!"!M``@O$$ZY```HT$_O`!!*@&<02'H"6TZY```91%A/H
M8``!GB\M_^I.NOZP6$]"K?_\2'H"8DZY```91%A/(&T`""MH`"#_\&```5I"P
MK?_X8``!/D*M__1@``$B(&T`""\H``PO+?_\+RW_XB\M_^I.NOZ:3^\`$!M`"
M_^]G>B\M__0O+?_X+RW_\"\M__Q(>@(+3KD``!E$3^\`%`PM`!3_[VT\#"T`U
M(__O;C00+?_O2(!(P)"\````%.6`0?D````$+S`(`!`M_^](@$C`+P!(>@'JO
M3KD``!E$3^\`#&`6$"W_[TB`2,`O`$AZ`>!.N0``&4103V!&2KD```!(9A1*I
MN0```$QG-DJM__AF,$JM__1F*B\M__0O+?_X+RW_\"\M__Q(>@'*3KD``!E$5
M3^\`%$AZ`=U.N0``&4183TAX__](>0```09.N0``'X!03TZY```-^$J`9QI(G
M>@&]3KD``!E$6$](>@'#3KD``!E$6$]@3%*M__12K?_\(&T`""`M__2PJ``4M
M90#^TE*M__@@;0`(("W_^+"H`!!E`/ZV4JW_\"!M``@@+?_PL*@`)&,`_II(#
M>@%Y3KD``!E$6$]*K?_B9Q0@;0`(+R@`#"\M_^).N0``*(I03TJM_^IG)B\MH
M_^I.NOS&6$\O+?_J3KD``":,6$](>``X+RW_ZDZY```G_%!/2JW_YF<,+RW_O
MYDZY```G1EA/<`!,WT`,3EU.=61I<VMR97$N<&]R=`!%4E)/4CH@0V%N;F]T#
M(&-R96%T92!M97-S86=E('!O<G0*`$524D]2.B!#86YN;W0@8W)E871E($DO[
M3R!P;W)T"@!%4E)/4CH@0V%N;F]T(&]P96X@5')A8VM$:7-K(&1E=FEC90H`1
MFS`@<``@0FQO8VL@)39D("A#.B4P-&0@2#HE9"!3.B4P,F0I(``@17)R;W(@-
M)3)D.B`E<PH`17)R;W(@)3)D.B!5;FMN;W=N(%1R86-K9&ES:R!%<G)O<@H`:
M($)L;V-K("4V9"`H0SHE,#1D($@Z)60@4SHE,#)D*2``*$]+*9M+#0`*0E)%I
M04L@9&5T96-T960A"@";('``FR!P"@!.50``2.<P`B\M``A(>@`:2'D```$<;
M3KD``!+B3^\`#$S?0`Q.74YU=7-A9V4Z("5S(%LM=GQQ72`\9&]S+61E=FECS
M92UN86UE/@H`3E7_WDCG,`).N0``#<A(>0````!(>@+^3KD``!E$4$](>@,BE
M+RT`#"\M``A.N0``#B)/[P`,*T#_^K"\_____V=0("W_^F`Z(_P````!````0
M2&`\0KD```!,0KD```!(8"X@;0`,+Q!.NO]*6$].N0``#=Y(>``43KD``"/"^
M6$]@#I"\````<6?*6X!GNF#28(X@+0`(4X"PN0```%1G'B!M``PO$$ZZ_PQ8,
M3T'Y```-WDAX``I.N0``(\)83R`Y````5.6`(&T`#"\P"`!(;?_F3KD``!$\1
M4$](;?_F3KD``!%,6$\K0/_B("W_XD'M_^4,,``Z"`!F$"`M_^);0@;?_>(B@`%$ZYC
M```EM"\`2'H!_DZY```91$_O``P@;?_>+R@`*"!M_]XO*``82'H"#DZY```9K
M1$_O``P@;?_>("@`)"!M_]Z0J``@4H`@;?_>(B@`$$ZY```EM"!M_]XB*``4D
M3KD``"6T+P`@;?_>#*A$3U,``"QF"$'Z`AT@"&`&0?H"&2`(+P!(>@'@3KD`L
M`!E$3^\`#$AZ`@=.N0``&4183TAY````\$ZY```1CEA/*T#_^K"\````>6<L7
M#*T```!9__IG(@RM````"O_Z9QA(>@'F3KD``!E$6$](>``43KD``"/"6$\O9
M+?_>3KKY*%A/&T#__TZY```-WA`M__](@$C`+P!.N0``(\)83V`>2'H!LTZYM
M```91%A/3KD```W>2'@`%$ZY```CPEA/3-]`#$Y=3G4*1&ES:T-H96-K97(@L
M)7,@0V]P>7)I9VAT(#$Y.#D@0RX@2&%R86QD($MO8V@*"@!V<0!$159)0T4@9
M("`@(#T@("`@)7,@("`H)7,I"@!53DE4("`@("`@(#T@("`@)35L9"`@("!&U
M3$%'4R`@("`@(#T@("`@)35L9`H`2$5!1%,@("`@("`]("`@("4U;&0@("`@D
M4T5#5$]24R`@("`]("`@("4U;&0*`$Q/0UE,("`@("`@/2`@("`E-6QD("`@>
M($A)0UE,("`@("`@/2`@("`E-6QD"@!,3T),3T-+("`@(#T@("`@)35L9"`@W
M("!(24),3T-+("`@(#T@("`@)35L9`H`4D5315)6140@("`]("`@("4U;&0@T
M("`@345-5%E012`@("`]("`@("4U;&0*`$9)3$5365,@("`@/2`@("`E-7,@[
M("`@1$E32R!325I%("`]("`@("4U;&0*`$]&4P!&1E,`"E-H;W5L9"!)($-O2
M;G1I;G5E/R!;>5T@`$%B;W)T:6YG+BXN"@!D979I8V4@;F]T(&9O=6YD("AOA
M<B!D979I8V4@:7,@;F]T(&$@9&ES:R!D979I8V4I"@!.50``2.<P`B!M``A*A
M$&=$(&T`"!`02(!(P$'Y````;P@P``$(`&<6(&T`"!`02(!(P"\`3KD``!%>1
M6$]@"B!M``@0$$B`2,`@;0`($(!2K0`(8+1,WT`,3EU.=4Y5__A(YS`"("T`#
M#.6`*T#__$*M__A@&B!M__S1[?_X("W_^")M``@3J``!"`!2K?_X(&W__!`0Q
M2(!(P"(M__BR@&W4("W_^"!M``A",`@`3-]`#$Y=3G5.5?[$2.<P`B!Y````@
M""MH`"+__"!M__P@*``8Y8`K0/_X(&W_^"`H``3E@"M`__1@``&>(&W_]$JHK
M``1F``&&(&W_]"\H`"A(;?_43KK_6E!/2&W_U"\M``A.N0``$TQ03TJ`9@`!:
M7B!M__0@*``<Y8`K0/_P2JW_\&<``4A(>0`!``!(>``P3KD``"@^4$\K0/[,*
M(&W_\"`H``3E@"M`_L@@;?[($!!(@$C`4H`K0/[$0J<O+?[$3KD``"@^4$\@3
M;?[,((`@;?_P+R@`!"!M_LPO$$ZZ_M)03R!M__`B;?[,(U``!"!M__`B;?[,<
M(V@`#``((&W_\"`H``CE@"M`_^P@;?[,(FW_["`I``3E@"%```P@;?_L(FW^;
MS"-H``P`$"!M_^PB;?[,(V@`%``4(&W_[")M_LPC:``8`!@@;?_L(FW^S"-H?
M`!P`'"!M_^PB;?[,(V@`)``@(&W_[")M_LPC:``H`"0@;?_L#)`````,91`@U
M;?_L(FW^S"-H`#``*&`,(&W^S"%\`````@`H(&W_[`R0````$&40(&W_[")M^
M_LPC:`!``"Q@#"!M_LPA?$1/4P``+"`M_LQ,WT`,3EU.=2!M__0@$.6`*T#_N
M]$JM__1F`/Y><`!@X$Y5``!(YS`"0KD````,3-]`#$Y=3G5.50``2.<P`B/\C
M`````0````Q,WT`,3EU.=4Y5``!(YS`"0J="ITZY```I%E!/P+P``#``9P1PT
M`6`"<`!,WT`,3EU.=4Y5__Y(YS@B#+D````!````6&9L(#D```!4L*T`"&PL[
M(#D```!4Y8`@;0`,(G`(``P1`"UF%B`Y````5.6`(&T`#")P"`!**0`!9@IPD
M_TS?1!Q.74YU2'H"4"`Y````5.6`(&T`#"\P"`!.N0``$TQ03TJ`9@I2N0``H
M`%1P_V#.(#D```!4Y8`@;0`,(C`(`"!Y````6!`P&`!(@$C`*``CP````!"XB
MO````#IG%B\$+RT`$$ZY```3,E!/)$!*@&8``*9*N0```%!G9!M$__X;?``*2
M__\@;0`,+Q!.N0``$4Q83R\`(&T`#"\02'@``DZY```BMD_O``Q(>@'$3KD`A
M`!%,6$\O`$AZ`:%(>``"3KD``"*V3^\`#$AX``)(;?_^2'@``DZY```BMD_O5
M``P@.0```%3E@"!M``PB,`@`4KD```!8('D```!82C`8`&804KD```!4(_P`K
M```!````6'`_8`#^Z%**#!(`.F8``/H@.0```%3E@"!M``PB<`@`T_D```!8+
M2BD``6<H(#D```!44KD```!4Y8`@;0`,(C`(`-*Y````6%*!(\$````48```U
MJE*Y````5"`Y````5+"M``AM?$JY````4&=D&T3__AM\``K__R!M``PO$$ZY\
M```13%A/+P`@;0`,+Q!(>``"3KD``"*V3^\`#$AZ`/=.N0``$4Q83R\`2'H`K
MQTAX``).N0``(K9/[P`,2'@``DAM__Y(>``"3KD``"*V3^\`#"/\`````0``Q
M`%AP/V``_@P@.0```%12N0```%3E@"!M``PC\`@`````%"/\`````0```%A@"
M."`Y````5.6`(&T`#"(P"`!2N0```%@@>0```%A*,!@`9A`C_`````$```!81
M4KD```!40KD````4(`1@`/VH+2T`.B!I;&QE9V%L(&]P=&EO;B`M+2``.B!I[
M;&QE9V%L(&]P=&EO;B`M+2``.B!O<'1I;VX@<F5Q=6ER97,@86X@87)G=6UE7
M;G0@+2T@`#H@;W!T:6]N(')E<75I<F5S(&%N(&%R9W5M96YT("TM(```(&\`:
M!"`((F\`"!#99OQ.=2!O``0@"$H89OR1P"`(4X!.=7``$"\`![`\`&!C"K`\\
M`'IB!)`\`"!.=7``$"\`![`\`$!C"K`\`%IB!-`\`"!.=4Y5``!(YS@B)&T`V
M""\*3KD``!'2*`"PO/____]83V<@(`1@%%.2".H``P`,</],WT0<3EU.=6#4#
M2H!G^EF`9^0@!&#J3E4``$CG,"(D;0`((%*QZ@`$90XO"F$<6$],WT0,3EU./
M=2!24I(0$$B`2,#`O````/]@YDY5``!(YS@R)&T`"!`J``S`/``89PIP_TS?V
M3!Q.74YU"*H``@`,2JH`"&8*+PI.N0``(+I83Q`J``Q(@$C`"```!V<\0?D`%
M``#P)D@0*P`,2(!(P,"\````A+"\````A&8.2'C__R\+3KD``!^`4$_7_```I
M`!9!^0```JBWR&7,,"H`$$C`+P`O*@`($"H`#4B`2,`O`$ZY```3?"@`2H!/)
M[P`,;A1*A&8$<`A@`G`0@2H`#'#_8`#_8"2J``@@:@`(T<0E2``$(%)2DA`08
M2(!(P,"\````_V``_SY.50``2.<P`B/M``@`````2&T`$"\M``Q(>@`43KD`.
M`!GX3^\`#$S?0`Q.74YU3E4``$CG,`(O.0`````O+0`(3KD``!XN4$],WT`,Y
M3EU.=2!O``0@+P`($AAG"K(`9O@@"%.`3G5P`$YU,#Q__V`$,"\`#E-`:Q0@A
M;P`$(F\`"+$)9@Q32$H85\C_]G``3G5C!'`!3G5P_TYU3E4``$CG/"(H+0`(6
M3KD``"-,<@8@!$ZY```EM"1`U?D````82H1M$#`Y```"J$C`N(!L!$J29A0C#
M_`````(````<</],WT0\3EU.=3`J``1(P,"\`````["\`````68.(_P````%,
M````''#_8-8O+0`0+RT`#"\23KD``"8^*@"PO/____]/[P`,9A!.N0``)@PCO
MP````!QP_V"H(`5@I&%\0_D```*T1?D`````M<EF#C(\`!AK"'0`(L)1R?_\A
M(\\````@+'@`!"/.````)$CG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G-#H
M^@`D3J[^:"/`````"&8,+CP``X`'3J[_E&`&3KD``!2B4$].=61O<RYL:6)R"
M87)Y`$GY``!__DYU3E4``$CG,")(>0`!```P.0```JC!_``&+P!.N0``*$0C/
MP````!A03V880J=(>0`!``!.N0``)G)03RYY````($YU('D````80F@`!"!Y@
M````&#%\``$`$"!Y````&#%\``$`"B!Y````("`Y````()"H``10@"/`````@
M*"!Y````*""\34%.6$*G3KD``"AR)$!*J@"L6$]G."\M``PO+0`(+PI.N0``9
M%BPC_`````$````,('D````8`&B````$('D````8`&B````*3^\`#&!62&H`@
M7$ZY```I+$AJ`%Q.N0``*+`CP````"P@>0```"Q*J``D4$]G%"!Y````+")HX
M`"0O$4ZY```EYEA/+SD````L+PI.N0``&'HC^0```"P````P4$].N0``)@(@I
M>0```!@@@$ZY```F-"!Y````&"%```9G&DAX`^U(>@`Z3KD``"8D('D````89
M(4``#%!/+SD````P+SD````T3KD```9B0J=.N0``(\)/[P`,3-]$#$Y=3G4JA
M`$Y5``!(YSPR)&T`$"!M``A*J`"L9Q@@;0`(("@`K.6`*``@1"`H`!#E@"9`P
M8`8F>0```JH0$TB`2,#0K0`,5(`CP````#A"IR\Y````.$ZY```H1"/`````[
M/%!/9@A,WTP\3EU.=1`32(!(P"H`+P4@2U*(+P@O.0```#Q.N0``&%@@>0``K
M`#S1Q4/Z`700V6;\+RT`#"\*+SD````\3KD``!@T('D````\0C!8`"/\````E
M`0```#0@>0```#S1Q29(4HLD2T_O`!@0$TB`2,`J`+"\````(&<@NKP````)?
M9QBZO`````QG$+J\````#6<(NKP````*9@12BV#,#!,`(&T``(X,$P`B9C)2"
MBR!+4HL0$$B`2,`J`&<@($I2BA"%NKP````B9A`,$P`B9@12BV`&0BK__V`"7
M8-)@1"!+4HL0$$B`2,`J`&<PNKP````@9RBZO`````EG(+J\````#&<8NKP`Q
M```-9Q"ZO`````IG""!*4HH0A6#"($I2BD(02H5F`E.+4KD````T8`#_.D(2)
M0J<@.0```#12@.6`+P!.N0``*$0CP````#!03V8*0KD````T8`#^I'H`)GD`[
M```\8"`@!>6`('D````P(8L(`"!+(`A*&&;\D<!3B%*(U\A2A;JY````-&W8"
M(`7E@"!Y````,$*P"`!@`/Y@(``P/'__8`0P+P`.(&\`!$H89OQ32")O``A3$
M0!#95\C__&<"0A`@+P`$3G5,[P,```0@""(O``Q@`A#95\G__&<&4D%@`D(8]
M4<G__$YU3E4``$CG/C(D;0`(0J=(>@"D3KD``"CH(\````!`4$]F"$S?3'Q.*
M74YU(&T`#")H`"0O*0`$3KD``"E8*`!83V=:2'H`?2!$+R@`-DZY```I.B9`;
M2H!03V<X2'@#[2\+3KD``"8D+`!03V<F(`;E@"H`($4E:``(`*0E1@"<2'@#X
M[4AZ`$1.N0``)B0E0`"@4$\O!$ZY```I2EA/+SD```!`3KD``"::0KD```!`F
M6$]@`/]P:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$Y5``!(YS`"2&T`#"\M``A(U
M>0``'@Q.N0``&?A/[P`,3-]`#$Y=3G5.50``2.<X(B1M`!`,K0````0`%&8(V
M(&T`""@08!1*K0`,;P@@;0`(*!!@!B!M``@H$$*M`!1*K0`,;!)$K0`,2H1LV
M"D2$*WP````!`!0B+0`,(`1.N0``':9!^0```%Q3BA2P"``B+0`,(`1.N0``<
M';(H`&;82JT`%&<&4XH4O``M(`I,WT0<3EU.=4Y5_Q1(YS@R)&T`""9M``Q"S
MK?_X*VT`$/_\($M2BQ`02(!(P"@`9P`#/+B\````)68``Q9"+?\B*WP````!=
M__0K?````"#_\"M\```G$/_L($M2BQ`02(!(P"@`L+P````M9A!"K?_T($M2`
MBQ`02(!(P"@`N+P````P9A0K?````##_\"!+4HL0$$B`2,`H`+B\````*F8:%
M(&W__%BM__PK4/_H($M2BQ`02(!(P"@`8#A"K?_H8"1R"B`M_^A.N0``);30<
MA)"\````,"M`_^@@2U*+$!!(@$C`*`!!^0```&\(,``"2`!FSKB\````+F9F_
M($M2BQ`02(!(P"@`L+P````J9AH@;?_\6*W__"M0_^P@2U*+$!!(@$C`*`!@D
M.$*M_^Q@)'(*("W_[$ZY```EM-"$D+P````P*T#_["!+4HL0$$B`2,`H`$'YJ
M````;P@P``)(`&;.*WP````$_^2XO````&QF%B!+4HL0$$B`2,`H`"M\````6
M!/_D8!2XO````&AF#"!+4HL0$$B`2,`H`"`$8```@BM\````"/_@8!PK?````
M``K_X&`2*WP````0_^!@""M\____]O_@+RW_Y$AM_R(O+?_@+RW__$ZZ_:0K-
M0/_<("W_Y-&M__Q/[P`08%P@;?_\6*W__")0*TG_W"`)2AEF_)/`4XDK2?_D+
M8$H@;?_\6*W__"@00>W_(2M(_]P0A&`HD+P```!C9^)3@&>2D+P````+9P#_C
M;%F`9[)5@&<`_VQ7@&<`_W!@S$'M_R*1[?_<*TC_Y"`M_^2PK?_L;P8K;?_L,
M_^1*K?_T9W`@;?_<#!``+6<*(&W_W`P0`"MF-`RM````,/_P9BI3K?_H(&W_J
MW%*M_]P0$$B`2,`O`$Z2L+S_____6$]F"G#_3-],'$Y=3G5@&"\M__!.DK"\S
M_____UA/9@1P_V#B4JW_^"`M_^A3K?_HL*W_Y&[:0JW_X&`D(&W_W%*M_]P0[
M$$B`2,`O`$Z2L+S_____6$]F!'#_8*I2K?_@(&W_W$H09PH@+?_@L*W_[&W*=
M("W_X-&M__A*K?_T9BI@&DAX`"!.DK"\_____UA/9@9P_V``_W!2K?_X("W_0
MZ%.M_^BPK?_D;MA@&"\$3I*PO/____]83V8&</]@`/](4JW_^&``_+@@+?_X_
M8`#_.$CG2`!"A$J`:@1$@%)$2H%J!D2!"D0``6$^2D1G`D2`3-\`$DJ`3G5(A
MYT@`0H1*@&H$1(!21$J!:@)$@6$:(`%@V"\!81(@`2(?2H!.=2\!808B'TJ`+
M3G5(YS``2$%*068@2$$V`30`0D!(0(##(@!(0#("@L,P`4)!2$%,WP`,3G5(?
M028!(@!"04A!2$!"0'0/T(#3@;:!8@22@U)`4<K_\DS?``Q.=4Y5``!(YS`"5
M2'D```$&+RT`"$ZY```>+E!/3-]`#$Y=3G5.50``2.<X`B@M``@O+0`,+P1.5
MN0``'GRXO`````I03V8J(&T`#!`H``Q(@$C`"```!V<82'C__R\M``Q.N0``H
M'X!03TS?0!Q.74YU8/9.50``2.<P(B1M``P@4K'J``1E'"`M``C`O````/\O;
M`"\*3KH`X%!/3-]$#$Y=3G4@4E*2$"T`"Q"`2(!(P,"\````_V#B3E4``$CGV
M,")!^0```/`D2"!*U?P````6+PAA%%A/0?D```*HM<AEZ$S?1`Q.74YU3E4`&
M`$CG."(D;0`(>``@"F8*</],WT0<3EU.=4HJ``QG6@@J``(`#&<,2'C__R\*'
M85PH`%!/$"H`#4B`2,`O`$ZY```E5(B`""H``0`,6$]G#"\J``A.N0``(;Y8*
M3P@J``4`#&<6+RH`$DZY```BA"\J`!).N0``(;Y03T*20JH`!$*J``A"*@`,'
M(`1@ADY5__Y(YS@B)&T`"$'Z_S0CR````$0(*@`$``QG"G#_3-]$'$Y=3G4(,
M*@`"``QG-B!2D>H`""@(+P0O*@`($"H`#4B`2,`O`$ZY```BMK"$3^\`#&<0H
M".H`!``,0I)"J@`$</]@N@RM_____P`,9A`(J@`"``Q"DD*J``1P`&"@2JH`N
M"&8*+PI.N0``(+I83PQJ``$`$&8R&VT`#___2'@``4AM__\0*@`-2(!(P"\`G
M3KD``"*VL+P````!3^\`#&:4("T`#&``_U@DJ@`(,"H`$$C`T*H`""5```0(;
MZ@`"``P@4E*2$"T`#Q"`2(!(P,"\````_V``_RA.50``2.<P(D'Y````\"1(V
M2BH`#&<<U?P````60?D```*HM<AE"G``3-]$#$Y=3G5@WD*20JH`!$*J``@@I
M"F#H3E7__$CG,"(D;0`(2'@$`$ZY```AIBM`__Q83V8:-7P``0`0($K1_```B
M``XE2``(3-]$#$Y=3G4U?`0``!`(Z@`!``PE;?_\``@0*@`-2(!(P"\`3KD`2
M`"(02H!83V<&`"H`@``,8,A.50``2.<P,B1Y````!&`6)E(@*@`$4(`O`"\*W
M3KD``"B04$\D2R`*9N9"N0````1,WTP,3EU.=4Y5``!(YS`B0?K_OB/(````Z
M2$*G("T`"%"`+P!.N0``*$0D0$J`4$]F"G``3-]$#$Y=3G4DN0````0E;0`()
M``0CR@````0@"E"`8.!.50``2.<P`B\M``AAIEA/3-]`#$Y=3G5.50``2.<PL
M,I?+)'D````$8`X@;0`(48BQRF<2)DHD4B`*9NYP_TS?3`Q.74YU(`MG!":27
M8`8CT@````0@*@`$4(`O`"\*3KD``"B0<`!03V#43E4``$CG,")R!B`M``A.F
MN0``);0D0-7Y````&$JM``AM%#`Y```"J$C`(BT`"+*`;`1*DF84(_P````"G
M````''#_3-]$#$Y=3G5R!B`M``A.N0``);0@>0```!@O,`@`3KD``"862H!8>
M3V<$<`%@`G``8,Y.50``2.<P`B\M``A.N0``)?1*@%A/9A9.N0``)@PCP```\
M`!QP_TS?0`Q.74YU<`!@]$Y5``!(YSPB*"T`"$ZY```C3'(&(`1.N0``);0D7
M0-7Y````&$J$;1`P.0```JA(P+B`;`1*DF84(_P````"````''#_3-]$/$Y=,
M3G4P*@`$P'P``V8.(_P````%````''#_8.`O+0`0+RT`#"\23KD``"9B*@"P!
MO/____]/[P`,9A!.N0``)@PCP````!QP_V"R(`5@KDY5__Q(YS`"2'@0`$*G<
M3KD``"D<*T#__`@```Q03V<:2KD````,9@P@+?_\3-]`#$Y=3G5.N0``(XIPX
M`&#N3E4``$CG,`)(>``$2'H`)DZY```F-"\`3KD``"9B2'@``4ZY```CPD_O(
M`!!,WT`,3EU.=5Y#"@!.50``2.<P`DJY````1&<(('D```!$3I`O+0`(3KD``
M`"/N6$],WT`,3EU.=4Y5__Q(YS@"*VT`"/_\2KD````89S9X`&`,+P1.N0``5
M)5183U*$,#D```*H2,"X@&WH,#D```*HP?P`!B\`+SD````83KD``"B04$]*+
MN0```$AG""!Y````2$Z02KD```*N9PXO.0```JY.N0``)DY83TJY````3&<,3
M('D```!,(+D```!02KD```!49PXO.0```%1.N0``)J!83TJY````6&<.+SD`"
M``!83KD``":@6$]*N0```%QG#B\Y````7$ZY```FH%A/2KD```!@9PXO.0``8
M`&!.N0``)J!83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS2KD`Q
M```L9CA*N0```#QG+B\Y````."\Y````/$ZY```HD"`Y````-%*`Y8`O`"\Y\
M````,$ZY```HD$_O`!!@%$ZY```H@"\Y````+$ZY```I"%A/("W__"YY````"
M($YU3-]`'$Y=3G5.50``2.<^(B@M``AR!B`$3KD``"6T)$#5^0```!A*A&T0X
M,#D```*H2,"X@&P$2I)F%"/\`````@```!QP_TS?1'Q.74YU,"H`!,!\@`!F>
M"B\23KD``"786$]"DG``8-Y(YW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`"
MT(),WP`.3G4B+P`$+'D````(3N[_W"(O``0L>0````A.[O^"(B\`!"QY````@
M"$[N_[@L>0````A.[O_*+'D````(3N[_?"(O``0L>0````A.[O\H3.\`!@`$[
M+'D````(3N[_XBQY````"$[N_\1,[P`.``0L>0````A.[O_63OD``"94(B\`3
M!"QY````"$[N_Z9,[P`.``0L>0````A.[O_02.<!!$SO((``#"QY````)$ZNW
M_Y1,WR"`3G4B;P`$+'D````D3N[^/D[Y```FH")O``0L>0```"1.[OYB3E4`A
M`$CG.")(>/__3KD``">D*`"PO/____]83V8*<`!,WT0<3EU.=4AY``$``4AXL
M`").N0``*#XD0$J`4$]F#B\$3KD``"BB<`!83V#2)6T`"``*%6T`#P`)%7P`L
M!``(0BH`#A5$``]"ITZY```H;"5``!!*K0`(6$]G#"\*3KD``">66$]@#$AJ"
M`!1.N0``*+Y83R`*8(A.50``2.<P(B1M``A*J@`*9PHO"DZY```H^EA/%7P``
M_P`()7S_____`!1P`!`J``\O`$ZY```HHDAX`"(O"DZY```HBD_O``Q,WT0,*
M3EU.=2)O``0L>0```"1.[OZ>("\`!"QY````)$[N_K9.50``2.<P(DJM``AFY
M"G``3-]$#$Y=3G5(>0`!``$O+0`,3KD``"@^)$!*@%!/9@1P`&#<%7P`!0`(\
M-6T`#@`2)6T`"``.(`I@QDY5``!(YS`B)&T`""`*9@A,WT0,3EU.=15\`/\`(
M""5\_____P`4)7S_____`!AP`#`J`!(O`"\*3KD``"B*4$]@SD[Y```H1$SOF
M``,`!"QY````)$[N_SI(YP,`(F\`#"QY````)$ZN_CA,WP#`3G5.^0``*'(B`
M;P`$+'D````D3N[^VBQY````)$[N_WQ.^0``*)`B;P`$("\`""QY````)$[N`
M_RX@+P`$+'D````D3N[^L"!O``0L>0```"1.[OZ,(&\`!""(6)!"J``$(4@`/
M"$YU(&\`!$SO`@$`""(O`!`L>0```"1.[OY$+'D````D(F\`!"`O``A.[OW82
M(F\`!"QY````)$[N_I@B;P`$+'D````D3N[^AD[Y```I'$SO``,`!"QY````!
M)$[N_LX@;P`$+'D````D3N[^@$SO`P``!"QY````0$[N_Z`@;P`$+'D```!`\
M3N[_IB!O``0L>0```$!.[O^R``````/L````1`````$```'B```"&@```Z``<
M``/<```#Y```!"8```8H```&<@``!K````:X```&O@``!OP```<B```(Y```E
M"U0```XP```..```#D0```Y:```.?@``#IH```ZD```.M```#N@```]4```/M
M9```#VH```]V```/@```#Y8```^F```/L@``#[@```_(```/V@``#^````_L]
M```07```$&@``!!N```0A@``$(X``!">```0I```$+0``!"Z```23```$GX`T
M`!.F```4(```%)P``!2R```67```&<@``!K6```;1```'A8``![,```>X@``C
M((0``""8```B-```(N```"06```D(@``)$P``"14```E>````+(````````!L
MK@```=0```(N```"/````G(```*$```"F````JH```+&```"Z@```OP```,:`
M```#=@```[@```/2```$#```!!H```0L```$-```!$(```1.```$G```!+8`1
M``32```$X@``!/0```8N```&;```!GP```:0```&T@``!MP```<0```'&@``D
M!S8```="```'<@``!WX```><```'N@``!]@```?V```($@``""````@Z```(0
M2```"%0```AR```(E@``"*0```C.```(W```".H```D6```)(@``"3@```E(P
M```)5@``"5X```EH```+;@``#$@```QV```,I@``#@8```Z.```.V```#P``=
M``\4```/(@``#S0```]*```0!```$!@``!`F```0.```$$X``!&>```2-@``_
M$G```!*>```3````$R0``!.*```3E```$_8``!0*```4A@``%+X``!36```52
M+@``%4@``!5Z```5A```%:H``!6Z```5S```%=H``!7T```6$@``%AH``!9\$
M```6J@``%LP``!?0```8C@``&+(``!C(```8W```&0(``!D0```9'@``&58`W
M`!E<```9P@``&=H``!JX```;)@``'B```!Y"```>;```'S0``!]*```?7@``W
M'V@``!_*```@"@``(#(``"#,```A$```(4```"%X```B!@``(B```")B```B3
M<@``(I(``"*>```BQ```(LX``",F```C.@``(UP``"."```CG```(Z0``".N=
M```CX```)`P``"0T```D6@``)(0``"2:```DL```),8``"4*```E(@``)2X`V
M`"4Z```E9@``):@``"90```FG```)KP``";B```F\@``)QH``"<N```G/```J
M)UP``"=Z```GA@``)]8``"@V```H0```*&X``"B,```I&````(@````"```+T
M]@``#=(```WL```.Q```#]```!!\```0P```$NX``!,:```3G```$[H``!/BY
M```4$```%"8``!0^```42```%'(``!3$```4W@``%.8``!3P```4_```%0@`'
M`!4.```5&@``%2```!52```56```%60``!6*```5D```%9X``!6R```5P```G
M%<0``!72```5X```%?H``!8&```6#```%FX``!9V```6@@``%J0``!:P```6`
MQ@``%M(``!;@```6Y@``%[8``!?$```7U@``%^```!?L```7^```&!0``!@@B
M```8E```&1@``!DD```?D@``(2P``"%.```A:```(9```"&<```AR@``(?8``
M`"(H```B3```(F@``"*D```BU@``(O0``",2```C0```(VX``"/,```CU```E
M(_X``"0N```D/```)$0``"1B```D:@``)'```"1V```D?@``)(P``"24```DK
MH@``)*H``"2X```DP```).X``"3V```D_@``)00``"40```E'```)30``"5&A
M```E;@``)8P``"7>```E[```)?H``"8$```F#@``)AP``"8L```F-@``)D8`Q
M`"9:```F:@``)GX``":2```FI@``)YP``">J```H3```*%X``"AX```H@@``0
M*)H``"BH```HM@``*.```"CJ```I````*0X``"DD```I,@``*4(``"E0```I?
M7@````````/R```#Z@```*TQ+C``````!````!<````S````3````&<```"!^
M````H````,4```#B````^@```18```$_```!40```6$```%P```!?0``````[
M`````````0````$````!`````3`Q,C,T-38W.#EA8F-D968````@("`@("`@&
M("`P,#`P,"`@("`@("`@("`@("`@("`@()!`0$!`0$!`0$!`0$!`0$`,#`P,P
M#`P,#`P,0$!`0$!`0`D)"0D)"0$!`0$!`0$!`0$!`0$!`0$!`0$!0$!`0$!`2
M"@H*"@H*`@("`@("`@("`@("`@("`@("`@)`0$!`(``````````````````!%
M``````$``````````````````````0$````!``````````````````````$"'
M`````0``````````````````````````````````````````````````````!
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M```````````````````````````````4`````````````````^P````0````3
M``````0````(````#````!`````4````&````!P````@````)````"@````L(
H````,````#0````X````/````$`````````#\@```^L````9```#\B@`Q
``
end
size 13000
SHAR_EOF
# End of shell archive
exit 0
--
Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
Have five nice days.