jdb@mordor.UUCP (John Bruner) (07/20/85)
: This is a shar archive. Extract with sh, not csh. echo x - README cat > README << '!Funky!Stuff!' The program "uw" is a multiple-window terminal emulator for the Macintosh(tm) computer. It is designed for use with a 4.2BSD UNIX(tm) system. Up to seven independent windows may be created, each of which is connected to a pseudo-terminal on the UNIX machine. A server program which runs on the UNIX host multiplexes the input and output for these terminal sessions onto a single RS-232 serial line. "uw" requires the following: a Macintosh a 4.2BSD UNIX host the "uw" program for the Macintosh the "uw" server for the UNIX host the "uwtool" program for the UNIX host (optional) the RAM serial driver (resource SERD, ID=1) (optional) At the present time, "uw" emulates a Lear Siegler ADM-31 terminal. (The ADM-31 is upward-compatible with the ADM-3A terminal.) It is capable of absolute and relative cursor positioning, line and character insertion/deletion, and erase to end-of-line and end-of-page. All portions of "uw" are copyrighted 1985 by John D. Bruner. Permission to copy is given provided that the copy is not sold and the copyright notices are included. "uw" was designed to use the RAM serial driver from the 2/85 software supplement. Since this driver is proprietary Apple software, it is not distributed with "uw". For this reason, "uw" will use the ROM serial driver if the RAM serial driver is not present, and it will attempt to provide flow control itself. The flow control provided in this fashion is not as effective as that which the RAM serial driver provides, so use of the RAM driver is recommended if it is available. The distribution includes: uw.h - include file (describes the simple serial protocol) uw.c - source for the 4.2BSD server program uwtool.c - source for a 4.2BSD "tool" program uw.hqx - Binhex 4.0 binary for the Macintosh uw.doc.hqx - Binhex 4.0 MacPaint documentation Macintosh is a trademark of Apple Computer. UNIX is a trademark of American Telephone and Telegraph. VAX is a trademark of Digital Equipment Corporation. !Funky!Stuff! echo x - uw.h cat > uw.h << '!Funky!Stuff!' /* * uw command bytes * * Copyright 1985 by John D. Bruner. All rights reserved. Permission to * copy this program is given provided that the copy is not sold and that * this copyright notice is included. * * * Two types of information are exchanged through the 7-bit serial line: * ordinary data and command bytes. Command bytes are preceeded by * an IAC byte. IAC bytes and literal XON/XOFF characters (those which * are not used for flow control) are sent by a CB_FN_CTLCH command. * Characters with the eighth bit set (the "meta" bit) are prefixed with * a CB_FN_META function. * * The next most-significant bit in the byte specifies the sender and * recipient of the command. If this bit is clear (0), the command byte * was sent from the host computer to the Macintosh; if it is set (1) * the command byte was sent from the Macintosh to the host computer. * This prevents confusion in the event that the host computer * (incorrectly) echos a command back to the Macintosh. * * The remaining six bits are partitioned into two fields. The low-order * three bits specify a window number from 1-7 (window 0 is reserved for * other uses) or another type of command-dependent parameter. The next * three bits specify the operation to be performed by the recipient of * the command byte. * * Note that the choice of command bytes prevents the ASCII XON (021) and * XOFF (023) characters from being sent as commands. CB_FN_ISELW commands * are only sent by the Macintosh (and thus are tagged with the CB_DIR_MTOH * bit). Since XON and XOFF data characters are handled via CB_FN_CTLCH, * this allows them to be used for flow control purposes. */ #define IAC 0001 /* interpret as command */ #define CB_DIR 0100 /* command direction: */ #define CB_DIR_HTOM 0000 /* from host to Mac */ #define CB_DIR_MTOH 0100 /* from Mac to host */ #define CB_FN 0070 /* function code: */ #define CB_FN_NEWW 0000 /* new window */ #define CB_FN_KILLW 0010 /* kill (delete) window */ #define CB_FN_ISELW 0020 /* select window for input */ #define CB_FN_OSELW 0030 /* select window for output */ #define CB_FN_META 0050 /* add meta to next data char */ #define CB_FN_CTLCH 0060 /* low 3 bits specify char */ #define CB_FN_MAINT 0070 /* maintenance functions */ #define CB_WINDOW 0007 /* window number mask */ #define CB_CC 0007 /* control character specifier: */ #define CB_CC_IAC 1 /* IAC */ #define CB_CC_XON 2 /* XON */ #define CB_CC_XOFF 3 /* XOFF */ #define CB_MF 0007 /* maintenance functions: */ #define CB_MF_ENTRY 0 /* beginning execution */ #define CB_MF_EXIT 7 /* execution terminating */ #define NWINDOW 7 /* maximum number of windows */ !Funky!Stuff! echo x - uw.c cat > uw.c << '!Funky!Stuff!' # /* * uw - UNIX windows program for the Macintosh (VAX end) * * Copyright 1985 by John D. Bruner. All rights reserved. Permission to * copy this program is given provided that the copy is not sold and that * this copyright notice is included. * * Compile: cc -o uw -O uw.c */ #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <sys/wait.h> #include <sys/time.h> #include <sys/resource.h> #include <sys/uio.h> #include <signal.h> #include <setjmp.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include "uw.h" #define MAXENV 128 /* maximum environment size */ #define W_IN 0 #define W_OUT 1 #define NFDS 20 /* max number of file descriptors */ #define XON 0021 /* ASCII XON */ #define XOFF 0023 /* ASCII XOFF */ #define RUB 0177 /* ASCII RUBOUT */ #define META 0200 /* "meta" bit for whatever it's worth */ #define RCV_OK (-1) /* see recvcmd() */ #define RCV_META (-2) /* see recvcmd() */ typedef int fildes_t; /* file descriptor data type */ typedef int nwin_t; /* window index data type */ struct window { fildes_t w_fd; char w_tty[32]; }; struct window window[NWINDOW]; /* window data structures */ struct window *fdmap[NFDS]; /* mapping from fd's to windows */ struct window *curwin[2]; /* current input and output windows */ char portal[] = "/tmp/uwXXXXXX"; /* UNIX-domain network address */ /* The following are added to the environment of all child processes */ char env_uwin[64] = "UWIN="; char *env[] = { env_uwin, "TERM=adm31", "TERMCAP=adm31:cr=^M:do=^J:nl=^J:al=\\EE:am:le=^H:bs:ce=\\ET:cm=\\E=%+ %+ :cl=^Z:cd=\\EY:co#80:dc=\\EW:dl=\\ER:ei=\\Er:ho=^^:im=\\Eq:li#24:mi:nd=^L:up=^K:MT:km:", NULL }; int ctlch[] = { -1, IAC, XON, XOFF, -1, -1, -1, -1 }; /* CTL char mapping */ struct selmask { int sm_rd; int sm_wt; int sm_ex; } selmask[2]; extern char *strncpy(), *strncat(); extern char *mktemp(); extern char *getenv(); extern done(), cwait(), onalarm(); extern int errno; main(argc, argv) char **argv; { register fildes_t fd, sd; register struct window *w; struct sockaddr sa; /* * Make sure we don't accidentally try to run this inside itself. */ if (getenv("UWIN")) { fprintf(stderr, "%s is already running\n", *argv); exit(1); } /* * Close all file descriptors except 0, 1, and 2. */ for (fd=3; fd < NFDS; fd++) (void)close(fd); /* * Mark all windows closed. */ for (w=window; w < window+NWINDOW; w++) w->w_fd = -1; /* * Create a UNIX-domain network address, and put its name into * the environment so that descendents can contact us with new * window requests. */ (void)strncat(env_uwin, mktemp(portal), sizeof env_uwin - 1); setenv(env); if ((sd=socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } sa.sa_family = AF_UNIX; (void)strncpy(sa.sa_data, portal, sizeof sa.sa_data-1); sa.sa_data[sizeof sa.sa_data-1] = '\0'; if (bind(sd, &sa, sizeof sa.sa_family + strlen(sa.sa_data)) < 0) { perror("bind"); exit(1); } if (fcntl(sd, F_SETFL, FNDELAY)) perror("fcntl(sd, F_SETFL, FNDELAY)"); /* * Ignore interrupts, quits, and terminal stops. Clean up and exit * if a hangup or termination is received. Also catch changes in * child status (so that we can wait for them). Set up the terminal * modes. */ (void)signal(SIGHUP, done); (void)signal(SIGINT, SIG_IGN); (void)signal(SIGQUIT, SIG_IGN); (void)signal(SIGTERM, done); (void)signal(SIGTSTP, SIG_IGN); (void)signal(SIGCHLD, cwait); tmode(1); /* * Tell the Macintosh to initialize. Initialize the current input * and output windows to NULL. */ xmitcmd(CB_FN_MAINT|CB_MF_ENTRY); curwin[W_IN] = curwin[W_OUT] = NULL; /* * Initialize the "select" masks, create window 1 (to start * things off) and wait for input. When input is available, * process it. */ selmask[0].sm_rd = (1<<0)|(1<<sd); selmask[0].sm_wt = 0; selmask[0].sm_ex = selmask[0].sm_rd | 2; if (newwind(window) == 0) xmitcmd(CB_FN_NEWW|1); while (1) { selmask[1] = selmask[0]; if (select(NFDS, &selmask[1].sm_rd, &selmask[1].sm_wt, &selmask[1].sm_ex, (struct timeval *)0) < 0) { if (errno == EINTR) continue; perror("select"); done(1); /* for now -- fix this! */ } for (fd=0; fd < NFDS; selmask[1].sm_rd >>= 1, fd++) { if (selmask[1].sm_rd&(1<<0)) { if (fd < 2) mrecv(); else if (fd == sd) netrecv(sd); else mxmit(fd); } } } } mrecv() { register int len; register char *cp, *cq; auto int nready; char ibuf[512], obuf[512]; static int seen_iac, seen_meta; /* * The received bytestream is examined. Non-command bytes are * written to the file descriptor corresponding to the current * "input" window (relative to the Macintosh -- the window the * user types input to). */ if (ioctl(0, (int)FIONREAD, (char *)&nready) < 0) { perror("FIONREAD"); return; } cq = obuf; while (nready > 0) { if (nready > sizeof ibuf) len = read(0, ibuf, sizeof ibuf); else len = read(0, ibuf, nready); if (len <= 0) { perror("read"); return; } for (cp=ibuf; cp < ibuf+len; cp++) { if (seen_iac) { if ((*cp&CB_DIR) == CB_DIR_MTOH) { if (cq > obuf) { (void)write(curwin[W_IN]->w_fd, obuf, cq-obuf); cq = obuf; } switch (*cq = recvcmd(*cp)) { case RCV_OK: break; case RCV_META: seen_meta = 1; break; default: if (seen_meta) { seen_meta = 0; *cq |= META; } if (curwin[W_IN]) cq++; break; } } seen_iac = 0; } else if (*cp == IAC) seen_iac++; else if (curwin[W_IN]) { if (seen_meta) { seen_meta = 0; *cq++ = *cp|META; } else *cq++ = *cp; if (cq >= obuf+sizeof obuf) { (void)write(curwin[W_IN]->w_fd, obuf, cq-obuf); cq = obuf; } } } nready -= len; } if (cq > obuf) (void)write(curwin[W_IN]->w_fd, obuf, cq-obuf); } recvcmd(cmd) char cmd; { register int nwin, fn; register struct window *w; /* * Perform the function the Mac is asking for. There are three * broad categories of these functions: RCV_META, which tells * the caller that the next character is a "meta" character; * an ASCII data character, which is passed back to the caller * for proper handling; and RCV_OK, which means that this routine * has done everything which was required to process the command. */ fn = cmd&CB_FN; switch (fn) { case CB_FN_NEWW: case CB_FN_KILLW: case CB_FN_ISELW: nwin = cmd&CB_WINDOW; if (!nwin) break; w = &window[nwin-1]; switch (fn) { case CB_FN_NEWW: if (w->w_fd < 0 && newwind(w) < 0) xmitcmd(CB_FN_KILLW|nwin); break; case CB_FN_KILLW: killwind(w, 0); break; case CB_FN_ISELW: if (w->w_fd >= 0) curwin[W_IN] = w; break; } break; case CB_FN_META: return(RCV_META); case CB_FN_CTLCH: return(ctlch[cmd&CB_CC]); case CB_FN_MAINT: if ((cmd&CB_MF) == CB_MF_EXIT) done(0); /*NOTREACHED*/ } return(RCV_OK); } xmitcmd(cmd) char cmd; { static char cmdbuf[2] = { IAC, '\0' }; /* * Transmit the command "cmd" to the Macintosh. The byte is ORed * with the host-to-Mac direction indicator. */ cmdbuf[1] = cmd|CB_DIR_HTOM; (void)write(1, cmdbuf, sizeof cmdbuf); } netrecv(sd) register fildes_t sd; { register struct window *w; register int cnt; struct msghdr msg; auto int fd; struct iovec iov; struct stat st1, st2; static int unity = 1; char buf[256]; /* * main() calls this routine when there is a message waiting on * the UNIX-domain socket. The message's access rights are * expected to contain the file descriptor for the "master" side * of a pseudo-tty. The message contains the name of the pty. * The sender is expected to start up a process on the slave side * of the pty. This allows the host end to create windows which * run something other than the shell. */ fd = -1; iov.iov_base = (caddr_t)buf; iov.iov_len = sizeof buf - 1; msg.msg_name = (caddr_t)0; msg.msg_namelen = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_accrights = (caddr_t)&fd; msg.msg_accrightslen = sizeof fd; if ((cnt=recvmsg(sd, &msg, 0)) < 0) perror("recvmsg"); if (msg.msg_accrightslen > 0 && fd >= 0) { /* * We can't trust the process which connected to us, so * we verify that it really passed us a pseudo-tty's * file descriptor by checking the device name and its * inode number. [Of course, if someone else wants to * hand us a terminal session running under their uid....] */ buf[cnt] = 0; if (strncmp(buf, "/dev/ptyp", sizeof "/dev/ptyp" - 1) || fstat(fd, &st1) < 0 || stat(buf, &st2) < 0 || st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) { (void)close(fd); return; } /* * OK, we believe the sender. We allocate a window and * tell the Macintosh to create that window on its end. */ buf[5] = 't'; /* switch to "/dev/ttyp?" */ for (w=window; w < window+NWINDOW; w++) { if (w->w_fd < 0) { w->w_fd = fd; fdmap[fd] = w; selmask[0].sm_rd |= (1<<fd); (void)strncpy(w->w_tty, buf, sizeof w->w_tty-1); xmitcmd(CB_FN_NEWW|(w-window+1)); break; } } /* * If we have no free windows, then we close the file * descriptor (which will terminate the slave process). */ if (w == window+NWINDOW) (void)close(fd); /* * Set non-blocking I/O on the master side. */ (void)ioctl(fd, FIONBIO, &unity); } } mxmit(fd) register fildes_t fd; { register char *cp, *cq, i; register int len; char ibuf[32], obuf[32]; /* * Copy input from file "fd" to the Macintosh. Be sure to convert * any embedded IAC characters. * * Note that the input/output buffers should NOT be very large. * It is undesirable to perform large reads and effectively * "lock out" all other file descriptors. The chosen size * should preserve a reasonable amount of efficiency. */ if (fdmap[fd]) { curwin[W_OUT] = fdmap[fd]; xmitcmd(CB_FN_OSELW|(fdmap[fd]-window+1)); cq = obuf; if ((len = read(fd, ibuf, sizeof ibuf)) < 0 && errno != EWOULDBLOCK) { killwind(fdmap[fd], 1); return; } for (cp=ibuf; cp < ibuf+len; cp++) { if (*cp&META) { if (cq > obuf) { (void)write(1, obuf, cq-obuf); cq = obuf; } xmitcmd(CB_FN_META); *cp &= ~META; } i = -1; if (*cp == RUB || *cp < ' ') { i = sizeof ctlch; while (i >= 0 && ctlch[i] != *cp) i--; } if (i >= 0) { if (cq > obuf) { (void)write(1, obuf, cq-obuf); cq = obuf; } xmitcmd(CB_FN_CTLCH|i); } else { *cq++ = *cp; if (cq >= obuf+sizeof obuf) { (void)write(1, obuf, cq-obuf); cq = obuf; } } } } else (void)read(fd, ibuf, sizeof ibuf); if (cq > obuf) (void)write(1, obuf, cq-obuf); } killwind(w, notify) register struct window *w; { register int mask; /* * Kill window "w". Notify the Macintosh that it is gone if * "notify" is nonzero. */ (void)close(w->w_fd); mask = ~(1<<w->w_fd); fdmap[w->w_fd] = NULL; w->w_fd = -1; if (curwin[W_IN] == w) curwin[W_IN] = NULL; if (curwin[W_OUT] == w) curwin[W_OUT] = NULL; selmask[0].sm_rd &= mask; selmask[0].sm_wt &= mask; selmask[0].sm_ex &= mask; if (notify) xmitcmd(CB_FN_KILLW|(w-window+1)); } newwind(w) register struct window *w; { register char *cp; register fildes_t fd; register int pid; register char *shell; char pty[32], ptysufx[2]; static char ptyidx[] = "0123456789abcdefghijklmnopqrstuvwxyz"; static int unity = 1; extern char *getenv(); /* * Create a new window using the specified component of "window". * This routine isn't very smart at finding pseudo-ttys. */ ptysufx[1] = '\0'; for (cp=ptyidx; *cp; cp++) { ptysufx[0] = *cp; (void)strncpy(pty, "/dev/ptyp", sizeof pty-1); (void)strncat(pty, ptysufx, sizeof pty-1); if ((fd = open(pty, 2)) >= 0) break; } if (fd < 0) return(-1); (void)ioctl(fd, FIONBIO, &unity); /* set non-blocking I/O */ fdmap[fd] = w; w->w_fd = fd; selmask[0].sm_rd |= (1<<fd); (void)strncpy(w->w_tty, "/dev/ttyp", sizeof w->w_tty-1); (void)strncat(w->w_tty, ptysufx, sizeof w->w_tty-1); while ((pid=fork()) < 0) sleep(5); if (!pid) { (void)signal(SIGHUP, SIG_DFL); (void)signal(SIGINT, SIG_DFL); (void)signal(SIGQUIT, SIG_DFL); (void)signal(SIGTERM, SIG_DFL); (void)signal(SIGTSTP, SIG_IGN); (void)signal(SIGCHLD, SIG_DFL); (void)ioctl(open("/dev/tty", 2), (int)TIOCNOTTY, (char *)0); (void)setuid(getuid()); /* shouldn't need this */ if ((fd=open(w->w_tty, 2)) < 0) _exit(1); if (!(shell = getenv("SHELL"))) shell = "/bin/sh"; (void)dup2(fd, 0); (void)dup2(0, 1); (void)dup2(0, 2); for (fd=3; fd < NFDS; fd++) (void)close(fd); tmode(0); /* HACK! */ execl(shell, shell, (char *)0); _exit(1); } return(0); } tmode(f) { static struct sgttyb ostty, nstty; static struct tchars otchars, ntchars; static struct ltchars oltchars, nltchars; static int olmode, nlmode; static saved; /* * This routine either saves the current terminal modes and then * sets up the terminal line or resets the terminal modes (depending * upon the value of "f"). The terminal line is used in "cbreak" * mode with all special characters except XON/XOFF disabled. The * hated (by me) LDECCTQ mode is required for the Macintosh to * handle flow control properly. */ if (f == 1) { if (ioctl(0, (int)TIOCGETP, (char *)&ostty) < 0) { perror("ioctl((int)TIOCGETP)"); done(1); } if (ioctl(0, (int)TIOCGETC, (char *)&otchars) < 0) { perror("ioctl((int)TIOCGETC)"); done(1); } if (ioctl(0, (int)TIOCGLTC, (char *)&oltchars) < 0) { perror("ioctl((int)TIOCGLTC)"); done(1); } if (ioctl(0, (int)TIOCLGET, (char *)&olmode) < 0) { perror("ioctl((int)TIOCLGET)"); done(1); } nstty = ostty; nstty.sg_erase = nstty.sg_kill = -1; nstty.sg_flags |= CBREAK; nstty.sg_flags &= ~(RAW|CRMOD|ECHO|LCASE|XTABS); ntchars.t_intrc = ntchars.t_quitc = -1; ntchars.t_eofc = ntchars.t_brkc = -1; ntchars.t_startc = XON; ntchars.t_stopc = XOFF; nltchars.t_suspc = nltchars.t_dsuspc = -1; nltchars.t_rprntc = nltchars.t_flushc = -1; nltchars.t_werasc = nltchars.t_lnextc = -1; nlmode = olmode | LDECCTQ; if (ioctl(0, (int)TIOCSETN, (char *)&nstty) < 0) { perror("ioctl((int)TIOCSETN)"); done(1); } if (ioctl(0, (int)TIOCSETC, (char *)&ntchars) < 0) { perror("ioctl((int)TIOCSETC"); done(1); } if (ioctl(0, (int)TIOCSLTC, (char *)&nltchars) < 0) { perror("ioctl((int)TIOCSLTC"); done(1); } if (ioctl(0, (int)TIOCLSET, (char *)&nlmode) < 0) { perror("ioctl((int)TIOCLSET)"); done(1); } saved = 1; } else if (saved) { (void)ioctl(0, (int)TIOCSETP, (char *)&ostty); (void)ioctl(0, (int)TIOCSETC, (char *)&otchars); (void)ioctl(0, (int)TIOCSLTC, (char *)&oltchars); (void)ioctl(0, (int)TIOCLSET, (char *)&olmode); } } done(s) { register struct window *w; register fildes_t fd; /* * Clean up and exit. It is overkill to close all of the file * descriptors, but it causes no harm. After we are sure that * our UNIX-domain network connection is closed we remove the * entry that it created (as a side effect) in the filesystem. * * We also restore the terminal modes. */ /*xmitcmd(CB_FN_MAINT|CB_MF_EXIT);*/ for (fd=3; fd < NFDS; fd++) (void)close(fd); (void)unlink(portal); tmode(0); exit(s); } cwait() { union wait status; struct rusage rusage; /* * Collect dead children. We don't use the information that * wait3() returns. (Someday we might.) */ while (wait3(&status, WNOHANG, &rusage) > 0) ; } static char *earray[MAXENV+1]; setenv(env) char **env; { register char **ep1, **ep2, *cp; char **ep3; extern char **environ; /* * Merge the set of environment strings in "env" into the * environment. */ /* * The first time through, copy the environment from its * original location to the array "earray". This makes it a * little easier to change things. */ if (environ != earray){ ep1=environ; ep2=earray; while(*ep1 && ep2 <= earray+MAXENV) *ep2++ = *ep1++; *ep2++ = NULL; environ = earray; } /* * If "env" is non-NULL, it points to a list of new items to * be added to the environment. These replace existing items * with the same name. */ if (env){ for(ep1=env; *ep1; ep1++){ for(ep2=environ; *ep2; ep2++) if (!envcmp(*ep1, *ep2)) break; if (ep2 < earray+MAXENV) { if (!*ep2) ep2[1] = NULL; *ep2 = *ep1; } } } /* Finally, use an insertion sort to put things in order. */ for(ep1=environ+1; cp = *ep1; ep1++){ for(ep2=environ; ep2 < ep1; ep2++) if (envcmp(*ep1, *ep2) < 0) break; ep3 = ep2; for(ep2=ep1; ep2 > ep3; ep2--) ep2[0] = ep2[-1]; *ep2 = cp; } } static envcmp(e1, e2) register char *e1, *e2; { register d; do { if (d = *e1 - *e2++) return(d); } while(*e1 && *e1++ != '='); return(0); } !Funky!Stuff! echo x - uwtool.c cat > uwtool.c << '!Funky!Stuff!' # /* * uwtool * * Copyright 1985 by John D. Bruner. All rights reserved. Permission to * copy this program is given provided that the copy is not sold and that * this copyright notice is included. * * Compile: cc -o uwtool -O uwtool.c */ #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <sys/wait.h> #include <sys/time.h> #include <sys/resource.h> #include <sys/uio.h> #include <signal.h> #include <stdio.h> #define NFDS 20 /* max number of file descriptors */ typedef int fildes_t; extern char *strncpy(), *strncat(); extern char *getenv(); main(argc, argv) char **argv; { register char *cp; register int pid; register fildes_t sd; auto fildes_t fd; char *portal, *shell; char tty[32], pty[32], ptysufx[2]; int lmode; struct sgttyb sg; struct tchars tc; struct ltchars ltc; struct iovec iov; struct msghdr msg; static char ptyidx[] = "0123456789abcdefghijklmnopqrstuvwxyz"; struct sockaddr sa; /* * Close all file descriptors except 0, 1, and 2. */ for (fd=3; fd < NFDS; fd++) (void)close(fd); /* * Get the terminal configuration for this tty. */ (void)ioctl(0, (int)TIOCGETP, (char *)&sg); (void)ioctl(0, (int)TIOCGETC, (char *)&tc); (void)ioctl(0, (int)TIOCGLTC, (char *)<c); (void)ioctl(0, (int)TIOCLGET, (char *)&lmode); /* * Create a UNIX-domain socket. */ if (!(portal=getenv("UWIN"))) { fprintf(stderr, "You must run %s under the window manager\n", *argv); exit(1); } if ((sd=socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } sa.sa_family = AF_UNIX; (void)strncpy(sa.sa_data, portal, sizeof sa.sa_data-1); sa.sa_data[sizeof sa.sa_data-1] = '\0'; /* * Obtain a pseudo-tty. This code isn't very smart about finding one. */ ptysufx[1] = '\0'; for (cp=ptyidx; *cp; cp++) { ptysufx[0] = *cp; (void)strncpy(pty, "/dev/ptyp", sizeof pty-1); (void)strncat(pty, ptysufx, sizeof pty-1); if ((fd = open(pty, 2)) >= 0) break; } if (fd < 0) { fprintf(stderr, "Can't obtain a pseudo-tty for a new window\n"); exit(1); } (void)strncpy(tty, "/dev/ttyp", sizeof tty-1); (void)strncat(tty, ptysufx, sizeof tty-1); /* * Fork a child process using this pseudo-tty. Initialize the * terminal modes on the pseudo-tty to match those of the parent * tty. */ while ((pid=fork()) < 0) sleep(5); if (!pid) { setuid(getuid()); /* in case it is setuid-root by mistake */ (void)signal(SIGTSTP, SIG_IGN); (void)ioctl(open("/dev/tty", 2), (int)TIOCNOTTY, (char *)0); if ((fd=open(tty, 2)) < 0) _exit(1); (void)dup2(fd, 0); (void)dup2(0, 1); (void)dup2(0, 2); for (fd=3; fd < NFDS; fd++) (void)close(fd); (void)ioctl(0, (int)TIOCSETN, (char *)&sg); (void)ioctl(0, (int)TIOCSETC, (char *)&tc); (void)ioctl(0, (int)TIOCSLTC, (char *)<c); (void)ioctl(0, (int)TIOCLSET, (char *)&lmode); if (argc == 1) { if (!(shell=getenv("SHELL"))) shell = "/bin/sh"; execl(shell, shell, (char *)0); perror(shell); } else { execvp(argv[1], argv+1); perror(argv[1]); } _exit(1); } /* * Pass the file descriptor to the window server and exit. */ iov.iov_base = pty; iov.iov_len = strlen(pty); msg.msg_name = (caddr_t)&sa; msg.msg_namelen = sizeof sa.sa_family + strlen(sa.sa_data); msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_accrights = (caddr_t)&fd; msg.msg_accrightslen = sizeof fd; if (sendmsg(sd, &msg, 0) < 0) { perror("sendmsg"); exit(1); } exit(0); } !Funky!Stuff! echo x - uw.hqx cat > uw.hqx << '!Funky!Stuff!' (This file must be converted with BinHex 4.0) :!R9h!%&38%a99dP1)!#3"e)$FfS!N!3"!*!$8'N!!%pT!!!"QM-+!!$r1$)+!M! XpM%hE@9dB3S!!!*R!2`i0!S!!!B!%`#!3Qcf-6GYCA4K#J!!rcJd#J)J,2BhEh9 dGfPZ#J!!!QF!r$Je#J!!!L"XpMG[GA4hD@i+!!!'%#J!R'F!r$Je#J!!#MmZrr` r,[rq,bcf0fpeG(GTEJS!!!J3%dL!2`"1Z[YNFQ&hBfJ+!!!)h[`!#Me!rrlr1$8 +rcJc#[mi-3Vr0$B+"&+,B!$m0$3+!!$r0$8+rc3a#JSq(b4I*Pp1ANjerb3d-!S #rjcqD@pVD@aXG`S#6PEm*$Jf#J!!#Lm,*Qi!##!,X+cf0QPZG`#3!``!93#!!2m "I`#"4%3!N!-N99G*6J#3!`&*3diM!!%!N!1!!!%!J8C548B!!3#3!i!!!3#"!!! "V!!2!*!&p!!+!3`!1J3'3f&ZBf9X!*!&)J!+!$S!)J3"-F!!N!9!!!S!@!!L"!% b`!#3"9i!#J"f!#)%!62!!*!&I!!+!*3!)J3"0-!!N!@D!!S!XJ!L"!%e`!#3"EJ !#J$3!#)%!6E!!*!&eJ!+!1i!)J3"0`S!N!8Q!%`!0J'fL"8SEQmJFh9MD#"hD@j NEhFJ+#-a+5N(!*!&4!"-!&3"YSJ9+'j[)(0eBfJJGfPZC'ph)#JM-LNT!3#3"@) !6!"b!ED)&5KZEb"cG@0S)(GTEQ4[Gb!S)c-T+5!!N!@!!%`!N!!"YSJ9+'j[)(0 eBfJJGfPZC'ph)#JM0#NT!J#3"Ci!6!#Z!ED)&5KZEb"cG@0S)(GTEQ4[Gb!S)c8 T+5S!N!@m!%`!c!'fL"8SEQmJFh9MD#"hD@jNEhFJ+#-f+5R`!*!&fJ"-!1S"YSJ 9+'j[)(0eBfJJGfPZC'ph)#JM0bNT"`#3"3S!#J!D!ED)'e0PE'9MG#"hD@jNEhF JG'mJBQ8JEh"PEQ9N1JB!N!-L!!%!N!@&!'J!R3#B"!*25`#3"3S!#J#!!28)!Pi `!*!$(3"r!)!!kJ'!!!(rr`#3"i))3@*[GA3J99F!N!-J!#J!)!%q!H!!!Irr!*! (J`Y2F'9Z)>EQ4[G`#3!`G"8&"-!*!'"e9A58i!!3#3!`%!N!N$rrr!!J!!3!, rrd!#J!&!!S!"3!+!!8!#J!&!!U!"3!+!!8!#Z!&!!S!"3!+q!8!#JB&!![rr3!) !!%!#rrp!!S!"3!+!!8!#J!&!!U!"3!+!!8!#Z!&!!S!"3!+q!8!#J!&!![rr3!) !!%!$rrr!"!!!)!rrrr!!N!J$rrr!!rrr`!2rrm!$rrr!!rrr`!2rrm!$rrr!!rr r`!2rrm!$rrr!!rrr`!2rrm!$rrr!!rrr`!2rrm!$rrr!!rrr`!2rrm!$rrr!!rr r`!2rrm!$rrr!!rrr`!2rrm!$rrr!!rrr`!2rrm!$rrr!"rrri!rrrr!!!!%!(rr m!"!!"J!3!!8!%!!%J"!!"%!3!!3J%!!(m"!!!"!3!!!3%!m!%*!$J"#3!i!3N!1 !%"!!J"!3"`!3%!3!%"!%!"!3!!!3%!!!%"!%!"!3!!!3%!!!%"!!!"!3!!!3%!! !%"!!!"!3!!!3%!!!%"!!!"!3!!!3%!!!%"rrrr!Irr`!(rrq!"rrr`!Irrq!(rr r`"rrrq!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rr rm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rrrm"rrrr!Irrr`(rr rm"rrrr!Irrr`(rrrm!!!"!"KB8'3"Z(K`C!'Fh06N!Ecmp13"Q4N4*!'j16%N!C QCND3"ZEQaT!'D'K)N!ESk-L3"QGR4j!'jqI(N!CkHPU3"[VkfT!'H(KBN!Eiq0L 3"Q0M3j!'iq2$N!CfGPD3"[EfeT!'!*!3BQ*#N!ELiX+3"R&a8C!'mI(4N!ChGeH 3"[Ihej!'C@9&N!EPjF@3"R*b8T!'m[,5N!CjH9Q3"[RjfC!'G(48N!Edp053"M% a)5%a-5%KXE'KSE'aSD%b-N"!-M*!3,+b`-#bXX$!-c-M)c-c)b1cXk1MXl1MSc3 d*#3d0#3NY,5NT,5dT+3f0PjH0MCHAVDfhYkfYYlH068P*68e*5@eYD@PYE@PT6d p+bXp25XV[EfVUlfpUkXj15JS16NS+,QjU+LjZDLS0cFQ*MFh*LDhYkDQYlHQTLd YAemY,9pIVDhIhkfYhpmi1#SU1$JU+VLiUUUiZ+UU-$!T+6!`+5Q`X+QTX,#TU9e GIAeGAAephGhprGhGrIe[Edq3"Zr[cj!'GA99N!EepG@3"PYEHhYE@hYlfp[lqp[ EqrYTD8Q3"ZRTbC!'F("3N!E`m0#3"Jf3%'aX6*!'l1c-N!CUDNU3"ZVUbT!'*bF L)LFR)L+RTk+LTkHLSQYV5j!'kq[,N!Bl1cSk1cXk1VZlZVUlZlUkA&amI&aFI(c Fh2cmh0cmr#`X2$`X,$`mV+bm[+bX[,`[,cmr,bmr2kq[[lq[VlqrEQj1N!EZlXk 3"QeY6C!'lHh0N!BZ,Miq,Liq2UkZ[VkZVVkq#C!)LC!))*!)S*!)'f"qIKYJIRk Ed1lZQp$ZlRm)I`Kr#(m)riMrL2q)riJ$N"!!N,-K!)%!@J!3!!$,e2q3"!%8#d& LEh9d)&9A,T!$!*!)A!##!&%!J!!!bp6rN!0I"PGTEQ4[G`01CAF!N!3%6h"PEJ# 3"!9$E'pcC3#3"!4,D@aX!*!%!5d!N!3)8fKeG'4[Gfi!N!3",3#3"!44G@Pd!*! (!4S!J`"F!8!!!-[8rr[rG`90Ef4PE3Sa)&0dEh!J3QPd!*!%#c)J8h4[F#"#DA4 c!*!%!5d!N!3*6QmJ8'&bDA4j!*!%#d9fC@iJ8'&bDA4j!*!%#NpNC#"3BA*TG(N !N!3",3#3"!Jc-$!JBQ&eC!#3"!Jf-$!JBQ&eC!#3"!Na-M!`)'*KG@3!N!3*-6J `-#"LBA9N!*!%#6)d-$!JBQ&eC!#3"!Nc0M!`)'*KG@3!N!3*0$J`-#"LBA9N!*! %#6Fb-$!JBQ&eC!#3"!Nj0M!`)'*KG@3!N!3+-6Nb-$!JBQ&eC!#3"!%Y!*!%#&0 PEQ3J@%p1!*!%#P0PEQ3J3R*PB@X!N!K!!)3!B!!`!!$,e2q3"!K,CAPLEf&bC!K eEQeKF("PC!#3"!G+4%)JE@&`!*!%#Q0eFh4[E5"YBA!!N!`E!#d!"J&0!IS!!2q 3"!#3"!KAD@jNEhFJ)`!!!J`!"aj"EL"eEQYZEhGZ)'9bFQpb)'KKFb"[Bf0eFR* PC#j#35"bCA&eDA*PC#"bCA0[GA*MC5"MEh9XC'iRG#"LC5"QEh9ZC#iJ)%9iC@0 eG'P[EL"MB@jZEh3JBfpZG'PZG@8ZEe4SC5"538dJFf9bD@&X)'4bDACPFL"MEh9 XC'iRG#"LC5"[F'9ZC@3Z)#"8D'8J8Np0)'4bDACPFL"hD@aX)'*P)(9cC@3l)'K [Gf9fCA)X)'CXEhFJBfpZG(*[E#"hD@aX)'*P)'4PCh*KC'9N,N4")&*265"cCA* TB@`JC(*TGQ9b)'0[G@aN)'j[G#"LC5"[F'9ZC@3Z)#"&H'9MGA4TEfiJBf&ZEQp d)'0[ER4TER9P,NC8D'9bC5"KFQ8JB@abC@&NH5"cCACPEL"[F'9Z)(GTEQ4[Gh- Z)#"1Eb"YEh*P)(GTEQ4[Gh-JBf&Z)'*P)'0bC@&dC@3Z58ePE@pbH5"KE'a[Bf& dD@pZ)'CKD@aPC#!SFQ&Z)'peG#"[CL"YC@e[FRNT,L!J4AKPBh9dD@pZ)'0KEQj [G#"MEfjdD@jeC5jK9'KP)'YPH@*[BA*N)'eKF#"bCA0[GA*MC5"MEh9XC#"ZEh3 JBQ8JCQpeEQ3Z)#"CEh8JEA9cG#"cC@aPBh3JB@j[G'KPFL"VCAPLEf&bC#"YBA" `D@jR)'CeEQ0dD@pZ,J#3!di!!3#3"8N!aJ"K!2B%!Np,!*!&#J!+!$m!pSJY99F J9Q9bFfP[EL!a,MBJ+$%i,8TeE#di05NJBRNJ5QpSEL"%,L"#FR9ZCA)Z!*!%F!# 3!i!!N!GJ!*!$)!!!2c`!!DR`)kir2!!"UI!HbMmm!!'Tm!X52c`!!DR`)q`r2!! "UI!+pMmm!!'Tm!Ai2c`!!DR`"fJr2!!"UI!M)$mm!!'Tm#6Z2c`!!DR`#D)r2!! "UI!!!$mm!!+Tm!!!2&`!N!-,S$CCMbmm4%&836mm!!#TS#CI@Bm[#kQP+"mk22* %5-9%K5!&d)5M(LK)fF8Kc!+f)&-L6#!%S#i[#kQM6Ud!HN(Y!(Si+2rq,`LTm9Q 2,ca$6d4&2`5TS#"IS%QJ(8KXrrT)E2rq6VS!,,bcrqMmXrrj1ZJ!'A)p1G8j @!!"1ZJ!86VS##%*R6VS"j&526Pj1G8je6PB!!$m(5'cd9Nkk,f*BMdkk0'j#Ccm mrrp1ZLL!@)p1ZLZb6VSd+%*($%F!"'a!-!I3I!#"2`"1ZM3H9)md"qH#3HcrcY$ #))!`"qH!3HcrcY$!)""Q&$mm!!*1ZJ859)mr2!!"6VSbr&528NGJZNKX!+S[,2r 16VScmP#23NF-4`!%E"K#Cc!(ji""l2r1d-![%%kk+V"FMe*(B1*1ZLUm6VSi1N+ R6VSkL&L26VS[&%kk!"41ZJ@86VSF"%kk)eBq(djH6R919[e),`Xr2!$52c`"S$m m!)3r2!"J5'lrA%kk1(6Hr!!-3UG#Cd+R2c`!!cmm!!&)E!#`5'lrA%KZrf41ZLV Hh[`!'M!Zrf"C3$m!-#lrBPP!2`!`,[pF@%!r!$!ZrejB3$m!5'lrA%kk1#EHr!! -3Llp5%(XrqSQ5#!6CaBr2!(r,a0)E[e)6VSa8Ylm!!TBLf$Q3Llr4d*R5'lrA%K Zr8K1ZM'f@)p)`#m!5'lp5%kk13,Hr!!15'lr5#mm!*!$2%kk0r43MdKZrd`r2!! +6VSQbPb25N"Q&L!Zre)N,[p)e,`!!!)FX)*Q!Q!#B0J-EJ!"rdaQ#Nkk*["+3'F #B2C)E[pN6VSUKPL2*Pp1ANje6PB!!%+R6VSJU&L26VSF'MmZ!!K1ZM&d9)p1ANj e6PErf$m(,`B`,22Q@8!r!$!XmqKC3$m!2c`!'$mm!!4)E[ri6VSh1Ylm!!`r2!% X2c`"r$mm!"Jr2!!B5'lrm%kk0alHr!!-3Qcrb$!XrmKQ!!)X6VSGQ%KZrpJr22r r6VSQ#Pb25N"R!!)--#lrf,"m!!&R"'!!!2T)E[rS5'lriNkk0p"3Ml"m!!&R!Q! B5'lriNkk0eaBMbm!6VS"k&L2B!!!b'!)X(`!!QF#B"3[,[rS5'lrf%kk*8T3Mf! !!+aJ#,"m!!4R!Q!D5'lrq%KZrq)[,[rS6VSY%0lm!!aJ!!#+B!L`I!!&C`*J5NK Zrr")E[rL,blrk%kk,3EHr!!-,!"#Cb!'i)$JJ-#m!!$rrcm!)!E![!!!rrmr!#m ZrqK1ZLckh[`!#LmZrqK1ZJK`@)pJ0Q!)X(`!"QF#B"T)E[rL,blrk%kk0b*3MdS !C`41ZJF8B"4J#,"m!!0R!Q!+,blrk%kk*DaBMf!!!3KJ%,"m!!0R#V"m!!9R"'! !!)"1ZLaF5'lrf%kk)T!!@)mq!$!ZrqE!I!%!Ce3r"dkk0QC8Mbe!rq`J,[rXi)$ JJ'F-,blrl%kk!-jBMf!`$%F!-@dB$%F!0fi5-!H3!(`!-%M!,`"1ZJ8q@)pJ%Lm XpTB`"m"m!"mr!%kk'["FMf!-,bcfPMm(6VSDiPb2B(KJ#,"m!!CR!Q!U)#lrfLe !rqJ[,[rS6VS`R&L2,blrk%kk"i"BMbmZrqK1ZM#B@)pJ4Q!)X(`!"fF#B!4J1Q! )X(`!#'F#B#!J,[rD,8$rk$!ZrqE!I!!"2`![,[rS6VS'a&b2B"*J#,"m!!TR!Q! %B!CJ","m!!Y1ZLiUB!$pd#`I2Kp1ANje6PEqqMm(2`B[#bm+)#i!#1#!i)$![!! !rrmq!#!Z!!M![!!!rrmm!!a(!)&Y!!#L$%F!K@`!!*T"l2r+)!Jd"qG#5-,3JT! ![!!!"!JQ3!a(!)&Q@Ja'!!&Q0Lmmrj!%3UFr2!##6VSe2Ylm!!SY32rm)#lrr'F @5'lrqN+R6VSe[P#2,blrr%kk06CBMf!F5'lqqMm',bX!"%kk-mlHr!!+5'lqqNk k0(aBMf!L)"-d"ZG#5-,3JP'!*%!J%QF3)&)[#cm',bS!"%k3!0lm!!T#Cdkk0-* 8Mb4I*Pmm(ciI6Pj1G8j@!!!jI!!"rmK1ANje6PB!!$mZ!!Jr2!#!5'cqb%kk!#a 3MdKX!,C)E!#d5'`!XNKXrXK1ZL[kh[`!%%+R2c`!J8kk0H4FMdjH6R919[rm2`F [#bm+2bi!$%KX!,K1ZL*UA)mY32rm)#lrr'GN$'i!N!-1E`i`,J!1)'lrr#"3X&" ["Mem!!%!$MiZ!!iJE[rm)&""k!!#*NK64c!($%!!!'m8)!X8%dL#a(`!rdM#d)* 5J#C!B1)NEJ!)%"Y)J$i!$%F!!'m'&0Y64f$d3K*J$NKX!,i[,J!)6VSXYP#2*&m QAciI6Pj1G8j@!!![#d(XpTSQ5#!,3HcfQL3)e,`!!!IZX)*X6N)V!*`r2!%!6VS `qP52*d!!ZMmm"q"1ZM$X9)mR3!#q,`Y1ZJEB@)mJ+`#qC`BJ+`#kCK3r2!!'6VV qc&522c`!!8kk,,C8MpEm!5*JS%kk-q3T32D5,c`!N!-"6VS!#PL2*Pp1ANje6PE rr#m(,Li!##m,,`S-K`#3"'e%$)F!N!4[0Jb(!*!$"fiZ3HcfQL!)*!G6JLm#*$` !!!%L,`*1ZLc8*"r3JLC!%#X!R'F),`G1ZJ0F@)pJ"'!!!GTJHN(XpTSQ5#!,3Hc fQL3)e,`!!!IZX)*X$"!V!*aR"YEm!5*JiL!,3HcfQL3)e,`!!!IZX)*Q"'!!!Ci N#d(XpTSQ#*4$5-+&r!%L8N)`2!!!J%)r!%kk'$*8Mb3,3HcfQLB)P%0)`SAm!5* 53M!m!"#!3Mm!6VSB%P52&h`!!3#F0h`!'!#H0h`!8!#J0h`!&`#L3QX!T%*V!+K #D`#Q,`Y1ZJ@B@)m[22q3"%(6,`Jr2!#!6VSN90lm!!T+J'B82c`!!NkkrAj8Mcm m!!&1Z[RH9)m[+`#k3G-[#%kk)1*3Mb!V!,S[!#mV!,T1ZLX)@)mN(m-,3JL4 !)!SN+`#ke,`!!!%!9B+`JQ`B)!Y"l2DD)JL3!%&)`)(m!5,3I!!a&-"#%LmV!,T "dbm)6VSJCP#25'lrr%kk*bKBMd(6,`K1ZLF1@)mr2!!%6VSLl&522c`!#8kk)`* 8Mcmm!!&1ZL,S9)m`,2D#CbC#E2D#5'cfLNkk)b*BMc!XpSV3E2D-18$fL$PXpSl fKMPXpSVfK%*R3QG1ZLED@)m[,[rm6VSQX&L22c`!!826R[`!R#"2F%e1ZLCk6VS #00lm!*j$djlm!*`J6h"06VSQC%kk!TcHr!#F*&mQAbiI6Pj1G8j@rr!["biZ!!J [#bm+2`B-K`#3"'`!!0![22q3"%+R2c`!Jdkk-2$Hr!!+*%!J#QB%B!!"%M`m!!) -4J!*E!!!N!""l2DD)!Jd"XAm!5*)`Y##N!#m!!!#4#C!%#X!R'C!5'lrm%KZrrK )E[rq2`B[#Nkk+(cHr!!52c`!rbmZrrK1ZM(NA)p)E[r`,blrq$mZrrir"Lm+6VS SG0lm!""J+NKZrr")E[ri5'lrrM!'AN!r!#m+6VSS10lm!")[+`#k,blrq%kk+'4 3Me*'B!$rE%KZrra#Tdkk-0C3Mbm+6VS`8&L2B"`-K`#3"'m5$)F!N!-(EJSJ"e+ !28$rr'!#B%3-EJ!"rra[2!aZ!!Rrr'`d3HcfQL!)0#lrr-Am!5*)`Y##N!#m!!! #4#C!%#X!R'F83G-[#%kk(ZCBMd(6,`K1ZKkm@)mm(b4I*PmZ(djH6R919J!!)#c fPQF1,bcfPNkk(UaBMd+XpTC1ANje6PB!!#m(,Li!##m,$)F!N!4Y1!b(!*!%Eb` -K`#3!`GZ*%(XpTSJ##3(,`)N2!!!!5)[!Nkk+5iN(p##N!#m!!!")LC!B!*J6'! N*QcfPL3,3HcfQLB)P%0)`SAm!5*53M!m!!L!3Mm!6VS8c&52)!YR)K!V!*aR(%) V!*a"dbm)6VSK9PL2,`Y1ZKGD@)mQI!#3"#CI,Kp1ANje6PErr#m,*Qi!##m+-#i !$'G!3HcfQL4))!T"l2DD*!M8[!!!"qk`JQ`8)!Y"dV#)CJBT5[D@B!E8r!%LB0S J#N(XpTSN#05m!!!(lV##CJ*J*%KZrra1ZL3F@)m[#dkk*!4BMbm,6VSGb&L2,bl rr%kk)r*BMb4I*Pp1ANje6PErm#m,,`Sr"cm'3HcfQLe)rrJJ,[ri3HcfQL3)e,` !!!IZX)*X'L!Z!!JJE[ri3G#`L'B#B!S'VJ!!!5,rq'$5)#lrq%(XpTSN#05m!!! (lV##CJ4J!!&U5'lrr%kk)jCBMbmZ!!K1ZL0m@)mJEJ!)-#J!&&P!N!"m!"")`)( XpSJJE[ri-8!!RL"Z!!J`+!!@@8#3!(`!%%M!JHcfKL"ZrrJa3!#J)'i!#%(S!"! [#%kk(4"BMbmZ!!K1ZKcf@)mJEJ!)-#J!&&9!N!"m!"!r!$3XpSBJE[riaHJ!S$! m!!,33Mm!2c`!!Mmm!!*)E[r`6VSXcYlm!!a)E[r`6VSM(PL2)'lrq!aS!"J!RQm %3NGJ$M!m!"JJE[riN!"S!*iq!#"ZrrK"k!$#)!Jd"q9#5-,3JLC!0$`!'#"ZrrL 8D!#H-!H3!%)d,2D)aF!`2!!#d'cfK0"#2!!-4`!BE#`N@`a5!!"[($m'2c`!!Nk k*@TBMcm53QG"kJ!#,`K1ZKk88)rFE2D)8NGJcLmZrrK1ZJ8-@)mr2(rr2carrcm mJ!!r2)!!5'lrm%kk,"MHr!!-5'lrm%kk)QKBMbmZrra1ZL)S@)mm(ciI*&mQAdj H6R919[rm,`XQEJ!),`SND`#q3HX!`Le)rra#8N)U!!)J#Y6m!&3JE[rm@+lrr## !)!SN+`#qe,`!!!IJX)*YfL4I*Pp1ANje6PB!!$m(,`XH,J!**Qi!#K!(`(`!r`a !!"KP#$!mrrpJ%Q!3%!G)J1@!3HX!`Y$!)&!`%#CI2Kp1ANje6PB!!$m(2`B[#ai Z!!NF,J!,*Qi!$#m+%!I!I!$r$%!!''8'-$crrf!Z%!G)J1@!3HX!`Y$!*&!3"X" m!2md%V"#C3B`22rrB!i3"NL!3HS!!Y$!%"")J#4I*Pmm(ciI6Pj1G8j@rr`r"cm '(Li!#4`Z!!X[#bm+%!I!I!$r$%!!''3-%!E!I!$r$%!!8'8'-$crrf"J%!FJEJ! 15)$PJ%(S!-,3`#C33HX!!L!)5)C)aY#',8$rr%(V!!)J#$)65-(3J54!)!U`V[r mEKS3"NL!8N!fJ#!+X+lrr'`'&2`!)'$b3LS!!5"Zrr`3VJ!0%#i!$8L!*&mQAc` I2Kp1ANje6PB!!$m((Li!#5m,,`S3"m"m!2m-3!!BC3B`22rrB&!JEJ!+3HJ!`L! )d,`!N!0J@B!N3#C5)'i!#N(S!-)N#"!(5)$P3%M!e)!J#V##E`JNU[rm@BTJhL5 ,,bi!#N*R%!G)J$m!6VS##%!G)J#4I*Pmq(djH6R919J!!2`FH,J!*,`X[#K! (`(`!r`a!!"KP"M!mrrpJ6L"Z!!T"k!$#)!J8"dL#j8*)`Y##*%!Q8L!+)'i!#N( S!-)N#05m!*!$B&Q#X)*X##5U!!4BLQ$J*)X[,J!+3QFr2!!A6VS"N!"3Mc!m!!! NAbCI2Kp1ANje6PB!!#mZ!!K#CdkkrhaFMdjH6R919[rm2`Fr"KiZ!!NF,J!,,`X [#K!(`(`!r`a!!"KN$"!'`(`!r`a!!&"P#$!mrrpJ!!#@%!FJEJ!15)$PJ%(S!-, 3`#C3-"-8"NL#X%*Y@%(V!!)J#&*60"0)`Y##*%"#%L!+3HX!!L3)e,`!N!03X)* Y&%(V!!)J#0#m!*!$8&1!*%!f[!"33HX!!L!)5)C)aY#',8$rr#!+X+lrr'm)&+V rre1+B2![,J!1%#i!$8L!2`!3"NL!2`!3"dL!2`"1Z[fDh[`!#L4I*Pmm(ciI6Pj 1G8j@rrSr"cm'(Li!#4`Z!!X[#bm+%!I!I!$r$%!!''8'-$crrf"N%!FJEJ!-5)$ PJ%(S!-,3`#C3%!E!I!$r0"1`3Q8'-$crrf"!3HX!!L!)5)C)aY#'*%!G8[rl3HX !!L!)0"068dM#d))Y32rm)!U`V[rmE!J8UJ!"8STJm#"Zrra#%"!ZrrY)J#4I*Pm m(ciI6Pj1G8j@!!!r"cm'(Li!#4`Z!!X[#a!(`(`!r`a!!"KP"M!mrrpJ1K!()'i !$%L!jB""k!$#d-!Q8"!'`(`!rc36X%*P"M!mrrpJ&K!'5)!fJ"!'5)""k`!#d-" #%"!'5)!QAc`I2Kp1ANje6PB!!$m(2`BH,J!*(#i!#a!(`(`!r`a!!"KN$"!'`(` !r`a!!&"P"M!mrrpJ1LmZ!!`3"NL!2`!3"dL!2`"1Z[pB8)p5"a!(5)#`I!!BE"3 [,J!-3QF3"dL!2`"1Z[mk8)pJi$!m!!!m(ciI6Pj1G8j@rrJ[#bCZ!!Jr"cm'0$` !'*4V!*i`+`#LX%*YEM!V!+5`D`#JE'3d,2D'aHX!T$!m!!,33Mi!0$`!'*4V!*i `+`#LN!"#0#cfL-A!-$`!!Y"XpS633M`!-!D3!'cfK0"XpSJr!$!(d'cfKMm!-!D 3!'cfK$m!2`G)E[ri6VSQUYlm!!a)E[ri6VS@X&L22"mq(bCI6Pj1G8j@rqB[#bC Z!!Sr"cm'3G-[#%kk(+*BM`aV!*!$U'm!"4J3,J!*5)$!I!"r0#X!U&*V!+K"k`# Ud-)3J"!V!+Y)J,"m!$eR!Q"N$'X!"!#SE9B3+`#X5)#3!(`!)$`!%#X!V8L!N!" m!#!q!!a'!!"Y"Ja'!"KY"$`V!+)-4J!!E3B-4`"3E33q+`#N-#i!$QF-,`Y1Z[l @@)p#EJ!10dB!SMG(!+4#D`#SB!!%LQ!3X(`!9'F+X(`!@@F%B!!"*M!Z!!jR$#m ,6VVqSPL23Qi!$M3m!"L8D`#H-#X!SV"#E@3`+`#NX'X!S'aD0#cfKXAV!+3`2!! #d%)q!$3m!"L8D`#H-#X!ST!!3M3XpSM&`$!m!!,33M`!-!E3E2D)2`!`+`!@98# 3!(`!%$m!2`Br"dKZrrC1ZL9Fh[`!$%KZrrC1ZK95@)m3+`#V5)#`I!"8CK)[#cm V!+3r+`#L6VVp0P#2B(Bd2!!AP'X!RM!V!++`3Q`'2$`!!Q!F0$`!&j4V!*i`+`# LN!"#0#cfL-A!-$`!!Y"#2!!`+`!898#3!(`!%$m!-#X!&P9!N!"m!"!r!$m'2c` !!NKZrrC1ZL6Bh[`!$%KZrrC1ZK61@)m[#cmV!+3r+`#L6VVp*P#23QX!U'!!!eC J%,"m!%9R#V"m!&*R"'!!!D)`,J!1C``[#dkkr@jBMd*Z!!id2!!BP'X!RM!V!++ `3Q`'2$`!!Q!F0$`!'*4V!*i`+`#LN!"#0#cfL-A!-$`!!Y"#2!!`+`!898#3!(` !%$m!-#X!&P9!N!"m!"!r!$m'2c`!!NKZrrC1ZL3fh[`!$"!V!+Y)J,"m!%9Q!!# ',bcfNMmXpSK#CdKZrrC1ZLCDh[`!$"!V!'pQ@$!'d'cfL$m!-#X!&P9!N!"m!"! r!$m'2c`!!NKZrqC1ZL2Qh[`!$#mXpT*1ZKm-@)p)E[rQ6VSI%PL23G-[#%kk(aK BMd(6,`K1Z[Am@)p"dbm)6VSI&&L2,`Xr+`#L6VVj1&b2B!!!Q#mXpT)`,2D)4%! r!%*R5'lrpNkk*G,Hr!!-%#X!EfCU-#X!&&9!N!"m!"!r!$!V!"C93*!!I!!32`! `+`!898#3!(`!%*!!E2D)2`!r2!!#5'lrjNkk)dcHr!!-,bcfNNkk(R*BMdKZrqC 1ZKji@)p"dbm)6VSHIPL23G-[#%kkp@*BMd(6,`K1ZKjk@)m[#cmV!+*1Z[NBA)p #D`#SB!!"TQ!)X(`!+QF#B#4#D`#S2bi!%$mZ!!i[#cmm!"T1Z[a5h[`!#Me!!!j J!!&kB!L`I!"(C`*J%JaV!!-!U'd%3QX!U'!!!@"J#,"m!(&R!Q!30h`!!3#Q3QX !U'!!!8KJ#,"m!(*R!Q!13QX!TN*V!+KJ!!%bB!U`I!"AC`4J!!%N-#i!$QF-,`Y 1Z[Y3@)p#EJ!10$`!'*4V!*i`+`#LX%*Y!!$L-#X!T,"V!+"X!!$@0#cfKXAV!+3 `2!!#d%)q!$3m!"L8D`#H-#X!ST!!3M3XpSM&`$!m!!,33M`!-!E3E2D)2`!`+`! @98#3!(`!%$m!2`Br"dKZrrC1ZL)'h[`!$#mXpT*#Cc!XpSC%3$m!5'lrpNkk*$6 Hr!!-%#X!EfCN-!E3E2D)2`!`+`!@98#3!(`!%$m!2`B`+`!@98#3!(`!%*!!E2D '2`")E[rQ6VSKY0lm!!`[,2D56VSFfPL25'lrjNkk(1"BMd(6,`K1ZKcQ@)p"dbm )6VVcbPL23G-[#%kk(1*BMbm,2bX!T$mV!+*1Z[MF8)p#D`#SB!T#D`#SB!4J!Q$ fB!!%GK!Z!!P)J,"m!#"Y!!(3%#i!#8L!X(`!If`!!F)`,J!1C``[#dkkqJaBMd* Z!!i`+`#QCa`[#a!Z!!P)J$m!2bX!T$mV!+*1Z[HSh[`!#Q!Z,`Xr+`#N2bX!SNk kpBa3Mce!rri[#a!Z!!P)J$m!2bX!T$mV!+*1Z[A8h[`!#M3m!"L8D`#H-#X!SV" #E3!"*M!V!+5`D`#JE!!"'M3XpSE&k`#N-$`!!Y"#2J!d2!!BP'X!RM!V!++3!%) d,2D)aF!`2!!#d%)m!$!V!+CR!!#@-!E3E2D)2`!`+`!@98#3!(`!%$m!2`Br"dK ZrrC1ZL"Uh[`!$#mXpT*#CcmXpSC)E[rf6VSLR0lm!!`3+`"[CP)`"Y"XpSJr!$! (d'cfKMm!2`Br"dKZrqC1ZL!Zh[`!$#mXpT*1ZKY8@)p)E[rQ6VSE@PL23G-[#%k k'f"BMd(6,`K1Z[*%@)p"dbm)6VSEA&L2B$)-EJ!Jrrj[+M!'d'cfL$m!-!I3E2D '2`!r"Mm(5'lrlNkk(p,Hr!!-5'lrlNkk$mKBMc!'d'cfK$m!2`G1ZKM-@)m3,J! *5)!r!%kk%HC8Me*V!+3`+`#N$%!!8'd@3QX!T%*R3QF[#cmm!!T1Z[Mfh[`!#Q! !!TS3,J!*5)#`I!!(C`*J%$mm!!&1ZKqN9)pJ!!*qB!L`I!!)C`*J*!aV!*!$T'm @-#i!$QF-,`Y1Z[JH@)p#EJ!18fX!T'!!!P*J#,"m!!PR!Q"8-#i!$QF),`Y1Z[I k@)m`+`#N8%$!I2ri0d!!T!aV!&!!T'd@3QX!T%*R3QF[#cmm!!T1Z[KQh[`!#M! Z!""R##m,6VVh`&L22@i!%!!1B!!"pQ!)X(`!#fF#B#3-D`#3!k*[&M!Z!!jR$#m ,6VVhPPL23Qi!$P0V!+*J!!(+B!L`I!!-C`*J2$!Z!!jR$#m,6VVhFPL23Qi!$M! V!+45D`#N$%!!8'd@3QX!T%*R3QF[#cmm!!T1Z[ILh[`!#Q!!!BCJ#,"m!!eR!Q! F-#i!$QF-,`Y1Z[FZ@)p#EJ!13QX!T'!!!@*J#V"m!!TR"'!!!1``,J!1C``[#dk kp`KBMd*Z!!j5D`#L-#X!SJa!!"KY!!$'0h`!&`#L,`Y1Z[53!&L2-#X!&&9!N!" m!"!r!$!V!"C93*!!I!!32`!r2!!#2c`!!NKZrrC1ZKhLh[`!$#mXpT)`,2D)4%! r!%*R5'lrpNkk)"$Hr!!-%#X!EfCU-#X!&&9!N!"m!"!r!$!V!"C93*!!I!!32`! `+`!898#3!(`!%*!!E2D)2`!r2!!#5'lrjNkk(BVHr!!-,bcfNNkk',"BMdKZrqC 1ZKLf@)p"dbm)6VSB[&L23G-[#%kklk"BMd(6,`K1ZKLi@)pJE'!)X(`!'QF#B#J [#d*R3QG1Z[@S8)p#D`#L3QX!T%(6,`K1ZZpX@)mpI!!"!!jJ2'!)X(`!'fF#B"! hI!!"!+JAEJ!*!+TJ*'!)X(`!(QF#B"S`,J!1C``[#dkkpFjBMd*Z!!j#D`#L3QX !T$!Z!""R&$!Z!!jQ$Lm,6VVeVPL22A`!!3!1-#i!$M`I2KmQAdjH6R919J!!2bi !%$mZ!!i[,J!+%#i!#8L!2`"1Z[B5h[`!#NjH6R919[q!,`X[#Mm(3HcrbLC))"0 "l2ALX)KR"&#,B2*#E2A13Hceh#4))!T"l2AF*!KFJV##E#Sr2!!"2a)[+`!%6VS F$-",RJ%(XpGl3`#!3`,`!!2rrJ@cecP5+B-Jr2!J!6VSD5&52+8$ebJb!!*! %CK3r2!!'6VVS0&522c`!!8kkj*48Md*R6VS*%&525N"R8$mm!!01ZZJ89)p)E2A 35'`!dNkk%eK3MdKXpG*)E!$B6VS65P#23LcefJaXrrRed'B)$'crq[A5Ca3r2!! %6VVRfP522c`!!8kkj$T8Mf!51AcrqIA31Acrq[A51A`!!I@i2c`)!#mXpFSr,2A 56VS&[bcecMmXpG*1ZJA)@)p)E2A82bcedNkk"G4FMaPm!!(eZaPm!"2e[4P m!"(e[$iI*&mQAdjH6R919[q!-#ceZ'FN3QG1ZJPB9)p)E2A35'`!hNkk%U43MdK XpG*)E!$N6VS5PP#26Pj1G8j@ri![#cm($'i!!`!-E!K"l2AF*NKJ(JaZ!!F!$'` -3Hceh#!)9)!Q3'!+3Hceh#!)@)!Q3%*R2a-JEJ!1,bJ!"%kk'TC3McDZ!!`r2!! "2a-JEJ!1,bJ!"%kk'Rj3Mc!XpFiN,J!)i),JJX5m!!$rrdD#5-$!JL3Z!!M%[!! !rrq!JMP!pFir,2A12bcedNkk"0CBMciI*Pp1ANje6PErmLm,*Qi!#Lm+Yr`!N!4 R"K!V!*aQ"'!!!,j"l[rb*%JJ#l#XpFCR)LP,pFB8r!!"*!Y"l2DD*JL83dM#KI` ")P*#-$`!8)"#&-!3,J!*5)$!I!#!C`J8r!!"&2`!D"!Z!!P)J-"m!(mG3!!*5)# `I!!"C`*J$"6m!!%8r!"aB$*J#,"m!"&R!Q!-&2`!!46m!(*J(Q!)X(`!%fF#B") 8r!!"&2`!Ff!+&1i!#@!%B!*JpL!+3HlrmL))N!""5-!Y32rm5'lrmNKZrr`r,2A 36VS0-0lm!!SNAbCI6Pj1G8j@rr`3,J!*5)#!I!"!'8$eYbem!*!$![rm5'ceYNK Zrr`r,2A36VS-qYlm!!T1ANje6PErR#m,,`Sr"bem!*!$![qm5'lr[$mXpG*1ZJ2 kA)m-VJ#3"2qmEdJ`,2@iCKS-VJ!!"!$r['m3-#ceX'B+6VS#XMPm!!(eX!bZ!*! $)2qmE`JYI!#3!b$r[%KZrja)E[qm2bcedNkk$%lHr!!+B!i`,2@`C`K#E2@`6VS #Y$em!!(rrN(Zrj`Q5#!Zrla6V[qm$)!!N!4[!!(@3Qlrr!bZ!*!%rlaR%"!V!!& )J-"m!(m-3!!"CJBpI!!"rr`#%`"r-#ceXQF!!9*#E2@b%"0)J-"m!%!-3!!!CJ! "2"!65)$!I!!iX(`!!'F#B"J3%dL!`(`!"dM!,`"1ZZAX@)pJ!!%@B!L`I!!)C`* J'"!65)$!I!!(5-![!%kkkACBMf!!!2CJ#,"m!""R!Q!'B!!!k'!)X(`!''F#B#j "l2DD)!J8%dL#a(`!"mAm!5*)`Y##N!#m!!!")L4!%#S!R'F%+8Ve`Q!!!,*J#," m!#KR!Q!-1A`!!I@dB!!!RQ!)X(`!-'F#B&!J,2A#CdBJE2A#%#J!R'Fm%"0)J-" m!!G"l2@kd-!@N!!`,2@dC`K#E2@d!"-!J$mZrr`r,[rq,bce`K!65)!r!%kkqZV Hr!!+28$rrQ"%B!L`I!!iC`*J1K!65)$!I!!(X(`!!'F#B"iq2!!"$%F!"fi3-!G )`#m!6VVSNPL28NGJkQ!1B!L`I!!(C`*J"%kkif*J6K!65)#`I!!"CJJjI!!"pE* J2$!XpE4R#!!6!)"#E2@d)#ce`QFS)'ce`K!S!*aR(MmZrr`r,[rq,bce`K!65)! r!%kkqP6Hr!!+28$rrP+,B!$q($iI*&mQAdjH6R919J!!,`XQEJ!))!Z`V2A'CJ4 #V2A')!Z`V2A#CJ4#V2A#*Pp1ANje6PB!!$m()#i!#'Fd2M`!!3a(!!GZ%$!(5-! [!%kkjp4BMe*(B1S[2!#3!`&1ZZ3D@)p"l2DD)!JT32A#+8$eaMmm!$p1Z[cN9)m q(djH6R919[pm-#ceZ'F85'lrI$mm!"Sr,2A36VS0rB"`YI!#3!`(rr%KXpDj )E[rm2bced%kk#FMHr!!+6Pj1G8j@rh``,2@iCa4)E[pm2c`!'$mXpG"1ZJfq8)p J(#em!*!$!Irm5'ceV%KZrr`r,2A36VS*LYlm!!T1ANje6PErr$mXpG"1ZJ"`9)p )E[rm,c`!N!-H6VS@%bced%kk!'a8MdjH6R919J!!5'i!#Mmm!!Nr,J!)6VS 0@P#26Pj1G8j@!!")EJ!+2c`!#$mZ!!K1ZJe!8)p1ANje6PB!!#mZ!!Sr2!!+2bi !#%kk$5C3MdjH6R919J!!2c`!$$mZ!!K1ZJd3@)p1ANje6PB!!$mm!!Xr,J!)6VS -qPL26Pj1G8j@!!![,J!+2c`!!MmZ!!K1ZJd@8)p1ANje6PB!!#m,3HcrbLC))"0 "l2@8X)KR"&#,B2)r2!!"2bceNLmV!!41ZK638)m[#cmXpC*#Tdkk!!cHr!!+*Pp 1ANje6PB!!!aZ!!-!$'C-)#ceMQC'2c`!J%KX!1T1ZJ1iA)mT32@1$)!!N!4Q%Mm m!!G1ZZ$Q9)mpI!!"!!aJ'LmXpBj1ZKDN@)q!I!!32`![,2@16VS@XPb23QFr,2@ 5)'i!$LmS!!41ZK418)mjEJ!-pC)r2!!"2bceNL"Z!!i[+!!%6VS8-P#26Pj1G8j @!!!r"cm')'i!##!S!!,JJ-#m!*!$Iai!%!G)J,"m!$9X8L"Z!!J`+!!1`(`#!'F 3%!G)J11!3Hce*G$!(""J$K!(5)$MJ%(Xp563`"`3)'i!#$!S!!l!I!3!C`6-2!! I)'i!#$!S!!l!I!J!C`5-2!#!B"!JEJ!))#J!!X#m!*!$ra`!%!C)J$`I2Kp1ANj e6PB!!$m(2`BJEJ!)*#J!!Z##a,`!N!-r)'ceML"33G$&r!!3e)JJEJ!)-#J!$Z" !`(`!$b"#d-!H%#"Z!!J`+!!1`(`"!'G+)'i!#$!S!!l!I2lri%!m!#"Z!!JJ+!! #i)$![!#3!cmJE2@1)&""d-(m!"$3L$3')%$3`K335))3"dL!X%*R#L"Z!!J#D2l r!!i3"dL!2"mq(djH6R919J!!-#ceNV"m!!*R!Q!1,bi!#%kkrVTBMf!UB!L`I!! $C`*J(LmZ!!K1Z[mf@)pJ&#"Z!!JJ+!!#`,`!N!2rB!4J!Q$X6Pj1G8j@rr`[#bm (2`C"l28-)!Jd,J!)aI`!$%M#d))Q3#!Xp3KQ!!")2c`!!8KX!3K1ZJ'HA)mT328 ))#ce#'B!!!S`22p!B!!!ZLmXp3K1ZJ'S@)m[,28)6VS8LPL2J(`!%$m!,bce#%k k&*KFMcDm!!Ja'!!*X!!!@-#X!!T!!4Mm!6VS*qP528NCJ!2rQ)'ce##!3`,` !rj!$,J![#Lm,-Li!#(!"*%G1NLCI*&mm2!!"$%B!!'d!!%")E[rq-!EPJ%(V!!6 3`#m36VS*Q-#lrrM3V!!+84V"#C`!!&$mZ!!K1ZJ!N9)m`22rTB!!!%&0'B!$ r[$!m!!"J!!!#2"mZ(bCI6Pj1G8j@!!![#bm(2`C"l28-)!Jd,J!)aI`!$%M#d)) Q3%*'$%B!!Q`!!"B`+`!#N!"'2`"1ZJP#9)p54Q!!rqB`%fF!!#4#8b"Xp3JJ%-# m!2q3!bi!,`S[#c)Z!!K`rb4(6T)QAb4I-#ce$'B!!#!`,28BCJ!!'#!Xp3KQ!!! 3,bce#%kk!&TBMd+Xp3Jm(biI*Pp1ANje6PB!!#!Z!!J[!#!Z!!`[!+Qc6Pj1G8j @!!!JEJ!))Qi!$#!Z!"#J,MP!mN41ANje6PB!!&Q2)'i!##m32bi!$+QJ)"p1ANj e6PB!!#!Z!!J[!+QM6Pj1G8j@!!!J,J!),`#TNNjH6R919J!!9Bm`,J!)2`!J,J! +,`#TF"!I5)"1ANje6PB!!&@2-#i!#$m!)#i!#Lm!UA%3(dL!6Pj1G8j@!!!`,J! +iBMKL$!Z!!LJ-NjH6R919J!!9BqTGa!I5)"1ANje6PB!!#mZ!!a1ZJ5S@)mJ,J! ),`!J,J!-,`#T'LmZ!!a1ZJ6J@)p1ANje6PB!!#!Z!!J[!#!Z!!`[!+NC,bi!$%k k"-"BMdjH6R919J!!)#i!##m!U4p1ANje6PB!!#!Z!!J[!+N@6Pj1G8j@!!!J,J! ),`#T&8jH6R919J!!@BqT*#!I6Pj1G8j@!!!J,J!),`#T"%jH6R919J!!)#i!##m !U+01ANje6PB!!#!Z!!J[!+LN6Pj1G8j@!!![#bCZ!!J[#dkk!%4BMdT!C`B`22r rB$!`+`!+`(`!%'F+,bX!"Nkk$bCBMd*V!!Sr+`!-6VS'iP525N"R"M!mrrpJ"$! m!!!QAdjH6R919[rm,`XQEJ!)2`F`+`!+`(`!!`a!!!"Q#$!mrrpJ!!#5)"-L+`! 'N!""2J!`+`!+`(`!J'G3-#X!#X"m!!)-3!!!CJB`22rrB'J`+`!+`(`!"'F32c` !!N+R2bX!$%kk"Ja3Mcm(,bX!"MmV!!a1ZJ[L8)m-32rrCJB`22rrB$)#Drpr!!S Y5rrm$'Yp!!!-E"3JE[rm3HJ!$Lm)2bX!$%kk!U"FMbDV!!C#D`!%-$`!!$iI*Pp 1ANje6PB!!#"Z!!J[+!!56VS#i&L2)#i!##"!-#i!$'F%T!"J!U!!)'i!##mS!"* 1ZJ-3@)mJEJ!)-#J!%%jH6R919J!!)#i!##"!-#i!$'F%T!*J!U!#6Pj1G8j@!!! J,J!))%!`,J!-C`5N!f!#S!01ANje6PB!!#!Z!!JJ3$!Z!!aR"+3BB!+L'%jH6R9 19J!!)#i!##"!-#i!$'F%T%4J!U*%6Pj1G8j@!!!J,J!))%!`,J!-C`5N!@!#SJ& 1ANje6PB!!#!Z!!J[!$!Z!!`r!+Ne6Pj1G8j@!!#T0djH6R919J!!-#i!#$m!U)G 1ANje6PB!!$!Z!!Jr!+L*6Pj1G8j@!!!`,J!)2`#SLNjH6R919J!!%#i!#8L!2`# SJdjH6R919J!!)#i!##m!-#i!$$m!-#i!$Mm!U)91ANje6PB!!#!Z!!J[!+L,6Pj 1G8j@!!#T%MPm!!(e"NjH6R919J!!,bi!%%kk!BCBMeQ2)#i!##m!)#i!$#m!)#i !%#m!%#i!&4m!-#i!&Mm!)#i!'#m!%#i!(4m!)#i!(Lm!U4-[,J!36VS"Q&L2)"p 1ANje6PB!!&Q2-#i!#$m!)#i!#Lm!)#i!$Lm!UEdJ(djH6R919J!!)#i!##m!U5e 1ANje6PErX#eZ!!Mr`MeZ!!craN)ZrmT#,[r,3Ulrc%*R5'lrX%kkrIaFMb"Z!!i `V[r)-#lr`%jH6R919[q`2@i!#2r),@i!$[r3)'i!#Le3rp4#E[rF3QG)E[q`6VV q!Pb2)'i!#L#ZrpJ`,[r!6Pj1G8j@rl!pEJ!)rmJYEJ!1rp!JEJ!+,9$re%*Zrpa #CdKZrl"1Z[hNA)mJEJ!+)+lrf$!Zrm"1ANje6PErX$eZ!!Mrb%*R5'lrX%kkrGK FMb"Z!!SJV[rH-#lr`%jH6R919[q`2@i!#2r)2@i!#[rF,@i!$2rH3QG)E[q`6VV p`&b26Pj1G8j@rl!pEJ!)rmK#CdKZrl"1Z[h!A)p1ANje6PErr#!Z!!KR3N*Zrri `,[rq)'i!#0$!(9$rr$!ZrriJEJ!)d-!3V[rp8QlrrKeZrrcrr4!Zrra)J,"m!!" QcM!Zrrj63#"Z!!J3J%jH6R919[rm)#i!#'G-)'i!#"!3`(`!rce!rra#E[rq-#l rrV"ZrraX*$!ZrriJEJ!)d-!3+!!"0#lrrL"Z!!M3`K#!-#lrrP*ZrrjJdM!Zrr` JEJ!)d-"#%%jH6R919[rd$'`!!28'CJ!!NNKXp&C1ZJ%m@)qSrNkkrCT1ZJB36VS +R%+R6VS-kPL26VS"GNkk!A`pI!!Srr3pI!!%rrBpI!&5rrJpI!(mrrT#Td*R,cc rN!4#Ccmm!!%[,J!)5'lrp%KXp'T1Z[eDh[`!'Le!rr`[,[rm6VS!j&L23QG1Z[c 89)p1ZJ!B-#cdBY"Xp'Jr!%*R6VS$c&L26Pj1G8j@rra)E24L6VVmqPL26VVkE#e !rr`[2!#3!`K)E24D)'lrr%(S!"![#%kkq5EHr!!-6Pj1G8j@rrC)E[rm6VS$APL 2-#lrr$3Xp&k8E24SP'cdC*!!3N4!28$rqJaZ!!$rqQ`d6VS,H#e!rrB[,[rf2bl rqN*R5'cd@Nkk$'6Hr!!-,blrpNkk#f4BMcmZrrT#Cdkk!c"BMdjH6R919J!!,`N `f9()rr`LAdjH6R919J!!)#i!##m!U'j1ANje6PB!!#!Z!!J[!+Kc6Pj1G8j@!!! J,J!),`#SG%jH6R919J!!-#i!#$m!-#i!#Mm!U(K1ANje6PB!!#!Z!!J[!+Kl6Pj 1G8j@!!#S8%jH6R919J!!U&*1ANje6PB!!+K@6Pj1G8j@!!![,J!))'i!$#m3,bi !%+NP6Pj1G8j@!!"C6bmZ!!JJEJ!-,a![,J!3U5XJ(djH6R919J!!)#i!##m!-#i !$$m!-#i!$Mm!%#i!%4m!U4e1ANje6PErr!aZ!*!$$QB'-$`!!@!5$'i!!3!1CJB `2!!$B!3`2!!#28!!$LmZ!!Sr,J!12bi!#%kkr-C3McP!miTR##!mrj!%B"*)E[r m2bi!#%kkr)4FMb!Zrra1ANje6PB!!$mZ!!K1ZJSZ9)mr,J!)6VVmX&5218$cLQF '-$crrf!%-$`!!%jH6R919J!!,bi!$%*R,bi!#%kkqj6Hr!!+6Pj1G8j@!!!r,J! )6VVmG&526Pj1G8j@rl!pEJ!)rmJpEJ!+rmS[2!#3!`a)E[r-,bi!$%kkp`6Hr!! -3QG)E[q`6VS!3Pb26Pj1G8j@rl!pEJ!)rmJpEJ!+rmT#CdKZrl"1ZJ!mA)m[2!# 3!``[,J!-5'lrc%kkpX,Hr!!--#lr`%jH6R919J!!)#i!##"!-#i!$'F%T!4J!U) %6Pj1G8j@!!!J,J!))%!`,J!-C`5N"@!#SJ91ANje6PB!!#mZ!!K1Z[[B@)m[,J! -6VVlcPL2,bi!%%kkqm4BMbmZ!"41Z[Zk@)m[,J!),bi!$#mZ!"![,J!8UBX[,J! )6VVllPL2,bi!$%kkqq4BMbmZ!""1Z[[D@)m[,J!86VVld&L26Pj1G8j@!!![,J! )2bi!$#mZ!!i[,J!5,bi!&UQ06Pj1G8j@!!![,J!)2bi!$$mZ!!i[,J!3,bi!&+Q 16Pj1G8j@!!![,J!-6VVl-PL2,bi!##mZ!!bTMbmZ!!a1Z[YZ@)p1ANje6PB!!#! Z!!J[!+LD6Pj1G8j@!!!`,J!)2`!`,J!+2`#SNdjH6R919J!!-#i!#$m!-#i!#Mm !U*41ANje6PB!!+Qd6Pj1G8j@rr`[#bm+2`FQEJ!)*'i!$$iZ!"!Y5rrm%"0)J," m!!"R"&+,B2)`"e0(5N"R%"!D&S")J,"m!!"R"&+,B1K#%b!Zrr`q(b4I*Pp1ANj e6PErr#m,,`SQEJ!)*'i!$#e,rr`3'KE!5)#`I!!!C`*JmL!Zrr`NAbCI6Pj1G8j @!!![#bCZ!!Jr"d*(%"Y)J,"m!!"R"&*(B2)`"ciI*Pp1ANje6PErr#eY!"$rr#" Zrr`J8$#Z!!K1ZJIf6Pj1G8j@rri[#d(XmV)Q5#!,3HcbXL3)e,`!N!2BX)*X'$! V!!V!I!!$C`J[#dkkpHTBMpEm!"*JeN*Zrri-EJ!9rrjX,$!ZrrlPJ%(XmNE3`!a 3!!"R&$!ZrrlPJ%(XmNE3`$m36VVjNP528QlrrQ$-2bi!#%kkrh"8MbCI6Pj1G8j @rrS[!%*Zrrj+VJ!)E!K5E[rq4+i!#%UZ!!aX#&*Zrrj%VJ!--#i!#X$Z!!iY32r k-#i!#-$Z!!l4E[rk-#i!#X$Z!!c4E[rk!Qi!!IrqC`4%V[rk)"mYE[rk!!a1ALk I5Um!"%je6Pj1G8j@!!#T-%jH6R919J!!@Bm`,J!)2`#T[b!I6Pj1G8j@!!![,J! ))'i!$#m3U8e1ANje6PB!!+Mq6Pj1G8j@!!!J,J!),`#T*djH6R919J!!)#i!##m !U5T1ANje6PB!!#!Z!!J[!+NL6Pj1G8j@!!!J,J!),`#T)djH6R919[rU5'`"-Nk kq8TBMdkkqHC1Z[SB5'lrkMmm!!K1Z[1@A)m-EJ!$rqTQAM!ZrrM!I!%!Ce4)E[r U2c`!#%kkmeTFMb!Zrqc![!#3!hm-J!#3!h0Q'%KZrqSr2!!)6VVc1Pb2$'i!!rr UCZTJ(#!Zrqc![!#3!hm-J!#3!bjQ#Mmm!!*1Z[i89)p)E[rm6VVp"&L2%#i!#8L !X(`!#QBH-#lrr0"Xp',3E24Nd'cdD$m!3QG1Z[cZ@)pJ!!#1%#i!#8L!X(`!#@B k-#lrrNM!JHcdCMe!rrS`,[rk5-#"r!!)8N$"r!!)8d!p32rk2blrr$!ZrrV"l24 Q2`"1Z[bQ@)pJ4K!Z!!P)J,"m!!KQ%N*R-#cdCN4!2`"1Z[bH@)pJ+"!Z!!P)J," m!!eQ$MmZrra#Cdkkr'jBMf!1%#i!#8L!2`"1Z[@'9)m3,J!*5)"1ANje6PErVLm ,*Qi!#Lm+*%XpEJ!1rki-ERd"!!KQ(M!Z!!j6EJ!15N"R$K!D5)!r!%kkrRa8Mf$ QB!!!T$mZ!!K1ZJ5X9)p+3'BH-#lrVP0Zrkj+3'F5%"*)J,"m!!TQ""5m!!e5LQ$ L3Ulr[$eZ!!Mrb#e,rp!`,J!1`,`!!2rr,8$re%*Zrpa#CdKZrl"1Z[3bA)mj321 +$%!!!'`'-$crrf!q)#lrf$e!rkir,J!)6VS%2&525N"Q*$eZrki!$M!Z!!j6EJ! 15N"R%K!65)#`I!!0CJ3@[!!+8SYJiM!ZrkiNAbCI6Pj1G8j@!!![#bm+2`F`2!# !0#i!#04m!)"63X5m!!$rri6m!)$!`Mi!-!I"r!!'2`"1ZJ(d9)mQ3#!,$%$rrfB ))$`!N!4J'#!,*%!e4`!%)!TFJ#m!6VS!c&L2)#cbR$iI*&mQAdjH6R919J!!,`X [#Mm(-$`!!63Z!!KF3P0#a,`!!2rrK2`!"Y"#2J!J,2+F*%!-J!#3"'B83HcbS#! )*%!T32+F+8$bS%*XmU3Q8M!V!!3d"l"#C6)`+`!%0!H`3QB%**0J'M!(N@X!"$! V!!6!r!!'`,`!!2rrem!h4`!%+8VbR#!,A)"J,#!,X+cbR'BD2`G1Z[m)9)mQ3!b !!*!%CJJJ2!#3"'!+)!XN3#!6*N"JQ$iI*&mQAdjH6R919J!!,`X[#L!Z!!KGJ#C !*'cbR#!,X)T["L!,X**Y'#!+X**Y$L!,X)TZ"L!,X**X!Q!%*&*Jh#!,0#X!"-6 m!!E%[!!!rrr3JV#5CK!J8M!S!!64D`!%)&)QN!"J!LD5)!Sd+J!%a2`!"X5m!!$ rrp##X)YQ$$!V!!64DJ!%**0J!L5,+8VbR#4I*Pp1ANje6PB!!#!Z!!LK(MP!mN3 J#%jH6R919J!!)'i!#+!I18$b4%jH6R919J!!UFa1ANje6PB!!#!Z!!J[!$!Z!!` r!#!Z!!i[!+P',bi!$Nkkp,jBMdjH6R919J!!)#i!##m!-#i!$$m!%#i!$am!U89 1ANje6PErr$!Z!!K)`#m!6VVrJ&L2,8$rr$PXmN6cLQF))$crN!4J"#!Zrra1ANj e6PB!!#!Z!!J[!$!Z!!`r!$!Z!!ir!$!Z!"!r!$!Z!")r!+LR6Pj1G8j@!!!JEJ! )S$XLEJ!-)S"1ANje6PB!!$mZ!!LTb%jH6R919J!!,`XQEJ!)%"0)J,"m!!"Q""D m!!%[#dkkmlCBMb!,8S!J3"!35)#`I!!"CJJJ#e+!)%"#%&@2)!X[!+Qf-"mQAdj H6R919J!!@8mJEJ!),a#T25!I6Pj1G8j@!!"CMa!Z!!P)J$m!U6iJ(djH6R919J! !-#i!#$m!U6K1ANje6PB!!&P22bi!##mZ!!S[,J!1UA`J(djH6R919J!!,bi!#+Q $6Pj1G8j@!!"96b"Z!!J[%#mZ!!bT,$!I6Pj1G8j@!!"96bmZ!!JJEJ!-,a#T(K! I6Pj1G8j@!!!J,J!),`!J,J!-,`!J,J!3,`!`,J!82`#TcNjH6R919J!!@BqSf#! I6Pj1G8j@!!!J,J!),`#Sf8jH6R919J!!,bi!##mZ!!bTN8jH6R919[rq3QlrrJa Z!"ArrQ`S-#lrrZ@!3Hcb4Y$!-"#`EJ!)CJi`,[rqjB""l2*'d-"#8&*ZrrjJd%j H6R919J!!2`Fq,J!)3Hcb4L*)d[`!9,j3C`CB5,2)C[B`+!!#2Kp1ANje6PB!!#m Z!!LTHdjH6R919J!!9BmJ,J!),`#TTM!I6Pj1G8j@!!#Tp%jH6R919J!!)#i!##m !-#i!$$m!UDG1ANje6PB!!#!Z!!J[!$!Z!!`r!+PG6Pj1G8j@!!"96cmZ!!J[,J! +UB8`(djH6R919J!!)#i!##m!-#i!$$m!-#i!$Mm!)#i!%#m!U1p1ANje!!!%E!" B!!&$l2rU3H`!!#,)3H`!1L,)3H`!FL,))[`!N!4$l2r+)[`!N!65r!!%3HcqL#, )d[`!"%(XpH)Lb0,m!!4"l2@8)XM5r!!%3qcqL%(Y!&SLb#,mrj!%3Hd!FL,))[c rN!4"l3"+)XM5r!!%3Hd!1L,))[crN!3Lr!#3"0,m!!4"l3"L)XJLr!#3!`%Lr!# 3"0,m!!4"l3"5)XM5r!!%1A`!!ID#3qceiN(Y!$)Lb#,m`!"!!%(Y!$)Lb#,m`!$ !!#,m!*!%d[`!"%(Y!$)Lb#,m2!!X!%(Y!$)Lb#,m2!!d!%(Y!$)Lb#,m2!!8!#, m!*!%d[`!"%(Y!$)Lb#,m!rm"I%(Y!$)Lb#,m!rm![8(Y!$)Lb#,m!rm!AN(Y!$) Lb#,m!rm!2N(Y!$)Lb#,m!rm!,N(Y!$)Lb#,m!rm!(N(Y!$)Lb#,m!rm!&N(Y!$) Lb#,m!rm!$N(Y!$)Lb#,m!rm!#N(Y!$)Lb#,m!rm!"#,m!*!%d[`!"%(Y!#SLb0, m!!4"l3"#)XM5r!!%3qceh$,m!!%br!!%-[`!#N2XpG35r!!"%[`!!",m!"%5r!! 6%[`!!",m!!!5r!!"%[`!!%2XpFC"l2DD)XK$l2A#3HcfQL,)3qceYK,m!!(5r!! "'A`!%r@Z'A`!%I@X3qceP%(Y!'SLb0,m!!4"l3"U)XM5r!!%3Hd!DL,)d[`!"$P m!!2eNN2Xp535r!"K%[`!34,m!(-5r!"6%[`!C",m!%35r!"Q%[`!4K,m!'J5r!" )%[`!Ca,m!%F5r!"k%[`!@K,m!(J5r!"B%[`!Ba,m!%-5r!"f%[`!9K,m!!!5r!! !%[`!BK,m!%)5r!"a%[`!84,m!(F5r!"A%[`!C4,m!%85r!"b%[`!8K,m!(N5r!" C%[`!G",m!&35r!!a%[`!)4,m!$)5r!"!%[`!-a,m!#-5r!!d%[`!*",m!$B5r!" H%[`!04,m!#85r!!p%[`!+a,m!$N5r!!S%[`!0a,m!#B5r!!Y%[`!Aa,m!$J5r!! U%[`!-",m!#N5r!"G%[`!I4,m!'m5r!"2%[`!G4,m!&85r!"E%[`!Ha,m!'N5r!" *%[`!F",m!&!5r!!0%[`!$4,m!'`5r!"-%[`!DK,m!%S5r!!R%[`!)K,m!'X5r!" ,%[`!1a,m!$S5r!"F%[`!I",m!#`5r!!m%[`!,a,m!$m5r!"Z%[`!6K,m!'d5r!" 0%[`!,K,m!$i5r!!E%[`!'a,m!#!5r!!J%[`!B",m!(i5r!"r%[`!Ia,m!!S5r!! +3qce$$,m!!!br2rk3H`!m#,)3H`!pL,)-[`!!$,mrrK"l!$m)XK"l!%#)XK$l2+ b)[`!N!3br!!!)[`!N!3br!!*-[ap!#,m!*!%)[`!N!3br!!!)[`!N!3br!!+-[a p!5,m!*!%)[`!N!3br!!!)[`!N!3br!!+-[ap!5,m!*!%d[`!SN2XmT`Lr!#3"$P m!!$bQNje!!!"3%0[F(PbD@GSG##T)$%j1$8J5QpSEL"%,L"#FR9ZCA)Z)#""E'` J8QPRD(4c)&*PFf9bGQ9N,L!J!!"3CA*YDA0cD@pZ)'Pc)'GTGQ9Z)(4[)'0[F(N JG'KTFb"`FQpRFQ&Y)("bEhCTC'9N)(4SBA3J!'Pd)'Pc)'j[G#"cEfaN)'&ZC#" dD'Pc)'0[F(PbD@GSG#"ZEh4TBf8JDA-JF(*PFf9bGQ9N,J!!4&*@8J#3#P088L- !!#SU)(9ZDfj[GfiJCA*bEh)J+LS!,N&2GA3!,N&*EJ!!,N&2GA3!,N&*EJ!!5d9 C3`!!,N&*EJ!!,N&2GA3!,N**EJ!!,N*2GA3!8d954!!!+T!%)&0&9%9@48j868& 65b"16e3J58e36%9048j84841!!"6G'4[GA3!!%024%8!N!3"!*!$8'N!!%pT!!! "QJ!!#jJ!)!#3!a`"QJ!-38a59!#3!fT#6N4-!*!$GN4*9%`!!J##4%a24`!"!+C '8N9'!!%![NP$6L-!!3$@5d9C3`#3!qj048j9!!-!qP9A58i!!!%U9dP14!!!!6C 69&)M!!!"3N024%8!!J&14%&833!!!A)!JIrr!*!'c0!!J2rr!*!$%!#3"B,rr`! !$)m!!-c!!)(rr`!!!HJ!!-c-!)2rr`#3!cJ!N!@$rrm!!!)[!*!&J[rr!!!#$J! !c-3!JIrr!!!#AJ#3"B$rr`!!!P-!N!@"rrm!!!0Y!*!&J2rr!!!#D3#3"B$rra! !"(%!!-c)!)6rr`!!#KJ!!-dB!)2rr`!!#2S!!-dF!),rr`!!#*S!!-dJ!)(rr`! !#(8!!-dS!!$rr`!!#P`!N!@!rrm!!!TJ!*!&J2rr!!!+I`!!c13!![rr!!"*Y3! !c8!!!Irr!!!093!!c"J!!2rr!!!-i3#3"[rr!!"1*3#3"2ZE!: !Funky!Stuff! echo x - uw.doc.hqx cat > uw.doc.hqx << '!Funky!Stuff!' (This file must be converted with BinHex 4.0) :"R9h,Q4[B`"A6e*%68&$33#3"&Hd!!!$$HVq!!B!G`!%!!Ar!!$rN!-!N!-"!!! f[!#3!!#3!!!!0lJ!H!"i!!!ed!"S!!)!N!0)!&!!N!3#m!+!rpcrl!,d!T3"!`8 S!r`!!Id!!*!!!+!!N!3&i!8!!+!!)!8!'3!!,ri"N!-!N!-"I3!!!C!$!!(KfJ! "iQ,rr`#3+33!N!-%!*!&!3!!-(i!8!!!&5)!%[rb!"i!)`$(rr)"Z[q3"!$rN!8 !!`#3!`-!N!8"!!!`cJ"!!!!AQJ!1!!-!krrb!1crmJ'krj!%!2q3"3"C!,d!@3# prf8!93!!8%3(F!!!6Qi"e[rb!"lrmJ$Xrr)"Z[q3"3!-!!!#Mr`b03TJ!!S"i!! "!*!$#J&S"S"+4'FQ3IVrG,(ACK"53`4'!8H-r!!"$3B!"J!!$!!!!`!"$3B!"J! !$!!!!`!"$3B!"J!!$!!!!`#3!`B!!!`!!!-!#J(J!!%!N!-+!@J'J!#')KmX!AJ !XNCQ"NT%C`CJ%NT%!!%0"J!'!!!-!!!#!!%0"J!'!!!-!!!#!*!$"J!!$!!!!J! +!H!!!3#3!`S!+!(J!H!$QM@b%!`3#P4"B1i[$$!&G"S!!e9A$3B!"J!!%K!!!J! "$3B!"J!!$"!!!J"ep8X8%(J$82Gfpj!!mSpj%[+3!#8+Ef)D$hGcPIGimZ!25C% bIIHA2fF2Gh19phJ2B[H3!$pepYpL&!H!!e)'VhG[HB$&2hB6F6)09!+a#rGIE@- 2GB&2,[$3!!!'!!!-!!!#!!%0"J!'!!!1!!!#!!hdNb4Cpe`R8r$3!!B!!!`"!!) !!3d'!!B!!!`!!!)"LI9,%14ICdEfd2GIG`H!B2EIGD*qSI,IGh19ph!K6fecDJ( fhh@Q*8$93#X3p0E(-PLrUJaIEHpe)8mZ!255"i#4KrCc'3e8$h@"$hGbX'$c6bl c,d,e2d329I6[5I@!MhQ#(fhbi!p9i#8)(hB6"cNH%j%b$hGcPIGi$fe[H3pL%-3 @)CmX!@b`A3phYmX(J-8c(#'3!#8'$S(h@9mY)8pYFfS&-#X3p9p1p*pB$feXYc( bi!p"#"6hB8$NAfG'pY$hHhb`6h8i"6!V%29I6[5I@!YB)2EIGD*qSIH"J#X3Fqp e)'13!&pe,[G5$93#XB%#&2EA0U#"L(8i"6*3B)FrCk%28[8r,I-[-r-JJ8GU#R- I,[$3!")!!!`!!!)!$!`"!!)!$``!!!)!!3d'!!B!!!`!!!)!'rGIG`3IFIGA3B! V%0@UAhGcpRmkm0!!$!!!$!%!!J!#$!!!!J!"$3B!"J!!$!!!!J!0m*B26@ac*B[ `d!!'!!!-!!!#!!%033!'!!!*!!!#!!!-!!!#!0ReHa-#X8%(J'#P)&d&pe,[G5! P#Ah436)2Gh19phMb`#X8%2E@pj!!pL%'#(pR0pI'-JNDEhN2BKe8%(2[G5"i!FY 4Rbi!p8Yi"i$'peJC$NIfeNH[H3pLpj!!+a#"pf&'S+(hBDJ&d2B[GGd8FrC`8`+ a#eJJ%j!!Bj!!EZ&NJ#82BK$h8fpf9jEf+KmZm0!!"J!!$!!!!J!"$3%!"J!!$!! !!J!"$3B!"J!!$!!!!J"Zp8X8%'33JIGK4U#RpYFQ*e1!*3+hJ14ICdEfhbi!p8Y i#"`R8`phHU$f*((Dpj!!*IGFX&-)Afd3A3+a$feB)'-epjFrCr,[$3!'!!!-!!! #!%Ad9%9!pY')EfFB"N%r*b"S!rGIE44IGB"MN!"ce8pYBRpf%'J#XIH3!)YIGDN 2BKmZm0!!!!B!!!`!!!)!!3d"!!B!!!`!!!)!!3f)!!B!!!`!!!)!!J!Km*+a$hA hF)&2GK309!+a$eAdldReJ,@#m0!!%J!!$!!!!J!&$!%!!J!)$!!!!J!"$3B!"J! !$!!!!J!"$3!!"J!!$!!!!J!Im*peph*9S-AfhfeMN!"NpRma"NpRmb$blblblbl `d!!5!!!-!!!#!!%-!3!#!!F-!!!#!!%0!3!'!!!-!!!#!!%0!J!'!!!-!3!#!"I e)IE9)3pAFjAhF23d&LG6m0!!"J!!$!%!!J!"$3)!"J!!$!!!!J!"$3)!"J!!$!! !!J!"$3B!"J!!$!%!!J!,p6%LFrC`p9l`d!!'!!!-!3!#!!%0!3!'!!!-!!!#!E( hAhF%(h(h9d'!B20r,IBR)28[8r,I-[-r-JJ8GU#R-I,J$e5a#R-3pYEhN!$f)3a 6erCrG8'3!#82GB%"pf%r,!@CmX"8!e$Q4bpjmZ!269JJA3+a##BjC*!!pLEh@34 L'!e&pY$c2c$c!#82-I1I-[-2-!C"#2GHj8)CmZ!29,%-Afhfhh8haLG6#R-3Lep eU3pL%-8c(#'3!2BK,hF4-#X3pY@4pY$P3J8`+a$deXFb@,"MN!"JJ8GU$P3J8`+ a$eAdldReJ,@#mZ!29,%,@#mRJ19##,Ah@T!!pL%2dLpe3aN&2p2b`(mZ(bi!FJL epeU3!2BK#RJK0cpR$93'$h@"3+AfGcmZ!29,%,@#mRJ19##,Ah@T"UK3MhAZ9#$ eMdrdlbreMdrdEdB0TIG`a6*&Vbl`d!!B!!!-!3!#!!--!!!#!8B-!J!#!8S-!!! #!!%0"J!'!!!-!!!#!$M`NV%28[3I63J8GU#8IhB8$bK"KIG8`3p6p&p5p%mX$dR d6chc(bN2+&iR8fVbR`d!"J!!$!!!!J!#!#,`NV%2GIG`j&pR4[E3e8!V%26@ac* B[`d!%J!!$!!!!J!&$!%!!J!($!!!!J!8#@%J0#ib3P0%)&9159JJD'pcG!d!"J! !$!!!!J!"$3%!"J!!$!%!!J!"$3%!"J!!$!!!!J!"$3)!"J!!$!!!!J!"$3B!"J! !$!!!!J!"$3B!"J!!$!!!!J!-p6*N*cpR$eA[$3!'!!!-!3!#!!%0"J!'!!!-!!! #!'AeHa-#X3peph$NAfG'pY"i#Qpe2,'3!04IE3+a$dCcN8"b$hGkS(0bGUIhS3F S'Y!P#&pY%)*MPNN)%LFrCimkm0!!!")!!!`!!!)!#3`"!!)!#``!!!)!!3dj!!B !!!`!!!)!#`Na-M!`)'*KG@30!!!'!!!-!!!#!!c`RcIbhf*b#@*[$3!!"J!!$!! !!J!,m*03jNF[HI$3!!!'!!!-!!!#!!%0"J!'!!!-!!!#!2ce5a#eJJpYpeJJpL% -8pIfIh9"N!!P#2GHj8)#X3mdmZmbp#p6p%$dRe$d-0E(TbFB"MN1JIGCAbdK6fe cDSmZ!29,%2GIG`J8pf&!(hMK`S!V%1JIGCAbdK6fecDS!P$f)30[E4N2d[,j(hE brLpjlcrp-2+2E@JK3)H4mT!!Bj!!r5m[NIG[,b,hR[2rd`mSLQpf%)H4mTmX$hH a33r5mrr6""j"J6+!B*IfGb"8#Pph&2,FD"#K)K6bl`d!%J!!$!!!!J"F$!%!!J" H$!!!!J!0e8$e@"$hGb[`d!!'!!!-!3!#!!%0"J!'!!!-!!!#!+ce5hJ*A2GIE4- JaHpj4rCl)2-I1I1203pLpj!!p+@c$d6bi23Npe-8mZ!23DS%IfHbJ%'"6hBCmZ! 28"6feiKe-#8-A[H3!(J2Chpf%`j&pfH4N!!VBJ+a$&lhN!"i!e))@T!!Bj!!+hJ -A[H8IfHb!e*m%(J(2+peNCmZ!!B!!!N!!!)!!3d0!!B!!!`!!!)!!3d"!!B!!!` !!!)!!3d'!!B!!!`!!!)"'28m4DTcpR"i#+AhIbi!p*)(J"pf%`ph9)%(d#X3phF jAhF2GlI,"i#-4DTcpR#R'!pL'h13!)Afd38V&!phFjAhIb`)Fm%#X3C"D!phYmX )a&UJAh8Je&pY$p,h8j&2d`+a"IGK5[HA2fF2Gh19ph$fhh@#$f)33C4[GcmZ!29 ,H!H!YMQKN!$&4"`UpjmX$f,h8JFJH!05I"Ef+[H3!)TIGa3#YM#-4DTcpR"c"M$ h8mAhB8'3!2Gh19phmZm0!!!'!!!-!!!#!!%0!3!'!!!-!!!#!!%0"J!'!!!-!!! #!!%0"J!'!!!-!!!#!!)!!3d'!!B!!!`!!!)"`r35!V%13B%b!RpY(b`2GIG`(fh h@Q)B"Jp-&N$e0apRS8$d(d6dhbhc2c%#&2EA0UmZ!2+29,%23I426I,I-r-3H!p elhGNRbh&pYjLIf+K$hGbX#X3p"p%p0mYmcp"!K6fecD[,[+3!!p*)(J-EQpLS3A 3Ef+&Vh8K"MN%'Q*rGK$2G8K8$PKbG6FrCr,!Tc%'13bf4X)8"cJ8*e2bq4S5G6m X"MN"4S%#8"1I,9hbfR-3Bj!!%jmYAI,HEfFI,J$e[e5hJ#&2EA0U![HH%2GfJ-Y B%`pL('peJ3FJDUAhFC!!+a"[G5Y8!P!IEIGDBK!V%)IfhU&!p"p%p0mYmcp"$A5 #mZ!29,%'pe+e3,AKJ#8"pYpeTL%'$fe8%-Afhfe6!K6fecDJ,hRK"c"Jhh8[G8% 2GK5(8`A3pephmZpGm0!!!"i!!!`!!!)!&3`"!!)!&``!!!)"[J`"!!)"`!`!!!) !$63Z-N*64#"96NPBUJd!!!`!!!`"!!)!#``!!!)!!3d'!!B!!!`!!!)!!3d'!!B !!!`!!!)#)26P)3+f)#X3j&pR4[E3D[E9JJD[GfpjJ#3@+!+a$p,&pYpYBjr6$fX IH3D!B23r6r6[928[6r6!pV(hRbi!p0%rG3pV(hN*(A0bG6J&3)*MPNN26@ac*BX -AfhfeMN2Dapj$&pYpLFf*e1!mS(blfIbi-AfhfeMRbf,I5mYmcmT!QpV%13F'42 ""IGK3#X3peJ3A3+a$p,&pYpYBjr6$fXIH3D!B23r6r6[928[6r6!pV(hRbi!p"U &mX!V%(pYkRab$IG6`R8`A3+a$p,&pYpYBjr6$fXIH3D!B23r6r6[928[6r6!pV( hN!"i#2GHj"L"N!"p!V%2dXpeJPpYr6$fXIHIBPC*$feZ#fJ2BK%`JD(#'3Bj!V% 23I8r3r5I53aC'!e8"JpV(hR&N3pYEZ'3!2Gh+`Bj$hGbYIG5!V%2dXAfhfeMRp- 2Dapj"N%*IG&"-[,J$bMdXIHB$hHhb`C"$feZiC!!F`+hJ2E@-a3'33-IGK3%(&p R0rHKN!"S$fd6pe$fXIH3!"papeIhCU%bMblbR`d!%J!!$!!!!J#9$!)!!J#C$!! !!J!-p-IfebBR8im0!!!'!!!-!3!#!!%0Q!!'!!!-!!!#!42d9XX#&2EA0U#"L(8 `8`+a#eJJa83Bj6Q!*3B2Gh19ph"6!V%26@ac*B[bi!p&E,"6%(J-3@)C"S"Jhh@ UmYKrHK$bMc,c3+Fa$f,hN!$cMc!-@[GIE6mT$hGcPIG`TFBKN!"c!V%-%b&!A3+ a#-342cX,AhFIGK6b`#XIH3aM$f)3pYAhBC!!Bj!!3BIhSCmZ!!p8XIH3!-B`DS8 2BK$+@"N2+2E@N3)IEH9'4kpj"cpfH(pLSI+I,[$3!!B!!!`!!!)!!3d!!!B!!!` !!!)!!3d'!!B!!!`!!!)!&I6@0qpeTLFrC`pAFjAhH2$3!!!'!!!-!3!#!!%0"J! '!!!-!3!#!#cdeXFb@,"i"J*'NIE@6fX&d23HkK$d0IEHpe)8mZm0!!!'!!!*!!! #d!!!"J!!#3!!!J!5p8&2EA0U$dAfhh@Q*8m0!!!'!!!-!3!#!"RdeC(fd28&3Jp $8pIfIh9'*e2`d!!'!!!-!3!#!*!&S!2S!!e038G*3e"*3a%"r`!!%[33p0peSRk KmYpAFjAhI`d!"J!!$!%!!J!"$3%!"J!!$!%!!J!"$3%!"J!!$!!!!J!#!!%0"J! '!!!-!!!#!0$hHa33r5aIEIE@13C2Cr-3C2Cr-JmZmZmZmZr6"i"Jp9p1p*pB$&p YpYBjmZ!233-IG`phFjAhF2GhUJpL%-3@)C!!Bj!!+hJ-AfhfeMN2GhUJpL%%pe- (1(N3+a$hGcPIGr,J$dC8!IH'pYkKmX!P"2G6!V%2d[GRr6!CFP3(1(N3FS"IGc$ hGcPIG`+a$&pYpYBj$hGIGDN2BKm0!!!'!!!-!!!#!!%0!3!'!!!-!!!#!!X*GAG dEfpX)(CT$A!!"J!!$!!!!J!"$@N!"J!!$!!!!J!"$3%!"J!!$!!!!J!"$8N!"J! !$!!!!J!"$3B!"J!!$!!!!J!Yp'FfU[HI,!+a$p,e(h9br6$fd6pe"b(fd#&2EA0 L'!pephmZm0!!%J!!$!!!!J!T$!%!!J!V$!!!!J#3"DJ$k!!068&(580358-4!Im I!!%0!3!'!!!-!!!#!!%0!!!'!!!-!!!#!!%0"J!'!!!-!!!#!!%0!3!'!!!-!!! #!BIdma#(pR0pI'-JTrEA*LG6"i!V%2GB%&d2@26r6[,r@26r4[4Jj&*F@Je8$DA hF-8b4DmZ!25G!V&""i"JKrCcIAaM)*'Qpj!!pL%[Ga%`+a!RpY%#YL!V%26@ac* BX)%jJ'-2@26r4[4JBj!!+a!RpY%#YL!V%,@###AS#"1A2fF&pe,[G5mX"b"i#Rp V'[H3!#YL#&pY%2GhUJpL%+@#mZ!29,H!pY@##RpV'[H3!2GhUJj"b[GC%#X3peJ 3A3peph"6"JTc%2GlI,"i!e)*G"`Upj!!a6-F)C!!*3B29I6[5I@!YB,bi!$dNJp hAh@T$f)3pL%L&!*3MhAZ9#$dAe6eMbrd(d2d[bl`d!!!%J!!$!!!!J%K$!%!!J% M$!!!!J)epeph"i!eph"X*cpR"S"JKrEHS3)8pYFfS"pYpeTL9!Bj$'-2BK$h@"N #8+AfF(-#8#X3p9p1p*pB#2HB)IEI,J$e5a#"6hB8"6!V%29I6[5I@!YB))YIGDN 2BK##C#'3!2B[H3,hRR2fF(+!0[E4$bJ[HHI'U[H3!()2GhUJDS82BK$'UKN2d[G IGrdr+I,J$dR3+a#"6hB8##C#J)pec"L0peU[HI,!FJphHU#"13B-AfhfeMN#8#X 3p0E(-PLr,!Fp92EA2fF()#YL"b#,Ah@T"cFRDRpk%#X3phFjAhF)pjJKpYmZ!29 ,%-pe4"-JphFjAhF2GhUJPiEZ&N"MN!"J-IG`phFjAhF2GhUJpL%%(%&L'3F`B0( hF)(&1BmZ!29,%2Gh19ph#2HB)IE3H!0IG`6h8cFrCr,J!29,%)a"%`phHU#AMUE hN!"JKcpRS3phFjAhIb`2GlI,!eph$&4"MP1B!P"Jk"pePI,5&2EA0U#"L(8`8`+ a#eJ[,[$3!!`!!!`"!!)!!J`!!!)!N!-"%"!!!4!3!!%3%!!"%"!!!!`!!!)!1I9 I6[5I@!H!B#4T(feNpV"G$d(fd8I'-29"SHY6%'13!29"SICdEVmZm0!!"J!!#3! !!J!"$@N!"J!!$!!!!J%kp8X3r5p,HUr6$fd6pe"b(fd2GhUJa[GB%#X3ch9%%b$ hGcPIG`*3pL%2DhUKRbi!p8X3phFjAhF2GhUJpL%*&UTFBKN'13+a!K6fecDJJBK e-#YL"b""j"J6+!phHU""`Apf%'-(2A0b%$pepYpL&!A3%jmYAI,GHKMbi!mSp"$ hGcPIG`phHU"UK3pL%2DhUKN(d#X3a83Bj6PcpR$NA"L!8`+a#eJJ)8pYFf)Bml" r,KmZ"p$hPIG3,hRK"Jp$p8p-mYp%!P!V%)XDVblbR`d!!")!!!`!!!)"%J`#!!) "&J`!!!)!!3d'!!B!!!`!!!)"C[9,%2d[8lpe+9ph2p-2E42h8()IE3a[GB'!+a$ hAhF)&2GK3&-#X3YB)#8"piF[,!phYmX2GhUJ)8pYFf)3DU$S(h@9mY)8pYFfS)' )G6Mbi!p"UJA3+a$hGcPIGi"6!V%26@ac*BX2GhUJpL%2DhUKRb`'13B)FrCk%2G h19ph$hGkS2BK""a"BKRbi!peph$hGkS&2""[CfF`hh8m*e-'J'#(pYkK!K6fecD J(fhh@Q*8mZ!29,H!aIEIE@13!(J14IGRNC!!*3DUAhF2H9pe!P!K6fecBK!V%2G h19ph#2HB)IE3Bj!!+a-+AfF&hI,[$3!H!!!-!!!#!#3-!3!#!#B-!!!#!0--!3! #!08-!!!#!"$dXIHIBPC*$da[H9pe,`d!!!B!!!`"!!)!N!-"%"!!!4!3!!%3%&) 8mZm0!!!'!!!*!!!#!!%0!3!'!!!-!!!#!+cd%2Gh19ph$fe[H3pL%%'(pk'I,!p YAhBCmX"8$+@"N!"c!V%)*MPNN!$deXFb@,$@Lh8`r4$f,hN*4[CrCh2fF(+!KrH K$f*IH2,!P'pRpRFrC`FS!R+K$f*NmX"8$+I2Dh2fF(-(+!bPJ3pLAhMb`%'1(#I hBDpjmZm0!!B!!!`!!!)"0256)80UVhRb`2GIG`pYCc*R1!B2-[02H212-!3F9*! !A3+a$hGcPIGr*i$&-K-SmZ!29,H!H!pek@)C$hHa+a3&3$8J+a$hGcPIG`H!bPJ C"8!V%'h4`KN'3@"i!e)*H1T[H4Rbi!peph$hGkS'VhG[HB#AMUEhN!!V%+AhF8# Kd[,EBj!!a8-8"G!V%2Gh19phmX#&"p"JphFjAhF(J%'(pk'3!2GK3RaUVhN#X3p L8LAfd&d#X3phFjAhF2GhUJD[GfpjJ2BK#,AhFr,[$3!!(J!!$!!!!J!-$!%!!J! 1$!!!!J#I$!%!!J#K$!!!!J#Ap*-'QA*e-#82GBFrC`+a$p)aphr6!6*2H3F`+a$ p,hGcPIGrd`pY%rGI,!phFjAhH!pYEhN'U&$f)3a"BKN04IE3+a#eJJaIEHpe)8$ h@(2fF#X3j&pR4[E3peph*9Vbi!p8X3MhNbEhJ(M`d!!!%J!!$!!!!J#!$!%!!J# '$!!!!J!am*+a$hAhFP@Jj&pR4[E3e8!V%29I6[5I@!YB)2+&iR8fVbR`d!!!%J! !$!!!!J!&$!%!!J!,$!!!!J&Zp")'2hN2Chpf%`*rE4mX"L$feB)&-3phFjAhF2G hUJpL%'`Rpf(bi!p"UJpV(hRf*@53!(2[G5$hGkS2BK#A3F)C!PphC*!!+a"X*rG K$hGcPIGr,J$d'U$hGcPIGimX$hHa+a3'`Rpf%&3$8[,!phHU""MP13*3Ah8Zpe) 04IE3+a#eJ[,J$dN`E-9*Bm%2Gh+`+a$deXFb@,$h@"3(-K6@`3pRpeH4Tc'2,!B `Ff`Rpf%2Gh19ph"i"X*rGQ)C$f,hN!$+I2Dh2fF(-(,bi!p8Yi$hGkS'U&$f*(2 fF#X3phFjAhF#8#X3e&-JA3+a#AMUEhRbl`d!!")!!!`!!!)!,J`#!!)!0!`!!!, fFhemBb!P#KD#mYKrCcIAaM,bRbl`d!!!"J!!$!!!!J"1p*))YIGDN!$f)3jBKrB U%#8)EhB3a6erCrG8BR8`J5*cpRJ(-'$ASI,!pLpe)()(Jr*bmZm0!!!'!!!-!!! #!!)"f29,%)(&13pV(hRf*@53!'SK3f*rGK"i!V%2d[5[423JpYE[dr,!0[E4N!" Y)8!V%14ICdEfhbH!Eh8V92,J$e5a"[G5Y8mRJ2DapjpL9NN,D!pL%6$feCIA'3K 3+f)#X3p$p"p3p6$dcdrd2dX2Dapj#9'!05#Q,,mZ!29,H!pYEJpeJB!V%23r3I8 28`p-p2p$p,$fXIH3!'J'$d2drdle6e,drd`2Dapj"MN%(feZJ#X3r5*[B[d`pV( hN!!P$dAe2d-2+#X3Eh8V9!D[GfpjJ2GB'!p$p8p5p-mYp*!!e8!QpLmTmX!V%2d [BQcfZ1E"r6$fXIH3!#828[9I3JmS+a"[G5Y8"UphEhQ!peJB$d2e6e,dcbhdJ09 !pLE2DijX(bRb`'13!#X3r5%b&2d`pV(hN!!P$dcdEbi!p8X3Eh8V9!j"d8J#Yi$ fXIHIBPC*#QpjAh8JpLpe))peMK`S!VBJpY@#"5X8J2GhUJ05mZm0!!!'!!!-!!! #!I"MN!$hGkS-3@)3B`Fh*fS2Gh19phmZ!2+29,'"#")R2fH!pYEhN!$f)3bf2fF C$h@(2fF#X3r5p0@4pYr6$fd6pemX"S#4M%If)C!!pL'PphmZmT!!$d'U"clh8J, hRKN&-#X3p0E(-PL`pV(hRf*@53phHU$f)3J6)#8#X3YB,b`'13DU"IG5lh8Je&p Y!V%,@#$hGkS2BK#AMUEhNC!!F`+a$hGcPIG`8`+a$deXFb@,mZ!2+26P)I,!YIG apf&2,!+f)2Gl%`+a#"6hB8"i!e)%pe-h2fF&-#X3YB,b`#Y"%-YNE#&)mk$eMdr dlb`2@26r4[4[,!Bj$e2drdd2+-8b4DmYp"mTmX#,Ah@T!e)2BK![HH'I,!Kc`3p eph$&2hB8+!+aJ3Fb8'#1((DJ'-EK#"pape%m%2GlI,"i$h8j&)*9N!$f,hN#X3J 8pf&!j&pR4[EI,[+I$3!!%J!!$!!!!J'6$!%!!J'9$!!!!J&4p8X3*'1+BR8`A3p V(hQ!*3p"p6p$p*p*$&NB"i$&-N@U'3pLpj!!+a$p,dXIHIBPC*r6$fd6pemZ!29 ,34"U)80LIhBB"N%14IGRNCmZ!28aSF*cpR$p,h8rE@lKRp--Eh@"J#X3JQ1@53p 0E(-PL`pV(hRf*@53!#4MLQ*e-#82BK$h@"Rbi!p8Yi!NBiTLG6"i$h@2G@U[H3a 6Kj&"N!$h8j'(4[BU%2BKa[GB%()+E2Di"Ja6pf%h%b$fd5YC"G$fF6&'*cpR!V% -Afhfe6VhRbhh@"N-@4J24I8r3`Bj$e,eAd,bi2$3!!!'!!!-!!!#!j6e5a$p,de C(fhp-2E42h8(J2GB'3*3a6erCrG8%#X3pY@4pY$P3[,J$e5a$fd6pe"i#ApfH4N (-P$9pe3)(#G6Mbi!p8X3edJJ+d%3JF*e1!C"$h@"N!!P#"SF)#X32hAfhf)8"G# #AJpLFS$bMc%&32-[+I,!jNF[H3mS06(b`"pf%r,!@CmTmX"MN!$f*[GC"')I,J$ e5a$2G836))'K`R8i"N%-XFpV'I,J$e5a#QJJ,hG3%b4aJ'33peJC!P!NBipYFJM KafS-8b4D$&1A*e12,J$p,e-6N!$d*"Ef[p--Eh@"J'$p,f*"Ef[p--8jFR8`8`+ a$feC(fd+FamZ!29,H!H!j(pYC(VhN!$h@"hh@JI3peph"i$h@"N&-'#AD[,IGH# R-3Bj!V%,@#$h@"J'#R-3pL3@pV"S"JKrCcDJ*3bf2fF3Fqpe)2BQpeN%BKJ*pe4 cpR"cFRDJTICh2bi!r5p6%j!!pBp2p1r6#"1B"M$eMdrdi-YNE#&2,J$e8j&!08p YDJadchAff#Bm'!+hJ2GhUJ-IGK32BK""papeG"Rbi!peph"[G5AfeLI'U[H3!)% jJ2@26r6JBj!!pBp2p'p'$,C'`K5!*3+a#eJJe8$DAhF-8b4DmZ!25&ph(hB8mX" p!V%-Afhfhh8haLG6J+Fa"i!eH2H3!#X3pBp2p1$fe[H3!2BK#PJ[,J$dN`+hJ-D "!V%,@#$fe[H3!2GfFJr5e8(hB8r6$93'-2@26r6JphYmX,D!DN&Tpj!!pL%6#"- [,J$e5a$p,e-6N!$eMdrdlp--AfhfeMN2E@pj$f)3peJC!P""Tapf%#Yi#(,h9LG 6mZm0!"i!!!`!!!)"R!`"!!)"RJ`!!!)#F``"!!)#G3`!!!)!F[9,%#&2EA0U!IE IGDBR8`P4J$8JMhAZ9#"cpf&)%2GRN9mZ!29,%%'KpfBb!BaZ%)(h(h86`B"N%%( &pR0rHKN2B[G5"rCc9"Rbl`d!"J!!$!!!!J$cp8X3JQ1@53Fb&135BR8`A3+a$p, drLG6r6$feCIA&!pV(hN2+09!E-%bMb`2GIEDEh8SmX!5cblbN!#RpYFS"bJ2GB( IGD-BJ'J'$d2drdle6e,drd`2+&326I4I923I+3pV(hRbi!p8X3Eh8V9!YS$f)4- 2G6MhA-')hh@JF`Yi"L)IEH+!*3N5&2EA-3YIG`*3pLpjjSJ#Yi$f,h9k,bec"c) 8j"*LG6mZm0!!"J!!$!!!!J#3!`S!53%@"0-!N!9*!3`4!D!!JU!!MJ%!#J#3"!, 3!N#B!#)!N!8m!4!!N!8m!3`!N!8m!3`!!!3!q1!!#J$Jl`!!!IIrr3!+!-$[!!! "prrp!!d$J!!!`2)!!!(hrrd!$31!!!'!mJ!!!IIrr3!K#3!!!3!!'CQ!!B$q!!X )"!!-!!!"rjcrrmrqr`(crrd!)3N!!!lJ!"QB!!'!rJ!,$!`!$!!!!IqCrrr2r[m "mrrp!#%G!!!Im!!CQCm2MaQB!!iFH(airi(rNq(-`H(KbB2rr3!G"3!!(m!!'Ib C!jJ!$ccpc!,"riIpc!2Fac2rr3!G"3!!(m!!'IbC!jJ!#qcpc!,"rirpc!2Jcc2 rr3!H"3!!(r!!'IbC!TJ!#Il-"Ic-`Iq(`2h-!Xmcrrd!(J8!!"r`!"RmQ3ZB!!L -c-c!c-(rNmrpc!,2-rrp!"m'!!!2i!!CNIfC#j!!!!J-c-c%c-(rQFlpc!,2-rr p!#%G!!!'`!!IiCQ2MarJ!!J-H(aic-(rR1(J`H(Jci2rr3!-lJ!!!Ilr!2clrrd !$1i!!!(qr`$Fqrrp!!cZ!!!"r[m!iI[rr3!)lJ!!!IIrr3!)lJ!!!IIrr3!%i2m !m!RZ!!!"p3!"J!!*lJ!!!I8!!F!!#Hi!!!(e!!(!!!cZ!!!"q!!%"J!!`!!-lJ! !!IJ!"!B!!-!!%Zi!$J%!"QI(r$amI$`q!!$!!"(Z!!)"!!EqCJ"'r@B$!!$!!"( Z!!)"!!EqCJ!qr@B$!!$!!!rZ!!)"!!ElCJ9qCJ!!`!!2lJ!#!3!'qfB&B'B!!-! !$qi!!J%!"[YQ"@*Q!!$!!",Z!!i"!!2QCQBqI(`m2J!!`!!1lJ!!!IX!!@"Jr3! "`!!1lJ!!!IX!!@"Jr3!"`!!*lJ!!!I8!!F!!#Hi!!!(e!!(!!!RZ!!!"p3!"`!! *lJ!!!I8!!F!!#Hi!!!(e!!(!!!lZ!!8"!!$2Mi$k!!(!!!lZ!!8"!!$-c-$k!!( !!",Z!!N"!!$-c-$rKiq!rJ!"`!!5lJ!*!3!!c-c!c-M-`2i!!F!!%Zi!#3%!!-c 2J-c(c-$q!!(!!",Z!!8"!!c-c-$qc!$!rJ!"`!!5lJ!&!3!-c-c!rX`!`2i!!F! !%Zi!"3%!$-c-`2l-!-$q!!(!!",Z!!N"!!H2Mi$-amq!rJ!"`!!0lJ!!!IS!!!c p!!(!!!hZ!!!"qJ!!$2d!!F!!#Hi!!!(e!!(!!!RZ!!!"p3!"`!!*lJ!!!I8!!F! !#Hi!!!(e!!(!!!RZ!!!"p3!"`!!0lJ!!!Id!!!ck!!(!!!lZ!!8"!"!!!!ck!!( !!",Z!!i"!$1-aaimIm"r`mI!`!!5lJ!1!3"Q6-b-CQCJCQ4QB-!!%Zi!$J%!aJc 1$'CQB'CMjQ$!!*J!)J!m!*!$53%3!$`!N!0*!3`!2!#3!dN"$!!!%Zi!#!%4KJc ($'CQB2jQ!Q$!!",Z!!J"'`B-`iaQCQ$qCJ*J`!!5lJ!)!3i'6-Q-CQCJrQB#B-! !%Zi!$J%%!iI("MaQB'CMjm$!!![Z!!!"p`!$"J$!!![Z!!!"p`!$"J$!!!RZ!!! "p3!"`!!*lJ!!!I8!!F!!#Hi!!!(er`(!!!RY!!!rp[m"`!!#h`!#h`!#h`#J!)q J!)2rjrHU!DZ!r!#J!)qJ!)2r!*!$#J#H!2S)Z3#3!`%!RJ$a%3'J!)+J!)i"!!S !N!3#d!*!Q!!J!*!&2!$i!*!$!3!m!2%!N!-"!$`!m3!!"!$iiJ!-!1$q!!"rq[m !rZi!$!$!rJ!!IrVr!2lZ!!`%J!!!`(rkr`$qlJ!-")!!!B"rq[m!rZi!(a!!!!% !IqCQIrjrrrrq#!3!$2d!!f-!!$$q!!!-rJ!I%!!!$Z"rjQIrrRrrrri-$!!-r3! $CJ!!-2i!!!cq!#!F!!!Im(rQCQ$`F1CRrJiFH(airi!!E"ic2KiH0Rcq!"`&!!! I`(rQr'B$Cri222h-!X!!H2dc!L-ic2i!(!8!!"r!IqEmCJ0RrJ[XrF`#`!"`r6- #(c$-rJ!G"3!!(r"rj[aQ!QIq#Il-"Ic-`!"i2rdc!6$-rJ!G"3!!(r"rj[aQ#fI q#)c-c-$-`!"X-2dc!6$-rJ!H"J!!$q"rjQlpCJY[rJJ-c-c%c-!!CM(p-`%`c2i !)"`!!!E!Iq!HCR"`i"rq#!aiI(M-`!"M(Kmq(Km`I2i!$[d!!(rkr`$qp`!!!rN !$[d!!(rkr`$qp`!!)rN!$[d!!(rkr`$qp`!!([N!#[d!!(rkr`$qlJ!+r3!!IrV r!2lZ!!6Mrrm!#[d!!%$i!!!3m!!+r3!!32J!!"M`!!Vp!!"!q!!!'2!!$2d!!N! ""2S!!"M`!!cp!!*!!B6k!!!Bm!!2r3!&3!(%H-c!r3!!'2!!$rd!"8!"j-c-`2d !!"M`!!rp!!9!!A6-c-$p!!!Bm!!2r3!&3!%mr-c!r3!!'2!!$rd!"8!"(-$-`2d !!"M`!!rp!!9!!3c%c)$p!!!Bm!!1r3!%3!%%H2rm!!!Bm!!+r3!!32J!!"M`!!V p!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!!!'2!!#[d!!%$ i!!!Bm!!+r3!!32J!!"M`!!cp!!*!!2$k!!!Bm!!-r3!#3!'BqJ!!'2!!$rd!"8! "QI$am2d!!"M`!!rp!!&!!IkC!*Mp!!!Bm!!2r3!"3!(qQ3#Br3!!'2!!$rd!"8! "QCRjQ2d!!"M`!!rp!!9!!CQCJCMp!!!Bm!!2r3!&3!'CQBQBr3!!'2!!$rd!"8! !mI$aQ2d!!"M`!!hp!!0!!!'!q`!!'2!!$Id!!d!!!B$l!!!Bm!!+r3!!32J!!"M `!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!!!'2!!$Id !!d!!mB$l!!!Bm!!0r3!$3!'*J2X!!"M`!!rp!!9!!B'2$Klp!!!Bm!!2r3!&3!' "QCNcr3!!'2!!$rd!"8!"JCQF-rd!!"M`!*J!)!!m!*!$H!$i!$`!!3"i!2%!2!! "!(J!m3!!$rd!"8!"JCQ12rd!!"M`!!rp!!9!!B'CKc$p!!!Bm!!2r3!&3!'*QC- ar3!!'2!!$rd!"8!!mBm1([d!!"M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3! !32J!!"M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!! !'2!!$[d!"%!"M-c!r!!!'2!!$[d!"%!"Q!c!r!!!'2!!$[d!"%!"X-c!r!!!'2! !$[d!"%!"i-c!r!!!'2!!$[d!"%!"`-c!r!!!'2!!$[d!"%!"i-c!r!!!'2!!$[d !"%!"X-c!r!!!'2!!$[d!"%!"Q-c!r!!!'2!!$[d!"%!"M-c!r!!!'2!!#[d!!%$ i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M `!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!!!'2!!#[d !!%$i!!!Bm!!+r3!!D[LU!,M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J !!"M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!!!'2! !#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3! !32J!!"M`!"$p!!C!!1-!!B$!rJ!!'2!!%2d!"N!"N`!"J-$q!!!Bm!!3r3!+3!' $ic2(aic-q"M`!!rp!!9!!F-c-Bcpc!!Bm!!2r3!&3!$M-c'-rF`!'2!!$rd!"8! !Fc-aM2h-!"M`!!rp!!9!!$-c-Bcpc!!Bm!!3r3!+3!%c-c'-c-c)c"M`!"$p!!T !!1-am-I(Mr$-'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!!!'2!!#[d !!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J !!"M`!*J!)!"i!*!$RJ$i!(J!!3#H!2%!H!!"!*i!m3!!#[d!!%$i!!!Bm!!+r3! !32J!!"M`!!Vp!!"Uq+S!Z2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!! !'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!! +r3!!32J!!"M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!" !q!!!'2!!$[d!"%!!m!'-r!!!'2!!$[d!"%!"Q!!-r!!!'2!!$[d!"%!"QCQHr!! !'2!!$[d!"%!"QCQ-r!!!'2!!$[d!"%!"QCQ-r!!!'2!!$[d!"%!"QCQ-r!!!'2! !$[d!"%!"QCQ-r!!!'2!!$[d!"%!"QCQ-r!!!'2!!$[d!"%!!m2Q'r!!!'2!!$2d !!N!!'2S!!"M`!!Vp!!"!q!!!'2!!#[d!!%$i!!!Bm!!+r3!!32J!!"M`!!Vp!!" rq2m!q2!!#[d!!!rir`$im!!#i3!#i3!#i3!#i3!#i3!#i3!#i3!#i3#J!)qJ!)2 rZ!#3"3&8N!!J!!%`!#)!N!-3!*!$!94m)!!"8J!--`%!%!!3!!&8`#!!!9i!$$- "!"!!)!!"9)`J!!&U!!`c!3!3!$!!!94d)!!"GJ!+-`%!N!8"9'!J!!'!!#)!N!- 3!*!$!94S)!!"SJ!-1`%!%!!3!!&8C#!!!Di!$$X"!"!!)!!"9&JJ!!'k!!Sl!AG bX#X3p0E(-PL`peJ8"c)8eX%2CrGANDFaMb`'-(0X*rGK$hGcPIG`H!E#IhCL'3p Lpj!!bRcfYcpR"c"bmZ!29,H!phHU"UK3pL4cpR!V%2Gh19ph!P!V%046)&d#X3P ikQpjmZm0!!!5!!!-!!!#!#i-!J!#!$3-!!!#!VEe5a$p,eGcPIGrd`pY%rG3j&p fH4J'QA*e0U"H&'*e1!pej6$hGcPIGimZ!28aSF*cpR$p,diIGrd`phHU$%&L%'! aph$hGcPIG`mSpe1KL!+a33C""U3@RhN)(hB6"H%`phFjAhH!9!+a#eJJH!pe0[B U%#8'UPaL%'2hN!$fe8%1JIGCAbdK6fecDSmTmZ!!r5p$TB(p--TB'!+a$2G836) '`Rpf%2Gh19phml"b"i!IFIGApfDK-J*3bRcfYcpR"c!V%2Gh19phmRJ-TB%2BPp imZ!2d[6q%rd`H!peJC!!*339i6"JbPJC$hGcPIGr,J$d%*GUAfF2BPpi$hGkS2B K#AMUEhNC$hGbX2B[G5*6J09!&XX2Gh19phmZ!23kI2Dh2fF&-'$f,h8L8`phHU$ 'peJ3+f)2Gh19ph!P$f)3AK-CmX$feT%'`Rpf(b`'13pL4IGICl)#8#X3e&-JA3+ a#-342bi!mSp8Yi$'-'U&$f)3peJC!P$f*(2fF'$hCiIf+K$hGcPIG`*3+a$88b" G!V%)a"%r,[+3!!p"#,9#YMN2Gfpj!P"H%`B2Gh19ph"i!P![HH%23epYpYBjmYp 1mX$hHa33p1"i!V%2Gh19ph!rGIEIBK6bl`d!"J!!$!!!!J)ppeph$hGS#4KrCc' 3!#82GB%#X3fPph$&-N@Jj&pfH4N2B[H3!#X3p5p"p0#"4fS*4rGK6bi!p)AhFIG K6b`#Yi#8IhB8"i$NANF5C2H3!#823HkK"MN#X8(933H!05#AJNIf,h8KN!$hGbX 2GIGr,J$dC8!VH!3@K6mX$hAhF2GhUJpeJ3+a$e,drdd)&(DJP(pf&!I3+a$e,d( dd)&(DJP(pf&!H!05$N'"-[,!Bj!!FJphHU"L)IEH)#814IGRN3fPph$&-N@JFS' YmZ!29,%0TIG`a6*&S14IGRNC"c!VH!eSYe-(J$8JD!(G(#IhB3D!+f)2GlI,!V% 28[3I63J8GU#8IhB8$NAhCj'2,!K3peJ3A3+a$e,d(dd*4rGK3(J%(&pYpY%j'3I 3FJH!EhCRT[BU(bi!peph$hGkS*H1T[H3!'-'S8)2E4L'pR%2Gl%`FJH!JQ3KN!$ hAJI3+a$e,d(dd*4rGK3-Ah@T!e)2BK#PaL'I,[$3!!!`!!!-!3!#!!)-!!!#!*m -!3!#!+%-!!!#!,8-!3!#!,F-!!!#!Gi-!3!#!H!-!!!#!$(`NV%2GIGb9D$NAfG 'pY$93#X3p9p1p*pB#eJJmSALG6D[+I$3!!!5!!!-!!!#!!8-!3!#!!X-!!!#!I[ e5a!VG*!!pV(hRf*@53DL&$BRpf%(J-DU'3+a$p,2GB*IE3pYE[d`pL('peJ3FJp YEhN2BK$2GB*IEApk'3*3+a$h@"6bH!j"d8%m(bi!p8X3pYEJH!a6*R-C"c"J3BA h9-%2Gl@"![HH%(J2d[5r4I@I3rd`Bj!!phYB%25I4!H!mambmimZ!29,%2E@i(J '$c(c$c,c6bhf,hNK!QpLSI,!92Cf0rHKN!"S$cEc3)%S"G$c(cB2B[H5'2,J$d9 XX)%J3H3B%bJ'$deXFb@,$fXIH3aC(bi!p8X3mamf$f,hNKJ2Gh+h-#X3J5#4ec% #X3p"p6p$p*p*$,C'`K5!pR%a4L'3!09!DU$PL(pLS3aIEIBR0LG6J&d#X3ALG6m X$'k!TFpVmX#,I5mX"MN-AfhfeMN2DapjJ2+(-#YL"8N8mX$8Afd2E9J[,BIfFhe mBb!P#KD#mYKrCcIAaM,bRbl`d!!'!!!-!!!#!!!%&J#3!`B!!!9`!*!$!J!!"rJ !N!-#!!!,d!#3!`)!!""Q!*!$#J!!%2!!N!-#!!!5E!#3!``!!"8d!*!$"J!!&@i !N!--!!!@BJ#3!``!!"HS!*!$'J!!'`#3"#!!!"YJ!*!$!J!!*ki!N!-1!!!a$J# 3!h`!!$8@!*!$2!!!0d`!N!2q!!"AY!!"iLS!!4!3!!%3%!!"%"!!!4!3!!%3%!! #%))!!4!3!!)3KJ!"%"!!!K#%!!%3%!!#%))!!4!3!!)3J`!"%"!!!K##!!%3%!! #%)3!!4!3!!%3%!!"%"!!!4!3!!%3%!!"$!`!!3`-!!%-$!!#$))!!!3@!*!$"J! !"A!!N!-#!!!(q!#3!`)!!![3!*!$!J!!%'B!N!-+!!!3m!#3!`)!!"*X!*!$$!! !&63!N!-'!!!9EJ#3!``!!"CL!*!$$!!!&kJ!N!-D!!!EB!#3!`)!!#HZ!*!$$J! !1$!!N!-D!!"9hJ!"*r$Y!!!rp[m"`!!#h`!#h`!#h`#J!)qJ!)2rj`#3!`S!HJ% ,#$N!N!9k!3%4!D!!JU!!MJ%!#J#3"!,3!N#B!#)!N!8m!3J!N!8m!3%!N!8m!3% !!!3!q1!!$!$JpJ!!2rVr!2$d!!`!`2B!!$rkr`$`p!!2!i!!!-$j!!!rq[m!m23 !$`1!!!'!q3!!2rVr!2$d!#!3!!!"!!!CQB!"J!!!2rIlrr2qr`6`B`!!-2i!!!c m!#!3!!!1i!!CQ!!"J!!!2r2crr2qr`6`CJ!!-2i!!!cm!#!F!!!Im!!CQCm2MaQ B2r(MKi1(!(r`E"ic2KiH0Rcm!"`&!!!I`!!Cr*N$Q$r``rdc!Mr`H2dc!L-ic2` !(!8!!"r!!"RmQ31B2r36r6-#2r"`r6-#(c$-r!!G"3!!(r!!'IbC!TJrp[ic"3- c2r"i2rdc!6$-r!!G"3!!(r!!'IbC#jJrph-c-cmc2r"X-2dc!6$-r!!H"J!!$q! !'C(pQ3Z3!$rhmc-c1c-rm'Bar6-"--cm!#!F!!!'`!!IiCQ2MarJ2rIcKi1(-cr `BaiI2KiI-(cm!!he!!!rq[m$m!!!!rF!$I8!!$rkr`2`!!!Mp`!0p3!!2rVr!r! !!"lh!!Ve!!!rq[m!m23!#[8!!$rkr`$`p!!%iIrr!!Ve!!!Jp`!!!IF!#[8!!#$ h!!!"p`!,p3!!)2F!!3'!q!!5p3!-)!!`"``!!!I'-!!"J2J!%[8!$#!#F!b-!!! 'B$!!!B$i!",e!!`J"M!-(Mam"QCi!!'!q!!5p3!-)!``$JaQCJCQ-!!"J2J!%[8 !$#!B-!F-CQB(aM!!!B$i!",e!!`L-$!$M'CQ"QB`!!'!q!!5p3!-)f!`!BaQCJC Q-!!"J2J!%[8!$#(!-!Q-CQB'CM!!!B$i!",e!!`JJ$!("Mam"mBB!!'!q!!2p3! !)2`!!'$p!!%"J2J!$r8!!#$m!!"Jr3!"!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`! "!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`!"!B$i!",e!!`J!(J ($!!!"mB`!!'!q!!5p3!-)!#-$)`!!!CJ-!!"J2J!%[8!$#!!$!`H2(`'CRMJ!B$ i!",e!!`J!!`1$'CQ"QBaN!!"J2J!%[8!$#!!'!F-CQB(aM(!!B$i!",e!!`J!$! $M'CQ"QB`i!'!q!!5p3!-)!"J!BaQCJCQ-(!"J2J!%[8!$#!!`!Q-CQB'CM%`!B$ i!",e!!`J!2`("Mam"mBBi!'!q!!2p3!!)2`!!'$p!!%"J2J!$r8!!#$m!!"Jr3! "!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`! "!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`! "!B$i!![e!!!UpkS"Ui$i!![e!!!Jp`!"!B$i!*J!)J!m!*!$H!%)!$`!N!0i!3% !2!#3!hJ"!3!!#r8!!#$h!!%"J2J!#r8!!#$h!!%"J2J!#r8!!#$h!!%"J2J!#r8 !!#$h!!%"J2J!#r8!!#$h!!%"J2J!#r8!!#$h!!%"J2J!#r8!!#$h!!%"J2J!#r8 !!#$h!!%"J2J!#r8!!#$h!!%"J2J!#r8!!#$h!!%"J2J!#r8!!#$h!!%"J2J!%[8 !$#!!JJ!(`!!B`!!!!B$i!",e!!`J!X)!"Q!!!-!!!!'!q!!5p3!-)!EL2!CMaYR QB!!"J2J!%[8!$#!-mQB'C'FBaQ!!!B$i!",e!!`J',TQ"m2Q'-CJ!!'!q!!5p3! -)M#HCJB'CKM'B!!"J2J!%[8!$#0JMQB'"QBBaQ!!!B$i!",e!!`K`)CQ"JCQ'-C J!!'!q!!5p3!-))##2!B$jKKMi!!"J2J!$I8!!#$j!!0J!!'!q!!1p3!!)2S!"!4 J!!'!q!!1p3!!)2S!"!2!!!'!q!!,p3!!)2F!!3'!q!!,p3!!)2F!!3'!q!!,p3! !)2F!!3'!q!!,p3!!)2F!!3'!q!!5p3!#)!$irJ!'(`!!B`!"J2J!%[8!!L!!`2i !"KQ!!!-!!B$i!",e!!`J!-'BmI!CMaYRQB'!q!!5p3!-)!$"QCQB'C'FBaQ"J2J !%[8!$#!!mCQCQ"m2Q'-CJB$i!",e!!`J!-'CqCJB'CKM'B'!q!!5p3!-)!$"QB' B'"QBBaQ"J2J!%[8!$#!!`C'*Q"JCQ'-CJB$i!",e!!`J!2RJmCJB$jKKMi'!q!! -p3!!)2J!!J'"J2J!$28!!#$i!!)4JB$i!!ce!!!Jq!!#$`'!q!!,p3!!)2F!!3' !q!!,p3!!)2F!!3'!q!!,p3!!)2F!!3'!q!!,p3!!)2F!!3'!q!!5p3!-)!"i$!` 2J!!aJ!!"J2J!%[8!!L!!c2i-"X!!!B!!!B$i!",e!!`J!-amI!c(ME2-`!'!q!! 5p3!")!$qc!F-b-iaM-!"J2J!%[8!!5!!rX`($iI--Bc!!B$i!",e!!%J!2l-"`` -c$'-`!'!q!!5p3!")!$qc!F-$-`aM-!"J2J!%[8!!5!!rX`($!c--Bc!!B$i!", e!!`J!(KmI!`(c$$(`!'!q!!-p3!!)2J!!X!"J2J!$I8!!#$j!!-)`!'!q!!0p3! !)2N!!`H!!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`!"!B$i!![e!!!Jp`!"!B$i!![ e!!!Jp`!"!B$i!![e!!!Jp`!"!B$i!*J!)J"i!*!$HJ%)!(J!N!0k!3%!H!#3!hS "!3!!#r8!!#$h!!%"J2J!#r8!!#$h!!%"J2J!S!#2S!#$rrS!HJ!+!9F!m3hD!(S !!!&A!1F4!D!!JU!!MJ%!#J#3"!,3!N#B!"i!HJ#3!lB!k!"k!*!$YJ$R!(S!N!1 f!1F!!![e!!!UpkS"Ui$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`! "!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`! "!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`! "!B$m!![e!!!Jp`!"!B$m!",e!!8J!2aiH!cq!!2!!!'!r!!5p3!&)!!Bc-`-rJ! $`!!"J2`!%[8!$#!!--c-$iH-am!!!B$m!",e!!`J!(M-c!c)c-c!!!'!r!!5p3! -)!!-c-`-amc-`!!"J2`!%[8!"5!!$-c-$2l-!m!!!B$m!",e!!8J!!c-c!cqc!2 !!!'!r!!5p3!&)!#-c-`-rX`$`!!"J2`!%[8!!5!!rRJ($iI(am!!!B$m!![e!!! Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!! Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!",e!!8J!$KiH!cq!!2!!!' !r!!5p3!&)!"Jc-`-rJ!$`!!"J2`!%[8!$#!!`-c-$iH-am!!!B$m!",e!!`J!2M -c!c)c-c!!!'!r!!5p3!")!$qc!F-amc-`!!"J2`!%[8!!5!!rX`!$2l-!m!!!B$ m!",e!!%J!2l-!!cqc!2!!!'!r!!5p3!")!$qc!!-rX`$`!!"J2`!%[8!!5!!rRJ ($iI(am!!!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![ e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!", e!!)J!$$qH!!-rJ!#`!'!r!!5p3!')!*`M-c-$2i!!X!"J2`!%[8!$#!'-!c-c!q (M-I!!B$m!",e!!`J$$!-c-`-b-c-`!'!r!!5p3!-)"J`'-c-$-I-c-!"J2`!%[8 !!#,q-!,-c!cqc!,!!B$m!",e!!BMB$"Jc-`-rX`#`!'!r!!5p3!')F!``-c-$2l -!X!"J2`!%[8!$##!-2aiH!q(amI!!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$ m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$ m!*J!(J#f!*!$mJ$S!,B!N!2b!1F!YJ#3!r)!j`!!#r8!!#$h!!%"J2`!%[8!!L! !-2ji!!cq!!,!!B$m!",e!!)J!($qc!!-rJ!#`!'!r!!5p3!#)!!`rX`'$iH-am! "J2`!%[8!!L!!-2l-"Jc)c-c!!B$m!",e!!`J!$"ic-`-amc-`!'!r!!5p3!#)!! `rX`!$2l-!X!"J2`!%[8!!L!!-2l-!!cqc!,!!B$m!",e!!)J!$$qc!!-rX`#`!' !r!!5p3!#)!!`rRJ'$iI(am!"J2`!#r8!!#$h!!%"J2`!#r8!!#$h!!%"J2`!#r8 !!#$h!!%"J2`!#r8!!#$h!!%"J2`!#r8!!#$h!!%"J2`!#r8!!#$h!!%"J2`!#r8 !!#$h!!%"J2`!%[8!"L!!H!aiH!cq!!,!!B$m!",e!!BJ!)`Fc-`-rJ!#`!'!r!! 5p3!-)!!-,-c-$iH-am!"J2`!%[8!$#!!$%c-c!c)c-c!!B$m!",e!!`J!"L-c-` -amc-`!'!r!!5p3!')!!`rXc-$2l-!X!"J2`!%[8!"L!!B!c-c!cqc!,!!B$m!", e!!BJ!-!-c-`-rX`#`!'!r!!5p3!-)!$m$(Ki$iI(am!"J2`!#r8!!#$h!!%"J2` !#r8!!#$h!!%"J2`!#r8!!#$h!!%"J2`!#r8!!#$h!!%"J2`!#r8!!#$h!!%"J2` !#r8!!#$h!!%"J2`!#r8!!#$h!!%"J2`!%[8!"L!!r$KiH!cq!!,!!B$m!",e!!B J!"KJc-`-rJ!#`!'!r!!5p3!-)!!``-c-$iH-am!"J2`!%[8!$#!!H2M-c!c)c-c !!B$m!",e!!)J!!cqc!B-amc-`!'!r!!5p3!#)!!-rX`!$2l-!X!"J2`!%[8!!L! !$2l-!!cqc!,!!B$m!",e!!)J!)cqc!!-rX`#`!'!r!!4p3!")!$pH!B2KmI(`!' !r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3' !r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!5p3!#)!!-rRJ !$2i!!X!"J2`!%[8!!L!!(2l-!!cq!!,!!B$m!",e!!)J!#cqc!B2Kic(`!'!r!! 5p3!#)!"-rX`'$-M-c-!"J2`!%[8!$#!!M(M-c!c(c-c!!B$m!",e!!)J!2lqc!! -rX`#`!'!r!!5p3!#)!!-rX`!$2l-!X!"J2`!%[8!!L!!$2l-!!cqc!,!!B$m!", e!!)J!!cqH!B2KmI(`!'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!#B!"i!mJ! !!5i!k!$b!!!",J$R!2)!!!%Z!1F!!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![ e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!",e!!)J!2cqH!!-rJ! #`!'!r!!5p3!')!!-M-c-$2i!!X!"J2`!%[8!$#!!$!c-c!q(M-I!!B$m!",e!!` J!!`-c-`-b-c-`!'!r!!5p3!-)!!B'-c-$-I-c-!"J2`!%[8!"L!!-$$-c!cqc!, !!B$m!",e!!BJ!$"Jc-`-rX`#`!'!r!!5p3!')!!``-c-$2l-!X!"J2`!%[8!$#! !-2aiH!q(amI!!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$ m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$ m!",e!!BJ!(JiH(J-rJ!#`!'!r!!5p3!')!$-B-c-$2i!!X!"J2`!%[8!$#!!c-$ -c!q(M-I!!B$m!",e!!`J!-cic-`-b-c-`!'!r!!4p3!")!$pc!B-amc-`!'!r!! 5p3!#)!"mrX`!$2l-!X!"J2`!%[8!!L!!$2l-!!cqc!,!!B$m!",e!!)J!"Mqc!! -rX`#`!'!r!!5p3!#)!"`rRJ'$iI(am!"J2`!#r8!!#$h!!%"J2`!#r8!!#$h!!% "J2`!#r8!!#$h!!%"J2`!#r8!!#$h!!%"J2`!#r8!!#$h!!%"J2`!#r8!!#$h!!% "J2`!#r8!!#$h!!%"J2`!%I8!!L!!-2ei!!cq!!("J2`!%[8!"b!!F-b-c-`-rJ! "`B$m!",e!!`J!$$-$-c-$iH-am'!r!!5p3!-)!!`c!c-c!c)c-c"J2`!%[8!$#! !--`Bc-`-amc-`B$m!",e!!FJ!$"m--c-$2l-!F'!r!!5p3!()!!`$'$-c!cqc!( "J2`!%[8!"b!!-"M!c-`-rX`"`B$m!",e!!`J!$"`r(Ki$iI(am'!r!!,p3!!)2F !!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F !!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F !!3'!r!!,p3!!)2F!!3'!r!!,p3!!+[HU!DZ!r!!,p3!!)2F!!3'!r!!,p3!!)2F !!3'!r!!,p3!!)2F!!3'!r!#B!"i",J!!!9F!k!%Z!!!"9`$R!5i!!!&A!1F!!![ e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![ e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![e!!!Jp`!"!B$m!![ e!!!Jp`!"!B$m!",e!!`J!(!!!"JCMa"!!!'!r!!5p3!-)!$)!!!B'CQB3!!"J2` !%[8!$#!!`2(`q"QCR%!!!B$m!",e!!`J!1'CQCJCQCj!!!'!r!!5p3!-)!"aQCQ B$aQA3!!"J2`!%[8!$#!!1IQCQ"QCNm!!!B$m!",e!!`J!"Q"QCJCQC(!!!'!r!! 5p3!-)!#CLCQB'CQ3!-!!!B$m!",e!!`J!($aQ2JCMa"!!!'!r!!,p3!!)2F!!3' !r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3' !r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!5p3!')!"`!!!B(ri!!Q!"J2`!%[8 !$#!!b!!!'"Q!!!"J!B$m!",e!!`J!-$am2JCQc`mCJ'!r!!5p3!-)!$KQCQB'Ca Q4Q`"J2`!%[8!$#!!FCQCQ"mBCMji!B$m!",e!!`J!$RjQCJCQ(jQF!'!r!!5p3! -)!!CJCQB'CKJCRJ"J2`!%[8!$#!!QBQCQ"QBBQCX!B$m!",e!!`J!($aQ2JI'$` qCJ'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F!!3'!r!!,p3!!)2F !!3'!r!!+p3!!2rEr!)$m!!Ve!!!(p[m!J2`!!Z-!S!#2S!#$r`#3!`%D'J!"%a- !!4!3!!%3%!!"%"!!!4!3!!%6%`!"%"!!!4!3!!)3KJ!"%"!!!4!3!!%3%!!"%"! !!4!3!!%3%!!"%"!!!4!3!!%3%!!"%"!!!K#(!!%3%!!"%"!!!4!3!!%3%!!#%)J !!4!3!!)3KJ!"%"!!!K#%!!%3%!!"%"!!!4!3!!%3%!!#%))!!4!3!!%3%!!"%"! !!4!3!!%3%!!#%)F!!4!3!!)3L!!"%"!!!4!3!!%3%!!"%"!!!K#%!!%3%!!#%)8 !!4!3!!)3J`!"%"!!!K#&!!%3%!!"%"!!!K#+!!%3%!!#%)8!!4!3!!)3K3!"%"! !!4!3!!%3%!!"%"!!!4!3!!%3%!!#%)-!!4!3!!%3%!!"%"!!!K#$!!%3%!!"%"! !!4!3!!%3%!!"%"!!!4!3!*!$!K#0!!%3%!!"%"!!!4!3!*!$!K#&!!%3%!!#%)F !!4!3!!)3K`!"%"!!!K#)!!%3%!!"%"!!!4!3!!%3%!!"%"!!!K##!!%3%!!#%)B !!4!3!!)3K!!"%"!!!K##!!%3%!!#%)-!!4!3!!)3JJ!"%"!!!K#%!!%3%!!"%"! !!4!3!!%3%!!"%"!!!3`-!!%-$!!"$!`!!Jb#!*!$-!!"9,JJ!!(%!#)!N!-D!$! !!96-B3!"jJ!125!!%`"+!!&8V#!!!I3!$$XJ!"!!A3!"9%KT!"#q!"Sl!J!3!'d !!94!D3!3F!!D1`)!%!"p!!&81'N!#L)!&$X#!"!!M3!"9$"K!!e!!"il!!!6!*d !!96))!!#BJ!-2!%!%!#`!!&8U#J!!Qi!&$X#!"!!`!!"9#!J!!+#!!`l!3"J!0! !!93B+!!#MJ%U1`!!%!%`!!&8%#!!!lJ!$$X"!"!"3!!"9!`S!!2%!#Bl!!!3!9! !!-ZF)!!$kJ!-1`%!%!&J!!$,9#J!!rB!&$X"!"!"F!!!beJJ!!JS!"il!3!3!B! !!-YF+!!(qJ!Z1`!!%!'3!!!!bfJS!!9b!$!l!!!3!D!!!-YX+!!CZ!!m1`!!%!' `!!$,F#J!"li!1MX"!"!"`!!!bh`J!!5q!!`l!3"`!G!!!-Z-+!!,hJ&L1`!!%!* !!!$,N!!J!!@L!!`l!3!3!P!!!-YJ)!!4hJ!-1`%!%!*J!!$,6#J!"NB!&$X#!"! #F!!!bdJJ!!Bk!!`l!J#!!S!!!-YN+!!cEJ'S1`%!%!#!!3$,2#!!"Li!$$X"!'! !N!!"!-Y!+!!'CJ&-1`!!%!$`!3&88#!!"l)!$$X"!%!"!!%"9&3S!!P5!0!l!!! 3!8!"!I@m)!!)DJ!-1`%!%!&3!3(eY#!!#(B!$$X"!"!"B!%"9&`S!!L#!"3l!J! 3!A!"!I@i)!!)PJ!-1`%!)!'!!3(eX#J!#+)!@$X!!"!"S!%"pD3J!!Mk!!`l!3! 3!E!"!I@S)!!*"J!@1`%!%!(!!3(eV#J!#4`!&MX"!"!"d!%"pD!S!!Nb!"3l!3! 3!H!"!I@8)!!*4J!-1`%!F!(`!3(eN!!S!"cB!@`l!!!3!Q!"!I@-)!!0AJ!-1`% !J!*`!3(eQ#J!%jB"M$X!!"!!F!)"pB3J!!rm!!`l!3!3!)!#!I@))!!3#!!-1`% !%!#3!!)"pA`S!"!8!"`l!J!3!+!#!I@!)!!3-!!-1`)!3!#`!J(eR#J!$c`!`$X "!"!!m!)"pAJJ!"$b!!`l!3"3!3!#!I9d+!!B4J$Z1`!!%!&3!J(eF#!!%HS!$$X "!$!"B!)"p@`S!"I#!)3l!3!3!C!!!J(eB#!!%Q!!$$X"!&!"S!)"p@3S!"Rd!3` l!!!3!I!#!I9B)!!4T!!-1`(rBJ)!!J&8h#!!*l`)`KX"!+!#RJ)"p9`S!$'+!H3 l!3!3!-!$!I98)!!4aJ!-1`%!8!$3!`(e8#J!&AS!k$X!!"!")!-"p8JJ!![%!!` l!3"3!6!$!I9%+!!@EJ%51`!!%!'!!`(e3#!!#lJ!$$X"!"!"N!!$!I8m+!!4pJ! m1`!!%!'J!`(e1#!!%G)!$$X"!"!"X!-"p8`J!!BL!!`l!3!3!F!$!I8`+!!'"J! F1`)!%!(3!`(e0#!!"IS!$$X#!$!"i!-"p@JS!"Nd!)3l!!!3!K!$!I8N)!!&lJ! -1`%!%!)J!`(e+#J!"ES!0$X!!"!#-!-"p4`J!!@Z!!`l!3!`!N!$!I8J+!!3rJ# Q1`%!%!*`!`(e,#!!#X)!$$X"!"!#J!-"p4JJ!"'`!"Bl!IrJ!T!!!`&8T#!!%+J !&KX#!"!!-!3"p3`S!"#+!"il!J!3!%!%!I8))!!)4J!-1`,rKJ"3"!&8R#!!1%S )3KX#rb-!bJ3"9*JJ!%#-$H)E!J$3!DF%!I8!+!!I0J+3!$X!rmF#G`3"9*3J!") b!"BE!J!3!$!&!I8%+!!AJ!!D1`)!%!"!"3(dp#!!%0J!$$X#rlF!8!8"9)3J!#, 5"0`E!3"3!*N&!I6i+!!H4!$b1`%!%!$T"3(e%#!!%NJ!$$X"!(!!q38"p2`S!"Y L!ABl!3!3!@N&!I6X)!!59!!-1`%!F!&j"3(dk#J!09)"DMX"!"!"k38"p13J!"$ N!!`l!3#!!IN&!I6`+!!0GJ'Q1`!!%!*j"3(dh#!!",)!$$X"!"!#L38"p1!J!!V 1!!`l!3!3!TN&!I88)!!,V!!-1`%!%!+T"3(df#J!$a`!&$X#!"!!3!B"p03J!!e U!!`l!3!J!&!'!I63+!!%bJ"51`%!%!"`"J(da#!!#&i!$$X"!'!!J!B"p-JS!"* i!4il!!!3!1!'!I6-)!!,dJ!-1`%!3!$`"J(NqLJ!#ZB!aMX"!"!"-!B"j2iJ!!V D!!`l!3!J!8!'!I6!+!!#!!"L1`%!%!&J"J(NpL!!#MB!$$X"!$!"F!B"j2)S!!3 F!*Bl!3!3!D!'!H6Z)!!)8J!-1`%!)!'`"J(NkLJ!)FB!9MX"!"!"d!B"j0iJ!!C D!!`l!3"!!H!'!H6L+!!L(!#f1`%!%!)J"J(NjL!!"@3!$$X"!"!#-!B"j0SS!"X J!%!l!3!3!N!'!H6@)!!&@!!-1`%!%!*3"J(NdLJ!"4`!2$X"!"!#B!B"j-BJ!!m `!!`l!3!-!R!'!H6++!!91J!d13%!$!*m"J(N[LJ!%$`!+MN"!!`#L!B"j-)J!!3 +!!`j!3!B!T3'!H5f+!!+3J#!13(+%J!!!3#3!`+[!!!"V`#3!ejeF`S!!!`Lr!# 3"0,m!!4"l2eYC@jeAhGTEJS!!!JLb0,m!!4"l2eYC@jeAfP[#J!!"L,)d[`!"2K LFh-+rQePER9c#J)!'2m`C'pZC3S#!!,jE@&TEJVqE@&TEJS#6PEm*$!+!!!#6VV lFf9dGA!+!!!#6VVlGAF+!!!#6VVlFfKeG'4Z#J!!"%*R6VVlCAKTG!S!!!*8Mrm a#J41ANjerb3`#J)!!2jID@jTG'&bCf0f#J*1GIjcCA4eF!S#6PEm*$)+!!!%2`G )E2eaC(CKFR-+!-S#6VVl5@jTG%GbB@B+!!!%@)p1Z[Y*EQPd4J#3!b!Z,$XN!!$ 3!!![rf!J38d!)&"0!$S!N!S"!!!"6!C6G@jNBAN!N!N'6@pZC'&j!*!*"e4eCA0 NBAN!N!J*9f9NEQ9cC'&j!*!'#&4SGA*cC'&j!*!("NCbD@4KH3#3#3K6BA4eFQ4 KH3#3"`G+B@jeBA*j!*!)#%CPBR*eBA*j!*!("8eKFQ0S!*!+"8&`FQPX!*!+!de KH3#3$!4+G@jP!*!,"%TeE(N!N!X'3A9RGA0d!*!*#90PF(4PE@*PFJ#3"JG2Bh4 [BQ9b!*!)#%j[GQ9YBQ9b!*!(#%4PBf9YBQ9b!*!(rrm!!`#3"#`J!!!J!*!$,#! !N!F"6R8!N!-3$b"PG'jbEf&TFf4XD'0QF!#3!b-!#`#3!`N!#!!-!!X!!`!#!!3 !"3!'!!FN24!N%$mr"3J3%!!!!3#3!`+[!!!"V`#3!ei!!-`F!*J!N!-F!&i!!8P 19%`!!3!58e45)!!"!#S!!Irr)!!!*!#3"[rr)!#3"`-Krrm!!!')!!$,U!+mrrm !!!&d!*!%UX`: !Funky!Stuff! exit 0 : end of shell archive -- John Bruner (S-1 Project, Lawrence Livermore National Laboratory) MILNET: jdb@mordor [jdb@s1-c.ARPA] (415) 422-0758 UUCP: ...!ucbvax!dual!mordor!jdb ...!seismo!mordor!jdb
guido@boring.UUCP (07/29/85)
Here's a fix which may greatly enhance the usability of John Bruner's fine "uw" program. It turs out that on our system (and maybe on yours!), the fact that the master part of a pty can be opened, gives absolutely no guarantee that the slave part is equally willing. Therefore this fix will open the slave in the parent process and continue searching for a pty when this fails. It also searches the series of pty's with names /dev/pty[qrs][0-9a-f] which were ignored by the original program. Happy macing, Guido van Rossum, CWI, Amsterdam guido@mcvax --------------------------------- cut here ------------------------------------ *** uw.c.orig Sun Jul 21 18:11:31 1985 --- uw.c Sun Jul 28 22:04:48 1985 *************** *** 387,393 * hand us a terminal session running under their uid....] */ buf[cnt] = 0; ! if (strncmp(buf, "/dev/ptyp", sizeof "/dev/ptyp" - 1) || fstat(fd, &st1) < 0 || stat(buf, &st2) < 0 || st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) { (void)close(fd); --- 387,393 ----- * hand us a terminal session running under their uid....] */ buf[cnt] = 0; ! if (strncmp(buf, "/dev/pty", sizeof "/dev/pty" - 1) || fstat(fd, &st1) < 0 || stat(buf, &st2) < 0 || st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) { (void)close(fd); *************** *** 510,517 newwind(w) register struct window *w; { ! register char *cp; ! register fildes_t fd; register int pid; register char *shell; char pty[32], ptysufx[2]; --- 510,517 ----- newwind(w) register struct window *w; { ! register char *cpmajor, *cp; ! register fildes_t fd, fd2; register int pid; register char *shell; char pty[32], ptysufx[3]; *************** *** 514,520 register fildes_t fd; register int pid; register char *shell; ! char pty[32], ptysufx[2]; static char ptyidx[] = "0123456789abcdefghijklmnopqrstuvwxyz"; static int unity = 1; extern char *getenv(); --- 514,521 ----- register fildes_t fd, fd2; register int pid; register char *shell; ! char pty[32], ptysufx[3]; ! static char ptyidmajor[] = "pqrs"; static char ptyidx[] = "0123456789abcdefghijklmnopqrstuvwxyz"; static int unity = 1; extern char *getenv(); *************** *** 521,527 /* * Create a new window using the specified component of "window". ! * This routine isn't very smart at finding pseudo-ttys. */ ptysufx[1] = '\0'; --- 522,534 ----- /* * Create a new window using the specified component of "window". ! * This routine tries to be smart at finding pseudo-ttys: ! * it tries all of /dev/pty[p-s][0-9a-z] until it finds one ! * that can be opened AND whose slave end can be opened. ! * (The latter is necessary because we often suffer from pty's ! * whose slave end is still busy while the master has been ! * closed; the slave ends are usually open exclusively ! * so another open would fail.) */ ptysufx[2] = '\0'; *************** *** 524,533 * This routine isn't very smart at finding pseudo-ttys. */ ! ptysufx[1] = '\0'; ! for (cp=ptyidx; *cp; cp++) { ! ptysufx[0] = *cp; ! (void)strncpy(pty, "/dev/ptyp", sizeof pty-1); (void)strncat(pty, ptysufx, sizeof pty-1); if ((fd = open(pty, 2)) >= 0) break; --- 531,542 ----- * so another open would fail.) */ ! ptysufx[2] = '\0'; ! for (cpmajor=ptyidmajor; *cpmajor; ++cpmajor) { ! ptysufx[0]= *cpmajor; ! for (cp=ptyidx; *cp; cp++) { ! ptysufx[1] = *cp; ! (void)strncpy(pty, "/dev/pty", sizeof pty-1); (void)strncat(pty, ptysufx, sizeof pty-1); if ((fd = open(pty, 2)) >= 0) { /* Now check slave end. */ *************** *** 529,535 ptysufx[0] = *cp; (void)strncpy(pty, "/dev/ptyp", sizeof pty-1); (void)strncat(pty, ptysufx, sizeof pty-1); ! if ((fd = open(pty, 2)) >= 0) break; } if (fd < 0) --- 538,560 ----- ptysufx[1] = *cp; (void)strncpy(pty, "/dev/pty", sizeof pty-1); (void)strncat(pty, ptysufx, sizeof pty-1); ! if ((fd = open(pty, 2)) >= 0) { ! /* Now check slave end. */ ! (void)strncpy(w->w_tty, "/dev/tty", sizeof w->w_tty-1); ! (void)strncat(w->w_tty, ptysufx, sizeof w->w_tty-1); ! if ((fd2 = open(w->w_tty, 2)) < 0) { ! close(fd); ! continue; /* Bad luck, try another. */ ! } ! goto found_one; ! } ! /* ! * If a file really isn't there, don't check the rest of ! * this major series. This avoids trying to open 48 ! * nonexistent pty's when the system is configured with ! * only 16 instead of the expected 64. ! */ ! if (errno == ENOENT) break; } } *************** *** 531,536 (void)strncat(pty, ptysufx, sizeof pty-1); if ((fd = open(pty, 2)) >= 0) break; } if (fd < 0) return(-1); --- 556,562 ----- */ if (errno == ENOENT) break; + } } return(-1); *************** *** 532,539 if ((fd = open(pty, 2)) >= 0) break; } ! if (fd < 0) ! return(-1); (void)ioctl(fd, FIONBIO, &unity); /* set non-blocking I/O */ fdmap[fd] = w; w->w_fd = fd; --- 558,566 ----- break; } } ! return(-1); ! ! found_one: (void)ioctl(fd, FIONBIO, &unity); /* set non-blocking I/O */ fdmap[fd] = w; w->w_fd = fd; *************** *** 538,545 fdmap[fd] = w; w->w_fd = fd; selmask[0].sm_rd |= (1<<fd); - (void)strncpy(w->w_tty, "/dev/ttyp", sizeof w->w_tty-1); - (void)strncat(w->w_tty, ptysufx, sizeof w->w_tty-1); while ((pid=fork()) < 0) sleep(5); --- 565,570 ----- fdmap[fd] = w; w->w_fd = fd; selmask[0].sm_rd |= (1<<fd); while ((pid=vfork()) < 0) sleep(5); *************** *** 541,547 (void)strncpy(w->w_tty, "/dev/ttyp", sizeof w->w_tty-1); (void)strncat(w->w_tty, ptysufx, sizeof w->w_tty-1); ! while ((pid=fork()) < 0) sleep(5); if (!pid) { (void)signal(SIGHUP, SIG_DFL); --- 566,572 ----- w->w_fd = fd; selmask[0].sm_rd |= (1<<fd); ! while ((pid=vfork()) < 0) sleep(5); if (!pid) { (void)signal(SIGHUP, SIG_DFL); *************** *** 552,559 (void)signal(SIGCHLD, SIG_DFL); (void)ioctl(open("/dev/tty", 2), (int)TIOCNOTTY, (char *)0); (void)setuid(getuid()); /* shouldn't need this */ - if ((fd=open(w->w_tty, 2)) < 0) - _exit(1); if (!(shell = getenv("SHELL"))) shell = "/bin/sh"; (void)dup2(fd, 0); --- 577,582 ----- (void)signal(SIGCHLD, SIG_DFL); (void)ioctl(open("/dev/tty", 2), (int)TIOCNOTTY, (char *)0); (void)setuid(getuid()); /* shouldn't need this */ if (!(shell = getenv("SHELL"))) shell = "/bin/sh"; (void)dup2(fd2, 0); *************** *** 556,562 _exit(1); if (!(shell = getenv("SHELL"))) shell = "/bin/sh"; ! (void)dup2(fd, 0); (void)dup2(0, 1); (void)dup2(0, 2); for (fd=3; fd < NFDS; fd++) --- 579,585 ----- (void)setuid(getuid()); /* shouldn't need this */ if (!(shell = getenv("SHELL"))) shell = "/bin/sh"; ! (void)dup2(fd2, 0); (void)dup2(0, 1); (void)dup2(0, 2); for (fd=3; fd < NFDS; fd++) *************** *** 566,571 _exit(1); } return(0); } --- 589,595 ----- _exit(1); } + close(fd2); return(0); }