[comp.sys.amiga] SPUDclock

youngb@pur-ee.UUCP (H. Bret Young) (08/03/88)

Hello everybody,

Sometime back there was a discussion about talking clock programs. I replied
and said a friend of mine and me had already written one and that I would post
it when I got the doc's done. I did that and sent it to the binaries/sources
group and waited and waited and ... waited. I sent mail to see what was going
on and did not receive a reply. I don't think the moderators are ignoring me but
something is screwy with the mails around here.

Anyway, I am posting it here since I said I would send it out and can't seem
to get it to the moderated group. It's short too. Hope some of you find it 
useful. I have used it for quite some time without any problems.

				Bret

usenet:  ihnp4!pur-ee!youngb
ARPA:    youngb@eg.ecn.purdue.edu
UUCP:    youngb@pur-ee.uucp

P.S.   If anybody adds any interesting features (like IFF sound instead of 
the narrator device) I would appreciate getting a copy with the additions.


#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	spudclock.doc
#	makefile
#	spudclock.c
#	spudclock.uu
# This archive created: Wed Jun 29 01:46:47 1988
# By:	H. Bret Young ()
export PATH; PATH=/bin:$PATH
if test -f 'spudclock.doc'
then
	echo shar: will not over-write existing file "'spudclock.doc'"
else
cat << \SHAR_EOF > 'spudclock.doc'
                      The Man From S.P.U.D. 

                            Presents


		            SPUDclock

SPUDclock is a simple program that uses the narrator device to output (say)
the time at certain user specified intervals. It was written mainly to
remind you of the time when you are busy working on the computer. (I used
to miss the beginings of alot of TV shows until this was written). 

To use it simply type at a CLI prompt:

    run spudclock [options]

NOTE: You need to RUN it the first time but if you invoke it later to change
some options you do not need the RUN. (Once the options are changed the later
copy dies leaving only one copy in memory).

The options are zero or more of the following.

	-f		The time is spoken every quarter hour on the quarter
			hour.

	-t		The time is spoken every half hour on the half hour.

	-h		The time is spoken every hour on the hour.

	-p		The speakers are prestarted. This is if you have 
			some amplified speakers that sense a signal and then
			start amplification after a small delay. You don't
			need this option if you are hooked up to your monitor.

	-s nnnn		Sets the starting time. See note below.

	-e nnnn		Sets the ending time. See note below.

	-v nn		Sets the volume. Where 0 < nn < 64.

	-m message	Says message before saying the time.

	-l		Lists the current settings.

	-d		Causes any unspecified option to revert to their
			defaults. Normally only the values associated with the
			options specified on the command line are changed.

	-q		Kills the main running copy of SPUDclock.


Setting Starting and Stopping Times

With the -s and -e options you can tell SPUDclock when to start and stop
speaking the time. This is if you are like me and leave your computer on all
the time and don't want to get waken up every half hour. The format for the
times is hhmm. (h - hours, m - minutes, 24 hour time)
If you want to start at 8:30 AM and stop at 11:00 PM then part of your option
set would be:
		-s 830 -e 2300

"Good Morning" is spoken after the starting time and "Good Night" is
spoken after the ending time. Also, times are spoken intelligently (i.e as
a human would say them.

The defaults are:

	Time spoken every half hour.
	No speaker prestart.
	Starting time 830.
	Ending time 2300.
	Alarm volume 50.

These can be changed in the source and recompiled if desired. The executable
was compiled under Lattice 3.10 and the makefile is included.

Any of the options may be changed at any time by invoking the program with
the desired options (use the -d option to put unspecified values at their
defaults).

Example:

My startup-sequence contains the line:

	run spudclock -m mister poetaytoe head says -s 700 -e 2200

so at 10:00 PM the amiga says:

	"mister potato head says it is now ten o'clock, good night"


This program can be distributed and copied freely. If you feel you want to
send a contribution, we'll be glad to accept it. That's up to you though.

Brought to you by 

		The Man From S.P.U.D.

		(H. Bret Young and Bob Beaty)


usenet:  ihnp4!pur-ee!youngb
ARPA:    youngb@eg.ecn.purdue.edu
UUCP:    youngb@pur-ee.uucp


US Mail:

H. Bret Young
716 N. 31st Street
Lafayette, IN 47904

SHAR_EOF
fi # end of overwriting check
if test -f 'makefile'
then
	echo shar: will not over-write existing file "'makefile'"
else
cat << \SHAR_EOF > 'makefile'
#
#  makefile for SPUDclock
#

SPUDclock: SPUDclock.o
	@ blink FROM LIB:c.o+SPUDclock.o \
	      TO SPUDclock \
	      LIB LIB:lc.lib+LIB:amiga.lib \
	      NODEBUG \
	      SMALLDATA \
	      SMALLCODE

SPUDclock.o: SPUDclock.c
	@ lc -b -r SPUDclock.c
SHAR_EOF
fi # end of overwriting check
if test -f 'spudclock.c'
then
	echo shar: will not over-write existing file "'spudclock.c'"
else
cat << \SHAR_EOF > 'spudclock.c'
/*************************************************************************
 *
 *  SPUDclock - This program does a nice little talking alarm clock
 *  
 *  This was written by Robert E. Beaty and H. Bret Young and
 *  are Copyright (C) 1987 by R.E.Beaty and H. Bret Young and
 *  The Man From S.P.U.D.
 *
 *  v1.2
 *************************************************************************/

/* Get the necessary include files for this program */
#include <exec/types.h>
#include <exec/exec.h>
#include <devices/narrator.h>
#include <devices/timer.h>
#include <libraries/translator.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>
#include <string.h>

/*
 * Here are some necessary defines for processing needs
 */
#define REVISION	1
#define TASK_PRIORITY	0

/*
 * Here are some necessary return codes for various routines
 */
#define NORMAL_EXIT		0
#define NORMAL_START		0
#define QUICK_EXIT		-10
#define QUICK_START		-20
#define CANT_OPEN_INTUITION	-100
#define CANT_OPEN_TRANSLATOR	-200
#define CANT_OPEN_NARRATOR	-300
#define CANT_OPEN_TIMER		-400
#define CREATE_PORT_PROBLEMS	-500
#define CREATE_IO_PROBLEMS	-600
#define TRANSLATOR_NOT_WORKING	-700

/* 
 * Here are the variable values that come in handy
 */
#define QUARTER_HOUR		1
#define HALF_HOUR		2
#define HOUR			4
#define LITTLE			1
#define BIG			2

#define	AM_BIT			(1<<0)
#define PS_BIT			(1<<1)
#define	SA_BIT			(1<<2)
#define	EA_BIT			(1<<3)
#define	AV_BIT			(1<<4)
#define	S_BIT			(1<<5)

/* 
 * Here are the global structures
 */
struct timerequest timeReq;	/* this is my conduit to the timer */
struct MsgPort *clockPort = NULL, *writePort = NULL, 
               *replyPort = NULL, *timerPort = NULL;
struct narrator_rb *writeNarrator = NULL;
struct IntuitionBase *IntuitionBase = NULL;
struct Library *TranslatorBase = NULL;
struct DateStamp now;
struct PacketMessage {
	struct Message packet_message;		/* this is for DOS */
	int alarm_mode,		/* this will tell us how often to alarm */
	    prestart,		/* this will tell if we prestart the speakers */
	    start_alarm,	/* this is the starting time */
	    end_alarm,		/* this is the ending time */
	    alarm_volume,	/* this is how loud to make it */
	    quit_flag;		/* this will tell when to quit */
	char salutation[80];	/* this is a little saying before the time */
        int change_flags,
            changing,
            listing;
	};

/* 
 * Here are the global variables
 */
UBYTE *sampleInput, outputString[500];	/* these are for the translator */
SHORT rtnCode, error;
BYTE audChanMasks[4] = { 3, 5, 10, 12 };	/* which channels to use */
int signal, timer_signal, port_signal;	/* where the message came from */
int alarm_mode, quit_flag, prestart, alarm_volume;
int start_alarm, end_alarm, alarm_time;
int hours_24, hours_12, minutes;
char *cp, salutation[80], alarm[120];
struct PacketMessage *incoming, *outgoing;



/************************************************************************
 *
 *  cprintf( why ) - This routine does simple string printing to
 *  		     the console, and so saves us loading the printf
 *  		     routines.
 *
 *  This code section was written by Robert E. Beaty and
 *  are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
 *
 ************************************************************************/
cprintf( arg )
char *arg;
{
    int length;

    length = Write( Output(), arg, strlen(arg) );
    return( length );
}   /* end of cprintf(); */



/************************************************************************
 *
 *  itoa( string, value ) - This routine does simple integer to ascii
 *  			    conversion. NOTE: value < 9999 !!
 *
 *  This code section was written by Robert E. Beaty and
 *  are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
 *
 ************************************************************************/
void itoa( carg, varg )
char *carg;
int varg;
{
    int place;

    /* reset where I am putting this stuff */
    place = 0;

    if ( varg > 999 ) {
        /* do the most thousands digit */
        carg[place++] = '0' + (varg/1000);
        varg = varg - (1000*(varg/1000));
    }
    if ( (varg > 99) || (place != 0) ) {
        /* do the hundreds digit */
        carg[place++] = '0' + (varg/100);
        varg = varg - (100*(varg/100));
    }
    if ( (varg > 9) || (place != 0) ) {
        /* do the tens digit */
        carg[place++] = '0' + (varg/10);
        varg = varg - (10*(varg/10));
    }
    /* always do the ones digit */
    carg[place++] = '0' + varg;

    /* null terminate this string */
    carg[place] = '\0';
}   /* end of itoa(); */



/************************************************************************
 *
 *  CloseNarrator( why ) - This routine closes up the narrator and
 *  		           translator devices nicely.
 *
 *  This code section was written by Robert E. Beaty and
 *  are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
 *
 ************************************************************************/
void CloseNarrator( why )
int why;
{
    /* Check to see if this was called by OpenNarrator() */
    if ( why != CANT_OPEN_NARRATOR ) {
        if ( writeNarrator != NULL )
            CloseDevice( writeNarrator );
    }
    /* Just start deleting things if they exist */
    if ( writeNarrator != NULL )
        DeleteExtIO( writeNarrator, sizeof(struct narrator_rb) );
    if ( writePort != NULL )
        DeletePort( writePort );
    if ( TranslatorBase != NULL )
        CloseLibrary( TranslatorBase );
}   /* end of CloseNarrator(); */



/************************************************************************
 *
 *  OpenNarrator() - This routine opens up the narrator and translator
 *  		     devices nicely. It will return non-FALSE if an error
 *  		     occured.
 *
 *  This code section was written by Robert E. Beaty and
 *  are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
 *
 ************************************************************************/
OpenNarrator( )
{
    int error;

    /* Open up the translator first */
    TranslatorBase = (struct Library *) OpenLibrary( "translator.library", REVISION );
    if ( TranslatorBase == NULL )
        return( CANT_OPEN_TRANSLATOR );
        
    /* test it */
    sampleInput = "this is a test.";
    rtnCode = Translate( sampleInput, strlen(sampleInput), outputString, 500 );
    if ( rtnCode != 0 ) {
        CloseLibrary( TranslatorBase );		/* this is open, so close */
        return( TRANSLATOR_NOT_WORKING );
    }   /* end of error checking the translator */

    /* Create the port to the Narrator */
    writePort = (struct MsgPort *) CreatePort( "SPUDclock.narrator", TASK_PRIORITY );
    if ( writePort == NULL ) {
        CloseLibrary( TranslatorBase );		/* this is open, so close */
        return( CREATE_PORT_PROBLEMS );
    }   /* end of error checking the port creation */

    /* Open an I/O channel to the Narrator */
    writeNarrator = (struct narrator_rb *) CreateExtIO( writePort, sizeof(struct narrator_rb) );
    if ( writeNarrator == NULL ) {
        DeletePort( writePort );		/* this port is open */
        CloseLibrary( TranslatorBase );		/* this is open, so close */
        return( CREATE_IO_PROBLEMS );
    }   /* end of error checking I/O creation */

    /* Now set up the defaults for the narrator port */
    writeNarrator->ch_masks = audChanMasks;	/* ... the channel masks */
    writeNarrator->nm_masks = sizeof(audChanMasks);	/* ... the size */
    writeNarrator->message.io_Data = (APTR)outputString;	/* data */
    writeNarrator->mouths = 0;		/* we don't want shapes computed */
    writeNarrator->message.io_Command = CMD_WRITE;	/* output command */

    /* Finally, open the narrator device */
    error = OpenDevice( "narrator.device", 0, writeNarrator, TASK_PRIORITY );
    if ( error != 0 ) {
        CloseNarrator( CANT_OPEN_NARRATOR );	/* close it all up */
        return( CANT_OPEN_NARRATOR );
    }   /* end of checking narrator device opening */
    
    /* no errors so return FALSE */
    return( FALSE );
}   /* end of OpenNarrator(); */



/************************************************************************
 *
 *  init( how ) - This routine opens everything up and returns non-FALSE
 *  	          if something went wrong.
 *
 *  This code section was written by Robert E. Beaty and
 *  are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
 *
 ************************************************************************/
init( how )
int how;
{
    int error;

    /* Open up Intuition first */
    if ( IntuitionBase == NULL ) {
        IntuitionBase = (struct IntuitionBase *) OpenLibrary( "intuition.library", REVISION );
        if ( IntuitionBase == NULL )
            return( CANT_OPEN_INTUITION );
    }   /* end of opening intuition if needed */
    /* if this is a quick start, then only open up intuition */
    if ( how == QUICK_START ) return( FALSE );

    /* Open the communication port to other copies of SPUDclock */
    clockPort = (struct MsgPort *) CreatePort( "SPUDclock", TASK_PRIORITY );
    if ( clockPort == NULL ) {
        CloseLibrary( IntuitionBase );		/* this is open, so close */
        return( CREATE_PORT_PROBLEMS );
    }   /* end of error checking the port creation */

    /* Now open the narrator */
    error = OpenNarrator();
    if ( error ) {
        DeletePort( clockPort );
        CloseLibrary( IntuitionBase );
        return( error );
    }   /* end of error checking the narrator opening */
    
    /* Now create the timer */
    timerPort = (struct MsgPort *) CreatePort( "SPUDclock.timer", TASK_PRIORITY );
    if ( timerPort == NULL ) {
        CloseNarrator( CANT_OPEN_TIMER );
        DeletePort( clockPort );
        CloseLibrary( IntuitionBase );		/* this is open, so close */
        return( CREATE_PORT_PROBLEMS );
    }   /* end of error checking the port creation */

    error = OpenDevice( TIMERNAME, UNIT_VBLANK, (char *) &timeReq, TASK_PRIORITY );    
    if ( error != 0 ) {
        DeletePort( timerPort );
        CloseNarrator( CANT_OPEN_TIMER );
        DeletePort( clockPort );
        CloseLibrary( IntuitionBase );		/* this is open, so close */
        return( CANT_OPEN_TIMER );
    }

    /* Everything is open O.K., so get the signal bits */
    timer_signal = 1 << timerPort->mp_SigBit;
    port_signal = 1 << clockPort->mp_SigBit;
    
    /* ... and set up the timer request structure */
    timeReq.tr_node.io_Message.mn_ReplyPort = timerPort;
    timeReq.tr_node.io_Command = TR_ADDREQUEST;
    timeReq.tr_node.io_Flags = 0;
    timeReq.tr_node.io_Error = 0;

    /* no errors, so return FALSE */
    return( FALSE );
}   /* end of init(); */



/************************************************************************
 *
 *  clean( why ) - This routine cleans everything up.
 *
 *  This code section was written by Robert E. Beaty and
 *  are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
 *
 ************************************************************************/
void clean( why )
int why;
{
    /* Abort the timer request pending */
    if ( timeReq.tr_node.io_Message.mn_ReplyPort != NULL )
        AbortIO( (char *) &timeReq.tr_node );

    /* if we want a quick exit then skip this stuff */
    if ( why == QUICK_EXIT ) goto quick;

    /* just call the clean up routines */
    if ( timerPort != NULL ) DeletePort( timerPort );
    CloseNarrator( why );
    if ( clockPort != NULL ) DeletePort( clockPort );
    quick:
    if ( IntuitionBase != NULL ) CloseLibrary( IntuitionBase );
}   /* end of clean(); */



/************************************************************************
 *
 *  bed_bye( how_much ) - This routine submits a timer event for us
 *
 *  This code section was written by Robert E. Beaty and
 *  are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
 *
 ************************************************************************/
void bed_bye( how_much )
int how_much;
{
    /* See how long the sleep is for */
    if ( how_much == LITTLE ) {
        timeReq.tr_time.tv_secs = 5;		/* little is 5 sec. */
        timeReq.tr_time.tv_micro = 0;
    }
    else {
        timeReq.tr_time.tv_secs = 885;		/* big is 14 min 45 sec. */
        timeReq.tr_time.tv_micro = 0;
    }
    /* ... and send it out to be done */
    SendIO( (char *) &timeReq.tr_node ); 
}   /* end of bed_bye(); */



/************************************************************************
 *
 *  speak_time( hrs, mins ) - This routine formats and speaks the time.
 *
 *  This code section was written by Robert E. Beaty and
 *  are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
 *
 ************************************************************************/
void speak_time( hrs, mins )
int hrs, mins;
{
    /* 
     * First, see if we need to prestart the speakers 
     */
    if ( prestart )
        cp = stpcpy( alarm, "t,," );
    else
        cp = alarm;

    /*
     * Build up the string to speak
     */
    /* start with the salutation */
    cp = stpcpy( cp, salutation );
    /* ... add the time is stuff */
    cp = stpcpy( cp, ", It is now " );
    /* check for quarter till */
    if ( (alarm_mode == QUARTER_HOUR) && (mins == 45) ) {
        cp = stpcpy( cp, "quarter till " );
        /* check to see that it makes sense */
        if ( (++hrs) == 13 ) hrs = 1;
    }
    /*
     * always add the hour
     */
    switch( hrs ) {
        case 1 : cp = stpcpy( cp, "1 " );  break;
        case 2 : cp = stpcpy( cp, "2 " );  break;
        case 3 : cp = stpcpy( cp, "3 " );  break;
        case 4 : cp = stpcpy( cp, "4 " );  break;
        case 5 : cp = stpcpy( cp, "5 " );  break;
        case 6 : cp = stpcpy( cp, "6 " );  break;
        case 7 : cp = stpcpy( cp, "7 " );  break;
        case 8 : cp = stpcpy( cp, "8 " );  break;
        case 9 : cp = stpcpy( cp, "9 " );  break;
        case 10 : cp = stpcpy( cp, "ten " );  break;
        /* the number 11 sounds better spelled 'eelaven' */
        case 11 : cp = stpcpy( cp, "eelaven " );  break;
        case 12 : cp = stpcpy( cp, "twelve " );  break;
    }   /* end of decoding the hours */
    /*
     * decode the different modes
     */
    switch( alarm_mode ) {
        case QUARTER_HOUR :
            switch( mins ) {
                case 0 : cp = stpcpy( cp, "o'clock." );  break;
                case 15 : cp = stpcpy( cp, "fifteen." );  break;
                case 30 : cp = stpcpy( cp, "thirty." );  break;
                case 45 : cp = stpcpy( cp, "." );  break;
                /* if we aren't where we are supposed to be, NULL it out */
                default : cp = NULL;  break;
            }
            break;
        case HALF_HOUR :
            switch( mins ) {
                case 0 : cp = stpcpy( cp, "o'clock." );  break;
                case 30 : cp = stpcpy( cp, "thirty." );  break;
                /* if we aren't where we are supposed to be, NULL it out */
                default : cp = NULL;  break;
            }
            break;
        case HOUR :
            if ( mins == 0 )
                cp = stpcpy( cp, "o'clock." );
            else
                /* if we aren't where we are supposed to be, NULL it out */
                cp = NULL;
            break;
    }   /* end of alarm_mode selection */

    /*
     * If the time section is not NULL, do the rest
     */
    if ( cp != NULL ) {
        /*
         * ... add the "Good morning..." or "Good night..."
         */
        if ( start_alarm != end_alarm ) {
            if ( alarm_time == start_alarm )
                cp = stpcpy( cp, ",, Good Morning!" );
            if ( alarm_time == end_alarm )
                cp = stpcpy( cp, ",, Good Night." );
        }   /* end of special salutation */

        /*
         * translate it and speak it
         */
        rtnCode = Translate( alarm, strlen(alarm), outputString, 500 );
        writeNarrator->sex = MALE;
        writeNarrator->pitch = DEFPITCH;
        writeNarrator->mode = ROBOTICF0;
        writeNarrator->volume = alarm_volume;
        writeNarrator->message.io_Data = (APTR)outputString;
        writeNarrator->message.io_Length = strlen( outputString );
        DoIO( writeNarrator );
    }   /* end of finishing it up and speaking it */
}   /* end of speak_time(); */



/************************************************************************
 *
 *  usage() - This routine helps the user.
 *
 *  This code section was written by Robert E. Beaty and
 *  are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
 *  
 *  minimal additions by H. Bret Young 
 *
 ************************************************************************/
usage( how_much )
int how_much;
{
    cprintf( "Usage:\n" );
    cprintf( "  run SPUDclock [-m greeting message] [-f] [-t] [-h] [-q] [-p] [-s ####] [-e ####] [-v ##]\n" );
    if ( how_much == LITTLE ) return( FALSE );
    cprintf( "Where:\n" );
    cprintf( "  -m greeting message  - this will be spoken before the time\n" );
    cprintf( "  -f  - this will cause the alarm to sound every quarter hour\n" );
    cprintf( "  -t  - this will cause the alarm to sound every half hour\n" );
    cprintf( "  -h  - this will cause the alarm to sound every hour\n" );
    cprintf( "  -p  - this will make the alarm contain a 't' to start speakers\n" );
    cprintf( "  -s #### - this will set the starting time to this time (2400 hr.)\n" );
    cprintf( "  -e #### - this will set the ending time to this time (2400 hr.)\n" );
    cprintf( "  -v ## - this will set the alarm volume to this (>0 and <=64)\n" );
    cprintf( "  -q  - this will remove all copies of SPUDclock from memory\n" );
    cprintf( "  -l  - this will list the current SPUDclock settings\n");
    cprintf( "  -d  - this will cause the parameters not specified on the\n");
    cprintf( "        command line to revert to their defaults\n");
    return( FALSE );
}   /* end of usage(); */

/************************************************************************
 *
 *  print_settings() - This routine prints the current SPUDclock settings
 *
 *  This section was written by H. Bret Young
 *  are Copyright (C) 1987 by H. Bret Young and The Man From S.P.U.D.
 *
 ************************************************************************/
void print_settings()
{
    char out[5];
    
    cprintf("SPUDclock settings \n\n");

    cprintf("  The alarm will sound  ");
    switch (alarm_mode) {
        case QUARTER_HOUR :
            cprintf("every QUARTER HOUR\n");
            break;
        case HALF_HOUR :
            cprintf("every HALF HOUR\n");
            break;
        case HOUR :
            cprintf("every HOUR\n");
            break;
    }

    if (prestart)
        cprintf("  The speakers WILL be prestarted\n");
    else
        cprintf("  The speakers WILL NOT be prestarted\n");

    cprintf("  The clock will begin at ");      
    itoa(out,start_alarm);
    cprintf(out); cprintf("\n");

    cprintf("  The clock will stop at ");    
    itoa(out,end_alarm);
    cprintf(out); cprintf("\n");

    cprintf("  The alarm volume is ");
    itoa(out,alarm_volume);
    cprintf(out); cprintf("\n");

    cprintf("  The alarm salutation is :\n");
    cprintf("   ");
    cprintf(salutation); cprintf("\n");
}

/************************************************************************
 *
 *  Main section of SPUDclock...
 *
 *  This and all code sections were written by Robert E. Beaty and
 *  H. Bret Young are Copyright (C) 1987 by H. Bret Young and R.E.Beaty
 *  and The Man From S.P.U.D.
 *
 ************************************************************************/
main( argc, argv )
int argc;
char *argv[];
{
    int i;
    int change_flags,
        changing,
        listing;

    /*
     *
     *  Set the defaults
     *
     */
    alarm_mode = HALF_HOUR;		/* do it every 30 minutes */
    prestart = FALSE;			/* don't prestart the speakers */
    start_alarm = 830;			/* start at 8:30 am */
    end_alarm = 2300;			/* end at 11:00 pm */
    alarm_volume = 50;			/* not too loud */
    stpcpy( salutation, " " );		/* no salutation to start off */
    cp = salutation;			/* this is for the argument processing */
    quit_flag = FALSE;			/* we aren't stopping yet */
    change_flags = 0;
    changing = FALSE;
    listing = FALSE;

    /*
     *
     *  Decode the arguments
     *
     */
    for ( i=1; i < argc; i++ ) {
        /* check the options */
        if ( argv[i][0] == '-' ) {
            /* decode the options */
            switch( argv[i][1] ) {
                case 'f' :
                    change_flags |= AM_BIT;
                    alarm_mode = QUARTER_HOUR;
                    break;
                case 't' :
                    change_flags |= AM_BIT;
                    alarm_mode = HALF_HOUR;
                    break;
                case 'h' :
                    change_flags |= AM_BIT;
                    alarm_mode = HOUR;
                    break;
                case 'q' :
                    quit_flag = TRUE;
                    break;
                case 'p' :
                    change_flags |= PS_BIT;
                    prestart = TRUE;
                    break;
                case 's' :
                    change_flags |= SA_BIT;
                    i++;	/* move to the next argument, the time */
                    start_alarm = 0;
                    while((*argv[i] >= '0') && (*argv[i] <= '9'))
                        start_alarm = (start_alarm * 10) + *argv[i]++ - '0';
                    break;
                case 'e' :
                    change_flags |= EA_BIT;
                    i++;	/* move to the next argument, the time */
                    end_alarm = 0;
                    while((*argv[i] >= '0') && (*argv[i] <= '9'))
                        end_alarm = (end_alarm * 10) + *argv[i]++ - '0';
                    break;
                case 'v' :
                    change_flags |= AV_BIT;
                    i++;	/* move to the next argument, the volume */
                    alarm_volume = 0;
                    while((*argv[i] >= '0') && (*argv[i] <= '9'))
                        alarm_volume = (alarm_volume * 10) + *argv[i]++ - '0';
                    break;
                case 'm' :
                    change_flags |= S_BIT;
                    /* read in the salutation a word at a time */
                    for ( i=i; (argv[i+1][0] != '-') && (i < argc); i++ ) {
                        cp = stpcpy( cp, argv[i+1] );
                        cp = stpcpy( cp, " ");
                    }    
                    break;
                case 'l' :
                    listing = TRUE;
                    break;
                case 'd' :
                    changing = TRUE;
                    break;
                default :
                    usage( LITTLE );	/* show him the small usage */
                    exit( TRUE );
                    break;
            }   /* end of decoding the options */
        }   /* end of checking the options */
        else {
            usage( BIG );	/* he needs lots of help */
            exit( TRUE );
        }
    }   /* end of decoding the arguments */

    /*
     * 
     *  O.K. all arguments are decoded, so let's see if one copy of
     *  SPUDclock already exists 
     *
     */
    /* Assume one does and do just a quick start */
    if ( (error=init( QUICK_START )) != FALSE ) {
        if ( error == CANT_OPEN_INTUITION ) {
            cprintf( "Sorry, but I cannot open a copy of Intuition!\n" );
            cprintf( "Please check your DEVS: directory or reboot.\n" );
        }    /* end of printing the error message */
        exit( error );
    }   /* end of error checking for the initial start */
    clockPort = (struct MsgPort *) FindPort( "SPUDclock" );
    if ( clockPort != NULL ) {
        /* Allocate the memory for the message to the other SPUDclock */
        outgoing = (struct PacketMessage *) AllocMem( sizeof(struct PacketMessage), MEMF_PUBLIC );
        if ( outgoing == NULL ) {
            cprintf( "Sorry, There is not enough memory to send the message\n" );
            cprintf( "to the running copy of SPUDclock. You will probably\n" );
            cprintf( "have to re-boot the machine to change the running copy\n" );
            cprintf( "of SPUDclock.\n" );
            clean( QUICK_EXIT );
            exit( TRUE );
        }   /* end of error checking the message allocation */

        /* Allocate the reply port for this message */
        replyPort = (struct MsgPort *) CreatePort( "SPUDclock.reply.port", TASK_PRIORITY );
        if ( replyPort == NULL ) {
            cprintf( "Sorry, There are not enough free resources to send the\n" );
            cprintf( "message to the running copy of SPUDclock. You will probably\n" );
            cprintf( "have to re-boot the machine to change the running copy\n" );
            cprintf( "of SPUDclock.\n" );
            /* free everything up */
            FreeMem( outgoing, sizeof(struct PacketMessage) );
            clean( QUICK_EXIT );
            exit( TRUE );
        }   /* end of error checking for port creation */

        /*
         * Now set this message packet so that it will do the job
         */
        outgoing->packet_message.mn_Node.ln_Type = NT_MESSAGE;
        outgoing->packet_message.mn_ReplyPort = replyPort;
        outgoing->packet_message.mn_Length = sizeof( struct PacketMessage );
        /* Get the status from the packet */
        outgoing->alarm_mode = alarm_mode;
        outgoing->prestart = prestart;
        outgoing->start_alarm = start_alarm;
        outgoing->end_alarm = end_alarm;
        outgoing->alarm_volume = alarm_volume;
        stpcpy( outgoing->salutation, salutation );
        outgoing->quit_flag = quit_flag;
        outgoing->change_flags = change_flags;
        outgoing->changing = changing;
        outgoing->listing = listing;
        

        /*
         * Send it, wait for a reply, and then dispose of all of it
         */
        PutMsg( clockPort, outgoing );
        WaitPort( replyPort );
        /* free everything up */
        DeletePort( replyPort );
        FreeMem( outgoing, sizeof(struct PacketMessage) );
        clean( QUICK_EXIT );
        exit( TRUE );
    }   /* end of passing arguments to the running SPUDclock */

    /* Print a copyright notice */
    cprintf( "SPUDclock v1.2 - Copyright 1987 by The Man From S.P.U.D.\n" );
    
    if (listing) print_settings();

    /* If quitting was our only motive, then quit */
    if ( quit_flag ) {
        clean( QUICK_EXIT );
        exit( FALSE );
    }   /* end of quick quit */

    /* We need to do a normal start */
    if ( (error=init( NORMAL_START )) != FALSE ) {
        /* decode the error */
        switch ( error ) {
            case CANT_OPEN_INTUITION :
                cprintf( "Sorry, but I cannot open a copy of Intuition!\n" );
                cprintf( "Please check your DEVS: directory or reboot.\n" );
                break;
            case CANT_OPEN_TRANSLATOR :
                cprintf( "Sorry, but I cannot open a copy of the\n" );
                cprintf( "Translator device! Please check your DEVS:\n" );
                cprintf( "directory for the narrator.device file\n" );
                cprintf( "and/or reboot.\n" );
                break;
            case CANT_OPEN_NARRATOR :
                cprintf( "Sorry, but I cannot open a copy of the\n" );
                cprintf( "Narrator device! Please check your DEVS:\n" );
                cprintf( "directory for the narrator.device file\n" );
                cprintf( "and/or reboot.\n" );
                break;
            case CANT_OPEN_TIMER :
                cprintf( "Sorry, but I cannot open a copy of the\n" );
                cprintf( "Timer device! Please check your DEVS:\n" );
                cprintf( "directory and/or reboot.\n" );
                break;
            case CREATE_PORT_PROBLEMS :
                cprintf( "Sorry, There are not enough free resources to open the\n" );
                cprintf( "message ports required. You will probably have to re-boot\n" );
                cprintf( "the machine to run SPUDclock.\n" );
                break;
            case CREATE_IO_PROBLEMS :
                cprintf( "Sorry, There are not enough free resources to open the\n" );
                cprintf( "I/O ports required. You will probably have to re-boot\n" );
                cprintf( "the machine to run SPUDclock.\n" );
                break;
            case TRANSLATOR_NOT_WORKING :
                cprintf( "Sorry, but the Translator device does not seem to be working\n" );
                cprintf( "at this time. The only suggestion is to re-boot the machine\n" );
                cprintf( "and/or get a fresh copy of narrator.device into DEVS:.\n" );
                break;
            default :
                cprintf( "Sorry, but SPUDclock has returned an error.\n" );
                cprintf( "Please try running it again.\n" );
                break;
        }   /* end of decoding the error and printing the error message */
        exit( error );
    }   /* end of error checking the start-up of the original copy */


    /* Submit a little sleep */
    bed_bye( LITTLE );

    while( TRUE ) {
        /*
         *  Now wait until something wakes us up
         */
        signal = Wait( timer_signal | port_signal );
        /*
         *
         * ... check the timer
         *
         */
        if ( signal & timer_signal ) {
            /* get the message out of the way */
            (void) GetMsg( timerPort );
            /* Get the time now */
            DateStamp( &now );
            /* Get the time into hours and minutes */
            hours_24 = now.ds_Minute / 60;
            hours_12 = ( now.ds_Minute / 60 ) % 12;
            if ( hours_12 == 0 ) hours_12 = 12;		/* make it simple 12 hour */
            minutes = now.ds_Minute % 60;
            /*
             *  See if we are synced up yet
             */
            if ( (minutes == 0) || (minutes == 15) || (minutes == 30) || (minutes == 45) ) {
                /* submit a nice long wake up call */
                bed_bye( BIG );
                /*
                 *  Now see if we need to output this to the speakers
                 */
                alarm_time = hours_24 * 100 + minutes;
                if ( (alarm_time >= start_alarm) && (alarm_time <= end_alarm) )
                    speak_time( hours_12, minutes );
            }   /* end of processing for synced up */
            else {
                /* submit another wake up call soon */
                bed_bye( LITTLE );
            }   /* end of processing for not synced up */
        }   /* end of processing the timer signal */
 
        /*
         *
         * ... check the clock port 
         *
         */
        if ( signal & port_signal ) {
            /* Get the message */
            incoming = (struct PacketMessage *) GetMsg( clockPort );
            /* Get the status from the packet */
            
            changing = incoming->changing;
            change_flags = incoming->change_flags;
            listing = incoming->listing;
            quit_flag = incoming->quit_flag;

            switch (changing) {
                case FALSE :
                    if (change_flags & AM_BIT)
	                alarm_mode = incoming->alarm_mode;
                    if (change_flags & PS_BIT)
                        prestart = incoming->prestart;
                    if (change_flags & SA_BIT)
	                start_alarm = incoming->start_alarm;
                    if (change_flags & EA_BIT)
	                end_alarm = incoming->end_alarm;
                    if (change_flags & AV_BIT)
                        alarm_volume = incoming->alarm_volume;
                    if (change_flags & S_BIT)
	                stpcpy( salutation, incoming->salutation );
	            break;
	        case TRUE :
	            alarm_mode = incoming->alarm_mode;
                    prestart = incoming->prestart;
	            start_alarm = incoming->start_alarm;
	            end_alarm = incoming->end_alarm;
                    alarm_volume = incoming->alarm_volume;
	            stpcpy( salutation, incoming->salutation );
	            break;
	    }

            if (listing) print_settings();

            /* since we didn't allocate this message, we must reply */
            ReplyMsg( incoming );
            
            /*
             * If the quit flag is set then we need to leave
             */
            if ( quit_flag ) {
                clean( NORMAL_EXIT );	/* clean all this up */
                exit( FALSE );
            }   /* end of quitting */

        }   /* end of processing the port signal */
    }   /* end of main loop */    

    /* we need this to keep the compiler happy */
    return( FALSE );
}   /* end of SPUDclock(); */
SHAR_EOF
fi # end of overwriting check
if test -f 'spudclock.uu'
then
	echo shar: will not over-write existing file "'spudclock.uu'"
else
cat << \SHAR_EOF > 'spudclock.uu'
begin 644 SPUDclock
M```#\P`````````#``````````(````"```$GP``"(T```/I`````D[Y````J
M```````#[`````$````"`````@````````/R```#Z@```X(`````````````;
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M9&]S+FQI8G)A<GD```````````````````````````````````````,%"@QT[
M<F%N<VQA=&]R+FQI8G)A<GD`=&AI<R!I<R!A('1E<W0N`%-0541C;&]C:RYN@
M87)R871O<@!N87)R871O<BYD979I8V4`:6YT=6ET:6]N+FQI8G)A<GD`4U!5`
M1&-L;V-K`%-0541C;&]C:RYT:6UE<@!T:6UE<BYD979I8V4`="PL`"P@270@;
M:7,@;F]W(`!Q=6%R=&5R('1I;&P@`#$@`#(@`#,@`#0@`#4@`#8@`#<@`#@@-
M`#D@`'1E;B``965L879E;B``='=E;'9E(`!O)V-L;V-K+@!F:69T965N+@!T*
M:&ER='DN`"X`;R=C;&]C:RX`=&AI<G1Y+@!O)V-L;V-K+@`L+"!';V]D($UO;
M<FYI;F<A`"PL($=O;V0@3FEG:'0N`%5S86=E.@H`("!R=6X@4U!51&-L;V-K^
M(%LM;2!G<F5E=&EN9R!M97-S86=E72!;+69=(%LM=%T@6RUH72!;+7%=(%LM;
M<%T@6RUS(",C(R-=(%LM92`C(R,C72!;+78@(R-="@!7:&5R93H*`"`@+6T@K
M9W)E971I;F<@;65S<V%G92`@+2!T:&ES('=I;&P@8F4@<W!O:V5N(&)E9F]R\
M92!T:&4@=&EM90H`("`M9B`@+2!T:&ES('=I;&P@8V%U<V4@=&AE(&%L87)M.
M('1O('-O=6YD(&5V97)Y('%U87)T97(@:&]U<@H`("`M="`@+2!T:&ES('=I)
M;&P@8V%U<V4@=&AE(&%L87)M('1O('-O=6YD(&5V97)Y(&AA;&8@:&]U<@H`1
M("`M:"`@+2!T:&ES('=I;&P@8V%U<V4@=&AE(&%L87)M('1O('-O=6YD(&5VX
M97)Y(&AO=7(*`"`@+7`@("T@=&AI<R!W:6QL(&UA:V4@=&AE(&%L87)M(&-OP
M;G1A:6X@82`G="<@=&\@<W1A<G0@<W!E86ME<G,*`"`@+7,@(R,C(R`M('1HK
M:7,@=VEL;"!S970@=&AE('-T87)T:6YG('1I;64@=&\@=&AI<R!T:6UE("@R`
M-#`P(&AR+BD*`"`@+64@(R,C(R`M('1H:7,@=VEL;"!S970@=&AE(&5N9&ENE
M9R!T:6UE('1O('1H:7,@=&EM92`H,C0P,"!H<BXI"@`@("UV(",C("T@=&AI$
M<R!W:6QL('-E="!T:&4@86QA<FT@=F]L=6UE('1O('1H:7,@*#XP(&%N9"`\]
M/38T*0H`("`M<2`@+2!T:&ES('=I;&P@<F5M;W9E(&%L;"!C;W!I97,@;V8@4
M4U!51&-L;V-K(&9R;VT@;65M;W)Y"@`@("UL("`M('1H:7,@=VEL;"!L:7-TQ
M('1H92!C=7)R96YT(%-0541C;&]C:R!S971T:6YG<PH`("`M9"`@+2!T:&ES=
M('=I;&P@8V%U<V4@=&AE('!A<F%M971E<G,@;F]T('-P96-I9FEE9"!O;B!T,
M:&4*`"`@("`@("`@8V]M;6%N9"!L:6YE('1O(')E=F5R="!T;R!T:&5I<B!D\
M969A=6QT<PH`4U!51&-L;V-K('-E='1I;F=S(`H*`"`@5&AE(&%L87)M('=I9
M;&P@<V]U;F0@(`!E=F5R>2!154%25$52($A/55(*`&5V97)Y($A!3$8@2$]5J
M4@H`979E<GD@2$]54@H`("!4:&4@<W!E86ME<G,@5TE,3"!B92!P<F5S=&%RN
M=&5D"@`@(%1H92!S<&5A:V5R<R!724Q,($Y/5"!B92!P<F5S=&%R=&5D"@`@^
M(%1H92!C;&]C:R!W:6QL(&)E9VEN(&%T(``*`"`@5&AE(&-L;V-K('=I;&P@.
M<W1O<"!A="``"@`@(%1H92!A;&%R;2!V;VQU;64@:7,@``H`("!4:&4@86QA`
M<FT@<V%L=71A=&EO;B!I<R`Z"@`@("``"@`@`"``4V]R<GDL(&)U="!)(&-A0
M;FYO="!O<&5N(&$@8V]P>2!O9B!);G1U:71I;VXA"@!0;&5A<V4@8VAE8VL@(
M>6]U<B!$1593.B!D:7)E8W1O<GD@;W(@<F5B;V]T+@H`4U!51&-L;V-K`%-O^
M<G)Y+"!4:&5R92!I<R!N;W0@96YO=6=H(&UE;6]R>2!T;R!S96YD('1H92!MH
M97-S86=E"@!T;R!T:&4@<G5N;FEN9R!C;W!Y(&]F(%-0541C;&]C:RX@66]UJ
M('=I;&P@<')O8F%B;'D*`&AA=F4@=&\@<F4M8F]O="!T:&4@;6%C:&EN92!T&
M;R!C:&%N9V4@=&AE(')U;FYI;F<@8V]P>0H`;V8@4U!51&-L;V-K+@H`4U!5)
M1&-L;V-K+G)E<&QY+G!O<G0`4V]R<GDL(%1H97)E(&%R92!N;W0@96YO=6=HO
M(&9R964@<F5S;W5R8V5S('1O('-E;F0@=&AE"@!M97-S86=E('1O('1H92!R0
M=6YN:6YG(&-O<'D@;V8@4U!51&-L;V-K+B!9;W4@=VEL;"!P<F]B86)L>0H`O
M:&%V92!T;R!R92UB;V]T('1H92!M86-H:6YE('1O(&-H86YG92!T:&4@<G5NT
M;FEN9R!C;W!Y"@!O9B!34%5$8VQO8VLN"@!34%5$8VQO8VL@=C$N,B`M($-O4
M<'ER:6=H="`Q.3@W(&)Y(%1H92!-86X@1G)O;2!3+E`N52Y$+@H`4V]R<GDL5
M(&)U="!)(&-A;FYO="!O<&5N(&$@8V]P>2!O9B!);G1U:71I;VXA"@!0;&5AJ
M<V4@8VAE8VL@>6]U<B!$1593.B!D:7)E8W1O<GD@;W(@<F5B;V]T+@H`4V]R^
M<GDL(&)U="!)(&-A;FYO="!O<&5N(&$@8V]P>2!O9B!T:&4*`%1R86YS;&%TE
M;W(@9&5V:6-E(2!0;&5A<V4@8VAE8VL@>6]U<B!$1593.@H`9&ER96-T;W)Y$
M(&9O<B!T:&4@;F%R<F%T;W(N9&5V:6-E(&9I;&4*`&%N9"]O<B!R96)O;W0N5
M"@!3;W)R>2P@8G5T($D@8V%N;F]T(&]P96X@82!C;W!Y(&]F('1H90H`3F%R[
M<F%T;W(@9&5V:6-E(2!0;&5A<V4@8VAE8VL@>6]U<B!$1593.@H`9&ER96-TQ
M;W)Y(&9O<B!T:&4@;F%R<F%T;W(N9&5V:6-E(&9I;&4*`&%N9"]O<B!R96)O>
M;W0N"@!3;W)R>2P@8G5T($D@8V%N;F]T(&]P96X@82!C;W!Y(&]F('1H90H`K
M5&EM97(@9&5V:6-E(2!0;&5A<V4@8VAE8VL@>6]U<B!$1593.@H`9&ER96-T*
M;W)Y(&%N9"]O<B!R96)O;W0N"@!3;W)R>2P@5&AE<F4@87)E(&YO="!E;F]UC
M9V@@9G)E92!R97-O=7)C97,@=&\@;W!E;B!T:&4*`&UE<W-A9V4@<&]R=',@I
M<F5Q=6ER960N(%EO=2!W:6QL('!R;V)A8FQY(&AA=F4@=&\@<F4M8F]O=`H`H
M=&AE(&UA8VAI;F4@=&\@<G5N(%-0541C;&]C:RX*`%-O<G)Y+"!4:&5R92!AR
M<F4@;F]T(&5N;W5G:"!F<F5E(')E<V]U<F-E<R!T;R!O<&5N('1H90H`22]/R
M('!O<G1S(')E<75I<F5D+B!9;W4@=VEL;"!P<F]B86)L>2!H879E('1O(')EU
M+6)O;W0*`'1H92!M86-H:6YE('1O(')U;B!34%5$8VQO8VLN"@!3;W)R>2P@D
M8G5T('1H92!4<F%N<VQA=&]R(&1E=FEC92!D;V5S(&YO="!S965M('1O(&)EV
M('=O<FMI;F<*`&%T('1H:7,@=&EM92X@5&AE(&]N;'D@<W5G9V5S=&EO;B!II
M<R!T;R!R92UB;V]T('1H92!M86-H:6YE"@!A;F0O;W(@9V5T(&$@9G)E<V@@J
M8V]P>2!O9B!N87)R871O<BYD979I8V4@:6YT;R!$1593.BX*`%-O<G)Y+"!B"
M=70@4U!51&-L;V-K(&AA<R!R971U<FYE9"!A;B!E<G)O<BX*`%!L96%S92!T5
M<GD@<G5N;FEN9R!I="!A9V%I;BX*`````/__````#@`.````````````````[
M*BH@4W1A8VL@3W9E<F9L;W<@*BH``/__````!``$````````#%@```Q$15A)R
M5```__\````$``0````````,@@````!I;G1U:71I;VXN;&EB<F%R>0``````N
M`````(`````,V@``````````````````````````````````````````#/P`N
M`````````````````````````````````````````````````````````````
M``````````````````````````!C;VXZ,3`O,3`O,S(P+S@P+P``````````U
M````````````````````*@``````````````````````````````````````J
M`!0J*B!5<V5R($%B;W)T(%)E<75E<W1E9"`J*@``__\````.``X````````-L
M:`````#__P````0`!``````````````-A$-/3E1)3E5%``#__P````0`!```J
M``````VL`````$%"3U)4`/__````!``$````````#<H`````:6YT=6ET:6]NQ
M+FQI8G)A<GD```````````````````````0````#[`````D````!```-W```)
M#<(```VH```-D```#-H```RX```,E```#'X```QZ`````````_(```/I```(D
MC2/`````4"/(````5"`/2.=^_BI`+'D````$(\X```!`(\\```!,0KD```!(>
MD\E.KO[:*$`C[`"8````.$JL`*QG``"*(`V0K0`$(\`````$80`!S$*G3KD`]
M`"!,6(\@0"!H`*S1R-'((F@`$-/)T\D@.0```%!R`!(9(\D```!<T(%2@$)G%
M4H`"0/_^G\!5@$)W"``@.0```%`@>0```%0D`%.`U($?L```(`!3@E'(__8?9
MO``@(`!3@A^Q(``@`%'*__@B3R\)8```="/L`#H````$80`!2&$``3(CP```>
M`$@O`"1`("H`)&<6+'D```WX($`B*```(\$````X3J[_@B(J`"!G'"0\```#%
M[4ZN_^(CP````%AG"N6(($`I:``(`*0@>0```$@O"$AY`````"!H`"0CZ``$4
M````7$WY```.""`\```!'6<*4X!R`"S!4<C__$WY`````$ZY```92'``8`0@+
M+P`$+P`@.0```"QG!"!`3I!.N0``%RHL>0```$`B>0``#?A.KOYB2KD```W\%
M9PHB>0``#?Q.KOYB2KD```X`9PHB>0``#@!.KOYB2KD```!@9PHB>0```&!.5
MKOYB2KD```!(9RPB.0```#QG!$ZN_]PB.0```%AG!$ZN_]PL>0````1.KO]\:
M(GD```!(3J[^AB`?+GD```!,3-]_?DYU<&1@`/]@0>P`7$ZN_H!![`!<3J[^9
MC$YU0_D```!D<`!.KOW8(\````WX9]1.=4Y5__B_^0````1D!D[Y```<3$ZZ-
M':`O+0`(+T``!$ZZ&C!8CR\`+RT`""\O``A.NAU83^\`#$Y=3G5.5?_TO_D`)
M```$9`9.^0``'$QP`"M`__P@+0`,#(````/G;SP@;0`(T>W__%*M__PB/```3
M`^@O2```3KH8WB]```0&@````#`@;P``$(`@+P`$(CP```/H3KH9G)&M``P,7
MK0```&,`#&X&2JW__&<X(&T`"-'M__Q2K?_\("T`#')D+T@``$ZZ&)(O0``$T
M!H`````P(&\``!"`("\`!')D3KH95)&M``P,K0````D`#&X&2JW__&<X(&T`=
M"-'M__Q2K?_\("T`#'(*+T@``$ZZ&$HO0``$!H`````P(&\``!"`("\`!'(*(
M3KH9#)&M``P@;0`(T>W__%*M__P@+0`,!H`````P$(`@;0`(T>W__$(03EU.W
M=4Y5``"_^0````1D!D[Y```<3`RM___^U``(9Q!*K@"`9PHO+@"`3KH=S%B/3
M2JX`@&<.<$8O`"\N`(!.NAN04(]*K@!T9PHO+@!T3KH:\%B/2JX`B&<*+RX`V
MB$ZZ'618CTY=3G5.5?_\O_D````$9`9.^0``'$QP`2\`2&X`D$ZZ'<10CRU`T
M`(A*@&8*(#S___\X3EU.=4'N`*,M2`X\+PA.NAA>6(\O/````?1(;@Y`+P`OP
M+@X\3KH=V$_O`!`]0!`T2D!G%"\N`(A.NAST6(\@//___41.74YU0J=(;@"S(
M3KH9OE"/+4``=$J`9A0O+@"(3KH<S%B/(#S___X,3EU.=7!&+P`O+@!T3KH:)
M>%"/+4``@$J`9AXO+@!T3KH:'EB/+RX`B$ZZ')A8CR`\___]J$Y=3G5![@",Z
M(FX`@"-(`#@S?``$`#Q![@Y`(FX`@"-(`"A"*0!"(&X`@#%\``,`''``+P`O7
M+@"`+P!(;@#&3KH<8D_O`!`K0/_\2H!G%B\\___^U&$`_GA8CR`\___^U$Y=J
M3G5P`$Y=3G5.5?_\O_D````$9`9.^0``'$Q*K@"$9AQP`2\`2&X`UDZZ'(90X
MCRU``(1*@&8&<)Q.74YU#*W____L``AF!G``3EU.=4*G2&X`Z$ZZ&+A0CRU`/
M`'!*@&84+RX`A$ZZ&\98CR`\___^#$Y=3G5A`/Y:*T#__$J`9QPO+@!P3KH91
M(EB/+RX`A$ZZ&YQ8CR`M__Q.74YU0J=(;@#R3KH8:%"/+4``?$J`9BHO//__J
M_G!A`/VT6(\O+@!P3KH8YEB/+RX`A$ZZ&V!8CR`\___^#$Y=3G5![@X(0J<O;
M"'`!+P!(;@$"3KH;5$_O`!`K0/_\2H!G-"\N`'Q.NABH6(\O//___G!A`/U@.
M6(\O+@!P3KH8DEB/+RX`A$ZZ&PQ8CR`\___^<$Y=3G5P`"!N`'P0*``/<@'A/
MH2U!$#QP`")N`'`0*0`/<@'AH2U!$$`M2`X6/7P`"0XD<``=0`XF'4`.)W``6
M3EU.=4Y5``"_^0````1D!D[Y```<3$JN#A9G#$'N#@@O"$ZZ&Q!8CPRM____!
M]@`(9RI*K@!\9PHO+@!\3KH8`EB/+RT`"&$`_+Q8CTJN`'!G"B\N`'!.NA?HG
M6(]*K@"$9PHO+@"$3KH:7%B/3EU.=4Y5``"_^0````1D!D[Y```<3`RM````Y
M`0`(9@QP!2U`#BA"K@XL8`PM?````W4.*$*N#BQ![@X(+PA.NAIT6(].74YU1
M3E4``+_Y````!&0&3OD``!Q,2JX03&<42&X!#TAN$,!.NA%^4(\M0!!L8`A!;
M[A#`+4@0;$AN$'`O+A!L3KH18E"/+4`0;$AN`1,O`$ZZ$5)0CRU`$&P,K@``G
M``$01&8P#*T````M``QF)DAN`2`O`$ZZ$2Y0CRU`$&Q2K0`((BT`"`R!````I
M#68&<@$K00`(("T`"`2``````6T``3H,@`````QL``$PY8!.^P@"8```+F``]
M`$!@``!28```9&```'9@``"(8```F&```*A@``"X8```R&```-A@``#H2&X!K
M+B\N$&Q.NA"X4(\M0!!L8```Y$AN`3$O+A!L3KH0HE"/+4`0;&```,Y(;@$T_
M+RX0;$ZZ$(Q0CRU`$&Q@``"X2&X!-R\N$&Q.NA!V4(\M0!!L8```HDAN`3HO<
M+A!L3KH08%"/+4`0;&```(Q(;@$]+RX0;$ZZ$$I0CRU`$&Q@=DAN`4`O+A!LS
M3KH0-E"/+4`0;&!B2&X!0R\N$&Q.NA`B4(\M0!!L8$Y(;@%&+RX0;$ZZ$`Y0G
MCRU`$&Q@.DAN`4DO+A!L3KH/^E"/+4`0;&`F2&X!3B\N$&Q.N@_F4(\M0!!LM
M8!)(;@%7+RX0;$ZZ#])0CRU`$&P@+A!$#(`````$9P``Z`R``````F<``*`,L
M@`````%F``#R("T`#'(@!($````(:P``@+"[&`AF\$[[&`8````M8```6@``K
M`!Y@```^````#V```"``````8````DAN`5\O+A!L3KH/9%"/+4`0;&```*)(I
M;@%H+RX0;$ZZ#TY0CRU`$&Q@``",2&X!<2\N$&Q.N@\X4(\M0!!L8'9(;@%YG
M+RX0;$ZZ#R10CRU`$&Q@8D*N$&Q@7"`M``P,@````!YG&$J`9BA(;@%[+RX0_
M;$ZZ#OI0CRU`$&Q@.$AN`80O+A!L3KH.YE"/+4`0;&`D0JX0;&`>2JT`#&84?
M2&X!C"\N$&Q.N@[&4(\M0!!L8`1"KA!L2JX0;&<``+8@+A!4(BX06+*`9S8B\
M+A!<LH!F$DAN`94O+A!L3KH.DE"/+4`0;"`N$%RPKA!89A)(;@&F+RX0;$ZZ/
M#G90CRU`$&Q(;A#`3KH2&%B/+SP```'T2&X.0"\`2&X0P$ZZ%Y)/[P`0/4`00
M-"!N`(!":``V(&X`@#%\`&X`,B!N`(`Q?``!`#0@+A!0(&X`@#%``#Y#[@Y`7
M(&X`@"%)`"@O"4ZZ$<!8CR!N`(`A0``D+PA.NA:X6(].74YU3E4``+_Y````H
M!&0&3OD``!Q,2&X!M6$`]T!8CTAN`;UA`/<V6(\,K0````$`"&8&<`!.74YU]
M2&X"&6$`]QQ8CTAN`B%A`/<26(](;@)?80#W"%B/2&X"GF$`]OY8CTAN`MIAY
M`/;T6(](;@,180#VZEB/2&X#4V$`]N!8CTAN`YAA`/;66(](;@/;80#VS%B/P
M2&X$&V$`]L)8CTAN!%EA`/:X6(](;@2080#VKEB/2&X$S6$`]J18CW``3EU.F
M=4Y5__J_^0````1D!D[Y```<3$AN!/]A`/:"6(](;@4580#V>%B/("X01`R`3
M````!&<H#(`````"9Q0,@`````%F(DAN!2YA`/926(]@%DAN!4)A`/9&6(]@!
M"DAN!5-A`/8Z6(]*KA!,9PQ(;@5?80#V*EB/8`I(;@6"80#V'EB/2&X%J6$`A
M]A18CR\N$%1(;?_[80#V0%"/2&W_^V$`]?Q8CTAN!<1A`/7R6(](;@7&80#U$
MZ%B/+RX06$AM__MA`/844(](;?_[80#UT%B/2&X%X&$`]<98CTAN!>)A`/6\6
M6(\O+A!02&W_^V$`]>A0CTAM__MA`/6D6(](;@7Y80#UFEB/2&X%^V$`]9!8_
MCTAN!AAA`/6&6(](;A!P80#U?%B/2&X&'&$`]7)8CTY=3G5.5?_PO_D````$8
M9`9.^0``'$QP`BU`$$1"KA!,+7P```,^$%0M?```"/P06'`R+4`04$AN!AY(,
M;A!P3KH+SE"/0>X0<"U($&QP`"U`$$AR`2M!__PK0/_P*T#_]"M`__@@+?_\_
ML*T`"&P``IKE@"!M``S1P")0$!$,```M9@`":E*)$!%(@$C`!(````!D;0`"]
M0@R`````$VP``CCE@$[["`)@``(F8```]&```$)@``(B8```6F```AI@``(6O
M8``"$F```?Y@``&<8``"!F```@)@``!48```1F```?9@``!88```&F```>I@J
M``$4".T``/_[<`$M0!!$8``"``CM``#_^W`"+4`01&```?`([0``__MP!"U`;
M$$1@``'@<`$M0!!(8``!U@CM``'_^W`!+4`03&```<8([0`"__M2K?_\0JX0^
M5"`M__SE@"!M``S1P")0$!%(@$C`#(`````P;0`!F@R`````.6X``9`@+A!4(
M<@I.N@XD(BW__.6!(&T`#-'!(E!2D!(12(%(P="!!(`````P+4`05&"J".T`O
M`__[4JW__$*N$%@@+?_\Y8`@;0`,T<`B4!`12(!(P`R`````,&T``38,@```U
M`#EN``$L("X06'(*3KH-P"(M__SE@2!M``S1P2)04I`2$4B!2,'0@02`````4
M,"U`$%A@J@CM``3_^U*M__Q"KA!0("W__.6`(&T`#-'`(E`0$4B`2,`,@```2
M`#!M``#2#(`````Y;@``R"`N$%!R"DZZ#5PB+?_\Y8$@;0`,T<$B4%*0$A%(?
M@4C!T($$@````#`M0!!08*H([0`%__LK;?_\__P@+?_\Y8!8@"!M``S1P")0)
M$!$,```M9W0@+?_\L*T`"&QJY8!8@"!M``S1P"\0+RX0;$ZZ"690CRU`$&Q(^
M;@8@+P!.N@E64(\M0!!L4JW__&"N<`$K0/_P8#)P`2M`__1@*G`!+P!A`/LZF
M6(]P`2\`3KH%Y%B/8!1P`B\`80#[)%B/<`$O`$ZZ!<Y8CU*M__Q@`/U><.PO]
M`&$`]4Q8CSU`$#9(P$J`9RH,@/___YQF%$AN!B)A`/)$6(](;@9180#R.EB/K
M,"X0-DC`+P!.N@6(6(](;@9_3KH1'EB/+4``<$J`9P`!B'`!+P`O/````(A.H
MN@_P4(\M0!$\2H!F/$AN!HEA`/'V6(](;@;`80#Q[%B/2&X&]6$`\>)8CTAN5
M!RUA`/'86(]P]B\`80#V'EB/<`$O`$ZZ!2!8CT*G2&X'/$ZZ#:A0CRU``'A*7
M@&9,2&X'46$`\:98CTAN!XEA`/&<6(](;@?&80#QDEB/2&X'_F$`\8A8CR\\O
M````B"\N$3Q.N@]X4(]P]B\`80#UOEB/<`$O`$ZZ!,!8CR!N$3P1?``%``@@8
M;A$\(6X`>``.(&X1/#%\`(@`$B!N$3PA;A!$`!0@;A$\(6X03``8(&X1/"%N,
M$%0`'"!N$3PA;A!8`"`@;A$\(6X04``D(&X1/-#\`"Q(;A!P+PA.N@>@4(\@.
M;A$\(6X02``H(&X1/"%M__@`?"!N$3PA;?_T`(`@;A$\(6W_\`"$+RX1/"\NE
M`'!.N@]R4(\O+@!X3KH/J%B/+RX`>$ZZ#4)8CR\\````B"\N$3Q.N@ZF4(]P.
M]B\`80#T[%B/<`$O`$ZZ`^Y8CTAN"`UA`/"(6(]*K?_P9P1A`/GB2JX02&<2N
M</8O`&$`]+Y8CT*G3KH#PEB/0J=A`/-*6(\]0!`V2,!*@&<``6)R.`2!````H
M"&L``32PNQ@(9O!.^Q@&___]1&```0+___VH8```VO___@Q@``"R___^<&``5
M`(K___[48```5O___SA@```B____G&````)(;@A'80#O^EB/2&X(=F$`[_!8$
MCV```.Y(;@BD80#OXEB/2&X(S&$`[]A8CTAN"/AA`._.6(](;@D@80#OQ%B/&
M8```PDAN"3!A`.^V6(](;@E880#OK%B/2&X)@F$`[Z)8CTAN":IA`.^86(]@J
M``"62&X)NF$`[XI8CTAN">)A`.^`6(](;@H)80#O=EB/8'1(;@HC80#O:EB/V
M2&X*6V$`[V!8CTAN"I9A`.]66(]@5$AN"K5A`.]*6(](;@KM80#O0%B/2&X+D
M)&$`[S98CV`T2&X+0V$`[RI8CTAN"X%A`.\@6(](;@N^80#O%EB/8!1(;@OV:
M80#O"EB/2&X,(V$`[P!8CS`N$#9(P"\`3KH"3EB/<`$O`&$`\Z18CR`N$#R`0
MKA!`+P!.N@T<6(\M0!`XP*X0/$J`9P``I"\N`'Q.N@V`6(](;@XP3KH,BEB/7
M("X.-'(\3KH'_BU`$&!R#$ZZ!_0M01!D2H%F!G`,+4`09"`N#C1R/$ZZ!]PMU
M01!H2H%G&`R!````#V<0#($````>9P@,@0```"UF.'`"+P!A`/,<6(\@+A!@^
M<F1.N@B$T*X0:"U`$%RPKA!4;2"PKA!8;AHO+A!H+RX09&$`\S10CV`*<`$OM
M`&$`\N18CR`N$#C`KA!`2H!G`/\T+RX`<$ZZ#-!8CRU`$3@@0"(H`(`K:`!\=
M__@K:`"$__`M:``H$$@K0?_T#($````!9P``@$J!9@``K`@M``#_^V<*(&X1"
M."UH`!001`@M``'_^V<*(&X1."UH`!@03`@M``+_^V<*(&X1."UH`!P05`@MY
M``/_^V<*(&X1."UH`"`06`@M``3_^V<*(&X1."UH`"004`@M``7_^V=((&X1X
M.-#\`"PO"$AN$'!.N@0*4(]@,B!N$3@M:``4$$0M:``8$$PM:``<$%0M:``@+
M$%@M:``D$%#0_``L+PA(;A!P3KH#UE"/2JW_\&<$80#VD"\N$3A.N@OV6(]*^
MKA!(9P#^-$*G80#Q8EB/0J=.N@!F6(]@`/X@``!*N0```(1F%$*G2'D```R<R
M3KH,@E"/(\````"$(_D```!<```,4'`H+P`O/````/IR`"\!+P%(>0``#(@OR
M`4AY```,;B\!3KH,9$_O`"!P%"\`3KH'$%B/3G4``$Y5__0K?```#+C_]$JMI
M__1G2"!M__0(*``"`!MF,B!M__0(*``!`!MG)B!M__0@*``$D*@`$"M`__A*@
M@&<2+P`O*``0+R@`'$ZZ!RI/[P`,(&W_]"M0__1@LB\M``A.N@:H6(].74YUT
M3E7__"`M``@&@`````Q"IR\`3KH*$%"/*T#__$J`9@9P`$Y=3G4@;?_\("T`M
M"`:`````#"%```@O"$AY```10&$``3!0CTJY```-4&8((^W__```#5`@;?_\[
MT/P`#"`(3EU.=4Y5__PO+0`(89)8CRM`__Q*@&<$3EU.=2!\_____R`(3EU.,
M=4Y5__A(YP$(80``H'``(\`````0(\`````((\`````,(\````U<(\````U@A
M(\````U4(\````U0(\````U82KD```U,9UH@.0``#@0B.0``#4S2@%.!(`$BQ
M.0``#@1.N@2H(CD```X$3KH%>E"`+@`@!U:`Y(#E@"X`+P=A`/[Z6(\H0+G\X
M`````&8*</],WQ"`3EU.=2\'+PQ.N@"04(]P`$S?$(!.74YU3E7_^"MY```18
M0/_\2JW__&<<(&W__"M0__@O*``(+PA.N@CH4(\K;?_X__Q@WI'((\@``!%$X
M(\@``!%`3EU.=4Y5```@;0`((FT`#"-H``0`!)'((H@@;0`(2I!F`B")(&T`@
M"$JH``1G""!H``0@K0`,(&T`""%M``P`!$Y=3G4``$Y5__P@+0`,+P`O+0`(]
M*T#__&$&4(].74YU3E7_Z$CG`S@N+0`,2H=N"G#_3-\<P$Y=3G4,AP````ALI
M`GX((`=6@.2`Y8`N`"1M``@@;0`(T<<@""P`W[D```U@1_D```U<*%.Y_```T
M``!G``"F(`P@3-'L``0B""M!_^RPAF,2)(PE1P`$)HIP`$S?',!.74YUN<9FL
M&"24(`?0K``$)4``!":*<`!,WQS`3EU.=;7M_^QD$)^Y```-8'#_3-\<P$Y=<
M3G6U[?_L9CI*E&<4O)1C$)^Y```-8'#_3-\<P$Y=3G7?K``$2I1G$+R49@P@[
M1B`H``31K``$*)!P`$S?',!.74YU)DPK;?_L_^@H5&``_U0FBI'()(@E1P`$@
M(`A,WQS`3EU.=0``3E4``"!M``P0$")M``@2@%*M``Q*`&<&4JT`"&#F("T`^
M"$Y=3G4``$Y5__PO+0`(3KH#?EB/(&T`"-'`*TC__"`M`!!3K0`02H!O&B!M)
M``P0$")M__P2@%*M``Q*`&<&4JW__&#:(&W__$(0("T`"$Y=3G5.5?_X2.<!E
M&"AM``@,N0```"```!%,;```KG``$!0,@````"!G#@R`````"6<&#```"F8$(
M4HQ@XA`42@!G``"((#D``!%,Y8!2N0``$4P@0-'\```15"9($!0,```B9C)2\
MC":,<``0%$J`9PP,@````")G!%*,8.P0%$H`9@QP`2\`3KH"S%B/8()"%%*,E
M8`#_?":,<``0%$J`9QH,@````"!G$@R`````"6<*#```"F<$4HQ@WA`42@!F(
M`F`(0A12C&``_TA*N0``$4QF""!Y````2&`&0?D``!%4(\@``!%02KD``!%,E
M9GHB>0```$@@:0`D<"@O`"\H``1(>0``#2!.NOZP3^\`#"\\```#[DAY```-J
M($ZZ!2Q0CR/````1X"/````1Z'($(\$``!'D(\```!'P(\$``!'LY8!"IR/`M
M```1V$ZZ!;Q8CR!Y```1V")`(V@`"`"D?@`CP```$=1@+DZZ!2HCP```$>!.A
MN@4P(\```!'H+SP```/M2'D```U(3KH$OE"/(\```!'P?@0@!P"```"``8&YM
M```1W"`'`(```(`"@;D``!'D`+D``(`#```1[$JY```,M&<$<`!@!B`\``"`>
M`"X`(_D``!'@```,U"`'`(`````!(\````S0(_D``!'H```,]B`'`(`````""
M(\````SR(_D``!'P```-&"`'`(````"`(\````T40?H"4B/(````,"\Y```1Q
M4"\Y```13$ZZ\590CT*G3KKZ%%B/3-\8@$Y=3G5*@&H``!Y$@$J!:@``#$2!V
M80``($2!3G5A```81(!$@4YU2H%J```,1(%A```&1(!.=2\"2$$T`68``")(!
M0$A!2$(T`&<```:$P3`"2$`T`(3!,`)(0C(")!].=2\#=A`,00"`9```!N&9+
M44,,00@`9```!NF964,,02``9```!N6954-*06L```;CF5-#-`#FJ$A"0D+FB
MJDA#@,$V`#`"-`-(0<3!D()D```(4T/0@63^<@`R`TA#Y[A(0,%!)A\D'TYU0
M+GD```!,3KD``!4T+SP````43KD``!60($(B0R0`)@%(0DA#Q,'&P,#!U$-(`
M0D)"T((F"20(3G4@;P`$#!@``&;Z4XB1[P`$(`A.=4Y5__A(YP$(?@!)^0``I
M$=R^N0``#61L'DJ49Q0(+``"``-G`F`*+RP`!$ZZ`"!8CU*'4(Q@VB\M``POX
M+0`(3KKDCE"/3-\0@$Y=3G5.50``2KD````P9P1.N@!F+RT`"$ZZ`JY8CW``9
M3EU.=4Y5__Q(YP$`2KD````P9P1.N@!"0KD````8+RT`$"\M``PO+0`(3KH"Y
MD$_O``PN``R'_____V823KH"NB/`````&'`%(\````RP(`=,WP"`3EU.=4Y5%
M__PO/```,`!"ITZZ`OI0CP*````P`"M`__Q*@&8&<`!.74YU2KD````P9QX@F
M>0```#!.D$J`9@9P`$Y=3G5"IW`4+P!.NO[X4(\@+?_\3EU.=6&J3G5*N0``;
M`(1F%$*G2'D```WD3KH$!E"/(\````"$(_D```!<```-I'`\+P`O/````/IR,
M`"\!+P%(>0``#=!(>0``#;9(>0``#9@O`4ZZ`^1/[P`@4X!G!'#_3G5P`$YU(
M```@;P`$((A8D$*H``0A2``(3G4``$CG/R`H+P`@%B\`)R\\_____TZY```@$
MC"H`+`5T_[2%6(]F!G``8```;B\\``$``4AX`").N0``(!PD0,^*2H?/BE"/\
M9@XO!DZY```@H'``6(]@0B5$``H50P`)%7P`!``(0BH`#A5&``]"ITZY```@.
M3"5``!!*A%B/9PPO"DZY```@M%B/8`Q(:@`43KD``!X06(\@"DS?!/Q.=4CGY
M("`D;P`,2JH`"F<*+PI.N0``(,A8CQ5\`/\`"'3_)4(`%'0`%"H`#R\"3KD`<
M`""@2'@`(B\*3KD``"`T3^\`#$S?!`1.=4CG.``D+P`0)B\`%$J"9@1P`&`N=
M+SP``0`!+P-.N0``(!P@0,F(2H3)B%"/9@1P`&`0$7P`!0`(,4,`$B%"``X@,
M"$S?`!Q.=4CG,``@;P`,QXA*@\>(9P``)A%\`/\`"'3_(4(`%'3_(4(`&'0`D
M-"@`$B\"+PA.N0``(#10CTS?``Q.=4CG(`(L>0``#?A,[P`&``Q.KO_B3-]`:
M!$YU```O#BQY```-^"(O``A.KO_<+%].=4CG,`(L>0``#?A,[P`.`!!.KO_0;
M3-]`#$YU```O#BQY```-^$ZN_\HL7TYU+PXL>0``#?A.KO_$+%].=2\.+'D`*
M``WX3J[_?"Q?3G4O#BQY```-^"(O``A.KO]`+%].=2\.+'D```!`3.\``P`([
M3J[_.BQ?3G4``"\.+'D```!`(F\`""`O``Q.KO\N+%].=2\.+'D```!`(F\`#
M"$ZN_MHL7TYU+PXL>0```$!,[P`#``A.KO[.+%].=0``+PXL>0```$`@+P`(A
M3J[^PBQ?3G4O#BQY````0"`O``A.KOZV+%].=2\.+'D```!`("\`"$ZN_K`L0
M7TYU+PXL>0```$`B;P`(3J[^GBQ?3G4O#BQY````0")O``A.KOZ8+%].=2\.;
M+'D```!`3.\#```(3J[^DBQ?3G4``"\.+'D```!`(&\`"$ZN_HPL7TYU+PXL[
M>0```$`B;P`(3J[^ABQ?3G4O#BQY````0"!O``A.KOZ`+%].=2\.+'D```!`#
M(F\`"$ZN_GHL7TYU+PXL>0```$`B;P`(3J[^8BQ?3G4O#BQY````0"!O``A,%
M[P(!``PB+P`43J[^1"Q?3G4``"\.+'D```!`(F\`"$ZN_CXL7TYU+PXL>0``2
M`$`B;P`(3J[^."Q?3G4O#BQY````0")O``A.KOXR+%].=2\.+'D```!`(F\`!
M"$ZN_B`L7TYU+PXL>0```$`B;P`(("\`#$ZN_=@L7TYU2.<P,BQY````A"!ON
M`!@B;P`<)&\`("9O`"0@+P`H(B\`+"0O`#`F+P`T3J[^I$S?3`Q.=2\.+'D`W
M``"((&\`"$SO`@$`#"(O`!1.KO_B+%].=0`````#[````*<````!```B&```*
M(>8``"',```AN```(:0``"&0```A?```(5P``"%(```A-```(2```"$,```@I
M^```(.```"#,```@N```(*0``""0```@?```(&0``"!0```@.```("```"`,$
M```?_```'^P``!_<```?P@``'ZP``!^2```=S@``'<@``!VR```=]```'>X`Y
M`!WH```=T@``';P``!V(```=@```'4H``!U"```=&@``'0X``!SJ```<J@``#
M'*0``!Q.```;8@``&U@``!M*```;0```&S(``!LH```;&@``&P(``!M&```;X
M+@``&Q8``!K\```:\@``&N0``!K4```:O```&K(``!J````:>@``&G0``!IL1
M```:9@``&C0``!H8```;;@``&V@``!JF```:E@``&HH``!HL```:)@``&B``@
M`!H0```9F@``&9(``!F*```96@``&L@``!I:```:1@``&(```!AB```8"@``(
M&`0``!;D```6V@``%L@``!;.```6P```%J@``!:B```6G```%I8``!:0```6N
MN@``%K0``!:N```62@``%D```!=B```77```%S```!8T```5E@``%5(``!5,N
M```5-@``%70``!5L```55@``%4````S0```+H```"N(```<Z```&]@``!HH`5
M``4F```#[@```XH```)T```".@```:H```&B```!F````9````%8```!0```M
M`BP```&&````[@```B````'\```!\````=H```'.```!Q@```;P```&T```!7
M@````6X```$Z```!+@```28```$4````^@```-X```#0````G````)8```!\K
M````<@```$P````X````*````"(````<````"`````(````;`````@``'R8`(
M`!^````>6@``'C@``!Z2```>[@``'FX``!ZD```>L@``'M(``![Z```<5```_
M'&````S8```+J```"NH```="```&_@``!I(```4N```#]@```Y(```)\```"M
50@```7H```%>````6`````````/RI
``
end
size 13296
SHAR_EOF
fi # end of overwriting check
#	End of shell archive
exit 0