]> granicus.if.org Git - python/commitdiff
Has been dead so long that there's no use keeping it in the active bit of the repository.
authorJack Jansen <jack.jansen@cwi.nl>
Thu, 10 May 2001 12:17:03 +0000 (12:17 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Thu, 10 May 2001 12:17:03 +0000 (12:17 +0000)
27 files changed:
Mac/Unsupported/GUSI1-mods/GUSI.h [deleted file]
Mac/Unsupported/GUSI1-mods/GUSI.r [deleted file]
Mac/Unsupported/GUSI1-mods/GUSIDispatch.cp [deleted file]
Mac/Unsupported/GUSI1-mods/GUSINetDB.cp [deleted file]
Mac/Unsupported/GUSI1-mods/GUSISIOUX.cp [deleted file]
Mac/Unsupported/GUSI1-mods/GUSI_P.h [deleted file]
Mac/Unsupported/mactcp/MACTCPconst.py [deleted file]
Mac/Unsupported/mactcp/MacTCPerrors.py [deleted file]
Mac/Unsupported/mactcp/macdnrmodule.c [deleted file]
Mac/Unsupported/mactcp/mactcpmodule.c [deleted file]
Mac/Unsupported/mactcp/mactcpmodules.mu.exp [deleted file]
Mac/Unsupported/mactcp/mactcpmodules.mu.hqx [deleted file]
Mac/Unsupported/mactcp/socket.py [deleted file]
Mac/Unsupported/mactcp/tcpglue.c [deleted file]
Mac/Unsupported/mactcp/tcpglue.h [deleted file]
Mac/Unsupported/stdwinmodule.mu.exp [deleted file]
Mac/Unsupported/stdwinmodule.mu.hqx [deleted file]
Mac/Unsupported/twit/TwitCore.py [deleted file]
Mac/Unsupported/twit/mac_widgets.py [deleted file]
Mac/Unsupported/twit/mactwit_app.py [deleted file]
Mac/Unsupported/twit/mactwit_browser.py [deleted file]
Mac/Unsupported/twit/mactwit_edit.py [deleted file]
Mac/Unsupported/twit/mactwit_mod.py [deleted file]
Mac/Unsupported/twit/mactwit_stack.py [deleted file]
Mac/Unsupported/twit/twit.py [deleted file]
Mac/Unsupported/twit/twit.rsrc [deleted file]
Mac/Unsupported/twit/twittest.py [deleted file]

diff --git a/Mac/Unsupported/GUSI1-mods/GUSI.h b/Mac/Unsupported/GUSI1-mods/GUSI.h
deleted file mode 100644 (file)
index 5bea7f4..0000000
+++ /dev/null
@@ -1,369 +0,0 @@
-/*********************************************************************
-Project        :       GUSI                            -       Grand Unified Socket Interface
-File           :       GUSI.h                  -       Socket calls
-Author :       Matthias Neeracher
-Language       :       MPW C/C++
-
-$Log$
-Revision 1.1  2000/09/12 20:24:50  jack
-Moved to Unsupported.
-
-Revision 1.1  1998/08/18 14:52:33  jack
-Putting Python-specific GUSI modifications under CVS.
-
-Revision 1.2  1994/12/31  01:45:54  neeri
-Fix alignment.
-
-Revision 1.1  1994/02/25  02:56:49  neeri
-Initial revision
-
-Revision 0.15  1993/06/27  00:00:00  neeri
-f?truncate
-
-Revision 0.14  1993/06/20  00:00:00  neeri
-Changed sa_constr_ppc
-
-Revision 0.13  1993/02/14  00:00:00  neeri
-AF_PAP
-
-Revision 0.12  1992/12/08  00:00:00  neeri
-getcwd()
-
-Revision 0.11  1992/11/15  00:00:00  neeri
-remove netdb.h definitions
-
-Revision 0.10  1992/09/26  00:00:00  neeri
-Separate dirent and stat
-
-Revision 0.9  1992/09/12  00:00:00  neeri
-Hostname stuff
-
-Revision 0.8  1992/09/07  00:00:00  neeri
-readlink()
-
-Revision 0.7  1992/08/03  00:00:00  neeri
-sa_constr_ppc
-
-Revision 0.6  1992/07/21  00:00:00  neeri
-sockaddr_atlk_sym
-
-Revision 0.5  1992/06/26  00:00:00  neeri
-choose()
-
-Revision 0.4  1992/05/18  00:00:00  neeri
-PPC stuff
-
-Revision 0.3  1992/04/27  00:00:00  neeri
-getsockopt()
-
-Revision 0.2  1992/04/19  00:00:00  neeri
-C++ compatibility
-
-Revision 0.1  1992/04/17  00:00:00  neeri
-bzero()
-
-*********************************************************************/
-
-#ifndef _GUSI_
-#define _GUSI_
-
-#include <sys/types.h>
-
-/* Feel free to increase FD_SETSIZE as needed */
-#define GUSI_MAX_FD    FD_SETSIZE
-
-#include <sys/cdefs.h>
-#include <compat.h>
-#include <sys/ioctl.h>
-#include <sys/fcntl.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <Types.h>
-#include <Events.h>
-#include <Files.h>
-#include <AppleTalk.h>
-#include <CTBUtilities.h>
-#include <Packages.h>
-#include <PPCToolBox.h>
-#include <StandardFile.h>
-#include <stdio.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <string.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <machine/endian.h>
-
-typedef enum spin_msg {
-       SP_MISC,                                /* some weird thing, usually just return immediately if you get this */
-       SP_SELECT,                      /* in a select call */
-       SP_NAME,                                /* getting a host by name */
-       SP_ADDR,                                /* getting a host by address */
-       SP_STREAM_READ, /* Stream read call */
-       SP_STREAM_WRITE,        /* Stream write call */
-       SP_DGRAM_READ,          /* Datagram read call */
-       SP_DGRAM_WRITE, /* Datagram write call */
-       SP_SLEEP,                       /* sleeping, passes ticks left to sleep */
-       SP_AUTO_SPIN            /* Autospin, passes argument to SpinCursor */
-} spin_msg;
-
-typedef int (*GUSISpinFn)(spin_msg msg, long param);
-typedef void (*GUSIEvtHandler)(EventRecord * ev);
-typedef GUSIEvtHandler GUSIEvtTable[24];
-
-/*
- * Address families, defined in sys/socket.h
- *
-#define        AF_UNSPEC                0              // unspecified
-#define        AF_UNIX                  1              // local to host (pipes, portals)
-#define        AF_INET                  2              // internetwork: UDP, TCP, etc.
-#define        AF_CTB                   3              // Apple Comm Toolbox (not yet supported)
-#define        AF_FILE                  4              // Normal File I/O (used internally)
-#define        AF_PPC                   5              // PPC Toolbox
-#define        AF_PAP                   6              // Printer Access Protocol (client only)
-#define        AF_APPLETALK    16              // Apple Talk
-
-*/
-
-#define        ATALK_SYMADDR 272               /* Symbolic Address for AppleTalk                       */
-
-/*
- * Some Implementations of GUSI require you to call GUSISetup for the
- * socket families you'd like to have defined. It's a good idea to call
- * this for *all* implementations.
- *
- * GUSIDefaultSetup() will include all socket families.
- *
- * Never call any of the GUSIwithXXX routines directly.
- */
-
-__BEGIN_DECLS
-void GUSIwithAppleTalkSockets();
-void GUSIwithInternetSockets();
-void GUSIwithPAPSockets();
-void GUSIwithPPCSockets();
-void GUSIwithUnixSockets();
-void GUSIwithSIOUXSockets();
-void GUSIwithMPWSockets();
-
-void GUSISetup(void (*socketfamily)());
-void GUSIDefaultSetup();
-void GUSILoadConfiguration(Handle);
-__END_DECLS
-/*
- * Types,  defined in sys/socket.h
- *
-
-#define        SOCK_STREAM              1              // stream socket 
-#define        SOCK_DGRAM               2              // datagram socket
-
-*/
-
-/*
- * Defined in sys/un.h
- *
-struct sockaddr_un {
-       short           sun_family;
-       char            sun_path[108];
-};
-
-*/
-
-#ifndef PRAGMA_ALIGN_SUPPORTED
-#error Apple had some fun with the conditional macros again
-#endif
-
-#if PRAGMA_ALIGN_SUPPORTED
-#pragma options align=mac68k
-#endif
-
-struct sockaddr_atlk {
-       short                   family;
-       AddrBlock       addr;
-};
-
-struct sockaddr_atlk_sym {
-       short                   family;
-       EntityName      name;
-};
-
-struct sockaddr_ppc {
-       short                                   family;
-       LocationNameRec location;
-       PPCPortRec                      port;
-};
-
-/* Definitions for choose() */
-
-#define        CHOOSE_DEFAULT  1               /*      Use *name as default name                                               */
-#define        CHOOSE_NEW              2               /* Choose new entity name, not existing one     */
-#define        CHOOSE_DIR              4               /* Choose a directory name, not a file          */
-
-typedef struct {
-       short                   numTypes;
-       SFTypeList      types;
-} sa_constr_file;
-
-typedef struct {
-       short                   numTypes;
-       NLType          types;
-} sa_constr_atlk;
-
-/* Definitions for sa_constr_ppc */
-
-#define PPC_CON_NEWSTYLE               0x8000  /* Required */
-#define PPC_CON_MATCH_NAME             0x0001  /* Match name */
-#define PPC_CON_MATCH_TYPE     0x0002  /* Match port type */
-#define PPC_CON_MATCH_NBP              0x0004  /* Match NBP type */
-
-typedef struct {
-       short                   flags;
-       Str32                   nbpType;
-       PPCPortRec      match;
-} sa_constr_ppc;
-
-#if PRAGMA_ALIGN_SUPPORTED
-#pragma options align=reset
-#endif
-
-__BEGIN_DECLS
-/* 
- * IO/Socket stuff, defined elsewhere (unistd.h, sys/socket.h
- *
-
-int socket(int domain, int type, short protocol);
-int bind(int s, void *name, int namelen);
-int connect(int s, void *addr, int addrlen);
-int listen(int s, int qlen);
-int accept(int s, void *addr, int *addrlen);
-int close(int s);
-int read(int s, char *buffer, unsigned buflen);
-int readv(int s, struct iovec *iov, int count);
-int recv(int s, void *buffer, int buflen, int flags);
-int recvfrom(int s, void *buffer, int buflen, int flags, void *from, int *fromlen);
-int recvmsg(int s,struct msghdr *msg,int flags);
-int write(int s, const char *buffer, unsigned buflen);
-int writev(int s, struct iovec *iov, int count);
-int send(int s, void *buffer, int buflen, int flags);
-int sendto (int s, void *buffer, int buflen, int flags, void *to, int tolen);
-int sendmsg(int s,struct msghdr *msg,int flags);
-int select(int width, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
-int getdtablesize(void);
-int getsockname(int s, void *name, int *namelen);
-int getpeername(int s, struct sockaddr *name, int *namelen);
-int shutdown(int s, int how);
-int fcntl(int s, unsigned int cmd, int arg);
-int dup(int s);
-int dup2(int s, int s1);
-int ioctl(int d, unsigned int request, long *argp);
-int getsockopt(int s, int level, int optname, char *optval, int * optlen);
-int setsockopt(int s, int level, int optname, char *optval, int optlen);
-int isatty(int);
-int remove(const char *filename);
-int rename(const char *oldname, const char *newname);
-int creat(const char*);
-int faccess(char*, unsigned int, long*);
-long lseek(int, long, int);
-int open(const char*, int);
-int unlink(char*);
-int symlink(char* linkto, char* linkname);
-int readlink(char* path, char* buf, int bufsiz);
-int truncate(char *path, long length);
-int ftruncate(int fd, long length);
-int chdir(char * path);
-int mkdir(char * path);
-int rmdir(char * path);
-char * getcwd(char * buf, int size);
-*/
-
-/* 
- * Defined in stdio.h
- */
-#ifdef __MWERKS__
-void fsetfileinfo (char *filename, unsigned long newcreator, unsigned long newtype);
-#endif
-
-void fgetfileinfo (char *filename, unsigned long * creator, unsigned long * type);
-
-#ifdef __MWERKS__
-FILE *fdopen(int fd, const char *mode);
-int fwalk(int (*func)(FILE * stream));
-#endif
-
-int choose(
-               int             domain,
-               int             type,
-               char *  prompt,
-               void *  constraint,
-               int             flags,
-               void *  name,
-               int *   namelen);
-
-/* 
- * Hostname routines, defined in netdb.h
- *
-struct hostent * gethostbyname(char *name);
-struct hostent * gethostbyaddr(struct in_addr *addrP, int, int);
-int gethostname(char *machname, long buflen);
-struct servent * getservbyname (char * name, char * proto);
-struct protoent * getprotobyname(char * name);
-
-*/
-
-char * inet_ntoa(struct in_addr inaddr);
-struct in_addr inet_addr(char *address);
-
-/* 
- * GUSI supports a number of hooks. Every one of them has a different prototype, but needs
- * to be passed as a GUSIHook
- */
-
-typedef enum {
-       GUSI_SpinHook,  /* A GUSISpinFn, to be called when a call blocks */
-       GUSI_ExecHook, /* Boolean (*hook)(const GUSIFileRef & ref), decides if file is executable */
-       GUSI_FTypeHook,/* Boolean (*hook)(const FSSpec & spec) sets a default file type */
-       GUSI_SpeedHook /* A long integer, to be added to the cursor spin variable */
-} GUSIHookCode;
-
-typedef void (*GUSIHook)(void);
-void GUSISetHook(GUSIHookCode code, GUSIHook hook);
-GUSIHook GUSIGetHook(GUSIHookCode code);
-
-/* 
- * What to do when a routine blocks
- */
-
-/* Defined for compatibility */
-#define GUSISetSpin(routine)   GUSISetHook(GUSI_SpinHook, (GUSIHook)routine)
-#define GUSIGetSpin()                  (GUSISpinFn) GUSIGetHook(GUSI_SpinHook)
-
-int GUSISetEvents(GUSIEvtTable table);
-GUSIEvtHandler * GUSIGetEvents(void);
-
-extern GUSIEvtHandler  GUSISIOWEvents[];
-
-#define SIGPIPE        13
-#define SIGALRM        14
-
-/* 
- * BSD memory routines, defined in compat.h
- *
-
-#define index(a, b)                                            strchr(a, b)
-#define rindex(a, b)                                           strrchr(a, b)
-#define bzero(from, len)                               memset(from, 0, len)
-#define bcopy(from, to, len)                   memcpy(to, from, len)
-#define bcmp(s1, s2, len)                              memcmp(s1, s2, len)
-#define bfill(from, len, x)                    memset(from, x, len)
-
- */
-
-__END_DECLS
-
-#endif /* !_GUSI_ */
diff --git a/Mac/Unsupported/GUSI1-mods/GUSI.r b/Mac/Unsupported/GUSI1-mods/GUSI.r
deleted file mode 100644 (file)
index a6e2648..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-/*********************************************************************
-Project        :       GUSI                            -       Grand Unified Socket Interface
-File           :       GUSI.r                  -       Include this
-Author :       Matthias Neeracher
-Language       :       MPW Rez 3.0
-
-$Log$
-Revision 1.1  2000/09/12 20:24:45  jack
-Moved to Unsupported.
-
-Revision 1.1  1998/08/18 14:52:37  jack
-Putting Python-specific GUSI modifications under CVS.
-
-Revision 1.3  1994/12/30  19:33:34  neeri
-Enlargened message box for select folder dialog.
-
-Revision 1.2  1994/08/10  00:34:18  neeri
-Sanitized for universal headers.
-
-Revision 1.1  1994/02/25  02:12:04  neeri
-Initial revision
-
-Revision 0.5  1993/05/21  00:00:00  neeri
-suffixes
-
-Revision 0.4  1993/01/31  00:00:00  neeri
-Daemon
-
-Revision 0.3  1993/01/03  00:00:00  neeri
-autoSpin
-
-Revision 0.2  1992/09/24  00:00:00  neeri
-Don't include CKID, create GUSIRsrc_P.h
-
-Revision 0.1  1992/07/13  00:00:00  neeri
-.rsrc
-
-*********************************************************************/
-
-#include "Types.r"
-#include "GUSIRsrc_P.h"
-
-include "GUSI.rsrc" not 'ckid';
-
-/* Define a resource ('GU\85I', GUSIRsrcID) to override GUSI defaults            
-       To avoid having to change the Rez file every time I introduce another
-       feature, the preprocessor variable GUSI_PREF_VERSION by default keeps
-       everything compatible with version 1.0.2. Just define GUSI_PREF_VERSION
-       to be the version you want to use.
-*/
-
-#ifndef GUSI_PREF_VERSION
-#define GUSI_PREF_VERSION '0102'
-#endif
-
-type 'GU\85I' {
-       literal longint text    =       'TEXT'; /* Type for creat'ed files                              */
-       literal longint mpw     =       'MPS '; /* Creator for creat'ed files                   */
-       byte            noAutoSpin, autoSpin;           /* Automatically spin cursor ?                  */
-#if GUSI_PREF_VERSION > '0102'
-       boolean         useChdir, dontUseChdir;         /* Use chdir() ?                                                        */
-       boolean approxStat, accurateStat;       /* statbuf.st_nlink = # of subdirectories ? */
-#if GUSI_PREF_VERSION >= '0181'
-       boolean noDelayConsole, DelayConsole;   /* Delay opening console window until needed? */
-       fill            bit[1];
-#else
-       boolean noTCPDaemon, isTCPDaemon;       /* Inetd client ?                                                       */
-       boolean noUDPDaemon, isUDPDaemon;
-#endif
-#if GUSI_PREF_VERSION >= '0150'
-#if GUSI_PREF_VERSION >= '0181'
-       boolean wantAppleEvents, noAppleEvents; /* Always solicit AppleEvents */
-#else
-       boolean noConsole, hasConsole;          /* Are we providing our own dev:console ? (Obsolete) */
-#endif
-#if GUSI_PREF_VERSION >= '0180'
-       boolean autoInitGraf, noAutoInitGraf;   /* Automatically do InitGraf ? */
-       boolean exclusiveOpen, sharedOpen;      /* Shared open() ?                                                      */
-       boolean noSigPipe, sigPipe;                     /* raise SIGPIPE on write to closed PIPE */
-#else
-       fill            bit[3];
-#endif
-#else
-       fill            bit[4];
-#endif
-       literal longint = GUSI_PREF_VERSION;
-#if GUSI_PREF_VERSION >= '0120'
-       integer = $$Countof(SuffixArray);
-       wide array SuffixArray {
-                       literal longint;                                        /* Suffix of file */
-                       literal longint;                                        /* Type for file */
-                       literal longint;                                        /* Creator for file */
-       };
-#endif
-#endif
-};
-
-type 'TMPL' {
-       wide array {
-               pstring;
-               literal longint;
-       };
-};
-
-resource 'TMPL' (GUSIRsrcID, "GU\85I") {
-       {
-               "Type of created files",                'TNAM',
-               "Creator of created files",     'TNAM',
-               "Automatically spin cursor",    'DBYT',
-#if GUSI_PREF_VERSION > '0102'
-               "Not using chdir()",                            'BBIT',
-               "Accurate stat()",                              'BBIT',
-               "TCP daemon",                                           'BBIT',
-               "UDP daemon",                                           'BBIT',
-#if GUSI_PREF_VERSION >= '0150'
-               "Own Console",                                          'BBIT',
-#else
-               "Reserved",                                                     'BBIT',
-#endif
-#if GUSI_PREF_VERSION >= '0180'
-               "Don't initialize QuickDraw",   'BBIT',
-               "Open files shared",                            'BBIT',
-               "Raise SIGPIPE",                                        'BBIT',
-#else
-               "Reserved",                                                     'BBIT',
-               "Reserved",                                                     'BBIT',
-               "Reserved",                                                     'BBIT',
-#endif
-               "Version (don't change)",               'TNAM',         
-#if GUSI_PREF_VERSION >= '0120'
-               "NumSuffices",                                          'OCNT',
-               "*****",                                                                'LSTC',
-               "Suffix",                                                       'TNAM',
-               "Type for suffix",                              'TNAM',
-               "Creator for suffix",                   'TNAM',
-               "*****",                                                                'LSTE',
-#endif
-#endif         
-       }
-};
-
-resource 'DLOG' (GUSIRsrcID, "Get Directory") {
-       {0, 0, 217, 348}, 
-       dBoxProc, 
-       invisible, 
-       noGoAway, 
-       0x0, 
-       10240, 
-       "",
-       alertPositionMainScreen
-};
-
-resource 'DITL' (GUSIRsrcID, "Get Directory") {
-       {
-               { 142, 256,  160, 336}, Button          {enabled,"Open"},
-               {1152,  59, 1232,  77}, Button          {enabled,"Hidden"},
-               { 193, 256,  211, 336}, Button          {enabled,"Cancel"},
-               {  43, 232,   63, 347}, UserItem                {disabled},
-               {  72, 256,   90, 336}, Button          {enabled,"Eject"},
-               {  97, 256,  115, 336}, Button          {enabled,"Drive"},
-               {  43,  12,  189, 230}, UserItem                {enabled},
-               {  43, 229,  189, 246}, UserItem                {enabled},
-               { 128, 252,  129, 340}, UserItem                {disabled},
-               {1044,  20, 1145, 116}, StaticText      {disabled,""},
-               { 167, 256,  185, 336}, Button          {enabled,"Directory"},
-               {   0,  30,   18, 215}, Button          {enabled,"Select Current Directory:"},
-               { 200,  20, 1145, 222}, StaticText      {disabled,"Select a Folder"}
-       }
-};
-
-
diff --git a/Mac/Unsupported/GUSI1-mods/GUSIDispatch.cp b/Mac/Unsupported/GUSI1-mods/GUSIDispatch.cp
deleted file mode 100644 (file)
index c51783f..0000000
+++ /dev/null
@@ -1,1437 +0,0 @@
-/*********************************************************************
-Project        :       GUSI                            -       Grand Unified Socket Interface
-File   :       GUSIDispatch.cp-        Dispatch calls to their correct recipient
-Author :       Matthias Neeracher
-Language:      MPW C/C++
-
-$Log$
-Revision 1.1  2000/09/12 20:24:47  jack
-Moved to Unsupported.
-
-Revision 1.1  1998/08/18 14:52:37  jack
-Putting Python-specific GUSI modifications under CVS.
-
-Revision 1.4  1994/12/30  19:48:09  neeri
-Remove (theoretical) support for pre-System 6 systems.
-Remove built-in support for INETd.
-Fix problems in connection with ROM PowerPC library.
-Move open() to GUSIFileDispatch.cp.
-Support AF_UNSPEC domains.
-More work on spinning performance.
-
-Revision 1.3  1994/08/10  00:30:30  neeri
-Sanitized for universal headers.
-Prevent overly fast spinning.
-
-Revision 1.2  1994/05/01  23:47:34  neeri
-Extend fflush() kludge.
-Define _lastbuf for MPW 3.2 compatibility.
-
-Revision 1.1  1994/02/25  02:28:36  neeri
-Initial revision
-
-Revision 0.27  1993/11/24  00:00:00  neeri
-Flush stdio before closing
-
-Revision 0.26  1993/11/22  00:00:00  neeri
-Extend two time loser for EBADF
-
-Revision 0.25  1993/11/12  00:00:00  neeri
-Two time loser workaround for flush bug
-
-Revision 0.24  1993/06/27  00:00:00  neeri
-{pre,post}_select
-
-Revision 0.23  1993/06/27  00:00:00  neeri
-ftruncate
-
-Revision 0.22  1993/06/20  00:00:00  neeri
-Further subtleties in console handling 
-
-Revision 0.21  1993/05/21  00:00:00  neeri
-Suffixes
-
-Revision 0.20  1993/05/15  00:00:00  neeri
-Try to keep errno always set on error returns
-
-Revision 0.19  1993/05/13  00:00:00  neeri
-Limit Search for configuration resource to application
-
-Revision 0.18  1993/01/31  00:00:00  neeri
-Introducing daemons (pleased to meet you, hope you guess my name)
-
-Revision 0.17  1993/01/17  00:00:00  neeri
-Be more careful about user aborts.
-
-Revision 0.16  1993/01/03  00:00:00  neeri
-GUSIConfiguration
-
-Revision 0.15  1992/11/25  00:00:00  neeri
-Still trying to get standard descriptors for standalone programs right. sigh.
-
-Revision 0.14  1992/10/05  00:00:00  neeri
-Small fix in event dispatching
-
-Revision 0.13  1992/09/12  00:00:00  neeri
-getdtablesize()
-
-Revision 0.12  1992/08/30  00:00:00  neeri
-Move hasPPC to GUSIPPC.cp, AppleTalkIdentity
-
-Revision 0.11  1992/08/05  00:00:00  neeri
-Change the way standard I/O channels are opened
-
-Revision 0.10  1992/08/03  00:00:00  neeri
-Move Scatter/Gather to GUSIBuffer.cp
-
-Revision 0.9  1992/07/30  00:00:00  neeri
-Features with initializers
-
-Revision 0.8  1992/07/13  00:00:00  neeri
-hasProcessMgr
-
-Revision 0.7  1992/06/27  00:00:00  neeri
-choose(), hasNewSF
-
-Revision 0.6  1992/06/06  00:00:00  neeri
-Feature
-
-Revision 0.5  1992/04/19  00:00:00  neeri
-C++ Rewrite
-
-Revision 0.4  1992/04/18  00:00:00  neeri
-Changed read/write/send/recv dispatchers
-
-Revision 0.3  1992/04/17  00:00:00  neeri
-Spin routines
-
-Revision 0.2  1992/04/16  00:00:00  neeri
-User interrupt stuff
-
-Revision 0.1  1992/03/31  00:00:00  neeri
-unix domain socket calls
-
-*********************************************************************/
-
-#include "GUSIFile_P.h"
-#include "GUSIMPW_P.h"
-#include <SetJmp.h>
-#include <Signal.h>
-#include <CursorCtl.h>
-#include <Resources.h>
-#include <Events.h> 
-#include <Windows.h>
-#include <Finder.h>
-#include <Script.h>
-#include <Events.h>
-#include <Traps.h>
-#include <CommResources.h>
-#include <CTBUtilities.h>
-#include <Connections.h>
-#include <FileTransfers.h>
-#include <Terminals.h>
-#include <EPPC.h>
-#include <PLStringFuncs.h>
-#include <LowMem.h>
-#include <Processes.h>
-
-#if GENERATINGCFM
-#include <CodeFragments.h>
-#endif
-
-#pragma segment GUSI
-
-/***************************** Globals ******************************/
-
-GUSIConfiguration GUSIConfig;          // Change the order of these declarations
-SocketTable                                    Sockets;                        //      and you'll regret it (ARM Â§12.6.1)
-GUSISpinFn                                     GUSISpin        = GUSIDefaultSpin;
-GUSIExecFn                                     GUSIExec        = GUSIDefaultExec;
-GUSIFTypeFn                                    GUSIFType       = (GUSIFTypeFn)0;
-long                                           gGUSISpeed      = 1;
-static GUSIEvtHandler *        evtHandler      = nil;
-static short                           evtMask         = 0;
-static int                                     errorSock       = -1;
-static int                                     errorType       = 0;
-static int                                     errorCount      = 0;
-const int                                      errorMax                = 3;
-Boolean                                                CatchStdIO      = false;
-
-Feature        hasMakeFSSpec(
-                               gestaltFSAttr,
-                               (1<<gestaltHasFSSpecCalls),
-                               (1<<gestaltHasFSSpecCalls));
-Feature        hasAlias(
-                               gestaltAliasMgrAttr,
-                               (1<<gestaltAliasMgrPresent),
-                               (1<<gestaltAliasMgrPresent));
-Feature        hasNewSF(
-                               gestaltStandardFileAttr,
-                               (1<<gestaltStandardFile58),
-                               (1<<gestaltStandardFile58));
-Feature        hasProcessMgr(
-                               gestaltOSAttr,
-                               (1<<gestaltLaunchControl),
-                               (1<<gestaltLaunchControl));
-Feature hasCRM_P(
-                               gestaltCRMAttr,
-                               (1<<gestaltCRMPresent),
-                               (1<<gestaltCRMPresent));
-Feature hasCRM(hasCRM_P, InitCRM);
-Feature hasCTB(hasCRM, InitCTBUtilities);
-Feature hasStdNBP_P(
-                               gestaltStdNBPAttr,
-                               (1<<gestaltStdNBPPresent),
-                               (1<<gestaltStdNBPPresent));
-Feature hasStdNBP(hasCTB, hasStdNBP_P);
-Feature hasAppleEvents(
-                               gestaltAppleEventsAttr,
-                               (1<<gestaltAppleEventsPresent),
-                               (1<<gestaltAppleEventsPresent));
-Feature hasRevisedTimeMgr(
-                       gestaltTimeMgrVersion,
-                       2L);
-
-/*********************** Error propagation ************************/
-
-#ifdef GUSI_DISPATCH
-inline
-#endif
-int GUSI_error(int err)
-{
-       if (err)
-               errno = err;
-
-       return -1;
-}
-
-#ifdef GUSI_DISPATCH
-inline
-#endif
-void * GUSI_error_nil(int err)
-{
-       if (err)
-               errno = err;
-
-       return nil;
-}
-
-/*********************** GUSIConfiguration members ************************/
-
-#ifndef GUSI_DISPATCH
-
-Boolean        GUSIConfiguration::firstTime = false;
-short          GUSIConfiguration::we;
-
-void GUSIConfiguration::GUSILoadConfiguration(Handle h)
-{
-       typedef         GUSIConfigRsrc **       GUSIConfHdl;            
-       GUSIConfHdl config              =       GUSIConfHdl(h);
-       long            confSize        =       config ? GetHandleSize(Handle(config)) : 0;
-       
-       if (confSize < 4 || !(defaultType = (*config)->defaultType))
-               defaultType     =       'TEXT';
-       if (confSize < 8 || !(defaultCreator = (*config)->defaultCreator))
-               defaultCreator  =       'MPS ';
-       if (confSize < 9) 
-               autoSpin        =       1;                      // do automatic spin on read/write
-       else
-               autoSpin = (*config)->autoSpin;
-                       
-       if (confSize < 14)
-               version = '0102';
-       else
-               version = (*config)->version;
-
-       if (confSize < 10) {
-               noChdir                 =       false;  // Use chdir()
-               accurStat               =       false;  // st_nlink = # of entries + 2
-               hasConsole              =       false;
-               noAutoInitGraf  =       false;
-               sharedOpen              =       false;
-               sigPipe                 =       false;
-               noAppleEvents   =       false;
-               delayConsole            =       false;
-       } else {
-               noChdir                 =       ((*config)->flags & 0x80) != 0;
-               accurStat               =       ((*config)->flags & 0x40) != 0;
-               hasConsole              =       version >= '0150' && version <= '0180' && ((*config)->flags & 0x08) != 0;
-               delayConsole    =       version >= '0181' && ((*config)->flags & 0x20) != 0;
-               noAppleEvents   =       version >= '0181' && ((*config)->flags & 0x08) != 0;
-               noAutoInitGraf  =       version >= '0174' && ((*config)->flags & 0x04) != 0;
-               sharedOpen              =       version >= '0174' && ((*config)->flags & 0x02) != 0;
-               sigPipe                 =       version >= '0174' && ((*config)->flags & 0x01) != 0;
-       }
-       
-       if (version < '0120' || confSize < 16)
-               numSuffices = 0;
-       else
-               numSuffices = (*config)->numSuffices;
-       
-       if (!numSuffices)
-               suffices = nil;
-       else if (suffices = new GUSISuffix[numSuffices]) {
-               HLock((Handle)config);
-               memcpy(suffices, (*config)->suffices, numSuffices*sizeof(GUSISuffix));
-               for (int i=0; i<numSuffices; i++)
-                       for (int j=0; j<4; j++)
-                               if (((char *) (suffices+i))[j] == ' ')
-                                       ((char *) (suffices+i))[j] = 0;
-       }
-}
-
-GUSIConfiguration::GUSIConfiguration()
-{
-       short   oldResFile = CurResFile();
-       
-       if (!firstTime)
-               we = oldResFile;
-       else
-               UseResFile(we);
-               
-       Handle config   =       Get1Resource('GU\85I', GUSIRsrcID);
-       GUSILoadConfiguration(config);  
-       if (!firstTime) {
-               firstTime       =       true;
-               
-               if (!noChdir)
-                       chdir(":");
-       } else
-               UseResFile(oldResFile);
-       
-       ReleaseResource((Handle)config);
-}
-
-void GUSIConfiguration::SetDefaultFType(const TFileSpec & name) const
-{
-       FInfo   info;   
-
-       // 
-       // Custom hook if existing
-       //
-       if (GUSIFType && GUSIFType(name))
-               return;
-       
-       //
-       // Otherwise default behaviour
-       //
-       if (HGetFInfo(name.vRefNum, name.parID, name.name, &info))
-               return;
-
-       Ptr dot = PLstrrchr(name.name, '.');
-       
-       if (dot && (name.name[0] - (dot-Ptr(name.name))) <= 4) {
-               char searchsuffix[5];
-               
-               strncpy(searchsuffix, dot+1, name.name[0] - (dot-Ptr(name.name)));
-               
-               for (int i = 0; i<numSuffices; i++)
-                       if (!strncmp(suffices[i].suffix, searchsuffix, 4)) {
-                               info.fdType     =       suffices[i].suffType;
-                               info.fdCreator  =       suffices[i].suffCreator;
-                               
-                               goto determined;
-                       }
-       }
-
-       info.fdType     =       defaultType;
-       info.fdCreator  =       defaultCreator;
-       info.fdFlags    &= ~kHasBeenInited;
-
-determined:    
-       HSetFInfo(name.vRefNum, name.parID, name.name, &info);
-}
-
-void GUSIConfiguration::DoAutoInitGraf() const
-{
-       if (*(GrafPtr **) LMGetCurrentA5() != &qd.thePort)
-               InitGraf(&qd.thePort);
-       const_cast<GUSIConfiguration *>(this)->noAutoInitGraf   =       true;
-}
-
-#endif // GUSI_DISPATCH
-
-inline void GUSIConfiguration::DoAutoSpin() const 
-{
-       if (autoSpin)
-               SAFESPIN(0, SP_AUTO_SPIN, autoSpin);
-}
-
-Boolean GUSIConfiguration::DelayConsole() const
-{
-       return delayConsole;
-}
-
-/************************ Handle nonstandard consoles *************************/
-
-#ifndef GUSI_DISPATCH
-
-static void InitConsole()
-{
-       if (MPWDomain::stdopen) {
-               for (int i = 0; i < 3; i++) {
-                       Socket * sock =         MPWDomain::stdopen(i);
-
-                       if (sock)
-                               Sockets.Install(sock);
-               }
-       } else {
-               if (open("dev:console", O_RDONLY) < 0)
-                       open("dev:null", O_RDONLY);
-               if (open("dev:console", O_WRONLY) < 0)
-                       open("dev:null", O_WRONLY);
-               if (open("dev:console", O_WRONLY) < 0)
-                       open("dev:null", O_WRONLY); 
-       }
-}
-
-void SocketTable::InitConsole()
-{
-       if (needsConsole) {
-               needsConsole = false;
-               ::InitConsole();
-       }
-}
-
-#endif // GUSI_DISPATCH
-
-/************************ External routines *************************/
-
-int getdtablesize()
-{
-       return GUSI_MAX_FD;
-}
-
-int socket(int domain, int type, int protocol)
-{
-       SocketDomain *  dom;
-       Socket *                sock;
-       int                             fd;
-
-       Sockets.InitConsole();
-       
-       if (dom = SocketDomain::Domain(domain))
-               if (sock = dom->socket(type, protocol))
-                       if ((fd = Sockets.Install(sock)) != -1)
-                               return fd;
-                       else
-                               delete sock;
-
-       if (!errno)
-               return GUSI_error(ENOMEM);
-       else
-               return -1;
-}
-
-int socketpair(int domain, int type, int protocol, int * sv)
-{
-       SocketDomain *  dom;
-       Socket *                sock[2];
-
-       Sockets.InitConsole();
-       
-       if (dom = SocketDomain::Domain(domain))
-               if (!dom->socketpair(type, protocol, sock))
-                       if ((sv[0] = Sockets.Install(sock[0])) != -1)
-                               if ((sv[1] = Sockets.Install(sock[1])) != -1)
-                                       return 0;
-                               else {
-                                       Sockets.Remove(sv[0]);
-                                       
-                                       goto failInstall;
-                               }
-                       else {
-failInstall:
-                               delete sock[0];
-                               delete sock[1];
-                       }
-               
-       if (!errno)
-               return GUSI_error(ENOMEM);
-       else
-               return -1;
-}
-
-int pipe(int * fd)
-{
-       GUSIwithUnixSockets();
-       
-       if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd))
-               return -1;
-       shutdown(fd[0], 1);
-       shutdown(fd[1], 0);
-       
-       return 0;
-}
-
-int choose(int domain, int type, char * prompt, void * constraint, int flags, void * name, int * namelen)
-{
-       SocketDomain *  dom;
-
-       if (dom = SocketDomain::Domain(domain))
-               return dom->choose(type, prompt, constraint, flags, name, namelen);
-
-       return -1;
-}
-
-int bind(int s, const struct sockaddr *name, int namelen)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->bind((void *) name, namelen) : -1;
-}
-
-int connect(int s, const struct sockaddr *addr, int addrlen)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->connect((void *) addr, addrlen) : -1;
-}
-
-int listen(int s, int qlen)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->listen(qlen) : -1;
-}
-
-int accept(int s, struct sockaddr *addr, int *addrlen)
-{
-       Socket *        sock    =       Sockets[s];
-
-       if (sock)
-               if (sock        = sock->accept(addr, addrlen))
-                       if ((s = Sockets.Install(sock)) != -1)
-                               return s;
-                       else
-                               delete sock;
-
-       return -1;
-}
-
-int close(int s)
-{
-       errorSock       =       -1;
-       
-       return Sockets.Remove(s);
-}
-
-#ifdef __MWERKS__
-int read(int s, char *buffer, int buflen)
-#else
-int read(int s, char *buffer, unsigned buflen)
-#endif
-{
-       GUSIConfig.DoAutoSpin();
-       
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->read(buffer, (unsigned) buflen) : -1;
-}
-
-int readv(int s, const struct iovec *iov, int count)
-{
-       GUSIConfig.DoAutoSpin();
-       
-       Socket *        sock    =       Sockets[s];
-
-       if (sock)       {
-               Scatterer       scatt(iov, count);
-
-               if (scatt)
-                       return scatt.length(sock->read(scatt.buffer(), scatt.buflen()));
-               else
-                       return GUSI_error(ENOMEM);
-       } else
-               return -1;
-}
-
-int recv(int s, void *buffer, int buflen, int flags)
-{
-       GUSIConfig.DoAutoSpin();
-       
-       int             fromlen         =       0;
-       Socket *        sock            =       Sockets[s];
-
-       return sock ? sock->recvfrom(buffer, buflen, flags, nil, &fromlen) : -1;
-}
-
-int recvfrom(int s, void *buffer, int buflen, int flags, struct sockaddr *from, int *fromlen)
-{
-       GUSIConfig.DoAutoSpin();
-       
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->recvfrom(buffer, buflen, flags, from, fromlen) : -1;
-}
-
-int recvmsg(int s, struct msghdr *msg, int flags)
-{
-       GUSIConfig.DoAutoSpin();
-       
-       Socket *        sock    =       Sockets[s];
-
-       if (sock)       {
-               Scatterer       scatt((struct iovec *)msg->msg_iov, msg->msg_iovlen);
-
-               if (scatt)
-                       return
-                               scatt.length(
-                                       sock->recvfrom(
-                                               scatt.buffer(),
-                                               scatt.buflen(),
-                                               flags,
-                                               msg->msg_name,
-                                               (int *)&msg->msg_namelen));
-               else
-                       return GUSI_error(ENOMEM);
-       } else
-               return -1;
-}
-
-#ifdef __MWERKS__
-int write(int s, const char *buffer, int buflen)
-#else
-int write(int s, const char *buffer, unsigned buflen)
-#endif
-{
-       /* fflush() in the MPW stdio library doesn't take no for an answer.
-               Our workaround is to treat a second subsequent ESHUTDOWN or EBADF as 
-               an invitation to lie by pretending the write worked.
-       */
-       
-       int     len;
-       
-       GUSIConfig.DoAutoSpin();
-       
-       Socket *        sock    =       Sockets[s];
-
-       if (sock && (len = sock->write((char *) buffer, (unsigned) buflen)) != -1)
-               return len;
-               
-       switch (errno) {
-       case EINTR:
-       case EWOULDBLOCK:
-       case EINPROGRESS:
-       case EALREADY:
-               break;
-       default:
-               if (GUSIConfig.sigPipe)
-                       raise(SIGPIPE);
-               if (errorSock == s && errorType == errno) {
-                       if (++errorCount == errorMax) {
-                               errorSock = -1;
-                       
-                               return buflen;
-                       }
-               } else {
-                       errorSock = s;
-                       errorType = errno;
-                       errorCount= 1;
-               }
-       }
-       return -1;
-}
-
-static int HandleWriteErrors(int retval)
-{
-       if (retval == -1)
-               switch (errno) {
-               case EINTR:
-               case EWOULDBLOCK:
-               case EINPROGRESS:
-               case EALREADY:
-                       break;
-               default:
-                       if (GUSIConfig.sigPipe)
-                               raise(SIGPIPE);
-                       break;
-               }
-       
-       return retval;
-}
-
-int writev(int s, const struct iovec *iov, int count)
-{
-       GUSIConfig.DoAutoSpin();
-       
-       Socket *        sock    =       Sockets[s];
-
-       if (sock)       {
-               Gatherer        gath(iov, count);
-
-               if (gath)
-                       return HandleWriteErrors(gath.length(sock->write(gath.buffer(), gath.buflen())));
-               else
-                       return GUSI_error(ENOMEM);
-       } else
-               return -1;
-}
-
-int send(int s, const void *buffer, int buflen, int flags)
-{
-       GUSIConfig.DoAutoSpin();
-       
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? HandleWriteErrors(sock->sendto((void *)buffer, buflen, flags, nil, 0)) : -1;
-}
-
-int sendto(int s, const void *buffer, int buflen, int flags, const struct sockaddr *to, int tolen)
-{
-       GUSIConfig.DoAutoSpin();
-       
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? HandleWriteErrors(sock->sendto((void *)buffer, buflen, flags, (void *) to, tolen)) : -1;
-}
-
-int sendmsg(int s, const struct msghdr *msg, int flags)
-{
-       GUSIConfig.DoAutoSpin();
-       
-       Socket *        sock    =       Sockets[s];
-
-       if (sock)       {
-               Gatherer        gath((struct iovec *) msg->msg_iov, msg->msg_iovlen);
-
-               if (gath)
-                       return
-                               HandleWriteErrors(gath.length(
-                                       sock->sendto(
-                                               gath.buffer(),
-                                               gath.buflen(),
-                                               flags,
-                                               msg->msg_name,
-                                               msg->msg_namelen)));
-               else
-                       return GUSI_error(ENOMEM);
-       } else
-               return -1;
-}
-
-int select(int width, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
-{
-       Socket  *       sock;
-       long                    count;
-       int                     s;
-       long                    starttime, waittime;
-       fd_set          rd, wd, ed;
-       Boolean         r,w,e;
-       Boolean *       canRead;
-       Boolean *       canWrite;
-       Boolean *       exception;
-
-       count = 0;
-       FD_ZERO(&rd);
-       FD_ZERO(&wd);
-       FD_ZERO(&ed);
-
-       if (timeout)
-               waittime =  timeout->tv_sec*60 + timeout->tv_usec/16666;
-       else
-               waittime =      2000000000;     // Slightly more than a year; close enough to "no timeout"
-               
-       starttime = LMGetTicks();
-
-       // Check files for kosherness
-
-       for (s = 0; s < width ; ++s)
-               if (    (readfds && FD_ISSET(s,readfds))
-                       ||      (writefds && FD_ISSET(s,writefds))
-                       ||      (exceptfds && FD_ISSET(s,exceptfds))
-               )
-                       if (!Sockets[s])
-                               return GUSI_error(EBADF);
-       
-       for (s = 0; s < width ; ++s)
-               if (sock = Sockets[s]) {
-                       r = readfds && FD_ISSET(s,readfds);
-                       w = writefds && FD_ISSET(s,writefds);
-                       e = exceptfds && FD_ISSET(s,exceptfds);
-
-                       if (r || w || e)
-                               sock->pre_select(r, w, e);
-               }
-               
-       do {
-               for (s = 0; s < width ; ++s)  {
-                       if (sock = Sockets[s]) {
-                               r = false;
-                               w = false;
-                               e = false;
-
-                               canRead = (readfds && FD_ISSET(s,readfds)) ? &r : nil;
-                               canWrite = (writefds && FD_ISSET(s,writefds)) ? &w : nil;
-                               exception = (exceptfds && FD_ISSET(s,exceptfds)) ? &e : nil;
-
-                               if (canRead || canWrite || exception)   {
-                                       count   += sock->select(canRead, canWrite, exception);
-
-                                       if (r)
-                                               FD_SET(s,&rd);
-                                       if (w)
-                                               FD_SET(s,&wd);
-                                       if (e)
-                                               FD_SET(s,&ed);
-                               }
-                       }
-               }
-               if (count)
-                       break;
-
-               SAVE_AND_CLEAR_ERRNO;
-               SAFESPIN(false, SP_SELECT, waittime);
-
-               if (errno) {
-                       count = -1;
-                       
-                       break;
-               }
-       }  while (LMGetTicks() - starttime < waittime);
-
-       for (s = 0; s < width ; ++s)
-               if (sock = Sockets[s]) {
-                       r = readfds && FD_ISSET(s,readfds);
-                       w = writefds && FD_ISSET(s,writefds);
-                       e = exceptfds && FD_ISSET(s,exceptfds);
-
-                       if (r || w || e)
-                               sock->post_select(r, w, e);
-               }
-               
-       if (count < 0)
-               return GUSI_error(EINTR);
-               
-       if (readfds)
-               *readfds = rd;
-       if (writefds)
-               *writefds = wd;
-       if (exceptfds)
-               *exceptfds = ed;
-
-       return count;
-}
-
-int getsockname(int s, struct sockaddr *name, int *namelen)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->getsockname(name, namelen) : -1;
-}
-
-int getpeername(int s, struct sockaddr *name, int *namelen)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->getpeername(name, namelen) : -1;
-}
-
-int shutdown(int s, int how)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->shutdown(how) : -1;
-}
-
-int fcntl(int s, unsigned int cmd, int arg)
-{
-       Socket *        sock    =       Sockets[s];
-
-       if (sock)
-               return (cmd == F_DUPFD) ? Sockets.Install(sock, arg) : sock->fcntl(cmd, arg);
-       else
-               return -1;
-}
-
-int dup(int s)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? Sockets.Install(sock) : -1;
-}
-
-int dup2(int s, int s1)
-{
-       Socket *        sock    =       Sockets[s];
-
-       if (!sock)
-               return -1;
-
-       if (Sockets[s1])
-               Sockets.Remove(s1);
-
-       return Sockets.Install(sock, s1);
-}
-
-int ioctl(int s, unsigned int request, long *argp)
-{
-       Socket *        sock    =       Sockets[s];
-
-       if (!sock)
-               return -1;
-       
-       return sock->ioctl(request, argp);
-}
-
-int getsockopt(int s, int level, int optname, void *optval, int * optlen)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->getsockopt(level, optname, optval, optlen) : -1;
-}
-
-int setsockopt(int s, int level, int optname, const void *optval, int optlen)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->setsockopt(level, optname, (void *) optval, optlen) : -1;
-}
-
-int fstat(int s, struct stat * buf)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->fstat(buf) : -1;
-}
-
-long lseek(int s, long offset, int whence)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->lseek(offset, whence) : -1;
-}
-
-int ftruncate(int s, long offset)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->ftruncate(offset) : -1;
-}
-
-int isatty(int s)
-{
-       Socket *        sock    =       Sockets[s];
-
-       return sock ? sock->isatty() : -1;
-}
-
-void GUSISetHook(GUSIHookCode code, GUSIHook hook)
-{
-       switch (code) {
-       case GUSI_SpinHook:
-               GUSISpin = (GUSISpinFn) hook;
-               break;
-       case GUSI_ExecHook:
-               GUSIExec = (GUSIExecFn) hook;
-               break;
-       case GUSI_FTypeHook:
-               GUSIFType = (GUSIFTypeFn) hook;
-               break;
-       case GUSI_SpeedHook:
-               gGUSISpeed = (long) hook;
-               break;
-       }
-}
-
-GUSIHook GUSIGetHook(GUSIHookCode code)
-{
-       switch (code) {
-       case GUSI_SpinHook:
-               return (GUSIHook) GUSISpin;
-       case GUSI_ExecHook:
-               return (GUSIHook) GUSIExec;
-       case GUSI_FTypeHook:
-               return (GUSIHook) GUSIFType;
-       case GUSI_SpeedHook:
-               return (GUSIHook) gGUSISpeed;
-               break;
-       default:
-               return (GUSIHook) nil;
-       }
-}
-
-int GUSISetEvents(GUSIEvtTable table)
-{
-       short   evt;
-
-       evtHandler      =       table;
-       evtMask         =       0;
-
-       for (evt = 0; evt<16; ++evt)
-               if (evtHandler[evt])
-                       evtMask |=      1 << evt;
-
-       return 0;
-}
-
-GUSIEvtHandler * GUSIGetEvents(void)
-{
-       return evtHandler;
-}
-
-/*********************** SocketDomain members ***********************/
-
-#ifndef GUSI_DISPATCH
-
-SocketDomain *                 SocketDomain::domains[GUSI_MAX_DOMAIN];
-ProcessSerialNumber    SocketDomain::process;
-
-SocketDomain * SocketDomain::Domain(int domain)
-{
-       if (domain < 0 || domain >= GUSI_MAX_DOMAIN || !domains[domain])        {
-               GUSI_error(EINVAL);
-
-               return nil;
-       } else
-               return domains[domain];
-}
-
-void SocketDomain::Ready()
-{
-       if (hasProcessMgr)
-               WakeUpProcess(&process);
-}
-
-SocketDomain::SocketDomain(int domain)
-{
-#ifdef PREVENT_DUPLICATE_DOMAINS
-       if (domains[domain])    {
-               Str63   msg;
-
-               sprintf((char *) msg+1, "Duplicate declaration for domain %d\n", domain);
-               msg[0] = (unsigned char)strlen((char *) msg+1);
-
-               DebugStr(msg);
-       }
-#endif
-       if (domain)                                                                     // Ignore AF_UNSPEC domains
-               domains[domain] =       this;
-       
-       if (hasProcessMgr && !process.highLongOfPSN && !process.lowLongOfPSN)
-               GetCurrentProcess(&process);
-}
-
-SocketDomain::~SocketDomain()
-{
-}
-
-// Default implementations of socket() just returns an error
-
-Socket * SocketDomain::socket(int, short)
-{
-       GUSI_error(EOPNOTSUPP);
-
-       return nil;
-}
-
-// Same with socketpair
-
-int SocketDomain::socketpair(int, short, Socket **)
-{
-       return GUSI_error(EOPNOTSUPP);
-}
-
-
-int SocketDomain::choose(int, char *, void *, int, void *, int *)
-{
-       return GUSI_error(EOPNOTSUPP);
-}
-
-void SocketDomain::DontStrip()
-{
-}
-
-/*********************** SocketTable members ************************/
-
-static void FlushStdio()
-{
-       fwalk(fflush);
-}
-
-SocketTable::SocketTable()
-{
-       atexit(FlushStdio);
-       
-       needsConsole = true;
-}
-       
-int SocketTable::Install(Socket * sock, int start)
-{
-       short   fd;
-
-       if (start<0 || start >= GUSI_MAX_FD)
-               return GUSI_error(EINVAL);
-
-       for (fd=start; fd<GUSI_MAX_FD; ++fd)
-               if (!sockets[fd])       {
-                       sockets[fd] = sock;
-               
-                       ++sock->refCount;
-                       return fd;
-               }
-
-       return GUSI_error(EMFILE);
-}
-
-int SocketTable::Remove(int fd)
-{
-       Socket *        sock;
-
-       InitConsole();
-
-       if (fd<0 || fd >= GUSI_MAX_FD || !(sock = sockets[fd]))
-               return GUSI_error(EBADF);
-
-       sockets[fd]     =       nil;
-
-       if (!--sock->refCount)
-               delete sock;
-
-       return 0;
-}
-
-Socket * SocketTable::operator[](int fd)
-{
-       Socket * sock;
-
-       InitConsole();
-       
-       if (fd<0 || fd >= GUSI_MAX_FD || !(sock = sockets[fd])) {
-               GUSI_error(EBADF);
-
-               return nil;
-       } else
-               return sock;
-}
-
-#ifndef powerc
-#pragma far_code
-#endif
-
-SocketTable::~SocketTable()
-{
-       int i;
-
-       // Flush stdio files (necessary to flush buffers)
-
-       fwalk(fflush);
-
-       // If we didn't need a console so far, we certainly don't need one now!
-       // Doing this further up would be dangerous for small write only apps
-       
-       needsConsole = false;
-
-       // Now close stdio files, just to be sure
-
-       fwalk(fclose);
-
-       // Close all files
-
-       for (i = 0; i<GUSI_MAX_FD; ++i)
-               if (sockets[i])
-                       close(i);
-}
-
-#endif // GUSI_DISPATCH
-
-/********************** sleep()/alarm() ***********************/
-
-static long    GUSIAlarm = 0;
-
-int GUSICheckAlarm()
-{
-       if (GUSIAlarm && LMGetTicks() > GUSIAlarm) {
-               GUSIAlarm = 0;
-               raise(SIGALRM);
-               
-               return 1;
-       } else
-               return 0;
-}
-
-u_int   alarm(u_int seconds)
-{
-       long remaining = GUSIAlarm ? (LMGetTicks() - GUSIAlarm) / 60 : 0;
-       
-       GUSIAlarm = seconds ? LMGetTicks() + 60 * seconds : 0;
-       
-       return (remaining < 0) ? 0 : (u_int) remaining;
-}
-
-static u_int DoSleep(long ticks)
-{
-       long wakeup = LMGetTicks() + ticks;
-       
-       SAFESPIN(wakeup > LMGetTicks(), SP_SLEEP, wakeup - LMGetTicks());
-       
-       long remaining = (LMGetTicks() - wakeup) / 60;
-       
-       return (remaining < 0) ? 0 : (u_int) remaining;
-}
-
-u_int sleep(u_int seconds) 
-{
-       return DoSleep(seconds * 60);
-}
-
-void usleep(u_int useconds)
-{
-       DoSleep((useconds * 3) / 50000);
-}
-
-/********************** Default spin function ***********************/
-
-#ifndef GUSI_DISPATCH
-
-#ifndef powerc
-#pragma smart_code
-#endif
-
-/* Borrowed from tech note 263 */
-
-#define kMaskModifiers         0xFE00          // we need the modifiers without the
-                                               // command key for KeyTrans
-#define kMaskVirtualKey        0x0000FF00      // get virtual key from event message
-                                               // for KeyTrans
-#define kUpKeyMask             0x0080
-#define kShiftWord             8               // we shift the virtual key to mask it
-                                               // into the keyCode for KeyTrans
-#define kMaskASCII1            0x00FF0000      // get the key out of the ASCII1 byte
-#define kMaskASCII2            0x000000FF      // get the key out of the ASCII2 byte
-#define kPeriod                0x2E            // ascii for a period
-
-static Boolean CmdPeriod(EventRecord *theEvent)
-{
-       Boolean  fTimeToQuit;
-       short    keyCode;
-       long     virtualKey, keyInfo, lowChar, highChar, keyCId;
-       UInt32  state;
-       Handle   hKCHR;
-       Ptr             KCHRPtr;
-
-       fTimeToQuit = false;
-
-       if (((*theEvent).what == keyDown) || ((*theEvent).what == autoKey)) {
-
-               // see if the command key is down.  If it is, find out the ASCII
-               // equivalent for the accompanying key.
-
-               if ((*theEvent).modifiers & cmdKey ) {
-
-                       virtualKey = ((*theEvent).message & kMaskVirtualKey) >> kShiftWord;
-                       // And out the command key and Or in the virtualKey
-                       keyCode    = short(((*theEvent).modifiers & kMaskModifiers) | virtualKey);
-                       state      = 0;
-
-                       hKCHR = nil;  /* set this to nil before starting */
-                       KCHRPtr = (Ptr)GetScriptManagerVariable(smKCHRCache);
-
-                       if ( !KCHRPtr ) {
-                               keyCId = GetScriptVariable(short(GetScriptManagerVariable(smKeyScript)), smScriptKeys);
-
-                               hKCHR   = GetResource('KCHR',short(keyCId));
-                               KCHRPtr = *hKCHR;
-                       }
-
-                       if (KCHRPtr) {
-                               keyInfo = KeyTrans(KCHRPtr, keyCode, &state);
-                               if (hKCHR)
-                                       ReleaseResource(hKCHR);
-                       } else
-                               keyInfo = (*theEvent).message;
-
-                       lowChar =  keyInfo &  kMaskASCII2;
-                       highChar = (keyInfo & kMaskASCII1) >> 16;
-                       if (lowChar == kPeriod || highChar == kPeriod)
-                               fTimeToQuit = true;
-
-               }  // end the command key is down
-       }  // end key down event
-
-       return( fTimeToQuit );
-}
-
-Boolean GUSIInterrupt()
-{
-       EvQElPtr                eventQ;
-
-       for (eventQ = (EvQElPtr) LMGetEventQueue()->qHead; eventQ; )
-               if (CmdPeriod((EventRecord *) &eventQ->evtQWhat))
-                       return true;
-               else
-                       eventQ = (EvQElPtr)eventQ->qLink;
-       
-       return false;
-}
-
-int StandAlone = 1;
-long gGUSISpinControl = 0;
-
-int GUSIDefaultSpin(spin_msg msg, long arg)
-{
-       static Boolean                  inForeground    =       true;
-       WindowPtr                               win;
-       EventRecord                             ev;
-       long                                    sleepTime       =       6;      // 1/10 of a second by default
-       short                                   mask            =       osMask|highLevelEventMask|mDownMask|evtMask;
-
-       GUSIConfig.AutoInitGraf();
-       
-       if (inForeground) {
-               register long contrib = (msg == SP_AUTO_SPIN) ? arg : gGUSISpeed;
-               gGUSISpinControl += contrib;
-               // Tweak when a spin point has been overshot
-               RotateCursor((gGUSISpinControl & 31) < contrib ? 32 : gGUSISpinControl);
-       }
-
-       if (GUSIInterrupt())
-               goto interrupt;
-
-       if (!StandAlone && inForeground)                // For MPW tools, SpinCursor already calls WNE
-               if (!GUSIConfig.noAppleEvents)                  // but it no longer reports AppleEvents
-                       mask = highLevelEventMask|evtMask;
-               else
-                       return 0;                                                               
-               
-       switch (msg) {
-       case SP_SLEEP:
-       case SP_SELECT:
-               if (arg >= sleepTime)                           // Only sleep if patience guaranteed
-                       break;
-               // Otherwise, fall through      
-       case SP_AUTO_SPIN:
-               sleepTime = 0;
-               break;
-       default:
-               break;
-       }
-       
-       if (WaitNextEvent(mask, &ev, sleepTime, nil))
-               switch (ev.what) {
-               case mouseDown:
-                       if (!evtHandler || !evtHandler[mouseDown])
-                               if (FindWindow(ev.where, &win) == inSysWindow)
-                                       SystemClick(&ev, win);
-
-                       break;
-               case osEvt:
-                       if (ev.message & 1)
-                               inForeground    =       true;
-                       else
-                               inForeground    =       false;
-                       break;
-               case kHighLevelEvent:
-                       if (!evtHandler || !evtHandler[kHighLevelEvent])
-                               if (hasAppleEvents)                             // actually pretty likely, if we get HL Events
-                                       AEProcessAppleEvent(&ev);       // Ignore errors
-                       break;
-               default:
-                       break;
-               }
-
-       if (ev.what >= 0 && ev.what < 24 && evtHandler && evtHandler[ev.what])
-               evtHandler[ev.what](&ev);
-
-       return 0;
-
-interrupt:
-       FlushEvents(-1, 0);
-
-       return -1;
-}
-
-/************************** Feature members **************************/
-
-Feature::Feature(unsigned short trapNum, TrapType tTyp)
-{
-       good =
-               NGetTrapAddress(trapNum, tTyp) != NGetTrapAddress(_Unimplemented, ToolTrap);
-}
-
-Feature::Feature(OSType type, long value)
-{
-       long            attr;
-
-       good = (!Gestalt(type, &attr) && (attr >= value));
-}
-
-Feature::Feature(OSType type, long mask, long value)
-{
-       long            attr;
-
-       good = (!Gestalt(type, &attr) && ((attr & mask) == value));
-}
-
-Feature::Feature(const Feature & precondition, OSErrInitializer init)
-{
-       good    =       precondition && !init();
-}
-
-Feature::Feature(OSErrInitializer init)
-{
-       good    =       !init();
-}
-
-Feature::Feature(const Feature & precondition, voidInitializer init)
-{
-       if (precondition)       {
-               good = true;
-               init();
-       } else
-               good = false;
-}
-
-Feature::Feature(voidInitializer init)
-{
-       good = true;
-       init();
-}
-
-Feature::Feature(const Feature & cond1, const Feature & cond2)
-{
-       good = cond1 && cond2;
-}
-
-OSErr AppleTalkIdentity(short & net, short & node)
-{
-       static short    mynet;
-       static short    mynode;
-       static OSErr    err = 1;
-
-       if (err == 1)
-               if (!(err = MPPOpen()))
-                       err = GetNodeAddress(&mynode, &mynet);
-
-
-       net     =       mynet;
-       node    =       mynode;
-
-       return err;
-}
-
-/************************** Setup suppport **************************/
-
-/* Pray that the following function never inlines GUSISetup */
-
-void GUSIDefaultSetup()
-{
-       GUSISetup(GUSIwithAppleTalkSockets);
-       GUSISetup(GUSIwithInternetSockets);
-       GUSISetup(GUSIwithPAPSockets);
-       GUSISetup(GUSIwithPPCSockets);
-       GUSISetup(GUSIwithUnixSockets);
-       GUSISetup(GUSIwithSIOUXSockets);
-}
-
-void GUSISetup(void (*proc)())
-{
-       proc();
-}
-
-void GUSILoadConfiguration(Handle hdl)
-{
-       GUSIConfig.GUSILoadConfiguration(hdl);
-}
-
-#endif // GUSI_DISPATCH
diff --git a/Mac/Unsupported/GUSI1-mods/GUSINetDB.cp b/Mac/Unsupported/GUSI1-mods/GUSINetDB.cp
deleted file mode 100644 (file)
index 8b2140e..0000000
+++ /dev/null
@@ -1,582 +0,0 @@
-/*********************************************************************
-Project        :       GUSI                            -       Grand Unified Socket Interface
-File           :       GUSINetDB.cp    -       Convert internet names to adresses
-Author :       Matthias Neeracher
-
-       This file was derived from the socket library by
-
-               Charlie Reiman  <creiman@ncsa.uiuc.edu> and
-               Tom Milligan    <milligan@madhaus.utcs.utoronto.ca>
-
-Language       :       MPW C++
-
-$Log$
-Revision 1.1  2000/09/12 20:24:49  jack
-Moved to Unsupported.
-
-Revision 1.1  1998/08/18 14:52:38  jack
-Putting Python-specific GUSI modifications under CVS.
-
-Revision 1.3  1994/08/10  00:07:30  neeri
-Sanitized for universal headers.
-
-Revision 1.2  1994/05/01  23:43:31  neeri
-getservbyname() without /etc/services would fail.
-
-Revision 1.1  1994/02/25  02:29:36  neeri
-Initial revision
-
-Revision 0.5  1993/10/31  00:00:00  neeri
-Deferred opening of resolver
-
-Revision 0.4  1993/07/29  00:00:00  neeri
-Real getservent code (adapted from Sak Wathanasin)
-
-Revision 0.3  1993/01/19  00:00:00  neeri
-Can't set aliases to NULL.
-
-Revision 0.2  1992/11/21  00:00:00  neeri
-Remove force_active
-
-Revision 0.1  1992/09/14  00:00:00  neeri
-Maybe it works, maybe it doesn't
-
-*********************************************************************/
-
-#include "GUSIINET_P.h"
-
-#include "TFileSpec.h"
-#include "Folders.h"
-#include "PLStringFuncs.h"
-
-#ifdef __MWERKS__
-//
-// I disapprove of the way dnr.c is written
-// This disapproval gets stronger with every version
-//
-#include "dnr.c"
-#pragma require_prototypes reset
-#pragma cplusplus reset
-#endif
-
-#if GENERATING68K
-#pragma segment GUSIINET
-#endif
-
-static pascal void DNRDone(struct hostInfo *, Boolean * done)
-{
-       *done = true;
-}
-
-#if GENERATINGCFM
-RoutineDescriptor      uDNRDone = 
-               BUILD_ROUTINE_DESCRIPTOR(uppResultProcInfo, DNRDone);
-#else
-#define uDNRDone DNRDone
-#endif
-
-int h_errno;
-
-/*
- *   Gethostbyname and gethostbyaddr each return a pointer to an
- *   object with the following structure describing an Internet
- *   host referenced by name or by address, respectively. This
- *   structure contains the information obtained from the MacTCP
- *   name server.
- *
- *   struct    hostent
- *   {
- *        char *h_name;
- *        char **h_aliases;
- *        int  h_addrtype;
- *        int  h_length;
- *        char **h_addr_list;
- *   };
- *   #define   h_addr  h_addr_list[0]
- *
- *   The members of this structure are:
- *
- *   h_name       Official name of the host.
- *
- *   h_aliases    A zero terminated array of alternate names for the host.
- *
- *   h_addrtype   The type of address being  returned; always AF_INET.
- *
- *   h_length     The length, in bytes, of the address.
- *
- *   h_addr_list  A zero terminated array of network addresses for the host.
- *
- *   Error return status from gethostbyname and gethostbyaddr  is
- *   indicated by return of a null pointer.  The external integer
- *   h_errno may then  be checked  to  see  whether  this  is  a
- *   temporary  failure  or  an  invalid  or  unknown  host.  The
- *   routine herror  can  be  used  to  print  an error  message
- *   describing the failure.  If its argument string is non-NULL,
- *   it is printed, followed by a colon and a space.   The  error
- *   message is printed with a trailing newline.
- *
- *   h_errno can have the following values:
- *
- *     HOST_NOT_FOUND  No such host is known.
- *
- *     TRY_AGAIN       This is usually a temporary error and
- *                                     means   that  the  local  server  did  not
- *                                     receive a response from  an  authoritative
- *                                     server.   A  retry at some later time may
- *                                     succeed.
- *
- *     NO_RECOVERY     Some unexpected server failure was encountered.
- *                                     This is a non-recoverable error.
- *
- *     NO_DATA         The requested name is valid but  does  not
- *                                     have   an IP  address;  this  is not  a
- *                                     temporary error. This means that the  name
- *                                     is known  to the name server but there is
- *                                     no address  associated  with  this  name.
- *                                     Another type of request to the name server
- *                                     using this domain name will result in  an
- *                                     answer;  for example, a mail-forwarder may
- *                                     be registered for this domain.
- *                                     (NOT GENERATED BY THIS IMPLEMENTATION)
- */
-
-static struct hostInfo macHost;
-
-#define MAXALIASES 0
-static char *aliasPtrs[MAXALIASES+1] = {NULL};
-static ip_addr *addrPtrs[NUM_ALT_ADDRS+1];
-
-static struct hostent  unixHost =
-{
-       macHost.cname,
-       aliasPtrs,
-       AF_INET,
-       sizeof(ip_addr),
-       (char **) addrPtrs
-};
-
-inline struct in_addr make_in_addr(ip_addr addr)
-{
-       struct in_addr  res;
-
-       res.s_addr      =       addr;
-
-       return res;
-}
-
-struct hostent * gethostbyname(char *name)
-{
-       Boolean done;
-       int i;
-
-       if (!strcmp(name, "localhost")) {
-               in_addr ipaddr;
-
-               ipaddr  =       make_in_addr(ip_addr(gethostid()));
-
-               if (ipaddr.s_addr)
-                       return gethostbyaddr((char *) &ipaddr, sizeof(in_addr), AF_INET);
-
-               h_errno = HOST_NOT_FOUND;
-                       
-               return NULL;
-       }
-       
-       if (INETSockets.Resolver()) {
-               h_errno = NO_RECOVERY;  
-               return NULL;
-       }
-       
-       for (i=0; i<NUM_ALT_ADDRS; i++)
-               macHost.addr[i] = 0;
-
-       done = false;
-
-       if (StrToAddr(name, &macHost, ResultUPP(&uDNRDone), (char *) &done) == cacheFault)
-               SPINP(!done,SP_NAME,0L);
-
-       switch (macHost.rtnCode) {
-       case noErr: break;
-
-       case nameSyntaxErr:     h_errno = HOST_NOT_FOUND;       return(NULL);
-       case cacheFault:                h_errno = NO_RECOVERY;          return(NULL);
-       case noResultProc:      h_errno = NO_RECOVERY;          return(NULL);
-       case noNameServer:      h_errno = HOST_NOT_FOUND;       return(NULL);
-       case authNameErr:               h_errno = HOST_NOT_FOUND;       return(NULL);
-       case noAnsErr:                  h_errno = TRY_AGAIN;                    return(NULL);
-       case dnrErr:                    h_errno = NO_RECOVERY;          return(NULL);
-       case outOfMemory:               h_errno = TRY_AGAIN;                    return(NULL);
-       default:                                        h_errno = NO_RECOVERY;          return(NULL);
-       }
-
-       /* was the 'name' an IP address? */
-       if (macHost.cname[0] == 0) {
-               h_errno = HOST_NOT_FOUND;
-               return(NULL);
-       }
-
-       /* for some reason there is a dot at the end of the name */
-       i = int(strlen(macHost.cname)) - 1;
-       if (macHost.cname[i] == '.')
-               macHost.cname[i] = 0;
-
-       for (i=0; i<NUM_ALT_ADDRS && macHost.addr[i]!=0; i++)
-               addrPtrs[i] =   (ip_addr *) &macHost.addr[i];
-
-       addrPtrs[i] = NULL;
-
-       return &unixHost;
-}
-
-struct hostent * gethostbyaddr(const char *addrP, int, int)
-{
-       Boolean done;
-       int             i;
-
-       if (INETSockets.Resolver()) {
-               h_errno = NO_RECOVERY;  
-               return NULL;
-       }
-
-       for (i=0; i<NUM_ALT_ADDRS; i++)
-               macHost.addr[i] = 0;
-
-       done = false;
-
-       ip_addr addr = FIX_LOOPBACK(*(ip_addr *)addrP);
-       
-       if (AddrToName(addr, &macHost, ResultUPP(&uDNRDone), (char *) &done) == cacheFault)
-               SPINP(!done,SP_ADDR,0L);
-
-       switch (macHost.rtnCode) {
-       case noErr:                     break;
-
-       case cacheFault:                h_errno = NO_RECOVERY;          return(NULL);
-       case noNameServer:      h_errno = HOST_NOT_FOUND;       return(NULL);
-       case authNameErr:               h_errno = HOST_NOT_FOUND;       return(NULL);
-       case noAnsErr:                  h_errno = TRY_AGAIN;                    return(NULL);
-       case dnrErr:                    h_errno = NO_RECOVERY;          return(NULL);
-       case outOfMemory:               h_errno = TRY_AGAIN;                    return(NULL);
-       default:                                        h_errno = NO_RECOVERY;          return(NULL);
-       }
-
-       /* for some reason there is a dot at the end of the name */
-       i = int(strlen(macHost.cname)) - 1;
-       if (macHost.cname[i] == '.')
-               macHost.cname[i] = 0;
-
-       /* For some reason, the IP address usually seems to be set to 0 */
-       if (!macHost.addr[0])
-               macHost.addr[0] = addr;
-               
-       for (i=0; i<NUM_ALT_ADDRS; i++)
-               addrPtrs[i] = (ip_addr *) &macHost.addr[i];
-
-       addrPtrs[NUM_ALT_ADDRS] = NULL;
-
-       return &unixHost;
-}
-
-char * inet_ntoa(struct in_addr inaddr)
-{
-       if (INETSockets.Resolver()) {
-               h_errno = NO_RECOVERY;  
-               return NULL;
-       }
-       
-       (void) AddrToStr(inaddr.s_addr, macHost.cname);
-
-       return macHost.cname;
-}
-
-struct in_addr inet_addr(char *address)
-{
-       if (INETSockets.Resolver()) {
-               h_errno = NO_RECOVERY;  
-               return make_in_addr(0xFFFFFFFF);
-       }
-       
-       if (StrToAddr(address,&macHost,NULL,NULL) != noErr)
-               return make_in_addr(0xFFFFFFFF);
-
-       /* was the 'address' really a name? */
-       if (macHost.cname[0] != 0)
-               return make_in_addr(0xFFFFFFFF);
-
-       return make_in_addr(macHost.addr[0]);
-}
-
-/*
- * gethostid()
- *
- * Get internet address of current host
- */
-
-long gethostid()
-{
-       static long sHostID = 0;
-       if (sHostID)
-               return sHostID;
-       
-       struct GetAddrParamBlock pbr;
-               
-       pbr.ioCRefNum   = INETSockets.Driver();
-       pbr.csCode              = ipctlGetAddr;
-
-       if (PBControlSync(ParmBlkPtr(&pbr)))
-               return 0;
-       else
-               return sHostID = (long)pbr.ourAddress;
-}
-
-/*
- * gethostname()
- *
- * Try to get my host name from DNR. If it fails, just return my
- * IP address as ASCII. This is non-standard, but it's a mac,
- * what do you want me to do?
- */
-
-int gethostname(char *machname, int buflen)
-{
-       static char * sHostName = nil;
-       
-       if (!sHostName) {
-               in_addr ipaddr;
-               struct  hostent *hp;
-
-               ipaddr  =       make_in_addr(ip_addr(gethostid()));
-
-               if (!ipaddr.s_addr)                                     // TCP/IP not up at all
-                       return GUSI_error(ENETDOWN);
-               
-               hp = gethostbyaddr((char *) &ipaddr, sizeof(in_addr), AF_INET);
-
-               if (!hp) {
-                       // No good name
-                       if (buflen < 16)                                                // Not enough space
-                               return GUSI_error(EINVAL);      
-                       sprintf(machname, "%d.%d.%d.%d",
-                                                       ipaddr.s_addr>>24,
-                                                       ipaddr.s_addr>>16 & 0xff,
-                                                       ipaddr.s_addr>>8 & 0xff,
-                                                       ipaddr.s_addr & 0xff);
-                       return 0;
-               } else {
-                       // We only cache satisfactory replies in sHostName
-                       sHostName = new char[strlen(hp->h_name)+1];
-                       strcpy(sHostName, hp->h_name);
-               }
-       }
-       strncpy(machname, sHostName, unsigned(buflen));
-       machname[buflen-1] = 0;  /* extra safeguard */
-
-       return 0;
-}
-
-
-/*
- *     getservbybname()
- *
- */
-
-static char * servlist[] =
-{
-       "echo                     7/udp",
-       "discard          9/udp",
-       "time                    37/udp",
-       "domain          53/udp",
-       "sunrpc         111/udp",
-       "tftp            69/udp",
-       "biff                   512/udp",
-       "who            513/udp",
-       "talk                   517/udp",
-       "ftp-data        20/tcp",
-       "ftp             21/tcp",
-       "telnet          23/tcp",
-       "smtp            25/tcp",
-       "time            37/tcp",
-       "whois                   43/tcp",
-       "domain                  53/tcp",
-       "hostnames  101/tcp",
-       "nntp                   119/tcp",
-       "finger          79/tcp",
-       "ntp            123/tcp",
-       "uucp                   540/tcp",
-       NULL
-};
-
-static char                            servline[128];
-static struct servent  serv;
-static FILE *                          servfil;
-static int                                     servptr;
-static char *                          servalias[8];
-static int                                     servstay = 0;
-
-void setservent(int stayopen)
-{
-       if (servfil && servfil != (FILE *) -1) {
-               rewind(servfil);
-       }
-       servptr = 0;
-       servstay = servstay || stayopen;
-}
-
-void endservent()
-{
-       if (servfil && servfil != (FILE *) -1) {
-               fclose(servfil);
-               servfil = NULL;
-       }
-       
-       servstay = 0;
-}
-
-struct servent *  getservent()
-{
-       char *  p;
-       int             aliascount;
-       
-       if (!servfil) {
-               TFileSpec serv;
-               
-               if (!FindFolder(
-                               kOnSystemDisk, 
-                               kPreferencesFolderType, 
-                               kDontCreateFolder, 
-                               &serv.vRefNum,
-                               &serv.parID)
-               ) {
-                       PLstrcpy(serv.name, (StringPtr) "\p/etc/services");
-               
-                       if (servfil = fopen(serv.FullPath(), "r"))
-                               goto retry;
-               }       
-               servfil         = (FILE *) -1;
-               servptr = 0;
-       }
-       
-retry:
-       if (servfil == (FILE *) -1)
-               if (!servlist[servptr])
-                       return (struct servent *) NULL;
-               else
-                       strcpy(servline, servlist[servptr++]);
-       else if (!(fgets(servline, 128, servfil)))
-               return (struct servent *) NULL;
-               
-       if (p = strpbrk(servline, "#\n\r"))
-               *p = 0;
-       if (!servline[0])
-               goto retry;
-       
-       if (!(serv.s_name = strtok(servline, " \t")))
-               goto retry;
-               
-       if (!(p = strtok(NULL, " \t")))
-               goto retry;
-       
-       if (!(serv.s_proto = strpbrk(p, "/,")))
-               goto retry;
-               
-       *serv.s_proto++         = 0;
-       serv.s_port             = htons(atoi(p));
-       serv.s_aliases  = servalias;
-       
-       for (aliascount = 0; aliascount < 7; ) 
-               if (!(servalias[aliascount++] = strtok(NULL, " \t")))
-                       break;
-       
-       servalias[aliascount] = NULL;
-       
-       return &serv;
-}
-
-struct servent * getservbyname(const char * name, const char * proto)
-{
-       struct servent *        ent;
-       char **                                 al;
-       setservent(0);
-       
-       while (ent = getservent()) {
-               if (!strcmp(name, ent->s_name))
-                       goto haveName;
-               
-               for (al = ent->s_aliases; *al; ++al)
-                       if (!strcmp(name, *al))
-                               goto haveName;
-               
-               continue;
-haveName:
-               if (!proto || !strcmp(proto, ent->s_proto))
-                       break;
-       }
-       
-       if (!servstay)
-               endservent();
-       
-       return ent;
-}
-
-struct servent * getservbyport(int port, const char * proto)
-{
-       struct servent * ent;
-       
-       setservent(0);
-       
-       while (ent = getservent())
-               if (port == ent->s_port && (!proto || !strcmp(proto, ent->s_proto)))
-                       break;
-       
-       if (!servstay)
-               endservent();
-       
-       return ent;
-}
-
-static char    tcp[] = "tcp";
-static char    udp[] = "udp";
-#define        MAX_PROTOENT                    10
-static         struct protoent         protoents[MAX_PROTOENT];
-static         int                                             protoent_count=0;
-
-struct protoent * getprotobyname(const char * name)
-{
-       struct protoent *pe;
-
-       pe = &protoents[protoent_count];
-       if (strcmp(name, "udp") == 0) {
-               pe->p_name = udp;
-               pe->p_proto = IPPROTO_UDP;
-       } else if (strcmp (name, "tcp") == 0)  {
-               pe->p_name = tcp;
-               pe->p_proto = IPPROTO_TCP;
-       } else {
-               errno = EPROTONOSUPPORT;
-               return NULL;
-       }
-       pe->p_aliases = aliasPtrs;
-       protoent_count = (protoent_count +1) % MAX_PROTOENT;
-       return pe;
-}
-
-struct protoent * getprotobynumber(int proto)
-{
-       struct protoent *pe;
-
-       pe = &protoents[protoent_count];
-       if (proto == IPPROTO_UDP) {
-               pe->p_name = udp;
-               pe->p_proto = IPPROTO_UDP;
-       } else if (proto == IPPROTO_TCP)  {
-               pe->p_name = tcp;
-               pe->p_proto = IPPROTO_TCP;
-       } else {
-               errno = EPROTONOSUPPORT;
-               return NULL;
-       }
-       pe->p_aliases = aliasPtrs;
-       protoent_count = (protoent_count +1) % MAX_PROTOENT;
-       return pe;
-}
-
diff --git a/Mac/Unsupported/GUSI1-mods/GUSISIOUX.cp b/Mac/Unsupported/GUSI1-mods/GUSISIOUX.cp
deleted file mode 100644 (file)
index c8cfc65..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-/*********************************************************************
-Project        :       GUSI                            -       Grand unified socket interface
-File           :       GUSISIOUX.cp    -       Interface to Metrowerks SIOUX library
-Author :       Matthias Neeracher
-Language       :       MPW C/C++
-
-$Log$
-Revision 1.1  2000/09/12 20:24:49  jack
-Moved to Unsupported.
-
-Revision 1.1  1998/08/18 14:52:38  jack
-Putting Python-specific GUSI modifications under CVS.
-
-*********************************************************************/
-
-#include <GUSIFile_P.h>
-#include <ioctl.h>
-#include <console.h>
-
-#include <Events.h>
-#include <LowMem.h>
-
-/************************ SIOUXSocket members ************************/
-
-/* This declaration lies about the return type */
-extern "C" void SIOUXHandleOneEvent(EventRecord *userevent);
-
-GUSIEvtHandler GUSISIOUXEvents[]       =       {
-       SIOUXHandleOneEvent,            // nullEvent
-       
-       SIOUXHandleOneEvent,            // mouseDown
-       SIOUXHandleOneEvent,            // mouseUp
-       nil,                                                    // keyDown
-       nil,
-       
-       nil,                                                    // autoKey
-       SIOUXHandleOneEvent,            // updateEvt
-       SIOUXHandleOneEvent,            // diskEvt
-       SIOUXHandleOneEvent,            // activateEvt
-       
-       nil,
-       nil,
-       nil,
-       nil,
-       
-       nil,
-       nil,
-       SIOUXHandleOneEvent,            // osEvt
-       nil,
-       
-       nil,
-       nil,
-       nil,
-       nil,
-       
-       nil,
-       nil,
-       nil,
-};
-
-/************************ Declaration of SIOUXSocket ************************/
-
-class SIOUXSocket : public Socket      {               
-       friend class SIOUXSocketDomain; 
-       
-                                       SIOUXSocket();
-                                       
-       virtual                 ~SIOUXSocket();
-protected:
-       int                     initialized;
-       void                    DoInitialize(void);
-public:
-       virtual int     read(void * buffer, int buflen);
-       virtual int write(void * buffer, int buflen);
-       virtual int select(Boolean * canRead, Boolean * canWrite, Boolean * exception);
-       virtual int     ioctl(unsigned int request, void *argp);
-       virtual int     isatty();
-};     
-
-class SIOUXSocketDomain : public FileSocketDomain {
-       SIOUXSocket *   singleton;
-public:
-       SIOUXSocketDomain()     :       FileSocketDomain(AF_UNSPEC, true, false), singleton(nil)        {       }
-       
-       virtual Boolean Yours(const GUSIFileRef & ref, Request request);
-       virtual Socket * open(const GUSIFileRef & ref, int oflag);
-};
-
-#if GENERATING68K
-#pragma segment SIOUX
-#endif
-
-/************************ SIOUXSocket members ************************/
-
-void SIOUXSocket::DoInitialize()
-{
-       if ( initialized ) return;
-       initialized++;
-       InstallConsole(0);
-       GUSISetEvents(GUSISIOUXEvents);
-}
-
-SIOUXSocket::SIOUXSocket()
-{
-       initialized = 0;
-       if ( !GUSIConfig.DelayConsole() )
-               DoInitialize();
-}
-
-SIOUXSocket::~SIOUXSocket()
-{
-       RemoveConsole();
-}
-
-int SIOUXSocket::ioctl(unsigned int request, void *)
-{
-       if ( !initialized) DoInitialize();
-       switch (request)        {
-       case FIOINTERACTIVE:
-               return 0;
-       default:
-               return GUSI_error(EOPNOTSUPP);
-       }
-}
-
-int SIOUXSocket::read(void * buffer, int buflen)
-{
-       if ( !initialized) DoInitialize();
-       fflush(stdout);
-       
-       return ReadCharsFromConsole((char *) buffer, buflen);
-}
-
-int SIOUXSocket::write(void * buffer, int buflen)
-{
-       if ( !initialized) DoInitialize();
-       return WriteCharsToConsole((char *) buffer, buflen);
-}
-
-static Boolean input_pending()
-{
-       QHdrPtr eventQueue = LMGetEventQueue();
-       EvQElPtr element = (EvQElPtr)eventQueue->qHead;
-       
-       // now, count the number of pending keyDown events.
-       while (element != nil) {
-               if (element->evtQWhat == keyDown || element->evtQWhat == autoKey)
-                       return true;
-               element = (EvQElPtr)element->qLink;
-       }
-       
-       return false;
-}
-
-int SIOUXSocket::select(Boolean * canRead, Boolean * canWrite, Boolean * exception)
-{
-       int             goodies         =       0;
-               
-       if ( !initialized) DoInitialize();
-       fflush(stdout);
-       
-       if (canRead) 
-               if (*canRead = input_pending())
-                       ++goodies;
-       
-       if (canWrite) {
-               *canWrite = true;
-               ++goodies;
-       }
-       
-       if (exception)
-               *exception = false;
-       
-       return goodies;
-}
-
-int SIOUXSocket::isatty()
-{
-       return 1;
-}
-
-/********************* SIOUXSocketDomain members **********************/
-
-#ifdef MSLGUSI
-#ifndef SFIOGUSI
-       extern void GUSISetupMSLSIOUX();
-#endif
-#endif
-
-extern "C" void GUSIwithSIOUXSockets()
-{
-       static SIOUXSocketDomain        SIOUXSockets;
-       SIOUXSockets.DontStrip();
-#ifdef MSLGUSI
-#ifndef SFIOGUSI
-       GUSISetupMSLSIOUX();
-#endif
-#endif
-}
-
-Boolean SIOUXSocketDomain::Yours(const GUSIFileRef & ref, FileSocketDomain::Request request)
-{
-       if (ref.spec || (request != willOpen && request != willStat))
-               return false;
-       
-       switch (ref.name[4] | 0x20) {
-       case 's':
-               if ((ref.name[5] | 0x20) != 't' || (ref.name[6] | 0x20) != 'd')
-                       return false;
-               switch (ref.name[7] | 0x20) {
-               case 'i':
-                       if ((ref.name[8] | 0x20) != 'n' || ref.name[9])
-                               return false;
-                       return true;
-               case 'o':
-                       if ((ref.name[8] | 0x20) != 'u' || (ref.name[9] | 0x20) != 't' || ref.name[10])
-                               return false;
-                       return true;
-               case 'e':
-                       if ((ref.name[8] | 0x20) != 'r' || (ref.name[9] | 0x20) != 'r' || ref.name[10])
-                               return false;
-                       return true;
-               default:
-                       return false;
-               }
-       case 'c':
-               if (    (ref.name[5] | 0x20) != 'o' || (ref.name[6] | 0x20) != 'n'
-                       || (ref.name[7] | 0x20) != 's' || (ref.name[8] | 0x20) != 'o'
-                       || (ref.name[9] | 0x20) != 'l' || (ref.name[10] | 0x20) != 'e')
-                       return false;
-               switch (ref.name[11]) {
-               case 0:
-                       return true;
-               default:
-                       return false;
-               }
-       default:
-               return false;
-       }
-}
-
-Socket * SIOUXSocketDomain::open(const GUSIFileRef &, int)
-{
-       if (!singleton)
-               singleton = new SIOUXSocket();
-       ++*singleton;
-       
-       return singleton;
-}
diff --git a/Mac/Unsupported/GUSI1-mods/GUSI_P.h b/Mac/Unsupported/GUSI1-mods/GUSI_P.h
deleted file mode 100644 (file)
index 66ee3a7..0000000
+++ /dev/null
@@ -1,474 +0,0 @@
-/*********************************************************************
-Project        :       GUSI                            -       Grand Unified Socket Interface
-File           :       GUSI_P.h                        -       Private stuff
-Author :       Matthias Neeracher
-Language       :       MPW C/C++
-
-$Log$
-Revision 1.1  2000/09/12 20:24:46  jack
-Moved to Unsupported.
-
-Revision 1.1  1998/08/18 14:52:33  jack
-Putting Python-specific GUSI modifications under CVS.
-
-Revision 1.3  1994/12/31  01:30:26  neeri
-Reorganize filename dispatching.
-
-Revision 1.2  1994/08/10  00:41:05  neeri
-Sanitized for universal headers.
-
-Revision 1.1  1994/02/25  02:57:01  neeri
-Initial revision
-
-Revision 0.22  1993/07/17  00:00:00  neeri
-GUSIRingBuffer::proc -> defproc
-
-Revision 0.21  1993/07/17  00:00:00  neeri
-GUSIO_MAX_DOMAIN -> AF_MAX
-
-Revision 0.20  1993/06/27  00:00:00  neeri
-Socket::{pre,post}_select
-
-Revision 0.19  1993/06/27  00:00:00  neeri
-Socket::ftruncate
-
-Revision 0.18  1993/02/09  00:00:00  neeri
-Socket::lurking, Socket::lurkdescr
-
-Revision 0.17  1993/01/31  00:00:00  neeri
-GUSIConfiguration::daemon
-
-Revision 0.16  1993/01/17  00:00:00  neeri
-Destructors for Socketdomain
-
-Revision 0.15  1993/01/17  00:00:00  neeri
-SAFESPIN
-
-Revision 0.14  1993/01/03  00:00:00  neeri
-GUSIConfig
-
-Revision 0.13  1992/09/24  00:00:00  neeri
-Include GUSIRsrc_P.h
-
-Revision 0.12  1992/09/13  00:00:00  neeri
-SPINVOID didn't return
-
-Revision 0.11  1992/08/30  00:00:00  neeri
-AppleTalkIdentity()
-
-Revision 0.10  1992/08/03  00:00:00  neeri
-RingBuffer
-
-Revision 0.9  1992/07/30  00:00:00  neeri
-Initializer Features
-
-Revision 0.8  1992/07/26  00:00:00  neeri
-UnixSockets.choose()
-
-Revision 0.7  1992/07/13  00:00:00  neeri
-Make AppleTalkSockets global
-
-Revision 0.6  1992/06/27  00:00:00  neeri
-choose(), hasNewSF
-
-Revision 0.5  1992/06/07  00:00:00  neeri
-Feature
-
-Revision 0.4  1992/05/21  00:00:00  neeri
-Implemented select()
-
-Revision 0.3  1992/04/19  00:00:00  neeri
-C++ rewrite
-
-Revision 0.2  1992/04/18  00:00:00  neeri
-changed read/write/send/recv dispatchers
-
-Revision 0.1  1992/04/18  00:00:00  neeri
-ppc Domain
-
-*********************************************************************/
-
-#ifndef __GUSI_P__
-#define __GUSI_P__
-
-#define __useAppleExts__
-
-#include <GUSI.h>
-#include <GUSIRsrc_P.h>
-#include <TFileSpec.h>
-
-
-#include <sys/errno.h>
-#include <sys/uio.h>
-#include <sys/socket.h>
-
-extern "C" {
-
-#include <stdio.h>
-#include <string.h>
-
-int            GUSI_error(int err);
-void * GUSI_error_nil(int err);
-}
-
-#include <Memory.h>
-#include <Gestalt.h>
-#include <Traps.h>
-#include <AppleEvents.h>
-#include <Processes.h>
-#include <MixedMode.h>
-
-#if MSLGUSI
-using namespace std;
-#endif
-
-#if GENERATING68K
-#pragma segment GUSI
-#endif
-
-#define GUSI_MAX_DOMAIN                        AF_MAX
-#define DEFAULT_BUFFER_SIZE    4096
-
-/*
- *     In use and shutdown status.
- */
-#define        SOCK_STATUS_USED                0x1             /* Used socket table entry */
-#define        SOCK_STATUS_NOREAD      0x2             /* No more reading allowed from socket */
-#define        SOCK_STATUS_NOWRITE     0x4             /* No more writing allowed to socket */
-
-/*
- *     Socket connection states.
- */
-#define        SOCK_STATE_NO_STREAM            0       /* Socket doesn't have a MacTCP stream yet */
-#define        SOCK_STATE_UNCONNECTED  1       /* Socket is unconnected. */
-#define        SOCK_STATE_LISTENING            2       /* Socket is listening for connection. */
-#define        SOCK_STATE_LIS_CON              3       /* Socket is in transition from listen to connected. */
-#define        SOCK_STATE_CONNECTING   4       /* Socket is initiating a connection. */
-#define        SOCK_STATE_CONNECTED            5       /* Socket is connected. */
-#define        SOCK_STATE_CLOSING      6       /* Socket is closing */
-#define        SOCK_STATE_LIS_CLOSE    7       /* Socket closed while listening */
-
-#define                min(a,b)                                ( (a) < (b) ? (a) : (b))
-#define                max(a,b)                                ( (a) > (b) ? (a) : (b))
-
-extern GUSISpinFn GUSISpin;
-extern "C" int GUSIDefaultSpin(spin_msg, long);
-extern int GUSICheckAlarm();
-
-#define GUSI_INTERRUPT(mesg,param)     (GUSICheckAlarm() || (GUSISpin && (*GUSISpin)(mesg,param)))
-
-/* SPIN returns a -1 on user cancel for fn returning integers */
-#define                SPIN(cond,mesg,param)                                                   \
-                                       do {                                                                                            \
-                                               if (GUSI_INTERRUPT(mesg,param))         \
-                                                       return GUSI_error(EINTR);                       \
-                                       } while(cond)
-
-/* SPINP returns a NULL on user cancel, for fn returning pointers */                           
-#define                SPINP(cond,mesg,param)                                                  \
-                                       do {                                                                                            \
-                                               if (GUSI_INTERRUPT(mesg,param)) {       \
-                                                       GUSI_error(EINTR);                                      \
-                                                       return NULL;                                                    \
-                                               }                                                                                               \
-                                       } while(cond)
-
-/* SPINVOID just returns on user cancel, for fn returning void */                              
-#define                SPINVOID(cond,mesg,param)                                               \
-                                       do {                                                                                            \
-                                               if (GUSI_INTERRUPT(mesg,param)) {       \
-                                                               GUSI_error(EINTR);                              \
-                                                               return;                                                         \
-                                                       }                                                                                       \
-                                       } while(cond)
-                                       
-/* SAFESPIN doesn't return, you have to check errno */                         
-#define                SAFESPIN(cond,mesg,param)                                               \
-                                       do {                                                                                            \
-                                               if (GUSI_INTERRUPT(mesg,param)) {       \
-                                                       GUSI_error(EINTR);                                      \
-                                                       break;                                                                  \
-                                               } else                                                                          \
-                                                       errno = 0;                                                              \
-                                       } while(cond)
-
-//
-// Library functions are never allowed to clear errno, so we have to save
-//
-class ErrnoSaver {
-public:
-       ErrnoSaver()  { fSavedErrno = ::errno; ::errno = 0;     }
-       ~ErrnoSaver() { if (!::errno) ::errno = fSavedErrno;  }
-private:
-       int fSavedErrno;
-};
-
-#define SAVE_AND_CLEAR_ERRNO   ErrnoSaver saveErrno
-                       
-class SocketTable;
-
-#if PRAGMA_ALIGN_SUPPORTED
-#pragma options align=mac68k
-#endif
-
-class Socket {
-       friend class SocketTable;
-       
-       short                   refCount;
-protected:
-                                       Socket();
-public:
-       virtual int     bind(void * name, int namelen);
-       virtual int connect(void * address, int addrlen);
-       virtual int listen(int qlen);
-       virtual Socket * accept(void * address, int * addrlen);
-       virtual int     read(void * buffer, int buflen);
-       virtual int write(void * buffer, int buflen);
-       virtual int recvfrom(void * buffer, int buflen, int flags, void * from, int * fromlen);
-       virtual int sendto(void * buffer, int buflen, int flags, void * to, int tolen);
-       virtual int getsockname(void * name, int * namelen);
-       virtual int getpeername(void * name, int * namelen);
-       virtual int getsockopt(int level, int optname, void *optval, int * optlen);
-       virtual int setsockopt(int level, int optname, void *optval, int optlen);
-       virtual int     fcntl(unsigned int cmd, int arg);
-       virtual int     ioctl(unsigned int request, void *argp);
-       virtual int     fstat(struct stat * buf);
-       virtual long lseek(long offset, int whence);
-       virtual int ftruncate(long offset);
-       virtual int     isatty();
-       virtual int shutdown(int how);
-       virtual void pre_select(Boolean wantRead, Boolean wantWrite, Boolean wantExcept);
-       virtual int select(Boolean * canRead, Boolean * canWrite, Boolean * exception);
-       virtual void post_select(Boolean wantRead, Boolean wantWrite, Boolean wantExcept);
-       virtual                 ~Socket();
-       
-       void operator++()       {       ++refCount;                                                     }
-       void operator--()       {       if (!--refCount) delete this;   }
-};
-
-
-#if PRAGMA_ALIGN_SUPPORTED
-#pragma options align=reset
-#endif
-
-class SocketDomain {
-       static SocketDomain *           domains[GUSI_MAX_DOMAIN];
-       static ProcessSerialNumber      process;
-protected:
-       SocketDomain(int domain);
-       virtual ~SocketDomain();
-public:
-       inline static SocketDomain *    Domain(int domain);
-       static void Ready();
-       
-       // Optionally override the following
-       
-       virtual Socket * socket(int type, short protocol);
-       
-       // Optionally override the following
-       
-       virtual int socketpair(int type, short protocol, Socket * sockets[]);
-       
-       // Optionally define the following
-       
-       virtual int choose(
-                                               int             type, 
-                                               char *  prompt, 
-                                               void *  constraint,             
-                                               int             flags,
-                                               void *  name, 
-                                               int *   namelen);
-       
-       // Never override the following
-       
-       void DontStrip();
-};
-
-class SocketTable {
-       Socket *        sockets[GUSI_MAX_FD];
-       Boolean needsConsole;
-public:
-       SocketTable();
-       ~SocketTable();
-       
-       void            InitConsole();
-       int             Install(Socket * sock, int start = 0);
-       int             Remove(int fd);
-       Socket * operator[](int fd);
-};
-
-struct GUSISuffix {
-       char            suffix[4];
-       OSType  suffType;
-       OSType  suffCreator;
-};
-
-#if PRAGMA_ALIGN_SUPPORTED
-#pragma options align=mac68k
-#endif
-
-//
-// I learned the hard way not to rely on bit field alignments
-//
-
-struct GUSIConfigRsrc {
-       OSType                  defaultType;
-       OSType                  defaultCreator;
-       
-       char                            autoSpin;
-       unsigned char   flags;
-       
-       OSType                  version;
-       short                           numSuffices;
-       GUSISuffix              suffices[1];
-};
-
-#if PRAGMA_ALIGN_SUPPORTED
-#pragma options align=reset
-#endif
-
-struct GUSIConfiguration {
-       OSType                  defaultType;
-       OSType                  defaultCreator;
-       
-       char                            autoSpin;
-       
-       Boolean                 noChdir;                // Set current directory without chdir()
-       Boolean                         accurStat;      // Return # of subdirectories + 2 in st_nlink
-       Boolean                 hasConsole;     // Do we have our own console ?
-       Boolean                 noAutoInitGraf; // Never automatically do InitGraf
-       Boolean                 sharedOpen;     // Open files with shared permissions
-       Boolean                 sigPipe;                // raise SIGPIPE on write to closed socket
-       Boolean                 noAppleEvents; // Don't solicit AppleEvents for MPW tools
-       Boolean                 delayConsole;   // Do not open console until needed
-       
-       OSType                  version;
-       short                           numSuffices;
-       GUSISuffix *    suffices;
-       
-       GUSIConfiguration();
-       void GUSILoadConfiguration(Handle config);
-       
-       void SetDefaultFType(const TFileSpec & name) const;
-       void DoAutoSpin() const;
-       void AutoInitGraf()     const { if (!noAutoInitGraf) DoAutoInitGraf();  }
-       void DoAutoInitGraf() const;
-       Boolean DelayConsole() const;
-private:
-       static Boolean firstTime;
-       static short    we;
-};
-
-extern GUSIConfiguration       GUSIConfig;
-extern SocketTable                                     Sockets;
-
-typedef pascal OSErr (*OSErrInitializer)();
-typedef pascal void  (*voidInitializer)();
-
-class Feature {
-       Boolean good;
-public:
-       Feature(unsigned short trapNum, TrapType tTyp);
-       Feature(OSType type, long value);
-       Feature(OSType type, long mask, long value);
-       Feature(const Feature & precondition, OSErrInitializer init);
-       Feature(OSErrInitializer init);
-       Feature(const Feature & precondition, voidInitializer init);
-       Feature(voidInitializer init);
-       Feature(const Feature & cond1, const Feature & cond2);
-
-       operator void*() const {        return (void *) good;   }
-};
-
-extern Feature hasMakeFSSpec;
-extern Feature hasAlias;
-extern Feature hasNewSF;
-extern Feature hasProcessMgr;
-extern Feature hasCRM;
-extern Feature hasCTB;
-extern Feature hasStdNBP;
-extern Feature hasCM;
-extern Feature hasFT;
-extern Feature hasTM;
-extern Feature hasPPC;
-extern Feature hasRevisedTimeMgr;
-
-class ScattGath        {
-       Handle                  scratch;
-protected:
-       void *                  buf;
-       int                                             len;
-       int                                             count;
-       const struct iovec *    io;
-
-       ScattGath(const struct iovec *iov, int cnt);
-       virtual ~ScattGath();
-public:
-       void *                  buffer()                        {       return buf;                     }
-       int                             buflen()                        {       return len;                     }
-       int                             length(int l)   {       return len = l; }
-       operator void *()                                       {       return buf;                     }
-};
-
-class Scatterer : public ScattGath {
-public:
-       Scatterer(const struct iovec *iov, int count);
-       virtual ~Scatterer();
-};
-
-class Gatherer : public ScattGath {
-public:
-       Gatherer(const struct iovec *iov, int count);
-       virtual ~Gatherer();
-};
-
-typedef pascal void (*Deferred)(void *);
-
-class RingBuffer {
-       // Valid bytes are between consume and produce
-       // Free bytes are between produce and consume
-       // bytes between endbuf-spare and endbuf are neither
-       Ptr             buffer;
-       Ptr             endbuf;
-       Ptr             consume;
-       Ptr             produce;
-       u_short free;
-       u_short valid;
-       u_short spare;
-       Boolean lock;
-       Deferred        defproc;
-       void *  arg;
-       
-public:
-                               RingBuffer(u_short bufsiz);
-                               ~RingBuffer();
-       
-       Ptr             Producer(long & len);                   //      Find continuous memory for producer
-       Ptr             Consumer(long & len);                   //      Find continuous memory for consumer
-       void            Validate(long len);                             // Validate this, unallocate rest
-       void            Invalidate(long len);
-       void            Produce(Ptr from, long & len);//        Allocate, copy & validate
-       void            Consume(Ptr to, long & len);    // Copy & invalidate
-       
-       long            Free()                                                          { return free;                                                                  }               
-       long            Valid()                                                         { return valid;                                                         }
-       
-       void            Defer()                                                         { lock = true;                                                                  }
-       void            Undefer()                                                       { lock = false; if (defproc) defproc(arg);}
-       Boolean Locked()                                                                { return lock;                                                                  }
-       void            Later(Deferred def, void * ar){ defproc = def; arg = ar;                                        }
-       
-       operator void *()                                                               { return buffer;                                                                }
-};
-
-Boolean GUSIInterrupt();
-
-Boolean CopyIconFamily(short srcResFile, short srcID, short dstResFile, short dstID);
-
-pascal OSErr PPCInit_P();
-
-OSErr AppleTalkIdentity(short & net, short & node);
-
-void CopyC2PStr(const char * cstr, StringPtr pstr);
-
-#endif
diff --git a/Mac/Unsupported/mactcp/MACTCPconst.py b/Mac/Unsupported/mactcp/MACTCPconst.py
deleted file mode 100644 (file)
index 47b9d68..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# MACTCP - event codes for the mactcp module
-#
-
-# UDP asr event codes
-UDPDataArrival=1               # A datagram has arrived
-UDPICMPReceived=2              # An ICMP error was received
-
-# TCP asr event codes
-TCPClosing=1                   # All incoming data has been received and read.
-TCPULPTimeout=2                        # No response from remote process.
-TCPTerminate=3                 # Connection terminated. Has a detail parameter.
-TCPDataArrival=4               # Data has arrived (and no Rcv call is outstanding)
-TCPUrgent=5                            # Urgent data is outstanding
-TCPICMPReceived=6              # An ICMP error was received
-PassiveOpenDone=32766  # (python only) a PassiveOpen has completed.
-
-# TCP termination reasons
-TCPRemoteAbort=2
-TCPNetworkFailure=3
-TCPSecPrecMismatch=4
-TCPULPTimeoutTerminate=5
-TCPULPAbort=6
-TCPULPClose=7
-TCPServiceError=8
-
-# MacTCP/DNR errors
-ipBadLapErr =                  -23000                  # bad network configuration 
-ipBadCnfgErr =                         -23001                  # bad IP configuration error 
-ipNoCnfgErr =                  -23002                  # missing IP or LAP configuration error 
-ipLoadErr =                    -23003                  # error in MacTCP load 
-ipBadAddr =                    -23004                  # error in getting address 
-connectionClosing =    -23005                  # connection is closing 
-invalidLength =                -23006
-connectionExists =             -23007                  # request conflicts with existing connection 
-connectionDoesntExist =        -23008                  # connection does not exist 
-insufficientResources =        -23009                  # insufficient resources to perform request 
-invalidStreamPtr =             -23010
-streamAlreadyOpen =    -23011
-connectionTerminated =         -23012
-invalidBufPtr =                -23013
-invalidRDS =                   -23014
-invalidWDS =                   -23014
-openFailed =                   -23015
-commandTimeout =               -23016
-duplicateSocket =              -23017
-
-# Error codes from internal IP functions 
-ipDontFragErr =                -23032                  # Packet too large to send w/o fragmenting 
-ipDestDeadErr =                -23033                  # destination not responding
-icmpEchoTimeoutErr =   -23035                  # ICMP echo timed-out 
-ipNoFragMemErr =               -23036                  # no memory to send fragmented pkt 
-ipRouteErr =                   -23037                  # can't route packet off-net 
-
-nameSyntaxErr =                -23041          
-cacheFault =                   -23042
-noResultProc =                         -23043
-noNameServer =                         -23044
-authNameErr =                  -23045
-noAnsErr =                             -23046
-dnrErr =                               -23047
-outOfMemory =                  -23048
diff --git a/Mac/Unsupported/mactcp/MacTCPerrors.py b/Mac/Unsupported/mactcp/MacTCPerrors.py
deleted file mode 100644 (file)
index 3f6e72b..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-ipBadLapErr =                  -23000                  # bad network configuration 
-ipBadCnfgErr =                         -23001                  # bad IP configuration error 
-ipNoCnfgErr =                  -23002                  # missing IP or LAP configuration error 
-ipLoadErr =                    -23003                  # error in MacTCP load 
-ipBadAddr =                    -23004                  # error in getting address 
-connectionClosing =    -23005                  # connection is closing 
-invalidLength =                -23006
-connectionExists =             -23007                  # request conflicts with existing connection 
-connectionDoesntExist =        -23008                  # connection does not exist 
-insufficientResources =        -23009                  # insufficient resources to perform request 
-invalidStreamPtr =             -23010
-streamAlreadyOpen =    -23011
-connectionTerminated =         -23012
-invalidBufPtr =                -23013
-invalidRDS =                   -23014
-invalidWDS =                   -23014
-openFailed =                   -23015
-commandTimeout =               -23016
-duplicateSocket =              -23017
-
-# Error codes from internal IP functions 
-ipDontFragErr =                -23032                  # Packet too large to send w/o fragmenting 
-ipDestDeadErr =                -23033                  # destination not responding
-icmpEchoTimeoutErr =   -23035                  # ICMP echo timed-out 
-ipNoFragMemErr =               -23036                  # no memory to send fragmented pkt 
-ipRouteErr =                   -23037                  # can't route packet off-net 
-
-nameSyntaxErr =                -23041          
-cacheFault =                   -23042
-noResultProc =                         -23043
-noNameServer =                         -23044
-authNameErr =                  -23045
-noAnsErr =                             -23046
-dnrErr =                               -23047
-outOfMemory =                  -23048
diff --git a/Mac/Unsupported/mactcp/macdnrmodule.c b/Mac/Unsupported/mactcp/macdnrmodule.c
deleted file mode 100644 (file)
index fe89e03..0000000
+++ /dev/null
@@ -1,459 +0,0 @@
-/***********************************************************
-Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
-The Netherlands.
-
-                        All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its 
-documentation for any purpose and without fee is hereby granted, 
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in 
-supporting documentation, and that the names of Stichting Mathematisch
-Centrum or CWI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-******************************************************************/
-
-#include "allobjects.h"
-#include "modsupport.h"                /* For getargs() etc. */
-
-#include "macglue.h"
-#include <AddressXlation.h>
-#include <Desk.h>
-
-#ifndef HAVE_UNIVERSAL_HEADERS
-#define ResultUPP ResultProcPtr
-#define NewResultProc(x) (x)
-#define ResultProc2UPP ResultProc2Ptr
-#define NewResultProc2Proc(x) (x)
-#endif
-
-static object *ErrorObject;
-
-/* ----------------------------------------------------- */
-/* Declarations for objects of type MacTCP DNR Result */
-
-/* Types of records we have */
-#define DNR_ADDR 0
-#define DNR_HINFO 1
-#define DNR_MX 2
-
-typedef struct {
-       OB_HEAD
-       int type;               /* DNR_XXX */
-       int waiting;    /* True while completion proc not called */
-       struct returnRec hinfo;
-} dnrrobject;
-
-staticforward typeobject Dnrrtype;
-
-#define is_dnrrobject(v)               ((v)->ob_type == &Dnrrtype)
-
-/* ---------------------------------------------------------------- */
-
-static pascal void
-dnrr_done(rrp, udp)
-       struct hostInfo *rrp;   /* Unused */
-       dnrrobject *udp;
-{
-       if ( !udp->waiting ) {
-               printf("macdnr: dnrr_done: spurious completion call!\n");
-               return;
-       }
-       udp->waiting = 0;
-       DECREF(udp);
-}
-
-static int dnrwait(self)
-       dnrrobject *self;
-{
-       while ( self->waiting ) {
-               if ( PyMac_Idle() )
-                       return 0;
-       }
-       return 1;
-}
-
-static object *
-dnrr_wait(self, args)
-       dnrrobject *self;
-       object *args;
-{
-       if (!newgetargs(args, ""))
-               return NULL;
-       if ( !dnrwait(self) ) {
-               /* XXX An interrupt is pending -- is this correct? */
-               INCREF(None);
-               return None;
-       }
-       if ( self->hinfo.rtnCode ) {
-               PyErr_Mac(ErrorObject, self->hinfo.rtnCode);
-               return NULL;
-       }
-       INCREF(None);
-       return None;
-}
-
-static object *
-dnrr_isdone(self, args)
-       dnrrobject *self;
-       object *args;
-{
-       if (!newgetargs(args, ""))
-               return NULL;
-       return newintobject(!self->waiting);
-}
-
-static struct methodlist dnrr_methods[] = {
-       {"wait",        (method)dnrr_wait,      1},
-       {"isdone",      (method)dnrr_isdone,    1},
-       {NULL,          NULL}           /* sentinel */
-};
-
-/* ---------- */
-
-static dnrrobject *
-newdnrrobject(tp)
-       int tp;
-{
-       dnrrobject *self;
-       
-       self = NEWOBJ(dnrrobject, &Dnrrtype);
-       if (self == NULL)
-               return NULL;
-       self->type = tp;
-       self->waiting = 0;
-       memset(&self->hinfo, 0, sizeof(self->hinfo));
-       return self;
-}
-
-static void
-dnrr_dealloc(self)
-       dnrrobject *self;
-{
-       self->waiting = 0;  /* Not really needed, since we incref for completion */
-       DEL(self);
-}
-
-/* Code to access structure members by accessing attributes */
-
-#include "structmember.h"
-
-#define OFF(x) offsetof(struct returnRec, x)
-
-static struct memberlist dnrr_memberlist_addr[] = {
-       { "rtnCode", T_INT, OFF(rtnCode), RO},
-       { "cname", T_STRING_INPLACE, OFF(cname), RO},
-       { "ip0", T_UINT, OFF(rdata.addr[0]), RO},
-       { "ip1", T_UINT, OFF(rdata.addr[1]), RO},
-       { "ip2", T_UINT, OFF(rdata.addr[2]), RO},
-       { "ip3", T_UINT, OFF(rdata.addr[3]), RO},
-       {NULL}  /* Sentinel */
-};
-
-static struct memberlist dnrr_memberlist_hinfo[] = {
-       { "rtnCode", T_INT, OFF(rtnCode), RO},
-       { "cname", T_STRING_INPLACE, OFF(cname), RO},
-       { "cpuType", T_STRING_INPLACE, OFF(rdata.hinfo.cpuType), RO},
-       { "osType", T_STRING_INPLACE, OFF(rdata.hinfo.osType), RO},
-       {NULL}  /* Sentinel */
-};
-
-static struct memberlist dnrr_memberlist_mx[] = {
-       { "rtnCode", T_INT, OFF(rtnCode), RO},
-       { "cname", T_STRING_INPLACE, OFF(cname), RO},
-       { "preference", T_USHORT, OFF(rdata.mx.preference), RO},
-       { "exchange", T_STRING_INPLACE, OFF(rdata.mx.exchange), RO},
-       {NULL}  /* Sentinel */
-};
-
-static struct memberlist *dnrr_mlists[3] = {
-       dnrr_memberlist_addr,
-       dnrr_memberlist_hinfo,
-       dnrr_memberlist_mx
-};
-
-static object *
-dnrr_getattr(self, name)
-       dnrrobject *self;
-       char *name;
-{
-       object *rv;
-       int tp;
-       
-       rv = findmethod(dnrr_methods, (object *)self, name);
-       if ( rv ) return rv;
-       err_clear();
-       if ( self->waiting )
-               if ( !dnrwait(self) ) {
-                       /* XXX An interrupt is pending -- is this correct? */
-                       err_setstr(ErrorObject, "Resolver busy");
-                       return NULL;
-               }
-       tp = self->type;
-       return getmember((char *)&self->hinfo, dnrr_mlists[tp], name);
-}
-
-
-static typeobject Dnrrtype = {
-       OB_HEAD_INIT(&Typetype)
-       0,                              /*ob_size*/
-       "MacTCP DNR Result",                    /*tp_name*/
-       sizeof(dnrrobject),             /*tp_basicsize*/
-       0,                              /*tp_itemsize*/
-       /* methods */
-       (destructor)dnrr_dealloc,       /*tp_dealloc*/
-       (printfunc)0,           /*tp_print*/
-       (getattrfunc)dnrr_getattr,      /*tp_getattr*/
-       (setattrfunc)0, /*tp_setattr*/
-       (cmpfunc)0,             /*tp_compare*/
-       (reprfunc)0,            /*tp_repr*/
-       0,                      /*tp_as_number*/
-       0,              /*tp_as_sequence*/
-       0,              /*tp_as_mapping*/
-       (hashfunc)0,            /*tp_hash*/
-};
-
-/* End of code for MacTCP DNR Result objects */
-/* -------------------------------------------------------- */
-
-int dnr_is_open;
-
-static int
-opendnr(fn)
-       char *fn;
-{
-       OSErr err;
-       
-       if ( dnr_is_open ) return 1;
-       if ( (err=OpenResolver(fn)) ) {
-               PyErr_Mac(ErrorObject, err);
-               return 0;
-       }
-       dnr_is_open = 1;
-       return 1;
-}
-       
-static object *
-dnr_Open(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       char *fn = NULL;
-
-       if (!newgetargs(args, "|s", &fn))
-               return NULL;
-       if ( dnr_is_open ) {
-               err_setstr(ErrorObject, "DNR already open");
-               return NULL;
-       }
-       if ( !opendnr(fn) )
-               return NULL;
-       INCREF(None);
-       return None;
-}
-
-static object *
-dnr_Close(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-
-       if (!newgetargs(args, ""))
-               return NULL;
-       dnr_is_open = 0;
-       if ( (err=CloseResolver()) ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       INCREF(None);
-       return None;
-}
-
-static object *
-dnr_StrToAddr(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       char *hostname;
-       dnrrobject *rv;
-       ResultUPP cb_upp = NewResultProc(dnrr_done);
-
-       if (!newgetargs(args, "s", &hostname))
-               return NULL;
-       if ( !opendnr(NULL) )
-               return NULL;
-       if ( (rv=newdnrrobject(DNR_ADDR)) == NULL )
-               return NULL;
-       err = StrToAddr(hostname, (struct hostInfo *)&rv->hinfo, cb_upp, (char *)rv);
-       if ( err == cacheFault ) {
-               rv->waiting++;
-               INCREF(rv);
-       } else if ( err ) {
-               DECREF(rv);
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       return (object *)rv;
-}
-
-static object *
-dnr_AddrToName(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       unsigned long ipaddr;
-       dnrrobject *rv;
-       ResultUPP cb_upp = NewResultProc(dnrr_done);
-
-       if (!newgetargs(args, "l", &ipaddr))
-               return NULL;
-       if ( !opendnr(NULL) )
-               return NULL;
-       if ( (rv=newdnrrobject(DNR_ADDR)) == NULL )
-               return NULL;
-       err = AddrToName(ipaddr, (struct hostInfo *)&rv->hinfo, cb_upp, (char *)rv);
-       if ( err == cacheFault ) {
-               rv->waiting++;
-               INCREF(rv);
-       } else if ( err ) {
-               DECREF(rv);
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       return (object *)rv;
-}
-
-static object *
-dnr_AddrToStr(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       unsigned long ipaddr;
-       char ipname[16];
-
-       if (!newgetargs(args, "l", &ipaddr))
-               return NULL;
-       if ( !opendnr(NULL) )
-               return NULL;
-       if ( (err=AddrToStr(ipaddr, ipname)) ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       return newstringobject(ipname);
-}
-
-static object *
-dnr_HInfo(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       char *hostname;
-       dnrrobject *rv;
-       ResultProc2UPP cb_upp = NewResultProc2Proc(dnrr_done);
-
-       if (!newgetargs(args, "s", &hostname))
-               return NULL;
-       if ( !opendnr(NULL) )
-               return NULL;
-       if ( (rv=newdnrrobject(DNR_HINFO)) == NULL )
-               return NULL;
-       err = HInfo(hostname, &rv->hinfo, cb_upp, (char *)rv);
-       if ( err == cacheFault ) {
-               rv->waiting++;
-               INCREF(rv);
-       } else if ( err ) {
-               DECREF(rv);
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       return (object *)rv;
-
-       if (!newgetargs(args, ""))
-               return NULL;
-       INCREF(None);
-       return None;
-}
-
-static object *
-dnr_MXInfo(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       char *hostname;
-       dnrrobject *rv;
-       ResultProc2UPP cb_upp = NewResultProc2Proc(dnrr_done);
-
-       if (!newgetargs(args, "s", &hostname))
-               return NULL;
-       if ( !opendnr(NULL) )
-               return NULL;
-       if ( (rv=newdnrrobject(DNR_MX)) == NULL )
-               return NULL;
-       err = MXInfo(hostname, &rv->hinfo, cb_upp, (char *)rv);
-       if ( err == cacheFault ) {
-               rv->waiting++;
-               INCREF(rv);
-       } else if ( err ) {
-               DECREF(rv);
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       return (object *)rv;
-}
-
-/* List of methods defined in the module */
-
-static struct methodlist dnr_methods[] = {
-       {"Open",        dnr_Open,       1},
-       {"Close",       dnr_Close,      1},
-       {"StrToAddr",   dnr_StrToAddr,  1},
-       {"AddrToStr",   dnr_AddrToStr,  1},
-       {"AddrToName",  dnr_AddrToName, 1},
-       {"HInfo",       dnr_HInfo,      1},
-       {"MXInfo",      dnr_MXInfo,     1},
-       {NULL,          NULL}           /* sentinel */
-};
-
-
-/* Initialization function for the module (*must* be called initmacdnr) */
-
-void
-initmacdnr()
-{
-       object *m, *d;
-
-       /* Create the module and add the functions */
-       m = initmodule("macdnr", dnr_methods);
-
-       /* Add some symbolic constants to the module */
-       d = getmoduledict(m);
-       ErrorObject = newstringobject("macdnr.error");
-       dictinsert(d, "error", ErrorObject);
-#if 0
-/* Not needed, after all */
-#define CONST(name, value) o = newintobject(value); dictinsert(d, name, o);
-       CONST("ADDR", DNR_ADDR);
-       CONST("HINFO", DNR_HINFO);
-       CONST("MX", DNR_MX);
-#endif
-       /* Check for errors */
-       if (err_occurred())
-               fatal("can't initialize module macdnr");
-}
diff --git a/Mac/Unsupported/mactcp/mactcpmodule.c b/Mac/Unsupported/mactcp/mactcpmodule.c
deleted file mode 100644 (file)
index fc07f1e..0000000
+++ /dev/null
@@ -1,990 +0,0 @@
-/***********************************************************
-Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
-Amsterdam, The Netherlands.
-
-                        All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its 
-documentation for any purpose and without fee is hereby granted, 
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in 
-supporting documentation, and that the names of Stichting Mathematisch
-Centrum or CWI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-******************************************************************/
-
-#include "allobjects.h"
-#include "modsupport.h"                /* For getargs() etc. */
-
-#include "macglue.h"
-#include "tcpglue.h"
-
-#include <Desk.h>
-
-/* State of a tcp stream, in the connectionState field */
-#define STATE_CLOSED   0
-#define STATE_LISTEN   2
-#define STATE_ESTAB            8
-#define STATE_CWAIT            18
-
-/* Python code has an additional reason for asr call: open done */
-#define MY_OPEN_DONE   32766
-
-static object *ErrorObject;
-
-TCPIOCompletionUPP     upp_tcp_done;
-TCPNotifyUPP           upp_tcp_asr;
-#if 0
-UDPIOCompletionUPP     upp_udp_done;
-#endif
-UDPNotifyUPP           upp_udp_asr;
-
-/* ----------------------------------------------------- */
-/* Declarations for objects of type MacTCP connection status */
-
-typedef struct {
-       OB_HEAD
-       TCPStatusPB status;
-} tcpcsobject;
-
-staticforward typeobject Tcpcstype;
-
-#define is_tcpcsobject(v)              ((v)->ob_type == &Tcpcstype)
-
-/* ---------------------------------------------------------------- */
-/* Declarations for objects of type MacTCP global status */
-
-#ifdef TCP_GS
-typedef struct {
-       OB_HEAD
-       TCPParam *ptr;
-} tcpgsobject;
-
-staticforward typeobject Tcpgstype;
-
-#define is_tcpgsobject(v)              ((v)->ob_type == &Tcpgstype)
-#endif /* TCP_GS */
-
-/* ---------------------------------------------------------------- */
-/* Declarations for objects of type MacTCP TCP stream */
-
-typedef struct {
-       OB_HEAD
-       TCPiopb iop;
-       long localhost;                 /* Our IP address */
-       short localport;                /* Our port number */
-       object *asr;                    /* Optional async notification routine */
-       int asr_ec;                             /* error code parameter to asr */
-       int asr_reason;                 /* detail for some errors */
-       int async_busy;                 /* True when completion routine pending */
-       int async_err;                  /* the error for the async call */
-} tcpsobject;
-
-staticforward typeobject Tcpstype;
-
-#define is_tcpsobject(v)               ((v)->ob_type == &Tcpstype)
-
-/* ---------------------------------------------------------------- */
-/* Declarations for objects of type MacTCP UDP stream */
-
-typedef struct {
-       OB_HEAD
-       UDPiopb iop;
-       object *asr;
-       int asr_ec;                             /* error code parameter to asr */
-       ip_port port;
-} udpsobject;
-
-staticforward typeobject Udpstype;
-
-#define is_udpsobject(v)               ((v)->ob_type == &Udpstype)
-
-/* ---------------------------------------------------------------- */
-
-static tcpcsobject *
-newtcpcsobject(ptr)
-       TCPStatusPB *ptr;
-{
-       tcpcsobject *self;
-       
-       self = NEWOBJ(tcpcsobject, &Tcpcstype);
-       if (self == NULL)
-               return NULL;
-       self->status = *ptr;
-       return self;
-}
-
-static void
-tcpcs_dealloc(self)
-       tcpcsobject *self;
-{
-       DEL(self);
-}
-/* Code to access structure members by accessing attributes */
-
-#include "structmember.h"
-
-#define OFF(x) offsetof(TCPStatusPB, x)
-
-static struct memberlist tcpcs_memberlist[] = {
-       {"remoteHost",          T_ULONG,        OFF(remoteHost),                RO},
-       {"remotePort",          T_USHORT,       OFF(remotePort),                RO},
-       {"localHost",           T_UINT,         OFF(localHost),                 RO},
-       {"localPort",           T_USHORT,       OFF(localPort),                 RO},
-       {"tosFlags",            T_BYTE,         OFF(tosFlags),                  RO},
-#if 0  /* Bug in header file: cannot access precedence */
-       {"precedence"           T_BYTE,         OFF(precedence),                RO},
-#endif
-       {"connectionState", T_BYTE,     OFF(connectionState),   RO},
-       {"sendWindow",          T_USHORT,       OFF(sendWindow),                RO},
-       {"rcvWindow",           T_USHORT,       OFF(rcvWindow),                 RO},
-       {"amtUnackedData",      T_USHORT,       OFF(amtUnackedData),    RO},
-       {"amtUnreadData",       T_USHORT,       OFF(amtUnreadData),     RO},
-       {"sendUnacked",         T_UINT,         OFF(sendUnacked),               RO},
-       {"sendNext",            T_UINT,         OFF(sendNext),                  RO},
-       {"congestionWindow", T_UINT,    OFF(congestionWindow),  RO},
-       {"rcvNext",             T_UINT,         OFF(rcvNext),                   RO},
-       {"srtt",                        T_UINT,         OFF(srtt),                              RO},
-       {"lastRTT",                     T_UINT,         OFF(lastRTT),                   RO},
-       {"sendMaxSegSize",      T_UINT,         OFF(sendMaxSegSize),    RO},
-       {NULL}  /* Sentinel */
-};
-
-static object *
-tcpcs_getattr(self, name)
-       tcpcsobject *self;
-       char *name;
-{
-       return getmember((char *)&self->status, tcpcs_memberlist, name);
-}
-
-
-static typeobject Tcpcstype = {
-       OB_HEAD_INIT(&Typetype)
-       0,                                                      /*ob_size*/
-       "MacTCP connection status",     /*tp_name*/
-       sizeof(tcpcsobject),            /*tp_basicsize*/
-       0,                                                      /*tp_itemsize*/
-       /* methods */
-       (destructor)tcpcs_dealloc,      /*tp_dealloc*/
-       (printfunc)0,                           /*tp_print*/
-       (getattrfunc)tcpcs_getattr,     /*tp_getattr*/
-       (setattrfunc)0,                         /*tp_setattr*/
-       (cmpfunc)0,                                     /*tp_compare*/
-       (reprfunc)0,                            /*tp_repr*/
-       0,                                                      /*tp_as_number*/
-       0,                                                      /*tp_as_sequence*/
-       0,                                                      /*tp_as_mapping*/
-       (hashfunc)0,                            /*tp_hash*/
-};
-
-/* End of code for MacTCP connection status objects */
-/* -------------------------------------------------------- */
-
-#ifdef TCP_GS
-static tcpgsobject *
-newtcpgsobject(ptr)
-       TCPParam *ptr;
-{
-       tcpgsobject *self;
-       
-       self = NEWOBJ(tcpgsobject, &Tcpgstype);
-       if (self == NULL)
-               return NULL;
-       self->ptr = ptr;
-       return self;
-}
-
-static void
-tcpgs_dealloc(self)
-       tcpgsobject *self;
-{
-       DEL(self);
-}
-/* Code to access structure members by accessing attributes */
-#undef OFF
-#define OFF(x) offsetof(TCPParam, x)
-
-static struct memberlist tcpgs_memberlist[] = {
-       {"RtoA",                T_UINT, OFF(tcpRtoA),           RO},
-       {"RtoMin",              T_UINT, OFF(tcpRtoMin),         RO},
-       {"RtoMax",              T_UINT, OFF(tcpRtoMax),         RO},
-       {"MaxSegSize",  T_UINT, OFF(tcpMaxSegSize),     RO},
-       {"MaxConn",             T_UINT, OFF(tcpMaxConn),        RO},
-       {"MaxWindow",   T_UINT, OFF(tcpMaxWindow),      RO},
-       {NULL}  /* Sentinel */
-};
-
-static object *
-tcpgs_getattr(self, name)
-       tcpgsobject *self;
-       char *name;
-{
-       object *rv;
-       
-       return getmember((char *)self->ptr, tcpgs_memberlist, name);
-}
-
-static typeobject Tcpgstype = {
-       OB_HEAD_INIT(&Typetype)
-       0,                              /*ob_size*/
-       "MacTCP global status",                 /*tp_name*/
-       sizeof(tcpgsobject),            /*tp_basicsize*/
-       0,                              /*tp_itemsize*/
-       /* methods */
-       (destructor)tcpgs_dealloc,      /*tp_dealloc*/
-       (printfunc)0,           /*tp_print*/
-       (getattrfunc)tcpgs_getattr,     /*tp_getattr*/
-       (setattrfunc)0, /*tp_setattr*/
-       (cmpfunc)0,             /*tp_compare*/
-       (reprfunc)0,            /*tp_repr*/
-       0,                      /*tp_as_number*/
-       0,              /*tp_as_sequence*/
-       0,              /*tp_as_mapping*/
-       (hashfunc)0,            /*tp_hash*/
-};
-#endif /* TCP_GS */
-
-/* End of code for MacTCP global status objects */
-/* -------------------------------------------------------- */
-
-static int
-tcps_checkstate(self, state, state2)
-       tcpsobject *self;
-       int state, state2;
-{
-       OSErr err;
-       TCPStatusPB *pb;
-       char buf[80];
-       
-       if ( self->async_busy ) {
-               err_setstr(ErrorObject, "Operation not allowed, PassiveOpen in progress");
-               return -1;
-       }
-       if ( state < 0 && state2 < 0 )
-               return 0;
-       err = xTCPStatus(&self->iop, &pb);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               return -1;
-       }
-       if ( state == pb->connectionState ||
-                state2 == pb->connectionState )
-                return 0;
-       sprintf(buf, "Operation not allowed, connection state=%d", pb->connectionState);
-       err_setstr(ErrorObject, buf);
-       return -1;
-}
-
-static int
-tcps_asr_safe(arg)
-       void *arg;
-{
-       tcpsobject *self = (tcpsobject *)arg;
-       object *args, *rv;
-       
-       if ( self->asr == None )
-               return 0;
-       args = mkvalue("(ii)", self->asr_ec, self->asr_reason);
-       rv = call_object(self->asr, args);
-       DECREF(args);
-       if ( rv ) {
-               DECREF(rv);
-               return 0;
-       }
-       return -1;
-}
-
-static pascal void
-tcps_asr(str, ec, self, reason, icmp)
-       StreamPtr str;
-       unsigned short ec;
-       tcpsobject *self;
-       unsigned short reason;
-       struct ICMPReport icmp;
-{
-       if ( self->asr == None )
-               return;
-       self->asr_ec = ec;
-       self->asr_reason = reason;
-       Py_AddPendingCall(tcps_asr_safe, (void *)self);
-}
-
-static void
-tcps_done(pb)
-       TCPiopb *pb;
-{
-       tcpsobject *self = (tcpsobject *)pb->csParam.open.userDataPtr;
-       
-       if ( pb != &self->iop || !self->async_busy ) {
-               /* Oops... problems */
-               printf("tcps_done: unexpected call\n");
-               return;
-       }
-       self->async_busy = 0;
-       self->async_err = pb->ioResult;
-       /* Extension of mactcp semantics: also call asr on open complete */
-       if ( self->asr == None )
-               return;
-       self->asr_ec = MY_OPEN_DONE;
-       self->asr_reason = 0;
-       Py_AddPendingCall(tcps_asr_safe, (void *)self);
-}
-
-static object *
-tcps_isdone(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       if (!newgetargs(args, ""))
-               return NULL;
-       return newintobject(!self->async_busy);
-}
-
-static object *
-tcps_wait(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       if (!newgetargs(args, ""))
-               return NULL;
-       while ( self->async_busy ) {
-               if ( PyMac_Idle() ) {
-                       INCREF(None);
-                       return None;
-               }
-       }
-       if ( self->async_err ) {
-               PyErr_Mac(ErrorObject, self->async_err);
-               self->async_err = 0;
-               return NULL;
-       }
-       INCREF(None);
-       return None;
-}
-
-
-static object *
-tcps_PassiveOpen(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       short port;
-       OSErr err;
-       
-       if (!newgetargs(args, "h", &port))
-               return NULL;
-       if ( tcps_checkstate(self, -1, -1) < 0 )
-               return NULL;
-       self->async_busy = 1;
-       self->async_err = 0;
-       err = xTCPPassiveOpen(&self->iop, port, upp_tcp_done,
-                                                (void *)self);
-       if ( err ) {
-               self->async_busy = 0;
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       self->localhost = self->iop.csParam.open.localHost;
-       self->localport = self->iop.csParam.open.localPort;
-       INCREF(None);
-       return None;
-}
-
-static object *
-tcps_ActiveOpen(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       short lport, rport;
-       long rhost;
-       OSErr err;
-       
-       if (!newgetargs(args, "hlh", &lport, &rhost, &rport))
-               return NULL;
-       if ( tcps_checkstate(self, -1, -1) < 0 )
-               return NULL;
-       err = xTCPActiveOpen(&self->iop, lport, rhost, rport, (TCPIOCompletionUPP)0);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }       
-       self->localhost = self->iop.csParam.open.localHost;
-       self->localport = self->iop.csParam.open.localPort;
-       INCREF(None);
-       return None;
-}
-
-static object *
-tcps_Send(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       char *buf;
-       int bufsize;
-       int push = 0, urgent = 0;
-       OSErr err;
-       miniwds wds;
-       
-       if (!newgetargs(args, "s#|ii", &buf, &bufsize, &push, &urgent))
-               return NULL;
-       if ( tcps_checkstate(self, STATE_ESTAB, STATE_CWAIT) < 0 )
-               return NULL;
-       wds.length = bufsize;
-       wds.ptr = buf;
-       wds.terminus = 0;
-       err = xTCPSend(&self->iop, (wdsEntry *)&wds, (Boolean)push, (Boolean)urgent,
-                                       (TCPIOCompletionUPP)0);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       INCREF(None);
-       return None;
-}
-
-static object *
-tcps_Rcv(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       int timeout;
-       rdsEntry rds[2];
-       OSErr err;
-       object *rv;
-       int urgent, mark;
-       
-       if (!newgetargs(args, "i", &timeout))
-               return NULL;
-       if ( tcps_checkstate(self, -1, -1) < 0 )
-               return NULL;
-       memset((char *)&rds, 0, sizeof(rds));
-       err = xTCPNoCopyRcv(&self->iop, rds, 1, timeout, (TCPIOCompletionUPP)0);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       urgent = self->iop.csParam.receive.urgentFlag;
-       mark = self->iop.csParam.receive.markFlag;
-       rv = newsizedstringobject((char *)rds[0].ptr, rds[0].length);
-       err = xTCPBufReturn(&self->iop, rds, (TCPIOCompletionUPP)0);
-       if ( err ) {
-               /* Should not happen */printf("mactcp module: BufReturn failed?\n");
-               PyErr_Mac(ErrorObject, err);
-               DECREF(rv);
-               return NULL;
-       }
-       return mkvalue("(Oii)", rv, urgent, mark);
-}
-
-static object *
-tcps_Close(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       OSErr err;
-       
-       if (!newgetargs(args, ""))
-               return NULL;
-       err = xTCPClose(&self->iop, (TCPIOCompletionUPP)0);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       INCREF(None);
-       return None;
-}
-
-static object *
-tcps_Abort(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       OSErr err;
-       
-       if (!newgetargs(args, ""))
-               return NULL;
-       err = xTCPAbort(&self->iop);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       INCREF(None);
-       return None;
-}
-
-static object *
-tcps_Status(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       OSErr err;
-       TCPStatusPB *pb;
-       
-       if (!newgetargs(args, ""))
-               return NULL;
-       if ( tcps_checkstate(self, -1, -1) < 0 )
-               return NULL;
-       err = xTCPStatus(&self->iop, &pb);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       return (object *)newtcpcsobject(pb);
-}
-
-static object *
-tcps_GetSockName(self, args)
-       tcpsobject *self;
-       object *args;
-{
-       /* This routine is needed so we can get at the local port even when
-       ** a PassiveOpen is in progress (when we can't do a Status call).
-       ** This is needed for socket listen(); getsockname(); accept() emulation
-       ** as used by ftp and the like.
-       */      
-       if (!newgetargs(args, ""))
-               return NULL;
-       return mkvalue("(lh)", self->localhost, self->localport);
-}
-
-static struct methodlist tcps_methods[] = {
-       {"isdone",      (method)tcps_isdone,    1},
-       {"wait",        (method)tcps_wait,              1},
-       {"PassiveOpen", (method)tcps_PassiveOpen,       1},
-       {"ActiveOpen",  (method)tcps_ActiveOpen,        1},
-       {"Send",        (method)tcps_Send,      1},
-       {"Rcv", (method)tcps_Rcv,       1},
-       {"Close",       (method)tcps_Close,     1},
-       {"Abort",       (method)tcps_Abort,     1},
-       {"Status",      (method)tcps_Status,    1},
-       {"GetSockName", (method)tcps_GetSockName, 1},
-       {NULL,          NULL}           /* sentinel */
-};
-
-/* ---------- */
-
-static object *
-tcps_getattr(self, name)
-       tcpsobject *self;
-       char *name;
-{
-       if ( strcmp(name, "asr") == 0 ) {
-               INCREF(self->asr);
-               return self->asr;
-       }
-       return findmethod(tcps_methods, (object *)self, name);
-}
-
-static int
-tcps_setattr(self, name, value)
-       tcpsobject *self;
-       char *name;
-       object *value;
-{
-       if ( strcmp(name, "asr") != 0 || value == NULL )
-               return -1;
-       self->asr = value;      /* XXXX Assuming I don't have to incref */
-       return 0;
-}
-
-static tcpsobject *
-newtcpsobject(bufsize)
-       int bufsize;
-{
-       tcpsobject *self;
-       OSErr err;
-       
-       self = NEWOBJ(tcpsobject, &Tcpstype);
-       if (self == NULL)
-               return NULL;
-       memset((char *)&self->iop, 0, sizeof(self->iop));
-       err= xTCPCreate(bufsize, upp_tcp_asr, (void *)self, &self->iop);
-       if ( err ) {
-               DEL(self);
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       INCREF(None);
-       self->localhost = 0;
-       self->localport = 0;
-       self->asr = None;
-       self->async_busy = 0;
-       self->async_err = 0;
-       return self;
-}
-
-static void
-tcps_dealloc(self)
-       tcpsobject *self;
-{
-       if ( self->async_busy ) {
-               printf("mactcp module: error: dealloc with async busy\n");
-               return;
-       }
-       xTCPRelease(&self->iop);
-       DEL(self);
-}
-
-static typeobject Tcpstype = {
-       OB_HEAD_INIT(&Typetype)
-       0,                                                      /*ob_size*/
-       "MacTCP TCP stream",            /*tp_name*/
-       sizeof(tcpsobject),                     /*tp_basicsize*/
-       0,                                                      /*tp_itemsize*/
-       /* methods */
-       (destructor)tcps_dealloc,       /*tp_dealloc*/
-       (printfunc)0,                           /*tp_print*/
-       (getattrfunc)tcps_getattr,      /*tp_getattr*/
-       (setattrfunc)tcps_setattr,      /*tp_setattr*/
-       (cmpfunc)0,                                     /*tp_compare*/
-       (reprfunc)0,                            /*tp_repr*/
-       0,                                                      /*tp_as_number*/
-       0,                                                      /*tp_as_sequence*/
-       0,                                                      /*tp_as_mapping*/
-       (hashfunc)0,                            /*tp_hash*/
-};
-
-/* End of code for MacTCP TCP stream objects */
-/* -------------------------------------------------------- */
-
-static int
-udps_asr_safe(arg)
-       void *arg;
-{
-       udpsobject *self = (udpsobject *)arg;
-       object *args, *rv;
-       
-       if ( self->asr == None )
-               return 0;
-       args = mkvalue("(i)", self->asr_ec);
-       rv = call_object(self->asr, args);
-       DECREF(args);
-       if ( rv ) {
-               DECREF(rv);
-               return 0;
-       }
-       return -1;
-}
-
-static pascal void
-udps_asr(str, ec, self, icmp)
-       StreamPtr str;
-       unsigned short ec;
-       udpsobject *self;
-       struct ICMPReport icmp;
-{
-       if ( self->asr == None )
-               return;
-       self->asr_ec = ec;
-       Py_AddPendingCall(udps_asr_safe, (void *)self);
-}
-
-
-static object *
-udps_Read(self, args)
-       udpsobject *self;
-       object *args;
-{
-       OSErr err;
-       object *rv;
-       int timeout;
-       
-       if (!newgetargs(args, "i", &timeout))
-               return NULL;
-       err = xUDPRead(&self->iop, timeout, (UDPIOCompletionUPP)0);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       rv = newsizedstringobject((char *)self->iop.csParam.receive.rcvBuff,
-                                                               self->iop.csParam.receive.rcvBuffLen);
-       err = xUDPBfrReturn(&self->iop, self->iop.csParam.receive.rcvBuff);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               DECREF(rv);
-               return NULL;
-       }
-       return rv;
-}
-
-static object *
-udps_Write(self, args)
-       udpsobject *self;
-       object *args;
-{
-       unsigned long host;
-       unsigned short port;
-       char *buf;
-       int bufsize;
-       OSErr err;
-       miniwds wds;
-       
-       if (!newgetargs(args, "lhs#", &host, &port, &buf, &bufsize))
-               return NULL;
-       wds.length = bufsize;
-       wds.ptr = buf;
-       wds.terminus = 0;
-       err = xUDPWrite(&self->iop, host, port, &wds, (UDPIOCompletionUPP)0);
-       if ( err ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       INCREF(None);
-       return None;
-}
-static struct methodlist udps_methods[] = {
-       {"Read",        (method)udps_Read,      1},
-       {"Write",       (method)udps_Write,     1},
-       {NULL,          NULL}           /* sentinel */
-};
-
-/* ---------- */
-
-static object *
-udps_getattr(self, name)
-       udpsobject *self;
-       char *name;
-{
-       if ( strcmp(name, "asr") == 0 ) {
-               INCREF(self->asr);
-               return self->asr;
-       }
-       if ( strcmp(name, "port") == 0 ) 
-               return newintobject((int)self->port);
-       return findmethod(udps_methods, (object *)self, name);
-}
-
-static int
-udps_setattr(self, name, value)
-       udpsobject *self;
-       char *name;
-       object *value;
-{
-       if ( strcmp(name, "asr") != 0 || value == NULL )
-               return -1;
-       self->asr = value;      /* XXXX Assuming I don't have to incref */
-       return 0;
-}
-
-static udpsobject *
-newudpsobject(bufsize, port)
-       int bufsize;
-       int port;
-{
-       udpsobject *self;
-       OSErr err;
-       
-       self = NEWOBJ(udpsobject, &Udpstype);
-       if (self == NULL)
-               return NULL;
-       memset((char *)&self->iop, 0, sizeof(self->iop));
-       self->port = port;
-       err= xUDPCreate(&self->iop, bufsize, &self->port, upp_udp_asr,
-                                        (void *)self);
-       if ( err ) {
-               DEL(self);
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       INCREF(None);
-       self->asr = None;
-       return self;
-}
-
-static void
-udps_dealloc(self)
-       udpsobject *self;
-{
-       xUDPRelease(&self->iop);
-       DEL(self);
-}
-
-static typeobject Udpstype = {
-       OB_HEAD_INIT(&Typetype)
-       0,                                                      /*ob_size*/
-       "MacTCP UDP stream",            /*tp_name*/
-       sizeof(udpsobject),                     /*tp_basicsize*/
-       0,                                                      /*tp_itemsize*/
-       /* methods */
-       (destructor)udps_dealloc,       /*tp_dealloc*/
-       (printfunc)0,                           /*tp_print*/
-       (getattrfunc)udps_getattr,      /*tp_getattr*/
-       (setattrfunc)udps_setattr,      /*tp_setattr*/
-       (cmpfunc)0,                                     /*tp_compare*/
-       (reprfunc)0,                            /*tp_repr*/
-       0,                                                      /*tp_as_number*/
-       0,                                                      /*tp_as_sequence*/
-       0,                                                      /*tp_as_mapping*/
-       (hashfunc)0,                            /*tp_hash*/
-};
-
-/* End of code for MacTCP UDP stream objects */
-/* -------------------------------------------------------- */
-
-static object *
-mactcp_TCPCreate(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       object *rv;
-       int bufsize;
-
-       if (!newgetargs(args, "i", &bufsize))
-               return NULL;
-       if ( (err = xOpenDriver()) != noErr ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       rv = (object *)newtcpsobject(bufsize);
-       return rv;
-}
-
-static object *
-mactcp_UDPCreate(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       object *rv;
-       int bufsize, port;
-
-       if (!newgetargs(args, "ii", &bufsize, &port))
-               return NULL;
-       if ( (err = xOpenDriver()) != noErr ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       rv = (object *)newudpsobject(bufsize, port);
-       return rv;
-}
-
-static object *
-mactcp_MTU(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       unsigned short mtu;
-
-       if (!newgetargs(args, ""))
-               return NULL;
-       if ( (err = xOpenDriver()) != noErr ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       mtu = xMaxMTU();
-       return newintobject((int)mtu);
-}
-
-static object *
-mactcp_IPAddr(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       unsigned long rv;
-
-       if (!newgetargs(args, ""))
-               return NULL;
-       if ( (err = xOpenDriver()) != noErr ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       rv = xIPAddr();
-       return newintobject((int)rv);
-}
-
-static object *
-mactcp_NetMask(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-       unsigned long rv;
-
-       if (!newgetargs(args, ""))
-               return NULL;
-       if ( (err = xOpenDriver()) != noErr ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       rv = xNetMask();
-       return newintobject((int)rv);
-}
-
-#ifdef TCP_GS
-static object *
-mactcp_GlobalInfo(self, args)
-       object *self;   /* Not used */
-       object *args;
-{
-       OSErr err;
-
-       if (!newgetargs(args, ""))
-               return NULL;
-       if ( (err = xOpenDriver()) != noErr ) {
-               PyErr_Mac(ErrorObject, err);
-               return NULL;
-       }
-       /* XXXX Allocate, fill */
-       INCREF(None);
-       return None;
-}
-#endif /* TCP_GS */
-
-/* List of methods defined in the module */
-
-static struct methodlist mactcp_methods[] = {
-       {"TCPCreate",   mactcp_TCPCreate,       1},
-       {"UDPCreate",   mactcp_UDPCreate,       1},
-       {"MTU",                 mactcp_MTU,     1},
-       {"IPAddr",              mactcp_IPAddr,  1},
-       {"NetMask",             mactcp_NetMask, 1},
-#ifdef TCP_GS
-       {"GlobalInfo",  mactcp_GlobalInfo,      1},
-#endif
-       {NULL,          NULL}           /* sentinel */
-};
-
-
-/* Initialization function for the module (*must* be called initmactcp) */
-
-void
-initmactcp()
-{
-       object *m, *d;
-
-       /* Create the module and add the functions */
-       m = initmodule("mactcp", mactcp_methods);
-
-       /* Add some symbolic constants to the module */
-       d = getmoduledict(m);
-       ErrorObject = newstringobject("mactcp.error");
-       dictinsert(d, "error", ErrorObject);
-       
-       upp_tcp_done = NewTCPIOCompletionProc(tcps_done);
-       upp_tcp_asr = NewTCPNotifyProc(tcps_asr);
-#if 0
-       upp_udp_done = NewUDPIOCompletionProc(udps_done);
-#endif
-       upp_udp_asr = NewUDPNotifyProc(udps_asr);
-
-       /* XXXX Add constants here */
-       
-       /* Check for errors */
-       if (err_occurred())
-               fatal("can't initialize module mactcp");
-}
diff --git a/Mac/Unsupported/mactcp/mactcpmodules.mu.exp b/Mac/Unsupported/mactcp/mactcpmodules.mu.exp
deleted file mode 100644 (file)
index 4cf9f52..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-initmacdnr
-initmactcp
diff --git a/Mac/Unsupported/mactcp/mactcpmodules.mu.hqx b/Mac/Unsupported/mactcp/mactcpmodules.mu.hqx
deleted file mode 100644 (file)
index b784006..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-(This file must be converted with BinHex 4.0)
-
-:%'eKBh4MF'e[C(9XCA-ZEA8!68e38N0A588!N!3Dd!!!+q@Mh@0[Ef`!!!!"!!!
-!(!!!'Q3!!"U!!!!!8!!!!!3!!!"S!!)!-!!#!"`(8fpeFQ0PFpf3#!#3'3)!-!!
-#!#J*6'PLFQ&bD@9chC!'!*!C!J!!!!)!+!P-D@*bBA*TCA2GN!B!N"d#!#J!q2r
-`!*!&!G58!*!'-XB!!!!"!*5fU!#3$3)!!-c-!$,-c*Q3"!!cc-bCQ@CQ!$6-c*Q
-C-c-!0Fc-QCN!!!!fc-aQC[rr!$I-c'CQc-`!1-c-CQB!!`!"3!F!N!3-5@jdCA*
-QB@0P6'PL!*!6V%qP3!'"Fh4eBUa2T8!!!J!$!*!%$QeKBf4ZFQe[C(9XC5jM!*!
-4VA-b@3'"9%9B9+ec-PN!!`!$!*!%$QeKBh4MF'e[C(9XC5jM!*!4VA-b@J'"9%9
-B9+ec-PS!"!!$!*!%#A4MF'GXG@8ZB`#3&Uec-PS"J94&@&5YFc*D!!8!!`#3"!a
-KE'a[BQTPBh4c,QJ!N"1Z#C!!13'!9%9B9+i*N!!j!!B!!`#3"!KMEfjQD@FZD!#
-3&kec-NF"J&4&@&5YFc*(!!G!!`#3"!GcG'4TEbjS!*!BV6qZp!#!9%9B9+drV[3
-!#%!$!*!%"hPfB@ac,QJ!N"LYXp4*!)"849K8VE2853!*3!-!N!3)Fh4bD@jR,QJ
-!N"HY2kld!)"849K8V6qZp!!+3!-!N!3(CA*bEQmZD!#3'+drV[)!J&4&@&5Y2kl
-b!!X!!`#3"!PYHA"bEh4[,QJ!N"DYFc)H!B"849K8VA-b(J!-!!-!N!3*FQ9ZB@e
-P-LjS!*!@VJQ3!$N"J&4&@&5Z#C!!13!0!!-!N!3)Ef*UC@0d,QJ!N"HZ#C!!13'
-!9%9B9+i*N!!j!!i!!`#3"!P[BQTTEA"X,QJ!N"DYFc)H!B"849K8VA-b(J!2!!-
-!N!31B@0MCA0cEf*UC@0d,QJ!N"'YFc)C!B"849K8VA-b'3!3!!-!N!3,D@jdEf*
-UC@0d,QJ!N"5YFc)F!B"849K8VA-b(!!4!!-!N!3-E'pZCfpLDQ9MG#jS!*!6VA-
-b(3'!9%9B9+ec-Kd!%J!$!*!%$@CXEf&dEf*UC@0d,QJ!N"+YFc)E!B"849K8VA-
-b'`!6!!-!N!30FQ&ZCf9[BQTPBh3ZD!#3%Uec-Km"J&4&@&5YFc)I!"3!!`#3"!j
-cG(*TEQG[BQTPBh3ZD!#3%Dec-Km"J&4&@&5YFc)I!"8!!`#3"!edGA"XC@pLDQ9
-MG#jS!*!5VA-b)!'!9%9B9+ec-L!!&J!$!*!%$'aTFh4[BQTPBh3ZD!#3%kec-Kd
-"J&4&@&5YFc)G!"F!!`#3"!pYBA"`D@jREf*UC@0d,QJ!N"#YFc)G!B"849K8VA-
-b(3!B!!-!N!31E@9dD'pNEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!C!!-!N!3
-1E@pNG@aPEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!D!!-!N!3-CR9ZBfpLDQ9
-MG#jS!*!6VA-b(!'!9%9B9+ec-K`!'`!$!*!%$@0XBA0cEf*UC@0d,QJ!N"+YFc)
-D!B"849K8VA-b'J!F!!-!N!3-CQPXC@pLDQ9MG#jS!*!6VJQ3!$N"J&4&@&5Z#C!
-!13!G!!-!N!3+EAPYB@aXEf-ZD!#3&Dec-Ki"J&4&@&5YFc)H!"j!!`#3"!KcG'4
-XD@)ZD!#3&kdrV[3!J&4&@&5Y2kld!"m!!`#3"!aYEf4cGA"`Eh*d,QJ!N"1YFc)
-G!B"849K8VA-b(3!J3!-!N!3)Fh4NBA*R,QJ!N"HY2kqp!)"849K8V6q[[3!K3!-
-!N!3*Ah0dC'&bCbjS!*!@UX`2e`#!9%9B9+V-$pF!)J!$!*!%"f0PGQ&X,QJ!N"L
-YFc)D!B"849K8VA-b'J!M!!-!N!3+B@*cG(*KBh3ZD!#3&Dec-KN"J&4&@&5YFc)
-C!#3!!`#3"!PYB@0RE(9P,QJ!N"DZ*8AF!B"849K8VL9&h!!P3!B!N!3(9(P`CA-
-ZD!#3'+fY'UN!J&4&@&5YV4UT!#C!"J#3""0$EfjNDA4TEfjKE%eKBh*[FbjS!*!
--V4rb3!#!9%9B9+dImN!!*d!'!*!%"dCTE'9c,QJ!N"LX)B$!!)"849K8V#'!`!!
-S3!B!N!3,6@PiC@40Ef4P,QJ!N"5Y8ec!!)"849K8V90F`!!T3!B!N!3*6e09G'P
-XFbjS!*!@VE291`#!9%9B9+fce6X!+N!'!*!%#%ePE@pbH5jS!*!AV#'!`!#!9%9
-B9+`KJ-!!+d!'!*!%#%9fC@jdFbjS!*!AV4rb3!#!9%9B9+dImN!!,%!'!*!%#e&
-eD@0VC(*KGbjS!*!8V')D3!#!9%9B9+aL'N!!,8!'!*!%$e&eD@0VC(*KGe4PH(3
-ZD!#3%+`KJ-!!J&4&@&5X)B$!!#j!"J#3"!j6G'&ZC'&bC%CTE'8ZD!#3%D`KJ-!
-!J&4&@&5X)B$!!#p!"J#3"!P%D@&XEfGc,QJ!N"DX)B$!!)"849K8V#'!`!!`3!B
-!N!3)4A*bEh*c,QJ!N"HY(r*!!)"849K8V4rb3!!a3!B!N!3(6@9ZGA-ZD!#3'+`
-KJ-!!J&4&@&5X)B$!!$*!"J#3"!T$EfjdFQpXFbjS!*!9V#'!`!#!9%9B9+`KJ-!
-!-d!'!*!%#9GTEQ4[Gh-ZD!#3&UaL'N!!J&4&@&5XBKT!!$4!"J#3"!T8CAKd4@4
-TG#jS!*!9V#'!`!#!9%9B9+`KJ-!!08!&!*!%%%&NC(*PFh0BE'&dD@pZ,QJ!N!q
-VZre!!)"849K8Ul[p3!!f3!B!N!3)6@&M9%03,QJ!N"HYQ6a!!)"849K8VCNm3!!
-h3!B!N!3,3A"`E'98B@aV,QJ!N"5X)B$!!)"849K8V#'!`!!i3!B!N!3'4'9cDbj
-S!*!CV#'!`!#!9%9B9+`KJ-!!18!'!*!%#84PGQPMCA-ZD!#3&UdImN!!J&4&@&5
-Y(r*!!$S!!`#3"!jcG(*eBh4YC@eLCA)ZD!#3%Dec-Km"J&4&@&5YFc)I!$X!!`#
-3"!PdBh"RE(9P,QJ!N"DYFc*E!B"849K8VA-b@`!m3!8!N!366@&M9%033fpYE@p
-Z9(P`CA-ZD!#3$+X%`dB!J&4&@&5V"-0'!$e!"3#3"!e(CA40H8P33@4NFLjS!*!
-5U`6$83#!9%9B9+X%`e%!2N!&!*!%"e4$8&"#,QJ!N"LV"--T!)"849K8U`6$+3!
-r3!8!N!3(98438%)ZD!#3'+X%`b!!J&4&@&5V"--J!%!!"!#3"!PbG@jdD@eP,Q-
-!N"DXVa"e!B"849K8V+m3G3""!!-!N!3@EAGPFQYcAh"XG@GTEPpMEfjQD@FZD!#
-3#Dec-QX"J&4&@&5YFc*V!%)!!`#3"!pMEfe`E'9iEf*UC@0d,QJ!N"#Z#C!!13'
-!9%9B9+i*N!!j!%-!!`#3"!PMEf*UC@0d,QJ!N"DYFc)D!B"849K8VA-b'J"%!!)
-!N!36E@&MG'0`E@pNG@aPFbke,Q9iF!#3$+cq!28"J&4&@&5XrJ$e!%8!!`#3"!T
-`H@9bFQpbFbjS!*!9VA-b(`'!9%9B9+ec-Km!4J!$!*!%#P"jG'K[EN0[FQ8!N"@
-Z*RYp!B"cD'aLVLClI3"(!!-!N!3*F(PNC@*eCbjS!*!@VJQ3!$N"J&4&@&5Z#C!
-!13")!!-!N!3,G(*KBf9LB@0V,QJ!N"5YFc)J!B"849K8VA-b)!"*!!-!N!3,F(P
-dD'pZFR9Z,QJ!N"5Z#C!!13'!9%9B9+i*N!!j!%S!!`#3"!YcHA0YEf4eE'8ZD!#
-3&+i*N!!j!B"849K8VJQ3!$N!5`!$!*!%#fPZG(*MD'9MDbjS!*!8VKP0'!'!9%9
-B9+iC64J!6!!$!*!%#'PYF'pbG#jS!*!AVJQ3!$N"J&4&@&5Z#C!!13"0!!-!N!3
-0BQadD@jYEf4eE'8ZD!#3%Ui*N!!j!B"849K8VJQ3!$N!6N!'!*!%#%YPFQjPE#j
-S!*!AV4rb3!#!9%9B9+dImN!!6d!'!*!%%deKBfKTEQ9&H'0PF(4TEfjc,QJ!N!b
-X)B$!!)"849K8V#'!`!"33!B!N!316Q&YC9*PCfPcG(*j,QJ!N"'Y(r*!!)"849K
-8V4rb3!"43!B!N!323fpNC8CbB@GYC@jdFbjS!*!3V#'!`!#!9%9B9+`KJ-!!!!K
--!!F#G!!!!%B!!3#3#!)!N!81E@&MC'jbE@pNG@aP,Q-!N"S#!*!(0DZlr8!!!3!
-hV#'!`!!"!&'X)B$!!!%!*UdImN!!!3!bV#'!`!!"!$LX)B$!!!%!1DdImN!!!3!
-[V#'!`!!"!!UY2klb!!%!-+dImN!!!3!VV4rb3!!"!#HX)B$!!!%!6UdImN!!!3"
-2V#'!`!!"!$DYQ6a!!!%!+U`KJ-!!!3!aV#'!`!!"!#LY8ec!!!%!8+dImN!!!3!
-TVE291`!"!#bXBKT!!!%!,D`KJ-!!!3!ZV#'!`!!"!##Y2kqp!!%!"kdrV[3!!3!
-HV6qZp!!"!!QY2kld!!%!0+`KJ-!!!3!PVDdDU3!"!$1XBKT!!!%!#+fce%N!!3!
-KUX`2e`!"!#1YFc)C!!%!$kec-KN!!3!&VJQ3!$N!!3"0VJQ3!$N!!3!LVA-b'J!
-"!"ZYFc)D!!%!3kec-KS!!3"#VJQ3!$N!!3!'VA-b4`!"!"bZ#C!!13!"!"+YFc)
-E!!%!'Uec-K`!!3"-VJQ3!$N!!3!3VA-b(!!"!%ZZ'8dB!!%!&Uec-Kd!!3!4VA-
-b(3!"!#5Z*8AF!!%!&kec-Kd!!3!BVA-b(3!"!"qYFc)G!!%!'Dec-Kd!!3""VA-
-bD`!"!"fYFc)H!!%!#kec-Ki!!3!0VJQ3!$N!!3!1VA-b(J!"!%HZ#C!!13!"!%@
-YFc)I!!%!5Di*N!!j!!%!%kec-Km!!3!-VJQ3!$N!!3!8VA-b(`!"!$UYFc)I!!%
-!5Ui*N!!j!!%!5+ec-L!!!3!9VA-b)!!"!TB#Q!+D!T`!!!",!!%!N!J#!*!&$Qe
-KBh4MF'e[C(9XC5jM!*!D!`#3"c@VZre!!!%!0k`KJ-!!!3"4V#'!`!!"!#DY(r*
-!!!%!-U`KJ-!!!3!iV#'!`!!"!$QY(r*!!!%!,k`KJ-!!!3!+V6qZmJ!"!$#Y(r*
-!!!%!+kdImN!!!3!RV#'!`!!"!$fV"-04!!%!6UdImN!!!3"2V#'!`!!"!$DYQ6a
-!!!%!2+X%`dB!!3!UV#'!`!!"!$'X)B$!!!%!++e6A-!!!3"3V4rb3!!"!#QYXp8
-l!!%!,+aL'N!!!3!YV#'!`!!"!#kX)B$!!!%!)+drVld!!3!(V6qZp!!"!"kY2kl
-d!!%!#DdrV[3!!3!qU`6$+3!"!$5X)B$!!!%!*DfY'UN!!3!rU`6$)!!"!$1XBKT
-!!!%!#+fce%N!!3!KUX`2e`!"!#1YFc)C!!%!$kec-KN!!3!&VJQ3!$N!!3"0VJQ
-3!$N!!3!LVA-b'J!"!"ZYFc)D!!%!3kec-KS!!3"#VJQ3!$N!!3!'VA-b4`!"!"b
-Z#C!!13!"!"+YFc)E!!%!'Uec-K`!!3"-VJQ3!$N!!3!3VA-b(!!"!%ZZ'8dB!!%
-!&Uec-Kd!!3!4VA-b(3!"!#5Z*8AF!!%!&kec-Kd!!3!BVA-b(3!"!"qYFc)G!!%
-!'Dec-Kd!!3""VA-bD`!"!"fYFc)H!!%!#kec-Ki!!3!0VJQ3!$N!!3!1VA-b(J!
-"!%HZ#C!!13!"!%@YFc)I!!%!5Di*N!!j!!%!%kec-Km!!3!-VJQ3!$N!!3!8VA-
-b(`!"!$UYFc)I!!%!5Ui*N!!j!!%!1kec-PX!!3")VA-b)!!"!"@YFc)J!!%",J%
-`!6)"0!!!!"i!!3#3#!)!N!8*G'0`CfaeC5jM!*!I"!#3"c@VZre!!!%!0k`KJ-!
-!!3"4V#'!`!!"!#DY(r*!!!%!-U`KJ-!!!3!jV4rb3!!"!#qX)B$!!!%!-+dImN!
-!!3!VV4rb3!!"!#HX)B$!!!%!2DX%`e%!!3"1V4rb3!!"!%qX)B$!!!%!0UfC2%!
-!!3!mU`6$4J!"!#UX)B$!!!%!-D`KJ-!!!3!SV90F`!!"!&#Y(r*!!!%!+Dfce6X
-!!3!XV')D3!!"!#fX)B$!!!%!2UX%`bN!!3!dV#'!`!!"!#@YV4UT!!%!2kX%`b!
-!!3!cV')D3!!"!%'YFc*V!!%!1kec-PX!!3%1!4!"%J%8!!!!!3!"!*!)!J%!N!3
-6E@&MG'0`E@pNG@aPFbke,Q9iF!#3&83!N!G'!%Mp33!"!$HX)3&4FD!!N!BLN!!
-"8C6!J-)!!3!jV#'!`J!"!8I!8)$#!!%!-+`KJ-)!!3!VV#'!`J!"!#HX)B$#!!%
-!2DX%`e%!!3!fV#'!`3!"!$bV"-0'!!%!+U`KJ-)!!3!aV#'!`J!"!#LX)B$#!!%
-!+D`KJ-)!!3!XV#'!`J!"!#fX)B$#!!%!2UX%`bN!!3!dV#'!`J!"!#@XDI6b!!%
-!2kX%`b!!!3!cV#'!`J!"!%'Xrbq[!!%!1kY#c6)!!3"'!%J!5J"-!qF!!3!#!*!
-)!J%!N!3+8(PdD'pZ3fpbC3#3(NB!N!G'!%J!5J"-!qF!!3!#!*!)!J#3"3a*ER4
-PFQCKBf9-D@)!N"`"!*!(6J"3!&)!9!!!!!)!!J#3#!)"!*!%#A*eER4TE@8ZB`#
-3(d!!N!G"VA-bD`!"!*!)!YkYQ!!!!4i!!"%@8%CXF`#3"!,HVY3!!")d!!!)6&"
--Fh3!N!S"(!!!!!*38f9Rrrm!N!NF!!!"!&"6C@F!!3!!GM)!!!%!!!!T-`!!+$-
-!!!+b!!3!+!!+!F)#J!!S!!S"`J+!!*!1%'eKBh4MF'e[C(9XCA-ZEA9X!J!!!%e
-08&*$9dP&!*!%68e38N0A588!N"LZUS!V!!!Dd!!!+q9S!*!B#J!#!*!,"!!##!#
-3"-3!"0!!N%&TEQPdH(J!N!X#!!B!!!!+!!3!N!X`!!B"!2rr!*!)rrm"N!8!N!3
-H!3%!N!LCQ3!!2rmrrcrr!3#3"%S!!3!*"Qe[EQ&ME`#3(!3!+!!+!F)#J!!S!!S
-"`J+!!*!3!3#3"!)!N!88!!%!@!#Z!-m"d3#3"%S6!!!G0`!!!"S!!`!!QCN!N!4
-rr`#3"(rr!*!%Irm!N!3+-!!%!!!!!`!(!3J!!3%kA*%!jNMN!!j[K'&cDb!!!!!
-F!*!*[XUQ!,l,P!#qbk`!N!@r%e`!N!@r%e`!%#5!!*!Sc*!)!1C!d!$Q3'$GN!K
-rrhrr!1C!K!#3"%#(!*!%"B3!!+%LrJ)!N!IQ30!!!cNb!*!6!3#qbf)![XY#!,m
-(b!!!A*%!jNMN!!!!!f&cDb!!!!!F!*!*[XUQ!,l,P!#qbk`!N!@r%e`![iPF!,m
-6'%e33d-"#!!"!MSkN3$Q513!$Qq%BA0V)!!!!"`!N!QqbUB![XZ8!,l,V!#3"Em
-6A!#3"Em6A!!3*)!!N#M-N!J!jN$3!1C!B0f3#(rrIrm!jN#%!*!%3)F!N!3&K!!
-!S5,q!J#3"qC!d!!$16)!N"-"!,l,BJ#qbd)![`I)!!"FN3$Q513!!!!$BA0V)!!
-!!"`!N!QqbUB![XZ8!,l,V!#3"Em6A!#rL9`![a-B69"$3`'i!!)h1NeKBdp6)&0
-eF("[FR3k6'PLFQ&bD@9c1P*eER4TE@8k8R9ZG'PYC5"38%-k+&0[GA*MCA-T1J!
-!!"2[E!#3)!'MHpJ!N!A6%83!N!3"Sh[B!!)!!!(6ha!"V8(S!*!KjJ"c!2J!b!'
-Y4r`!"!!i!G2J5!!!%83"dpp`,k$Gh3!2k#!!!2r"!$2#d!!6lf`!D`%r!'X"2`(
-FF`J"h(48!GaBV!(FFd3"h&,X!GaJZ!!!!2m"I`#qrmIMIJ(6h`!"d`%!!!%B1MS
-k3eG(990*)$%Z0Lid1QPZBfaeC'8k-!!6qC3!1D3)!!!dY!#3#Irrr`()p6J"b24
-33J!#"2rGB'`"X@6*!FMdB!!#9E!"XAP3!D)Xd!()p(!!!P@`!"'lj!!e,`!!4!)
-!!!%!!3!"!!%!!!!$!FMdX!#3"2rDi)3!!!!"!FMe!!!5qR`"Q)q`!E&Nc!()p-!
-!%[Tm!"(+&!()pG)"b26!!!*9X2r8FF!!!+%L!FMdm!!$-8Mrf`1)!*!%!FMf%!!
-6fI`!%pR`!FMf@J()p2!!%qCSrpe#1'Mrpd!"b28!!",h+!!4U&!"X@5S!2rrr`!
-90c3"d3%!!!)N1NeKBdp6)&0eF("[FR3k5'9KC'9bFcT"6P0*)%KPB@4PFR-k!*!
-LjN33!*!(!3!0HPJN!!J%!1C$N!!!%#33!1C&6!#3'4!J[!#3"HC&J!#3"3ekT!#
-qk#"!RI&3!"!N%!#3"HC&KJ#3"4!NJ!!!S"`!N"AQ4*!!!*!*$ATB*)!)"!$Q4"!
-!%#33!*!H!3!!!L3k6@&M6e-J8h9`F'pbG$T)C@&NCA*c1P"33b"6F'9MD@CTBcS
-!N#,Q4"!!N!F"!!ek@#3!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AU
-N!,lS)%#Gm9!!%#33!*!&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C
-%%!!3*"!!N"i"!!!#2$T0B@028b"6GA"`Eh*d1NKPB@4PFR-k8hPcG'9Y)%9iG(*
-KFb")C@&NCA*c1NeKBe4$8#")C@&NCA*c1J#3#ZC%%!#3"`%!$ATB*!!)"!$Q3j!
-!!"!N%!$Q48`!N"N3),`!N!AQ4B!!N!80HU3![ZJJ3*ha8!!3*"!!N!AQ4BB!N!8
-3*)!!!+!F!*!9jN53!!#3#3ek@#5!#!3!jN33!"!N%!#3(J%!!!)T1NeKBdp6)&0
-eF("[FR3k5'9KC'9bFcT9EQPfCA*cB@`J5'9KC'9bFcS!N"hQ4"!!N!F"!!ek@#3
-!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AUN!,lS)%#Gm9!!%#33!*!
-&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C%%!!3*"!!N"i"!!!#*MT
-0B@028b"6GA"`Eh*d1NaTBR*KFQPPFcT0B@028b"$EfeYEfik!*!JjN33!*!(!3!
-0HPJN!!J%!1C$N!!!%#33!1C&6!#3'4!J[!#3"HC&J!#3"3ekT!#qk#"!RI&3!"!
-N%!#3"HC&KJ#3"4!NJ!!!S"`!N"AQ4*!!!*!*$ATB*)!)"!$Q4"!!%#33!*!H!3!
-!!Ldk6@&M6e-J8h9`F'pbG$T-D@*bBA*TCA-k8R9ZG'PYC6T5G@jdD@eP)&"33cS
-!N"RQ4"!!N!F"!!ek@#3!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AU
-N!,lS)%#Gm9!!%#33!*!&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C
-%%!!3*"!!N#!8P!!'%%eKBdp6)&"33b"-D@jVCA)!N"!%%%eKBdp6)&"33b"-D@j
-VCA)!N$!D39"36!#33'!!!!""F("X!*"!B!!!!%e06%)!N#!16'PL)%PYF'pbG#"
-38%-!N"908%a'!*!J$NaTBL"*EA"[FR3J8&"$!*!969G$4!#33'!!!!"58e*$!*"
-!B!!!!&4&@&3$,Q*SBmUV8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfp
-Z)%KPE(!!N!8G"!(+Ui!!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ8&"
-$!*!A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)&"33`#3&e4&@&3$,Q0M!*!F$%eA)%-
-[3bXV)&"33`#3&e4&@&3$,Q0`!*!F$%eA)%-[3bXV)&"33`#3&e4&@&3%,Q0`F!#
-3'`a09b"$,d-V+b"38%-!N"G849K8"#jPH(!!N$p849K8!LjS!*!G$%eA)%-[3bX
-V)&"33`#3%a!!!!"849K8!Lj`!*!G$8eA)&"KFf0KE#"38%-!N"C849K8"#j`BA-
-!N"X069FJ8'&cBf&X)&"33`#3&P4&@&3%,R"MD!#3'`a09b"$,d-V+b"38%-!N"1
-!!!!!9%9B9!BZF'0S+bX!N"N-69FJ3bp$+bXJ8&"$!*!6J!!!!&4&@&3#,R)!N"d
-'69FJ8Q9k!*!G9%9B9!)ZFfKMbUY3!!-`b!!8VG!!!!&q!FUV8!!8CF!!!!,@"P"
-33d&cE@iJ5'9X!*!'(33"bUZ!!"4P`!'(PY3!N!4B3dp'!*!J%&K$6dC')%PYF'p
-bG#"38%-!N"0NEf0e!*"!B!!!!(*cFQ-!N%"J!!!!FfKXBJ#3)!j348BJ5@e`Eh*
-d)&"33`#3&A0dG@)!N#!18%9')%PYF'pbG#"38%-!N"N%,Q4[B`#31e!!!!!36@&
-M6e-J0MK,)%aTEQYPFJ#3-"T"8&"-!*"!B!!!!%&`F'`!N%"J!!!!68e-3J#3)!j
--D@)J5@e`Eh*d)$Bi5`#3&8e36%B!N#!16'PL)%PYF'pbG#!f1%X!N"909d0%!*"
-!B!!!!%p#5L!!N#!169"A)%PYF'pbG#!f1%X!N"958e*$!*"!B!!!!&4&@&3$,Q*
-SBmUV8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfpZ)%KPE(!!N!8G"!(
-+Ui!!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ0MK,!*!A9%9B9!3ZBbX
-V!*!E$%eA)%-[3bXV)$Bi5`#3&e4&@&3$,Q0M!*!F$%eA)%-[3bXV)$Bi5`#3&e4
-&@&3$,Q0`!*!F$%eA)%-[3bXV)$Bi5`#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b!
-f1%X!N"G849K8"#jPH($+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abTdP%L
-VJ!(+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"&4&@&3#,QJ!N"d-69FJ3bp$+bX
-J0MK,!*!6%!!!!&4&@&3#,R!!N"d069FJ8'&cBf&X)$Bi5`#3&P4&@&3%,R"KF`#
-3'`e09b"3BA0MB@`J0MK,!*!@9%9B9!3ZF'0S!*!E$%eA)%-[3bXV)$Bi5`#3%i!
-!!!"849K8"Lj`BfJV+`#3'3a09b"$,d-V+b!f1%X!N"1!!!!!9%9B9!)ZFJ#3(3C
-09b"5CAS!N"e849K8"#jcC@I+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abT
-dP%LVJ!(+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"'4[Bh8!N%"J!!!!FR0bB`#
-33'!!!!"cD'aL!*!J$P"&4L"*EA"[FR3J0MKV!*!9Fh4eBJ#3)!j348BJ5@e`Eh*
-d)$BiD`#3'33ZC'pM!*!l8!!!!""AD@ic-L"i1$BJ6'PZDf9b!*!`#94&@&3#,Q-
-!N"d-69FJ3bp$+bXJH$Jf!*!A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)(Ji0J#3&e4
-&@&3$,Q0`!*!F$%eA)%-[3bXV)(Ji0J#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b"
-i1$B!N"G849K8"#j`BfJ!N"X-69FJ3bp$+bXJH$Jf!*!6J!!!!&4&@&3',R"MD#X
-V!*!C$%eA)%-[3bXV)(Ji0J#3%i!!!!"849K8!bjbB`#3(!K09b"AD@j53`#3(`3
-ZE'PL!*!E$NaTBL"*EA"[FR3JH$Jf!*!C"#j[BQS!N"X16f*U)%PYF'pbG#"i1$B
-!N"8*68-J6'PZDf9b!*!h#%e03dJ!N%4849K8!LjM!*!G#%e$)%-[3bXV!*!E9%9
-B9!3ZBfac!*!E%8e$)%0XBA0c)%0[EA"TE'9b!*!1J!!!!&4&@&3%,Q4PCJ#32e4
-&@&3%,Q4[B`#31a!!!!"849K8!LjS!*!p%!!!!&4&@&3%,R"MD!#3'`K03b"$,d-
-V+`#3&i!!!!"849K8!bjdF`#33`B!!3%!N!B8!!3"!*!(!3#3$!S!!3%!!!%"!!%
-!N!31!!F"!!%"!!%"!!!!!3#3"-B!"`#33Mq3"%&38%`!!!'!@)!!N%)rN!3!N!P
-9!C!!!3)#H`#3"3)!!!!8!*!%!B!!N"%i!!N!N!F@EAGPFQYcAh"XG@GTEPpMEfj
-QD@FZD!#3$!%!N!i-!!-!N!`"fJ!%!*!3!3#3r`#34&pIFh4KFR3!N(`"!!!!0J!
--!*!(!3#3*3%!N!8"!!!!$3!#!*!1&!!$!J!"!3!!!3%$!3#3#`S!!3%"!!!"!3!
-"!!!!a!!'`J#3``%8!!8!!3!!-XJ!!$,)!!!bb!#3"!eYB@0dBh"YEf4eE'9c!*$
-eZJ!%!!%4E@&MG'0`E@pNG@aPFbjcE')!N!j3HA4SFfKXBJ#3F3%rN!3!N!GA!+i
-!kJ(4!3!!!!Y@!!"FN3!!!#i!!J!!!!)!!J#3+!)-!!)!8!!"!!%!!3!"!*$r!"3
-R3dp%45FJ*d4"9%%R)#G35808*`#3lJS!"!#3#J%!!!!T-`!!+$-!!!+b!YkX@#H
-U!!!!(!&k!!*`FQ9Q!"J!'R"@CA)!!!&'8e45)`!!!9)%X!!3!!!!"J#3"$U5!"d
-!!!!8!*!%FFi!*!!!!%J!N!4E@J!T!!!!R!#3"(Pd!$J!!!#d!*!%$A-!5!!!!0)
-!N!32PJ"9!!!,"J#3"&e+!&`!!"qH!*!%*k8!D3!!(kJ!N!3-a!"e!!!I`!#3"#H
-U!)B!!"r1!*!%3hX!N3!!(q!!N!4&S`#G!!!JUJ#3"!hN!+`!!#$Q!*!%*ZJ!Z`!
-!)2B!N!4kF3$#!!!Le!#3"'@X!0)!!#-1!*!%(YF!iJ!!)am!N!30V3$Z!!!M0`#
-3"$#-!2m!!#0&!*!%@MF"#J!!*!d!N!3,L3%5!!!P*3#3"(I+!4i!!#AM!*!%F-F
-"+`!!*K8!N!A)rrm!!#JP!*!3'i$rr`!!!*B!N!328(*[DQ9MG#"@CA*cD@pZ$&"
-bEfTPBh3J6@PcB`C&C'PdEh)%4QpZG!j3FQpUC@0d)%9iG(*KF`p$GA0dEfdJ5f9
-jGfpbC(--3@0MCA0c)&"KG'Kc"P4KFQGPG!a#G@PXC#"&H(4bBA-,0MK,)%0[C'9
-(C@i30MK,)%4TFf&cFf9YBQaPFJSf1%XJ6'PZDf9b#cBi5b"3FQpUC@0d$N-[3bX
-V)%0[EA"TE'9b$N-[3bXV)&GKFQjTEQGc"N0'66Bi5`p3BA0MB@`J3fpYF'PXCA)
-28'&cBf&X)&GKFQjTEQGc#e"33b"$Ef4P4f9Z%&"33b"%DA0KFh0PE@*XCA)+8&"
-$)%aTEQYPFJG38%-J8%9'#e"33b"3FQpUC@0d$&"33d&cE5"3B@jPE!a5CASJ3fp
-YF'PXCA+qM`:
diff --git a/Mac/Unsupported/mactcp/socket.py b/Mac/Unsupported/mactcp/socket.py
deleted file mode 100644 (file)
index e6600b1..0000000
+++ /dev/null
@@ -1,304 +0,0 @@
-"""socket.py for mac - Emulate socket module with mactcp and macdnr
-
-Currently only implements TCP sockets (AF_INET, SOCK_STREAM).
-Esoteric things like socket options don't work,
-but getpeername() and makefile() do work; everything used by ftplib works!
-"""
-
-# Jack Jansen, CWI, November 1994 (initial version)
-# Guido van Rossum, CWI, March 1995 (bug fixes and lay-out)
-
-
-import mactcp
-import MACTCPconst
-import macdnr
-
-
-# Exported constants
-
-_myerror = 'socket_wrapper.error'
-error = (mactcp.error, macdnr.error, _myerror)
-
-SOCK_DGRAM = 1
-SOCK_STREAM = 2
-
-AF_INET = 1
-
-
-# Internal constants
-
-_BUFSIZE = 15*1024                     # Size of TCP/UDP input buffer
-
-_myaddress = None
-_myname = None
-_myaddrstr = None
-
-
-def _myipaddress():
-       global _myaddress
-       if _myaddress == None:
-               _myaddress = mactcp.IPAddr()
-       return _myaddress
-
-
-def _ipaddress(str):
-       if type(str) == type(1):
-               return str                      # Already numeric
-       ptr = macdnr.StrToAddr(str)
-       ptr.wait()
-       return ptr.ip0
-
-
-def gethostbyname(str):
-       id = _ipaddress(str)
-       return macdnr.AddrToStr(id)
-
-
-def gethostbyaddr(str):
-       id = _ipaddress(str)
-       ptr = macdnr.AddrToName(id)
-       ptr.wait()
-       name = ptr.cname
-       if name[-1:] == '.': name = name[:-1]
-       names, addresses = [], [str]
-       return name, names, addresses
-
-def gethostname():
-       global _myname
-       if _myname == None:
-               id = _myipaddress()
-               ptr = macdnr.AddrToName(id)
-               ptr.wait()
-               _myname = ptr.cname
-       return _myname
-
-
-def _gethostaddress():
-       global _myaddrstr
-       if _myaddrstr == None:
-               id = _myipaddress()
-               _myaddrstr = macdnr.AddrToStr(id)
-       return _myaddrstr
-
-
-def socket(family, type, *which):
-       if family <> AF_INET:
-               raise _myerror, 'Protocol family %d not supported' % type
-       if type == SOCK_DGRAM:
-               return _udpsocket()
-       elif type == SOCK_STREAM:
-               return _tcpsocket()
-       raise _myerror, 'Protocol type %d not supported' % type
-
-
-def fromfd(*args):
-       raise _myerror, 'Operation not supported on a mac'
-
-
-class _socket:
-       def unsupported(self, *args):
-               raise _myerror, 'Operation not supported on this socket'
-       
-       accept = unsupported
-       bind = unsupported
-       close = unsupported
-       connect = unsupported
-       fileno = unsupported
-       getpeername = unsupported
-       getsockname = unsupported
-       getsockopt = unsupported
-       listen = unsupported
-       recv = unsupported
-       recvfrom = unsupported
-       send = unsupported
-       sendto = unsupported
-       setblocking = unsupported
-       setsockopt = unsupported
-       shutdown = unsupported
-
-
-class _tcpsocket(_socket):
-       
-       def __init__(self):
-               self.stream = mactcp.TCPCreate(_BUFSIZE)
-               ##self.stream.asr = self.asr
-               self.databuf = ''
-               self.udatabuf = ''
-               self.port = 0
-               self.accepted = 0
-               self.listening = 0
-
-       def accept(self):
-               if not self.listening:
-                       raise _myerror, 'Not listening'
-               self.listening = 0
-               self.stream.wait()
-               self.accepted = 1
-               return self, self.getsockname()
-       
-       # bind has two ways of calling: s.bind(host, port) or s.bind((host, port));
-       # the latter is more proper but the former more common
-       def bind(self, a1, a2=None):
-               if a2 is None:
-                       host, port = a1
-               else:
-                       host, port = a1, a2
-               self.port = port
-               
-       def close(self):
-               if self.accepted:
-                       self.accepted = 0
-                       return
-               self.stream.Abort()
-       
-       # connect has the same problem as bind (see above)
-       def connect(self, a1, a2=None):
-               if a2 is None:
-                       host, port = a1
-               else:
-                       host, port = a1, a2
-               self.stream.ActiveOpen(self.port, _ipaddress(host), port)
-               
-       def getsockname(self):
-               host, port = self.stream.GetSockName()
-               host = macdnr.AddrToStr(host)
-               return host, port
-               
-       def getpeername(self):
-               st = self.stream.Status()
-               host = macdnr.AddrToStr(st.remoteHost)
-               return host, st.remotePort              
-               
-       def listen(self, backlog):
-               self.stream.PassiveOpen(self.port)
-               self.listening = 1
-               
-       def makefile(self, rw = 'r', bs = 512):
-               return _socketfile(self, rw, bs)
-               
-       def recv(self, bufsize, flags=0):
-               if flags:
-                       raise _myerror, 'recv flags not yet supported on mac'
-               if not self.databuf:
-                       try:
-                               self.databuf, urg, mark = self.stream.Rcv(0)
-                       except mactcp.error, arg:
-                               if arg[0] != MACTCPconst.connectionClosing:
-                                       raise mactcp.error, arg
-               rv = self.databuf[:bufsize]
-               self.databuf = self.databuf[bufsize:]
-               return rv
-               
-       def send(self, buf):
-               self.stream.Send(buf)
-               return len(buf)
-               
-       def shutdown(self, how):
-               if how == 0:
-                       return
-               self.stream.Close()
-               
-       def bytes_readable(self):
-               st = self.stream.Status()
-               return st.amtUnreadData
-               
-       def bytes_writeable(self):
-               st = self.stream.Status()
-               return st.sendWindow - st.sendUnacked;
-
-
-class _udpsocket(_socket):
-       
-       def __init__(self):
-               pass
-
-
-class _socketfile:
-       
-       def __init__(self, sock, rw, bs):
-               if rw[1:] == 'b': rw = rw[:1]
-               if rw not in ('r', 'w'): raise _myerror, "mode must be 'r' or 'w'"
-               self.sock = sock
-               self.rw = rw
-               self.bs = bs
-               self.buf = ''
-               
-       def read(self, length = -1):
-               if length < 0:
-                       length = 0x7fffffff
-               while len(self.buf) < length:
-                       new = self.sock.recv(0x7fffffff)
-                       if not new:
-                               break
-                       self.buf = self.buf + new
-               rv = self.buf[:length]
-               self.buf = self.buf[length:]
-               return rv
-               
-       def readline(self):
-               import string
-               while not '\n' in self.buf:
-                       new = self.sock.recv(0x7fffffff)
-                       if not new:
-                               break
-                       self.buf = self.buf + new
-               if not '\n' in self.buf:
-                       rv = self.buf
-                       self.buf = ''
-               else:
-                       i = string.index(self.buf, '\n')
-                       rv = self.buf[:i+1]
-                       self.buf = self.buf[i+1:]
-               return rv
-               
-       def readlines(self):
-               list = []
-               line = self.readline()
-               while line:
-                       list.append(line)
-                       line = self.readline()
-               return list
-               
-       def write(self, buf):
-               BS = self.bs
-               if len(buf) >= BS:
-                       self.flush()
-                       self.sock.send(buf)
-               elif len(buf) + len(self.buf) >= BS:
-                       self.flush()
-                       self.buf = buf
-               else:
-                       self.buf = self.buf + buf
-       
-       def writelines(self, list):
-               for line in list:
-                       self.write(line)
-       
-       def flush(self):
-               if self.buf and self.rw == 'w':
-                       self.sock.send(self.buf)
-                       self.buf = ''
-       
-       def close(self):
-               self.flush()
-               ##self.sock.close()
-               del self.sock
-
-
-def __test_tcp():
-       s = socket(AF_INET, SOCK_STREAM)
-       s.connect('poseidon.cwi.nl', 13)
-       rv = s.recv(1000)
-       print 'Time/date:', rv
-       rv = s.recv(1000)
-       if rv:
-               print 'Unexpected extra data:', rv
-       s.close()
-       
-
-def __test_udp():
-       s = socket(AF_INET, SOCK_DGRAM)
-       print 'Sending data... (hello world)'
-       s.sendto(('poseidon.cwi.nl', 7), 'hello world')
-       rv, host = s.recvfrom(1000)
-       print 'Got from ', host, ':', rv
diff --git a/Mac/Unsupported/mactcp/tcpglue.c b/Mac/Unsupported/mactcp/tcpglue.c
deleted file mode 100644 (file)
index 79042b4..0000000
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * Glue routines for mactcp module.
- * Jack Jansen, CWI, 1994.
- *
- * Adapted from mactcp socket library, which was in turn
- * adapted from ncsa telnet code.
- *
- * Original authors: Tom Milligan, Charlie Reiman
- */
-# include <Memory.h>
-# include <Files.h>
-# include <Errors.h>
-
-#include "tcpglue.h"
-#include <Devices.h>
-
-static short driver = 0;
-
-#ifndef __powerc
-/*
- * Hack fix for MacTCP 1.0.X bug
- *
- * This hack doesn't work on the PPC. But then, people with new machines
- * shouldn't run ancient buggy software. -- Jack.
- */
-pascal char *ReturnA5(void) = {0x2E8D};
-#endif /* !__powerc */
-
-OSErr xOpenDriver() 
-{ 
-       if (driver == 0) 
-       { 
-               ParamBlockRec pb; 
-               OSErr io; 
-               
-               pb.ioParam.ioCompletion = 0L; 
-               pb.ioParam.ioNamePtr = "\p.IPP"; 
-               pb.ioParam.ioPermssn = fsCurPerm; 
-               io = PBOpen(&pb,false); 
-               if (io != noErr) 
-                       return(io); 
-               driver = pb.ioParam.ioRefNum; 
-       }
-       return noErr;
-}
-
-/*
- * create a TCP stream
- */
-OSErr xTCPCreate(buflen,notify,udp, pb) 
-       int buflen;
-       TCPNotifyUPP notify;
-       void *udp;
-       TCPiopb *pb;
-{      
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPCreate;
-       pb->csParam.create.rcvBuff = (char *)NewPtr(buflen);
-       pb->csParam.create.rcvBuffLen = buflen;
-       pb->csParam.create.notifyProc = notify;
-       pb->csParam.create.userDataPtr = udp;
-       return (xPBControlSync(pb));
-}
-
-
-/*
- * start listening for a TCP connection
- */
-OSErr xTCPPassiveOpen(TCPiopb *pb, short port, TCPIOCompletionUPP completion,
-       void *udp)
-{
-       if (driver == 0)
-               return(invalidStreamPtr);
-
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPPassiveOpen;
-       pb->csParam.open.validityFlags = timeoutValue | timeoutAction;
-       pb->csParam.open.ulpTimeoutValue = 255 /* seconds */;
-       pb->csParam.open.ulpTimeoutAction = 0 /* 1:abort 0:report */;
-       pb->csParam.open.commandTimeoutValue = 0 /* infinity */;
-       pb->csParam.open.remoteHost = 0;
-       pb->csParam.open.remotePort = 0;
-       pb->csParam.open.localHost = 0;
-       pb->csParam.open.localPort = port;
-       pb->csParam.open.dontFrag = 0;
-       pb->csParam.open.timeToLive = 0;
-       pb->csParam.open.security = 0;
-       pb->csParam.open.optionCnt = 0;
-       pb->csParam.open.userDataPtr = udp;
-       return (xPBControl(pb,completion));
-}
-
-/*
- * connect to a remote TCP
- */
-OSErr xTCPActiveOpen(TCPiopb *pb, short port, long rhost, short rport, 
-       TCPIOCompletionUPP completion)
-{
-       if (driver == 0)
-               return(invalidStreamPtr);
-
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPActiveOpen;
-       pb->csParam.open.validityFlags = timeoutValue | timeoutAction;
-       pb->csParam.open.ulpTimeoutValue = 60 /* seconds */;
-       pb->csParam.open.ulpTimeoutAction = 1 /* 1:abort 0:report */;
-       pb->csParam.open.commandTimeoutValue = 0;
-       pb->csParam.open.remoteHost = rhost;
-       pb->csParam.open.remotePort = rport;
-       pb->csParam.open.localHost = 0;
-       pb->csParam.open.localPort = port;
-       pb->csParam.open.dontFrag = 0;
-       pb->csParam.open.timeToLive = 0;
-       pb->csParam.open.security = 0;
-       pb->csParam.open.optionCnt = 0;
-       return (xPBControl(pb,completion));
-}
-
-OSErr xTCPNoCopyRcv(pb,rds,rdslen,timeout,completion) 
-       TCPiopb *pb;
-       rdsEntry *rds; 
-       int rdslen;
-       int     timeout;
-       TCPIOCompletionUPP completion;
-{
-       
-       if (driver == 0)
-               return(invalidStreamPtr);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPNoCopyRcv;
-       pb->csParam.receive.commandTimeoutValue = timeout; /* seconds, 0 = blocking */
-       pb->csParam.receive.rdsPtr = (Ptr)rds;
-       pb->csParam.receive.rdsLength = rdslen;
-       return (xPBControl(pb,completion));
-}
-
-OSErr xTCPBufReturn(TCPiopb *pb,rdsEntry *rds,TCPIOCompletionUPP completion)
-       {
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPRcvBfrReturn;
-       pb->csParam.receive.rdsPtr = (Ptr)rds;
-       
-       return (xPBControl(pb,completion));
-       }
-       
-/*
- * send data
- */
-OSErr xTCPSend(TCPiopb *pb, wdsEntry *wds, Boolean push, Boolean urgent, TCPIOCompletionUPP completion)
-{
-       if (driver == 0)
-               return invalidStreamPtr;
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPSend;
-       pb->csParam.send.validityFlags = timeoutValue | timeoutAction;
-       pb->csParam.send.ulpTimeoutValue = 60 /* seconds */;
-       pb->csParam.send.ulpTimeoutAction = 0 /* 0:abort 1:report */;
-       pb->csParam.send.pushFlag = push;
-       pb->csParam.send.urgentFlag = urgent;
-       pb->csParam.send.wdsPtr = (Ptr)wds;
-       return (xPBControl(pb,completion));
-}
-
-
-/*
- * close a connection
- */
-OSErr xTCPClose(TCPiopb *pb,TCPIOCompletionUPP completion) 
-{
-       if (driver == 0)
-               return(invalidStreamPtr);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPClose;
-       pb->csParam.close.validityFlags = timeoutValue | timeoutAction;
-       pb->csParam.close.ulpTimeoutValue = 60 /* seconds */;
-       pb->csParam.close.ulpTimeoutAction = 1 /* 1:abort 0:report */;
-       return (xPBControl(pb,completion));
-}
-
-/*
- * abort a connection
- */
-OSErr xTCPAbort(TCPiopb *pb) 
-{
-       if (driver == 0)
-               return(invalidStreamPtr);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPAbort;
-       return (xPBControlSync(pb));
-}
-
-/*
- * close down a TCP stream (aborting a connection, if necessary)
- */
-OSErr xTCPRelease(pb) 
-       TCPiopb *pb;
-{
-       OSErr io;
-       
-       if (driver == 0)
-               return(invalidStreamPtr);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPRelease;
-       io = xPBControlSync(pb);
-       if (io == noErr)
-               DisposPtr(pb->csParam.create.rcvBuff); /* there is no release pb */
-       return(io);
-}
-
-#if 0
-
-int
-xTCPBytesUnread(sp) 
-       SocketPtr sp;
-{
-       TCPiopb *pb;
-       OSErr io;
-       
-       if (!(pb = sock_fetch_pb(sp)))
-               return -1;              /* panic */
-       
-       if (driver == 0)
-               return(-1);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPStatus;
-       io = xPBControlSync(pb);
-       if (io != noErr)
-               return(-1);
-       return(pb->csParam.status.amtUnreadData);
-}
-
-int
-xTCPBytesWriteable(sp)
-       SocketPtr sp;
-       {
-       TCPiopb *pb;
-       OSErr   io;
-       long    amount;
-       
-       if (!(pb = sock_fetch_pb(sp)))
-               return -1;              /* panic */
-       
-       if (driver == 0)
-               return(-1);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPStatus;
-       io = xPBControlSync(pb);
-       if (io != noErr)
-               return(-1);
-       amount = pb->csParam.status.sendWindow-pb->csParam.status.amtUnackedData;
-       if (amount < 0)
-               amount = 0;
-       return amount;
-       }
-       
-int xTCPWriteBytesLeft(SocketPtr sp)
-       {
-       TCPiopb *pb;
-       OSErr   io;
-       
-       if (!(pb = sock_fetch_pb(sp)))
-               return -1;              /* panic */
-       
-       if (driver == 0)
-               return(-1);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPStatus;
-       io = xPBControlSync(pb);
-       if (io != noErr)
-               return(-1);
-       return (pb->csParam.status.amtUnackedData);
-       }
-#endif
-
-OSErr xTCPStatus(TCPiopb *pb, TCPStatusPB **spb)
-       {
-       OSErr io;
-       
-       if (driver == 0)
-               return(-1);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPStatus;
-       io = xPBControlSync(pb);
-       if (io == noErr)
-               *spb = &pb->csParam.status;
-       return(io);
-       }
-
-
-/*
- * create a UDP stream, hook it to a socket.
- */
-OSErr xUDPCreate(UDPiopb *pb,int buflen,ip_port *port, UDPNotifyUPP asr, void *udp)
-       {       
-       OSErr   io;
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = UDPCreate;
-       pb->csParam.create.rcvBuff = (char *)NewPtr(buflen);
-       pb->csParam.create.rcvBuffLen = buflen;
-       pb->csParam.create.notifyProc = asr;
-       pb->csParam.create.userDataPtr = udp;
-       pb->csParam.create.localPort = *port;
-       if ( (io = xPBControlSync( (TCPiopb *)pb ) ) != noErr)
-               return io;
-               
-       *port = pb->csParam.create.localPort;
-       return noErr;
-       }
-
-/*
- * ask for incoming data
- */
-OSErr xUDPRead(UDPiopb *pb, int timeout, UDPIOCompletionUPP completion) 
-       {
-       
-       if (driver == 0)
-               return(invalidStreamPtr);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = UDPRead;
-       pb->csParam.receive.timeOut = timeout;
-       pb->csParam.receive.secondTimeStamp = 0/* must be zero */;
-       return (xPBControl ( (TCPiopb *)pb, (TCPIOCompletionUPP)completion ));
-       }
-
-OSErr xUDPBfrReturn(UDPiopb *pb, char *buff) 
-       {
-       
-       if (driver == 0)
-               return(invalidStreamPtr);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = UDPBfrReturn;
-       pb->csParam.receive.rcvBuff = buff;
-       return ( xPBControl( (TCPiopb *)pb,(TCPIOCompletionUPP)-1 ) );
-       }
-
-/*
- * send data
- */
-OSErr xUDPWrite(UDPiopb        *pb,ip_addr host,ip_port port,miniwds *wds,
-               UDPIOCompletionUPP completion) 
-       {
-               
-       if (driver == 0)
-               return(invalidStreamPtr);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = UDPWrite;
-       pb->csParam.send.remoteHost = host;
-       pb->csParam.send.remotePort = port;
-       pb->csParam.send.wdsPtr = (Ptr)wds;
-       pb->csParam.send.checkSum = true;
-       pb->csParam.send.sendLength = 0/* must be zero */;
-       return (xPBControl( (TCPiopb *)pb, (TCPIOCompletionUPP)completion));
-       }
-
-/*
- * close down a UDP stream (aborting a read, if necessary)
- */
-OSErr xUDPRelease(UDPiopb *pb) {
-       OSErr io;
-
-       if (driver == 0)
-               return(invalidStreamPtr);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = UDPRelease;
-       io = xPBControlSync( (TCPiopb *)pb );
-       if (io == noErr) {
-               DisposPtr(pb->csParam.create.rcvBuff);
-               }
-       return(io);
-       }
-
-ip_addr xIPAddr(void) 
-{
-       struct GetAddrParamBlock pbr;
-       OSErr io;
-       
-       pbr.ioCRefNum = driver;
-       pbr.csCode = ipctlGetAddr;
-       io = xPBControlSync( (TCPiopb *)&pbr );
-       if (io != noErr)
-               return(0);
-       return(pbr.ourAddress);
-}
-
-long xNetMask() 
-{
-       struct GetAddrParamBlock pbr;
-       OSErr io;
-       
-       pbr.ioCRefNum = driver;
-       pbr.csCode = ipctlGetAddr;
-       io = xPBControlSync( (TCPiopb *)&pbr);
-       if (io != noErr)
-               return(0);
-       return(pbr.ourNetMask);
-}
-
-unsigned short xMaxMTU()
-{
-       struct UDPiopb pbr;
-       OSErr io;
-       
-       pbr.ioCRefNum = driver;
-       pbr.csCode = UDPMaxMTUSize;
-       pbr.csParam.mtu.remoteHost = xIPAddr();
-       io = xPBControlSync( (TCPiopb *)&pbr );
-       if (io != noErr)
-               return(0);
-       return(pbr.csParam.mtu.mtuSize);
-}
-
-OSErr xPBControlSync(TCPiopb *pb) 
-{ 
-       (pb)->ioCompletion = 0L; 
-       return PBControl((ParmBlkPtr)(pb),false); 
-}
-
-#pragma segment SOCK_RESIDENT
-
-OSErr xTCPRcv(pb,buf,buflen,timeout,completion) 
-       TCPiopb *pb;
-       Ptr buf; 
-       int buflen;
-       int     timeout;
-       TCPIOCompletionUPP completion;
-{
-       
-       if (driver == 0)
-               return(invalidStreamPtr);
-       
-       pb->ioCRefNum = driver;
-       pb->csCode = TCPRcv;
-       pb->csParam.receive.commandTimeoutValue = timeout; /* seconds, 0 = blocking */
-       pb->csParam.receive.rcvBuff = buf;
-       pb->csParam.receive.rcvBuffLen = buflen;
-       return (xPBControl(pb,completion));
-}
-
-OSErr xPBControl(TCPiopb *pb,TCPIOCompletionUPP completion) 
-{ 
-#ifndef __MWERKS__
-       pb->ioNamePtr = ReturnA5();
-#endif
-       
-       if (completion == 0L) 
-       { 
-               (pb)->ioCompletion = 0L; 
-               return(PBControl((ParmBlkPtr)(pb),false));              /* sync */
-       } 
-       else if (completion == (TCPIOCompletionUPP)-1L) 
-       { 
-               (pb)->ioCompletion = 0L; 
-               return(PBControl((ParmBlkPtr)(pb),true));               /* async */
-       } 
-       else 
-       {  
-               (pb)->ioCompletion = completion;
-               return(PBControl((ParmBlkPtr)(pb),true));               /* async */
-       } 
-}
-
diff --git a/Mac/Unsupported/mactcp/tcpglue.h b/Mac/Unsupported/mactcp/tcpglue.h
deleted file mode 100644 (file)
index ef9e133..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Prototypes for mactcpglue routines and includes/structures needed
- * by those.
- *
- * Jack Jansen, CWI, 1994.
- *
- * Adapted from mac socket library, which has in turn adapted from ncsa telnet.
- * Original authors: Tom Milligan, Charlie Reiman
- */
-  
-#include <MacTCPCommonTypes.h>
-#include <GetMyIPAddr.h>
-#include <TCPPB.h>
-#include <UDPPB.h>
-#include <AddressXlation.h>
-
-#ifndef __MWERKS__
-#define TCPIOCompletionUPP TCPIOCompletionProc
-#define TCPNotifyUPP TCPNotifyProc
-#define UDPIOCompletionUPP UDPIOCompletionProc
-#define UDPNotifyUPP UDPNotifyProc
-#define NewTCPIOCompletionProc(x) (x)
-#define NewTCPNotifyProc(x) (x)
-#define NewUDPIOCompletionProc(x) (x)
-#define NewUDPNotifyProc(x) (x)
-#endif /* __MWERKS__ */
-
-#if defined(powerc) || defined (__powerc)
-#pragma options align=mac68k
-#endif
-
-typedef        struct  miniwds
-       {
-       unsigned short length;
-       char * ptr;
-       unsigned short terminus;        /* must be zero'd for use */
-       } miniwds;
-
-#if defined(powerc) || defined(__powerc)
-#pragma options align=reset
-#endif
-
-
-OSErr xOpenDriver(void);
-OSErr xPBControl(TCPiopb *pb, TCPIOCompletionUPP completion);
-OSErr xPBControlSync(TCPiopb *pb);
-OSErr xTCPCreate(int buflen, TCPNotifyUPP notify, void *udp, TCPiopb *pb);
-OSErr xTCPPassiveOpen(TCPiopb *pb, short port, TCPIOCompletionUPP completion, void *udp);
-OSErr xTCPActiveOpen(TCPiopb *pb, short port, long rhost, short rport, TCPIOCompletionUPP completion);
-OSErr xTCPRcv(TCPiopb *pb, char *buf, int buflen, int timeout, TCPIOCompletionUPP completion);
-OSErr xTCPNoCopyRcv(TCPiopb *,rdsEntry *,int,int,TCPIOCompletionUPP);
-OSErr xTCPBufReturn(TCPiopb *pb,rdsEntry *rds,TCPIOCompletionUPP completion);
-OSErr xTCPSend(TCPiopb *pb, wdsEntry *wds, Boolean push, Boolean urgent, TCPIOCompletionUPP completion);
-OSErr xTCPClose(TCPiopb *pb,TCPIOCompletionUPP completion);
-OSErr xTCPAbort(TCPiopb *pb);
-OSErr xTCPRelease(TCPiopb *pb);
-
-OSErr xUDPCreate(UDPiopb *pb,int buflen,ip_port *port, UDPNotifyUPP asr, void *udp);
-OSErr xUDPRead(UDPiopb *pb,int timeout, UDPIOCompletionUPP completion);
-OSErr xUDPBfrReturn(UDPiopb *pb, char *buff);
-OSErr xUDPWrite(UDPiopb *pb,ip_addr host,ip_port port,miniwds *wds,
-               UDPIOCompletionUPP completion);
-OSErr xUDPRelease(UDPiopb *pb);
-
-ip_addr xIPAddr(void);
-long xNetMask(void);
-unsigned short xMaxMTU(void);
-
diff --git a/Mac/Unsupported/stdwinmodule.mu.exp b/Mac/Unsupported/stdwinmodule.mu.exp
deleted file mode 100644 (file)
index f0c5321..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-Drawingtype
-initstdwin
-ewpaste
-ewcopy
-ewundo
-ewreplace
-ewcloseall
-ewsaveall
-ewevent
-ewwritefile
-ewsetdimensions
-ewreadfile
-ewrevert
-ewsaveprompt
-ewsavecopy
-ewsaveas
-ewsave
-ewclose
-ewopen
-ewnew
-ewcreate
-ewcount
-ewfind
-wparheight
-wdrawpar
-tesetbuf
-tegetlen
-tegettext
-tegetnlines
-tegetfoc2
-tegetfoc1
-tesetfocus
-tenoview
-tesetview
-temovenew
-temove
-tegetbottom
-tegetright
-tegettop
-tegetleft
-teclicknew
-tebackspace
-tearrow
-teevent
-tereplace
-tetextround
-tewhereis
-tewhichline
-tewhichpoint
-tesetcaret
-teemptygap
-tegrowgapby
-temovegapto
-tedrawnew
-tedraw
-techangefocus
-tehidefocus
-teshowfocus
-tesetactive
-tefree
-tedestroy
-tesetup
-tecreate
-tealloc
-zrealloc
-zmalloc
-tedrawtext
-tetextbreak
-tetextwidth
-wcprintf
-wprintf
-about_message
-do_about
-wargs_argv
-wargs_argc
-wargs
-InitAEHandlers
-wnocaret
-wsetcaret
-blinkcaret
-rmcaret
-wfetchcolor
-_w_cursor
-set_hand
-set_applcursor
-set_watch
-set_arrow
-wsetwincursor
-wfetchcursor
-std_type
-wasktypelist
-waskntypes
-wperror
-waskstr
-waskync
-wmessage
-waskfile
-dprintf
-_w_fgcolor
-_w_bgcolor
-_w_font
-_w_size
-_w_usebgcolor
-_w_usefgcolor
-wsetbgcolor
-wsetfgcolor
-wgetbgcolor
-wgetfgcolor
-wnoclip
-wcliprect
-wxorpoly
-wfillpoly
-wdrawpoly
-wxorelarc
-wfillelarc
-wdrawelarc
-wxorcircle
-wfillcircle
-wdrawcircle
-wshade
-wpaint
-winvert
-w_erase
-wdrawbox
-wxorline
-wdrawline
-getwinrect
-makerect
-wdrawchar
-wdrawtext
-wcharwidth
-wtextwidth
-wbaseline
-wlineheight
-wsethilite
-wsetunderline
-wsetbolditalic
-wsetitalic
-wsetbold
-wsetinverse
-wsetplain
-wsetstyle_
-wsetsize
-wsetfont
-wlistfontnames
-wsetwintextattr
-wgetwintextattr
-wsettextattr
-wgettextattr
-initwattr
-wenddrawing
-wbegindrawing
-wupdate
-_wupdate
-scrollby
-wscroll
-wchange
-_wm_down
-active
-_w_high_level_event_proc
-_w_idle_proc
-wgetactive
-wsetactive
-_wresetmouse
-valid_border
-inval_border
-wgetevent
-wpollevent
-wungetevent
-fullpath
-getdirname
-about_item
-_wmenuhilite
-setup_menus
-_wdo_menu
-rmlocalmenus
-addlocalmenus
-killmbar
-initmbar
-wmenusetdeflocal
-wmenudetach
-wmenuattach
-wmenucheck
-wmenuenable
-wmenusetitem
-wmenuadditem
-wmenudelete
-wmenucreate
-PSTRING
-wrotatecutbuffers
-wgetcutbuffer
-wsetcutbuffer
-wresetselection
-wgetselection
-wsetselection
-wsetclip
-wgetclip
-_wfreeclip
-_wgrowicon
-movescrollbars
-hidescrollbars
-showscrollbars
-makescrollbars
-dragscroll
-autoscroll
-do_scroll
-_wfixorigin
-wgetdocsize
-wsetdocsize
-wshow
-wgetorigin
-wsetorigin
-wattr
-screen
-wgetdefscrollbars
-wsetdefscrollbars
-wgetdefwinsize
-wsetdefwinsize
-wgetdefwinpos
-wsetdefwinpos
-wsetmaxwinsize
-wfleep
-wgettitle
-wsettitle
-wsetwinpos
-wgetwinpos
-wsetwinsize
-wgetwinsize
-wclose
-wopen
-whichwin
-wgetmouseconfig
-wgetscrmm
-wgetscrsize
-wdone
-winit
-winitargs
-strdup
-checktimer
-wsettimer
-wtextbreak
diff --git a/Mac/Unsupported/stdwinmodule.mu.hqx b/Mac/Unsupported/stdwinmodule.mu.hqx
deleted file mode 100644 (file)
index 2a29335..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-(This file must be converted with BinHex 4.0)
-
-:$h0dC(GTEQe[C(9XC5jYG3"069"53eG*43#3""11!!!Vj9k[Bfp[E!!!!!%!!!!
-F!!!6)J!!%ci!!!"3!!!!"!!!!'J!!J!`!!)!(!G6Eh9bBf9chC!)!*!C!J!`!!)
-!+!P-D@*bBA*TCA2GN!B!N"N#!!!!!J!S#8aTBR*KFQPPFpf3"J#3(3)!+!$irr!
-!N!8"e*3!N!BbaJ!!!!%!P,DS!*!0!J!!c-`!-Xc-QC!%!$2-c*QCCQB!0-c-QCN
-c-`!ec-bCQ3!!!$E-c'CQrrm!0mc-CQE-c!!ic-aQCJ!$!!&!"J#3"!a*ER4PFQC
-KBf9-D@)!N"1X6k9!!B&cG(9LV%qP3!!#!!3!N!31Fh4NGfPZ)&"33bj-D@)!N"'
-Y6P"G!B&08%a'V8j3A3!$!!-!N!31Fh4NGfPZE@pNG@aP,Q-!N"'YFc++!B&849K
-8VA-bLJ!%!!3!N!33G'9iG'9NDA3J8&"$,NaTBJ#3$ke18)%"J8e36%DY6P#"!!8
-!!`#3"!aKE'a[BQTPBh4c,QJ!N"1Z#C!!13'!9%9B9+i*N!!j!!B!!`#3"!KMEfj
-QD@FZD!#3&kec-NF"J&4&@&5YFc*(!!G!!`#3"!GcG'4TEbjS!*!BV6qZp!#!9%9
-B9+drV[3!#%!$!*!%"hPfB@ac,QJ!N"LYXp4*!)"849K8VE2853!*3!-!N!3)Fh4
-bD@jR,QJ!N"HY2kld!)"849K8V6qZp!!+3!-!N!3(CA*bEQmZD!#3'+drV[)!J&4
-&@&5Y2klb!!X!!`#3"!PYHA"bEh4[,QJ!N"DYFc)H!B"849K8VA-b(J!-!!-!N!3
-*FQ9ZB@eP-LjS!*!@VJQ3!$N"J&4&@&5Z#C!!13!0!!-!N!3)Ef*UC@0d,QJ!N"H
-Z#C!!13'!9%9B9+i*N!!j!!i!!`#3"!P[BQTTEA"X,QJ!N"DYFc)H!B"849K8VA-
-b(J!2!!-!N!31B@0MCA0cEf*UC@0d,QJ!N"'YFc)C!B"849K8VA-b'3!3!!-!N!3
-,D@jdEf*UC@0d,QJ!N"5YFc)F!B"849K8VA-b(!!4!!-!N!3-E'pZCfpLDQ9MG#j
-S!*!6VA-b(3'!9%9B9+ec-Kd!%J!$!*!%$@CXEf&dEf*UC@0d,QJ!N"+YFc)E!B"
-849K8VA-b'`!6!!-!N!30FQ&ZCf9[BQTPBh3ZD!#3%Uec-Km"J&4&@&5YFc)I!"3
-!!`#3"!jcG(*TEQG[BQTPBh3ZD!#3%Dec-Km"J&4&@&5YFc)I!"8!!`#3"!edGA"
-XC@pLDQ9MG#jS!*!5VA-b)!'!9%9B9+ec-L!!&J!$!*!%$'aTFh4[BQTPBh3ZD!#
-3%kec-Kd"J&4&@&5YFc)G!"F!!`#3"!pYBA"`D@jREf*UC@0d,QJ!N"#YFc)G!B"
-849K8VA-b(3!B!!-!N!31E@9dD'pNEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!
-C!!-!N!31E@pNG@aPEf*UC@0d,QJ!N"'YFc)G!B"849K8VA-b(3!D!!-!N!3-CR9
-ZBfpLDQ9MG#jS!*!6VA-b(!'!9%9B9+ec-K`!'`!$!*!%$@0XBA0cEf*UC@0d,QJ
-!N"+YFc)D!B"849K8VA-b'J!F!!-!N!3-CQPXC@pLDQ9MG#jS!*!6VJQ3!$N"J&4
-&@&5Z#C!!13!G!!-!N!3+EAPYB@aXEf-ZD!#3&Dec-Ki"J&4&@&5YFc)H!"j!!`#
-3"!KcG'4XD@)ZD!#3&kdrV[3!J&4&@&5Y2kld!"m!!`#3"!aYEf4cGA"`Eh*d,QJ
-!N"1YFc)G!B"849K8VA-b(3!J3!-!N!3)Fh4NBA*R,QJ!N"HY2kqp!)"849K8V6q
-[[3!K3!-!N!3*Ah0dC'&bCbjS!*!@UX`2e`#!9%9B9+V-$pF!)J!$!*!%"f0PGQ&
-X,QJ!N"LYFc)D!B"849K8VA-b'J!M!!-!N!3+B@*cG(*KBh3ZD!#3&Dec-KN"J&4
-&@&5YFc)C!#3!!`#3"!YcHA0YEf4eE'8ZD!#3&+i*N!!j!B"849K8VJQ3!$N!*3!
-$!*!%#@eKBfGXG@8ZD!#3&UiP4G`"J&4&@&5Z*8AF!#C!"3#3"!G8HA"PFbjS!*!
-BVDdDU3#!9%9B9+fY'UN!*d!&!*!%%d0[EQ4TG'P[EQ&X6@&MFQpc,QJ!N!bY(r*
-!!)"849K8V4rb3!!S3!8!N!3(4QPXCA-ZD!#3'+`KJ-!!J&4&@&5X)B$!!#P!"3#
-3"!Y0DAKPC%e[C'8ZD!#3&+e6A-!!J&4&@&5Y8ec!!#T!"3#3"!P28e9dD@ac,QJ
-!N"DYXp8l!)"849K8VE291`!V3!8!N!3)6@9YEh*j,QJ!N"HX)B$!!)"849K8V#'
-!`!!X3!8!N!3)4ACPER4c,QJ!N"HY(r*!!)"849K8V4rb3!!Y3!8!N!3,8A9TBfY
-NFQ&h,QJ!N"5XBKT!!)"849K8V')D3!!Z3!8!N!328A9TBfYNFQ&h9'9iG#jS!*!
-3V#'!`!#!9%9B9+`KJ-!!,d!&!*!%$P0dB@jNBA*N4QPXC5jS!*!4V#'!`!#!9%9
-B9+`KJ-!!-%!&!*!%#84TB@a[Ch-ZD!#3&U`KJ-!!J&4&@&5X)B$!!$&!"3#3"!K
-&FR*[FR-ZD!#3&kdImN!!J&4&@&5Y(r*!!$*!"3#3"!G0C@jeFbjS!*!BV#'!`!#
-!9%9B9+`KJ-!!-d!&!*!%#N0[ER4bEfac,QJ!N"@X)B$!!)"849K8V#'!`!!d3!8
-!N!3*9fPZC'phFbjS!*!@V')D3!#!9%9B9+aL'N!!08!&!*!%#P4PH(4&C'Pd,QJ
-!N"@X)B$!!)"849K8V#'!`!!f!!)!N!381MSkFh4NGfPZ1NJkFh4NGfPZ,QJ!N!m
-"J&4&@&3!N!8h!!3!N!3(Ad&54e-ZD!#3'+cr2r!"J&4&@&5Xrcr`!$J!"!#3"!T
-cG'4hG'9iG#jS!*!9V2mrm3'!9%9B9+cr2r%!13!&!*!%#A*eER4TE@8ZB`#3&Ub
-[%(8"J&4&@&5XVa"e!$S!!`#3""CYGf9bDh0IF'aeCfPZAf0[EQCTCbjS!*!*VA-
-bD`'!9%9B9+ec-QX!1`!$!*!%$f0[EA"XCAK[BQTPBh3ZD!#3%+i*N!!j!B"849K
-8VJQ3!$N!2!!$!*!%#@0[BQTPBh3ZD!#3&Uec-KS"J&4&@&5YFc)D!$d!!`#3"!T
-`H@9bFQpbFbjS!*!9VA-b(`'!9%9B9+ec-Km!2J!$!*!%#P"jG'K[EN0[FQ8!N"@
-Z*RYp!B"cD'aLVLClI3!r!!-!N!3*F(PNC@*eCbjS!*!@VJQ3!$N"J&4&@&5Z#C!
-!13"!!!-!N!3,G(*KBf9LB@0V,QJ!N"5YFc)J!B"849K8VA-b)!""!!-!N!3,F(P
-dD'pZFR9Z,QJ!N"5Z#C!!13'!9%9B9+i*N!!j!%)!!`#3"!YTER4bBfKPBfXZD!#
-3&+iC64J"J&4&@&5Z'8dB!%-!!`#3"!KTEA"[FR3ZD!#3&ki*N!!j!B"849K8VJQ
-3!$N!4!!$!*!%$@*XG'PZE@pNG@aP,QJ!N"+Z#C!!13'!9%9B9+i*N!!j!!!$b!!
-'!M`!!!!r!!%!N!J#!*!&$R0dC(GTEQe[C(9XC5jM!*!D!`#3"bHY(r*!!!%!-k`
-KJ-!!!3!`V#'!`!!"!!UY2klb!!%!-DdImN!!!3!XV4rb3!!"!#LX)B$!!!%!+k`
-KJ-!!!3!bV#'!`!!"!#QY8ec!!!%!+Ufce6X!!3!YV')D3!!"!#kX)B$!!!%!,k`
-KJ-!!!3!JV6q[[3!"!!HY2kld!!%!(UdrV[3!!3!*V6qZp!!"!$@X)B$!!!%!*Uf
-Y'UN!!3!dV')D3!!"!!LYXp4*!!%!)DV-$pF!!3!fV2mrm3!"!#1YFc)C!!%!$ke
-c-KN!!3!&VJQ3!$N!!3"%VJQ3!$N!!3!LVA-b'J!"!"ZYFc)D!!%!2+ec-KS!!3!
-lVJQ3!$N!!3!'VA-b4`!"!"bZ#C!!13!"!"+YFc)E!!%!'Uec-K`!!3"$VJQ3!$N
-!!3!3VA-b(!!"!%+Z'8dB!!%!&Uec-Kd!!3!4VA-b(3!"!#@Z*8AF!!%!&kec-Kd
-!!3!BVA-b(3!"!"qYFc)G!!%!'Dec-Kd!!3!kVA-bD`!"!"fYFc)H!!%!#kec-Ki
-!!3!0VJQ3!$N!!3!1VA-b(J!"!$qZ#C!!13!"!$fYFc)I!!%!3Di*N!!j!!%!%ke
-c-Km!!3!-VJQ3!$N!!3!iV2mrm3!"!"5YFc)I!!%!*+i*N!!j!!%!3+ec-L!!!3!
-9VA-b)!!"!$HXrcr`!!%!4J")!%S!6!2R!!%!!3#3#!)!N!83G'9iG'9NDA3J8&"
-$,NaTBJ#3'!3!N!G'!%J!5J"-!qF!!3!"!*!)!J#3"3jcG'4hD@iJ8&"$,NaTBJ#
-3'J)!N!G'!%J!5J"-!qF!!3!#!*!)!J%!N!3+8(PdD'pZ3fpbC3#3(Mi!N!G'!%J
-!5J"-!qF!!3!#!*!)!J%!N!3-5@jdCA*QB@0P6'PL!*!F!3#3"di!8!"5!&3!!!!
-#!!)!N!J#!3#3"!PbG@jdD@eP,Q-!N"mj!*!(1Uec-QX!!3#3#!,HVZ!!!!%H!!!
-1@&"'E(-!N!3#hUii!!!2GJ!!!mK36(0d!*!+!4`!!!!#8&0PCrrr!*!*(!!!!3"
-38f9R!!%!!"3l!!!"!!!!+6-!!#Jc!!!#XN4'E'F!!!M14(*'FJ!!#0T*ENCX!!!
-)jNa%48B!!!Mb$h0dC(GTEQe[C(9XC5jYG3)!!!"069"53eG*43!!!$3!!%e08&*
-$9dP&!!!!0!#!!*!5VUU!+`!!%ii!!#[P#Ej*3diM!!)*bQPME$J!!!RZD@0X0!!
-!#IT#6N4-!!!+"P08-$%!!!S54P*&4J!!#KjcEQ3J!!!++RNB!*!+HAcrrb!!#cX
-!N!4jIIrr)!!1e!#3"(RP!'d!!"8-!*!%HH%!R`!!&q)!N!4ji`$L!!!JA!#3"`)
-!"J!!!!S!"!#3#c!!"J%!rrm!N!Mrr`'3"3#3""i"!3#3#*QC!!!rrcrr2rm"!*!
-%5J!"!!N'E@pZB@0[!*!F"!!S!!S"`J+!!#J!#J(#!S!!N"!"!*!%!J#3"43!!3"
-B!+i!c`(4!*!%5K-!!"df!!!!'J!$!!#CQ3#3"(rr!*!%Irm!N!4rr`#3"!S`!!3
-!!!!%!!B"#!!"!6TFN3$Q513!$Qq%BA0V)!!!!"`!N!QqbUB![XZ8!,l,V!#3"Em
-5J!#3"Em5J!!3*)!!N#M-N!J!jN$3!1C!B0f3#(rrIrm!jN#%!*!%3)F!N!3&K!!
-!S5,q!J#3"qC!d!!$16)!N"-"!,l,BJ#qbd)![`I)!!"FN3$Q513!!!!$BA0V)!!
-!!"`!N!QqbUB![XZ8!,l,V!#3"Em5J!#r&J`![a%!69"$3`%)!!%#1MU4!1C)j!!
-1Ei4KFfXJ!!!!(!#3#El+TJ#qbj3![XZX!*!&[a+!!*!&[a+!!"!NJ!#3+-b3#!$
-Q30!!jN"JhC!)Irprr`$Q3)3!N!4!K`#3"!@%!!#K)[i#!*!(jN$3!!-j-J#3%`%
-![XYL!,l,3J#r"mJ!!&b4!1C)j!!!!!0KFfXJ!!!!(!#3#El+TJ#qbj3![XZX!*!
-&[a+!!,m@$!#r%3"08%0$!3J!!3Sk1MTcG'4hD@ikK'&cDb!!!!!F!*!*[XUQ!,l
-,P!#qbk`!N!@r%S!!N!@r%S!!%#5!!*!Sc*!)!1C!d!$Q3'$GN!Krrhrr!1C!K!#
-3"%#(!*!%"B3!!+%LrJ)!N!IQ30!!!cNb!*!6!3#qbf)![XY#!,m(b!!!A*%!jNM
-N!!!!!f&cDb!!!!!F!*!*[XUQ!,l,P!#qbk`!N!@r%S!![aB-!,m4!%e33d-"B!!
-#0cT0B@028b"6GA"`Eh*d1NaTBR*KFQPPFcT5G@jdD@eP1P*eER4TE@8J8&"$1LK
-6Eh9bBf9c+6VHd%)!!J6rh@"X!E9C+3(6hZ!!!P@`!E9U)!'Y53`"dpl`!!*9X!!
-3Gb3!0"E!!%E&N!!!!3!"!!%!!3!!!!-"dpm`!*!%rpVJK!!!!!%"dpq!!"'eV!'
-MHP!"Y9NX!G2I3!!4YD`!%)98!G2J8J(6hd!!!P@`rp4a`!!!S5)"dpp`!!-a52r
-E!iJ!N!3"dq#3!!!8*b`!&#FJ!G2JfJ(6hh!!&$1Brpe#1'Mrpd!"dpq!!"'b@!!
-3Bj!!!E9C#!$rrrm!%rMN!G`"i!!"'$Sk1N0A4e9655!a,MBZ0$TTEQ0XG@4P1M!
-!%rQ8!$QN#!!!0,3!N!Rrrrm"b28i!FMd8%)!!J6rh@"X!E,EL3()p'!!!P@`!E,
-[S!'L,!J"b24`!!*9X!!4Zq3!05m!!%3#!!!"!!%!!3!"!!!!!`()p,!!N!6rfZ#
-%!!!!!3()p3!!%[Tm!CL2X!'bfi`"b26!!",kI!!4bK3"b2A5!FMd`!!#9E$re((
-!!!#K)J()p2!!!c&)rpX$L!#3"!()pK!!%pRm!"2Cm!()pPS"b26`!"2QD2rG3MK
-SrrG!!FMe!!!5pbJ!%DK3!E,ED!$rrrm!&6Fd!G%"!!!#*$T0B@028b"6GA"`Eh*
-d1NKPB@4PFR-k38j655")C@&NCA*c1J#3)ZC%%!#3"`%!$ATB*!!)"!$Q3j!!!"!
-N%!$Q48`!N"N3),`!N!AQ4B!!N!80HU3![ZJJ3*ha8!!3*"!!N!AQ4BB!N!83*)!
-!!+!F!*!9jN53!!#3#3ek@#5!#!3!jN33!"!N%!#3(J%!!!)N1NeKBdp6)&0eF("
-[FR3k5'9KC'9bFcT38%-J8h"PBfPQD@-k!*!LjN33!*!(!3!0HPJN!!J%!1C$N!!
-!%#33!1C&6!#3'4!J[!#3"HC&J!#3"3ekT!#qk#"!RI&3!"!N%!#3"HC&KJ#3"4!
-NJ!!!S"`!N"AQ4*!!!*!*$ATB*)!)"!$Q4"!!%#33!*!H!3!!!LNk6@&M6e-J8h9
-`F'pbG$T)C@&NCA*c1P9ZDACPFR0KE#")C@&NCA*c1J#3(HC%%!#3"`%!$ATB*!!
-)"!$Q3j!!!"!N%!$Q48`!N"N3),`!N!AQ4B!!N!80HU3![ZJJ3*ha8!!3*"!!N!A
-Q4BB!N!83*)!!!+!F!*!9jN53!!#3#3ek@#5!#!3!jN33!"!N%!#3(J%!!!)Q1Ne
-KBdp6)&0eF("[FR3k6'PLFQ&bD@9c1NeKBdp6)%0[E@e[EMS!N#$Q4"!!N!F"!!e
-k@#3!#!3!jN13!!!3*"!!jN9-!*!C%##m!*!&jN@!!*!&$AUN!,lS)%#Gm9!!%#3
-3!*!&jN@'!*!&%#5!!!#J(!#3&HC%N!!!N!N0HPJNJ!J%!1C%%!!3*"!!N"i"!!!
-#)6T0B@028b"6GA"`Eh*d1NaTBR*KFQPPFcT5G@jdD@eP1J#3*!%"bC!!!3IqX!!
-!!!%!$e!i*!!)"!%"b4!!%J$J!3(+c!#3'4(pM!#3"!%"b`!""rk`!!p3K!$DE@!
-!"*Lm!")!i!#3"!%"b`B!N!85!9!!!+!F!*!8!3(+%!#3#3p31#5!#!3"!FQ3!!!
-5!1!!N#!8P!!'%%eKBdp6)&"33b"-D@jVCA)!N"!%%%eKBdp6)&"33b"-D@jVCA)
-!N$!D39"36!#33'!!!!""F("X!*"!B!!!!%e06%)!N#!16'PL)%PYF'pbG#"38%-
-!N"908%a'!*!J$NaTBL"*EA"[FR3J8&"$!*!969G$4!#33'!!!!"58e*$!*"!B!!
-!!&4&@&3$,Q*SBmUV8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfpZ)%K
-PE(!!N!8G"!(+Ui!!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ8&"$!*!
-A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)&"33`#3&e4&@&3$,Q0M!*!F$%eA)%-[3bX
-V)&"33`#3&e4&@&3$,Q0`!*!F$%eA)%-[3bXV)&"33`#3&e4&@&3%,Q0`F!#3'`a
-09b"$,d-V+b"38%-!N"G849K8"#jPH(!!N$p849K8!LjS!*!G$%eA)%-[3bXV)&"
-33`#3%a!!!!"849K8!Lj`!*!G$8eA)&"KFf0KE#"38%-!N"C849K8"#j`BA-!N"X
-069FJ8'&cBf&X)&"33`#3&P4&@&3%,R"MD!#3'`a09b"$,d-V+b"38%-!N"1!!!!
-!9%9B9!BZF'0S+bX!N"N-69FJ3bp$+bXJ8&"$!*!6J!!!!&4&@&3#,R)!N"d'69F
-J8Q9k!*!G9%9B9!)ZFfKMbUY3!!-`b!!8VG!!!!&q!FUV8!!8CF!!!!,@"P"33d&
-cE@iJ5'9X!*!'(33"bUZ!!"4P`!'(PY3!N!4B3dp'!*!J%&K$6dC')%PYF'pbG#"
-38%-!N"0NEf0e!*"!B!!!!(*cFQ-!N%"J!!!!FfKXBJ#3)!j348BJ5@e`Eh*d)&"
-33`#3&A0dG@)!N#!18%9')%PYF'pbG#"38%-!N"N%,Q4[B`#31e!!!!!36@&M6e-
-J0MK,)%aTEQYPFJ#3-"T"8&"-!*"!B!!!!%&`F'`!N%"J!!!!68e-3J#3)!j-D@)
-J5@e`Eh*d)$Bi5`#3&8e36%B!N#!16'PL)%PYF'pbG#!f1%X!N"909d0%!*"!B!!
-!!%p#5L!!N#!169"A)%PYF'pbG#!f1%X!N"958e*$!*"!B!!!!&4&@&3$,Q*SBmU
-V8!!$--J!&+h3!!!"IJ(+Ue!!&'A!!!!#eJa#B@aXEfpZ)%KPE(!!N!8G"!(+Ui!
-!&'A!!BH@e!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ0MK,!*!A9%9B9!3ZBbXV!*!
-E$%eA)%-[3bXV)$Bi5`#3&e4&@&3$,Q0M!*!F$%eA)%-[3bXV)$Bi5`#3&e4&@&3
-$,Q0`!*!F$%eA)%-[3bXV)$Bi5`#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b!f1%X
-!N"G849K8"#jPH($+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abTdJjLVJ!(
-+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"&4&@&3#,QJ!N"d-69FJ3bp$+bXJ0MK
-,!*!6%!!!!&4&@&3#,R!!N"d069FJ8'&cBf&X)$Bi5`#3&P4&@&3%,R"KF`#3'`e
-09b"3BA0MB@`J0MK,!*!@9%9B9!3ZF'0S!*!E$%eA)%-[3bXV)$Bi5`#3%i!!!!"
-849K8"Lj`BfJV+`#3'3a09b"$,d-V+b!f1%X!N"1!!!!!9%9B9!)ZFJ#3(3C09b"
-5CAS!N"e849K8"#jcC@I+Ue!!!c$)!"5Yd!!!!Ai"bUY3!"4P`!!!!YB!abTdJjL
-VJ!(+VN3!%j98!!!G"!(+Ui!!&'A!!BHL2!#3"'4[Bh8!N%"J!!!!FR0bB`#33'!
-!!!"cD'aL!*!J$P"&4L"*EA"[FR3J0MKV!*!9Fh4eBJ#3)!j348BJ5@e`Eh*d)$B
-iD`#3'33ZC'pM!*!l8!!!!""AD@ic-L"i1$BJ6'PZDf9b!*!`#94&@&3#,Q-!N"d
--69FJ3bp$+bXJH$Jf!*!A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)(Ji0J#3&e4&@&3
-$,Q0`!*!F$%eA)%-[3bXV)(Ji0J#3&e4&@&3%,Q0`F!#3'`a09b"$,d-V+b"i1$B
-!N"G849K8"#j`BfJ!N"X-69FJ3bp$+bXJH$Jf!*!6J!!!!&4&@&3',R"MD#XV!*!
-C$%eA)%-[3bXV)(Ji0J#3%i!!!!"849K8!bjbB`#3(!K09b"AD@j53`#3(`3ZE'P
-L!*!E$NaTBL"*EA"[FR3JH$Jf!*!C"#j[BQS!N"X16f*U)%PYF'pbG#"i1$B!N"8
-*68-J6'PZDf9b!*!h#%e03dJ!N%4849K8!LjM!*!G#%e$)%-[3bXV!*!E9%9B9!3
-ZBfac!*!E%8e$)%0XBA0c)%0[EA"TE'9b!*!1J!!!!&4&@&3%,Q4PCJ#32e4&@&3
-%,Q4[B`#31a!!!!"849K8!LjS!*!p%!!!!&4&@&3%,R"MD!#3'`K03b"$,d-V+`#
-3&i!!!!"849K8!bjdF`#33`B!!3%!N!B8!!3"!*!(!3#3$!S!!3%!!!%"!!%!N!3
-1!!F"!!%"!!%"!!!!!3#3"-B!"`#33Mq3"%&38%`!!!'!@)!!N%)rN!3!N!P9!C!
-!!3)#H`#3"3)!!!!8!*!%!B!!N"%i!!N!N!F@EAGPFQYcAh"XG@GTEPpMEfjQD@F
-ZD!#3$!%!N!i-!!-!N!`"fJ!%!*!3!3#3r`#34&pIFh4KFR3!N(`"!!!!0J!-!*!
-(!3#3*3%!N!8"!!!!$3!#!*!1&!!$!!!"!3!!!3%$!3#3#`S!!3%"!!!"!3!"!!!
-!a!!'`J#33@PZDA4cG'4hD@i!N(J"&!!&!!%!!$,)!!!bb!!!-XJ!N!3'Fh4NGfP
-Z!*$mZJ!%!!%3Fh4NGfPZE@pNG@aP,R0XBJ#3$e"jG'KcD'aL!*"a!6q3"!#3"eF
-!VJ$U!G%"!!!!#eB!!&b4!!!!,J!#!!!!!J!#!*!S!J`!!J"3!!%!!3!"!!%!N2m
-!&#G$6d4&*b!R4%&835FJ*e"*3e3R!*$Z#J!%!*!+!3!!!#Nc!!!S-`!!!V)#hUc
-8*kS!!!!F!AS!!R"bC@B!'!!DF&CPFJ!!!8C69&)M!!!"8J5`!"!!!!!'!*!%3Li
-!(3!!!"3!N!3a%J!N!!!!5!#3"'SC!#N!!!#F!*!%9lJ!1!!!!,3!N!3JIJ")!!!
-!dJ#3"(%@!&8!!!X'!*!%EjJ!A!!!(ji!N!3+1J"T!!!IU!#3"(4#!(8!!"r!!*!
-%C[B!KJ!!(mi!N!3lkJ#4!!!Ii!#3"(c'!*d!!##U!*!%5P!!V!!!)1B!N!36#`#
-l!!!JpJ#3"'+S!-)!!#,8!*!%$qd!dJ!!)`i!N!4-P!$L!!!M(`#3""ca!1i!!#-
-h!*!%)S3!r`!!)d8!N!30XJ%+!!!N$3#3"#8#!4)!!#8P!*!%8&!"(J!!*H-!N!3
-mf`%V!!!Q&3#3"FMrr`!!+#8!N"!EJ2rr!!!!PJ#3"!p3FQpUC@0d)&CPFR0TEfi
--8(*[DQ9MG#"0DA0M"N9NDA4[FJ4'Efjd$P"bEfTPBh3J4AKdFQ&c$d0eFh4[E5"
-,CAPhEh*NF`a"Bf0PFh-J8'&dD(-'9'&bCf9d$%*eD@aN)%9iG(*KF`Xf1%XJ3fp
-NC8GPEK!f1%XJ4'PcBA0cC@eLE'9b#MBi5b"-D@jVCA),0MK,)&"bEfTPBh313bp
-$+bXJ3fpYF'PXCA)13bp$+bXJ9f&bEQPZCh-'3dC00MK,$e"KFf0KE#"$Efe`D@a
-PFJp3BA0MB@`J9f&bEQPZCh-,8&"$)%0[C'9(C@i38&"$)%4TFf&cFf9YBQaPFJT
-38%-J6'PZDf9b"e"33b"348B,8&"$)&"bEfTPBh3-8&"$3A0Y)&"KEQ9X$&*PHL"
-$Efe`D@aPFVA(:
diff --git a/Mac/Unsupported/twit/TwitCore.py b/Mac/Unsupported/twit/TwitCore.py
deleted file mode 100644 (file)
index 8cd8c0e..0000000
+++ /dev/null
@@ -1,549 +0,0 @@
-# Window-interface-independent part of twit
-import sys
-import types
-import bdb
-import types
-import os
-
-SIMPLE_TYPES=(
-       types.NoneType,
-       types.IntType,
-       types.LongType,
-       types.FloatType,
-       types.ComplexType,
-       types.StringType
-)
-
-# XXXX Mac-specific
-ICON_NORMAL=500
-ICON_RETURN=503
-ICON_CALL=504
-ICON_ZERO=505
-ICON_DEAD=506
-
-class DebuggerStuff(bdb.Bdb):
-
-       def __init__(self, parent):
-               bdb.Bdb.__init__(self)
-               self.parent = parent
-               self.exception_info = (None, None)
-               self.reason = 'Not running'
-               self.icon = ICON_NORMAL
-               self.reset()
-               
-       def reset(self):
-               bdb.Bdb.reset(self)
-               self.forget()
-       
-       def forget(self):
-               self.lineno = None
-               self.stack = []
-               self.curindex = 0
-               self.curframe = None
-               
-       def run(self, cmd, locals, globals):
-               self.reason = 'Running'
-               bdb.Bdb.run(self, cmd, locals, globals)
-               print 'RETURN from run'
-               self.reason = 'Not running'
-       
-       def setup(self, f, t):
-               self.forget()
-               self.stack, self.curindex = self.get_stack(f, t)
-               self.curframe = self.stack[self.curindex][0]
-               
-       def interaction(self, frame, traceback):
-               self.setup(frame, traceback)
-               self.parent.interact()
-               self.exception_info = (None, None)
-
-#      def user_call(self, frame, argument_list):
-#              self.reason = 'Calling'
-#              self.icon = ICON_CALL
-#              self.interaction(frame, None)
-                       
-       def user_line(self, frame):
-               self.reason = 'Stopped'
-               self.icon = ICON_NORMAL
-               self.interaction(frame, None)
-               
-       def user_return(self, frame, return_value):
-               self.reason = 'Returning'
-               self.icon = ICON_RETURN
-               self.interaction(frame, None)
-                               
-       def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
-               self.reason = 'Exception occurred'
-               self.icon = ICON_DEAD
-               self.parent.setstate('tb')
-               self.exception_info = (exc_type, exc_value)
-               self.interaction(frame, exc_traceback)
-
-       def getexception(self):
-               tp, value = self.exception_info
-               if tp <> None and type(tp) <> type(''):
-                       tp = tp.__name__
-               if value <> None and type(value) <> type(''):
-                       value = `value`
-               return tp, value
-               
-       def getstacktrace(self):
-               names, locations = [], []
-               for frame, lineno in self.stack:
-                       name = frame.f_code.co_name
-                       if not name:
-                               name = "<lambda>"
-                       elif name == '?': 
-                               name = "<not a function>"
-                       else:
-                               name = name + '()'
-                       names.append(name)
-                       
-                       if lineno == -1:
-                               lineno = getframelineno(frame)
-                               
-                       modname = getframemodname(frame)
-                       if not modname: modname = "<unknown>"   
-
-                       locations.append("%s:%d" % (modname, lineno))
-               return names, locations
-               
-       def getframe(self, number):
-               if number < 0 or number >= len(self.stack):
-                       return None
-               return self.stack[number][0]
-
-       def getframevars(self, number, show_complex=1, show_system=1):
-               frame = self.getframe(number)
-               if not frame:
-                       return [], []
-               return getvarsfromdict(frame.f_locals, show_complex, show_system)
-               
-       def getframevar(self, number, var):
-               frame = self.getframe(number)
-               return frame.f_locals[var]
-
-       def getframefilepos(self, frameno):
-               if frameno == None or frameno < 0 or frameno >= len(self.stack):
-                       return None, None, None
-               frame, line = self.stack[frameno]
-               if line == -1:
-                       line = getframelineno(frame)
-               modname = getframemodname(frame)
-               filename = frame.f_code.co_filename
-               return filename, modname, line
-
-       def getprogramstate(self):
-               return self.reason
-       
-class Application:
-       """Base code for the application"""
-       
-       def mi_init(self, sessiontype, arg):
-               self.dbg = DebuggerStuff(self)
-               self.run_dialog = self.new_stack_browser(self)
-               self.run_dialog.open()
-               self.module_dialog = None
-               self.initial_cmd = None
-               self.cur_string_name = None
-               if sessiontype == 'tb':
-                       while arg.tb_next <> None:
-                               arg = arg.tb_next
-                       self.dbg.setup(arg.tb_frame, arg)
-                       self.run_dialog.setup()
-               elif sessiontype == 'run':
-                       self.initial_cmd = arg
-                       
-       def breaks_changed(self, filename):
-               self.run_dialog.breaks_changed(filename)
-               if self.module_dialog:
-                       self.module_dialog.breaks_changed(filename)
-       
-       def to_debugger(self):
-               cmd = self.initial_cmd
-               self.initial_cmd = None
-               self.setstate('run')
-               self.switch_to_app()
-               apply(self.dbg.run, cmd)
-               self.setstate('none')
-               self.switch_to_dbg()
-               self.run_dialog.update_views()
-               if self.module_dialog:
-                       self.module_dialog.update_views()
-               
-       def interact(self):
-               # Interact with user. First, display correct info
-               self.switch_to_dbg()
-               self.run_dialog.update_views()
-               if self.module_dialog:
-                       self.module_dialog.update_views()
-               
-               # Next, go into mainloop
-               self.one_mainloop()
-               
-               # Finally (before we start the debuggee again) show state
-               self.switch_to_app()
-               self.run_dialog.show_it_running()
-               
-       def quit_bdb(self):
-               self.dbg.set_quit()
-               
-       def run(self):
-               cmd = self.AskString('Statement to execute:')
-               self.runstring(cmd)
-               
-       def runfile(self, path):
-               dir, file = os.path.split(path)
-               try:
-                       os.chdir(dir)
-               except os.error, arg:
-                       self.Message("%s: %s"%(dir, arg))
-                       return
-               ns = {'__name__':'__main__', '__file__':path}
-               cmd = "execfile('%s')"%file
-               self.runstring(cmd, ns, ns)
-               
-       def runstring(self, cmd, globals={}, locals={}):
-               self.cur_string_name = '<string: "%s">'%cmd
-               try:
-                       cmd = compile(cmd, self.cur_string_name, 'exec')
-               except SyntaxError, arg:
-                       self.Message('Syntax error: %s'%`arg`)
-                       return
-               self.initial_cmd = (cmd, globals, locals)
-               self.exit_mainloop()
-
-       def cont(self):
-               self.dbg.set_continue()
-               self.exit_mainloop()
-                               
-       def step(self, frame):
-               self.dbg.set_next(frame)
-               self.exit_mainloop()
-               
-       def step_in(self):
-               self.dbg.set_step()
-               self.exit_mainloop()
-               
-       def step_out(self, frame):
-               self.dbg.set_return(frame)
-               self.exit_mainloop()
-               
-       def kill(self):
-               self.dbg.set_quit()
-               self.exit_mainloop()
-               
-       def quit(self):
-               self.do_quit()
-               
-       def browse(self, module):
-               if not self.module_dialog:
-                       self.module_dialog = self.new_module_browser(self)
-                       self.module_dialog.open(module)
-               else:
-                       self.module_dialog.focus(module)
-       
-       def browse_var(self, var):
-               b = self.new_var_browser(self, var)
-               
-class StackBrowser:
-       """Base code for stack browser"""
-       def mi_open(self):
-               """Setup initial data structures"""
-               self.cur_stackitem = None
-               self.cur_source = None
-               self.cur_modname = None
-               self.cur_line = None
-               self.show_complex = 1
-               self.show_system = 0
-               self.setup()
-
-       # create_items(self) should create self.modules, self.vars and self.source
-       
-       def setup(self):
-               self.parent.SetWatch()
-               """Fill the various widgets with values"""
-               name, value = self.parent.dbg.getexception()
-               self.setexception(name, value)
-               self.setprogramstate(self.parent.dbg.getprogramstate())
-               
-               names, locations = self.parent.dbg.getstacktrace()
-               self.stack_setcontent(names, locations)
-               self.cur_stackitem = len(names)-1
-               self.stack_select(self.cur_stackitem)
-               self.setup_frame()
-               
-       def setup_frame(self):
-               """Setup frame-dependent widget data"""
-               self.parent.SetWatch()
-               self.cont_varnames, self.cont_varvalues = \
-                       self.parent.dbg.getframevars(self.cur_stackitem, 
-                       self.show_complex, self.show_system)
-               self.setvars()
-               self.set_var_buttons()
-       
-               msg = ""
-               if self.cur_stackitem == None:
-                       self.cur_source = None
-                       self.cur_modname = None
-                       self.cur_line = None
-                       msg = "No stackframe selected"
-               else:
-                       self.cur_source, self.cur_modname, optnextline = \
-                               self.parent.dbg.getframefilepos(self.cur_stackitem)
-                       if optnextline >= 0:
-                               self.cur_line = optnextline
-                       if self.cur_source == '<string>':
-                               self.cur_source = None
-                               msg = "Executing from unknown <string>"
-                       elif type(self.cur_source) == types.StringType and \
-                                               self.cur_source[:8] == '<string:':
-                               msg = "Executing from "+self.cur_source
-                               self.cur_source = None
-                               
-               self.setsource(msg)
-               if not self.cur_line:
-                       self.source_setline(1, ICON_ZERO)
-               else:
-                       self.source_setline(self.cur_line, self.parent.dbg.icon)
-               self.breaks_changed(self.cur_source)
-               
-               
-               self.parent.SetCursor()
-               
-       # setsource(msg) should display cur_source+content, or msg if None
-       
-       def show_it_running(self):
-               self.setprogramstate("Running")
-
-       def update_views(self):
-               self.setup()
-
-       def click_stack(self, number, *dummy):
-               if number == self.cur_stackitem: return
-               self.cur_stackitem = number
-               self.stack_select(self.cur_stackitem)
-               self.setup_frame()
-                               
-       def click_var(self, var, *dummy):
-               v = self.parent.dbg.getframevar(self.cur_stackitem, var)
-               self.parent.browse_var(v)
-               
-       def click_source(self, lineno, inborder):
-               if not inborder:
-                       self.source_select(lineno)
-                       self.cur_line = lineno
-               if lineno == None or not self.cur_source or not inborder:
-                       return
-               if self.parent.dbg.get_break(self.cur_source, lineno):
-                       self.parent.dbg.clear_break(self.cur_source, lineno)
-               else:
-                       self.parent.dbg.set_break(self.cur_source, lineno)
-               self.parent.breaks_changed(self.cur_source)
-               
-       def breaks_changed(self, filename):
-               if filename == self.cur_source:
-                       list = self.parent.dbg.get_file_breaks(filename)
-                       self.source_setbreaks(list)
-               
-       def click_quit(self):
-               self.parent.quit()
-               
-       def click_run(self):
-               self.parent.run()
-               
-       def click_continue(self):
-               self.parent.cont()
-               
-       def click_step(self):
-               if self.cur_stackitem <> None:
-                       frame = self.parent.dbg.getframe(self.cur_stackitem)
-                       self.parent.step(frame)
-               else:
-                       self.parent.step_in()
-               
-       def click_step_in(self):
-               self.parent.step_in()
-               
-       def click_step_out(self):
-               if self.cur_stackitem <> None:
-                       frame = self.parent.dbg.getframe(self.cur_stackitem)
-                       self.parent.step_out(frame)
-               else:
-                       self.parent.step_in()
-                       
-       def click_kill(self):
-               self.parent.kill()
-               
-       def click_browse(self):
-               self.parent.browse(self.cur_modname)
-               
-       def click_edit(self):
-               lino = self.cur_line
-               if not lino:
-                       lino = 1
-               if self.cur_source:
-                       self.parent.edit(self.cur_source, lino)
-
-class ModuleBrowser:
-       """Base code for a module-browser"""
-
-       def mi_open(self, module):
-               """Setup initial data structures"""
-               self.cur_module = module
-               self.cur_source = None
-               self.cur_line = None
-               self.cont_modules = []
-               self.value_windows = []
-               self.setup()
-
-       # create_items(self) should create self.modules, self.vars and self.source
-       
-       def setup(self):
-               """Fill the various widgets with values"""
-               self.parent.SetWatch()
-               modnames = getmodulenames()
-               if not self.cur_module in modnames:
-                       self.cur_module = None
-               if modnames <> self.cont_modules:
-                       self.cont_modules = modnames
-                       self.setmodulenames()
-               if self.cur_module:
-                       self.module_select(self.cont_modules.index(self.cur_module))
-               else:
-                       self.module_select(None)
-               self.setup_module()
-               
-       def setup_module(self):
-               """Setup module-dependent widget data"""
-               self.parent.SetWatch()
-               if not self.cur_module:
-                       self.cont_varnames = []
-                       self.cont_varvalues = []
-               else:
-                       self.cont_varnames, self.cont_varvalues = getmodulevars(self.cur_module)
-               self.setvars()
-                       
-               msg = ""
-               if not self.cur_module:
-                       self.cur_source = None
-                       msg = "No module selected"
-               else:
-                       m = sys.modules[self.cur_module]
-                       try:
-                               self.cur_source = m.__file__
-                       except AttributeError:
-                               self.cur_source = None
-                               msg = "Not a python module"
-               self.cur_lineno = 0     
-               self.setsource(msg)
-               self.source_select(self.cur_line)
-               self.breaks_changed(self.cur_source)
-               
-               self.parent.SetCursor()
-
-       # setsource(msg) should display cur_source+content, or msg if None
-       
-       def update_views(self):
-               self.setup_module()
-       
-       def click_module(self, module, *dummy):
-               if not module or module == self.cur_module: return
-               self.focus(module)
-               
-       def focus(self, module):
-               self.cur_module = module
-               self.setup()
-               
-       def click_var(self, var, *dummy):
-               if not var: return
-               m = sys.modules[self.cur_module]
-               dict = m.__dict__
-               self.parent.browse_var(dict[var])
-                               
-       def click_source(self, lineno, inborder):
-               if not inborder:
-                       self.source_select(lineno)
-                       self.cur_lineno = lineno
-               if lineno == None or not self.cur_source or not inborder:
-                       return
-               if self.parent.dbg.get_break(self.cur_source, lineno):
-                       self.parent.dbg.clear_break(self.cur_source, lineno)
-               else:
-                       self.parent.dbg.set_break(self.cur_source, lineno)
-               self.parent.breaks_changed(self.cur_source)
-               
-       def breaks_changed(self, filename):
-               if filename == self.cur_source:
-                       list = self.parent.dbg.get_file_breaks(filename)
-                       self.source_setbreaks(list)
-               
-       def click_edit(self):
-               lino = self.cur_lineno
-               if not lino:
-                       lino = 1
-               if self.cur_source:
-                       self.parent.edit(self.cur_source, lino)
-               
-                       
-def getmodulenames():
-       """Return a list of all current modules, sorted"""
-       list = sys.modules.keys()[:]
-       list.sort()
-       return list
-       
-def getmodulevars(name):
-       """For given module return lists with names and values"""
-       m = sys.modules[name]
-       try:
-               dict = m.__dict__
-       except AttributeError:
-               dict = {}
-       return getvarsfromdict(dict)
-       
-def getvarsfromdict(dict, show_complex=1, show_system=1):
-       allnames = dict.keys()[:]
-       allnames.sort()
-       names = []
-       for n in allnames:
-               if not show_complex:
-                       if not type(dict[n]) in SIMPLE_TYPES:
-                               continue
-               if not show_system:
-                       if n[:2] == '__' and n[-2:] == '__':
-                               continue
-               names.append(n)
-       values = []
-       for n in names:
-               v = pretty(dict[n])
-               values.append(v)
-       return names, values
-       
-def pretty(var):
-       t = type(var)
-       if t == types.FunctionType: return '<function>'
-       if t == types.ClassType: return '<class>'
-       return `var`
-       
-def getframelineno(frame):
-       """Given a frame return the line number"""
-       return getcodelineno(frame.f_code)
-       
-def getfunclineno(func):
-       """Given a function return the line number"""
-       return getcodelineno(func.func_code)
-       
-def getcodelineno(cobj):
-       """Given a code object return the line number"""
-       code = cobj.co_code
-       lineno = -1
-       if ord(code[0]) == 127: # SET_LINENO instruction
-               lineno = ord(code[1]) | (ord(code[2]) << 8)
-       return lineno
-
-def getframemodname(frame):
-       """Given a frame return the module name"""
-       globals = frame.f_globals
-       if globals.has_key('__name__'):
-               return globals['__name__']
-       return None
diff --git a/Mac/Unsupported/twit/mac_widgets.py b/Mac/Unsupported/twit/mac_widgets.py
deleted file mode 100644 (file)
index d52748b..0000000
+++ /dev/null
@@ -1,317 +0,0 @@
-from FrameWork import *
-import Win
-import Qd
-import Controls
-import Ctl
-import TE
-import List
-import os
-import string
-import macfs
-
-SCROLLBAR=16
-MARGIN=2
-ICONSIZE=16
-TEXTWIDTH=4096 # More-or-less random value
-
-TEXTFONT=4
-TEXTSIZE=9
-
-# Resource numbers
-PIC_CURRENT=500
-PIC_BREAK=501
-
-picture_cache={}
-
-class MT_TextWidget:
-       def __init__(self, wid, r):
-               self.wid = wid
-               self.rect = r
-               left, top, right, bottom = r
-               self.terect = left+MARGIN+ICONSIZE, top+MARGIN, \
-                               right-(MARGIN+SCROLLBAR), bottom-(MARGIN+SCROLLBAR)
-               dr = self.terect[0], self.terect[1], TEXTWIDTH, self.terect[3]
-               Qd.SetPort(wid)
-               Qd.TextFont(TEXTFONT)
-               Qd.TextSize(TEXTSIZE)
-               self.ted = TE.TENew(dr, self.terect)
-               self.ted.TEAutoView(1)
-               self.activate(1)
-               
-               rect = right-SCROLLBAR, top, right, bottom-SCROLLBAR+1
-               self.bary = Ctl.NewControl(self.wid, rect, "", 1, 0, 0, 0, 16, 0)
-               rect = left, bottom-SCROLLBAR, right-SCROLLBAR+1, bottom
-               self.barx = Ctl.NewControl(self.wid, rect, "", 1, 0, 0, 0, 16, 0)
-               
-               self.have_data = 0
-               self.line_index = []
-               
-       def close(self):
-               del self.barx
-               del self.bary
-               del self.ted
-               
-       def scrollbars(self):
-               pass
-               
-       def setcontent(self, file):
-               self.line_index = []
-               if file == None:
-                       data = ''
-                       self.have_data = 0
-               else:
-                       try:
-                               fp = open(file, 'rb') # NOTE the binary
-                               data = fp.read()
-                               self.have_data = 1
-                       except IOError, arg:
-                               data = 'Cannot open file:\r'+`arg`
-                               self.have_data = 0
-               if len(data) > 32767:
-                       self.have_data = 0
-                       data = 'File too big'
-               self.ted.TESetText(data)
-               if self.have_data:
-                       cur = 0
-                       while 1:
-                               self.line_index.append(cur)
-                               try:
-                                       cur = string.index(data, '\r', cur+1)
-                               except ValueError:
-                                       break
-                       self.line_index.append(len(data))
-               self.wid.InvalWindowRect(self.rect)
-               self.ted.TESetSelect(0,0)
-               self.ted.TECalText()
-               self.ted.TESelView()
-               self.setscrollbars()
-               
-       def setscrollbars(self):
-               docleft, doctop, docright, docbot = self.ted.destRect
-               winleft, wintop, winright, winbot = self.ted.viewRect
-               docbot = self.ted.nLines*self.ted.lineHeight + doctop
-               self.setbar(self.barx, docleft, docright, winleft, winright)
-               self.setbar(self.bary, doctop, docbot, wintop, winbot)
-               
-       def setbar(self, bar, minmin, maxmax, curmin, curmax):
-               if maxmax-minmin > 32767 or (curmin <= minmin and curmax >= maxmax):
-                       bar.SetControlMinimum(0)
-                       bar.SetControlMaximum(0)
-                       bar.SetControlValue(0)
-                       return
-               bar.SetControlMinimum(minmin)
-               bar.SetControlMaximum(maxmax-(curmax-curmin))
-               bar.SetControlValue(curmin)
-
-       def update(self, rgn):
-               Qd.EraseRect(self.terect)
-               Qd.FrameRect(self.rect)
-               self.ted.TEUpdate(self.terect)
-               
-       def activate(self, onoff):
-               if onoff:
-                       self.ted.TEActivate()
-               else:
-                       self.ted.TEDeactivate()
-
-       def select(self, line):
-               if line == None or line <= 0 or not self.have_data:
-                       self.ted.TESetSelect(0,0)
-               else:
-                       line = line - 1
-                       if line > len(self.line_index)-1: line = len(self.line_index)-1
-                       if line == 1:
-                               self.ted.TESetSelect(0, self.line_index[1])
-                       else:
-                               self.ted.TESetSelect(self.line_index[line]+1, self.line_index[line+1])
-               self.setscrollbars()
-               
-       def click(self, where, modifiers):
-               # First check scrollbars
-               ctltype, control = Ctl.FindControl(where, self.wid)
-               if ctltype and control:
-                       partcode = control.TrackControl(where)
-                       if partcode:
-                               self.controlhit(control, partcode)
-                       return None, 0
-               off = self.ted.TEGetOffset(where)
-               inborder = where[0] < self.terect[0]
-               l, t, r, b = self.terect
-               if l <= where[0] <= r and t <= where[1] <= b or inborder:
-                       return self.offsettoline(off), inborder
-               return None, 0  # In the grow box or something.
-               
-       def offsettoline(self, offset):
-               for i in range(len(self.line_index)):
-                       if offset < self.line_index[i]:
-                               return i   # Not i-1: 1-based line numbers in files
-               return None
-
-       def controlhit(self, control, partcode):
-               if partcode <> Controls.inThumb:
-                       if control == self.barx:
-                               if partcode == Controls.inUpButton:
-                                       delta = -10
-                               if partcode == Controls.inDownButton:
-                                       delta = 10
-                               if partcode == Controls.inPageUp:
-                                       delta = 10-(self.terect[2]-self.terect[0])
-                               if partcode == Controls.inPageDown:
-                                       delta = (self.terect[2]-self.terect[0])-10
-                               old = control.GetControlValue()
-                               control.SetControlValue(old+delta)
-                       if control == self.bary:
-                               if partcode == Controls.inUpButton:
-                                       delta = -self.ted.lineHeight
-                               if partcode == Controls.inDownButton:
-                                       delta = self.ted.lineHeight
-                               if partcode == Controls.inPageUp:
-                                       delta = self.ted.lineHeight-(self.terect[3]-self.terect[1])
-                               if partcode == Controls.inPageDown:
-                                       delta = (self.terect[3]-self.terect[1])-self.ted.lineHeight
-                               old = control.GetControlValue()
-                               control.SetControlValue(old+delta)
-               newx = self.barx.GetControlValue()
-               newy = self.bary.GetControlValue()
-               oldx = self.ted.viewRect[0]
-               oldy = self.ted.viewRect[1]
-               self.ted.TEPinScroll(oldx-newx, oldy-newy)
-               self.setscrollbars() # XXXX Bibbert, maar hoe anders?
-                       
-class MT_IconTextWidget(MT_TextWidget):
-       def __init__(self, wid, r):
-               MT_TextWidget.__init__(self, wid, r)
-               self.breakpointlist = []
-               self.curline = None
-               self.iconrect = (self.rect[0]+1, self.rect[1]+1, 
-                               self.terect[0]-1, self.rect[3]-SCROLLBAR)
-               self.curlinerange = (self.terect[1]+self.ted.lineHeight,
-                               self.terect[3]-2*self.ted.lineHeight)
-               self.piccurrent = PIC_CURRENT
-               
-       def setbreaks(self, list):
-               self.breakpointlist = list[:]
-               Qd.SetPort(self.wid)
-               self.wid.InvalWindowRect(self.iconrect)
-               
-       def setcurline(self, line, pic=PIC_CURRENT):
-               self.curline = line
-               self.piccurrent = pic
-               Qd.SetPort(self.wid)
-               self.showline(line)
-
-       def showline(self, line):
-               if line <= 0: line = 1
-               if line >= len(self.line_index): line = len(self.line_index)-1
-               if line < 0: return
-               off = self.line_index[line]
-               x, y = self.ted.TEGetPoint(off)
-               if self.curlinerange[0] <= y <= self.curlinerange[1]:
-                       return # It is in view
-               middle = (self.curlinerange[0]+self.curlinerange[1])/2
-               self.ted.TEPinScroll(0, middle-y) # Of andersom?
-               self.setscrollbars()
-               
-       def setscrollbars(self):
-               MT_TextWidget.setscrollbars(self)
-               self.wid.InvalWindowRect(self.iconrect)
-                               
-       def update(self, rgn):
-               MT_TextWidget.update(self, rgn)
-               self.drawallicons()
-               
-       def drawallicons(self):
-               Qd.EraseRect(self.iconrect)
-               Qd.MoveTo(self.iconrect[2], self.iconrect[1])
-               Qd.LineTo(self.iconrect[2], self.iconrect[3])
-               topoffset = self.ted.TEGetOffset((self.terect[0], self.terect[1]))
-               botoffset = self.ted.TEGetOffset((self.terect[0], self.terect[3]))
-               topline = self.offsettoline(topoffset)
-               botline = self.offsettoline(botoffset)
-               if topline == None: topline = 1 # ???
-               if botline == None: botline = len(self.line_index)
-               for i in self.breakpointlist:
-                       if topline <= i <= botline:
-                               self.draw1icon(i, PIC_BREAK)
-               if self.curline <> None and topline <= self.curline <= botline:
-                       self.draw1icon(self.curline, self.piccurrent)
-                       
-       def draw1icon(self, line, which):
-               offset = self.line_index[line]
-               botx, boty = self.ted.TEGetPoint(offset)
-               rect = self.rect[0]+2, boty-self.ted.lineHeight, \
-                       self.rect[0]+ICONSIZE-2, boty
-               if not picture_cache.has_key(which):
-                       picture_cache[which] = Qd.GetPicture(which)
-               self.drawicon(rect, picture_cache[which])
-               
-       def drawicon(self, rect, which):
-               Qd.DrawPicture(which, rect)
-
-class MT_IndexList:
-       def __init__(self, wid, rect, width):
-               # wid is the window (dialog) where our list is going to be in
-               # rect is it's item rectangle (as in dialog item)
-               self.rect = rect
-               rect2 = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-1
-               self.list = List.LNew(rect2, (0, 0, width, 0), (0,0), 0, wid,
-                                       0, 1, 0, 1)
-               self.wid = wid
-               self.width = width
-       
-       def setcontent(self, *content):
-               self.list.LDelRow(0, 1)
-               self.list.LSetDrawingMode(0)
-               self.list.LAddRow(len(content[0]), 0)
-               for x in range(len(content)):
-                       column = content[x]
-                       for y in range(len(column)):
-                               self.list.LSetCell(column[y], (x, y))
-               self.list.LSetDrawingMode(1)
-               self.wid.InvalWindowRect(self.rect)
-
-       def deselectall(self):
-               while 1:
-                       ok, pt = self.list.LGetSelect(1, (0,0))
-                       if not ok: return
-                       self.list.LSetSelect(0, pt)
-                       
-       def select(self, num):
-               self.deselectall()
-               if num < 0:
-                       return
-               for i in range(self.width):
-                       self.list.LSetSelect(1, (i, num))
-                       
-       def click(self, where, modifiers):
-               is_double = self.list.LClick(where, modifiers)
-               ok, (x, y) = self.list.LGetSelect(1, (0, 0))
-               if ok:
-                       return y, is_double
-               else:
-                       return None, is_double
-                       
-       # draw a frame around the list, List Manager doesn't do that
-       def drawframe(self):
-               Qd.SetPort(self.wid)
-               Qd.FrameRect(self.rect)
-               
-       def update(self, rgn):
-               self.drawframe()
-               self.list.LUpdate(rgn)
-               
-       def activate(self, onoff):
-               self.list.LActivate(onoff)
-               
-class MT_AnyList(MT_IndexList):
-
-       def click(self, where, modifiers):
-               is_double = self.list.LClick(where, modifiers)
-               ok, (x, y) = self.list.LGetSelect(1, (0, 0))
-               if ok:
-                       self.select(y)
-                       field0 = self.list.LGetCell(1000,(0,y))
-               else:
-                       field0 = None
-               return field0, is_double
-       
diff --git a/Mac/Unsupported/twit/mactwit_app.py b/Mac/Unsupported/twit/mactwit_app.py
deleted file mode 100644 (file)
index 8c568df..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-import FrameWork
-import MiniAEFrame
-import EasyDialogs
-import AE
-import AppleEvents
-import Res
-import sys
-import Qd
-import Evt
-import Events
-import Dlg
-import Win
-import Menu
-import TwitCore
-import mactwit_mod
-import mactwit_stack
-import mactwit_browser
-import mactwit_edit
-import macfs
-import string
-
-# Resource-id (for checking existence)
-ID_MODULES=500
-
-ID_ABOUT=502
-
-_arrow = Qd.qd.arrow
-_watch = Qd.GetCursor(4).data
-
-class Twit(FrameWork.Application, TwitCore.Application, MiniAEFrame.AEServer):
-       """The twit main class - mac-dependent part"""
-
-       def __init__(self, sessiontype, arg=None):
-               # First init menus, etc.
-               self.app_menu_bar = Menu.GetMenuBar()
-               FrameWork.Application.__init__(self)
-               MiniAEFrame.AEServer.__init__(self)
-               AE.AESetInteractionAllowed(AppleEvents.kAEInteractWithAll)
-               self.installaehandler('aevt', 'odoc', self.ae_open_doc)
-               self.installaehandler('aevt', 'quit', self.do_quit)
-               self.installaehandler('pyth', 'EXEC', self.do_bbpyexec) # BBpy execute event
-
-               self.dbg_menu_bar = Menu.GetMenuBar()
-               self.setstate(sessiontype)
-               self._quitting = 0
-               self.real_quit = 0
-               self.window_aware = 1
-
-               # Next create our dialogs
-               self.mi_init(sessiontype, arg)
-               while 1:
-                       if self.real_quit:
-                               break
-                       if self.initial_cmd:
-                               self.to_debugger()      # Will get to mainloop via debugger
-                       else:
-                               self.one_mainloop()     # Else do it ourselves.
-                               
-       def switch_to_app(self):
-               if not self.window_aware:
-                       return
-               self.dbg_menu_bar = Menu.GetMenuBar()
-               Menu.SetMenuBar(self.app_menu_bar)
-               Menu.DrawMenuBar()
-               
-       def switch_to_dbg(self):
-               if not self.window_aware:
-                       return
-               self.app_menu_bar = Menu.GetMenuBar()
-               Menu.SetMenuBar(self.dbg_menu_bar)
-               Menu.DrawMenuBar()
-               self.run_dialog.force_redraw()
-               if self.module_dialog:
-                       self.module_dialog.force_redraw()
-
-       def makeusermenus(self):
-               self.filemenu = m = FrameWork.Menu(self.menubar, "Debug")
-               self._openitem = FrameWork.MenuItem(m, "Run File...", "O", self.do_open)
-               self._runitem = FrameWork.MenuItem(m, "Run String...", "R", self.do_run)
-               FrameWork.Separator(m)
-               self._awareitem = FrameWork.MenuItem(m, "Window-aware", "", self.do_aware)
-               self._awareitem.check(1)
-               FrameWork.Separator(m)
-               self._quititem = FrameWork.MenuItem(m, "Quit", "Q", self.do_quit)
-               
-               self.controlmenu = m = FrameWork.Menu(self.menubar, "Control")
-               self._stepitem = FrameWork.MenuItem(m, "Step Next", "N", self.do_step)
-               self._stepinitem = FrameWork.MenuItem(m, "Step In", "S", self.do_stepin)
-               self._stepoutitem = FrameWork.MenuItem(m, "Step Out", "U", self.do_stepout)
-               self._continueitem = FrameWork.MenuItem(m, "Continue", "G", self.do_continue)
-               FrameWork.Separator(m)
-               self._killitem = FrameWork.MenuItem(m, "Kill", "K", self.do_kill)
-               
-       def setstate(self, state):
-               self.state = state
-               if state == 'run':
-                       self._stepitem.enable(1)
-                       self._stepoutitem.enable(1)
-                       self._stepinitem.enable(1)
-                       self._continueitem.enable(1)
-                       self._killitem.enable(1)
-               else:
-                       self._stepitem.enable(0)
-                       self._stepoutitem.enable(0)
-                       self._stepinitem.enable(0)
-                       self._continueitem.enable(0)
-                       self._killitem.enable(0)
-                       
-       def asknewsession(self):
-               if self.state == 'none':
-                       return 1
-               if EasyDialogs.AskYesNoCancel("Abort current debug session?") == 1:
-                       self.quit_bdb()
-                       return 1
-               return 0
-
-       def do_about(self, id, item, window, event):
-               import time
-               d = Dlg.GetNewDialog(ID_ABOUT, -1)
-               if not d:
-                       return
-               w = d.GetDialogWindow()
-               port = w.GetWindowPort()
-               l, t, r, b = port.portRect
-               sl, st, sr, sb = Qd.qd.screenBits.bounds
-               x = ((sr-sl) - (r-l)) / 2
-               y = ((sb-st-16) - (b-t)) / 5
-               w.MoveWindow(x, y, 0)
-               w.ShowWindow()
-               d.DrawDialog()
-               
-               tp, h, rect = d.GetDialogItem(2)
-               x0, y0, x1, y1 = rect
-               ybot = y0 + 32
-               
-               rgn = Qd.NewRgn()
-               Qd.SetPort(d)
-               ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, 1)
-               if ok: return
-               (what, message, when, where, modifiers) = event
-               delta_t = 128
-               nexttime = when+delta_t
-               while ybot < y1:
-                       # Do the animation, if it is time
-                       if when > nexttime:
-                               Qd.ScrollRect((x0, y0, x1, ybot), 0, 1, rgn)
-                               y0 = y0 + 1
-                               ybot = ybot + 1
-                               # And update next time
-                               delta_t = int(delta_t*0.6)-1
-                               if delta_t < 0:
-                                       delta_t = 0
-                               nexttime = when + delta_t
-                       # Check for an event.
-                       ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, 0)
-                       if ok: return
-                       (what, message, when, where, modifiers) = evt
-               while 1:
-                       ok, evt = self.getevent(Events.mDownMask|Events.keyDownMask, -1)
-                       if ok: return
-                       
-       def do_open(self, *args):
-               if not self.asknewsession():
-                       return
-               fss, ok = macfs.StandardGetFile('TEXT')
-               if not ok: return
-               self.runfile(fss.as_pathname())
-               
-       def ae_open_doc(self, object=None, **args):
-               if not object: return
-               if self.state <> 'none':
-                       if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0:
-                               if not self.asknewsession():
-                                       return
-               if type(object) == type([]):
-                       object = object[0]
-               fss, changed = object.Resolve()
-               self.runfile(fss.as_pathname())
-               
-       def do_bbpyexec(self, object=None, NAME=None, **args):
-               if type(object) <> type(''):
-                       if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0:
-                               EasyDialogs.Message('EXEC AppleEvent arg should be a string')
-                       return
-               if self.state <> 'none':
-                       if AE.AEInteractWithUser(AppleEvents.kAEDefaultTimeout) == 0:
-                               if not self.asknewsession():
-                                       return
-               stuff = string.splitfields(object, '\r')
-               stuff = string.joinfields(stuff, '\n')
-               self.runstring(stuff)
-                       
-       def do_run(self, *args):
-               if not self.asknewsession():
-                       return
-               self.run()
-               
-       def do_aware(self, *args):
-               self.window_aware = not self.window_aware
-               self._awareitem.check(self.window_aware)
-               
-       def do_quit(self, *args):
-               self._quit()                    # Signal FrameWork.Application to stop
-               self.real_quit = 1
-               self.quit_bdb()                 # Tell debugger to quit.
-
-       def do_step(self, *args):
-               self.run_dialog.click_step()
-               
-       def do_stepin(self, *args):
-               self.run_dialog.click_step_in()
-               
-       def do_stepout(self, *args):
-               self.run_dialog.click_step_out()
-               
-       def do_continue(self, *args):
-               self.run_dialog.click_continue()
-               
-       def do_kill(self, *args):
-               self.run_dialog.click_kill()
-                                       
-       def exit_mainloop(self):
-               self._quit()                    # Signal FrameWork.Application to stop
-               self.real_quit = 0
-               
-       def one_mainloop(self):
-               self.quitting = 0
-               self.mainloop()
-
-       def SetCursor(self):
-               Qd.SetCursor(_arrow)
-       
-       def SetWatch(self):
-               Qd.SetCursor(_watch)
-               
-       def AskString(self, *args):
-               return apply(EasyDialogs.AskString, args)
-               
-       def Message(self, *args):
-               return apply(EasyDialogs.Message, args)
-
-       def new_module_browser(self, parent):
-               return mactwit_mod.ModuleBrowser(parent)
-               
-       def new_stack_browser(self, parent):
-               return mactwit_stack.StackBrowser(parent)
-               
-       def new_var_browser(self, parent, var):
-               return mactwit_browser.VarBrowser(parent).open(var)
-       
-       def edit(self, file, line):
-               return mactwit_edit.edit(file, line)
-       
-               
-def Initialize():
-       try:
-               # if this doesn't raise an error, we are an applet containing the 
-               # necessary resources or we have been initialized already
-               # so we don't have to bother opening the resource file
-               dummy = Res.GetResource('DLOG', ID_MODULES)
-       except Res.Error:
-               try:
-                       Res.FSpOpenResFile("Twit.rsrc", 1)
-               except Res.Error, arg:
-                       EasyDialogs.Message("Cannot open Twit.rsrc: "+arg[1])
-                       sys.exit(1)
-
diff --git a/Mac/Unsupported/twit/mactwit_browser.py b/Mac/Unsupported/twit/mactwit_browser.py
deleted file mode 100644 (file)
index 070de43..0000000
+++ /dev/null
@@ -1,429 +0,0 @@
-"""A simple Mac-only browse utility to peek at the inner data structures of Python."""
-# Minor modifications by Jack to facilitate incorporation in twit.
-
-# june 1996
-# Written by Just van Rossum <just@knoware.nl>, please send comments/improvements.
-# Loosely based on Jack Jansens's PICTbrowse.py, but depends on his fabulous FrameWork.py
-# XXX Some parts are *very* poorly solved. Will fix. Guido has to check if all the
-# XXX "python-peeking" is done correctly. I kindof reverse-engineered it ;-)
-
-# disclaimer: although I happen to be the brother of Python's father, programming is
-# not what I've been trained to do. So don't be surprised if you find anything that's not 
-# as nice as it could be...
-
-# XXX to do:
-# Arrow key support
-# Copy & Paste? 
-# MAIN_TEXT item should not contain (type); should be below or something. 
-# MAIN_TEXT item should check if a string is binary or not: convert to '/000' style
-# or convert newlines. 
-
-version = "1.0"
-
-import FrameWork
-import EasyDialogs
-import Dlg
-import Res
-import Qd
-import List
-import sys
-from Types import *
-from QuickDraw import *
-import string
-import time
-import os
-
-# The initial object to start browsing with. Can be anything, but 'sys' makes kindof sense.
-start_object = sys
-
-# Resource definitions
-ID_MAIN = 503
-NUM_LISTS = 4  # the number of lists used. could be changed, but the dlg item numbers should be consistent
-MAIN_TITLE = 3 # this is only the first text item, the other three ID's should be 5, 7 and 9
-MAIN_LIST = 4  # this is only the first list, the other three ID's should be 6, 8 and 10
-MAIN_TEXT = 11
-MAIN_LEFT = 1
-MAIN_RIGHT = 2
-MAIN_RESET = 12
-MAIN_CLOSE = 13
-MAIN_LINE = 14
-
-def Initialize():
-       # this bit ensures that this module will also work as an applet if the resources are
-       # in the resource fork of the applet
-       # stolen from Jack, so it should work(?!;-)
-       try:
-               # if this doesn't raise an error, we are an applet containing the necessary resources
-               # so we don't have to bother opening the resource file
-               dummy = Res.GetResource('DLOG', ID_MAIN)
-       except Res.Error:
-               savewd = os.getcwd()
-               ourparentdir = os.path.split(openresfile.func_code.co_filename)[0]
-               os.chdir(ourparentdir)          
-               try:
-                       Res.FSpOpenResFile("mactwit_browse.rsrc", 1)
-               except Res.Error, arg:
-                       EasyDialogs.Message("Cannot open mactwit_browse.rsrc: "+arg[1])
-                       sys.exit(1)
-               os.chdir(savewd)
-
-def main():
-       Initialize()
-       PythonBrowse()
-
-# this is all there is to it to make an application. 
-class PythonBrowse(FrameWork.Application):
-       def __init__(self):
-               FrameWork.Application.__init__(self)
-               VarBrowser(self).open(start_object)
-               self.mainloop()
-       
-       def do_about(self, id, item, window, event):
-               EasyDialogs.Message(self.__class__.__name__ + " version " + version + "\rby Just van Rossum")
-       
-       def quit(self, *args):
-               raise self
-
-class MyList:
-       def __init__(self, wid, rect, itemnum):
-               # wid is the window (dialog) where our list is going to be in
-               # rect is it's item rectangle (as in dialog item)
-               # itemnum is the itemnumber in the dialog
-               self.rect = rect
-               rect2 = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-1             # Scroll bar space, that's 15 + 1, Jack!
-               self.list = List.LNew(rect2, (0, 0, 1, 0), (0,0), 0, wid,
-                                       0, 1, 0, 1)
-               self.wid = wid
-               self.active = 0
-               self.itemnum = itemnum
-       
-       def setcontent(self, content, title = ""):
-               # first, gather some stuff
-               keylist = []
-               valuelist = []
-               thetype = type(content)
-               if thetype == DictType:
-                       keylist = content.keys()
-                       keylist.sort()
-                       for key in keylist:
-                               valuelist.append(content[key])
-               elif thetype == ListType:
-                       keylist = valuelist = content
-               elif thetype == TupleType:
-                       
-                       keylist = valuelist = []
-                       for i in content:
-                               keylist.append(i)
-               else:
-                       # XXX help me! is all this correct? is there more I should consider???
-                       # XXX is this a sensible way to do it in the first place????
-                       # XXX I'm not familiar enough with Python's guts to be sure. GUIDOOOOO!!!
-                       if hasattr(content, "__dict__"):
-                               keylist = keylist + content.__dict__.keys()
-                       if hasattr(content, "__methods__"):
-                               keylist = keylist + content.__methods__
-                       if hasattr(content, "__members__"):
-                               keylist = keylist + content.__members__
-                       if hasattr(content, "__class__"):
-                               keylist.append("__class__")
-                       if hasattr(content, "__bases__"):
-                               keylist.append("__bases__")
-                       if hasattr(content, "__name__"):
-                               title = content.__name__
-                               if "__name__" not in keylist:
-                                       keylist.append("__name__")
-                       keylist.sort()
-                       for key in keylist:
-                               valuelist.append(getattr(content, key))
-               if content <> None:
-                       title = title + "\r" + cleantype(content)
-               # now make that list!
-               tp, h, rect = self.wid.GetDialogItem(self.itemnum - 1)
-               Dlg.SetDialogItemText(h, title[:255])
-               self.list.LDelRow(0, 1)
-               self.list.LSetDrawingMode(0)
-               self.list.LAddRow(len(keylist), 0)
-               for i in range(len(keylist)):
-                       self.list.LSetCell(str(keylist[i]), (0, i))
-               self.list.LSetDrawingMode(1)
-               self.list.LUpdate(self.wid.GetWindowPort().visRgn)
-               self.content = content
-               self.keylist = keylist
-               self.valuelist = valuelist
-               self.title = title
-       
-       # draw a frame around the list, List Manager doesn't do that
-       def drawframe(self):
-               Qd.SetPort(self.wid)
-               Qd.FrameRect(self.rect)
-               rect2 = Qd.InsetRect(self.rect, -3, -3)
-               save = Qd.GetPenState()
-               Qd.PenSize(2, 2)
-               if self.active:
-                       Qd.PenPat(Qd.qd.black)
-               else:
-                       Qd.PenPat(Qd.qd.white)
-               # draw (or erase) an extra frame to indicate this is the acive list (or not)
-               Qd.FrameRect(rect2)
-               Qd.SetPenState(save)
-               
-               
-
-class VarBrowser(FrameWork.DialogWindow):
-       def open(self, start_object, title = ""):
-               FrameWork.DialogWindow.open(self, ID_MAIN)
-               if title <> "":
-                       windowtitle = self.wid.GetWTitle()
-                       self.wid.SetWTitle(windowtitle + " >> " + title)
-               else:
-                       if hasattr(start_object, "__name__"):
-                               windowtitle = self.wid.GetWTitle()
-                               self.wid.SetWTitle(windowtitle + " >> " + str(getattr(start_object, "__name__")) )
-                               
-               self.SetPort()
-               Qd.TextFont(3)
-               Qd.TextSize(9)
-               self.lists = []
-               self.listitems = []
-               for i in range(NUM_LISTS):
-                       self.listitems.append(MAIN_LIST + 2 * i)        # dlg item numbers... have to be consistent
-               for i in self.listitems:
-                       tp, h, rect = self.wid.GetDialogItem(i)
-                       list = MyList(self.wid, rect, i)
-                       self.lists.append(list)
-               self.leftover = []
-               self.rightover = []
-               self.setup(start_object, title)
-               
-       def close(self):
-               self.lists = []
-               self.listitems = []
-               self.do_postclose()
-       
-       def setup(self, start_object, title = ""):
-               # here we set the starting point for our expedition
-               self.start = start_object
-               self.lists[0].setcontent(start_object, title)
-               for list in self.lists[1:]:
-                       list.setcontent(None)
-               
-       def do_listhit(self, event, item):
-               (what, message, when, where, modifiers) = event
-               Qd.SetPort(self.wid)
-               where = Qd.GlobalToLocal(where)
-               for list in self.lists:
-                       list.active = 0
-               list = self.lists[self.listitems.index(item)]
-               list.active = 1
-               for l in self.lists:
-                       l.drawframe()
-               
-               point = (0,0)
-               ok, point = list.list.LGetSelect(1, point)
-               if ok:
-                       oldsel = point[1]
-               else:
-                       oldsel = -1
-               # This should be: list.list.LClick(where, modifiers)
-               # Since the selFlags field of the list is not accessible from Python I have to do it like this.
-               # The effect is that you can't select more items by using shift or command.
-               list.list.LClick(where, 0)
-               
-               index = self.listitems.index(item) + 1
-               point = (0,0)
-               ok, point = list.list.LGetSelect(1, point)
-               if oldsel == point[1]:
-                       return  # selection didn't change, do nothing.
-               if not ok:
-                       for i in range(index, len(self.listitems)):
-                               self.lists[i].setcontent(None)
-                       self.rightover = []
-                       return
-                       
-               if point[1] >= len(list.keylist):
-                       return          # XXX is this still necessary? is ok really true?
-               key = str(list.keylist[point[1]])
-               value = list.valuelist[point[1]]
-               
-               self.settextitem("")
-               thetype = type(value)
-               if thetype == ListType or                               \
-                               thetype == TupleType or                 \
-                               thetype == DictType or                  \
-                               hasattr(value, "__dict__") or           \
-                               hasattr(value, "__methods__") or        \
-                               hasattr(value, "__members__"):  # XXX or, or... again: did I miss something?
-                       if index >= len(self.listitems):
-                               # we've reached the right side of our dialog. move everything to the left
-                               # (by pushing the rightbutton...)
-                               self.do_rightbutton(1)
-                               index = index - 1
-                       newlist = self.lists[index]
-                       newlist.setcontent(value, key)
-               else:
-                       index = index - 1
-                       self.settextitem( str(value) + "\r" + cleantype(value))
-               for i in range(index + 1, len(self.listitems)):
-                       self.lists[i].setcontent(None)
-               self.rightover = []
-       
-       # helper to set the big text item at the bottom of the dialog.
-       def settextitem(self, text):
-               tp, h, rect = self.wid.GetDialogItem(MAIN_TEXT)
-               Dlg.SetDialogItemText(h, text[:255])
-       
-       def do_rawupdate(self, window, event):
-               Qd.SetPort(self.wid)
-               iType, iHandle, iRect = window.GetDialogItem(MAIN_LINE)
-               Qd.FrameRect(iRect)
-               for list in self.lists:
-                       Qd.FrameRect(list.rect)
-                       if list.active:
-                               # see MyList.drawframe
-                               rect2 = Qd.InsetRect(list.rect, -3, -3)
-                               save = Qd.GetPenState()
-                               Qd.PenSize(2, 2)
-                               Qd.FrameRect(rect2)
-                               Qd.SetPenState(save)
-               for list in self.lists:
-                       list.list.LUpdate(self.wid.GetWindowPort().visRgn)
-               
-       def do_activate(self, activate, event):
-               for list in self.lists:
-                       list.list.LActivate(activate)
-               
-       # scroll everything one 'unit' to the left
-       # XXX I don't like the way this works. Too many 'manual' assignments
-       def do_rightbutton(self, force = 0):
-               if not force and self.rightover == []:
-                       return
-               self.scroll(-1)
-               point = (0, 0)
-               ok, point = self.lists[0].list.LGetSelect(1, point)
-               self.leftover.append((point, self.lists[0].content, self.lists[0].title, self.lists[0].active))
-               for i in range(len(self.lists)-1):
-                       point = (0, 0)
-                       ok, point = self.lists[i+1].list.LGetSelect(1, point)
-                       self.lists[i].setcontent(self.lists[i+1].content, self.lists[i+1].title)
-                       self.lists[i].list.LSetSelect(ok, point)
-                       self.lists[i].list.LAutoScroll()
-                       self.lists[i].active = self.lists[i+1].active
-                       self.lists[i].drawframe()
-               if len(self.rightover) > 0:
-                       point, content, title, active = self.rightover[-1]
-                       self.lists[-1].setcontent(content, title)
-                       self.lists[-1].list.LSetSelect(1, point)
-                       self.lists[-1].list.LAutoScroll()
-                       self.lists[-1].active = active
-                       self.lists[-1].drawframe()
-                       del self.rightover[-1]
-               else:
-                       self.lists[-1].setcontent(None)
-                       self.lists[-1].active = 0
-               for list in self.lists:
-                       list.drawframe()
-       
-       # scroll everything one 'unit' to the right
-       def do_leftbutton(self):
-               if self.leftover == []:
-                       return
-               self.scroll(1)
-               if self.lists[-1].content <> None:
-                       point = (0, 0)
-                       ok, point = self.lists[-1].list.LGetSelect(1, point)
-                       self.rightover.append((point, self.lists[-1].content, self.lists[-1].title, self.lists[-1].active ))
-               for i in range(len(self.lists)-1, 0, -1):
-                       point = (0, 0)
-                       ok, point = self.lists[i-1].list.LGetSelect(1, point)
-                       self.lists[i].setcontent(self.lists[i-1].content, self.lists[i-1].title)
-                       self.lists[i].list.LSetSelect(ok, point)
-                       self.lists[i].list.LAutoScroll()
-                       self.lists[i].active = self.lists[i-1].active
-                       self.lists[i].drawframe()
-               if len(self.leftover) > 0:
-                       point, content, title, active = self.leftover[-1]
-                       self.lists[0].setcontent(content, title)
-                       self.lists[0].list.LSetSelect(1, point)
-                       self.lists[0].list.LAutoScroll()
-                       self.lists[0].active = active
-                       self.lists[0].drawframe()
-                       del self.leftover[-1]
-               else:
-                       self.lists[0].setcontent(None)
-                       self.lists[0].active = 0
-       
-       # create some visual feedback when 'scrolling' the lists to the left or to the right
-       def scroll(self, leftright):    # leftright should be 1 or -1
-               # first, build a region containing all list rectangles
-               myregion = Qd.NewRgn()
-               mylastregion = Qd.NewRgn()
-               for list in self.lists:
-                       AddRect2Rgn(list.rect, myregion)
-                       AddRect2Rgn(list.rect, mylastregion)
-               # set the pen, but save it's state first
-               self.SetPort()
-               save = Qd.GetPenState()
-               Qd.PenPat(Qd.qd.gray)
-               Qd.PenMode(srcXor)
-               # how far do we have to scroll?
-               distance = self.lists[1].rect[0] - self.lists[0].rect[0]
-               step = 30
-               lasttime = time.clock() # for delay
-               # do it
-               for i in range(0, distance, step):
-                       if i <> 0:
-                               Qd.FrameRgn(mylastregion)       # erase last region
-                               Qd.OffsetRgn(mylastregion, step * leftright, 0)
-                       # draw gray region
-                       Qd.FrameRgn(myregion)
-                       Qd.OffsetRgn(myregion, step * leftright, 0)
-                       while time.clock() - lasttime < 0.05:
-                               pass    # delay
-                       lasttime = time.clock()
-               # clean up after your dog
-               Qd.FrameRgn(mylastregion)
-               Qd.SetPenState(save)
-       
-       def reset(self):
-               for list in self.lists:
-                       point = (0,0)
-                       ok, point = list.list.LGetSelect(1, point)
-                       if ok:
-                               sel = list.keylist[point[1]]
-                       list.setcontent(list.content, list.title)
-                       if ok:
-                               list.list.LSetSelect(1, (0, list.keylist.index(sel)))
-                               list.list.LAutoScroll()
-       
-       def do_itemhit(self, item, event):
-               if item in self.listitems:
-                       self.do_listhit(event, item)
-               elif item == MAIN_LEFT:
-                       self.do_leftbutton()
-               elif item == MAIN_RIGHT:
-                       self.do_rightbutton()
-               elif item == MAIN_CLOSE:
-                       self.close()
-               elif item == MAIN_RESET:
-                       self.reset()
-
-# helper function that returns a short string containing the type of an arbitrary object
-# eg: cleantype("wat is dit nu weer?") -> '(string)'
-def cleantype(obj):
-       # type() typically returns something like: <type 'string'>
-       items = string.split(str(type(obj)), "'")
-       if len(items) == 3:
-               return '(' + items[1] + ')'
-       else:
-               # just in case, I don't know.
-               return str(type(obj))
-       
-# helper for VarBrowser.scroll
-def AddRect2Rgn(theRect, theRgn):
-       rRgn = Qd.NewRgn()
-       Qd.RectRgn(rRgn, theRect)
-       Qd.UnionRgn(rRgn, theRgn, theRgn)
-
-
-if __name__ == "__main__":
-       main()
diff --git a/Mac/Unsupported/twit/mactwit_edit.py b/Mac/Unsupported/twit/mactwit_edit.py
deleted file mode 100644 (file)
index ace253d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-"""Edit a file using the MetroWerks editor. Modify to suit your needs"""
-import MacOS
-import aetools
-import Metrowerks_Shell_Suite
-import Required_Suite
-_talker = None
-class MWShell(aetools.TalkTo, 
-                               Metrowerks_Shell_Suite.Metrowerks_Shell_Suite,
-                               Required_Suite.Required_Suite):
-       pass
-def edit(file, line):
-       global _talker
-       if _talker == None:
-               _talker = MWShell('CWIE', start=1)
-       try:
-               _talker.open(file)
-               _talker.Goto_Line(line)
-       except "(MacOS.Error, aetools.Error)":
-               pass
-       
diff --git a/Mac/Unsupported/twit/mactwit_mod.py b/Mac/Unsupported/twit/mactwit_mod.py
deleted file mode 100644 (file)
index d4ce17d..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-# A stab at a python debugger
-import Res
-import Qd
-import Dlg
-import Win
-import FrameWork
-import EasyDialogs
-import sys
-import TwitCore
-from mac_widgets import MT_AnyList, MT_IconTextWidget
-
-# Our dialogs
-ID_MODULES=500
-I_MODULES_TITLE=1
-I_MODULES=2
-I_VARS_TITLE=3
-I_VARS=4
-I_SOURCE_TITLE=5
-I_SOURCE=6
-I_RULER=7
-I_EDIT=8
-
-class ModuleBrowser(FrameWork.DialogWindow, TwitCore.ModuleBrowser):
-       """The module-browser dialog - mac-dependent part"""
-       def open(self, module):
-               FrameWork.DialogWindow.open(self, ID_MODULES)
-               self.SetPort()
-               Qd.TextFont(3)
-               Qd.TextSize(9)
-
-               tp, h, rect = self.wid.GetDialogItem(I_MODULES)
-               self.modules = MT_AnyList(self.wid, rect, 1)
-               tp, h, rect = self.wid.GetDialogItem(I_VARS)
-               self.vars = MT_AnyList(self.wid, rect, 2)
-               tp, h, rect = self.wid.GetDialogItem(I_SOURCE)
-               self.source = MT_IconTextWidget(self.wid, rect)
-
-               self.mi_open(module)
-               
-       def setsource(self, msg):
-               tp, h, rect = self.wid.GetDialogItem(I_SOURCE_TITLE)
-               if self.cur_source:
-                       Dlg.SetDialogItemText(h, self.cur_source)
-               else:
-                       Dlg.SetDialogItemText(h, msg)
-               self.source.setcontent(self.cur_source)
-
-       def source_setbreaks(self, list):
-               self.source.setbreaks(list)
-               
-       def source_setline(self, lineno, icon):
-               self.source.setcurline(lineno, icon)
-               
-       def source_select(self, lineno):
-               self.source.select(lineno)
-
-       def setmodulenames(self):
-               self.modules.setcontent(self.cont_modules)
-
-       def module_select(self, number):
-               self.modules.select(number)
-
-       def setvars(self):
-               self.vars.setcontent(self.cont_varnames, self.cont_varvalues)
-                               
-       def do_itemhit(self, item, event):
-               (what, message, when, where, modifiers) = event
-               Qd.SetPort(self.wid)
-               where = Qd.GlobalToLocal(where)
-               
-               if item == I_MODULES:
-                       new_module, double = self.modules.click(where, 0)
-                       self.click_module(new_module)
-               elif item == I_VARS:
-                       new_var, double = self.vars.click(where, 0)
-                       if double:
-                               self.click_var(new_var)
-               elif item == I_SOURCE:
-                       lineno, inborder = self.source.click(where, 0)
-                       if lineno <> None and lineno >= 0:
-                               self.click_source(lineno, inborder)
-               elif item == I_EDIT:
-                       self.click_edit()
-       
-       def do_rawupdate(self, window, event):
-               Qd.SetPort(self.wid)
-               rgn = self.wid.GetWindowPort().visRgn
-               tp, h, rect = self.wid.GetDialogItem(I_RULER)
-               Qd.MoveTo(rect[0], rect[1])
-               Qd.LineTo(rect[2], rect[1])
-               self.modules.update(rgn)
-               self.vars.update(rgn)
-               self.source.update(rgn)
-               
-       def force_redraw(self):
-               Qd.SetPort(self.wid)
-               self.wid.InvalWindowRgn(self.wid.GetWindowPort().visRgn)
-               
-       def do_activate(self, activate, event):
-               self.modules.activate(activate)
-               self.vars.activate(activate)
-               self.source.activate(activate)
-               
-       def close(self):
-               self.parent.module_dialog = None
-               self.source.close()
-               del self.modules
-               del self.vars
-               del self.source
-               self.do_postclose()
-
-if __name__ == '__main__':
-       main()
-       
diff --git a/Mac/Unsupported/twit/mactwit_stack.py b/Mac/Unsupported/twit/mactwit_stack.py
deleted file mode 100644 (file)
index cba6b14..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-# A stab at a python debugger
-import Res
-import Qd
-import Dlg
-import Win
-import FrameWork
-import EasyDialogs
-import sys
-import TwitCore
-from mac_widgets import MT_AnyList, MT_IndexList, MT_IconTextWidget
-
-# Our dialogs
-ID_STACK=501
-I_STACK_TITLE=1
-I_STACK=2
-I_VARS_TITLE=3
-I_VARS=4
-I_SOURCE_TITLE=5
-I_SOURCE=6
-I_EXC_TITLE=7
-I_EXC=8
-I_EXCVALUE_TITLE=9
-I_EXCVALUE=10
-I_BROWSE=11
-I_RULER1=12
-I_RULER2=13
-I_STATE_TITLE=14
-I_STATE=15
-I_SHOW_COMPLEX=16
-I_SHOW_SYSTEM=17
-I_EDIT=18
-
-class StackBrowser(FrameWork.DialogWindow, TwitCore.StackBrowser):
-       """The stack-browser dialog - mac-dependent part"""
-       def open(self):
-               FrameWork.DialogWindow.open(self, ID_STACK)
-               self.SetPort()
-               Qd.TextFont(3)
-               Qd.TextSize(9)
-
-               tp, h, rect = self.wid.GetDialogItem(I_STACK)
-               self.stack = MT_IndexList(self.wid, rect, 2)
-               tp, h, rect = self.wid.GetDialogItem(I_VARS)
-               self.vars = MT_AnyList(self.wid, rect, 2)
-               tp, h, rect = self.wid.GetDialogItem(I_SOURCE)
-               self.source = MT_IconTextWidget(self.wid, rect)
-
-               self.mi_open()
-               
-       def setsource(self, msg):
-               tp, h, rect = self.wid.GetDialogItem(I_SOURCE_TITLE)
-               if self.cur_source:
-                       Dlg.SetDialogItemText(h, self.cur_source)
-               else:
-                       Dlg.SetDialogItemText(h, msg)
-               self.source.setcontent(self.cur_source)
-               
-       def source_setbreaks(self, list):
-               self.source.setbreaks(list)
-               
-       def source_setline(self, lineno, icon):
-               self.source.setcurline(lineno, icon)
-               
-       def source_select(self, lineno):
-               self.source.select(lineno)
-
-       def stack_setcontent(self, names, locations):
-               self.stack.setcontent(names, locations)
-
-       def stack_select(self, number):
-               self.stack.select(number)
-               
-       def setvars(self):
-               self.vars.setcontent(self.cont_varnames, self.cont_varvalues)
-               
-       def setexception(self, name, value):
-               if name == None:
-                       self.wid.HideDialogItem(I_EXC)
-                       self.wid.HideDialogItem(I_EXC_TITLE)
-                       value = None
-               else:
-                       self.wid.ShowDialogItem(I_EXC)
-                       self.wid.ShowDialogItem(I_EXC_TITLE)
-                       tp, h, rect = self.wid.GetDialogItem(I_EXC)
-                       Dlg.SetDialogItemText(h, name)
-               if value == None:
-                       self.wid.HideDialogItem(I_EXCVALUE)
-                       self.wid.HideDialogItem(I_EXCVALUE_TITLE)
-               else:
-                       self.wid.ShowDialogItem(I_EXCVALUE)
-                       self.wid.ShowDialogItem(I_EXCVALUE_TITLE)
-                       tp, h, rect = self.wid.GetDialogItem(I_EXCVALUE)
-                       Dlg.SetDialogItemText(h, value)
-               
-       def setprogramstate(self, msg):
-               tp, h, rect = self.wid.GetDialogItem(I_STATE)
-               Dlg.SetDialogItemText(h, msg)
-               
-       def do_itemhit(self, item, event):
-               (what, message, when, where, modifiers) = event
-               Qd.SetPort(self.wid)
-               where = Qd.GlobalToLocal(where)
-                               
-               if item == I_STACK:
-                       new_stackitem, double = self.stack.click(where, 0)
-                       self.click_stack(new_stackitem)
-               elif item == I_VARS:
-                       new_var, double = self.vars.click(where, 0)
-                       if double:
-                               self.click_var(new_var)
-               elif item == I_SOURCE:
-                       lineno, inborder = self.source.click(where, 0)
-                       if lineno <> None and lineno >= 0:
-                               self.click_source(lineno, inborder)
-               elif item == I_BROWSE:
-                       self.click_browse()
-               elif item == I_SHOW_COMPLEX:
-                       self.show_complex = not self.show_complex
-                       self.setup_frame()
-               elif item == I_SHOW_SYSTEM:
-                       self.show_system = not self.show_system
-                       self.setup_frame()
-               elif item == I_EDIT:
-                       self.click_edit()
-                       
-       def set_var_buttons(self):
-               tp, h, rect = self.wid.GetDialogItem(I_SHOW_COMPLEX)
-               h.as_Control().SetControlValue(self.show_complex)
-               tp, h, rect = self.wid.GetDialogItem(I_SHOW_SYSTEM)
-               h.as_Control().SetControlValue(self.show_system)
-       
-       def do_rawupdate(self, window, event):
-               Qd.SetPort(self.wid)
-               rgn = self.wid.GetWindowPort().visRgn
-               tp, h, rect = self.wid.GetDialogItem(I_RULER1)
-               Qd.MoveTo(rect[0], rect[1])
-               Qd.LineTo(rect[2], rect[1])
-               tp, h, rect = self.wid.GetDialogItem(I_RULER2)
-               Qd.MoveTo(rect[0], rect[1])
-               Qd.LineTo(rect[2], rect[1])
-               self.stack.update(rgn)
-               self.vars.update(rgn)
-               self.source.update(rgn)
-
-       def force_redraw(self):
-               Qd.SetPort(self.wid)
-               self.wid.InvalWindowRgn(self.wid.GetWindowPort().visRgn)
-               
-       def do_activate(self, activate, event):
-               self.stack.activate(activate)
-               self.vars.activate(activate)
-               self.source.activate(activate)
-                               
-       def close(self):
-               self.source.close()
-               del self.stack
-               del self.vars
-               del self.source
-               self.do_postclose()
diff --git a/Mac/Unsupported/twit/twit.py b/Mac/Unsupported/twit/twit.py
deleted file mode 100644 (file)
index 2cc3f41..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-"""twit - The Window-Independent Tracer.
-
-Interface:
-twit.main()                                            Enter debugger in inactive interactive state
-twit.run(stmt, globals, locals)        Enter debugger and start running stmt
-twit.post_mortem(traceback)            Enter debugger in post-mortem mode on traceback
-twit.pm()                                              Enter debugger in pm-mode on sys.last_traceback
-
-main program: nothing but a bit of glue to put it all together.
-
-Jack Jansen, CWI, August 1996."""
-
-import os
-import sys
-
-# Add our directory to path, if needed
-dirname = os.path.split(__file__)[0]
-if not dirname in sys.path:
-       sys.path.append(dirname)
-
-if os.name == 'mac':
-       import MacOS
-       MacOS.splash(502)       # Try to show the splash screen
-       import mactwit_app; twit_app = mactwit_app
-else:
-       try:
-               import _tkinter
-               have_tk = 1
-       except ImportError:
-               have_tk = 0
-       if have_tk:
-               import tktwit_app; twit_app = tktwit_app
-       else:
-               print 'Please implementent machine-dependent code and try again:-)'
-               sys.exit(1)
-       
-import sys
-       
-def main():
-       twit_app.Initialize()
-       if os.name == 'mac':
-               MacOS.splash()
-       twit_app.Twit('none', None)
-       
-def run(statement, globals=None, locals=None):
-       twit_app.Initialize()
-       twit_app.Twit('run', (statement, globals, locals))
-
-def post_mortem(t):
-       Initialize()
-       twit_app.Twit('pm', t)
-       
-def pm():
-       post_mortem(sys.last_traceback)
-       
-if __name__ == '__main__':
-       main()
-       
-       
diff --git a/Mac/Unsupported/twit/twit.rsrc b/Mac/Unsupported/twit/twit.rsrc
deleted file mode 100644 (file)
index 8eb1c57..0000000
+++ /dev/null
@@ -1 +0,0 @@
-(This file must be converted with BinHex 4.0)\r:!!"bFh*M8P0&4!#3#,5XBLd!N!3"!!!!XK)!!,%5!!!#QJ!!!2"TrrmJ&j-J!!+\r"i2"VrrmJ&j3N!*!%m'rrrb!*G(GTG#jbFh*M,R*cFQ0cFQ&MG'pb)&*&383J689\rbE!!!FR0bBe*6483!N"LbBh)V!*!'Y+`!m(Errb!AR%3!N!6`Grrr)"HG5!#3"2"\rirrmJ&jj-!*!%m(Rrrb!ARe!!N!6`H[rr)"HJ9!#3"2"lrrmJ&k&B!*!%m(crrf!\rASP`!N!6`IIrr)"HMB!#3"2#!rrmJ&k4N!*!&!rrr)"HPD!!#G#LrK2rr)"G2)!#\r3"#S!6!"S!AJ#'J!%!3!"!*!&!J!99(GTG#!Y)%e[C(9XC5"LFQphFf9b!!!!,`!\rU!"!"``(8!!3"!*!(!J%D9(GTG#!Y)&0dB@0V)(4bB@0P)'*bEhGcCA)!!!Mk#2S\r!N!8,!!`!%3,r$!$rrP@d!%J!!!")!*!(#`!-!B%@8!!H!!%!#J#3"3X!$!#CJ!`\r!N!8,!!`!N!P)!!!!5!#3"3J!!3!)!*!%!B%F0!#3"L5Ep3B!r`!!rj!'!!(rN!6\r-c!!#rj!%QCN!!rq3"'CQ!!6rN!3c-`!&rj!%!!!!"[rrc-crr`!(rrr-N!3!#2r\rrc-bCQ3!*rrr-c'CQ!!Vrrmc--c-!#rrrc-`!!!!-rrqCQIrr!!hrrjQCc-`!$[r\rrQC!%!!rrrjQCCQB!%2rrQCNc-`!4rrqCQ3!!!",rrfCQrrm!%rrrCQE-c!!8rrp\rQCTQC!"ArrfD3"!!@rrpQCM-c!"IrrfCQ!!!!'2rr-c2rr`!Crrmc-mc-!"Vrrc-\rcQCN!'rrr-c0QCJ!FrrmcN!3!(Irr-c-!!!!Hrrm!!2rr!"rrr`!!c-`!)2rr!!#\rCQ3!Krrm!!'CQ!#,rr`!!-c-!)rrr!*!&*-c-rj!%!#A-c2rrc-`!*Xc-rrqCQ3!\rRc-crrfCQ!#M-c2rr-c-!+Fc-rrm!!!!Uc*!%rrm!+mb3"J!Xc*!%QCN!,Fb3"'C\rQ!#l-N!3c-`![c*!%!!!!--c-QCRrr`!ac-bCQFc-!$,-c*Q3"!!cc-bCQ@CQ!$6\r-c*QC-c-!0Fc-QCN!!!!fc-aQC[rr!$I-c'CQc-`!1-c-CQDCQ3!jc-aQN!3!1Xc\r-CQBc-`!lc-aQCJ!!!$c-c$-crrm!2Fc--c2-c!!qc-`c-jQC!$r-c$-cCQB!3-c\r--j!%!%(-c$-c!!!!3Xc-!!$rr`"$c-`!!-c-!%6-c!!!QCN!4Fc-!!"QCJ"'c-`\r!!$-c!%I-c!#3"8LCQIq3"!"*QCRrrmc-!%UCQIrrQCN!5jQCrrpQCJ"-QCRrrc-\rc!%fCQIrr!!!!6TQCc-crr`"2QCR-N!3!8*QCc-bCQ3"4QCR-c'CQ!&+CQFc--c-\r!8jQCc-`!!!"8QC!%rrm!9CQ3"-c-!&DCN!B!9jQ3"'CQ!&LCN!3c-`"CQC!%!!!\r!@TQCCQErr`"EQCPQCXc-!&bCQ@CQQCN!ACQCCT!%!&kCQ@CQ-c-!AjQCCQB!!!"\rJQCNc-rrr!''CQ6-cc-`!BTQC-c1CQ3"MQCNc-fCQ!'5CQ613"!"PQCNc-`!!!'D\rCQ3!!rrm!CjQC!!$-c!"SQCN!!*QC!'QCQ3!!CQB!DTQC!!!c-`"VQCN!N!9XCQE\rrN!3!E@CQrrr-c!"ZCQErrjQC!'pQC[rrCQB!F'CQrrmc-`"aCQErr`!!!(*QCXc\r-rrm!FfCQc*!%!(4QCXc-QCN!G@CQc-aQCJ"fCQE-c$-c!(GQCXc-!!!!H'CQQCR\rrr`"jCQDCQFc-!(TQCTQ3"!"lCQDCQ@CQ!(aQCTQC-c-!I@CQQCN!!!"qCT!%rrm\r!IfD3"-c-!)"QN!5CQ3#"CT!'!)*QN!3c-`#$CT!%!!!!K'CQ-c2rr`#&CQBc-mc\r-!)CQCM-cQCN!KfCQ-c0QCJ#)CQBcN!3!L@CQ-c-!!!#+CQB!!2rr!)YQCJ!!c-`\r!M'CQ!!#CQ3#0CQB!!'CQ!)jQCJ!!-c-!MfCQ!*!&N!!c-rq3"!#4-c2rrmc-!*)\rc-rrrQCN!Nc-crrpQCJ#8-c2rrc-c!*8c-rrr!!!!PM-cc-crr`#A-c2-N!3!Q$-\rcc-bCQ3#C-c2-c'CQ!*Sc-mc--c-!Qc-cc-`!!!#F-c1CQIrr!*dc-jQCc-`!RM-\rcQC!%!*mc-jQCCQB!S$-cQCNc-`#K-c1CQ3!!!+)c-fCQrrm!Sc-cCQE-c!#N-c0\rQCTQC!+8c-fD3"!#Q-c0QCM-c!+Fc-fCQ!!!!U$13"2rr!+NcN!6-c!#U-j!%QCN\r!Uc13"'CQ!+`cN!B!V613"!!!!+ic-`!!rrm!Vc-c!!$-c!#`-c-!!*QC!,%c-`!\r!CQB!XM-c!!!c-`#c-c-!N!@d!!$rN!3!Y3!!rrr-c!#f!!$rrjQC!,F!!2rrCQB\r!Z!!!rrmc-`#j!!$rr`!!!,S!!-c-rrm!Z`!!c*!%!,`!!-c-QCN![3!!c-aQCJ#\rq!!$-c$-c!,m!!-c-!!!!`!!!QCRrr`$"!!#CQFc-!-)!!*Q3"!$$!!#CQ@CQ!-3\r!!*QC-c-!a3!!QCN!!!$'!!"QC[rr!-F!!'CQc-`!b!!!CQDCQ3$*!!"QN!3!bJ!\r!CQBc-`$,!!"QCJ!!!-`!!$-crrm!c3!!-c2-c!$1!!!c-jQC!-m!!$-cCQB!d!!\r!-j!%!0%!!$-c!!!!dJ#3"2rr!0-!N!6-c!$8!*!%QCN!e3#3"'CQ!0B!N!3c-`$\rAlZi!N!ABhGd!N!ACZlX!N!ADUUS!N!AEL)J!N!AFGhF!N!AG998!N!AH4%3!N!A\rI)L)!N!AJ%4%!N!AK!!$ZlJ!!!1)!!0hG!!!!i`!!ZlX!!!$N!!#UUJ!!!18!!)L\r)!!!!jJ!!GhF!!!$R!!"993!!!1J!!%4%!!!!k3!!)L)!!!$U!!!4%3!!!1X!N!6\rZlJ$X!*!%hGd!l3#3",Zl!1i!N!5UUJ$[!*!%L)J!m!#3"(Gh!2%!N!4993$b!*!\r%4%3!m`#3"#)L!23!N!34%3$elT!'!2EGN!B!plZ3"J$iUT!'!2Q)N!B!qRH3"J$\rl9C!'!2a%N!B!r5+3"J$q%C!'!2m!N!X,!!`!N!8,!!`!3!!+!*!&#`!-"[d!!2r\rk!!Ip!!(rrrX!#2d!![p8rr`!#J!!rIm#!&6rr3!-#!$r!&3!9!"8rri!$3X!re3\r!9!"8!&6r!!!-#!$r!&3!9!"8rri!#J!!rIm#!&6rr3!)r3!#re6rr!!(r3!"rrr\rl!!Ep!!$rqJ!!r`!!#1`)l!#3"3X!$!!4![m-!2rq9E3!5!!!!%J!N!F,!!`"J4C\r3!"i!!3!+!*!&#`!-!*Q!$!#3"3X!$!#3#8J!!!")!*!&#!!"!!J!N!3"J4a!!*!\r',`EJ)`$r!!$rN!B!!Iq3"-c-!!,rN!5CQ3!$rj!%CQB!"2q3"$-c!!ArN!3!!!!\r'rrr-c2rr!!Irrmb3"!!)rrr-c*QC!!Rrrmc-CQB!#[rrc-`c-`!,rrr-c!!!!!c\rrrjQCrrm!$IrrQCR-c!!1rrqCN!3!$rrrQCPQCJ!3rrqCQ6-c!"(rrjQC!!!!%[r\rrCQErr`!6rrpQCXc-!"6rrfCQQCN!&IrrCT!%!"ErrfCQ-c-!&rrrCQB!!!!Brrm\rc-rrr!"Rrrc-cc-`!'[rr-c1CQ3!Errmc-fCQ!"crrc13"!!Grrmc-`!!!"lrr`!\r!rrm!(rrr!!$-c!!Jrrm!!*QC!#(rr`!!CQB!)[rr!!!c-`!Mrrm!N!8Nc-crN!3\r!*Fc-rrr-c!!Qc-crrjQC!#I-c2rrCQB!+-c-rrmc-`!Tc-crr`!!!#V-N!6rr`!\rVc*!'!#c-N!5CQ3!Yc*!%CQB!,Xb3"$-c!#r-N!3!!!!`c-bCQIrr!$(-c*QCc-`\r!-Xc-QC!%!$2-c*QCCQB!0-c-QCNc-`!ec-bCQ3!!!$E-c'CQrrm!0mc-CQE-c!!\ric-aQCTQC!$R-c'D3"!!kc-aQCM-c!$[-c'CQ!!!!2-c--c2rr`!pc-`c-mc-!$l\r-c$-cQCN!2mc--c0QCJ"!c-`cN!3!3Fc--c-!!!"#c-`!!2rr!%2-c!!!c-`!4-c\r-!!#CQ3"&c-`!!'CQ!%E-c!!!-c-!4mc-!*!&5*QCrj!%!%QCQIrrc-`!5TQCrrq\rCQ3",QCRrrfCQ!%bCQIrr-c-!6CQCrrm!!!"1QCR-c2rr!%qCQFb3"!"3QCR-c*Q\rC!&'CQFc-CQB!8TQCc-`c-`"6QCR-c!!!!&5CN!6rr`"9QC!%c-`!9TQ3"J"AQC!\r%CQB!@*Q3"$-c!&QCN!3!!!"DQCPQC[rr!&ZCQ@CQc-`!A*QCCQDCQ3"GQCPQN!3\r!ATQCCQBc-`"IQCPQCJ!!!'#CQ6-crrm!BCQC-c2-c!"LQCNc-jQC!'1CQ6-cCQB\r!C*QC-j!%!'@CQ6-c!!!!CTQC!!$rr`"RQCN!!-c-!'LCQ3!!QCN!DCQC!!"QCJ"\rUQCN!!$-c!'ZCQ3#3"@aQC[q3"!"YCQErrmc-!'jQC[rrQCN!EfCQrrpQCJ"`CQE\rrrc-c!(&QC[rr!!!!FQCQc-crr`"cCQE-N!3!G'CQc-bCQ3"eCQE-c'CQ!(CQCXc\r--c-!GfCQc-`!!!"iCQDCQIrr!(PQCTQCc-`!HQCQQC!%!(YQCTQCCQB!I'CQQCN\rc-`"pCQDCQ3!!!(jQN!6rr`"rCT!%c-`!J'D3"*QC!)&QN!B!JQD3"$-c!)0QN!3\r!!!#%CQBc-rrr!)9QCM-cc-`!KQCQ-c1CQ3#(CQBc-fCQ!)KQCM13"!#*CQBc-`!\r!!)TQCJ!!rrm!LfCQ!!$-c!#-CQB!!*QC!)eQCJ!!CQB!MQCQ!!!c-`#2CQB!N!@\r3!$-crj!%!*%c-rrrc-`!NM-crrqCQ3#6-c2rrfCQ!*3c-rrr-c-!P6-crrm!!!#\r@-c2-c2rr!*Fc-mb3"!#B-c2-c*QC!*Nc-mc-CQB!QM-cc-`c-`#E-c2-c!!!!*`\rc-jQCrrm!R6-cQCR-c!#H-c1CN!3!Rc-cQCPQCJ#J-c1CQ6-c!+%c-jQC!!!!SM-\rcCQErr`#M-c0QCXc-!+3c-fCQQCN!T6-cCT!%!+Bc-fCQ-c-!Tc-cCQB!!!#S-j!\r%rrm!U613"-c-!+ScN!5CQ3#V-j!%CQB!V$13"J#Y-j!%!!!!VM-c!!$rr`#[-c-\r!!-c-!,!c-`!!QCN!X6-c!!"QCJ#b-c-!!$-c!,-c-`#3"E3!!2q3"!#e!!$rrmc\r-!,B!!2rrQCN!Y`!!rrpQCJ#i!!$rrc-c!,N!!2rr!!!!ZJ!!c-crr`#l!!$-N!3\r![!!!c-bCQ3#p!!$-c'CQ!,i!!-c--c-![`!!c-`!!!$!!!#CQIrr!-%!!*QCc-`\r!`J!!QC!%!--!!*QCCQB!a!!!QCNc-`$&!!#CQ3!!!-B!!'CQrrm!a`!!CQE-c!$\r)!!"QCTQC!-N!!'D3"!$+!!"QCM-c!-X!!'CQ!!!!c!!!-c2rr`$0!!!c-mc-!-i\r!!$-cQCN!c`!!-c0QCJ$3!!!cN!3!d3!!-c-!!!$5!*!%rrm!d`#3"-c-!03!N!5\rCQ3$9!*!%CQB!eJ#3"$-c!0IZlJ#3"GMGh3#3"GQlZ`#3"GUUUJ#3"GZ)L!#3"Ga\rhG`#3"Ge993#3"Gj%4!#3"GmL)J#3"H!4%3#3"H%!!1lZ!!!!iJ!!hGd!!!$M!!#\rlZ`!!!13!!+UU!!!!j3!!L)J!!!$Q!!"hG`!!!1F!!&99!!!!k!!!4%3!!!$T!!!\rL)J!!!1S!!"%4!!!!k`#3"1lZ!1`!N!6Gh3$Y!*!%ZlX!lJ#3"+UU!1m!N!5)L!$\r`!*!%GhF!m3#3"&99!2)!N!4%4!$c!*!%)L)!p!#3""%4!2AZN!B!pYf3"J$hZj!\r'!2LUN!B!qBL3"J$kGj!'!2Y9N!B!r%53"J$p)T!'!2i4N!B!r`#3#`X!$!#3"3X\r!$!"!!!S!N!8,!!`'rJ$mi2d!#J)!!1$m)`$JrJ!*!3$JqL-#i!!!"`$Jq#-"i!!\r(!1$i!!(J!!F!i2J!!H!!"`$Jq!!"i!!(!1$i)`(J!!N"!1$k)`,J!!!+!J!!i2`\rM!1$q!!Eq!2cJr3!!r`!!!$!!N!F%!!$ZN!B!!3#3"`)!N!F$!*!("2q3"J!!!"8\r!+!!S!2!"Z!!"!*!)!J-!N!3J!!%!N!R)!C!!3!)#!J#3"4)!#J#e!&#!!*!%-!#\r3"`3!!2q3"J!"!*!(!J#3"`-!N!F%rj!'!!!!-!#3"`3!!2q3"J!"!*!(!J#3"`-\r!N!F%rj!'!!!!eJ!0!*!%!BJ!#J'B!#S%!M`m!*!%!BJ#1!'B!PJ%!Miq!*!&#!!\r+!#)!PSJ!N!BS!!S"0J#@!*!(#!#J!#)",)J!N!BS!+!"0J%X!*!(#!%f!#)"`SJ\r!N!BS!6B"0J(#!*!(#!(-!#)#@)J!N!BS!F`"0J*B!*!'!83!$J&i!P5)!*!&!BJ\r!h!'B!5`%"R9`C'&dC3#3"!')!6B"Q!''"!9ME'pcC3#3"3&!!!S"I!*BJ!#3"#-\r!-!!-!G3#EJ!%!3!"!*!&!J318(PdD'pZ)%*bEhGcCA)!!!#1!!F!N!8+!"3!'J$\r%L!K0Ef4eE'9c1J#3"4d!&!#%!-3!N!F+!0!!(!'RL""*G'9YFb"TEL"YEf4eE'8\rk!*!&(3$3!)3"T`#3"j3!&!#L!@f)!*!'T!!!!5`"X`#3"i`!!3#0!E5!!*!'MJ&\r[!+)"U33%4@4TG!!!!9`!%3#3"3)!&!!5!)b)"P0dB@0V1J#3"43!&!"L!03!N!F\r#!1!!%J&,L""-Ef0KE#"fBA*TB@*XCA-k!*!&&!$J!')"Y`#3"p-!%`$M!@D)!*!\r'k!!!!CS"a3#3"j%!23#K!)D)#N9iBf9`G'P[EMS!N!@4!)`!S3'dL!#3"U!!&!#\r`!)D)%%9iBf9`G'P[EL"fB@aeC6S!N!@J!)`!X!'dL!#3"VF"1!$+!EB%$Ne[C(9\rXC5"LFQphFf9b!*!&H`!"!(`"ai!!N!Dbrri!X`(,J!#3"S)!9J#5!)D)"P0dBA4\rP1J#3"B)!M!#5!6Q)!*!'C3$J!(J"A380BfpYF'peEQ3JGQ&bF`#3"Q8"DJ"j!EJ\r&"epI)(CKFR-!N!E1!@X!iJ'h"!4&C'Pd!!!!!3#3"!G"8&"-!*!&!3#3)5!!!!!\rB%%!!'!L)!$!("J"bI`IJIrram(2rr6KhrrrBIrrrm'rrrq![rrr`(rrrm!rrrr!\rGR[ri'@lrq"hXCMJphYVF2ElDh$eqfYap$QEHIrrrrRrrrri!N#JJ!!!!'""!!"J\r)L!!`"`B!FRm(i(rrmI"crrdiGrrrf(rrrr"[rrrJ,rrrm"rrrr!2rrr`(rrrq"r\rrrrJIrrri2rrrr$rrrr`rrrrmIrrrrRrrrrjrrrrq!*!+"!#3r`#3"2m!N#$rr`#\r3"[m!N!Ar!*!4rrm!N!Ir!!!!r`!!!2m!N!hrr`#3#Irrr`#3"Irr!*!+rrrr!!#\r`!!#`N!6rrrm!N!ArN!B!N!ErN!@`N!Irrrq`N!3!!!$rN!8!N!Arrrm!!,#3"[q\r3"E#3"3$r!!$rrrm!N!6rrrm!X*!(rj!&X*!)r`$rr`#3"2q3",#3"rq3"E#3#[m\r!N!Arr`$rX*!)rrrrX*!,!*!(r`#`N!VrX*!0!*!(rl#3'!#3#,#3'!#3"l#`X!@\r`X!8&X*!%"E#3$3#3"V#`"3@`"E#`"E#`X!@`N!d!N!D`X,!&X*!%"E#`"38&X,!\r&"E#`"38&X,#`!*!&X*!%"E#`X!@`N!3&X,!&X,!&X!@`X!@`X,!!N!5`N!3&X,!\r&X*!&"E#`"E#`"E!&X,!&X,#`!*!%X*!%"E!&X*!'"E#`"E#`"E!&X,!&X,#`!!!\r!X*!&"E!&N!5`X,!&"E#`"3@`X!@`X!@`N!3!!,#3(J!!X*!H!*"$!J#3J[!!N!m\r2m!!!$`!!$`#3#!r`!!!!m!$`!2!!N!Er!*!%$rm!!!r`!*!%$rm!8!99Arm!!!r\rrrr!!!!rrre9999rr998!$rrr!!!2r`"999Arrr9993m!rr!!$rm&9999rrre999\r9A`r`!!rrp9999Irrp9@3"&m!!!r`p99999rr9C!&8!!!!2"9N!Ae9C!'!!!!$e@\r3$!#3"&@3$!!!!!99&9%999&9N!C3!!!&848989949C!'8!!!"98999&9%494&9%\r499!!!&99&98999&9&9&49499!!"9949499949494898993!!9989&999898989&\r9&98!"999&4%499%9849494998!99N!j3"9@3$P!!N#)"!*"Brrrr!*!,X,!!!2r\rrr`#3"rm!X*!&!2m!N!Errl#3"`#3"rm!X*!(!*!'rrm!X*!(!*!)X,!&X!@`"E#\r`!*!(X,!&X!@`"E#`!*!(X*!*!*!RJ!#3+`rr!*!&"9!2r`!!!!m&9982!!!!re9\r999!!!!$`99998!!!$r"99993!!!!"9&4898!!!!&89&493!!!!99N!3!N"9!!*!\r+!F!'F"I32q![i'rJ'V!DX"r`!*!1!F!(m"I`2q!ri(rJ(r!Im"r`!*!("e4&@&3\r!!3#3"#43HA4N!!!!!8C548B!!3!!!)!!!3#"5801)`!"!!!!J!!"!*!&#P$J!$d\r*!!!@if!!!)[NLq3!N!A,!C-!%3,r$!$rrJ!!!%J!!!")!*!(b`'6!*!&!3!+!*!\r&b`'6!*S!!!$rKN`!N!A,!C-!!!!%!*!&5!!!!%J!!!!3!#!!!`!)!*!4b`'6!*!\r&b`'6!%!!&)(rJIq"ri(rJIq"ri(rJIq"rmMr!#!!ri,[JHq"lr$[r[q9li([JHr\rGlrlrU1q"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm\r!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q\r9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq\r"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq\r"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHr\rqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!\r!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li([JHr`lrlrPHq\r"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr\r+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li([JHr\r`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[q\rSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q\r#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq\r"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZr\rrr`"3!2rIl`#FrZm!R2h[qIrjl`#F[Zq"li([m1rqrpr[!!$ql`!!rHrjrrR[!!$\r4li([JHrGlrlrhqm!Brl[!'2plrRrqHm!Bq6[JHq"lmV[rrm!8!$rfqm!R2h[!2r\rl-3$rqHm!R,l[JHq"lr$[r[rEl`!!rHm!rrX!!2rjl`!!dHq"li([hHrqrp[[!'2\rpl`$rqj`!rrR[!'2Nli([JHr+lrrr!&N!rq,[!*cll`#FrHm(rc%arrma-Iqeli(\r[JHr`lrlriZm!!2[[!!$pl`Ir!!$rr`!!rmM[JHq"lph[r[rLl`"Mqqm!Brh["rq\rFR!!!R*crfqq"li([bZrrr`"F!2r@l`$rqc%!rmh[rJ$XlpV[rJ$Klri!cZq"lr$\r[r[r@l`$rq`!!rmh[rJ$rlmI[rJ$Klri!iHq"lph[r[r@l`$rqj`!rp[[mqrq!-A\r[rJ$Klri!p1q"lmV[rrm!S3$riZm$R1r[R2R[r[rr-IlrhHrdrrl[rJ$Xlql[r[r\rrlrhrrqrqrr[[rJ$Klri!cZq"lr$[r[rLl`-!lqm!qHrqrrm!r[rGlr3!rZrq!2r\r[fqrq!2r[r3$rlri!qqrq!1([rJ$Kli([hHrqrq,[!f2[lf2jlrlrrjcqrph[r`$\rf!2l[rJ$Clri!rqrp!2r[rJ$llri!iHrq!26[JHr+lrrr!,B!rq,[!jc[ljcqlrR\rrrc(jrrl[!jc[ljcTlr6rrZrq!1c[lZrqrrr[rIrrlrlrf1rq!-l[e1rq!,([m1r\rqrq,[!`$[l`$qlrRrr`$jrrl[!`$[l`$Tlr3!rZrq!2r[fqrq!2r[r3$rlri!f1r\rq!1([`Hrq!-6[hHrqrq,[!f2[lf2qlrRrrjcjrrl[!f2[lf2Tlrm!pJ$qlri!fHr\rq!2r[r3$rlri!f1rq!26[VZrq!0I[bZrrr`$&!2rLl`1FlqqFrZm!rr%a!2rql`#\rFiHrqrrR[rJ$q[Hr[lZrqrrr[rIrrlrlrq1rq[H6[rJ$q[G([e1rq!,([m1rqrq,\r[!`$[l`$ql`$rm3!!rrl[!!$Klri!qHrq!2qp!,hFlri!rqrp!2r[rJ$ilrkpj1r\rq!2kpj1r"lri!a1rGlrlriZm$Bqr[Brl[!2raR!$rrZm!Bq6[rZrq!2R[rJ$q[Gc\r[rJ$rlrd!rqrq!2M[rVhNlri!rVhhlkl[rJ$AlmV[rrm!d3$riZm$R1r[R2l[!2r\ra-3$rrZm!R12[rlhqrrQprJ$q[Hr[lZrqrrqprIrr[IlrrVhllrkpj1rq!2kpdHr\r8lri!XHr`lrlriZm$!1r[!2l[!2ra!!$rrZm!!12[rlhq!2QprJ$r[3#ph1rq!2q\rpr3$r[Ii!rVhllrkpj1rq!2kpj1r"lri!a1rGlrlriZm$Bqr[Brl[!2raR!$rrZm\r!Bq6[!Zqp[Ii!qEhq!2kph1rq!2qpr3$r[Ii!rVhllrkpj1rq!2kppqqZlri!eqr\r+lrrr!,m!rpr["*c[lrrrm6(rrrr[!jc[ljcQlrqpr[rj[Ii!rVh[lql[q2rr[Il\rrrVhElri!rVh4lp6[rJ$q[E6[m1rqrpr["!$[lrrrm3$rrrr[!`$[l`$QlrqprJ$\rj[Ii!rld![Gc[q!$r[Ii!rVhElri!rVhNlm([rJ$q[FI[hHrqrpr["'2[lrrrmCc\rrrrr[!f2[lf2Rl`,[[Ehq!2QprJ$q[Gc[q!$r[Ii!rVhElri!rVhhlkl[rJ$q[GV\r[bZrrr`&r!2rLl`DFlqqFlqrrlc%'rqr[R1r[R16[r[rq[Ic[rJ$r[Id!q1rm!!$\r[lHrir`1prrr[rVhl!2M[rJ$rlrd!q1rj!2kprHrm!2c[rJ$qlri!rZrq!1l[qJ$\rmlri!qZrq!2c[qJ$jlri!rVhhlr`!r1rq!!$[rJ$rlri!e1r`lrlriZm'!1r[!1r\r[rqm!"[r[l`$[l`$Nlri!rVhmlri!rlhp!2M[r!$XlrJ!!ld!!1rq[IX!q1rq!2r\r[r3$ilrN!rVhplr`!r1rq!2l[rJ$qlri!lZrk!2c[rJ$klri!r1rk!2R[rJ$q[II\r[r!$mlri!!1rq!2r[rJ$Rlph[r[rLl`CMlqpMlqrrlj`'rqr[Bqr[BqI[rZrq!2k\rpr1rq!2qpr3$ilr`!l1ri!!1p!!$[rVhl!2M[rJ$rlrd!q1rj!2kprHrm!!$[rHr\rq!2l[rJ$qlri!lZrk!2c[rJ$klri!r1rk!2R[rJ$q[II[r!$mlri!!1rq!2r[rJ$\rklmV[rrm"1`$riZm'R1r[R1r[rqma!rr[ljcKlrlrrVhmlrF!qqrj!!!!lZrer`$\r[rVhl!2M[p`$llrF!rVhrlrJ!rZrq!2l[rJ$qlri!lqm!!2N!rHrq!2V[rJ$plrJ\r!rHre!2c[q!$qlr3!eHr`lrlriZm'!1r[!1r[rqm!!rr[l`$Klri!rVhmlr`!r!$\rllrJ!lZre!!$[rVhl!2M[p`$llrF!rVhrlrJ!rZrq!2l[rJ$qlri!lqri!2h[rJ$\rklri!rHri!2h[p3$mlrJ!rZrd!1M[hHrqrq,["Q2[lf2[lrr[R!2rlqpMj1rqlri\r!rVhmlrF!qqri!1l[p3!!lrkpq`$ilrF!qqrh!2kprqrj!!!!rZrq!2l[rJ$qlri\r!lqri!2h[rJ$klri!rHri!2h[p3$mlrJ!rZrd!2[[bZrrr`'i!2rLl`DFlqqFlrr\rrlc(rr`([R1([r[rq[Ic[q`!!lrd!rHrp!2l[r`!!!1l[pIm!lrkprZrq!2M[q`!\r!lrd!r1rp!2l[rJ$q[3$[r3$qlrd!rqrq!2l[r3$rlri!m1rr!2m!rHrr!2c[rJ$\rmlri!rHrp!2h[r`$plr8!rHrp!2l[rJ$qlrd!!1rp!!$[rJ$9lr$[r[rLl`B!lqm\r!lrrrl`$rr`([!1([rJ$q[Ic[r!!"!1rp!2h[r3$qlri!lZre!!$[rVhqlri!q1r\rl!!$[r3$mlrd!rZrq!2kp!1rp!2l[r3$rlri!rZrp!2r[rJ$`lrd!rHrr!2c[rJ$\rmlri!rHrp!2h[r`$plr8!rHrp!2l[rJ$qlrd!!1rp!!$[rJ$Slph[r[rLl`CMlqp\rMlrrrljcrr`([Bq6[rZrq!2kpr1rl!!$[r3$plrd!rZrq!1l[p3!!lrkprZrq!2M\r[q`!!lrd!r1rp!2l[rJ$q[3$[r3$qlrm!r`$rlri!rZrp!2r[rJ$`lrd!rHrr!2c\r[rJ$mlri!rHrp!2h[r`$plr8!rHrp!2l[rJ$qlrd!!1rp!!$[rJ$llmV[rrm#$J$\rriZm!R2h[!2rY-3$rrHm!R16[r[rq[Ic[r!!#[Hr[rJ!![Il[rJ$qlrqp!!$r!1r\r[pIm#llfprHrq!2kpqqrm!!+plqrq!!#prZrq!2l[rlhq!2kp!1rq!2l[rlhq!2l\r[rJ!![I`!rlhr!!$[rVhclrm!!J$[lrUprZrq!2qprZrq!!$[rVhq!2r[qVhmlri\r!rVhklri!rZrr[Ii!rqrp!!#pr3!![Ii!rlhAlr$[r[rLl`!!rHm!rqd!!2rpl`!\r!j1rq!2kpr1rm!!+plqrq!!#prZrq!2l[rlhq!1r[p3!#llfprHrq!2kpqqrm!!+\rplqrq!!#prZrq!2l[rlhq!2kp!1rq!2l[rlhq!2l[rJ!![I`!rlhr!!$[rVhclri\r!rqrk[Il[rJ$r[Il[rJ!!lrkprJ$rlrUpr1rq!2kpqZrq!2l[rlhq!2r[r3!![Id\r!!,hq!2qpkZrGlrlriZm!Brh[!2rYR!$rrHm!BqI[rZrq!2kpr1rm!!+plqrq!!#\rprZrq!2l[rlhq!1r[p3!#llfprHrq!2kpqqrm!!+plqrq!!#prZrq!2l[rlhq!2k\rp!1rq!2l[rld!!2m!rZrq!!#pr!$r[Im!!1rq[I2[rJ$rlrUprZrq!2qprZrq!!$\r[rVhq!2r[qVhmlri!rVhklri!rZrr[Ii!rqrp!!#pr3!![Ii!rlhplmV[rrm"q3$\rriZm!R2h[!2rY-3$rrHm!R16[r[rq[Ic[r3$p[Ii!rld!lri!rqrp[3!!r`$r[I(\r[r2m![I[rrVhplri!rVhllrd!rEhq!2qprqrq!!$[rEhq!2kprJ$rlrbprJ!"[Hr\rq!!#pr!!![Ii!!1rq[I2[r`$r!2LprZrq!!#prZrq!!$[rVhp!2LprHrq!2LprJ$\rrlrfprJ$r[Ii!rlhq!2qprJ$q[GM[m1rqrq,[!!$pl`$rl3!!rrh[!!$Nlri!rVh\rmlrd!!,hq[Ii!rld!lri!rqrp[Ii!rlhalr`!!,hl!2kprHrq!2kpqqrp!2fprJ$\rr[Ir[rJ!!lrfprJ$q[Ii!rqrm[Ii!!Eh[rJ!![I`!!,hq!!$[rVhclrd!q,hqlri\r!!,hqlri!!1rq[Id!q,hplri!q,hq!2r[rEhq!2qprJ$r[Ii!rlhq!2kpkqrGlrl\rriZm!Brh[!2rYR!$rrHm!BqI[rZrq!2kpr1rp!2fprJ$r[3$[rJ$rlrfprJ$r[I(\r[r!!![IX!rVhplri!rVhllrd!rEhq!2qprqrq!!$[rEhq!2kprJ$rlrbprJ!"[Hr\rq!!#pr!!![Ii!!1rq[I2[r3$i[Il[rJ!![Il[rJ!!lrkpr3$i[Ih[rJ$i[Ii!rqr\rp[Ii!rlhq!2qprJ$r[Ii!rVhqlmV[rrm"pJ$riZm!R2l[rrrY-IrrrZm!R16[r[r\rq[Ic[rJ$m[Ii!rVhh!2m!rlhalrcrrlhmrrkprHrq!2kpqqrq!2bprJ$q[Ii!rqr\rp[Ii!rVhq!!$[rEhrlri!rlhq!!Dp!!$[!!#prJ!!lrkpp`$ml`!!r3!![Ih[rlh\rqlri!rld!lri!!1rq[Ir[r!!![Ih[rlhplri!q,he!2qprJ$r[Ii!rlhq!2kpf1r\r`lrlriZm!!2l[rrrY!2rrrZm!!16[rJ$q[Ic[rJ$r[IkprJ$q[I8!rlhalr`!rlh\rm!2kprHrq!2kpqqrq!2bprJ$q[Ii!rqrp[Ii!rVhq!!$[rEhrlri!rlhq!!Dp!!$\r[!!#prJ!!lrkpp`$mlr`!!,hplrqprZrq!2qp!1rq!!$[rVhrlr`!!,hplrqprHr\rq!2Lpp3$r[Ii!rlhq!2qprJ$q[H[[hHrqrq,[!'2qlrrrlCcrrrl[!'2Rlrl[rJ$\rq[Ic[rJ$m[Ii!rVhe!2qpmHrm!2qpr!$q[Ih[rJ$q[I[[rJ$m[Ii!rVhq!2r[rEh\rq!2kprJ!!lrfprqrq!2qprJ!'[3!!l`!![Ii!!1rq[IF!r1rm!!#prHrr[Il[rJ$\rr[3$[rJ!!lrkprqrm!!#prHrr[Ih[rJ$i[I8!rlhq!2qprJ$r[Ii!rVhqlmV[rrm\r"b`$riZm!R2l[!2rV-3$rrZm!R16[r[rq[Ic[rJ$m[Ii!rVhh!2m!rVhblrcrrlh\rmrrkprHrq!2kpqqrq!2bprJ$q[Ii!!1rq[Ir[rJ$q[Ii!!1rq[Il[rJ$r[IX!!1r\rl!!2[[Eh[p`$llrS!qHrq!!'plri!!1rq[Il[qJ$jlri!rVhllr8!rlhq!2qprJ$\rr[Ii!rVhBlr$[r[rLl`!!rZm!rqX!!2rql`!!j1rq!2kpr1rq!2qprVhq!2kpp3$\rq[I,[r!$r[I`!rVhplri!rVhllri!r,hq!2kprJ!!lrkprqrq!2kprJ!!lrkprZr\rq!2qpq`!!lrX!!1rr[3$[p`$llrS!qHrq!!'plri!!1rq[Il[qJ$jlri!rVhllr8\r!rlhq!2qprJ$r[Ii!rVhVlph[r[rLl`"MrZm!rqZF!2rql`"Mjqrqlri!rVhmlri\r!r,hq!2kpp3$q[I,[r!$r[I`!rVhplri!rVhllri!r,hq!2kprJ!!lrkprqrq!2k\rprJ!!lrkprZrq!2qpq`!!lrX!!qqp[Hrh!2[[qJ$jlri!!Eh[rJ!!lrkprZrk!2R\r[rJ$q[I[[p3$r[Ii!rlhq!2qprJ$q[Il[bZrrr`(Q!2rLl`#FrZm!rqXa!2rql`#\rFj1rqrrkpr1rq!2fp!1rq!2kprJ$q[Ih[rqrq[I,[r2rr[IcrrVhplri!rVhllri\r!rEd!lri!rVhq!!$[rVhrlri!rVhq!2kprHrq!2qpq`!!lrX!rVh`l`,[[Ehm!2V\r[rJ!![Ii!rqrq[Ih[rlhm!2V[rJ$q[I[[rJ$q[I[[rlhq!2qprJ$r[Ii!rVhBlr$\r[r[rLl`!!rZm!rqX!!2rql`!!j1rq!2kpr1rq!2qprld!lri!rVhq!2kpqqrq[I,\r[r!$r[I`!rVhplri!rVhllri!rEd!lri!rVhq!!$[rVhrlri!rVhq!2kprHrq!2q\rpq`!!lrX!!,hr[Hr[rlhm!2V[rJ!![Ii!rqrq[Ih[rlhm!2V[rJ$q[I[[rJ$q[I[\r[rlhq!2qprJ$r[Ii!rVhVlph[r[rLl`"MrZm!rqZF!2rql`"Mjqrqlri!rVhmlri\r!rEd!lri!rVhq!2kpqqrq[I,[r!$r[I`!rVhplri!rVhllri!rEd!lri!rVhq!!$\r[rVhrlri!rVhq!2kprHrq!2qpq`!!lrX!rVh[lrqpr!$klri!!,hq!2r[rVhplrq\rpr!$klri!rVhllri!rVhllrqprJ$r[Ii!rlhq!2kprZr+lrrr!FX!rq,["*c[lrr\rrkc(rrrr[!*cNlrlrrVhmlri!rVhrlri!rVhq!2Upr,hblrcrrlhmrrkprHrq!2k\rpqqrq!2kprqrq!2kprJ$q[Ir[r3$q[Ii!rVhplri!rlhm!!'plrX!rVhplrHprZr\rrlrkpr3$klrX!!1rq[I[[rVhp!2[[rJ$q[I[[rJ$f[Ii!rlhq!2qprJ$q[GM[m1r\rqrq,["!$[lrrrk`$rrrr[!!$Nlri!rVhmlri!rld#[Hr[rJ$q[Ii!pEhblr`!rlh\rm!2kprHrq!2kpqqrq!2kprqrq!2kprJ$q[Ir[r3$q[Ii!rVhplri!rlhm!!'plrX\r!!,hr[Ih[plhmlrkpr3$klrX!!1rq[I[[rVhp!2[[rJ$q[I[[rJ$f[Ii!rlhq!2q\rprJ$q[H[[hHrqrq,["'2[lrrrkjcrrrr[!'2Rlrl[rJ$q[Ic[rJ$q[Ir[rJ$q[Ii\r!pEhblr`!rlhm!2kprHrq!2kpqqrq!2kprqrq!2kprJ$q[Ir[r3$q[Ii!rVhplri\r!rlhm!!'plrX!rVhplrHpr1rq[Id!qZrl!!$[rVhllrkpr3$llri!rVhllri!pVh\rq!2qprJ$r[Ii!rVhqlmV[rrm"jJ$rhqm!rqNa!2rKlrlrrVhmlri!rVhrlri!rVd\r!lri!qlhm[I([rIrr[IhrrEhplri!rVhllri!rVhrlri!rVhq!2kp!1rm!2kp!1r\rq!2qprZrq!!,[[Ehm!2kpr!$q[Ih[pld#l`!!rZrq[Ii!!,hllrX!!1rq[Ir[r`$\rqlrkprJ!![Ic[rJ$q[IV[rJ$h[Ii!rlhq!2qprJ$q[GM[m1rqrpr[!2rT!!$riHr\rq!2kpr1rq!2qp!Vh[lri!rVd!lri!pVhalrd!rlhp!2fprHrq!2kpqqrq!2kprqr\rq!2kprJ$q[3$[r!$q[3$[rJ$r[Il[rJ!#llfpr!$q[I`!!,hr[Ih[pld#l`!!rZr\rq[Ii!!,hllrX!!1rq[Ir[r`$qlrkprJ!![Ic[rJ$q[IV[rJ$h[Ii!rlhq!2qprJ$\rq[H[[hHrqrpr[!2rTR!$rj1rqlri!rVhmlri!rVhrlri!rVd!lri!pVhalrd!rlh\rp!2fprHrq!2kpqqrq!2kprqrq!2kprJ$q[3$[r!$q[3$[rJ$r[Il[!!$r!!,[[Eh\rm!2kpr!$q[Ih[pld#l`!!rZrq[Ii!!,hllrX!!1rq[Ir[r`$qlrkprJ!![Ic[rJ$\rq[IV[rJ$h[Ii!rlhq!2qprJ$q[Il[bZrrr`(k!2rIl`$rk6%!rq([r[rq[Ic[rJ$\rq[Ir[rJ$q[3$[r3!![Il[!!$r!1l[r[rp[IlrrEhplri!rVhllri!rVhrlri!rVd\r!lri!rlhl!2kp!1rp!!+plqrp!!$[rVhp!2kpr3$p[I,[r`$r!2l[r3$r[I[[r3!\r!lrkprZrp!2l[r3$r[Ih[r3$r[3,[!!$plrd!!,hqlri!rqrq!2qprJ$r[Ii!rVh\rBlr$[r[rIl`$rk3!!rq([rJ$q[Ic[rJ$r[3+plqrq!2kp!1rp!!#prZrq!1l[rJ$\rp[Ii!rEhplri!rVhllri!rVhrlri!rVd!lri!rlhl!2kp!1rp!!+plqrp!!$[rVh\rp!2kpr3$r[IqpmZrp!2l[r3$r[I[[r3!!lrkprZrp!2l[r3$r[Ih[r3$r[3,[!!$\rplrd!!,hqlri!rqrq!2qprJ$r[Ii!rVhVlph[r[rIl`$rkC`!rq6[rZrq!2kpr1r\rq!2kprqrq!2kp!1rp!!#prZrq!1l[rJ$p[Ii!rEhplri!rVhllri!rVhrlri!rVd\r!lri!rlhl!2kp!1rp!!5plqm!!2m!!1rq[Id!rVhp!2fpmZrp!2l[r3$r[I[[r3!\r!lrkprZrp!2l[r3$r[Ih[r3$r[3,[!!$plrd!!,hqlri!rqrq!2qprJ$r[Ii!rVh\rqlmV[rrm"JJ$ri1rrrqNarrrLlrlrrVhmlri!rVhrlri!rVhrlrN!r`$ZlrlrrEh\rqrrfprHrl!2[[rJ$q[Ir[rJ$q[3$[pJ$q[Ir[q!$rlrkprJ$p[Id!rEhblrm!q3$\rp[Ic[r3$p[Il[p`$p[Ih[q3$mlrF!rqrq!2qprJ$r[Ii!rVhBlr$[r[rJlrrrk3$\rrrq,[rJ$q[Ic[rJ$r[3+plqrq!2kprqrh!1l[rJ$p[Ii!rEhplrX!qqrq!2kprqr\rq!2kp!1rf!2kprqri!2r[rVhq!2fpr3$r[IqpmZrh!2fpr1rp!2fprZrh!2fprHr\rj!2c[p`$rlri!rlhq!2qprJ$q[H[[hHrqrq$[rrrTR2rrjHrqlri!rVhmlri!rVh\rrlri!rVhrlrF!lZrq!2fprJ$p[Ih[q`$llri!rVhrlri!rVd!lrB!rVhrlrN!!J$\r[lrkprJ$p[Id!rEhblrF!rEhmlrd!rEhqlrF!rEhplrN!r1rh!2r[rJ$r[Ii!rlh\rq!2kprZr+lrrr!FB!rq$[!2rq-3$rrM(rrria!2rd-3$riZrqrrkpr1rq!2kprqr\rq!2kprHrl!1c[r[rp[IlrrVhmlrX!qqrq!2kprqrq!2kprqrm!2r[rJ$q[Ih[r!$\rqlrkp!1rq!2fp!1rq!2fpm1rk!2r[rVhmlri!r,hmlrS!rqrq[Ic[q`$jlrX!rHr\rq!2qprJ$r[Ii!rVhBlr$[r[rJl`$rrJ!!rri!rrrq!!$rp!!!rq,[rJ$q[Ic[rJ$\rr[3+plqrq!2kprHrl!1c[rJ$p[Ii!rVhmlrX!qqrq!2kprqrq!2kprqrm!2r[rJ$\rq[Ih[r!$qlrkp!1rq!2fp!1rq!2qprlh`lrS!rqrq[Ic[rJ$m[Ic[qJ$rlrkpr1r\rl!2R[q`$plri!rlhq!2qprJ$q[H[[hHrqrq$[!2rqR!!!rTcr!2kF!!$dR!$rjHr\rqlri!rVhmlri!rVhrlri!rVhplrX!l1rq!2fprJ$q[Ic[q`$llri!rVhrlri!rVh\rrlr`!rqrq!2kprHrm!!$[rqrq[3$[rJ$p[3$[rJ$p[I$[qJ$rlrkpr1rq!2bpr1r\rk!2r[rVhmlrX!qHrl!2h[rJ$r[Ii!rlhq!2kprZr+lrrr!Dm!rq$["rma-Irr-6(\rrr$%!rr3a!2rIlrkpqHrq[Ic[rVhplrfprqrrlrkplZrq[Ih[rVhjlrkpq1rq[Ic\r[rVhplrkprqrl[Ih[rEhqlrfprHrp[Il[rEh[l`$[rEhqlrfpr1rq!2fpqZrp[Il\r[rEhllrfprZrr[Ih[rEhplrkprqrq[Ir[rVhrlrkpf1r`lrlri1m(r`!!rrm!!2r\rm!!$rp!!!rpr[rVhjlrqp!,hmlrkprHrp[Ih[rVhZlrkprHrq[IR[rVhilrkpr1r\rq[Ih[rVhrlrZprHrp[Il[rEhplrfprZrq[3#plZrp[Il[rEhmlri!rEhklrfprZr\rp[I[[rEhqlrqprHrp[Ih[rVhrlrkprqrq[Ir[rVhVlph[r[rJl`IrR*`!!*bF!2b\rF!!$dR!$rjHrllrkpqHrq[Ic[rVhplrfprHrq[Hl[rVhplrkpqHrq[IM[rVhmlrk\rprHrq[Ir[qlhplrfprqm!lrfprHrp[Il[rEhZlrfprZrp[Ic[rJ$p[IV[rEhqlrf\rpqqrp[Il[rlhplrfprHrq[Ir[rVhrlrkprqrq[Il[bZrrr`&f!2rKlrrrrM%#rc(\rrr$(qrrmarrrr-IlrrM(rrq$[rVhjlrkpr1rq[Ic[r,hm[Hl[rVhplrkpqHrl[I[\r[rVhmlrkprHrf[Ic[q,hmlrkprHrp[Hr[!1rh[Ic[rJ!!lrfpqZrh[IR[qEhmlrH\rprqrq[Ir[rVhrlrkpf1r`lrlriHrrrri!![m!rr`!r[rr!2rrr`$qrri!rrrJlrk\rpqHrr[3#pr1rq[Ic[plhZlrkprHrq[IR[qlhllrkpr1rq[Ih[pVhmlrLpr1rq[Ih\r[rVd![Hl[plhmlri!!1rp[IV[plhjlrQpr1rh[Ir[rVhrlrkprqrq[H[[hHrqrq(\r[rrrqR!)!R!$mR2i!rjcr!2qFrJ$qR2rrjZrllrkpqHrq[Ic[rVhmlrHplZrq[Ih\r[rVhjlrZpqqrq[Ic[rVhplrDpr1rm[Ifpr1rq[Ih[rEhZlrHpr1rq!!$[rEhklrH\rpqHrj[Ic[plhrlrkprqrq[Ir[rVhqlmV[rrm"MJ$riHm!rrda!Imar[rp-3[r-6(\rr-6(r-Ima-Irq-3$ri1rq[IR[rVhmlrkpqZrq[Ikpl1rq[Ih[rVhjlrZpqqrq[Ic\r[rVhmlrbprqrq[IV[r,hklrkpr1rq[Hr[rZrk[Ic[r3!!lrkppqrk[II[qlhjlrZ\rprHrq[Ir[rVhrlrkpf1r`lrlriHm!rrd!!Im!r[rp!![r!!$r!!$r!2m!!2rq!!$\rri1rq[IR[rld![Ic[rVhklrZpl1rq[Ih[rVhjlrZpqqrq[Ic[rVhmlrbprqrq[IV\r[r,hklrkpr1rr[3#pl1rk[Ic[r3!!lrkppqrk[II[qlhjlrZprHrq[Ir[rVhrlrk\rpkqrGlrlriHm!rrfF!3#FrJ$pR!X!R*`!R*`!R!#FR!$qR!$rjZrllrkpqHrq[Ic\r[rVhklrZpl1rq[Ih[rVhjlrZpqqrq[Ic[rVhmlrbprqrq[IV[rVhr[IV[rVhmlrk\rpl1rk[Ic[r3!!lrkppqrk[II[qlhjlrZprHrq[Ir[rVhrlrkprZr+lrrr!*J!rq(\r[!2rp-3Ar-Ima-Irq-3[r-6(r-6(r-Ima-Irq-3$r`1q"lrE[qJ$rlrkpQ1r`lrl\rriHm!rrd!"Im!r`!!rri!#rm!!2m!!2m!r`!!rri!!2r6li([iqrk!2r[rVfVlph\r[r[rKl`$rrC`&!*`!R*`!rT`,!*bF!*bF!*`!R*`!rT`!rqE[JHr3lrS!rqrq[El\r[bZrrr`#B!2rLlrrrr6%&rc(r-6(rrM%,rc%arc%arc(r-6(rrM(rrm([JHrflrX\r!rqrq[CI[m1rqrq,[rrrp!!Ar!2m!!2rq!![r!!$r!!$r!2m!!2rq!2rre1q"lq2\r[q`$rlrkpUZrGlrlriZrrrrfF"3#F!*bF!2kF#`#FR!#FR!#F!*bF!2kFrrrRli(\r[d1rl!2r[rVfplmV[rrm!L3$riZm!rr`a"2ma-Irrr6(rrrmarrrr-32r-6(rr6%\r!rm([JHr[lrfpPqr`lrlriZm!rr`!"2m!!2rrr3$rrrm!rrrr!!2r!!$rr3!!rp6\r[JHrFlrfpUZrGlrlriZm!rrbF"!#FR!!!rCcr!2qFr`$rR!-!R*`!rC`!rqI[JHr\r*lrfp[Hr+lrrr!%3!rq,[!2rM-3$r`Hq"lr2[qVf@lr$[r[rLl`$ri`!!rp6[JHr\rJlrUpUHrGlrlriZm!rq1F!2rRli([cHrk[Ec[bZrrr`"%!2rLl`$ric%!rm([JHr\rclrZpPHr`lrlriZm!rq-!!2r8li([i1rl[DM[hHrqrq,[!2rMR!$rjqq"lmh[qlf\rllmV[rrm!,!$riZrKrm([JHq"lr$[r[rLlq(re1q"li([hHrqrq,[iIrRli([JHr\r+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li([JHr\r`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[q\rSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!i!2q\r$l`!!r`#jlri!cZq"lr$[r[q9lqr[rJ#jlri!iHq"lph[r[qSlpc[rJ#jlri!p1q\r"lmV[rrm!8!$rUHrfrqE[!!$r!,R[rJ$1lrA[p2qDlr$[r[qTlrB!q1r[lri!ZHr\rq!1([iZrd!+h[hHrqrkR[!!$h!1E[rJ#jlri!p1r2lr3!`1r+lrrr!&`!rkR[p[r\rQl`!!r`#jlri!hHrq!2A[pHrdrjV[m1rqrkR[pJ$ilqr[rJ#jlri!iHrplri!kHr\rd!+h[hHrqrkR[!!$h!1E[rJ#jlri!p1rUlri!kHrd!-$[bZrrr`"S!2qPlrlriZm\r!!2m!rVfmlri!rVhJlri!pHr`lrlrPHr`lrlrTHrq!26[lqrq!2kp[1rq!2kpj1r\rplri!j1rq!+M[hHrqrkM[rZrq!1,[rJ$q[Ec[rJ$q[II[kZrq!16[rJ#llmV[rrm\r!J!$rTZm![IlrqVhTl`!!r`$q[Ec[rJ$q[H$[rJ$elr,[rlhqrrQpRHr`lrlrTZm\r![Ii!qVhllqr[rJ$q[Ec[rJ$q[H6[rHrq!1E[rlhq!2QpX1rGlrlrU1rrl`#prJ$\rk[HR[rJ$q[Ec[rJ$q[II[kZrq!1E[rlhq!2Qp`qr+lrrr!)B!rkE[!,hqrrUpkHm\r!!2m!rVfmlri!rVhJlri!rVhilr,[rlhqrrQpRHr`lrlrTZm![Ii!qVhllqr[rJ$\rq[Ec[rJ$q[H6[rHrq!2kpkHrr[Ii!qEf`lph[r[qSlrr[!,hq!2UpkHrq!2kp[1r\rq!2kppqrUlri!rVhTlrqprJ$j[F2[bZrrr`&3!2qPlrlrrVhmlri!rqrp!2M[q`$\rr!2kprHrm!2V[rJ$rlr`!qHrm!2V[rJ$rlrd!q1rj!2kprHrm!2V[rJ$rlrd!qHr\rq!2kpq1r`lrlrrVhllri!rqrm!2V[q3$jlrX!qHrm!2R[rJ$rlr`!j1r`lrlrTHr\rq!2kpr1rq!2r[r3$ilrN!rVhplr`!qZrq!2r[r!$jlr`!qZrq!2r[r3$ilrN!rVh\rplr`!qZrq!2r[r3$plrh[rJ$q[HI[rJ$q[I[[rJ$rlr`!qZrj!2R[q`$jlr`!qHr\rq!2r[r!$hlph[r[qSlrl[rJ$q[Ic[rJ$rlrd!q1rj!2kprHrm!2V[rJ$rlr`!qHr\rm!2V[rJ$rlrd!q1rj!2kprHrm!!$[qqrq!2r[r3$jlri!rVhRlri!rVhllri!rqr\rm!2V[q3$jlrX!qHrm!2R[!!$r!2r[r!$6lrrr!33!rkA[r[rq[Ic[p`$llrN!r`$\rq[Ir[q!$mlrB!r1ri!2c[p`$llrF!rVhrlrJ!r1rh!2h[p3$llr$[r[rq[I[[p`$\rmlrF!qqri!2c[q!$llrF!j1r`lrlrTHrq!2kpr1rm!2`!qqrh!2kprqri!2c[pJ$\rmlrJ!r1rh!2[[p`$q[Ir[q!$mlrF!rZm!lr8!kZrq!2kpqqrh!2c[p`$llrJ!r1r\ri!2[[p`$hlph[r[qSlrl[rJ$q[Ic[p`$llrF!rVhrlrJ!r1rf!2c[q!$mlrF!qqr\rh!2kprqrj!!!!r1rh!2h[p3$Ulri!rVhllrF!r1rh!2[[q!$mlrJ!qqm!!2J!dqr\rrr`'V!2qPlrlrrVhmlrX!!1rp!2c[r3$ql`!!r`$q[3$[r3$qlri!r1rl!2r[rJ$\rplrd!rZrq!2c[q`!!lrd!r1rp!2l[rJ$q[3$[r3$qlri!r1rl!!$[r3$qlr8!qqr\r`lrlrrVhllrX!!1rq!2c[r3$qlri!r1rp!2h[r`$plrd!rZrq!2[[q`!!lri!j1r\r`lrlrTHrq!2kpr1rm!!%!lrd!r1rp!2l[rJ$q[3$[r3$qlri!r1rl!2r[rJ$plrd\r!rZrq!2c[q`!!lrd!r1rp!2l[rJ$q[3$[r3$qlri!r1rl!!$[r3$rl`$[p3$Ulri\r!rVhllrX!!1rq!2c[r3$qlri!r1rp!2h[r`$plrd!rZrq!2[[q`!!lri!pqrGlrl\rrU1rqlri!rVhmlrX!!1rp!2c[r3$qlri!rVd!lrd!rZrq!2c[q`$rlri!rHrp!2l\r[rJ$mlrX!!1rp!2c[r3$qlri!rVd!lrd!rZrr!!!!r1rl!!$[r3$qlr8!kZrq!2k\rpqqrl!!$[rJ$mlrd!rZrq!2c[r3$plrm!rHrp!2l[rJ$ll`!!r!!!lri!dqrrr`)\rN!2qPlrlrrVhmlr`!!Vh[lri!!,hqlri!rZrr[3!!r`$q[3$[rJ$qlrqprJ$plr`\r!!lh[llhq!!+plqrq!2l[rlhq!2h[r!!#[Hr[rJ!![Il[rJ$qlrqprJ$q[3$[rJ$\rqlrqprJ$plr`!!Vh[lri!!,hmlri!rVhilr$[r[rq[I[[r!!"[Hrq!2kp!1rq!2l\r[rlhq!2kprqrq!2l[qlhrlri!rZrr[Ii!r1rm!!'plri!rVhRlr$[r[qPlri!rVh\rmlr`!!Vh[lri!!,hqlri!rZrr[Ii!rVd!lri!rZrr[Ii!rHrm!!1plqqprJ!#[Hr\r[rJ$qlrqprJ$plr`!!Vh[lri!!,hqlri!rZrr[Ii!rVd!lri!rZrr[Ii!rHrm!!+\rplqrq!!'plrh[rJ$q[HI[rJ$q[I[[r!!"[Hrq!2kp!1rq!2l[rlhq!2kprqrq!2l\r[qlhrlri!rZrr[Ii!r1rm!!'plri!rVhklph[r[qSlrl[rJ$q[Ic[r!!#[Hr[rJ!\r![Il[rJ$qlrqprJ$q[3$[rJ$qlrqprJ$plr`!!lh[llhq!!+plqrq!2l[rlhq!2h\r[r!!#[Hr[rJ!![Il[rJ$qlrqprJ$q[3$[rJ$qlrqp!!$r!2h[r!!#[Hr[rJ!![Ic\r[rJ$q[HI[rJ$q[I[[r!!"[Hrq!2kp!1rq!2l[rlhq!2kprqrq!2l[qlhrlri!rZr\rr[Ii!r1m!!2d!!Eh[rJ$q[GE[rrm#"!$rTHrqrrkpr1rp!2fprJ$r[Ir[rJ!!lrf\rp!!$r!2kprJ$rlrfprJ$r[Ir[r3$m[Ii!rlhq!2r[rEhq!2qprqrp!2fprJ$r[Ir\r[rJ!!lrfprJ$q[Ii!rqrp[Ii!rlhrlrd!rEhq!2qprHrq!2LprZr`lrlrrVhllrd\r!rVhq!2kp!1rq!!$[rEhq!2kp!1rq!2r[q,hq!2r[rEhq!2qprZrp!2kprJ$q[HI\r[m1rqrkA[rJ$q[Ic[r3!![IkprJ$r[Ir[rJ!!lrfprJ$q[Ii!rqrp[Ii!rlhrlrd\r!r,hq!2qprJ$rlrfprJ$r[Ir[r3$p[Ii!rlhrlri!!1rp[Ii!rVhq!2r[rEhq!2q\rprqrp!2fprJ$r[Ih[rJ$i[Hh[rJ$q[I[[r3$q[Ii!rVd!lri!!1rp[Ii!rVd!lri\r!rqri[Ii!rqrp[Ii!rlhqlrd!rVhq!2kpqZrGlrlrU1rqlri!rVhmlrd!rEhq!2q\rprqrq!!$[rEhq!2kprJ$rlrfprJ$r[Ir[r3$m[Ii!rlhq!2r[rEhq!2qprqrp!2f\rprJ$r[Ir[rJ!!lrfprJ$q[Ii!rqrp[3!!r`$r[Ir[r3$p[Ii!rlhplri!q,hYlri\r!rVhllrd!rVhq!2kp!1rq!!$[rEhq!2kp!1rq!2r[q,hq!2r[rEhq!2qprZm!!2i\r!rVhq!2kpeZrrr`'i!2qPlrlrrVhmlri!r,hq!2kprJ$rlrfp!!$r!2kpp3$r[Ir\r[rJ$l[Ii!rlhe!2qprqrq!2bprJ$q[Ii!rqrp[Ii!rVhe!2qprqrq!2bprJ$q[Il\r[rJ$i[Il[m1rqrrkpqqrq!2Zp!1rq[Ii!rqrp[Ii!rVd!lri!!1rp[Ih[rlhe!2q\rprZrq!2Zp!1rq[HI[m1rqrkA[rJ$q[Ic[rJ$r[IkprJ$q[Ii!rqrp[Ii!rVhe!2q\rprqrq!2ZprJ$r[I8!rlhrlri!r,hq!2kprJ$rlrfprJ$q[I8!rlhrlri!r,hq!2q\rp!,hqlri!q,hYlri!rVhllri!qld!lrkprJ$rlrfprJ$q[3$[rJ!!lrfprHrr[I8\r!rlhqlri!qld!lrkpqZrGlrlrU1rqlri!rVhmlri!r,hq!2kprJ$rlrfprJ$q[I8\r!rlhrlri!qlhq!2qpp3$r[Ir[rJ$m[Ii!rVhq!2r[rEhq!2kpp`$r!2qprqrq!2b\rprJ$q[Il[rJ$i[Hh[rJ$q[I[[rJ$l[3$[rVhq!2r[rEhq!2kp!1rq!!$[rEhplrq\rpp3$r[Il[!!$r!2Zp!1rq[GE[rrm"bJ$rTHrqrrkpr1rq!2bprJ$q[Ii!!1rq[Ir\r[!!$r!2kpp3$q[3$[rJ$m[3$[rJ$r[I8!rVd!lri!r,hq!2kprJ!!lrkprqrq!2k\rpp3$q[3$[rJ$m[Ii!rVhqlri!rVhilr$[r[rq[I[[rJ$m[Ir[rVhq!!$[rVhrlri\r!rVd!lri!!1rq[IV[p3$q[Ir[rJ$m[Ir[rVhRlr$[r[qPlri!rVhmlri!rlhq[Ii\r!rVhq!!$[rVhrlri!rVhe!2kp!1rq!2bp!1rq!2qpp3$q[3$[rJ$m[Ii!rVhq!!$\r[rVhrlri!rVhe!2kp!1rq!2bprJ$r[3#prZrq!2kpjqrq!2kpqqrq!2bprqrq[Ii\r!!1rq[Ir[rJ$q[3$[rJ!!lrkpqZre!2kprqrq!2bprqrq[IV[hHrqrkM[rZrq!2k\rpr1rq!2bprJ$q[Ii!!1rq[Ir[rJ$q[I8!rVd!lri!r,d!lri!rlhe!2kp!1rq!2b\rprJ$q[Ii!!1rq[Ir[rJ$q[IF!r`$q[3$[rJ$m[Ii!rVhqlri!rVhRlri!rVhllri\r!r,hrlrkprJ!!lrkprqrq!2kp!1rq!!$[rVhklr8!rVhrl`!!r`$m[Ir[rVh@lrr\rr!JB!rkA[r[rq[Ic[rJ$p[3$[rJ$q[Ii!!1rq[Ir[!!$r!2kprJ$q[I[[rVd!lri\r!rEhrlri!rlhq!2kpqqrq[3$[rJ$p[3$[rJ$q[Ii!!1rq[Ir[rJ$q[Ii!rVhllrk\rp!1rq!2fp!1rq!2kprZrq!2kpq1r`lrlrrVhllri!rEhqlrkprJ!!lrkprqrq!2k\rp!1rq!2kpqHrq!2kpqqrq[Ir[rJ$p[Il[rVhRlr$[r[qPlri!rVhmlri!rlhr[3$\r[rJ$q[Ii!!1rq[Ir[rJ$q[Ii!rVhllrkp!1rq!2fprqrq!2qprJ$q[I[[rVd!lri\r!rEd!lri!rVhq!!$[rVhrlri!rVhq!2kpqqrq[3$[rJ$p[3$[rJ$r[3#prZrq!2k\rpjqrq!2kpqqrq!2fprZrq[Ii!!1rq[Ir[rJ$q[3$[rJ$q[IR[rJ$q[I[[rVhrlri\r!rEhqlrkpqZrGlrlrU1rqlri!rVhmlri!rEd!lri!rVhq!!$[rVhrlri!rVhq!2k\rpqqrq[3$[rJ$p[Ir[rJ$r[Ii!rVhllrkp!1rq!2fp!1rq!2kprJ!!lrkprqrq!2k\rprJ$q[Ih[rqrq[3$[rJ$p[3$[rJ$q[Il[rJ$q[HI[rJ$q[I[[rJ$p[Il[rVhq!!$\r[rVhrlri!rVd!lri!rVhjlri!rVhllrkprqm!!2m!rEhqlrkpeZrrr`'i!2qPlrl\rrrVhmlri!rVhrlri!rVhq!2kprqrr!2m!rVhq!2@p!1rq!2kprqrq!!,[[Ehq!2@\rp!1rq!2kprqrq!2kprJ$q[Ir[r3$q[Ii!pEd!lri!rVhrlri!rVhqlri!rVhilr$\r[r[rq[I[[rJ$q[IV[rJ$q[Ir[r3$q[3$[rJ$q[IR[rJ$e[Ir[rJ$q[H$[m1rqrkA\r[rJ$q[Ic[rJ$r[3+plqrq!2kprJ$q[Ir[r3$q[Ii!pEd!lri!rVhrlri!!Zqp[Ii\r!pEd!lri!rVhrlri!rVhq!2kprqrp!2kprJ$e[3$[rJ$q[Ir[rJ$r[3#prZrq!2k\rpjqrq!2kpqqrq!2kpqZrq!2kprqrp!2kp!1rq!2kpqHrq!2@prqrq!2kpmqrGlrl\rrU1rqlri!rVhmlri!rVhrlri!rVhq!2kprqrp!2kprJ$e[3$[rJ$q[Ir[rJ!#llf\rprJ$e[3$[rJ$q[Ir[rJ$q[Ii!rVhrlrd!rVhq!2Upr,d!lri!rVhrlri!rVhqlri\r!rVhRlri!rVhllri!rVhklri!rVhrlrd!rVd!lri!rVhjlri!pEhrl`!!r`$q[Fr\r[rrm"a!$rTHrqrrkpr1rq!2kprqrq!2kprJ$q[3$[rJ$r!2kp!1rq!2Dp!1rq!2k\rprqrq!!$[rVhq!2Dp!1rq!2kprqrq!2kprJ$q[3$[r!$q[3$[rJ$f[3$[rJ$q[Ir\r[rJ$q[Il[rJ$q[IM[m1rqrrkpqqrq!2kpqZrq!2kp!1rm!2kprqrq!2qpq1rq!2D\rprqrq!2kpi1r`lrlrTHrq!2kpr1rq!2qp!Vh[lri!rVhq!2kp!1rm!2kp!1rq!2D\rp!1rq!2kprqrq!!$[rVhq!2Dp!1rq!2kprqrq!2kprJ$q[3$[r!$q[3$[rJ$f[3$\r[rJ$q[Ir[rJ$r[3#prZrq!2kpjqrq!2kpqqrq!2kpqZrq!2kp!1rm!2kprqrq!2q\rpq1rq!2Dprqrq!2kpmqrGlrlrU1rqlri!rVhmlri!rVhrlri!rVhq!2kp!1rm!2k\rp!1rq!2Dp!1rq!2kprqrq!!$[rVhq!2Dp!1rq!2kprqrq!2kprJ$q[3$[r!$q[3$\r[rJ$l[Ibp!1rq!2kprqrq!2kprZrq!2kpjqrq!2kpqqrq!2kpqZrq!2kp!1rm!2k\rprqrq!2qpq1rq!2Dprqm!!2m!rVh2lrrr!J!!rkA[r[rq[Ic[rJ$q[Ir[rJ$q[3$\r[rJ$r[Id!r`$q[3$[r3!![Il[rJ$plri!rVhp!2r[rVhp!!#prZrq!2h[rJ$q[Ir\r[rJ$q[3$[rJ$r[IX!rVd!lrd!!,hqlri!rHrq!2kprqrq!2kprZrp!2qp!Zm!!2[\r[m1rqrrkpqqrq!2kpqHrq!2qpq`$q[Ir[r3!![Il[r`$plrd!!,hqlri!r1rq!2k\rpi1r`lrlrTHrq!2kpr1rq!2qp!Vh[lri!rVd!lri!rlhl!2kp!1rp!!#prZrq!2h\r[rJ$q[Id!rqrq[Id!!,hqlri!rHrq!2kprqrq!2kp!1rq!2qpq`$q[3$[r3!![Il\r[rJ$plri!rVhrlri!rld![Il[r3$r[3,[!!$Ulri!rVhllri!rVhjlri!rlhl!2k\rprqrp!!#prZrr!2h[r3!![Il[rJ$mlri!rVhclph[r[qSlrl[rJ$q[Ic[rJ$q[Ir\r[rJ$q[3$[rJ$r[IX!rVd!lrd!!,hqlri!rHrq!2kpr3$rlrkpr3!![Il[rJ$plri\r!rVhrlri!rVd!lri!rlhl!2kp!1rp!!#prZm!!2m!rHrq!2kprqrq!2kprZrp!2q\rp!Zm!!1V[rJ$q[I[[rJ$q[IR[rJ$r[IX!rVhrlrd!!,hqlrm!rHrp!!#prZrq!2c\r[!!$r!2kpcqrrr`&N!2qTlrErrHrq!2kprqrq!2kp!1ri!2m!rVhrlrF!rHrh!!$\r[rVhrlrF!rHrq!2kprqrq!2kp!1rf!2kprqrh!2h[rJ$q[Ir[rJ$q[Ih[q3$llr$\r[r[rq[I[[rJ$q[IR[pJ$q[Il[q!$mlrF!r1rq!2kpi1r`lrlrUHrf!2h[rJ$r[3+\rplqrq!2kp!1rf!2kprqrh!2h[p`!!lrkprqrh!2h[rJ$q[Ir[rJ$q[3$[pJ$q[Ir\r[p`$plri!rVhrlri!rld![Ih[q3$Ulri!rVhllri!rVhjlrB!rVhqlrJ!r1rh!2c\r[rJ$q[I2[hHrqrkR[!!$h!2h[rJ$q[Ir[rJ$q[3$[pJ$q[Ir[p`$plrF!!1rq[Ir\r[p`$plri!rVhrlri!rVd!lrB!rVhrlrN!r`$plri!rVhrlri!rVhplrN!kZrq!2k\rpqqrq!2kpqHrf!2kprZri!2c[p`$ml`!!r`$q[Fr[rrm"KJ$rUHrfrrh[rJ$q[Ir\r[rJ$q[Ir[r!$rl`!!r`$q[Ih[q`$llrN!rZrq[Ih[q`$llri!rVhrlri!rVhrlr`\r!rqrq!2kprHrl!2[[rJ$q[Ir[rJ$q[Ic[q`$klr$[r[rq[I[[rJ$q[IM[r!$rlri\r!rVhmlrX!qHrl!2V[rJ$q[H$[m1rqrkR[pJ$plri!rld#[Hr[rJ$q[Ir[r!$rlri\r!rVhplrX!qqrj!2l[rVhplrX!qqrq!2kprqrq!2kprqrm!2r[rJ$q[Ih[q`$llri\r!rVhrlri!rld![Ic[q`$Tlri!rVhllri!rVhilr`!rqrq!2kpr1rl!2R[q`$klri\r!rVhclph[r[qTl`!!p`$plri!rVhrlri!rVhrlr`!rqrq!2kprHrl!2[[q3$qlrk\rprHrl!2[[rJ$q[Ir[rJ$q[Ir[r!$rlri!rVhplrX!qqrq!2kprqrq!2kpr1rl!1R\r[rJ$q[I[[rJ$q[IM[r!$rlri!rVhmlrX!qHrl!2V[!!$r!2kpcqrrr`'1!2qLlrk\rpqHrq[Ic[rVhplrkprqm![IbprHrp[Ih[rVd!lri!rVhqlrfpr1rp[Ih[rVhplrk\rpr1rq[Ih[rVhrlrZprHrp[Ih[rVhplrkpr1rq[I[[rEhqlrqprZrYlrkpq1rq[IE\r[rVhrlrZpr1rp[Ih[rlhplrfprHrq[Ic[rVhJlr$[r[qLlrkpqHrr[3#pr1rq[Ih\r[rVhrlrZprHrp[Ih[rVd!lri!rVhqlrfpr1rp[Ih[rVhplrkpr1rq[Ih[rVhrlrZ\rprHrp[Ih[rVhplrkpr1rr[3#pqqrp[Il[rlhUlrkpq1rq[IE[rVhrlrZpr1rp[Ih\r[rlhplrfprHrq[Ic[rVhclph[r[qSlr[[rVhjlrkpr1rq[Ih[rVhrlrZprHrp[Ih\r[rVd!lri!rVhqlrfpr1rp[Ih[rVhplrkpr1rq[Ih[rVhrlrZprHrp[Ir[rqrq[Ih\r[rVhmlrkpqqrp[Il[rlhUlrkpq1rq[IE[rVhrlrZpr1rp[Ih[rlhplrfprHrq[Il\r[rqrq[Fr[rrm"&J$rTZrf[Ih[rVhmlrkprHrl[Ibpr1rh[3$[rJ$h[I[[plhplrk\rpr1rq[Ih[pVhmlrHprHrq[Ic[rVhklrQprZrYlrkpq1rq[IE[pVhllrLpr1rh[Ic\r[rVhJlr$[r[qQlrDprHrr[3#pr1rq[Ih[pVhmlrHp!1rq!2Hpqqrh[Ih[rVhmlrk\rprHrf[Ic[plhplrkpr1rr[3#pqZrj[HV[rVhilrkppZrf[I[[q,hmlrHpr1rq[I2\r[hHrqrkM[rqrf[Ih[rVhmlrkprHrf[Ic[pld!lri!plhllrHprHrq[Ic[rVhplrD\rpr1rm[IbprHrq[Ic[rVhklrQpkZrq[IM[rVhflrDpqqri[Ic[plhqlrr[rVh2lrr\rr!6J!rkE[pVhplrkpr1rq[Ic[r,hrlrkpqZrl[Il[rJ$j[II[qlhllrkpr1rq[Ic\r[r,hrlrkpqZrl[I[[rVhmlrkpqHrl[Ih[lHrq[IM[rVhelrbprqrq[IR[qlhjlrZ\rpqZrq[H$[m1rqrkE[pVhplrqp!,hmlrkpr1rm[Ir[rVhklrZprZrq!2Qppqrl[I[\r[rVhmlrkpr1rm[Ir[rVhklrZpqqrq[Ic[rld![IR[qlhTlrkpq1rq[IA[r,hrlrk\rpqHrl[IR[qlhklrkpmqrGlrlrU1rrlrDprHrq[Ic[rVhmlrbprqrq[IV[qlhqlri\r!qEhhlrZpqqrq[Ic[rVhmlrbprqrq[IV[rVhq[I[[rVhmlrkpqHrl[HR[rVhilrk\rppHrm[Ir[rVhjlrZpqHrl[Ic[rqrq[Fr[rrm!-J$rJZrXlri!rVfFli([m1rqrjA\r[fHrq!2kpVqq"lph[r[qSlmE[rJ$q[F,[JHr+lrrr!$)!ri,[l1rq!2kpR1q"lr$\r[r[q9lpR[rJ$q[Dr[JHrGlrlrU1r'lri!rVh#li([bZrrr`!X!2q#lqR[rVfFli(\r[m1rqrjA[eZrq[Dr[JHrGlrlrU1r$lrkp`Zq"lmV[rrm!,!$rJZrTlrkpR1q"lr$\r[r[q9lpE[rVf[li([hHrqrkM[`qrq[F,[JHr+lrrr!#`!ri,[kHrq[Cc[JHr`lrl\rrPHr@lrkpVqq"lph[r[qSlm2[rVh#li([bZrrr`!J!2q#li([JHr`lrlrPHq"li(\r[hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrr\rr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li([JHr`lrl\rrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli(\r[JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li(\r[JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph\r[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!\rJ!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA\r[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li(\r[bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li(\r[m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrl\rrU1q"li([bZrrr`"3!2q+lrm!qqrklrm!XZrl!0r[i1rr!+6[m1rqrjA[pZrr!26\r[r`#blrX!mZr0lrm!YqrGlrlrU1rMlrm!p1rr!,,[r`$p!,l[r`$+lmV[rrm!FJ$\rrT1rr!1R[r`$llrV[r`#clrm!fZrk!2$[r`$klrm!T1r`lrlrT1rr!26[pZrr!26\r[r`#clrm!lHrZlrS!m1rr!2V[r`#hlph[r[qSlrh[r`$Tlrm!p1rr!,2[r`!!lp[\r[qJ$`lrm!qZrr!-V[bZrrr`"q!2qPlrd!kZrr!2[[qZrr!,6[r`$Clrm!rHrr!2(\r[r`$klrm!T1r`lrlrTHrp!2A[pZrr!26[r`#dlrm!l1rZlrm!rHrr!2([r`$klrm\r!YqrGlrlrU1rqlrd!kZrr!26[r`#dlrm!rqrElrm!rHrr!2([r`$klrm!bZr+lrr\rr!(i!rkA[r3$Ulrm!qqrklrm!Y1rr!0R[r`$mlrm!mZrr!2V[r`#Nlr$[r[qPlrd\r!pHrflrm!p1rr!,6[r`$Xlql[r`$mlrm!mZrr!2V[r`#hlph[r[qSlrl[r3$Ulrm\r!p1rr!,6[r`$rlp[[r`$mlrm!mZrr!2V[r`$+lmV[rrm"A3$rTHm$!1r[!1l[q`$\rml`!!rJ$plrm!rqrq!2c[r`$plrm!r1rl!2c[q`$mlrd!r1rr!2r[r3$blrm!q1r\rm!2c[r`$rlrd!p1rr!2c[r`$rlrm!r1rr!2h[r`$klrm!rqrq!2[[r!$plrm!rqr\rq!,r[m1rqrkA[!`$[l`$elrV[q`$mlrd!rHrr!2r[rJ$mlrm!rHrr!2c[q`$mlrX\r!r1rp!2c[r`$rlrd!mZrr!2M[r!$mlrm!rqrp!26[r`$mlrm!rqrr!2c[r`$plrm\r!qZrr!2r[rJ$llr`!rHrr!2r[rJ$5lph[r[qSlrl[!`$[l`$ZlrX!r1rp!2h[r`$\rrlri!r1rr!2h[r`$mlrX!r1rl!2c[r3$mlrm!rqrp!2,[r`$rlrV[r!$mlrm!rqr\rp!26[r`$mlrm!rqrr!2c[r`$plrm!qZrr!2r[rJ$llr`!rHrr!2r[rJ$PlmV[rrm\r"i3$rTZrr!2r[r`$`lrm!rZrr!2l[r`!!lrr[r`$qlrm!"Hm!lqm!!2h[r`$plrm\r!rHrr!2l[r`$plrm!rZrr!2l[r`$qlrm!rHrr!!A[!1r[!!$dlrJ!rZrr!2l[r`$\rplrm!"Hm!lqm!!26[r`$mlrm!rqrr!2c[r`$rlrN!rZrr!!A[!1r[!!$plrm!rZr\rr!2l[r`!&l`$[l`!!`1r`lrlrTZrr!2r[r`$flr[[r`$qlrm!rZrr!2l[r`$qlrm\r!"Hm!lqm!!2h[r`$plrm!rHrr!2l[r`$plrm!rZrr!2l[r`$qlrm!rHrr!!A[!1r\r[!!$dlrJ!rZrr!2l[r`$plrm!"Hm!lqm!!26[r`$mlrm!rqrr!2c[r`$rlrN!rZr\rr!!A[!1r[!!$plrm!rZrr!2l[r`!&l`$[l`!!dqrGlrlrU1rrlrm!rqrr!2$[r`$\rqlrm!rZrr!2l[r`$qlrm!"Hm!lqm!!2h[r`$plrm!rHrr!2l[r`$plrm!rZrr!2l\r[r`$qlrm!rHrr!!A[!1r[!!$dlrX!rJ$qlrm!rZrr!2h[r`!&l`$[l`!!p1rr!2c\r[r`$rlrm!r1rr!2r[q3$qlrm!"Hm!lqm!!2h[r`$qlrm!rZrr!!A[!1r[!!$QlmV\r[rrm"YJ$rTZrr!2r[r`$alrm!rHrr!2l[r`!!lrl[r`$rlri!rHrr!2l[r`$plrm\r!rZrr!2h[r`$qlrm!rHrr!2l[r`$plrm!rZrq!2l[r`$blrm!qZrr!2c[r`$qlri\r!rZrr!26[r`$plrm!rHrr!2h[r`$plrm!qZrq!2l[r`$qlrm!r1rr!2r[rJ$qlrm\r!`1r`lrlrTZrr!2r[r`$flrc[r`$plrm!rZrr!2h[r`$rlri!rHrr!2l[r`$plrm\r!rZrr!2h[r`$qlrm!rHrr!2l[r`$plrm!rZrq!2l[r`$blrm!qZrr!2c[r`$qlrm\r!!!$qlrm!p1rr!2h[r`$plrm!rHrr!2h[r`$klri!rZrr!2l[r`$mlrm!rqrq!2l\r[r`$6lph[r[qSlrr[r`$rlrm!mHrr!2h[r`$qlrm!rHrr!2r[rJ$plrm!rZrr!2h\r[r`$qlrm!rHrr!2l[r`$plrm!rZrr!2h[r`$qlri!rZrr!2,[r`$rlrc[r`$mlrm\r!rZrq!2l[r`$dlrm!rHrr!2h[r`$plrm!rHrr!2V[rJ$qlrm!rZrr!2c[r`$rlri\r!rZrr!1E[bZrrr`'d!2qQlrm!rqrr!2,[r`$mlrm!rqrr!2r[rZrr!2r[r`$mlrm\r!rZrr!2h[r`$rlrm!r1rr!2r[r`$mlrm!rqrr!2c[r`$qlrm!rHrr!2,[r`$klrm\r!r1rr!2l[r`$plrm!p1rr!2l[rJ$plrm!rZrr!2c[r`$klrm!rHrr!2l[r`$mlrm\r!rqrr!2h[r`$!lr$[r[qQlrm!rqrr!2E[rHrr!2c[r`$rlrm!r1rr!2r[r`$mlrm\r!rZrr!2h[r`$rlrm!r1rr!2r[r`$mlrm!rqrr!2c[r`$qlrm!rHrr!2,[r`$klrm\r!r1rr!2l[r`$plrm!p1rr!2l[rJ$plrm!rZrr!2c[r`$klrm!rHrr!2l[r`$mlrm\r!rqrr!2h[r`$6lph[r[qSlrr[r`$rlrm!mZrr!2c[r`$rlrm!r1rr!2r[r`$mlrm\r!rZrr!2h[r`$rlrm!r1rr!2r[r`$mlrm!rqrr!2c[r`$qlrm!rHrr!2,[r`$rlrc\r[r`$mlrm!rZrr!2h[r`$dlrm!rZrq!2h[r`$qlrm!r1rr!2V[r`$plrm!rZrr!2c\r[r`$rlrm!rHrr!1E[bZrrr`&i!2qQl`!!rHm!!2,[r`$mlrm!rqrp!2`!rqrr!2c\r[r`$qlrm!rHrr!2r[r`$mlrm!rqrr!2c[r`$rlrJ!rZrr!1c[r`$klrm!r1rr!2l\r[r`$ZlrX!qZrr!2r[r`$mlrm!qZrr!2h[r`$qlrm!r1rr!2r[r`$plrm!`1r`lrl\rrTZm!!2h[!!$flrh[r`$mlrm!rqri!2r[r`$mlrm!rZrr!2h[r`$rlrm!r1rr!2r\r[r`$mlrm!rqri!2l[r`$Xlrm!qZrr!2c[r`$qlrm!lZrl!2V[r`$rlrm!r1rr!2V\r[r`$plrm!rZrr!2c[r`$rlrm!rHrr!02[hHrqrkM[rqm!!2h[!!$blrm!r1rr!2r\r[q!$rlrm!r1rr!2l[r`$plrm!rqrr!2c[r`$rlrm!r1rr!2r[q!$qlrm!l1rr!2r\r[r1rr!2c[r`$qlrm!lZrl!2V[r`$rlrm!r1rr!2V[r`$plrm!rZrr!2c[r`$rlrm\r!rHrr!1E[bZrrr`&i!2qRlrm!rHrr!22[r`$mlrm!rqrr!2r[qZrr!2c[r`$qlrm\r!rHrr!2r[r`$mlrm!rqrr!2c[r`$rlrm!pqrr!1c[r`$klrm!r1rr!2l[r`$Zlrm\r!pZrr!2r[!!$llrm!qZrr!2h[r`$qlrm!r1rr!2r[r`$plrm!`1r`lrlrTqrr!2h\r[r`$hlrh[r`$mlrm!rqrr!2M[r`$mlrm!rZrr!2h[r`$rlrm!r1rr!2r[r`$mlrm\r!rqrr!2I[r`$Xlrm!qZrr!2c[r`$qlrm!lZrr!2E[r`$rl`!!qqrr!2V[r`$plrm\r!rZrr!2c[r`$rlrm!rHrr!02[hHrqrkM[!Zm!!2h[r`$clrm!r1rr!2r[r`$ilrm\r!r1rr!2l[r`$plrm!rqrr!2c[r`$rlrm!r1rr!2r[r`$hlrm!l1rr!2r[r1rr!2c\r[r`$qlrm!lZrr!2E[r`$rl`!!qqrr!2V[r`$plrm!rZrr!2c[r`$rlrm!rHrr!1E\r[bZrrr`&J!2qRlrN!mqrr!2c[r`$rlrm!rqrklrm!r1rr!2l[r`$plrm!rqrr!2c\r[r`$rlrm!r1rr!2r[r`$hlrm!l1rr!2V[r`$mlrm!rZrr!1l[r`$elrd!qqrr!2V\r[r`$plrm!rZrr!2c[r`$rlrm!rHrr!-$[m1rqrkI[q3$hlrh[r`$mlrm!rqrr!2M\r[r`$mlrm!rZrr!2h[r`$rlrm!r1rr!2r[r`$mlrm!rqrr!2I[r`$Xlrm!qZrr!2c\r[r`$qlrm!lZrr!2A[r3$llrm!qZrr!2h[r`$qlrm!r1rr!2r[r`$plrm!dqrGlrl\rrU1m!lrN!mqrr!2c[r`$rlrm!q1rr!2c[r`$qlrm!rHrr!2r[r`$mlrm!rqrr!2c\r[r`$rlrm!pqrr!1c[r`$rlrc[r`$mlrm!rZrr!1l[r`$elrd!qqrr!2V[r`$plrm\r!rZrr!2c[r`$rlrm!rHrr!1E[bZrrr`&X!2qRlrm!rHrr!22[r`$plri!rZrr!!$\r[qZrr!2h[r`$plrm!rZrq!2r[r`$plri!rqrr!2h[rJ$qlrm!q1rr!1c[r`$klrm\r!r1rr!2l[r`$Zlrm!pHrp!2[[r`$klrm!rHrr!2l[r`$mlrm!rqrr!2h[r`$!lr$\r[r[qRlrm!rHrr!2I[rHrr!2h[rJ$qlrm!qHrr!2h[r`$plrm!rZrq!2r[r`$plri\r!rqrr!2h[rJ$qlrm!q1rr!1c[r`$klrm!r1rr!2l[r`$Zlrm!pHrp!2[[r`$klrm\r!rHrr!2l[r`$mlrm!rqrr!2h[r`$6lph[r[qSl`,[!!$plrm!mqrr!2h[rJ$qlrm\r!qHrr!2h[r`$plrm!rZrq!2r[r`$plri!rqrr!2h[rJ$qlrm!q1rr!1c[r`$rlrc\r[r`$mlrm!rZrr!1l[r`$elrd!qqrr!2V[r`$plrm!rZrr!2c[r`$rlrm!rHrr!1E\r[bZrrr`'`!2qSlrm!qqrr!22[r`$rl`-!l`!!rZrq!2h["!$[l`!!rZrr!2c[r`$\rrl`-!l`!!rZrr!2r[!`$[!!$qlrm!rqm$!1m!!2l[rJ$pl`!!rZrr!1c[r`$jlrm\r!rZrr!2h[r`$Zlrm!p1rr!2V[rJ$rl`!!rZrr!2h[r`$plrm!rZrr!2l[r`$plrm\r!`1r`lrlrU1rr!2[[r`$ilrc[r`$rl`-!l`!!rZrq!2h["!$[l`!!rZrr!2c[r`$\rrl`-!l`!!rZrr!2r[!`$[!!$qlrm!rqm$!1m!!2l[rJ$pl`!!rZrr!1c[r`$jlrm\r!rZrr!2h[r`$Zlrm!p1rr!2V[rJ$rl`!!rZrr!2h[r`$plrm!rZrr!2l[r`$plrm\r!dqrGlrlrU1rr!2[[r`$clrm!rqm$!1m!!2l[rJ$pl`3!lqm!!2l[r`$mlrm!rqm\r$!1m!!2l[r`$rl`-!l`!!rZrr!2r[!`$[!!$qlri!rHm!!2l[r`$Xlrm!rqrllrm\r!rZrr!2h[r`$Zlrm!p1rr!2V[rJ$rl`!!rZrr!2h[r`$plrm!rZrr!2l[r`$plrm\r!jZr+lrrr!8B!rkM[r`$llrm!mZrq!2r[r`$ml`!!r3$qlrX!qZrq!2r[r`$plri\r!rqrr!2h[rJ$rlrm!r1rm!2h[r`$Xlrm!q1rm!2c[r`$Zlrm!p1rr!2R[r3$plrm\r!rHrr!2c[r!$plrm!rHrr!-$[m1rqrkM[r`$llrm!q1rllri!rqrr!2c[r!$qlrX\r!qZrq!2r[r`$plri!rqrr!2h[rJ$rlrm!r1rm!2h[r`$Xlrm!q1rm!2c[r`$Zlrm\r!p1rr!2R[r3$plrm!rHrr!2c[r!$plrm!rHrr!02[hHrqrkM[r`$llrm!mZrq!2r\r[r`$mlr`!rZrl!2V[rJ$rlrm!rHrq!2r[r`$plri!rqrr!2c[r!$plrm!l1rr!2r\r[qZrm!2c[r`$Zlrm!p1rr!2R[r3$plrm!rHrr!2c[r!$plrm!rHrr!1E[bZrrr`"\r%!2q#lph[r`$ilrm!XZrbl`!!NHr`lrlrPHr+lrm!q1rr!-A[hqm!!+6[hHrqrkM\r[Yqrr!2M[r`$Blmc[!!#hlmV[rrm!4!$rJZrGlrm!q1rr!,,[mqrr!*([m1rqrjA\r[bZrr!2M[r`$&lq$[r`#Nlph[r[qSllI[r`$ilrm!f1r0lrm!Yqr+lrrr!&`!ri,\r[j1rr!2h[r`$qlrm!rHrr!,([p1rr!*!!lr$[r[q9lp([r`$plrm!rZrr!2h[r`$\r%lq([r`#Mlph[r[qSlll[r`$plrm!rZrr!2h[r`$Alml[r`#flmV[rrm!4!$rJZr\rMlrX!r1rl!,$[pqrp!)r[m1rqrjA[d1rl!2c[q`$$lq6[r3#Llph[r[qSllh[q`$\rmlrX!eZr4lrd!YHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZr\rrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1r\rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q\r"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq\r"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHr\rGlrlrU1q"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm\r!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q\r9li([JHrGlrlrU1q"li([bZrrr`#j!2qRlrm!rqrq!2c[r`$rlrd!rHrm!2V[!!$\rm!2l[r`$rlrd!r1rl!!R[!!$[!!$[l`!!rHrl!,$[JHr`lrlrTqrr!2r[rJ$mlrm\r!rqrr!2m!rHrm!2V[q`$qlrm!rqrp!2c[q`!*l`!!l`!!lqm!!2h[q`$$li([hHr\rqrkM["1m!!1r[rJ$mlrm!rqrp!2h[r!$klrX!rZrr!2r[r3$mlrX!#Hm!!1m!!1r\r[!!$plrX!eZq"lmV[rrm"!J$rTqrr!!A[!1r[!!$plrm!"Hm!lqm!!2l[r`$qlrm\r!r1rr!2l[r`$qlrm!"Hm!lqm!!2h[r`$qlrm!!1rq!!$[rJ!%l`!!lqrq!2l[r`#\rali([m1rqrkI[r`!&l`$[l`!!rHrr!!2[!1r[r`$qlrm!rZrr!2c[r`$qlrm!rZr\rr!!A[!1r[!!$plrm!rZrr!!$[rJ!!lri!"1m!!1r[rJ$qlrm!a1q"lph[r[qSl`M\r[!!$[!1r[!!$plrm!"Hm!lqm!!2l[r`$qlrm!r1rr!2l[r`$qlrm!"Hm!lqm!!2h\r[r`$qlrm!!1rq!!$[rJ!%l`!!lqrq!2l[r`$Ali([bZrrr`$H!2qRlri!rHrr!2l\r[rJ$qlrm!rqrr!2c[r`$qlrm!!1rqlrm!rZrq!2l[r`$qlrm!rHrr!!l[!!$[l`!\r!lqm!!1r[!!#Vli([m1rqrkI[rJ$plrm!rZrq!2l[r`$rlrm!r1rr!2l[r`$plrm\r!rZrq!2l[r`$qlrm!rHrr!!l[!!$[l`!!lqm!!1r[!!#qli([hHrqrkM[!1rq!2h\r[r`$qlri!rZrr!2r[r`$mlrm!rZrr!2h[r`$qlri!rZrr!2l[r`$plrm!$Zm!!1r\r[!!$[l`!!lqm!!0([JHr+lrrr!0i!rkI[r`$mlrm!rZrr!2h[r`$rlrm!r1rr!2r\r[r`$rlrl[r`$qlrm!rHrr!2r[r`$mlrm!$1m!!1r[!!$[l`!!lqrq!+c[JHr`lrl\rrTqrr!2c[r`$qlrm!rHrr!2r[r`$mlrm!rqrr!2c[r`$qlrm!rHrr!2r[r`$mlrm\r!$1m!!1r[!!$[l`!!lqrq!,r[JHrGlrlrU1m#l`!!r1rr!2l[r`$plrm!rqrr!2c\r[r`$rlrm!r1rr!2l[r`$plrm!rqrr!2c[r`!-l`!!lqm!!1r[!!$[lri!dZq"lmV\r[rrm!b!$rTqrr!2c[r`$qlrm!qHrr!2c[r`$rlrm!rqrqlrm!rZrr!2R[r`$mlrm\r!#Zm!!1r[!!$[l`!!rZrm!+r[JHr`lrlrTqrr!2c[r`$qlrm!rHrplrm!r1rr!2r\r[r`$mlrm!rZrr!2R[r`$mlrm!#Zm!!1r[!!$[l`!!rZrm!-,[JHrGlrlrU1m#l`!\r!r1rr!2l[r`$jlrm!r1rr!2r[r`$mlrm!rZrr!2R[r`$mlrm!#Zm!!1r[!!$[l`!\r!rZrm!0A[JHr+lrrr!-J!rkI[r`$mlrm!rZrr!2R[r`$mlrm!rqrr!2r[rZrr!2l\r[r`$jlrm!r1rr!!V[!!$[l`!!lqm!!2[[r3#ali([m1rqrkI[r`$mlrm!rZrr!2h\r[rHrr!2c[r`$rlrm!r1rr!2l[r`$jlrm!r1rr!!V[!!$[l`!!lqm!!2[[r3$%li(\r[hHrqrkM[!Zm!!2c[r`$qlrm!qHrr!2c[r`$rlrm!r1rr!2l[r`$jlrm!r1rr!!V\r[!!$[l`!!lqm!!2[[r3$Ali([bZrrr`$)!2qRlrm!r1rr!2l[r`$jlrm!r1rr!2r\r[r`$rlrl[r`$qlrm!qHrr!2c[r`!+l`!!lqm!!1r[!!$jlri!XZq"lr$[r[qRlrm\r!r1rr!2l[r`$plrh[r`$mlrm!rqrr!2c[r`$qlrm!qHrr!2c[r`!+l`!!lqm!!1r\r[!!$jlri!aHq"lph[r[qSl`,[!!$mlrm!rZrr!2R[r`$mlrm!rqrr!2c[r`$qlrm\r!qHrr!2c[r`!+l`!!lqm!!1r[!!$jlri!f1q"lmV[rrm!b!$rTqrr!2h[r`$plrm\r!qHrr!2c[r`$rlrm!rqrrlri!rZrr!2R[r`$plri!#Zm!!1r[!!$[l`!!q1rr!,,\r[JHr`lrlrTqrr!2h[r`$plrm!rHrplrm!r1rr!2r[r`$plri!rZrr!2R[r`$plri\r!#Zm!!1r[!!$[l`!!q1rr!-A[JHrGlrlrU1m#l`!!rHrr!2h[r`$jlrm!r1rr!2r\r[r`$plri!rZrr!2R[r`$plri!#Zm!!1r[!!$[l`!!q1rr!0M[JHr+lrrr!0m!rkI\r[r`$qlrm!r1rr!2M[r`$qlrm!rHrr!!$["1m!l`!!rZrr!2M[r`$rla%!l`!!l`!\r!lqm!!1r[!!$[l`$mlri!XZq"lr$[r[qRlrm!rZrr!2c[r`$plrc[r`$qlrm!rHr\rr!2r[!`$[!!$qlrm!q1rr!2r[%3$[!!$[!!$[l`!!lqm!!1r[!2c[rJ$&li([hHr\rqrkM[!Zm!!2l[r`$mlrm!q1rr!2l[r`$plrm!rqm$!1m!!2l[r`$ilrm!rqm4!1m\r!!1m!!1r[!!$[l`!!lqm!r1rq!0M[JHr+lrrr!,!!rkI[q`$llrm!pqrm!2[[r`!\r%!1r[!!$qlrm!pqrq!2r[r`!+l`!!lqm!!1r[!!$qlrS!XHq"lr$[r[qRlrX!qqr\rr!2h[qqrm!2[[rJ$rlrm!rZrr!2I[rJ$rlrm!#Zm!!1r[!!$[l`!!rZrk!-6[JHr\rGlrlrU1m!lrX!qqrr!2I[r!$llri!rqrr!2l[r`$hlri!rqrr!!V[!!$[l`!!lqm\r!!2l[qJ$Ali([bZrrr`!i!2qRlrm!hZrqlrm!KZq"lr$[r[qRlrm!mHrVlrm!QHq\r"lph[r[qSl`,[!!$Elrm!V1q"lmV[rrm!1!$rTqrr!0l[rZrr!)E[JHr`lrlrTqr\rr!2([kqrr!*R[JHrGlrlrU1m#l`!!fqrr!+c[JHr+lrrr!%3!rkI[r`$Llrm!rqr\rrlrm!KHq"lr$[r[qRlrm!mHrblrm!rHrr!*M[JHrGlrlrU1m#l`!!iZrr!2h[r`#\rVli([bZrrr`!i!2qRlrm!iHrq!2i!K1q"lr$[r[qRlrm!mHralrX!Pqq"lph[r[q\rSl`,[!!$KlrX!UZq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr\r+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li([JHr\r`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[q\rSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q\r#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq\r"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZr\rrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1r\rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q\r"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq\r"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHr\rGlrlrU1q"li([bZrrr`"S!2q&lrm!!1q(lrm!rHrUlrm!pqrm!16[r`$Nlrd!kHr\r`lrlrPHralrm!Nqrdlrm!jZrr!2I[r!$Nlrm!j1rp!2c[hHrqrkM[hZrr!+E[iHr\rr!1E[r`$hlr`!j1rr!1l[pqrp!0M[rrm!M!$rT1rm!1I[r`!!lqc[r!#Klrm!rHr\rUlrm!q1rr!2h[!!$Plrm!iZrr!1R[m1rqrk6[r!$hlr([r`$Vlr`!VZrdlrm!jZr\rr!2M[r`$pl`!!jHrr!1,[r`$mlph[r[qSlrh[r!$Rlrm!kqrm!-([iHrr!1E[r`$\rilrm!rHm!!1A[r`$ZlrA[r`$Blrrr!(3!rk([r`$Rlrm!!1rTlrm!QqrUlrm!qHm\r!!2V[!!$&lrm!kHr`lrlrSHrr!2I[mHrr!1M[r`#ZlpI[r`$jl`!!qZm!!-A[r`$\rmlph[r[qSlrV[r`$Rlrm!k1rr!-([a1rr!2R[!!$kl`!!dHrelrm!f1rrr`"d!2q\rKlrm!jqrr!!$[kHrr!*[[kZrr!2R[!!$klrm!aZrr!1R[m1rqrk([r`$hlr([r`$\rSlrm!VZrAlrm!qHm!!2V[r`$'lrm!r1rGlrlrU1rklrm!jqrr!1M[r`$"lm6[r`$\rjl`!!qZrr!0,[pHrr!0M[rrm"G`$rSHrr!2[[q`$mlrX!rZrr!!$[rZm!!1h[r`$\rllrX!rqrr!2r[rJ$mlrX!qZrp!2h[r`$rlri!fqrl!2h[rZrl!2c[q`$qlrm!rHm\r$!1r[!2l[r3$rl`!!rHrl!!,[!!$qlrm!rZrr!!$[r3$`lrm!rqrq!2V[r`$Tlr$\r[r[qKlrm!qqrp!2m!r1rl!2l[r`$pl`!!lHrr!2[[q`$rlrm!rqrq!2c[q`$klrd\r!rHrr!2r[rJ$NlrM[q`$klrX!r1rl!2l[r`$pl`-!lqm!rZrp!2r[!!$plrX!!Zm\r!!2l[r`$qlrm!!1rp!2$[r`$rlri!qZrr!2c[hHrqrkM[qZrr!2[[q`$mlrX!rZr\rr!2h[!!$Ylrm!qqrl!2r[r`$rlri!r1rl!2V[r3$plrm!rqrq!2I[jHrl!2V[q`$\rmlrX!rZrr!2h[!`$[l`$qlrd!rqm!!2h[q`!#l`!!rZrr!2l[r`!!lrd!m1rr!2r\r[rJ$klrm!f1rrr`)0!2qKlrm!r1rr!2l[r`$plrm!rHm!!2l[r`!!lrr[!!$Xlrm\r!r1rr!2l[r`$rlrm!"Hm!lqm!!2l[rJ$qlrm!rHrr!2l[r`$qlrm!"Hm!lqm!!0r\r[!!$llrm!rHrrlrm!rZrr!2h[r`$pl`!!rZrr!2l[!!$ql`!!rZm'!1r[!1r[!2l\r[r`$pl`-!l`!!rZrr!2l[r`$qlrm!m1rr!!A[!1r[!!$llrm!qqm!!2$[m1rqrk(\r[r`$mlrm!rZrr!2h[r`$pl`!!rZrr!2l[!!$Xlrm!r1rr!2l[r`$rlrm!"Hm!lqm\r!!2l[rJ$qlrm!rHrr!2l[r`$qlrm!"Hm!lqm!!1A[qqm!!2[[r`$llrm!rZrr!2h\r[r`$pl`!!rZrr!2l[!!$ql`!!rZm'!1r[!1r[!2l[r`$pl`-!l`!!rZrr!2l[r`$\rqlrm!m1rr!!A[!1r[!!$llrm!r1m"l`$IlrlrU1rklrm!r1rr!2l[r`$plrm!rHm\r!!2l[r`$ql`!!l1rr!2c[r`$qlrm!rqrr!!A[!1r[!!$qlri!rZrr!2h[r`$qlrm\r!rZrr!!A[!1r[!!$ilqM[!!$llrm!qqrr!2l[r`$plrm!rHm!!2l[r`$ql`!!rZm\r!!2l["J$[l`$[l`$qlrm!rHm$!1m!!2l[r`$qlrm!rZrr!2$[r`!&l`$[l`!!qqr\rr!2[[!!$Ilrrr!FF!rk([r`$plrm!rHrr!2l[r`$ilrm!!1m"l`$Vlrm!rHrr!2h\r[r`$rlri!rZrr!2l[r`$hlrm!rHrr!2r[rJ$qlrm!iHrr!2V[r`$pl`,[!!$plrm\r!rZrr!2M[r`$rl`!!rHm$!1r[!2l["`$[l`$[l`!!qZrr!2l[rJ$rlrm!rZrr!2$\r[rJ$qlrm!qqrr!2V[r`$blr$[r[qKlrm!rHrr!2h[r`$qlrm!q1rr!2r[!!$Vlrm\r!rHrr!2h[r`$rlri!rZrr!2l[r`$hlrm!rHrr!2r[rJ$qlrm!jHrplrm!qZrr!2c\r[r`$plrm!rZrr!2M[r`$rl`!!rHm$!1r[!2l["`$[l`$[l`!!qZrr!2l[rJ$rlrm\r!rZrr!2$[rJ$qlrm!qqrr!2c[rqrr!1([r[qSlrV[r`$plrm!rHrr!2l[r`$ilrm\r!rqm!!1[[r`$plrm!rHrr!2r[rJ$qlrm!rZrr!2I[r`$plrm!rqrq!2l[r`$ilqV\r[r`$klrm!r1rr!2h[r`$qlrm!q1rr!2r[!!$pl`-!lqm!rZm(!1r[!1r[!!$klrm\r!rZrq!2r[r`$qlrm!m1rr!!!!rZrr!2[[r`$klrm!iHrrr`'k!2qKlrm!rZrr!2c\r[r`$rlrm!pqrr!!$[!!$Ulrm!rZrr!2c[r`$rlrm!rHrr!2l[rJ$jlrm!r1rr!2r\r[r`$plrm!j1rq!2M[r`$plrm!r1rr!2r[r`$hlrm!!Hm!r1m$!1r[!2l["J$[l`$\r[!!$ilrm!!1rp!!,[!!$plrm!m1rr!2h[r`$llrm!q1rq!2A[m1rqrk([r`$qlrm\r!r1rr!2r[r`$hlrm!!Hm!kZrr!2l[r`$mlrm!rqrr!2h[r`$qlri!qHrr!2c[r`$\rrlrm!rHrr!1A[!1rq!2M[r`$plrm!r1rr!2r[r`$hlrm!!Hm!r1m$!1r[!2l["J$\r[l`$[!!$ilrm!!1rp!!,[!!$plrm!m1rr!2h[r`$llrm!r1rplri!j1rqrkM[qZr\rr!2l[r`$mlrm!rqrr!2I[r`!"l`$Ulrm!rZrr!2c[r`$rlrm!rHrr!2l[rJ$jlrm\r!r1rr!2r[r`$plrm!q1rYlri!q1rr!2h[r`$mlrm!rqrr!2I[r`!"l`$ml`-!lqm\r!rZm'!1r[!1m!!2M[r`!!lrd!!Zm!!2h[r`$`lrm!rHrr!2[[r`$ilri!j1rrr`'\rJ!2qKlrm!rZrr!2c[r`$rlrm!pqrq!!!!kZrr!2l[r`$mlrm!rqrr!2h[r`$plr`\r!r1ri!2r[r`$plrm!jZrr!2A[r`$plrm!r1rr!2r[r`$hlrd!r1m0!1r[!1r[!!$\r[!!$[!!$ilrm!"qm!l`!!l`!!rHrr!2$[r`$plrm!qqrr!2A[r`$hlr$[r[qKlrm\r!rZrr!2c[r`$rlrm!pqrp!1V[r`$qlrm!r1rr!2r[r`$plrm!rHrm!2c[q!$rlrm\r!rHrr!1E[!*!%pHrr!2h[r`$mlrm!rqrr!2I[r3$ml`d!lqm!lqm!!1m!!1m!!2M\r[r`!(l`$[!!$[!!$plrm!m1rr!2h[r`$llrm!r1rklrm!jZrqrkM[qZrr!2l[r`$\rmlrm!rqrr!2I[r3$Ulrm!rZrr!2c[r`$rlrm!rHrr!2h[r!$mlrJ!rqrr!2h[r`$\rilqr[r`$elrm!rHrr!2c[r`$rlrm!pqrp!2c[$3$[l`$[l`!!l`!!l`!!q1rr!!I\r[!1m!!1m!!2h[r`$`lrm!rHrr!2[[r`$elrm!jZrrr`'G!2qKlrm!rZrr!2c[r`$\rrlrm!pqrq!!!!kZrr!2l[r`$mlrm!rqrr!2h[r`$klrd!rZrr!2M[r`$plrm!k1r\rr!22[r`$plrm!r1rr!2r[r`$hlrd!r1m!!2l[r`!!lri!rqrr!2M[r`!(l`$[l`$\r[!!$plrm!m1rr!2h[r`$llrm!mqrr!2R[m1rqrk([r`$qlrm!r1rr!2r[r`$hlrd\r!kZrr!2l[r`$mlrm!rqrr!2h[r`$klrd!rZrr!2M[r`$plrm!k1rr!!$[p1rr!2h\r[r`$mlrm!rqrr!2I[r3$ml`!!rZrr!!$[rJ$rlrm!q1rr!!I[!1r[!1m!!2h[r`$\r`lrm!rHrr!2[[r`$mlrM[r`$SlrlrU1rklrm!rZrr!2c[r`$rlrm!pqrp!1V[r`$\rqlrm!r1rr!2r[r`$plrm!qZrp!2l[r`$ilrm!rHrr!2M[mHrr!22[r`$plrm!r1r\rr!2r[r`$hlrd!r1m!!2l[r`!!lri!rqrr!2M[r`!(l`$[l`$[!!$plrm!m1rr!2h\r[r`$llrm!mqrr!1M[rrm"Q`$rSHrr!2l[r`$mlrm!rqrr!2I[r`!!lrm!kqrr!2l\r[r`$mlrm!rqrr!2h[r`$ilri!rqrr!2M[r`$plrm!jZrr!2A[r`$plrm!r1rr!2r\r[r`$hlrm!!Zm!!2c[!!$hlrm!q1rr!!I[!1r[!1m!!2h[r`$`lrm!rHrr!2[[r`$\relrm!pqr`lrlrSHrr!2l[r`$mlrm!rqrr!2I[r`!#l`!!kqrr!2l[r`$mlrm!rqr\rr!2h[r`$ilri!rqrr!2M[r`$plrm!jZm!N!6elrm!rHrr!2c[r`$rlrm!pqrr!!,\r[!!$ml`!!pqrr!2M[r`!(l`$[l`$[!!$plrm!m1rr!2h[r`$llrm!r1rklrm!jZr\rqrkM[qZrr!2l[r`$mlrm!rqrr!2I[r`!#l`!!kqrr!2l[r`$mlrm!rqrr!2h[r`$\rilri!rqrr!2M[r`$plrm!q1r[lrm!pHrr!2h[r`$mlrm!rqrr!2I[r`!#l`!!r1m\r!!2I[r`$ilrm!"qm!lqm!l`!!rHrr!2$[r`$plrm!qqrr!2A[r`$Qlrrr!DJ!rk(\r[r`$qlrm!rHrq!2l[r`$ilrm!!1m#l`!!l1rr!2l[r`$plri!rqrr!2h[r`$hlrm\r!rZrr!2R[r`$plrm!qqrr!1c[rJ$ilrm!rHrr!2h[rJ$qlrm!q1rr!2r[r`$pl`!\r!pZrr!2R[r3$rlrd!rHrr!2M[rJ$mlrm!rHrr!2[[r`$ilri!pHr`lrlrSHrr!2l\r[r`$pl`!!r`$qlrm!q1rr!2r[r`$Xlrm!rZrr!2h[rJ$rlrm!rHrr!2I[r`$qlrm\r!qHrr!2h[r`$llrm!lHm!lri!q1rr!2h[r`$plri!rZrr!2M[r`$rlrm!rHm!!2E\r[r`$jlrd!rqrp!2h[r`$ilri!r1rr!2h[r`$llrm!r1rplri!j1rqrkM[qZrr!2l\r[r`$plri!rZrr!2M[r`$rlrm!l1rr!2l[r`$plri!rqrr!2h[r`$hlrm!rZrr!2R\r[r`$plrm!qqrr!!$[lHrq!2M[r`$plrm!rHrq!2l[r`$ilrm!rqrr!2h[!!$flrm\r!qHrp!2r[r3$plrm!q1rq!2c[r`$plrm!qqrr!2M[rJ$Nlrrr!IX!rkI[!!$plrm\r!r1rr!2r[!`$[!!$qlri!qHrr!!$[rqrr!22[!!$plrm!r1rr!2r["`$[!!$[l`!\r!rHrr!2l[!!$mlri!rZrq!2h["!$[l`!!rHrr!2[[rJ$Ulrm!qZrr!2h[#1m!!1r\r[!1m!!2l[rJ$jlrm!rZrr!2h[r`$ql`!!r1rq!2R[r`$plrm!r1rr!2M[rJ$mlrm\r!rHrr!2[[r`$klrm!mZr`lrlrTqm!!2h[r`$mlrm!rqm"!1rr!2l[rJ$jlrm!rZr\rr!22[!!$plrm!r1rr!2r["`$[!!$[l`!!rHrr!2l[!!$mlri!rZrq!2h["!$[l`!\r!rHrr!2[[rJ$Zlrh[r`$klrm!r1rr!2r[!`$[!!$qlri!qHrr!2l[r`$plrm!rZm\r!!2c[rJ$jlrm!rHrr!2c[r`$ilri!r1rr!2h[r`$llrm!r1rrlrm!iHrqrkM[!Hm\r!rHrr!2c[r`$rl`-!l`!!rZrq!2R[r`$qlrm!mqm!!2h[r`$mlrm!rqm(!1m!!1r\r[!!$plrm!rZm!!2c[rJ$qlri!rHm%!1r[!!$plrm!qqrq!1V[r`$klrm!r1rr!2r\r[!`$[!!$qlri!qHrr!2l[r`$plrm!rZm!!2c[rJ$jlrm!rHrr!2c[r`$ilri!r1r\rr!2h[r`$llrm!qZrr!1([rrm"T3$rTqrl!2V[rJ$rlrm!r1rl!2l[r`!!lrl[r`$\rdlrX!qZrq!2r[r`$rlrm!rHrr!2h[qJ$llr`!rZrr!2h[r`$llri!k1m!!2[[r`$\rplrr[rJ$rlrm!r1rl!2l[r`$plrm!rHrm!2V[q`$qlrm!rHrr!2c[r3$klri!r1r\rr!2h[r`$llrd!rHm!!2$[m1rqrkI[q`$klri!rqrr!2c[q`$qlrm!rHrr!26[q`$\rklri!rqrr!2r[r`$plrm!rHrk!2[[r!$qlrm!rHrr!2[[rJ$Zlr[[!!$llrm!qqr\rq!2r[r`$mlrX!rZrr!2h[r`$plr`!qZrl!2l[r`$plrm!r1rp!2V[rJ$mlrm!rHr\rr!2[[r3$ql`([!0r[r[qSl`$[q`$klri!rqrr!2c[q`$qlrm!rHrr!26[q`$klri\r!rqrr!2r[r`$plrm!rHrk!2[[r!$qlrm!rHrr!2[[rJ$Sl`!!qqrr!2[[rJ$rlrm\r!r1rl!2l[r`$plrm!rHrm!2V[q`$qlrm!rHrr!2c[r3$klri!r1rr!2h[r`$llrd\r!rHm!!0r[rrm!0J$rJZqTlrm!iHrr!2h[JHr`lrlrPHq@lrm!lZrdlrm!N!$[hHr\rqrkM[Jqrr!1([r`#MlmV[rrm!6J$ri1rr!1r[r`#jlkR[r`$Klrm!rHq"lr$[r[r\rJlrm!lqrr!-c[PZrr!1l[p1rr!*!!lph[r[rJlrm!lqrr!0r[Jqrr!1([r`#MlmV\r[rrm!F`$ri1rr!!,[!!$plr`arZrr!!,[!!#jlkR[!!$Klrm!r1q"lr$[r[rJlrm\r!!Zm!!2h[r!$qlrm!!Zm!!-c[PZm!!1h[pHrr!)r[hHrqrq$[r`!#l`!!rHrmR2l\r[r`!#l`!!hqq$l`%!lq,[r`#LlmV[rrm!G!$ri1m%!1r[!!$plr`arZrr!2r[!!#\rjlkV[!!$Nlr`!qqq"lr$[r[rJl`3!lqm!!2h[r!$qlrm!rqm!!-c[Pqm!!1c[qHr\rm!)l[hHrqrq$["!$[l`!!rHrmR2l[r`$rl`!!hqq%l`)!lqrQlr`!SHr+lrrr!&`\r!rqV[q`$plri!r1rk-Ih[rJ$plrX!`qq"li([m1rqrqV[q`$plri!r1rk!2h[rJ$\rplrX!eZq"li([hHrqrqV[q`$plri!r1rkR2h[rJ$plrX!kHq"li([bZrrr`"%!2r\r[lr!!qqrk-Ic[m!$)li([JHr`lrlrlqr`!2[[qJ$mlr!!fqq"li([hHrqrqr[m!$\rllrUFr1r`!1l[JHq"lmV[rrm!4!$rmHrZ!2[[qM(mlqi!bZq"li([m1rqrr([lJ$\rllrS!r1rZ!0h[JHq"lph[r[ralqi!qqrkR2c[lJ$`li([JHr+lrrr!-3!rr,[l3$\rllrSar1rY!1l[r3$dl`!!pHm!!2h[mqm!!2A[!!$Qlrd!eZm!!22[!!$qlri!!qm\r!lqr9l`!!VZr`lrlrmZrY!2[[qJ$mlqd!lZrp!2A[!Hm!pHm!!1r[!!$el`!!jZr\rp!0E[!!$llrR[!!$qlri!!Hm!dqm!!-([hHrqrr,[l3$llrUFr1rY!2([rZrp!26\r[!!$el`!!lqm!!2A[!!$Qlrd!iZrel`!!mqm!!2l[rJ!"l`$6l`!!e1r+lrrr!1J\r!rr2[l!$mlrJarHrX!1r[!!$ql`!!pHm!!2A[!!$plr2[!!$el`!!jZm!!2l[!!$\rEl`!!lqm$!1r[!2l[r`$rlpA[!!$ql`!!XZr`lrlrmqrX!2c[q!$plq`!lqm!!2l\r[!!$fl`([!2A[!!$[l`!!pHm!!1E[!!$ql`!!fqm!!2I[qHm$!1r[!2l[r`$6l`!\r!rZm!!-A[hHrqrr2[l!$mlrLFrHrX!2,[rZm!!2l[!!$el`!!pHm!!1r[!!$el`!\r!jZm!!2l[!!$MlrR[!!$[l`-!lqm!rZrr!02[!!$ql`!!f1r+lrrr!R)!rr([r`$\rml`-!l`!!rZm#!1m!qZri-I[[!J$[!2l[r`!"l`$mlrm!lHm!!2l[!3$[r!!%l`!\r!lqrq!2r[r3$mlrd!!1m!!2l[!!$ilrm!rZm"!1rp!!$[rJ$ll`!!rZm"!1rm!!,\r[!!$ll`!!rZm"!1rq!2r[r3!!lr`!rZrm!26[!!$pl`-!lqm!rZm"!1rp!!$[rJ!\r!lri!"1m!!1r["`$[!1m!!1r[rJ!'l`$[!1m!lr`!"1m!!1r[rJ$ll`-!l`!!rZm\r!!2h[!!#clr$[r[ralrm!r1m$!1m!!2l[!J$[!2V[q!$ll`)!l`$qlrm!!Hm!r1r\rr!1h[!!$ql`%!lr`!"1m!!1r[rJ$rlrd!r1rp!!([!2l[!!$ilrm!rZm"!1rp!!$\r[rJ$ll`!!rZm"!1rm!!,[!!$ll`!!rZm"!1rq!2r[r3!!lr`!rZrm!26[!!$pl`-\r!lqm!rZm"!1rp!!$[rJ!!lri!$1m!!1r[!1m!l`!!lqrq!!E[!1m!l`$[r!!%l`!\r!lqrq!2[[!`$[!!$ql`!!rHm!!-E[hHrqrr([r`$ml`-!l`!!rZm#!1m!qZriR2[\r[!J$[!2l[r`!"l`$mlrm!m1rql`!!rZm"!1rm!!6[!!$[lri!rqrp!2c[r3!"l`$\rql`!!q1rr!2l[!3$[r3!!lri!qqm!!2l[!3$[r!!#l`!!qqm!!2l[!3$[rJ$rlrd\r!!1rm!2l[r!$llrV[!!$pl`-!lqm!rZm"!1rp!!$[rJ!!lri!$1m!!1r[!1m!l`!\r!lqrq!!E[!1m!l`$[r!!%l`!!lqrq!2[[!`$[!!$ql`!!rHm!!0R[bZrrr`+D!2r\rbl`)!l`$ml`-!l`!!rZm#!1m!qZrr-3Er-Imarc%aqqm#!1m!rZrr!!([!2c[!J$\r[!1l[r3!"l`$qlri!rqm'!1r[!1r[!2M[!!$ql`#3"2l[!!$ilrm!rZrr!2[[!!$\rkl`!!rZrr!2l[rJ$rl`!!r1rp!!([!2l[r`$pl`!!rHm!!2l[r`!$l`$[!2E[!!$\rml`-!lqm!rZrr!2[[#J$[l`$[!1m!!1m!rqrr!2r[r`$qlrm!"1m!l`!!rZrq!2r\r[r`$ql`!!r1rr!2r[!`$[l`$ml`!!Y1r`lrlrmZm#!1m!r1m$!1m!!2l[!J$[!2V\r[r`!'r`$r!2m!!2[[!J$[!2l[r`!"l`$ml`)!l`$Zlrd!!Hm!rZrq!2r[!3$["1m\r!lqm!q1m!!2l[r`$ql`!!q1rr!2l[r`$ll`!!qZm!!2l[r`$qlri!rqm!!2c[r3!\r"l`$qlrm!rHm!!2h[!!$qlrm!!qm!l`$fl`!!r1m$!1r[!2l[r`$lla)!lqm!l`$\r[!!$[!1r[!!$[l`!!rZrr!!6[!1m!!2l[rJ$rlrm!rZm!!2c[r`$rl`-!lqm!r1m\r!!-I[hHrqrr,[!J$[!2c[!`$[!!$ql`)!l`$klrqF"J#F!*`!R*cll`)!l`$qlrm\r!!Hm!r1m#!1m!mHrqlrd!!Hm!rZrq!2r["J$[l`$[l`$il`!!rZrr!2l[!!$ilrm\r!rZrr!2[[!!$kl`!!rZrr!2l[rJ$rl`!!r1rp!!([!2l[r`$pl`!!rHm!!2l[r`!\r$l`$[!2c[qqm!!2c[!`$[l`$qlrm!qqm5!1r[!1m!l`!!l`$[l`!!lqm!!2l[r`!\r%l`$[!!$qlri!rqrr!2l[!!$mlrm!rqm$!1r[!2c[!!$DlmV[rrm#Z!$rmZm#!1m\r!rHrr!2r[!`$[l`$ql`!!r1rq-36r-ImarriarHm!!2l["`$[l`$[l`!!rHm#!1m\r!lZm!!2h[!!$qlrm!qqm!!2l[rJ$ll`!!rZm!N!6ql`!!r1m!!2l[r`$ql`%!lri\r!rZm!!2V[!!$qlrm!rZrr!2l[!!$ml`!!rZrr!2l[!3$[rJ$rlri!!Hm!rZrr!!2\r[!1m!pHm!!2h[!`$[l`$ql`%!lri!rZm#!1r[r3!!lri!rqm!!2l[r`$qlrm!"1m\r!l`!!rZrr!2h[r!$ml`!!rZm$!1r[!2h[!!#clr$[r[rbl`)!l`$plrm!rqm$!1r\r[!2l[!!$mlri!"2m!r`$rrJ$pl`!!rZm(!1r[!1r[!!$pl`)!l`$Zl`!!rHm!!2l\r[r`$ml`([!2l[rJ$ll`!!rZrr!2l[!!$ml`!!rZrr!2l[!3$[rJ$ql`!!qZm!!2l\r[r`$qlrm!rZm!!2c[!!$qlrm!rZm"!1rq!2r[rJ!"l`$qlrm!!qm!l`$el`!!rHm\r$!1r[!2l[!3$[rJ$ql`)!lqrp!!$[rJ$rl`!!rZrr!2l[r`!%l`$[!!$qlrm!rHr\rm!2c[!!$ql`-!lqm!rHm!!-E[hHrqrr,[!J$[!2h[r`$rl`-!lqm!rZm!!2c[rT`\r%!*`!R!$qR2h[!!$ql`F!lqm!lqm!!2h[!J$[!2([rZm!!2h[!!$qlrm!qqm!!2l\r[rJ$ll`!!rZrr!2l[!!$ml`!!rZrr!2l[!3$[rJ$ql`!!qZm!!2l[r`$qlrm!rZm\r!!2c[!!$qlrm!rZm"!1rq!2r[rJ!"l`$qlrm!!qm!l`$mlrV[!!$pl`-!lqm!rZm\r"!1rq!2l[!J$[lrd!!1rq!2r[!!$qlrm!rZrr!!6[!1m!!2l[r`$plr`!r1m!!2l\r[!`$[l`$pl`!!fHr+lrrr!U)!rr,[!`$[!!$ql`!!rZm$!1r[!2l[r`$plrBarZr\rr!2l[!`$[l`$ql`!!rZrr!!([!1l[!!$pl`)!lqrq!2[[!!$ll`!!r1m!!2l[!*!\r%rZm!!2c[!!$qlrm!rqrr!2h[!`$[l`$jl`B!l`$[!1r[rJ$ql`!!r1m!!2l[r`$\rql`!!rHm!!2h[r`$rlri!!qm!l`$dl`!!rZm(!1r[!1r[!!$pl`B!lqm!lqm!rHm\r#!1r[!J$[!2l[r`$qlrm!"Zm!l`!!lqrq!2h[!!$il`!!rZm$!1r[!2l[!!#blr$\r[r[rbl`-!l`!!rZm!!2l[!`$[l`$qlrm!rHrf!2l[r`$ql`-!lqm!rZm!!2l[r`!\r"l`$Zl`!!rHm#!1r[rJ$ml`([!2[[!!$ml`!!rZrr!2l[!!$ml`!!rZrr!2r[r`$\rpl`-!lqm!qHm'!1m!l`$[lri!rZm!!2c[!!$qlrm!rZm!!2h[!!$plrm!rqrq!!2\r[!1m!p1m!!2l["J$[l`$[l`!!!2h["J$[l`$[l`$pl`8!lqm!l`$qlrm!rZrr!!E\r[!1m!!1r[rJ$pl`!!q1m!!2l[!`$[l`$ql`!!aHrGlrlrmZm$!1m!!2l[!!$ql`-\r!lqm!rZrr!2h[pTcqlrm!rZm$!1r[!2l[!!$qlrm!!Hm!mHrql`!!rHm#!1r[rJ$\rll`!!qqm!!2c[!!$qlrm!rZm!!2c[!!$qlrm!rqrr!2h[!`$[l`$jl`B!l`$[!1r\r[rJ$ql`!!r1m!!2l[r`$ql`!!rHm!!2h[r`$rlri!!qm!l`$mlrR[!!$ql`F!lqm\r!lqm!!2h["J$[l`$[l`$pl`8!lqm!l`$qlrm!rZrr!!E[!1m!!1r[rJ$pl`!!q1m\r!!2l[!`$[l`$ql`!!f1r+lrrr!IX!rpV[pM(Al`!!r1rr!!,[!!$klrX!qqrp!!$\r[!1rp!2[[rJ$rlrm!!1rm!2h[r`$kl`!!rZrr!!,[!!$ql`!!r1m!!2l[!3$[rJ!\r!lrd!!1rp!2r[r`!*l`!!l`$[!1r[!22[!!$qlrm!!1rm!2h[r`!!lri!!qm!lqm\r#l`!!rZm"!1rq!2r[#3$[!1r[!!$[!!$mlrd!rqm$!1r[!2l[!`$[l`#Zlr$[r[r\rDlrB!eqm!!2c[r`!#l`!!r1rrlrX!qqrp!2r[r3$llri!rqrr!!$[r!$plrm!qZm\r!!2l[r`!#l`!!rZm!!2c[!!$ql`%!lri!!1rp!!$[r3$rlrm!#Hm!!1m!l`$[l`$\rcl`!!rZrr!!$[r!$plrm!!1rq!!([!2l[r`$ql`%!lri!rqm*!1m!lqm!!1m!!2c\r[r3$rl`-!lqm!rZm$!1r[!-([hHrqrpV[pTcDlrl[!!$mlrm!!Zm!!2V[q`$llrd\r!rqrp!2[[rJ$rlrm!!1rm!2h[r`$kl`!!rZrr!!,[!!$ql`!!r1m!!2l[!3$[rJ!\r!lrd!!1rp!2r[r`!,l`!!l`$[!1r[!1r[pHm!!2l[r`!!lr`!rHrr!!$[rJ!"l`$\rqlrm!rZm"!1rq!2r[#3$[!1r[!!$[!!$mlrd!rqm$!1r[!2l[!`$[l`$8lmV[rrm\r!4!$rJZrpl`!!Vqm!!22[!!$Sli([m1rqrjA[kZm!!+r[!!$cl`!!qqq"lph[r[q\rSlpI[!!#[l`)!lqrel`!!MZr+lrrr!%3!ri,[!1rq!+r[!!$dlrm!jqq"lr$[r[q\r9lqh[rJ#[l`!!p1rr!2V[JHrGlrlrU1rDlri!Vqm!!2l[pqrr!)h[bZrrr`!J!2q\r#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq\r"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZr\rrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq"li([m1r\rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q\r"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm!)!$rJZq\r"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q9li([JHr\rGlrlrU1q"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq"lmV[rrm\r!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq"lr$[r[q\r9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHrqrkM[JHq\r"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!!ri,[JHq\r"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!J!2q#li([JHr`lrlrPHq"li([hHr\rqrkM[JHq"lmV[rrm!)!$rJZq"li([m1rqrjA[JHq"lph[r[qSli([JHr+lrrr!#!\r!ri,[JHq"lr$[r[q9li([JHrGlrlrU1q"li([bZrrr`!8JIq"ri(rJIq"ri(rJIq\r"ri(rb2m!&)(rJIq"ri(rJIq"ri(rJIq"rmMr!2m!!!'D!CS!N!8,!!`!%3,r$!$\rrrJ!!!%J!!!")!*!(#`!-!*!&!3!+!*!&#`!-!*S!!!$rJ$!!N!8,!!`!!!!%!*!\r&5!!!!%J!!!!3!#!!!`!)!*!4#`!-!*!&#`!-!%!1rIm!!2Er!!$fr`!!q[mBrJ!\r#r`!!qrrq!!,r!!$lrri!![m!!2[r'ri!!rm!Q3$mrri!!rm!Q3$mrri!!rm!r`$\rmraMm!!,rQ3$prr`!![qC!2hrr!$rr`!!rImJ#!#CrjRrQIqC!2lr#!#CrjRrQIq\rC!2lr!!$kr`!!r[mJ'!$rQIqCrjRrQ3$rr`$rQIqCrjRrQ3$rr`$jr`)!rrmJ#!#\rCrjRrQIqC!2lr#!#CrjRrQIqC!2lr!!$kr`!!r[mBr!!#rjN!rIrm!!,rQ3$prr`\r!rrm!!2hr'ri!!rm!Q3$mrri!!rm!Q3$mrri!!rm!r`$mraMq!!,r!!$lrri!![m\r!!2[rrJ!#r`!!qrm1rIm!!2Er!!$fr`!!q[m!!2m!!!'X!D`!N!8,!!`!%3,r$!$\rrrJ!!!%J!!!")!*!(#`!-!*!&!3!+!*!&#`!-!*S!!!$rJ$!!N!8,!!`!!!!%!*!\r&5!!!!%J!!!!3!#!!!`!)!*!4#`!-!*!&#`!-!%!1rIm!!2Er!!$fr`!!q[mDrIr\rr!2rrrJ$mrrm!rrrq!2crr`$rrri!!2mGrIm$!*N!rri!r2m$!*N!rri!r2m$!2m\r!rri!!2mF!2rp!!(rQId!rrrp!!(rQId!rrrp!2rrr3!!rb%(r`$rQIqCrjRq!2r\rr"J$rQIqCrjRq!2rr!!$lrri!!2mK'Im!QIqCrjRrQ3!!rrm!QIqCrjRrQ3!!rrm\r!q[rr!!$r)3Ir!2qCrjRrQIi!rrm'!2qCrjRrQIi!rrm!!2[rrJ!!ra`!rrd!!Iq\rCr3$rrrd!!IqCr3$rrrd!rrrp!!$r(Ihr!`#C!2rq!2cr!`#C!2rq!2cr!`$r!2r\rq!!$r'[hrr`$rrri!r2rr!2rrrJ$mrrm!rrrq!!$r$[hr!!$fr`!!p[m!!2Vr!2m\r!!!&D!9S!N!8-!!X!%3,r$!$rrJ!!!%J!!!")!*!($!!,!*!&!3!+!*!&$!!,!*S\r!!!$rJ#`!N!8-!!X!!!!%!*!&5!!!!%J!!!!3!#!!!`!)!*!4$!!,!*!&$!!,!%!\r#i2m#i2m1r2m!!2Ir!!$hr`!!r2m8rIm#!*N!qIm#!*N!qIm#!2m!rImDr[m%!*R\rrQ3$lr`3!QIqC!2[r!!$qr`!!r[mHrrm'!*RrQIqC!2hr"J#CrjRrQ3$pr`!!r2m\r#!2rr(KIr!*RrQIqCrjN!rrm!QIqCrjRrQ3$rr`$kr`%!ra,p!!,rQIrj!!,rQIr\rj!2lrr3!Dr[m%!*RrQ3$lr`3!QIqC!2[r!!$qr`!!r[mDr[m%!2qCr`$lr`3!rjR\rr!2[r!!$qr`!!r[m1r[rm!2[rr!$lrr`!r[m#i2m!r`!!!6B"0J#3"3X!$!!4![m\r-!2rq!!!!5!!!!%J!N!F,!!`!N!8"!!S!N!8,!!`!QJ!!!2q!-!#3"3X!$!!!!!3\r!N!9)!!!!5!!!!"!!)!!$!!J!N"%,!!`!N!8,!!`!3!lpr`!!p[m!!2Er!!$kr`l\rprrm!prrr!2Irr`$lra$pr`)!r`$irri!q2rq!2cr%J$rr3$rr`!!r2rk!2crqJ$\rpra%"r`$lr`!!rIrj!2hrq3$qra%"r`$kr`!!r[ri!2lrq!$rra%"r`$lr`!!rIr\rj!2hrq3$qra)!rrd!rrm!!2crqJ$mrrS!rIm3rIm#!2m!q2rq!2MrrJ$mr`lprrm\r!prrr!2Irr`$lr`lpr`!!p[m!!2Er!!$kr`$r!!!"!!!!XK)!!,%5!!!#QJ*%8k3\r5AJ!!!"`"kJ!04%P86!!$!(*%6%p(!!-!SP"*3e3!"J$5C'0dBJ!#!5C#6N4-!!!\r"5P"jG'3!!!&@4P*&4J!"!@**3diM!!!"HQPME$J!!!''D@0X0!!!!C*TBh-i!!!\r"RQPMFc3!!!'UD@0c)`!!!EC659T&!!!"`J)!N!88+3*%8Q`#!3!2!!!8Z`*%8R3\r#!`"I!!!5R!*%8QJ#"!#'!!!6+!*%8Q3#!!!V!*!)!J%!(3!!!#i!N!3#!`",!!!\r5J`#3"!)%!*)!!"3#!*!%!J!!1J!!!'%!N!3#!3"!!!!*A`#3"!)#rrm!!"p%!*!\r%!J2rr`!!Ub`!N!3#"2rr!!#XbJ#3"!)&rrm!!+jk!*!%!JErr`!!VpJ!N!3#!`"\r9!!!56`#3"!)!!'N!!",!!*!%!J%!H!!!%[3!N!@!rrm!!"m1!*!(S3!!&KX!N!@\r!rrm!!"BJ!*!&JIrr!!!I!`#3"B$rr`!!&LX!N!@!rrm!!"F[!*!&J2rr!!!E-`#\r3"B$rr`!!(6F!N!@!rrm!!"il!*!&J2rr!!!H[`#3"2q3"!!!(cB!N!316@pNG@a\rP)'*bEhGcCA)08h4KBfXJBR*[Gh0PFJe6G'&MDb"LFQphFf9b$Ne[C(9XC5"LFQp\rhFf9b"8&bFQph#Q*bC@&VF'pTER3*3@*[GA3JBQpi#8&LEh9d)'*[H!P"BQpeG#"\rLEhJ16@pNG@aP)'*bEhGcCA)08h4KBfXJBR*[Gh0PFJY@BA)JBR*[Gh0PFJj#FQp\rhFf9b)(GTEQ4[G`j2GfjPFL"bCA0[GA*MCA0!:\r
\ No newline at end of file
diff --git a/Mac/Unsupported/twit/twittest.py b/Mac/Unsupported/twit/twittest.py
deleted file mode 100644 (file)
index 10d3693..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# Test program
-
-def foo(arg1, arg2):
-       bar(arg1+arg2)
-       bar(arg1-arg2)
-       foo(arg1+1, arg2-1)
-       
-def bar(arg):
-       rv = 10/arg
-       print rv
-       
-foo(0,10)
-