[comp.sources.amiga] v90i273: UUJoin - filter and merge usenet binaries, Part01/01

amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (10/10/90)

Submitted-by: mrr@mrsoft.Newport.RI.US (Mark Rinfret)
Posting-number: Volume 90, Issue 273
Archive-name: util/uujoin/part01

[ uuencoded executable enclosed  ...tad ]

enclosed are source and binaries for a small utility, named uujoin,
which will filter and merge Usenet binaries from 
comp.binaries.{amiga | macintosh | ibm.pc} newsgroups. It also performs a
uudecode on the Amiga and PC offerings (I intend to add a de-binhexer for
Macintosh binaries, later). See the UUJoin.ReadMe file for more details.

#!/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 archive 1 (of 1)."
# Contents:  FileScan.c FileScan.h UUJoin.ReadMe UUJoin.c UUJoin.uu
#   makefile
# Wrapped by tadguy@abcfd20 on Tue Oct  9 21:39:39 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'FileScan.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'FileScan.c'\"
else
echo shar: Extracting \"'FileScan.c'\" \(5181 characters\)
sed "s/^X//" >'FileScan.c' <<'END_OF_FILE'
X#ifdef AZTEC_C
X
X/* Build an expanded list of filenames from a filename argument list. */
X
X#include <stdlib.h>
X#include <fcntl.h>
X#include <ctype.h>
X#include <string.h>
X
X/*  The ListInfo structure tracks our filename list building process. */
X
Xtypedef struct ListInfo {
X    char        **theList;
X    int         slotCount;          /* number of slots in the list. */
X    int         entryCount;         /* number of slots filled */
X    } ListInfo;
X
X/*  FUNCTION
X *      AddFile - add a filename to the filename list.
X *
X *  SYNOPSIS
X *      static int AddFile(ListInfo *fileList, const char *theFile);
X *
X *  DESCRIPTION
X *      AddFile attempts to add <theFile> to the filename list. The list will be
X *      expanded if necessary. 
X *
X *      AddFile returns zero if successful or 1 on error.
X */
X
Xstatic int
XAddFile(ListInfo *fileList, char *theFile)
X{
X    char    *fName;                 /* for a copy of theFile */
X    char    **newList;
X    int     newCount;
X    size_t  newSize;
X
X    if (fileList->entryCount >= fileList->slotCount) { /* Expand the list? */
X        newCount = fileList->slotCount + 50;
X        /* Note that malloc is used rather than realloc, since I think realloc is
X         * broken.
X         */
X        newSize = sizeof(char *) * newCount;
X        newList = malloc(newSize);
X        if (newList == NULL) return 1;   /* Error! */
X        fileList->slotCount = newCount;
X        if (fileList->theList) {
X            /* Copy old stuff to new list. */
X            memcpy(newList, fileList->theList, newSize);
X            /* Dispose of the old list. */
X            free(fileList->theList);
X        }
X        fileList->theList = newList;
X    }
X
X    fName = malloc(strlen(theFile)+1);
X    if (! fName) return 1;
X    strcpy(fName, theFile);
X    fileList->theList[fileList->entryCount++] = fName;
X    return 0;
X}
X
X/*  FUNCTION
X *      TestWild - test a file specification for wildcard content.
X *
X *  SYNOPSIS
X *      static int TestWild(const char *fileName);
X *
X *  DESCRIPTION
X *      TestWild scans <fileName>, looking for wildcard characters (?, *). If found,
X *      TestWild returns 1. If not found, TestWild returns 0.
X *
X *      TestWild is provided to prevent unnecessary calls to scdir().
X */
X
Xstatic int
XTestWild(char *fileName)
X{
X    char    *p, c;
X
X    for (p = fileName; c = *p++;)
X        if (c == '?' || c == '*') return 1;
X    return 0;
X}
X
X/*  Note: Lattice users can replace this with stricmp, but this is small enough to
X *  just leave it in here.
X */
X
X/*  FUNCTION
X        scmpi - perform a case-insensitive string compare.
X
X    SYNOPSIS
X        int scmpi(const char *s1, const char *s2);
X
X    DESCRIPTION
X        Strings <s1> and <s2> are compared, ignoring differences in case.
X        A result code is returned according to the following:
X            0   => strings match
X           <0   => s1 < s2
X           >0   => s1 > s2
X*/
X
Xstatic int
Xscmpi(const char *s1, const char *s2)
X{
X    int c1, c2, cd;
X
X    do {
X        c1 = tolower(*s1++);
X        c2 = tolower(*s2++);
X        if (cd = (c1 - c2)) break;
X    } while (c1 && c2);
X
X    return cd;
X}
X
X/*  FUNCTION
X *      Compare - perform case-insensitive compare of two filename strings.
X *
X *  SYNOPSIS
X *      static int Compare(const void *a, const void *b);
X *
X *  DESCRIPTION
X *      Compare simply provides an interface between qsort() and a string
X *      comparison routine. It returns the result of the string comparison.
X */
X
Xstatic int
XCompare(const void *a, const void *b)
X{
X    return scmpi(*(char **)a, *(char **)b);
X}
X
X/*  FUNCTION
X *      FileScan - scan, expand and optionally sort a file specification list.
X *
X *  SYNOPSIS
X *      char **FileScan(char **rawList, int rawCount, int *newCount; 
X *                      int sortFiles);
X *
X *  DESCRIPTION
X *      FileScan treats each entry in <rawList> as a file specification and
X *      attempts to expand it into multiple filenames. The number of entries
X *      in <rawList> is defined by <rawCount>. If successful, FileScan will
X *      return a pointer to a new list of filenames, passing the number of entries
X *      via <newCount>. If <sortFiles> is non-zero, the list will be sorted.
X *
X *      If FileScan is unable to perform an allocation, NULL is returned.
X */
X
Xchar **
XFileScan(char **rawList, int rawCount, int *newCount, int sortFiles)
X{
X    ListInfo    fileList;           /* Stack-based for reentrancy. */
X    int         rawIndex = 0;
X    char        *rawName;
X    char        *theName;
X    
X    fileList.theList = NULL;        /* Initialize the list structure. */
X    fileList.slotCount = 0;
X    fileList.entryCount = 0;
X
X    while (rawIndex < rawCount) {
X        rawName = rawList[rawIndex++];
X        if (TestWild(rawName)) {
X            while (theName = scdir(rawName)) /* scdir() is not reentrant... */
X                if (AddFile(&fileList, theName)) return NULL;
X        }
X        else
X            if (AddFile(&fileList, rawName)) return NULL;
X    }
X
X    *newCount = fileList.entryCount;
X    if (fileList.theList && sortFiles) {
X        qsort(fileList.theList, fileList.entryCount, sizeof(char *), Compare);
X    }
X    return fileList.theList;
X}
X#else
X#include <Not_Implemented_For_Lattice>
X#endif
END_OF_FILE
if test 5181 -ne `wc -c <'FileScan.c'`; then
    echo shar: \"'FileScan.c'\" unpacked with wrong size!
fi
# end of 'FileScan.c'
fi
if test -f 'FileScan.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'FileScan.h'\"
else
echo shar: Extracting \"'FileScan.h'\" \(95 characters\)
sed "s/^X//" >'FileScan.h' <<'END_OF_FILE'
X/*  FileScan.h */
Xchar **FileScan(char **rawList, int rawCount, int *newCount, int sortFiles);
END_OF_FILE
if test 95 -ne `wc -c <'FileScan.h'`; then
    echo shar: \"'FileScan.h'\" unpacked with wrong size!
fi
# end of 'FileScan.h'
fi
if test -f 'UUJoin.ReadMe' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'UUJoin.ReadMe'\"
else
echo shar: Extracting \"'UUJoin.ReadMe'\" \(1243 characters\)
sed "s/^X//" >'UUJoin.ReadMe' <<'END_OF_FILE'
X
XProgram:    UUJoin - join and decode Usenet binary files
XAuthor:     Mark R. Rinfret
XStatus:     Public Domain
X
XI  found  myself  spending  too  much  time  editing,  merging and decoding
Xuuencoded  binaries  offloaded  from  the  net,  so I whipped up this crude
Xlittle filter/decoder.  It's quite simple and probably could have been done
Xwith awk, but I chose to do it in C.  The program, in its current state, is
Xhardwired  for various machine types but is easily altered.  See the source
Xfor documentation.
X
XUUJoin is accessed from the CLI and has the following command format:
X
X    UUJoin [options] filespecs...
X
X    -amiga      - Amiga format
X    -mac        - Macintosh BinHex format (files are not currently decoded)
X    -pc         - PC-Clown format 
X    -r          - remove original files when done.
X
X    File specifications may be individual filenames or Un*x wildcard
X    specifications. When using wildcards, be sure to name your files
X    in such a way that they will sort into the correct sequence, e.g.
X    program.01 program.02 program.03, etc.
X
XIf UUJoin is invoked without options, it's usage info is displayed.
X
XUUJoin  was  implemented  using  Manx  Aztec  C V5.0b, but should be easily
Xported to other C environments.
X
END_OF_FILE
if test 1243 -ne `wc -c <'UUJoin.ReadMe'`; then
    echo shar: \"'UUJoin.ReadMe'\" unpacked with wrong size!
fi
# end of 'UUJoin.ReadMe'
fi
if test -f 'UUJoin.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'UUJoin.c'\"
else
echo shar: Extracting \"'UUJoin.c'\" \(8260 characters\)
sed "s/^X//" >'UUJoin.c' <<'END_OF_FILE'
X/*
X * uujoin [ -r ] [ {-amiga | -mac | -pc} ] file(s)...
X * join and decode Usenet encoded binary files.
X *
X * Author:  Mark R. Rinfret
X * Date:    08-15-90
X * 
X * Public Domain - Use as you wish.
X *
X * Notes:   The uudecode portion was adapted from uudecode.c, packaged
X *          with Matt Dillon's UUCP implementation.
X *
X *          The Macintosh mode simply filters and joins the files. It
X *          doesn't decode the BinHex format (got a de-binhexer I can
X *          have?).
X *
X *          The delimiter strings used to extract the encoded segments
X *          may change over time. Just edit the assignments to the
X *          string variables "start" and "stop", as appropriate.
X */
X
X#include <stdio.h>
X#include <stdlib.h>
X#include <string.h>
X#include <FileScan.h>
X
Xextern int unlink(const char *fileName);
X
Xextern int errno;
X
X/* single character decode */
X#define DEC(c)	(((c) - ' ') & 077)
X
Xint decode(FILE *in, FILE *out);
Xint outdec(char *p, FILE *f, int n);
Xint fr(FILE *fd, char *buf, int cnt);
X
X#define AMI     0
X#define MAC     1
X#define PC      2
X
Xint     fileCount;                          /* set by FileScan() */
Xchar    **fileNames;                        /* allocated by FileScan() */
Xint     fileNumber;                         /* index into fileNames */
Xchar    line[256];                          /* allows for long Usenet lines */
Xint     machine;                            /* machine type */
Xint     removeFiles = 0;                    /* 1 => remove originals */
Xchar    tempName[L_tmpnam];                 /* temporary file name */
X
Xint
XDecodeMergedFile(void)
X{
X	char    dest[128];
X
X	FILE    *in = NULL, *out = NULL;
X    int     mode;                               /* file protection */
X
X    in = fopen(tempName, "r");
X    if (! in ) {
X        fprintf(stderr,"Could not reopen merged file: '%s'\n", tempName);
X        exit(1);
X    }
X
X	/* Search for header line */
X	for (;;) {
X		if (fgets(line, sizeof line, in) == NULL) {
X			fprintf(stderr, "No begin line\n");
X			exit(1);
X		}
X		if (strncmp(line, "begin ", 6) == 0)
X			break;
X	}
X
X	sscanf(line, "begin %o %s", &mode, dest);
X
X	/* create output file */
X	out = fopen(dest, "w");
X	if (out == NULL) {
X		perror(dest);
X		exit(1);
X	}
X
X	decode(in, out);
X
X	if (fgets(line, sizeof line, in) == NULL || strcmp(line, "end\n")) {
X		fprintf(stderr, "No end line\n");
X		exit(5);
X	}
X    fclose(in);
X
X    return 0;
X}
X
Xint
XJoinFiles(void)
X{
X    char    *fName;                         /* current file name */
X    FILE    *inFile = NULL;
X    char    *p;                             /* adjusted line pointer */
X    char    *start, *stop;                  /* pattern matching strings */
X    int     startLeng, stopLeng;            /* pattern lengths */
X    int     status = 0;
X    FILE    *tempFile = NULL;
X
X    tmpnam(tempName);
X    tempFile = fopen(tempName, "w");
X    if (!tempFile) {
X        perror(tempName);
X        status = errno;
X        goto done;
X    }
X
X    /* Set up pattern strings according to machine type. Patterns are
X     * matched from beginning of line through number of chars in pattern. 
X     */
X
X    if (machine == MAC) {
X        start = "---";
X        stop = "--- end";
X    }        
X    else if (machine == PC) {
X        start = "BEGIN";
X        stop = "END--";
X    }
X    else {                              /* AMIGA */
X        start = "sed";
X        stop = "SHAR_EOF";
X    }
X    
X    /* Compute the lengths of the match strings. */
X
X    startLeng = strlen(start);
X    stopLeng = strlen(stop);
X
X    /* The Amiga binaries are packaged as shar files and therefore have a
X     * leading 'X' which must be tossed. Other formats (so far) are not
X     * packed as shar files and thus, the whole line is used.
X     */
X    p = (machine == AMI ? (line + 1) : line);
X
X    while (fileNumber < fileCount) {
X        fName = fileNames[fileNumber];  /* For programming convenience. */
X        inFile = fopen(fName, "r");
X        if (! inFile) {
X            perror(fName);
X            status = errno;
X            goto done;
X        }
X
X        /*  Attempt to find the start of this file. */
X
X        if (startLeng) {
X            while (1) {
X                fgets(line, sizeof(line), inFile);
X                if ( feof(inFile) ) {
Xeof_err:
X                    fprintf(stderr,"uujoin: unexpected EOF in file '%s'!\n", fName);
X                    status = EOF;
X                    goto done;
X                }
X                if (strncmp(start, line, startLeng) == 0)
X                    break;                      /* We found the beginning. */
X            }
X        }
X
X        while (1) {
X            fgets(line, sizeof(line), inFile);
X            if ( feof(inFile) ) {
X                if (stopLeng == 0) 
X                    break;
X                else
X                    goto eof_err;
X            }
X
X            if ( (*line != '\n') && (strncmp(stop, line, stopLeng) == 0) )
X                break;                      /* We found the end. */
X        
X            if ( fputs(p, tempFile) ) {     /* Write the _adjusted_ line. */
X                status = EOF;
X                fprintf(stderr,"uujoin: error writing to temp file '%s'\n", 
X                        tempName);
X                exit(1);
X            }
X        }
X        fclose(inFile);
X        ++fileNumber;
X    }
X
Xdone:
X    if (tempFile) fclose(tempFile);
X    if (inFile) fclose(inFile);
X    return status;
X}
X
Xmain(int argc, char **argv)
X{
X
X    if (argc < 2) {
Xusage:
X        puts("Program: uujoin - join and decode Usenet encoded binary files.");
X        puts("Usage:   uujoin [options] file1 [... filen]");
X        puts("Where [options] may be:");
X        puts("\t-amiga  -> uuencoded files wrapped with shar");
X        puts("\t-mac    -> Macintosh binhex files (not decoded in this release)");
X        puts("\t-pc     -> uuencoded files enclosed in BEGIN/END pairs");
X        puts("\t-r      -> remove original files when done");
X        puts("\n\tUnix-style wildcards may be used in file specifications.");
X        puts("\n\tExample: uujoin -amiga -r program.??");
X        puts("\n\tMark R. Rinfret, August 1990.");
X        puts("\tContributed to the public domain.");
X        exit(1);
X    }
X    
X    --argc;                                 /* Skip over program name. */
X    ++argv;
X
X    while (**argv == '-') {
X        if (strcmp(*argv,"-mac") == 0) {
X            machine = MAC;
Xbump:
X            --argc;                         /* Skip this arg. */
X            ++argv;
X        }
X        else if (strcmp(*argv, "-pc") == 0) {
X            machine = PC;
X            goto bump;
X        }
X        else if (strcmp(*argv,"-amiga") == 0) {
X            machine = AMI;
X            goto bump;
X        }
X        else if (strcmp(*argv,"-r") == 0) {
X            removeFiles = 1;
X            goto bump;
X        }
X        else
X            goto usage;
X    }
X
X    fileNames = FileScan(argv, argc, &fileCount, 1);
X    if (! fileNames) {
X        printf("Filename expansion failed - abort!\n");
X        exit(1);
X    }
X
X    if (JoinFiles()) exit(1);                   /* Attempt to join files. */
X
X    if (DecodeMergedFile()) exit(1);
X
X    unlink(tempName);
X    if (removeFiles) {
X        while (--fileCount >= 0) {
X            unlink(fileNames[fileCount]);
X        }
X    }
X	exit(0);
X}
X
X/*
X * copy from in to out, decoding as you go along.
X */
Xdecode(in, out)
XFILE *in;
XFILE *out;
X{
X	char buf[80];
X	char *bp;
X	int n;
X
X	for (;;) {
X		/* for each input line */
X		if (fgets(buf, sizeof buf, in) == NULL) {
X			printf("Short file\n");
X			exit(10);
X		}
X		n = DEC(buf[0]);
X		if (n <= 0)
X			break;
X
X		bp = &buf[1];
X		while (n > 0) {
X			outdec(bp, out, n);
X			bp += 4;
X			n -= 3;
X		}
X	}
X}
X
X/*
X * output a group of 3 bytes (4 input characters).
X * the input chars are pointed to by p, they are to
X * be output to file f.  n is used to tell us not to
X * output all of them at the end of the file.
X */
Xoutdec(p, f, n)
Xchar *p;
XFILE *f;
X{
X	int c1, c2, c3;
X
X	c1 = DEC(*p) << 2 | DEC(p[1]) >> 4;
X	c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
X	c3 = DEC(p[2]) << 6 | DEC(p[3]);
X	if (n >= 1)
X		fputc(c1, f);
X	if (n >= 2)
X		fputc(c2, f);
X	if (n >= 3)
X		fputc(c3, f);
X}
X
X
X/* fr: like read but stdio */
Xint
Xfr(fd, buf, cnt)
XFILE *fd;
Xchar *buf;
Xint cnt;
X{
X	int c, i;
X
X	for (i=0; i<cnt; i++) {
X		c = fgetc(fd);
X		if (c == EOF)
X			return(i);
X		buf[i] = c;
X	}
X	return (cnt);
X}
X
END_OF_FILE
if test 8260 -ne `wc -c <'UUJoin.c'`; then
    echo shar: \"'UUJoin.c'\" unpacked with wrong size!
fi
# end of 'UUJoin.c'
fi
if test -f 'UUJoin.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'UUJoin.uu'\"
else
echo shar: Extracting \"'UUJoin.uu'\" \(20021 characters\)
sed "s/^X//" >'UUJoin.uu' <<'END_OF_FILE'
Xbegin 644 UUJoin
XM```#\P`````````#``````````(```SP```!;0````$```/I```,\$[Z&'A.T
XM5?]\2.<`,)7*E\M(>@762&R$($ZZ(;0D0"`*4$]F'$ALA"!(>@7`2&R!MDZZ#
XM"]Q(>``!3KHQG$_O`!`O"DAX`0!(;(1(3KH+8$J`3^\`#&882'H%MDAL@;9.`
XMN@NN2'@``4ZZ,6Y/[P`,2'@`!DAZ!:E(;(1(3KH7JDJ`3^\`#&<"8+A(;?^`M
XM2&W_?$AZ!9)(;(1(3KH-+DAZ!9)(;?^`3KHA*"9`(`M/[P`89A)(;?^`3KH+0
XM?$AX``%.NC$64$\O"R\*3KH#E"\*2'@!`$ALA$A.N@K42H!/[P`49Q)(>@5.'
XM2&R$2$ZZ%8Q*@%!/9QA(>@5!2&R!MDZZ"Q!(>``%3KHPT$_O``PO"DZZ*\1P>
XM`%A/3-\,`$Y=3G5(YS\RE<IT`)W.2&R$($ZZ$PY(>@3^2&R$($ZZ()0L0"`.=
XM3^\`#&822&R$($ZZ"N@D+(5(6$]@``%H#*P````!A4QF#D'Z!.`H"$'Z!-XJU
XM"&`D#*P````"A4QF#D'Z!-0H"$'Z!-0J"&`,0?H$TB@(0?H$T"H(+P1.NBDF+
XM+``O!4ZZ*1XF`$JLA4Q03V8(0>R$22`(8`9![(1((`@N`"`LA5"PK(54;```"
XM^"`LA5#E@"!LA5@F<`@`2'H$$"\+3KH?\"1`(`I03V80+PM.N@I()"R%2%A/G
XM8```R$J&9T@O"DAX`0!(;(1(3KH)I`@J``$`#4_O``QG&"\+2'H$3TAL@;9.G
XMN@GL=/]/[P`,8```DB\&2&R$2"\$3KH5[DJ`3^\`#&<"8+@O"DAX`0!(;(1(@
XM3KH)7`@J``$`#4_O``QG!DJ#9TQ@L@PL``J$2&<4+P-(;(1(+P5.NA6P2H!/+
XM[P`,9RXO#B\'3KH*7$J`4$]G'G3_2&R$($AZ`_E(;(&V3KH)<$AX``%.NB\P\
XM3^\`$&"6+PI.NBHB4JR%4%A/8`#_`"`.9P@O#DZZ*@Y83R`*9P@O"DZZ*@)8)
XM3R`"3-],_$YU2.<@("0O``PD;P`0#((````";&1(>@/$3KH*6DAZ`_M.N@I21
XM2'H$'TZZ"DI(>@0O3KH*0DAZ!%5.N@HZ2'H$CDZZ"C)(>@2^3KH**DAZ!.)._
XMN@HB2'H%%4ZZ"AI(>@4T3KH*$DAZ!4Q.N@H*2'@``4ZZ+H9/[P`P4X)8BB!20
XM#!``+69N2'H%3R\23KH3#DJ`4$]F#BE\`````85,4X)8BF!.2'H%-B\23KH2N
XM\$J`4$]F"BE\`````H5,8.!(>@4@+Q).NA+62H!03V8&0JR%3&#*2'H%$2\2P
XM3KH2P$J`4$]F"BE\`````8`"8+!@`/\F8(I(>``!2&R%5"\"+PI.N@;**4"%8
XM6$JLA5A/[P`09A)(>@363KH).$AX``%.NBW:4$].NOT<2H!G"DAX``%.NBW(?
XM6$].NOOP2H!G"DAX``%.NBVV6$](;(0@3KHL6$JL@`)83V<<4ZR%5&T6("R%:
XM5.6`(&R%6"\P"`!.NBPX6$]@Y$*G3KHM@EA/3-\$!$YU3E7_L$CG(#`F;0`,-
XM+RT`"$AX`%!(;?^P3KH'-$J`3^\`#&822'H$9DZZ"*1(>``*3KHM1E!/$"W_G
XML$B`2,`$@````"`D``*"````/TJ";R!![?^Q)$A*@F\4+P(O"R\*819%Z@`$-
XM5X)/[P`,8.A@G$S?#`1.74YU2.<\,"1O`!PF;P`@)"\`)!`22(!(P`2`````\
XM(`*`````/^6`$BH``4B!2,$$@0```"`"@0```#_H@28`AH$0*@`!2(!(P`2`A
XM````(`*`````/^F`$BH``DB!2,$$@0```"`"@0```#_D@2@`B($0*@`"2(!(C
XMP`2`````(`*`````/^V`$BH``TB!2,$$@0```"`"@0```#\J`(J!#((````!.
XM;0HO"R\#3KH'(%!/#((````";0HO"R\$3KH'#E!/#((````#;0HO"R\%3KH&E
XM_%!/3-\,/$YU2.<X`"@O`!AT`&`F+R\`$$ZZ!;8F``R#_____UA/9@@@`DS?E
XM`!Q.=2!O`!01@R@`4H*TA&W6(`1@Z'(`0V]U;&0@;F]T(')E;W!E;B!M97)G'
XM960@9FEL93H@)R5S)PH`3F\@8F5G:6X@;&EN90H`8F5G:6X@`&)E9VEN("5OE
XM("5S`'<`96YD"@!.;R!E;F0@;&EN90H`+2TM`"TM+2!E;F0`0D5'24X`14Y$W
XM+2T`<V5D`%-(05)?14]&`'5U:F]I;CH@=6YE>'!E8W1E9"!%3T8@:6X@9FELR
XM92`G)7,G(0H`=75J;VEN.B!E<G)O<B!W<FET:6YG('1O('1E;7`@9FEL92`GX
XM)7,G"@!0<F]G<F%M.B!U=6IO:6X@+2!J;VEN(&%N9"!D96-O9&4@57-E;F5T=
XM(&5N8V]D960@8FEN87)Y(&9I;&5S+@!5<V%G93H@("!U=6IO:6X@6V]P=&EO'
XM;G-=(&9I;&4Q(%LN+BX@9FEL96Y=`%=H97)E(%MO<'1I;VYS72!M87D@8F4ZF
XM``DM86UI9V$@("T^('5U96YC;V1E9"!F:6QE<R!W<F%P<&5D('=I=&@@<VAAZ
XM<@`)+6UA8R`@("`M/B!-86-I;G1O<V@@8FEN:&5X(&9I;&5S("AN;W0@9&5C`
XM;V1E9"!I;B!T:&ES(')E;&5A<V4I``DM<&,@("`@("T^('5U96YC;V1E9"!F+
XM:6QE<R!E;F-L;W-E9"!I;B!"14=)3B]%3D0@<&%I<G,`"2UR("`@("`@+3X@.
XM<F5M;W9E(&]R:6=I;F%L(&9I;&5S('=H96X@9&]N90`*"55N:7@M<W1Y;&4@#
XM=VEL9&-A<F1S(&UA>2!B92!U<V5D(&EN(&9I;&4@<W!E8VEF:6-A=&EO;G,NU
XM``H)17AA;7!L93H@=75J;VEN("UA;6EG82`M<B!P<F]G<F%M+C\_``H)36%R5
XM:R!2+B!2:6YF<F5T+"!!=6=U<W0@,3DY,"X`"4-O;G1R:6)U=&5D('1O('1HV
XM92!P=6)L:6,@9&]M86EN+@`M;6%C`"UP8P`M86UI9V$`+7(`1FEL96YA;64@T
XM97AP86YS:6]N(&9A:6QE9"`M(&%B;W)T(0H`4VAO<G0@9FEL90H`3E7_\$CGE
XM```@;0`((FT`""!H``BQZ0`$;0``?"!M``@@:``$T?P````R*TC_]"`M__3EN
XM@"M`__`O+?_P3KHF!%A/*T#_^$JM__AF```,<`%,WP``3EU.=2!M``@A;?_T@
XM``0@;0`(2I!G```D+RW_\"!M``@O$"\M__A.N@SH3^\`#"!M``@O$$ZZ)4!8/
XM3R!M``@@K?_X+RT`#$ZZ(2Q83U*`+P!.NB6<6$\K0/_\2JW__&8```9P`6"6H
XM+RT`#"\M__Q.NB7(4$\@;0`(("@`"%*H``CE@"!M``@@4"&M__P(`'``8`#_$
XM:DY5__I(YP``*VT`"/_\(&W__%*M__P;4/_[9P``(@PM`#__^V<```P,+0`J(
XM__MF```,<`%,WP``3EU.=6#0<`!@\DY5__1(YP``(&T`"%*M``@0$$B`2,`OH
XM`$ZZ%6Q83RM`__P@;0`,4JT`#!`02(!(P"\`3KH54EA/*T#_^"`M__R0K?_X-
XM*T#_]&8``!!*K?_\9P``"$JM__AFKB`M__1,WP``3EU.=4Y5``!(YP``(&T`O
XM#"\0(&T`""\03KK_A%!/3-\``$Y=3G5.5?_H2.<``$*M__!"K?_T0JW_^$*MP
XM__P@+?_PL*T`#&P``'8@+?_P4JW_\.6`(&T`""MP"`#_["\M_^Q.NO[X6$]*J
XM@&<``#@O+?_L3KH1=%A/*T#_Z&<``"(O+?_H2&W_]$ZZ_>I03TJ`9P``#'``;
XM3-\``$Y=3G5@SF```!HO+?_L2&W_]$ZZ_<903TJ`9P``!G``8-I@@"!M`!`@8
XMK?_\2JW_]&<``")*K0`49P``&DAZ_RQ(>``$+RW__"\M__1.N@GJ3^\`$"`M4
XM__1@HDCG`"`D;P`((`IG!DIJ``QF"'#_3-\$`$YU(%*QZ@`$9`H@4E*2<``0:
XM$&#H+PI.NA506$]@WDCG,#(L;P`8)B\`'"1O`"`F3E.#;T8@4K'J``1D"B!2[
XM4I)P`!`08`@O"DZZ%1Y83R0`#(#_____9PX6@E*+#((````*9LQ@%+?.9P@('
XM*@`!``UF"'``3-],#$YU0A,@#F#T2.<@($'O`!0D2"\*+R\`%"\O`!1.NAFBR
XM)``@`D_O``Q,WP0$3G5(YP`@)&\`""`*9QY*$F<:2&R!MB\*3KH`EDAL@;9(Q
XM>@!(3KH`BD_O`!`O+(5(3KH*."1`2H!83V<H2A)G)$AL@;8O+(5(3KH*(%A/+
XM+P!.N@!>2&R!MDAX``I.N@`03^\`$$S?!`!.=3H@``!(YR`@)"\`#"1O`!`@-
XM"F<&2FH`#&8(</],WP0$3G4@4K'J``1D#"!24I(0@G``$`)@YG``$`(O`"\*E
XM3KH>>%!/8-9(YR`P)F\`$"1O`!1@-"!2L>H`!&0,(%)2DA""<``0`F`.<``0K
XM`B\`+PI.NAY&4$\,@/____]F"'#_3-\,!$YU4HL4$V;(<`!@\$CG("!![P`0Y
XM)$@O"B\O`!!(;(&@3KH8A"0`(`)/[P`,3-\$!$YU2.<@,"9O`!!![(&@)$A@0
XM+"!2L>H`!&0,(%)2DA""<``0`F`.<``0`B\`+PI.NAW44$\,@/____]G.%*++
XM%!-FT"!2L>H`!&0.(%)2DA"\``IP`'`*8`Q(>``*+PI.NAVD4$\,@/____]G\
XM"'``3-\,!$YU</]@]DY5_^I(YR`P)&T`"$'M`!`F2#M\`@G_]BM*_^HK2O_R&
XM+PI.NAS2T(HK0/_N+PLO+0`,2&W_ZDZZ`!(D`"`"3^\`$$S?#`1.74YU3E7_:
XM9DCG/S(D;0`()FT`#$*M__AV`!`;2(!(P"0`9P`%O@R"````)68`!1A"+?_SZ
XM>``;1/_R?'\,$P`J9@A2BQM\``'_\Q`32(!(P"0`0>R`B1`P"`!(@`@```)GO
XM-GP`(`8B`.6(T('CB-""+``$A@```#!2BQ`32(!(P"0`0>R`B1`P"`!(@`@`=
XM``)FTAM\``'_\@R"````;&<0#((```!H9P@,@@```$QF!!@"4HL0&TB`2,`KZ
XM0/_T8``$,G0E8``$WGH*8`QZ`&`(>@A@!'AL>A!2@R!2L>H`!&0*(%)2DG``D
XM$!!@""\*3KH1^%A/'@!(@$'L@(D0,```2(`(```$9P)@SE.#+PH0!TB`2,`OE
XM`$ZZ!;P,@/____]03V<`!+Y*AF\`!+@K0__N<``;0/_I2(!(P"M`__Q2@R!2?
XML>H`!&0*(%)2DG``$!!@""\*3KH1DEA/)``,@````"UG"`R"````*V8L#((`+
XM```M9@8;?``!_^E2@R!2L>H`!&0*(%)2DG``$!!@""\*3KH15EA/)``@!6!>1
XM0>R`B1`P*`!(@`@```)G``0V0>R`B1`P*`!(@`@```)G$B`"!(`````P#(``<
XM```';@`$%&`X0>R`B1`P*`!(@`@```)G``0`8"1![(")$#`H`$B`"````V<`<
XM`^Q@$$J`9]11@&>:58!GS%V`9]P@`Y"M_^Y2@+"&;&H,A0```!!G!$J%9EX,T
XM@@```#!F5E*#(%*QZ@`$9`H@4E*2<``0$&`(+PI.NA"F6$\D`"\`3KH/3`R`P
XM````>%A/9B92@R!2L>H`!&0*(%)2DG``$!!@""\*3KH0>%A/)`!*A68">A!@"
XM`GH(2H5F`GH*4X,O"B\"3KH$1D*M_^H,A0````I03V8(*WP````,_^H,A0``^
XM``AF""M\````#O_J8&Q2@R!2L>H`!&0*(%)2DG``$!!@""\*3KH0&%A/)``OE
XM`$'L@`8B;?_JT\@O"4ZZ#LXL0$J`4$]F#E.#+PHO`DZZ`]Q03V`P(@4@+?_\P
XM3KH4CBM`__Q![(`&(`Z0B$'L@!T0,`@`2(!(P-&M__P@`Y"M_^ZPAFV*2BW_4
XMZ6<$1*W__$HM__-F1`P$`&AF$EBM`!`@;0`0(&C__#"M__Y@*`P$`&QF$EBM3
XM`!`@;0`0(&C__""M__Q@$%BM`!`@;0`0(&C__""M__Q2K?_X8``!OBM#__Q3V
XMK?_X8*A2@R!2L>H`!&0*(%)2DG``$!!@""\*3KH/0%A/'@!(@$'L@(D0,```A
XM2(`(```$9P)@SE.#+PH0!TB`2,`O`$ZZ`P0,@/____]03V<``@9X`F`^2BW_#
XM\F8"?`%X`V`R>``,$P!>9@12BW@!0>W_9RQ(#!,`768"'-L0&TB`2,`D`&<,.
XM#((```!=9P0<PF#J0A9*+?_S9@Q8K0`0(&T`$"QH__Q"+?_R(`93ADJ`9P``"
XME%*#(%*QZ@`$9`H@4E*2<``0$&`(+PI.N@Z06$\D``R`_____V=L#`0``F8@3
XM0>R`B1`P*`!(@`@```1G#E.#+PHO`DZZ`E!03V!(8#0,!``";"XO`DAM_V=.B
XMN@T:2H!03V<$<`%@`G``$@1(@4C!L(%F#E.#+PHO`DZZ`AI03V`22BW_\V8"+
XM',(;?``!__)@`/]F2BW_\F<``0I*+?_S9A`,K0```&/_]&<"0A92K?_X8%`$?
XM@````"5G`/O(!(`````S9P#[TE>`9P#^Y%&`9P#^TE.`9P#[LEN`9P#[L%N`1
XM9P#^9%.`9P#[J%.`9P#[IE>`9P#^7%6`9P#[CE>`9P#[EF```)I![(")$#`H%
XM`$B`"```!&=.4H,@4K'J``1D"B!24I)P`!`08`@O"DZZ#7I83QX`2(!![(")V
XM$#```$B`"```!&<"8,Y3@R\*$`=(@$C`+P!.N@$^#(#_____4$]G0&`Z4H,@T
XM4K'J``1D"B!24I)P`!`08`@O"DZZ#2Q83QX`2(!(P+""9Q13@R\*$`=(@$C`?
XM+P!.N@#\4$]@!&``^CI*K?_X9D!2@R!2L>H`!&0*(%)2DG``$!!@""\*3KH,-
XMZ%A/'@`,``#_9@IP_TS?3/Q.74YU4X,O"A`'2(!(P"\`3KH`L%!/("W_^&#@X
XM2.<P,"1O`!0@"F8&0>R#3B1(2'H`BB\*3KH;+%!/,"R#=E)L@W8V`'0`<``P_
XM`W(*3KH97`:`````,'('DH(5@!@`2,.'_``*4H(,@@````5MV$(J``A(>@!*P
XM+PI.N@TT)D!*@%!/9B1(>@`Z+PI.N@TB)D!*@%!/9Q`O"TZZ&!HO"DZZ"R!0]
XM3V`,8`@O"TZZ&`A83V"((`I,WPP,3G5435``<@!W`$CG("`D+P`,)&\`$`R"=
XM_____V<2(`IG#DIJ``QG"`@J``(`#&<(</],WP0$3G5*J@`(9@@O"DZZ&3!8C
XM3R!2L>H`"&80(&H`!+'J``ABV%*2)5(`!$'J``P(J``!``%!Z@`,"-``!%.2%
XM(%(0@G``$`)@MDY5_X!(YS\R+BT`#"0M`!`F+0`42H=F"$S?3/Q.74YU*"T`"
XM"$'M_X`L""("(`=3@$ZZ$!PJ`-J$(@(@!9"$3KH87.*((@).NA`&+$#=Q"1$]
XM)D6USF<2+PXO"B!#3I!*@%!/;`35PF#JO<MG%B\++PX@0TZ02H!03VP((`)$8
XM@-?`8.:URV0<+P(O"R\*3KH">+7.3^\`#&8$+$M@!K?.9@(L2K7+8@C5PB`"=
XM1(#7P+7+8Z`@"Y"$(@62BK"!;!2UQ60,($8@BB!&(44`!%"&*@M@$KB+9`P@K
XM1B"$($8A2P`$4(8H"KB%90#_4$'M_X"QQF00488@1B@0($8J*``$8`#_.&``Y
XM_Q1,[P,```0@""(O``Q@`A#94<G__`2!``$``&KR3G5,[P,```2SR&<,<``0/
XM&+`95LC_^F8$<`!.=6,$<`%.=7#_3G5(YR``)"\`"$J";1H,@@```!)N$B`"A
XMY8!![(`T(#`(`$S?``1.=4'Z`50@"&#R`$YO('-U8V@@9FEL92!O<B!D:7)EO
XM8W1O<GD`07)G(&QI<W0@=&]O(&QO;F<`0F%D(&9I;&4@9&5S8W)I<'1O<@!.=
XM;W0@96YO=6=H(&UE;6]R>0!&:6QE(&5X:7-T<P!);G9A;&ED(&%R9W5M96YT,
XM`$9I;&4@=&%B;&4@;W9E<F9L;W<`5&]O(&UA;GD@;W!E;B!F:6QE<P!.;W0@9
XM82!C;VYS;VQE`%!E<FUI<W-I;VX@9&5N:65D`$DO3R!E<G)O<@!.;R!S<&%C[
XM92!L969T(&]N(&1E=FEC90!297-U;'0@=&]O(&QA<F=E`$%R9W5M96YT(&]U@
XM="!O9B!D;VUA:6X`17AE8R!F;W)M870@97)R;W(`4F5A9"UO;FQY(&9I;&4@$
XM<WES=&5M`$-R;W-S+61E=FEC92!R96YA;64`3F]T:&EN9R!T;R!R96%D`%5N]
XM:VYO=VX@97)R;W(`3.\#```$L\AG'"(O``QG%E.!$!BP&6822@!7R?_V!($`R
XM`0``:NQP`$YU8P1P`4YU</].=4SO`P``!"`O``Q@!A(0$-$2P5'(__@$@``!%
XM``!J[DYU87!#[(-.1>R#3K7)9@XR/`"9:PAT`"+"4<G__"E/A5PL>``$*4Z%$
XM8$CG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G-#^@`@3J[^:"E`A61F#"X\C
XM``.`!TZN_Y1@!$ZZ`!I03TYU9&]S+FQI8G)A<GD`2?D``'_^3G5(YP`P)F\`@
XM$"\.+&R%8"(\``$``#`L@T(O`4C`(@#CB-"!XX@B'TZN_SHL7RE`A6AF'DCG5
XM`08L;(5@F\TN/``!``!.KO^43-]@@"YLA5Q.=2!LA6A":``$(&R%:#%\``$`]
XM$"!LA6@Q?``!``H@;(5<("R%7)"H``10@"E`A6P@;(5L(+Q-04Y8+PXL;(5@(
XMD\E.KO[:+%\D0$JJ`*QG,B\++R\`$"\*3KH`["E\`````85P(&R%:%B(`%"`Q
XM`"!LA6C1_`````H`4(``3^\`#&!6+PXL;(5@0>H`7$ZN_H`L7R\.+&R%8$'J+
XM`%Q.KOZ,+%\I0(5T(&R%=$JH`"1G(B\.+&R%9"!LA70@:``D(A!.KO^"+%\O+
XM+(5T+PI.N@7Z4$\I;(5TA7@O#BQLA61.KO_*+%\@;(5H((`O#BQLA61.KO_$S
XM+%\@;(5H(4``!DJJ`*1G)$CG(`(L;(5D)#P```/M0?H`,"((3J[_XDS?0`0@Q
XM;(5H(4``#"\LA7@O+(5\3KKH:E!/+P!.NA=:6$],WPP`3G4J`$CG.#(F+P`<P
XM*"\`("9O`"0@0TJH`*QG%"!#("@`K.6`+$`@+@`0Y8`D0&`$)&R#1!`22(!(H
XMP-"$5(`I0(6`+PXL;(5@<@`@+(6`3J[_.BQ?*4"%A&8&3-],'$YU$!)(@$C`Y
XM)``O`D'J``$O""\LA81.N@@62'H!1B!"T>R%A"\(3KH4>"\$+PLO+(6$3KH!8
XM,"!LA81","@`*7P````!A7PD0M7LA812BB9*3^\`(!`22(!(P"0`#(`````@B
XM9R`,@@````EG&`R"````#&<0#((````-9P@,@@````IF!%**8,P,$@`@;78,O
XM$@`B9BI2BA`:2(!(P"0`9QP6P@R"````(F80#!(`(F8$4HI@!D(K__]@`F#:R
XM8#@0&DB`2,`D`&<L#((````@9R0,@@````EG'`R"````#&<4#((````-9PP,+
XM@@````IG!!;"8,I"&TJ"9@)3BE*LA7Q@`/]20A,O#BQLA6!R`"`LA7SE@%B`B
XM3J[_.BQ?*4"%>&8(0JR%?&``_M1T`"1LA81@&B`"Y8`@;(5X(8H(`"\*3KH..
XMFM7`4HI83U*"M*R%?&W@(`+E@"!LA7A"L`@`8`#^G"``3.\#```$(`@B+P`,?
XM2AAF_%.($-E7R?_\!($``0``:O)"($YU2.<`,BQO`!!.NA3R2JR`A&8``/Q(H
XM>``J+PY.N@,\2H!03V8@2'@`/R\.3KH#+$J`4$]F$"E\`````H"$(`Y,WTP`W
XM3G4I?`````&`A"\.2&R#>$ZZ$L1(>``O2&R#>$ZZ`R(D0$J`3^\`$&=&0>R#;
XM>+7(8P@,*@`O__]G2D'L@WBUR&="0A)(;(-X3KH`["9`%/P`+R\*2&R#\$ZZ&
XM$GQ"$DAL@WA(;(/(3KH2;D_O`!1@6DAX`#I(;(-X3KH"QB1`2H!03V<J4HHO&
XM"DAL@_!.NA)(0A)(;(-X2&R#R$ZZ$CI(;(/(3KH`DB9`3^\`%&`<2&R#>$AL9
XM@_!.NA(>0BR#R$AL@\AA<B9`3^\`#&`:#*P````"@(1F"D*L@(1P`&``_QY.[
XMN@$R)D`@"V8*0JR`A'``8`#_"DAL@_!!ZP`(+PA.N@%42H!03V8@2&R#R$AL*
XM@WA.NA'$0>L`""\(2&R#>$ZZ!3!/[P`08`1@`/Z<0>R#>"`(8`#^R$CG,#(F(
XM+P`8G<XD;(0<(`IG%B1LA!P@;(0<*5"$'"\*3KH0O%A/8.)(>`$$3KH1*"9`@
XM2H!83V8(<`!,WTP,3G5(YR`"+&R%9'3^(@-.KO^L3-]`!"0`9WA(YR`"+&R%%
XM9"0+(A=.KO^:3-]`!$JK``1O4$CG(`(L;(5D)`LB%TZN_Y1,WT`$2H!G+DJK4
XM``1NXDAX`0A.NA#`)$!*@%A/9QA!Z@`$(DMP0"#94<C__"2LA!PI2H0<8+HIH
XM;(0<A!AA'BQ`+PXL;(5D(@).KO^F+%\O"TZZ$`H@#EA/8`#_7DCG`"!*K(08P
XM9Q8D;(086(H@;(08*5"$&"`*3-\$`$YU*6R$'(089Q0@;(0<*5"$'"\LA!A.Z
XMN@_*6$]@Y'``8-I(YP`R)F\`$"1O`!00$TB`2,`O`$ZZ`)!83R\`$!)(@$C`7
XM+P!.N@"`6$\B'[*`9A!*&V8(<`!,WTP`3G52BF`2#!(`/V8*2A-G!E*+4HI@"
XM`F`"8+@,$@`J9P1P`6#8#!(`*F8,4HI*$F8$<`!@R&#N+PM.N@M*+$#=R]W\>
XM_____UA/8!H0%K`29A(O"B\.3KK_<$J`4$]F!'``8)I3CKW+9.)P`6"0("\`&
XM!`R`````0&,.#(````!:8@8&@````"!.=2!O``1P`!(O``L0&+`!5\C_^F<$C
XM<`!.=5-((`A.=2\O``1.NA"<6$].=2!O``0B2$H89OP0+P`+L\AG"+`@9O@@\
XM"$YU<`!.=4CG.#(F;P`<*"\`("\.+&R%8'``0_H`P$ZN_=@L7RE`A8AF!DS?/
XM3!Q.=2\.+&R%B"!$(&@`)"!H``1.KO^R+%\D0$J`9W@O#BQLA8A#^@"5(&H`L
XM-DZN_Z`L7RQ`2H!G4$CG(`(L;(5D)#P```/M(B\`!$ZN_^),WT`$)@!G,B`#N
XMY8`D`"!")V@`"`"D)T,`G$CG(`(L;(5D)#P```/M0?H`2B((3J[_XDS?0`0GP
XM0`"@+PXL;(6(($I.KO^F+%\O#BQLA6`B;(6(3J[^8BQ?0JR%B&``_U!I8V]NG
XM+FQI8G)A<GD`5TE.1$]7`"H`2.<P,"1O`!0@"F<6<``P*@`,)@!G#`@#``IFL
XM!@@#``-G"'#_3-\,#$YU(%*QZ@`$90``FDJJ``AF""\*3KH-%EA/,"H`#`)`E
XM`*!G,$'L@8HF2'``,"L`#`*```!`(`R```!`(&8(+PM.N@EP6$_7_````!9!\
XM[(-"M\AEUD'J``P"4*__+RH`$"\J``@0*@`.2(!(P"\`3KH#>B0`3^\`#&X<P
XM2H)F!'`"8`)P!$'J``QR`#(0@($P@'#_8`#_:"2J``@@0M'J``@E2``$(%)2`
XMDG``$!!@`/].2'C__TZZ`.XO`"\O`!`O+P`03KH`"$_O`!!.=4CG/#(L;P`@'
XM)&\`)"9O`"@H+P`L)CP```0`$!)(@$C`*@`,@````')F#B0\```0`"8\```"_
XM`&`H#(4```!W9@@D/```$P%@&`R%````868()#P``!D!8`AP`$S?3#Q.=5**N
XM$!)(@`Q``"MF#!`J``%(@`Q``&)G#!`22(`,0`!B9@I2B@C#``0(@@`,$!)(J
XM@`Q``"MF&B`""(```"0`",(``2`#`H#___G_)@`(PP`+(`YG#"\"+PY.N@"PN
XM*`!03TJ$;90,A````!1LC!=$``XW0P`,(`M@@DCG`"!![(&*)$A*:@`,9QC5U
XM_````!9![(-"M<AF"'``3-\$`$YU8.)":@`40I)"J@`$0JH`""`*8.9,[P,`Y
XM``0@"$H89OQ32!#99OQ.=4SO`P``!"`((B\`#&`"$-E7R?_\9PP$@0`!``!JI
XM\$YU0AA1R?_\!($``0``:O).=2\O``A(>`,!+R\`#&$&3^\`#$YU2.<^,B9O#
XM`"0J+P`H3KH.!"1LA6AV`&`2(`,B`..(T('CB$JR"`!G$%*#,&R#0K'#;N9X!
XM"&```2H(!0`)9U!(YR`"+&R%9'3_(@M.KO^L3-]`!"P`9S@O#BQLA60B!DZN5
XM_Z8L7R\.+&R%9"(+3J[_N"Q?2H!F&"\.+&R%9$ZN_WPL7R@`#(````#-9@``(
XMU$CG(`(L;(5D)#P```/M(@M.KO_B3-]`!"0`2H)F``"4"`4`"&8&>`%@``"H;
XM2.<@`BQLA60D/````^XB"TZN_^),WT`$)`!F$"\.+&R%9$ZN_WPL7R@`8'HOG
XM#BQLA6!P(4/Z`+A.KOW8+%\L0$J`9Q`O#BQLA6`B5TZN_F(L7V`P2.<P`BQL]
XMA61V`4'Z`)DD""(73J[_T$S?0`Q(YS`"+&R%9';_=``B%TZN_[Y,WT`,8"P@[
XM!0*````%``R````%`&8<+PXL;(5D(@).KO_<+%]X!2E$A4AP_TS?3'Q.=2`#B
XM(@#CB-"!XX@E@@@`(`,B`..(T('CB#6%"`0(!0`+9Q9(YS`"+&R%9'8!=``BN
XM%TZN_[Y,WT`,(`-@OF1O<RYL:6)R87)Y`$CG,#`D+P`4)F\`&$ZZ#%`@`B(`\
XMXXC0@>.()$#5[(5H2H)M##!L@T*QPF\$2I)F$"E\`````X5(</],WPP,3G4PQ
XM*@`$2,`"@`````,,@`````%F#"E\````!H5(</]@VDCG,`(L;(5D)B\`*"0+I
XM(A).KO_63-]`#"8`#(#_____9A0O#BQLA61.KO]\+%\I0(5(</]@I"`#8*!(X
XMYW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`T(),WP`.3G5.5?WT2.<_,B9M7
XM``@L;0`0?@`D;0`,%A)F"B`'3-],_$Y=3G52B@P#`"5G0B0'(%.QZP`$9`P@S
XM4U*3$(-P`!`#8`YP`!`#+P`O"TZZ!4)03PR`_____V<`!'A2@A829@0@`F"XA
XM4HH,`P`E9L(N`G@`*WP````@__P6&G``$`-@:`C$``!@\@C$``%@[`C$``)@"
XMY@C$``-@X$WN``0D+O_\2H)L!@C$``!$@A8:8%8K?````##__'0`8!@@`N>`^
XM<@`2`]"!T(+0@B0`!((````P%AIP`!`#0>R`B1`P``!(@`@```)FU&`<!$``+
XM(&>>5T!GH%]`9Z)30&>,54!G@E=`9ZQ@LBM"__@D/```?<8,`P`N9EX6&@P#R
XM`"IF%DWN``0D+O_\2H)L!B0\``!]QA8:8#!T`&`8(`+G@'(`$@/0@=""T((DH
XM``2"````,!8:<``0`T'L@(D0,```2(`(```"9M0,@@``?<9G""M\````(/_\M
XM*@(,`P!H9@8(Q``'8!8,`P!L9@8(Q``&8`H,`P!,9@8(Q``(%AHK2@`,<``0'
XM`V```9Y@``,J"`0`!V<,3>X`!"!N__PPAV`<"`0`!F<,3>X`!"!N__P@AV`*N
XM3>X`!"!N__P@AW0`8``!LDWN``0D;O_\+PI.N@,0)``,A0``?<983V<&M(5O*
XM`B0%8``!CDWN``06+O__0>W]^"1($(-T`6```7AT"&`0`$0`2'9X=!!@!@C$G
XM``1T"@P#`%AF"$'Z`J0@"&`&0?H"K2`(*T#]]`@$``9G"DWN``0L+O_\8!@(+
XM!``$9PI-[@`$+"[__&`(3>X`!"PN__P(!``$9PI*AFP&1(8(Q``%0>W_^"1(X
XM#(4``'W&9@)Z`4J&9@1*A6<<(`8B`DZZ!88@;?WT%3`(`"`&(@).N@6"+`!F6
XMY$'M__B1RB0("`0``V=N#`,`;V842H)G"@P2`#!G"+2%;00J`E*%8%0,`P!X.
XM9P8,`P!89DA*@F=$#!(`,&<^M(5L$$'M_?JQRF0(%3P`,%*"8.P(!```9AP,H
XMK0```##__&82(`)4@+"M__AL""HM__A5A6#*%0,5/``P5(*TA6P00>W]^+'*B
XM9`@5/``P4H)@[&!,!$``)6<`_L($0``S9P#^T@1```MG`/ZJ4T!G`/[(6T!G7
XM`/["6T!G`/Y`4T!G`/ZH4T!G`/ZF5T!G`/YB54!G`/ZH5T!G`/Z:8`#^&@@$8
XM``1G*`@$``5G!A4\`"U@&@@$``%G!A4\`"M@#@@$``)G!A4\`"!@`E."4H+>"
XM@@@$``!F``"0#*T````P__QF0@@$``1G/#`$`D``)F<T(%.QZP`$9`X@4U*37
XM$)IP`!`J__]@#G``$!HO`"\+3KH!DE!/#(#_____9P``R%.M__A3@F`T(%.QX
XMZP`$9!`@4U*3$*W__W``$"W__V`0<``0+?__+P`O"TZZ`5A03PR`_____V<`4
XM`(Y2AR`M__A3K?_XL()NP"H"(`)3@DJ`9RX@4['K``1D#B!34I,0FG``$"K_T
XM_V`.<``0&B\`+PM.N@$24$\,@/____]G2&#*"`0``&<\)`5@+"!3L>L`!&0.T
XM(%-2DQ"\`"!P`'`@8`Q(>``@+PM.N@#<4$\,@/____]G$E*'("W_^%.M__BP2
XM@F[(8`#[1'#_8`#[2#`Q,C,T-38W.#E!0D-$148`,#$R,S0U-C<X.6%B8V1E'
XM9@`@;P`$(`A*&&;\4TB1P"`(3G5(YP`@)&\`""`*9D1![(&*)$A*:@`,9R8P;
XM*@`,`D`""&8<2'C__R\*3KH`6@R`_____U!/9@AP_TS?!`!.==7\````%D'LG
XM@T*UR&7&<`!@Z$AX__\O"DZZ`"Q03V#:2.<`($'L@8HD2"\*3KH!F%A/U?P`N
XM```60>R#0K7(9>I,WP0`3G5(YSP@)&\`&"@O`!P@"F<``6HT*@`,9P`!8@@"I
XM``EF``%:"`(``V8``5)!Z@`,`E#O_4JJ``AF'`R$_____V8(<`!,WP0\3G4O*
XM"DZZ`JHT*@`,6$\(`@`.9C0@4K'J``AC'DAX``$@$I"J``0O`!`J``Y(@$C`/
XM+P!.N@0D3^\`#"2J``@@:@`0T=(E2``$#(3_____9@1V`&`"%@0@$I"J``@JS
XM`#`"`D``H&=&#(3_____9QH@4E*2$(-!Z@`,"-``!C000?K_%"E(A8Q2A0R$'
XM_____V<,#`,`"F<&NJH`$&4$>/]@#"52``1P`!`#8`#_4@@"``YG*$J%9QPO,
XM!2\J``@0*@`.2(!(P"\`3KH$5K"%3^\`#&9.0>H`#`B0``8,A/____]F$B2JI
XM``@E:@`(``1P`!`#8`#_"D'Z_IXI2(6,0>H`#`C0``8DJ@`((&H`$-'2)4@`]
XM!"!24I(0@W``$`-@`/[>0>H`#`CH``(``25J``@`!"2J``AP_V``_L1.5?_VP
XM2.<X("1M``AT`"`*9P9*:@`,9@IP_TS?!!Q.74YU""H``0`,9@HO"DZZ_<Z$"
XM@%A/$"H`#DB`2,`O`$ZZ!E2$@`@J````#5A/9PHO*@`(3KH!F%A/2FH`%&=.1
XM2'H`:DAM__=.N@)&."H`%'8`4$]P`#`$<@I.N@!\!H`````P<@>2@T'M__<1/
XM@!@`2,2)_``*4H,,@P````5MU$(M__](;?_W3KH#!EA/0I)"J@`$0JH`"$)J1
XM``Q*@F<&</]@`/]8<`!@`/]25$U0`$CG2`!"A$J`:@1$@%)$2H%J!D2!"D0`:
XM`6$^2D1G`D2`3-\`$DJ`3G5(YT@`0H1*@&H$1(!21$J!:@)$@6$:(`%@V"\!T
XM81(@`2(?2H!.=2\!808B'TJ`3G5(YS``2$%*068@2$$V`30`0D!(0(##(@!(K
XM0#("@L,P`4)!2$%,WP`,3G5(028!(@!"04A!2$!"0'0/T(#3@;:!8@22@U)`#
XM4<K_\DS?``Q.=4CG("`D;P`,=$$0*@`.2(!(P"\`3KH!,$J`6$]G!'0A8`A!C
XM[(&VM<AG&"5\```$```02'@$`$ZZ`+8E0``(6$]F%"5\`````0`00>H`#R5(]
XM``@T/`"`0>H`#'``,!`R`DC!@($P@"5J``@`!"2J``A,WP0$3G5(YP`R+&\`P
XM$)?+)&R%D&`,0>H`"+W(9PXF2B12(`IF\$S?3`!.=2`+9P0FDF`$*5*%D"\./
XM+&R%8"`J``10@")*3J[_+BQ?8-A(YP`P)&R%D&`8)E(O#BQLA6`@*@`$4(`BA
XM2DZN_RXL7R1+(`IFY$*LA9!,WPP`3G5(YR`@)"\`#$J"9@AP`$S?!`1.=2\.)
XM+&R%8'(`(`)0@$ZN_SHL7R1`2H!F!'``8-Y!^O^>*4B%E"2LA9`E0@`$*4J%1
XMD"`*4(!@Q$SO`P``!"`($-EF_$YU2.<@("0O``P@`B(`XXC0@>.()$#5[(5HQ
XM2H)M##!L@T*QPF\$2I)F$"E\`````X5(</],WP0$3G4O#BQLA60@`B(`XXC0U
XM@>.((&R%:"(P"`!.KO\H+%]*@&<$<`%@`G``8-!(YS`@)"\`$$ZZ`6H@`B(`N
XMXXC0@>.()$#5[(5H2H)M##!L@T*QPF\$2I)F$"E\`````X5(</],WP0,3G5(!
XMYS`"+&R%9"`O`"13@"8`)"\`("(23J[_ODS?0`PF``R`_____V84+PXL;(5D#
XM3J[_?"Q?*4"%2'#_8+Y(YS`"+&R%9'8`=``B$DZN_[Y,WT`,8*9(YP`@)&\`=
XM""\.+&R%9"(*3J[_N"Q?2H!F&"\.+&R%9$ZN_WPL7RE`A4AP_TS?!`!.=7``_
XM8/9(YS`P)"\`%"9O`!A.N@"@(`(B`..(T('CB"1`U>R%:$J";0PP;(-"L<)OF
XM!$J29A`I?`````.%2'#_3-\,#$YU,"H`!`)```-F#"E\````!H5(</]@Y`@JR
XM``,`!&<62.<P`BQLA61V`70`(A).KO^^3-]`#$CG,`(L;(5D)B\`*"0+(A).%
XMKO_03-]`#"8`#(#_____9A0O#BQLA61.KO]\+%\I0(5(</]@D"`#8(Q(YR``/
XM+PXL;(5@(CP``!``<`!.KO[.+%\D``@```QG$DJLA7!F""`"3-\`!$YU3KH`1
XM!G``8/)(YS`"+&R%9'8$0?H`*B0(+P,O`BQLA61.KO_$(@`D'R8?3J[_T$S?X
XM0`Q(>``!3KH`"EA/3G5>0PH`2JR%F&<4(&R%F"!H``1.D"!LA9@I4(688.9*D
XMK(6,9P8@;(6,3I`O+P`$3KH`!EA/3G5(YS``)B\`#$JLA6AG-'0`8`HO`DZZ4
XM`4I83U*",&R#0K'";NXO#BQLA6`P+(-"2,`B`..(T('CB")LA6A.KO\N+%]*;
XMK(649P8@;(643I!*K(-(9Q`O#BQLA60B+(-(3J[_IBQ?2JR%G&<((&R%G""LO
XMA:!*K(6D9Q`O#BQLA6`B;(6D3J[^8BQ?2JR%J&<0+PXL;(5@(FR%J$ZN_F(LJ
XM7TJLA:QG$"\.+&R%8")LA:Q.KOYB+%]*K(6P9Q`O#BQLA6`B;(6P3J[^8BQ?C
XM2.<`!BQX``0(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G,J7TJLA71F-$JLA81G\
XM+"\.+&R%8"`LA8`B;(6$3J[_+BQ?+PXL;(5@("R%?.6`6(`B;(5X3J[_+BQ?%
XM8!PO#BQLA6!.KO]\+%\O#BQLA6`B;(5T3J[^ABQ?+PXL;(5@(FR%9$ZN_F(L]
XM7R`#+FR%7$YU3-\`#$YU2.<@("0O``P@`B(`XXC0@>.()$#5[(5H2H)M##!LF
XM@T*QPF\$2I)F$"E\`````X5(</],WP0$3G4P*@`$`D"``&8.+PXL;(5D(A).K
XMKO_<+%]"DG``8-P``````^P````!`````0``&.X````````#\@```^H```#3`
XM`````$%"0T1%1F%B8V1E9CDX-S8U-#,R,3``"@L,#0X/"@L,#0X/"0@'!@4$T
XM`P(!`````!;*```6RP``%N4``!;W```7"P``%QT``!<I```7.@``%TX``!=B4
XM```7<```%X(``!>,```7I```%[4``!?,```7W@``%_0``!@(````$P``````@
XM("`@("`@("`@,#`P,#`@("`@("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`@
XM0$!`#`P,#`P,#`P,#$!`0$!`0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!!
XM`4!`0$!`0`H*"@H*"@("`@("`@("`@("`@("`@("`@("0$!`0"``````````%
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM```````````````````````````````````````````````````````````""
XM`````````0``````````````````!``!``````$```````````````````0`+
XM`@`````!````````````````````````````````````````````````````#
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM```````````````````````````````4`````````````````^P````3````6
XM`````#(````V````.@```#X```!"````1@```$H```!.````4@```%8```!:"
XM````7@```&(```!F````:@```&X```!R````=@```'H````````#\@```^L`#
X'```!```#\F(`8
X``
Xend
Xsize 14272
END_OF_FILE
if test 20021 -ne `wc -c <'UUJoin.uu'`; then
    echo shar: \"'UUJoin.uu'\" unpacked with wrong size!
fi
# end of 'UUJoin.uu'
fi
if test -f 'makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(828 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X# Default Aztec C makefile
X#
X#
X# Define INCDIR to be the name of the directory where FileScan.h is stored,
X# If it's not in your normal include path. Otherwise, remove the -I
X# option from the compiler flags.
X
XINCDIR = src:mrrlib
X
X# Debug version
X#CFLAGS = -DAMIGA -pa -bs -I$(INCDIR)
X#LFLAGS = -g
X
X# Non-debug version:
XCFLAGS = -DAMIGA -pa -so -I$(INCDIR)
XLFLAGS = 
X
XPROGRAM=UUJoin
XSHARFILES = UUJoin.ReadMe UUJoin.uue UUJoin.c makefile FileScan.c FileScan.h
X
X$(PROGRAM): $(PROGRAM).o
X    ln $(LFLAGS) -o $(PROGRAM) $(PROGRAM).o FileScan.o -lc 
X
Xshar: $(SHARFILES)
X    makekit -n UUJOIN $(SHARFILES)
X    rm FileScan.*
X
XUUJoin.uue: UUJoin
X    uuencode >UUJoin.uue UUJoin UUJoin
X
XFileScan.c: src:MRRLib/FileScan.c
X    cp src:MRRLib/FileScan.c FileScan.c
X
XFileScan.h: src:MRRLib/FileScan.h
X    cp src:MRRLib/FileScan.h FileScan.h
END_OF_FILE
if test 828 -ne `wc -c <'makefile'`; then
    echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.