From 2d1306b7cf4a85290ffbd90a15fed6115a522310 Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Fri, 7 Apr 2000 09:10:49 +0000 Subject: [PATCH] Started on GUSI2 and threading support. --- Mac/Include/macglue.h | 5 +- Mac/Python/getmtime.c | 4 + Mac/Python/gusiconfig.cpp | 101 ++++++++++++++++++ Mac/Python/macgetcompiler.c | 22 +++- Mac/Python/macgetpath.c | 4 +- Mac/Python/macglue.c | 17 +-- Mac/Python/macimport.c | 8 +- Mac/Python/macmain.c | 8 +- Mac/mwerks/errno_unix.h | 2 + Mac/mwerks/mwerks_nonshared_config.h | 3 +- Mac/mwerks/mwerks_plugin_config.h | 3 +- Mac/mwerks/mwerks_shared_config.h | 3 +- Mac/mwerks/mwerks_small_config.h | 5 +- Mac/mwerks/mwerks_threadsmall_config.h | 35 ++++++ Mac/mwerks/mwerks_tkplugin_config.h | 3 +- .../build.macfreeze/frozenbundle.rsrc | Bin 5340 -> 5556 bytes 16 files changed, 194 insertions(+), 29 deletions(-) create mode 100644 Mac/Python/gusiconfig.cpp create mode 100644 Mac/mwerks/mwerks_threadsmall_config.h diff --git a/Mac/Include/macglue.h b/Mac/Include/macglue.h index bc1939fb1afb..ec2dfbd93d36 100644 --- a/Mac/Include/macglue.h +++ b/Mac/Include/macglue.h @@ -53,8 +53,9 @@ typedef struct { #pragma lib_export on #endif -#ifdef USE_GUSI +#ifdef USE_GUSI1 void PyMac_FixGUSIcd Py_PROTO((void)); /* Workaround for GUSI chdir() call */ +extern void PyMac_SetGUSISpin(void); /* Install our private GUSI spin routine */ #endif char *PyMac_StrError(int); /* strerror with mac errors */ @@ -62,7 +63,6 @@ unsigned char *Pstring(char *str); /* Convert c-string to pascal-string in stat #ifdef USE_GUSI extern int PyMac_ConsoleIsDead; /* True when exiting */ -extern void PyMac_SetGUSISpin(void); /* Install our private GUSI spin routine */ extern void PyMac_StopGUSISpin(void); /* Stop eventprocessing during exit() */ #endif @@ -81,6 +81,7 @@ void PyMac_GetSchedParams Py_PROTO((PyMacSchedParams *)); /* Get schedulers para void PyMac_SetSchedParams Py_PROTO((PyMacSchedParams *)); /* Set schedulers params */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +int PyMac_DoYield Py_PROTO((int, int)); /* Yield cpu. First arg is maxtime, second ok to call python */ int PyMac_HandleEvent Py_PROTO((EventRecord *)); /* Handle one event, possibly in Python */ void PyMac_HandleEventIntern Py_PROTO((EventRecord *)); /* Handle one event internal only */ int PyMac_SetEventHandler Py_PROTO((PyObject *)); /* set python-coded event handler */ diff --git a/Mac/Python/getmtime.c b/Mac/Python/getmtime.c index 29721ee91b37..a14ef71695ec 100644 --- a/Mac/Python/getmtime.c +++ b/Mac/Python/getmtime.c @@ -38,7 +38,11 @@ PERFORMANCE OF THIS SOFTWARE. #ifdef USE_GUSI #include #endif /* USE_GUSI */ +#ifdef USE_GUSI2 +#include +#else #include +#endif #include "rename2.h" long diff --git a/Mac/Python/gusiconfig.cpp b/Mac/Python/gusiconfig.cpp new file mode 100644 index 000000000000..c69498f00be5 --- /dev/null +++ b/Mac/Python/gusiconfig.cpp @@ -0,0 +1,101 @@ +/* + * Generated with the GUSIConfig application and then hand-modified by jack. + */ + +#define GUSI_SOURCE +#include +#include + +#include "Python.h" +#include "macglue.h" + +static void +PyMac_GUSISpin(bool wait) +{ + static Boolean inForeground = true; + int maxsleep = 6; /* 6 ticks is "normal" sleeptime */ + + if (PyMac_ConsoleIsDead) return; + + if ( !wait ) + maxsleep = 0; + + PyMac_DoYield(maxsleep, 0); /* XXXX or is it safe to call python here? */ +} + + +/* Declarations of Socket Factories */ + +__BEGIN_DECLS +void GUSIwithInetSockets(); +void GUSIwithLocalSockets(); +void GUSIwithMTInetSockets(); +void GUSIwithMTTcpSockets(); +void GUSIwithMTUdpSockets(); +void GUSIwithOTInetSockets(); +void GUSIwithOTTcpSockets(); +void GUSIwithOTUdpSockets(); +void GUSIwithPPCSockets(); +void GUSISetupFactories(); +__END_DECLS + +/* Configure Socket Factories */ + +void GUSISetupFactories() +{ +#ifdef GUSISetupFactories_BeginHook + GUSISetupFactories_BeginHook +#endif + GUSIwithInetSockets(); +#ifdef GUSISetupFactories_EndHook + GUSISetupFactories_EndHook +#endif +} + +/* Declarations of File Devices */ + +__BEGIN_DECLS +void GUSIwithDConSockets(); +void GUSIwithNullSockets(); +void GUSISetupDevices(); +__END_DECLS + +/* Configure File Devices */ + +void GUSISetupDevices() +{ +#ifdef GUSISetupDevices_BeginHook + GUSISetupDevices_BeginHook +#endif +#ifdef GUSISetupDevices_EndHook + GUSISetupDevices_EndHook +#endif +} + +#ifndef __cplusplus +#error GUSISetupConfig() needs to be written in C++ +#endif + +GUSIConfiguration::FileSuffix sSuffices[] = { + "", '????', '????' +}; + +extern "C" void GUSISetupConfig() +{ + GUSIConfiguration * config = + GUSIConfiguration::CreateInstance(GUSIConfiguration::kNoResource); + + config->ConfigureDefaultTypeCreator('TEXT', 'TEXT'); + config->ConfigureSuffices( + sizeof(sSuffices)/sizeof(GUSIConfiguration::FileSuffix)-1, sSuffices); + config->ConfigureAutoInitGraf(false); + config->ConfigureAutoSpin(false); + config->ConfigureHandleAppleEvents(false); + config->ConfigureSigInt(false); + config->ConfigureSigPipe(true); + + GUSISetHook(GUSI_SpinHook, (GUSIHook)PyMac_GUSISpin); + +} + +/**************** END GUSI CONFIGURATION *************************/ diff --git a/Mac/Python/macgetcompiler.c b/Mac/Python/macgetcompiler.c index 347b8d20b617..883658138633 100644 --- a/Mac/Python/macgetcompiler.c +++ b/Mac/Python/macgetcompiler.c @@ -38,23 +38,35 @@ PERFORMANCE OF THIS SOFTWARE. #endif #ifdef __MWERKS__ -#ifdef USE_GUSI -#define HASGUSI " w/GUSI" +#ifdef USE_GUSI1 +#define HASGUSI " w/GUSI1" +#else +#ifdef USE_GUSI2 +#define HASGUSI " w/GUSI2" #else #define HASGUSI "" #endif +#endif + #ifdef USE_MSL #define HASMSL " w/MSL" #else #define HASMSL "" #endif + +#ifdef WITH_THREAD +#define HASTHREAD " w/THREADS" +#else +#define HASTHREAD "" +#endif + #ifdef __powerc -#define COMPILER " [CW PPC" HASGUSI HASMSL "]" +#define COMPILER " [CW PPC" HASGUSI HASMSL HASTHREAD"]" #else #ifdef __CFM68K__ -#define COMPILER " [CW CFM68K" HASGUSI HASMSL "]" +#define COMPILER " [CW CFM68K" HASGUSI HASMSL HASTHREAD"]" #else -#define COMPILER " [CW 68K" HASGUSI HASMSL "]" +#define COMPILER " [CW 68K" HASGUSI HASMSL HASTHREAD"]" #endif #endif #endif diff --git a/Mac/Python/macgetpath.c b/Mac/Python/macgetpath.c index 02f9b485e622..d1c60a07d8ec 100644 --- a/Mac/Python/macgetpath.c +++ b/Mac/Python/macgetpath.c @@ -54,7 +54,7 @@ PERFORMANCE OF THIS SOFTWARE. #include #include -#ifdef USE_GUSI +#ifdef USE_GUSI1 #include #endif @@ -444,7 +444,7 @@ PyMac_PreferenceOptions(PyMac_PrefRecord *pr) UseResFile(oldrh); } -#ifdef USE_GUSI +#ifdef USE_GUSI1 void PyMac_SetGUSIOptions() { diff --git a/Mac/Python/macglue.c b/Mac/Python/macglue.c index 46493d3c7e4f..fd0ddfbb1f63 100644 --- a/Mac/Python/macglue.c +++ b/Mac/Python/macglue.c @@ -62,11 +62,11 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifdef __MWERKS__ #include #endif -#ifdef USE_GUSI +#ifdef USE_GUSI1 #include /* For Path2FSSpec */ -#include /* For SetSFCurDir, etc */ #include #endif +#include /* The ID of the Sioux apple menu */ #define SIOUX_APPLEID 32000 @@ -108,7 +108,6 @@ extern PyObject *newmfssobject Py_PROTO((FSSpec *)); static int interrupted; /* Set to true when cmd-. seen */ static RETSIGTYPE intcatcher Py_PROTO((int)); -static int PyMac_DoYield Py_PROTO((int, int)); static int PyMac_Yield Py_PROTO((void)); /* @@ -161,7 +160,7 @@ static PyObject *python_event_handler; */ int PyMac_AppearanceCompliant; -#ifdef USE_GUSI +#ifdef USE_GUSI1 /* ** GUSI (1.6.0 and earlier, at the least) do not set the MacOS idea of ** the working directory. Hence, we call this routine after each call @@ -183,7 +182,9 @@ PyMac_FixGUSIcd() if (PBHSetVolSync(&pb) != noErr) return; } +#endif +#ifdef USE_GUSI /* ** SpinCursor (needed by GUSI) drags in heaps of stuff, so we ** provide a dummy here. @@ -194,6 +195,7 @@ void RotateCursor(short x) { /* Dummy */ } /* ** Replacement GUSI Spin function */ +#ifdef USE_GUSI1 static int PyMac_GUSISpin(spin_msg msg, long arg) { @@ -222,6 +224,7 @@ void PyMac_SetGUSISpin() { GUSISetHook(GUSI_SpinHook, (GUSIHook)PyMac_GUSISpin); } +#endif /* Called at exit() time thru atexit(), to stop event processing */ void @@ -531,7 +534,7 @@ PyMac_HandleEvent(evp) /* ** Yield the CPU to other tasks without processing events. */ -static int +int PyMac_DoYield(int maxsleep, int maycallpython) { EventRecord ev; @@ -563,7 +566,7 @@ PyMac_DoYield(int maxsleep, int maycallpython) } } else { latest_time_ready = LMGetTicks() + maxsleep; - while ( maxsleep >= 0 ) { + do { /* XXXX Hack by Jack. ** In time.sleep() you can click to another application ** once only. If you come back to Python you cannot get away @@ -578,7 +581,7 @@ PyMac_DoYield(int maxsleep, int maycallpython) return -1; } maxsleep = latest_time_ready - LMGetTicks(); - } + } while ( maxsleep > 0 ); } in_here--; return 0; diff --git a/Mac/Python/macimport.c b/Mac/Python/macimport.c index e079d2e5ee47..2f5d622b6927 100644 --- a/Mac/Python/macimport.c +++ b/Mac/Python/macimport.c @@ -48,7 +48,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #endif #include -#ifdef USE_GUSI +#ifdef USE_GUSI1 #include "TFileSpec.h" /* for Path2FSSpec() */ #endif @@ -104,7 +104,7 @@ findnamedresource( UseResFile(PyMac_AppRefNum); filerh = -1; } else { -#ifdef USE_GUSI +#ifdef USE_GUSI1 if ( Path2FSSpec(filename, &fss) != noErr || #else if ( FSMakeFSSpec(0, 0, Pstring(filename), &fss) != noErr || @@ -303,7 +303,7 @@ char *filename; UseResFile(PyMac_AppRefNum); filerh = -1; } else { -#ifdef USE_GUSI +#ifdef USE_GUSI1 if ( (err=Path2FSSpec(filename, &fss)) != noErr || FSpGetFInfo(&fss, &finfo) != noErr ) #else @@ -432,7 +432,7 @@ PyMac_FindModuleExtension(char *buf, int *lenp, char *module) #else strcpy(buf+*lenp, _PyImport_Filetab[0].suffix); #endif -#ifdef USE_GUSI +#ifdef USE_GUSI1 if ( Path2FSSpec(buf, &fss) == noErr && FSpGetFInfo(&fss, &finfo) == noErr) return _PyImport_Filetab; diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c index db39e18d1a73..98298c8fcd6b 100644 --- a/Mac/Python/macmain.c +++ b/Mac/Python/macmain.c @@ -225,13 +225,15 @@ init_common(int *argcp, char ***argvp, int embedded) PyMac_AddLibResources(); #endif -#if defined(USE_GUSI) +#if defined(USE_GUSI1) /* Setup GUSI */ GUSIDefaultSetup(); PyMac_SetGUSISpin(); PyMac_SetGUSIOptions(); - atexit(PyMac_StopGUSISpin); #endif +#if defined(USE_GUSI) + atexit(PyMac_StopGUSISpin); +#endif #ifdef USE_SIOUX /* Set various SIOUX flags. Some are changed later based on options */ @@ -405,7 +407,7 @@ PyMac_InitApplication() *endp = '\0'; chdir(curwd); -#ifdef USE_GUSI +#ifdef USE_GUSI1 /* Change MacOS's idea of wd too */ PyMac_FixGUSIcd(); #endif diff --git a/Mac/mwerks/errno_unix.h b/Mac/mwerks/errno_unix.h index 7f63ef6dba9b..2e6f171240ac 100644 --- a/Mac/mwerks/errno_unix.h +++ b/Mac/mwerks/errno_unix.h @@ -29,6 +29,7 @@ PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ +#ifndef USE_GUSI2 #define ENOTDIR (-120) #ifndef __MSL__ #define EACCES (-54) @@ -40,6 +41,7 @@ PERFORMANCE OF THIS SOFTWARE. #define ENFILE (-42) #define EIO (-36) #define ENOSPC (-34) +#endif #define ESRCH 3 #define EINTR 4 diff --git a/Mac/mwerks/mwerks_nonshared_config.h b/Mac/mwerks/mwerks_nonshared_config.h index e4bb1c8930ed..e3d97ec0f83f 100644 --- a/Mac/mwerks/mwerks_nonshared_config.h +++ b/Mac/mwerks/mwerks_nonshared_config.h @@ -5,7 +5,8 @@ ** specific features, you may also need different sets of sources. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +#define USE_GUSI1 /* Stdio implemented with GUSI */ +/* #define USE_GUSI2 /* Stdio implemented with GUSI 2 */ #define USE_MSL /* Use Mw Standard Library (as opposed to Plaugher C libraries) */ #define USE_TOOLBOX /* Include toolbox modules in core Python */ #define USE_QT /* Include quicktime modules in core Python */ diff --git a/Mac/mwerks/mwerks_plugin_config.h b/Mac/mwerks/mwerks_plugin_config.h index 0052df80be7d..1bb465df24d9 100644 --- a/Mac/mwerks/mwerks_plugin_config.h +++ b/Mac/mwerks/mwerks_plugin_config.h @@ -2,7 +2,8 @@ ** Config file for dynamically-loaded ppc/cfm68k plugin modules. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +#define USE_GUSI1 /* Stdio implemented with GUSI */ +/* #define USE_GUSI2 /* Stdio implemented with GUSI */ #define USE_MSL /* Use MSL libraries */ #ifdef USE_MSL #define MSL_USE_PRECOMPILED_HEADERS 0 /* Don't use precomp headers: we include our own */ diff --git a/Mac/mwerks/mwerks_shared_config.h b/Mac/mwerks/mwerks_shared_config.h index 4662d9b2364d..66174b5840de 100644 --- a/Mac/mwerks/mwerks_shared_config.h +++ b/Mac/mwerks/mwerks_shared_config.h @@ -6,7 +6,8 @@ ** specific features, you may also need different sets of sources. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +/* #define USE_GUSI1 /* Stdio implemented with GUSI */ +#define USE_GUSI2 /* Stdio implemented with GUSI */ #define USE_MSL /* Use Mw Standard Library (as opposed to Plaugher C libraries) */ #define USE_CORE_TOOLBOX /* Include core toolbox modules (Dlg,Ctl,Menu,Win,Res,Qd) */ /* #define USE_TOOLBOX /* Include all toolbox modules in core Python */ diff --git a/Mac/mwerks/mwerks_small_config.h b/Mac/mwerks/mwerks_small_config.h index 762ef8f1d4a1..771565b1d310 100644 --- a/Mac/mwerks/mwerks_small_config.h +++ b/Mac/mwerks/mwerks_small_config.h @@ -5,7 +5,8 @@ ** specific features, you may also need different sets of sources. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +#define USE_GUSI2 /* Stdio implemented with GUSI 2 */ +/* # define USE_GUSI1 /* Stdio implemented with GUSI 1 */ #define USE_MSL /* Use Mw Standard Library (as opposed to Plaugher C libraries) */ #define USE_TOOLBOX /* Include toolbox modules in core Python */ #define USE_QT /* Include quicktime modules in core Python */ @@ -20,7 +21,7 @@ /* #define USE_MAC_SHARED_LIBRARY /* Enable code to add shared-library resources */ /* #define USE_MAC_APPLET_SUPPORT /* Enable code to run a PYC resource */ /* #define HAVE_DYNAMIC_LOADING /* Enable dynamically loaded modules */ -#define USE_MALLOC_DEBUG /* Enable range checking and other malloc debugging */ +/* #define USE_MALLOC_DEBUG /* Enable range checking and other malloc debugging */ /* #define USE_GDBM /* Include the gdbm module */ /* #define USE_ZLIB /* Include the zlib module */ #define USE_APPEARANCE /* Enable Appearance support */ diff --git a/Mac/mwerks/mwerks_threadsmall_config.h b/Mac/mwerks/mwerks_threadsmall_config.h new file mode 100644 index 000000000000..70a11a0ab5ce --- /dev/null +++ b/Mac/mwerks/mwerks_threadsmall_config.h @@ -0,0 +1,35 @@ +/* +** Configuration file for small standalone 68k/ppc Python. +** +** Note: enabling the switches below is not enough to enable the +** specific features, you may also need different sets of sources. +*/ + +#define USE_GUSI2 /* Stdio implemented with GUSI 2 */ +/* # define USE_GUSI1 /* Stdio implemented with GUSI 1 */ +#define WITH_THREAD /* Use thread support (needs GUSI 2, not GUSI 1) */ +#define USE_MSL /* Use Mw Standard Library (as opposed to Plaugher C libraries) */ +#define USE_TOOLBOX /* Include toolbox modules in core Python */ +#define USE_QT /* Include quicktime modules in core Python */ +/* #define USE_WASTE /* Include waste module in core Python */ +#define USE_MACSPEECH /* Include macspeech module in core Python */ +/* #define USE_IMG /* Include img modules in core Python */ +#define USE_MACCTB /* Include ctb module in core Python */ +/* #define USE_STDWIN /* Include stdwin module in core Python */ +/* #define USE_MACTCP /* Include mactcp (*not* socket) modules in core */ +/* #define USE_TK /* Include _tkinter module in core Python */ +/* #define MAC_TCL /* This *must* be on if USE_TK is on */ +/* #define USE_MAC_SHARED_LIBRARY /* Enable code to add shared-library resources */ +/* #define USE_MAC_APPLET_SUPPORT /* Enable code to run a PYC resource */ +/* #define HAVE_DYNAMIC_LOADING /* Enable dynamically loaded modules */ +#define USE_MALLOC_DEBUG /* Enable range checking and other malloc debugging */ +/* #define USE_GDBM /* Include the gdbm module */ +/* #define USE_ZLIB /* Include the zlib module */ +#define USE_APPEARANCE /* Enable Appearance support */ +#ifdef __powerc +#define USE_CACHE_ALIGNED 8 /* Align on 32-byte boundaries for 604 */ +#endif +#ifdef USE_MSL +#define MSL_USE_PRECOMPILED_HEADERS 0 /* Don't use precomp headers: we include our own */ +#include +#endif diff --git a/Mac/mwerks/mwerks_tkplugin_config.h b/Mac/mwerks/mwerks_tkplugin_config.h index 4b9fdc8fc399..88b7552bf99d 100644 --- a/Mac/mwerks/mwerks_tkplugin_config.h +++ b/Mac/mwerks/mwerks_tkplugin_config.h @@ -2,6 +2,7 @@ ** Special config-file for _tkinter plugin. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +#define USE_GUSI1 /* Stdio implemented with GUSI */ +/* #define USE_GUSI2 /* Stdio implemented with GUSI */ #define USE_TK /* Include _tkinter module in core Python */ #define MAC_TCL /* This *must* be on if USE_TK is on */ diff --git a/Mac/mwerks/projects/build.macfreeze/frozenbundle.rsrc b/Mac/mwerks/projects/build.macfreeze/frozenbundle.rsrc index b219a42833ba87ab74aede4a2e98610bad4045c8..fa2c02ad2ebc39d47b001096488d364b57434a65 100644 GIT binary patch literal 5556 zc-obiZ)_Xo9mjvq*^ZrHa&|&k=>VH{r74EAj1G;8)ecPytx#eo^^mHj|5B$lDNf}S zO-$NyX*-1W3b8kRIrd`O)V;9w3L$kfXh_p!W;O{;+UzADGVx-Qu0xe<%kjhS`E&Q& z+2>YV{N(QUe1G@+o_p?|-}AYHz=Hr9^lm;ZgIEq?iDMbUatezdg#S5!vDxBEabb4u z@Dzc*8~QSJ^aj8P7V`eH55$khFTw-y^iQIti%~d0E<8T6H$45m77ibP6K_Npi_1UG z70$h0IDaWO!6K~WRthWm<-(O>{_>Td1303lh)3w(KlZyD;%ID^M$5m+lSfif`qk)V zh)mG0Zv8#F7|A^QhwKs|FHGHfmmloQe3x8!bZRUN@NjN~IUZuiv2z2L$r&I-d-BBb zrzWOu5%~7=WO3i_?7{8FjQE^34u6D+9q_+FjX>(!_`mj#{`Md2TFBtB3rhrk{mP*O zZ0yn-@aS~|g731COtGGg8lwh*-R0fp?&0A9{Z0Kp+uz$>ikVEK_t^M|;xD2Z;PBb6vF!+!F!3_C#?I1i0{Mr!7@zg8<3?YWM~7@ zw2h?$qu9+kN{tsOEzeN8ahg(dmC^>5HeNyp_Y_MfhISI`v6xsku&#^+yFvECC|1UoM&?fmy8bUUGrPX{_d$yJu(n=9(p<0l@t;^4piwV zCwd$x|106fY>Z!z!X_t5A)=0W>4~@O#^kFteMSnaGU4bDogD(nR9tU%VaY1 zERnJNxGpoJ>CR{FG)KDAjWu~`_jFIVQ<`fs%4zPHe9fkFve{`sPA;^Y_FR!OomVu~ z+-NE@!2g=kv>v`@)7hb>%VZVw-bq?+!O3*`Wj+)FaR3nq5OE;%OJt@`0Cv0tFnJwd z?JAJqXQ27x#z5%l)KDlI{}!eA2$0Y*Kk@&?PqfuP5nu8{G7$Tmg!fXiEwM`WC3cZB zOS!f3(ylc`jBB9n3xc-oe$c`Xfj00oXuh+ckq;0q)yprmP8a;MI=GQ zAvn4|M3o>Si;n0L6A0r%oa8+aM@wRfZGomYK?~l-_@AlxUWfzThyyOfk#gk|*9waq zp}XXCpzK(o!$*c`w(Y>=EI#bILk2i$GtgG8lE%lpR;>zI*nwKL#u+GJV{2VZ zqjniMaa8LZanfi9gv}9$+jU`c#OZ88U|!gKnxPHS=F_dSnFfY9XmiBrYzm~Q)&=5p zKDBItIGw)<#HrQ=;&eV0NK=)F!*ym$#Nq8Z5XY2=Lv33ij;>}kM;wRE5yxS3#Btgz zB{*$<(lugCfy&NXa z=4r_Tk|QW%=-}2B;wZi4 z)D_~;n>S0Y091O)v@Lb$(rv_HddV4pDiUB^!F4CXP(=bP>C>Cf^yp5+LEViwwB#G&1YO zkbX(*8z7F%GAaqlyr2+AeJ2r`oF9vS^^UUzfj|#bByqH^Ae!aMm+lFIzak-E# U<`#3sTwx)1B!4M4efG87*N7i`vj6}9 literal 5340 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 nY(MfvuSUO4jvg