From 29696db8b32e632f80a0021293611363f807d025 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 19 Oct 2016 03:21:15 -0400 Subject: [PATCH] Implemented Thread Local Storage support. This is still rough, but the basic idea seems to work! --- lx_loader.c | 118 +++++++++++++++++++++++++++++++++++++++++++--- lx_loader.h | 6 ++- native/doscalls.c | 104 ++++++++++++++++++++++++++++++++++++++++ native/doscalls.h | 2 + tests/testtls.c | 54 +++++++++++++++++++++ tests/testtls.exe | Bin 0 -> 85893 bytes 6 files changed, 277 insertions(+), 7 deletions(-) create mode 100644 tests/testtls.c create mode 100644 tests/testtls.exe diff --git a/lx_loader.c b/lx_loader.c index 51832e5..e2eaee6 100644 --- a/lx_loader.c +++ b/lx_loader.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include // 16-bit selector kernel nonsense... #include @@ -422,7 +424,6 @@ static uint16 initOs2Tib(uint8 *tibspace, void *_topOfStack, const size_t stackl LxTIB *tib = (LxTIB *) tibspace; LxTIB2 *tib2 = (LxTIB2 *) (tib + 1); - memset(tib, '\0', LXTIBSIZE); FIXME("This is probably 50% wrong"); tib->tib_pexchain = NULL; @@ -1492,6 +1493,110 @@ static LxModule *loadLxModuleByModuleName(const char *modname) return loadLxModuleByModuleNameInternal(modname, 0); } // loadLxModuleByModuleName +static __attribute__((noreturn)) void handleThreadLocalStorageAccess(const int slot, ucontext_t *uctx) +{ + greg_t *gregs = uctx->uc_mcontext.gregs; + + // use the segfaulting thread's FS register, so we can get its TIB2 pointer. + LxTIB2 *ptib2 = NULL; + __asm__ __volatile__ ( + "pushw %%fs \n\t" + "movw %%ax, %%fs \n\t" + "movl %%fs:0xC, %%eax \n\t" + "popw %%fs \n\t" + : "=a" (ptib2) + : "eax" (gregs[REG_FS]) + ); + uint32 *tls = (uint32 *) (ptib2 + 1); // The thread's TLS data is stored right after its TIB2 struct. + tls += slot; + + printf("We wanted to access thread %p TLS slot %d (currently holds %u)\n", tls - slot, slot, (uint) *tls); + + static const int x86RegisterToUContextEnum[] = { + REG_EAX, REG_ECX, REG_EDX, REG_EBX, REG_ESP, REG_EBP, REG_ESI, REG_EDI + }; + + // this is a hack; we'll want a much more serious x86 instruction decoder before long. + int handled = 1; + uint8 *eip = (void *) (size_t) gregs[REG_EIP]; // program counter at point of segfault. + switch (eip[0]) { + case 0xC7: // mov imm16/32 -> r/m + printf("setting TLS slot %d to imm %u.\n", slot, (uint) *((uint32 *) (eip + 2))); + *tls = *((uint32 *) (eip + 2)); // !!! FIXME: verify it's a imm32, not 16 + gregs[REG_EIP] += 6; + break; + + case 0x89: // mov r -> r/m + printf("setting TLS slot %d to reg %d (%u).\n", slot, x86RegisterToUContextEnum[eip[1] >> 3], (uint) gregs[x86RegisterToUContextEnum[eip[1] >> 3]]); + *tls = (uint32) gregs[x86RegisterToUContextEnum[eip[1] >> 3]]; + gregs[REG_EIP] += 2; + break; + + case 0x8B: // mov r/m -> r + printf("setting to reg %d to TLS slot %d (%u).\n", (uint) x86RegisterToUContextEnum[eip[1] >> 3], slot, *tls); + gregs[x86RegisterToUContextEnum[eip[1] >> 3]] = (greg_t) *tls; + gregs[REG_EIP] += 2; + break; + + default: + handled = 0; + break; + } // switch + + if (!handled) { + fprintf(stderr, "Oh no, unhandled opcode 0x%X at %p accessing TLS register! File a bug!\n", (uint) eip[0], eip); + } else { + // drop out of signal handler to (hopefully) next instruction in the app, + // as if it accessed the TLS slot normally and none of this ever happened. + printf("TLS access handler jumping back into app at %p...\n", (void *) gregs[REG_EIP]); fflush(stdout); + setcontext(uctx); + fprintf(stderr, "panic: setcontext() failed in the TLS access handler! Aborting! (%s)\n", strerror(errno)); + } // else + + fflush(stderr); + abort(); +} // handleThreadLocalStorageAccess + +static void segfault_catcher(int sig, siginfo_t *info, void *ctx) +{ + const uint32 *addr = (const uint32 *) info->si_addr; + const uint32 *tlspage = GLoaderState->tlspage; + + if (tlspage && (addr >= tlspage)) + { + // was the app accessing one of the OS/2 TLS slots? + const int slot = (int) (addr - tlspage); + if (slot < 32) + handleThreadLocalStorageAccess(slot, (ucontext_t *) ctx); + } // if + + static int faults = 0; + faults++; + switch (faults) { + // !!! FIXME: case #1 should be a much more detailed crash dump. + case 1: fprintf(stderr, "SIGSEGV at addr=%p (eip=%p)\n", addr, (void *) ((ucontext_t *) ctx)->uc_mcontext.gregs[REG_EIP]); break; + case 2: write(2, "SIGSEGV, aborting.\n", 19); break; + } // switch + + abort(); // cash out. +} // segfault_catcher + +static int installSignalHandlers(void) +{ + struct sigaction action; + + memset(&action, '\0', sizeof (action)); + action.sa_sigaction = segfault_catcher; + action.sa_flags = SA_NODEFER | SA_SIGINFO; + + if (sigaction(SIGSEGV, &action, NULL) == -1) { + fprintf(stderr, "Couldn't install signal handler! (%s)\n", strerror(errno)); + return 0; + } // if + + return 1; +} // installSignalHandlers + int main(int argc, char **argv, char **envp) { if (argc < 2) { @@ -1499,6 +1604,9 @@ int main(int argc, char **argv, char **envp) return 1; } + if (!installSignalHandlers()) + return 1; + const char *envr = getenv("IS_2INE"); GLoaderState->subprocess = (envr != NULL); GLoaderState->initOs2Tib = initOs2Tib; @@ -1519,12 +1627,10 @@ int main(int argc, char **argv, char **envp) initPib(&GLoaderState->pib, argc, argv, envp); LxModule *lxmod = loadLxModuleByPath(modulename); - if (!lxmod) { - return 1; - } - runLxModule(lxmod, argc, argv, envp); + if (lxmod != NULL) + runLxModule(lxmod, argc, argv, envp); - return 1; // you shouldn't hit this, but if you do, report failure. + return 1; } // main // end of lx_loader.c ... diff --git a/lx_loader.h b/lx_loader.h index 41a56ed..2f9dff5 100644 --- a/lx_loader.h +++ b/lx_loader.h @@ -195,7 +195,8 @@ typedef struct LxPIB #pragma pack(pop) -#define LXTIBSIZE (sizeof (LxTIB) + sizeof (LxTIB2)) +// We put the 128 bytes of TLS slots after the TIB structs. +#define LXTIBSIZE (sizeof (LxTIB) + sizeof (LxTIB2) + 128) typedef struct LxLoaderState { @@ -204,6 +205,9 @@ typedef struct LxLoaderState LxPIB pib; int subprocess; int running; + uint32 *tlspage; + uint32 tlsmask; // one bit for each TLS slot in use. + uint8 tlsallocs[32]; // number of TLS slots allocated in one block, indexed by starting block (zero if not the starting block). uint16 (*initOs2Tib)(uint8 *tibspace, void *_topOfStack, const size_t stacklen, const uint32 tid); void (*deinitOs2Tib)(const uint16 selector); LxModule *(*loadModule)(const char *modname); diff --git a/native/doscalls.c b/native/doscalls.c index 1d13967..338d18b 100644 --- a/native/doscalls.c +++ b/native/doscalls.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "os2native.h" #include "doscalls.h" @@ -218,6 +219,8 @@ LX_NATIVE_MODULE_INIT({ if (!initDoscalls(lx_state)) return NULL; }) LX_NATIVE_EXPORT(DosExitMustComplete, 381), LX_NATIVE_EXPORT(DosSetRelMaxFH, 382), LX_NATIVE_EXPORT(DosFlatToSel, 425), + LX_NATIVE_EXPORT(DosAllocThreadLocalMemory, 454), + LX_NATIVE_EXPORT(DosFreeThreadLocalMemory, 455), LX_NATIVE_EXPORT(DosOpenL, 981) LX_NATIVE_MODULE_INIT_END() @@ -1309,6 +1312,7 @@ static void *os2ThreadEntry(void *arg) { // put our thread's TIB structs on the stack and call that the top of the stack. uint8 tibspace[LXTIBSIZE]; + memset(tibspace, '\0', LXTIBSIZE); // make sure TLS slots are clear, etc. os2ThreadEntry2(tibspace, (Thread *) arg); return NULL; // OS/2 threads don't return a value here. } // os2ThreadEntry @@ -2581,6 +2585,106 @@ queryapptype_iofailed: return ERROR_INVALID_EXE_SIGNATURE; } // DosQueryAppType +static uint32 *initTLSPage(void) +{ + const int pagesize = getpagesize(); + + void *addr = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (addr == ((void *) MAP_FAILED)) + return NULL; + + // Fill in the page with a debug info string. + char *dst = (char *) addr; + const char *str = "This is the fake OS/2 TLS page. "; + assert(strlen(str) == 32); + for (int i = 0; i < 127; i++, dst += 32) + strcpy(dst, str); + memcpy(dst, str, 31); + dst[31] = '\0'; + + if (mprotect(addr, pagesize, PROT_NONE) == -1) { + munmap(addr, pagesize); + return NULL; + } // if + + printf("allocated magic OS/2 TLS page at %p\n", addr); fflush(stdout); + + return (uint32 *) addr; +} // initTLSPage + + +APIRET DosAllocThreadLocalMemory(ULONG cb, PULONG *p) +{ + TRACE_NATIVE("DosAllocThreadLocalMemory(%u, %p)", (uint) cb, p); + + if (cb > 8) // this is a limitation in OS/2. This whole API is weird. + return ERROR_INVALID_PARAMETER; + else if (!p) + return ERROR_INVALID_PARAMETER; + + APIRET retval = NO_ERROR; + uint32 mask = 0xFF >> (8 - cb); + + grabLock(&GMutexDosCalls); + + // this is probably expensive to do with the mutex held, but honestly, + // is there a lot of thread contention at the point where your app is + // allocating TLS? + if (GLoaderState->tlspage == NULL) { + if ((GLoaderState->tlspage = initTLSPage()) == NULL) { + ungrabLock(&GMutexDosCalls); + return ERROR_NOT_ENOUGH_MEMORY; + } // if + } // if + + int i; + for (i = 0; i < 32; i++, mask <<= 1) { + if (((GLoaderState->tlsmask ^ mask) & mask) == mask) + break; + } // for + + if (i == 32) + retval = ERROR_NOT_ENOUGH_MEMORY; // there are only 32 slots, couldn't find anything contiguous. + else { + assert(GLoaderState->tlsallocs[i] == 0); + GLoaderState->tlsallocs[i] = (uint8) cb; + GLoaderState->tlsmask |= mask; + *p = GLoaderState->tlspage + i; + printf("allocated %u OS/2 TLS slot%s at %p\n", (uint) cb, (cb == 1) ? "" : "s", *p); fflush(stdout); + } // else + + ungrabLock(&GMutexDosCalls); + + return retval; +} // DosAllocThreadLocalMemory + +APIRET DosFreeThreadLocalMemory(ULONG *p) +{ + TRACE_NATIVE("DosFreeThreadLocalMemory(%p)", p); + + APIRET retval = ERROR_INVALID_PARAMETER; + + grabLock(&GMutexDosCalls); + + if (GLoaderState->tlspage) { + const uint32 slot = (uint32) (p - GLoaderState->tlspage); + if (slot < 32) { + const uint8 slots = GLoaderState->tlsallocs[slot]; + if (slots > 0) { + const uint32 mask = ((uint32) (0xFF >> (8 - slots))) << slot; + assert((GLoaderState->tlsmask & mask) == mask); + GLoaderState->tlsmask &= ~mask; + printf("freed %u OS/2 TLS slot%s at %p\n", (uint) slots, (slots == 1) ? "" : "s", p); fflush(stdout); + GLoaderState->tlsallocs[slot] = 0; + retval = NO_ERROR; + } // if + } // if + } // if + + ungrabLock(&GMutexDosCalls); + + return retval; +} // DosFreeThreadLocalMemory // end of doscalls.c ... diff --git a/native/doscalls.h b/native/doscalls.h index 9798db3..0836eda 100644 --- a/native/doscalls.h +++ b/native/doscalls.h @@ -432,6 +432,8 @@ APIRET OS2API DosDevConfig(PVOID pdevinfo, ULONG item); APIRET OS2API DosLoadModule(PSZ pszName, ULONG cbName, PSZ pszModname, PHMODULE phmod); APIRET OS2API DosResetBuffer(HFILE hFile); APIRET OS2API DosQueryAppType(PSZ pszName, PULONG pFlags); +APIRET OS2API DosAllocThreadLocalMemory(ULONG cb, PULONG *p); +APIRET OS2API DosFreeThreadLocalMemory(ULONG *p); #ifdef __cplusplus } diff --git a/tests/testtls.c b/tests/testtls.c new file mode 100644 index 0000000..7136378 --- /dev/null +++ b/tests/testtls.c @@ -0,0 +1,54 @@ +#define INCL_DOS +#define INCL_DOSERRORS +#include +#include +#include + +static PULONG GAddr = NULL; +static ULONG x = 0; + +static void APIENTRY threadFunc(ULONG arg) +{ + const unsigned int t = (unsigned int) arg; + DosSleep(t == 1 ? 500 : 1000); + *GAddr = t * 100; + //printf("thread %u set TLS value to %u\n", t, t * 100); + //fflush(stdout); + DosSleep(t == 1 ? 1000 : 50); + x = *GAddr; + //printf("thread %u sees TLS value of %u\n", t, (unsigned int) *GAddr); + //fflush(stdout); +} + +int main(void) +{ + TID tid = 0; + + if (DosAllocThreadLocalMemory(1, &GAddr) != NO_ERROR) { + fprintf(stderr, "DosAllocLocalThreadMemory failed\n"); + return 1; + } + printf("the magic address is %p\n", GAddr); + *GAddr = 10; + printf("Main thread set TLS value to 10\n"); + fflush(stdout); + + if (DosCreateThread(&tid, threadFunc, 1, 0, 0xFFFF) != NO_ERROR) { + fprintf(stderr, "DosCreateThread 1 failed\n"); + return 1; + } + if (DosCreateThread(&tid, threadFunc, 2, 0, 0xFFFF) != NO_ERROR) { + fprintf(stderr, "DosCreateThread 2 failed\n"); + return 1; + } + + DosSleep(4000); + + printf("Main thread sees TLS value of %u\n", (unsigned int) *GAddr); + fflush(stdout); + + DosFreeThreadLocalMemory(GAddr); + + return 0; +} + diff --git a/tests/testtls.exe b/tests/testtls.exe new file mode 100644 index 0000000000000000000000000000000000000000..4bc9419cc797ab825afb5185ba3d442f70095499 GIT binary patch literal 85893 zcmeFZ2UL?w*C_lX1PBmFz|aH)6cnr=f}o(ZP*kLYqS!$|6orH$EgDcljAFrx1uOQ3 zN>QXJ#Y$6ljV8ST&p%qAvdn zKRE{2_WErw9&a?pbH{i!7_SfGsp5EgIGzD6PZeX%Qo%5~MBX^8^&6InVJ9fq2`aX| zaBSv8>;xXm&%|;G1P-*RDNZfcBNL1)Eh6y*=@eZY=D-v>nK>|n zE-UIpD3x67DCJYI7t1AL7g8i0-}L95!FZ0?5^4Ufp_vVgWm;i$1J6|Hu`?tYL>Qc4 z=g99|1TQjE3v-2uUoY{Spp6xy(^0_3^_7@ZOf9@bm$2dYi{@9DPsDPtxiCk>4H3AK zY?sHn*)ZMT8SMyg>S8DeMTLkh*M-q_0>c>VR>{lig-86BpQvN+=He`>k6^4{9~Mpz zSf#TfMh7}UQ}2iX^tK{c)X{eNDxH9Jk-_0%>(&OWqeDH-#bp6}j4*g{7rp5HDp`QJ z*?2jj;U@<~2Vl~ZrWnCziu~`0{^$Ka6!`y*0`nG#hr)vvM;{94e_42na~MVtl`^41 zthhId@)&k|=y?yGsEyumhoN#hqdgdaR5 zpcs{lXarBmp}ffYL0)<&PaJxR@IvMEfCxH0Gy)Z)&y0Ub)=)Q`h?}G^9FDk29>d{@ zn-*dC_ry*6&^K-)4qu8R;@WZe>F}66%-z@e3eVU+OY5#oxtV6p#iI8F?vvd z&f4XxgIDS-U$rVcAR#sBJC z^#dV1+;_~+zI~$6#0c{pVf}-Sk%3{3i<%EDKgA=+3Oeu(gAWYoi_tU?qbZt;8!uek z-nfu20Wd0n4}o@NNqSfZLIuc|q*wn%{L1q|7?w)_Kqkx^wdJvx7?vV=PX~{s=oi8_ z?_44TdroTOF}8d*`c^&$-&^h#l~cCdJ8=QtOC_(sH`ZGW>w%HeCAYz|=V3k^zo{lW00Z29^CXxiCS2tGPuy#{r9PiQPk3i`Lll4>ZzB zg9VuzEuY3A94>^F5?0QQ>Ec1C2NN=gJQmCZ#?uK6Ua=CwIN>NJBaSrs+IY-&p6@v0 zXNeBfhJs{=>x2hvU<8K;K*R_2g}MK6>@FZtawEgCOcK2zs%^4D%(T*CvQd;`h<;EF z0f&X)d0nvZpcZ**h#&Td=sGAAvb9nGcaHx+MTvMERvXdR=MRG!_gI)Nh{j>$?WX`p zJ_e((d&@+d%d)NIIxungSeUlq@mN9xlHw2@AKt`x3}Y9;$jKFqC7cm#ZvpE8g*}1; z+PLrsOF)Psa=Zo12Wg@rCzb#grOuoyq2nHc^Wj~H6XBd(7$?bUA;?H1_b`Z=Xjncq zEx9L-#2UmWN;Bnfd`YeuQx1>Tv5ep_gyfDDfDJdGZPAjYLo)hDF1JE*8!4HC9&Wtx zFe=v!XfCD&=TAImEaccxd+t%_njAX=(2dd|LQi2OyR6hsA7idme%1N`z@=s3>9h6G z4%-SX4qd?t?Z)ZSR%kQM(C2s(I1+}Hz;`3vJcJPxo}%{9loMr`bE%ZOh@{L|edy7< zh=?G=nCv3v`&aC_RE|7aJhqD<3rC;-$1$dfR{{aA2T?*RQ5dJqVGIB@)jWB704q?z zAP#g{A2-zM8X(AV5wJzjId%lLM46o^GEinGiimSOsq9Ktixf*B#gJmX`N4*~;3uI) zbRz%{{gK*3<|Vn1;hVo+#JzM!u9>mWB9@piojnMA$Qi-0pGwu=4D_=?U!YS6D#%U? zk)1}Q1{jDktWqOK=$80|vxopfkPlqNm*bkb@n#|3rVVfdI);{iNYD8bIW*Egi!ql$ z>9JFmW{^F3L;40}`I5N&~a4CB9c##(;q{08ysrh8bMQ0V2!+ogplOY{*kNS-`J z2;8$vhhf1Yh#3F|I|R*ON|FU=LhO!Vg#&a%L}dIy;q^EuQy8kkNDA*dEEl^3E#Y?| zL%Q`o(95`y<3I(*TlpJPD2W+QPBbn#IRlz;90;6QhGlF4t^|Q2CvSy91Tq_V6Hton z!6@`d)Jny$m|c`yoe<15OU2n($}(_vbCRnQzwsBO0q=Q&5HL)b3Hlhr1a)VKyX&&d zv3O060>_7FSOc9WrVaI-EAFeAhPu#|*bNdsMDk4seRhpu3114Ji(zU3yMU!Z0)(PnIf(eJml08vMMC90Ag+WG z(Bc$WLm%F9a5ULvNPvWK5iBdz4r9c@U@U=L0+}VC(5G4@1cG$i@x9Vm0-1OX&~J&( zECD{worjUsxnaN{E8;h$b|FsDz>VccQR? z0)QvjaE2nNYSs)a9#r-~4_=3kb4?b;&rj~5n}*;*M8IVcA90}z6yg9p zD4uxD5X=*eX#r*8kw7rSoa)8Af7`eg)%};n5QPR5SmL-@;{( z@{xx*EYUtLzTj>3VW}Q+4yP-jDd(ZlIJRO{@k_itc&I%R?|g(l z;%bo>B=RTzO}>42QvhYeZG>bXgAXqVWs#Tz9ve&{sM=Qop-|o$ zc$BZ029>A>6f@rmn2#jbcGQ2cM^t-mob1 z9XKYi6k2HjSGiaMXYm0{7FgulfnEOCZB(rKg8%CHw_|x zC(=F$J;()xZoWKy*bN~q&_mvyjn>>OAJtiWOTe?gd5XmTA?R|Eo?uKed@|`Tu`3|i^oy?8+t=KGFURMlaM`!#4ZOy zsfY<>3xty6;DJnd^34*ytcNGBTZF5KM)CkoXhTILI{k}82J0B1p@tap&41Y)e-bDD z52_c$mXg1Zg2Pw|6v;@*{513`6f$OVd??A)aXKEL7e5>;zu$Q2(X7@R~iaL?zibL ziu!u`@IrnJ6L^%ky$)(mANjMrq?n>IVu}*LF9W6!o0uV=Snc1`7Asy4V-Q8Uj&GdC ziZ_70SpFnfL;e_;12aJq(uL$ciUnbQO@7zf85<3HkS6W7fds8ff~LbRlZfv?HV)^=OduM8n2D$_gXqYnwXy41@dAuN zf?haU8;1sEn&K9tMC+sWliumz$BHd8e@VH* zFDb9)%cp^in|g^ki3t01a?%-?fzW{}WDJNLnN{C^4$4I}jJ6OXAD-+mDvVem19rz0 zAKuL2hKwK~LlZT6|FZ=A+Ai2M`|wnL7TF0II;c_M&k|!HqeIA0^Wk;&|BdmqMU1EZ zlMvgW57NV8#zT6T8_*F7wuTd1to4izC0fhSl;h66Ui#VnUd;FP4VXcGhYGp z_%^_RH*qAwoWib`>G%yejqfH>&OM+S{>z$(wkSZBe}>FVfO+dMXByEpeqRChgWhVc ztF z{+tTX$l>2;^v`nuc=0?$9R(5T|4JPZVLE>!%x~)n;vY}_158=2e;26ZqW}^>P{1S( zFQ$kIi98wLL2iI}F~u-{t>qtKit!ADi33ZcfY$E|=__`|uYi;fucDDS&LLvHKW`e6 zd*aviK1VjyonrA7OwDtyEuURt_$>x++z9g9!4goT2&DvbP@JG>M;JGH`tnYxBI*;F zvoQvq{St5q!Fj@Vz!$(UW27;L45}f()xT1S z72@4^O7k%+RWcn$OtGJi1NIPOhBy%D!?!?j!#4343@P!@KXD%(0|A%GK`=!AGP3Dz zL&R+q{E}?YKO)(tipWb5+nIk}x>WCu6z{H5TK5FlPf5XZQtzt*aDlN+!jG^wOYqI9 zaalp>ZD&^%^+~Z^+Sr03fj0XAY|6dca#jZh2KIhJRd}`wkgKhzPn$#QFf0eN#-%d3 z1n?=4f7vE#o=R&Y7^Tp93IHznA1f2Qal&ZX`enh3-z;yZv~%wnSy>ZnqCIPQUs495xSeKIo| zu@=Xhlrjg$Uy>H03|@n^8{}EVc+l(fh8G{Tu*He{0TZzLs0q^Cg>5Ky1hEsSTr7)6 zE&*LL1dp_C9q=OJG8!q>37=HKkVtXD88;5|4wu&D2CWbip}p&K*cx#IT7K8VnxH2A ziH&PP$khIs1zvnvSyex*TYtT<4FOhFa%@9!lVcgKq2OdL`5ns56OzC z&XX4eqwyzk&4dwZAvg%%fiY>c)Z^0Lxp8ScH=ZGEuUYqWK$Qv^@7z3j^26c}0bj9Q z)%guKj<;rt_uKyghE~n>DavrA2m6U<5X${TRYr^|>?eQ6^>#PlI!%l#_Fr+02Z2T2 zFJMb9puKfND1$40Q-pFoIy@MbDIFwJ!vsyGX{ONrfHW(Xf-$7a>_A2_>@PH)E}}6) z81`(QlsSCl>sE`1DneOQBPp835TysZ0Q(q3XZ(M~y$CpjUBvNz2k5i<2jZkTu@sB` zI9=gf3WD@gy^AO20Up{baCrFR)3}a8!%DUtB?e)MB=s-N5ecBJFL+PffLaktty{hh zn{P883tkt9InQ?(Iv-%QQADN~cr4XLEyZQv4~tkR=8wks4&G^JK)IxGZHKss*Mssv zel=9|U4pK~`c7a>%#qi^VW}E8c_bYW=xJ@E7pQ_6=o4p@?Jkroob$A{2JuAK* zOWf6Z8cNcbi8y_RU#>ok4^sLE8bELWXy7NNfjmS6h(bKI#t(_6P!p3JawWX>MXQ2W`t3wlo(nl^uI8oVJo04i{$VF_a;3b)F-+K$<0pCT}eQp9LsJ84Y&?%-Z#FSowd_Uudum=rNrB zztV>C|AMyWaH%>7((u^miN;4|f5)S13=Z>xI_x+2ZbR*|e`}A%XZFows3NYMKL9b5 z18f}IozPk*wjs>EAjSw(=Y#43+4$B1RDsU@#YIqp?r}pt)nOoo_6isgvT(_SOMB(U zCx*b`Awd`k`~O;=IULxvt{a9sk1>u_O5`{Q08Vmsyb>5PTyH(A8tZNFaN}D6AA?21 z!Ru5smcszT1h*f!o+xg~w?_5+8F0n}_-iBc2k_8Pkq}j>RL1wqZbQ7Tkf&n!A4YyCwpTGLoyu>((@JSSbCi3Tr$0oB%Nsa5e;2;*xKQKN8 zz%)AuAPZM&5WXVRM7}5*(yv!EXFfR%Lfoj}H4hcQi4a{@9Pv?vKA;c4lqFmB35Bqx z+<z#=b$mimBMxz;5dq|87zb-K@yUjG|o~8YcO=tW|~}p zbF*Q)5PA02zl>8kEWv!fcACY@2ozd}O^I+i@7pX9VQ|`pOG!9?B8smwZni#yrfGjZ zCcXyMtV9yVkmooOETmyi?5M_eL?Qg7Lr?`Yw}>J|tmLSo>SFp-bcD;6ri1DjEO65eqe#X*e9hs$O~X;`gsS1b@6bv5U*gv2UdtbuheM-stf>${hN~*CarBWS z3dftuwjDYlmWQbt7q-?TTEPs6@cszBqbM9hmR;XkAf^SdC;9R>c876w?>BatMLdbF zC_bqhEe5a;9zC=^X@(qZ9eKs?5NY6QA{F?K^#BhX*Hf%RU*Z!Yi?)$(t$+!|7iZ{m z*yR&wL~b+=`iVkL1u$b=2LxfhvpWpY(W*rWoV^23TC)f!$dwfP8()WO2EmGvP=Q=b zoWPAQ4ey9-yf}csE`i?lfGvac^I#SD@}GGfI*Jd%QSWoGTB36@RvU_M{Bw`Lm45np zKm`6UJD_98rRDew*!~0TSM2yM_DhZnm7@q3-7w6WuETL5rQ+bS0V#!`mydKe`z2p) z(;IMI?m|1Zq6LFO-m)Lcp&_mlViyqnU|PsBW^ejF2(CipMBsdgJ`;I@g(B8ZE+lV* zEd_=vv#2L0?}m=B*@yd{aMy*=#c}BMEzq-GKPN+L$!C$(z zrQ)D}3PDatYjdzecx_z|XaeoEhJnz30XZ-XWCTouxm@BdTL6LR*1b>+>jl0%x`$!h zn9{&ubXkS7AUSOTzyotyw@D))59skLIW+(E3p+I~Qj891uYh$>}_6s%8 z#NucM@W#Ih5rP#1%QJLp4VMsp-mhrA1<0gvr1et(HI{(LAcx?^(GnvuHXv3qAV}%Z z49<#C8O}#rDVh59VakjL%y9jRGe^iuW7_77>g=1IHU~*3qp%Em&~(fb_~-h-ZCEHnI)CUc zfT(likTv+(UbHVnTX(F6$7;ce+WvQVDgTBSt4$Ay6C7%xlR^rsa1f#&QT}icA`3?X z)esP%kxH>iQ0vg!!1iu3uHeSEaA-|PVN=)-ZCL#>iA0Elith&%`=(H5{;Z`n0r6{+ zE8sq>cZ+i>K`}+jA-N*4yHpBxVW90Rhg_>+KSX@CMq=0fen!eF8nk#3M@nN_DjG2) zoh@F(cbD4B!tP6aG$!s#5zXNb2OWPU$Nr(EWZf%d2M9PW$hqO#qFF~0OL181W<+x# zyNdm==({!qv)TS#X`)j`(Bh(1Js~<;qp z6GdtdVl)uOhcnn(Zqy)aaCDR>tO%`zO=|)_h>h%MFWaSFv@DWnStOXnz8ppqhgP3L zH5#ff0Yz5}%c2a+l7`lW!>EO&VWYytb`Gt!6rDB00+kOTAdETcHp0GU_K%^bNcPcO zAWAc?SrUT_`)&;+JrL#>@dI#M>L!Wp-SuK^SEGLyNd1eo1J-=KW=Vn3f7k41JlGoM z`qyO}zWMXF(hooFxd7So!hf%R^sm(||5nR!DMVhd_am4YI$RHU2Ywu!!@`jY^IanO zmH=)@kv5eT-v#~QIGaB!?QRLYvKjZvXvh-=dftWha(_PSQcX!l%cU1gXyDDP6d z5sExu$wKn>6Y%8v3m{?%cM)JRp1cY~3KTySW7PvK;UEbVmkTk4px^)(C=--JWW`hS zK4fKo&FmQ5ni0c5cNt+?B)EF&P3*CsD#X#l0bHuRu`s20usFrbSU6Z{ zX_4TcHvb=r6F>3olZ6cHpE!z)`DihkKsiy?6`?7ROe8YY&_x!y5&$a286!Q5W=v2q za$pTACwxQ21O<#~VZK|Lf??ChO(ZxozHrUvL@U~I zP!X#V6P3FAtMZ>lq>@gfTgFVJ^R4ghJWW-(IcP|!|@k4i0CZ|D=IJq%Sk4rcV@Gw9YS1Mrx z=SLhObgGJa82%i7X#&5AnH%#NU1J&k-3zM?o#FpY(+%HC12+O}KHUmD6^^<^L)F~_ zMc2iUZE_LV+|_{!_IJaFbYHLw>=!j)w_wu)7v(rM1h`gY_zI4%>~{*-eKkDjFH$vg+JVys}>W5e~q!EBV!P*qUc$u70{ zM%Us?gPfsTL!bjh2L0xEBo8PIBtLh!>^PL6i?ZU|KVqH{-R@Zc_gFadv6(KUD1YD$ zXW$jKD+Y`LD`4CR^W;eN20)ydfJ4zbwlupxRZ58Paao0-^58YyBlTU%(0q5DN< zqIF08;)!K&f&d@jlTX8Z@;VJdNtimMct{&SpO}&`Oa`{)lfdY{?v}&?9&2HJ_;jpU zp%w2whpUhtQS1awk!BYCj|Jq|DnNn=6Q%)a3?xv1m>DD+NG_24AO%5+f`s;cXg_-n z(j7=ukUl^{PWA}k-3gHFAuWLv11TNSHAqPJw?iVsz)0_TKw>~T014eAcn3)iREx<_ zS`5!ikPINs^$^lNm?%dIep4-tVPA;wYd)JtYXBUkIM(gW+xG(m=#Ito7~H?5LZW7< zU4Du3y7JDo5h-QDA9^9=J<%j8fWc(EMiIvO?OdPnN%iOr-KQIF-MI7+(a`w5=A<{X zw6+{0A33u&E^yZ^|C{Gtr>wVxp|As==6$bUUEzAn<5O`=#b=)1yVF@;Hz}RYXrN`I zt&`1?1bwS7{K=n`Mw3lie(X`Wd8jb@^TN17&p^EqIo+A)%+zpBL0odEmf`C|Jv*EO z#^|_@dbUq?L~Qi98=4P#5@#Qy-fKIq3hmr^SCxC-?LB>MYmu%3?TT&9k2eW;)4l5Z zLPK_5dYAHM^ZL#Ydr!XJs|#&&@r)1W*Lr(B-ZRNvu~;>E|J|;y&P`O)H@meB_s#0L zK4|x>;1l!pU8Uy*`BR|%@`#KsC29YCuRlglxw`PllH7)K)3e(a;up47%DsM9mJ+X< zG&wr>c)XLH;^y0lF3;?skMqfay5oe<51$&`c1FEZ4P5PPWK6G)AH(xM(>;0Qn1ZT@ zcX#)F@sw+jzcHbB_K}ZeUV8$TLB9>;+Hqd|q`TiPsCw+WtFlje-rX@zZqB*cH!^O- z$=U^L9ONlj(k}W}B?)c8owse;_HS%Pe^vc9kOF;Q6!ab2J7C9G4zQo3!(6ylw){H1 zld-hX)zGnK?e*!4&qTVW-M_edDqZsfq0jWBLgjA3(~!YN|K04q^Tp7A)1%AT2e!G` zN=1C1dgOUkpLI#Og6r-ayQ`$`q_>Pk72CRYuaFY%)4QzE=W&R`(T#rPWqSSf^No^A zcg2(nC!K;Ta9Hr0TtS^ppVYMxish>>J`;|tbu-w0aM6#1*{Rnx;_)Qc=*WkglzS$w z_cNPh^5QjJBGGB{xcjbN;f(h#Zx8#?6sg}vvjNV|Jl{8OIZGBi)SkEFLDl;WSBkGE zKVVY!k*fnHVYn;oW#?C!KRmr;uSVK#YDU@qrDe@I>a8koM(s2AXqIanYr7_BJ^n?( z%uADjq5F=MZ1?`EDK}j{J2ZZi+!~z|W6!5kug1E6K7Ri4=5G1KG8f;?s;hg=r>T!M z>vW!+JV#i*@qE=hnGtKQ7J1o4e5b0B?~k_Nd<&@hq7Jf^*;>0eG%Wtzp^q&NYHz--loCBFGOwmv=Ap_!W7$;?D=0j!>`+022qdi zb>8iOyML%UaFGxH3H8Ajl`k#CBS#NtDE2*Mlux|%fl?okHv3uc(WMp-))9^y|IobT zZ3l9HHCVSb`NX$W`sePMmjm{8&C$<%8nFG$e9GKRebb;NvF7gX2bv$=dP8Jm%Zr$i zk1}Qbws;-2&Hl-Ni8-nqo9Ms{`POBWdbn3TIo^@>`^ zy6jZntNUi8r^_jq%jQfxdxN58VB}&qaEJO(JwKUchQFzHh<6I~anT&}JmWD*I!Y$l z87fZl4W;3>*4hO@TaK@%xTe{8s)ydwl*0w7j#uz|+Q%DH8&dkMP{X(}?$MK2D~Xi3 za@EQ2%b#w^cX-czu<13I8cW(WwTF7g>$UT^dl^kvKh0Utr-)%^WhEp7U%kHGwRmgU z@`4QCaocDWjMc{qMh2ffg5>jdG71k$lDeN&LzkRaa`6G4ICQ+x{piq`$rBwt3I_?7-D_`|UQ4aNK=y z5z)fC z_q*P1R5(3(>kXFh0`63FSXoBIyym=qcB>up>Ba}Hn@N)gT#sJWte+yYXchlmags1I zkL8!z+Mk&vW0tKY_iXUWo$5OI`bQh%$*cNz-Y;#M{w&c(^WuuycLz*P@=o<>j4*WR z<`%_!nWdXx*y}JA{FZlCL|Mnl&wZ{`m-=>nnIU=3PJ8v&MSE{w6yKb;E*vdCs&u)*} zT5{V|Qh%-7irRd2nLQY`P?a{Z;>!LF6x{`H7rW6N%C;^&XFq<)Lz(g4%_QF_zU8WX zyL9E|0^7`zsiQUQ_1El6@0+^5!JNgYlud4kFt%gQo-uk?J~cOe^uyh!wvP<28?XP- z>hr1j`vtM(b^ZRw+LEqLdGUy_)bmd~xaGVkmkm{Q{{Y{<3zLSj0XSE#Lb6u$)=Lsd# zaz<{sGA4SR!Ql-Qi)XH9KDO7Dq<4*nKvHotS^lm{+{3v3hK+k|CuxniaQ(h?zQJC# znmGq^OOvEaocykgDhkEKexjyUgj@ zoIK}uR+bCuvT&H<4q*g--l*6+D@xz=KbvkIH|KqI`39DX()bFq%?hL+s(5^Eca7$) zFT3_-ZG0_r|C$YUbg;8`@N}*9^G_!ZJ%7$$f$vDFJ!5VX?YO~GZ_Df>54&`qWH+z+ z(wOs}I9hVrW8t0ID=OF42lq$B$~U^m$A0^=e!KR9c-7?|E8b4eYc|1Uj#pOqyuApI z#cYkagGeD8KIl)!YQlKqbO zRE%|bSb6c>y&tlBST{!&-BCM#qS5NxwSCiKB`0Kf3hSRV-6>bz;N4_0X`0u;tGj9< z{O>d#lv{ah`s2qE&qCuKUFMCM^2Tsor{~q8)g+UwVF(b@u*9C^}>EkYVpe&-k~3+g%6qL-{q^vKX3ndHj?<^_&q7ic)r3D z<95#Iu1$AF6?%42wivg`%`-H-#9GYqm~l&x(Bg*oDL!dcHG}ZMa4|kb_O*lZ*{$tM zGVpKOB+sr`Xmd8CrFZ>JCT~sLe1=T)hbc?>X_r@aW^WDCjawA?X4JTE=ihEl8;m&k z@Z_h~Iag*4?s=K3>-OogV^#U%B-6N;Gv+GhEcsOR`jRYXyxax+$z|Ro4dI0oBSI~X z$Y2K!@q75sdQ8qt$Jc(H?s=?CDRku}S9m3Hyh)n9(huT-6N z+2X^|mZrtZ=a%hz=$r1D7P)5V4B=V&HNfx>qeh9m-1q& zI_=q#DjRmRf0sTlkJ&`MOstC>Egh7s)RTNpsar0U(|waBv(2aVvWLOb%Ql?!-JADr z+rqI_xltg$C++a8*Bj<_cyU6T^*iQ{Jb7r_>m&oq{*Hw2CAX_4ZH`^Vcu=fzq-Nrr zNw+Ao#%3qna{JIhyuAL0`c=Q(=Zz94MEP8>YVBh#@?1ML;E(`c@nFH`(^3!h8-hE= zHrJBYf0nFsNti!)X+rM)UFRN^Z`F&^4GkTEZAx%Xt+`pS;AXq2tLC^hgO6RGtJqGY z9gK_Zwm&#$;tt<6Mz7ROPN%R09LF5(Y!8na({B2a0FAy<^t~Ioh;pxnA9~TqQVc&wmif2DV7^v zmYwpgb2eYUJhxCgIPgS2{sy+?F{5+)6Dz@@+bvt&T(i?>9gdvaU`ml6eJL=)sdm#x zGwrxu&jb4Nnx0(Tc<02FbzwKO?Kkaq{c&6G#GUJF8zN>LIJ1xun}1ZDLP}_Bwu}!*IA%jo>h9Pv}cpDT0h6sI>=@Gwif>Rf#O#h<-%0OPvukhuCda6ZL)v4 zfQI(NMatfN)z6O-&dJQ4l~JW%fB9+m+np1SFhYyB^N#j59Q``8Xx8qPhcf#M<}SJD zT7D~S!HWIvt1NP^+t1hC^Vt1k-}lZOx=zT2bK8%oWXjmiFc>rb>lZWL2Z^gj8FW8Jtt~Y1z3%bD^X0 zj3e$bxM$ni&U9ukUSzD#vRk)&{Cb_~^NncA88shXP2PNRlNUY^H<_TAM?Cl??7E?s z>d8y?9>rhdH(k@+x4B!v`g3hTM*pq2R7&`#FZ~1AGo;MZ=B%fy@2haPOV;7<6b!n2 z7&%H?(&*^1J&&;yo+ff#J6}uVJ$5`HpN&u(`&L47mTm|8L(M+Rs{AP-`48czAj)VWpYO+w`(}^VSvt;l`W!5w&9+1K#N9o&jQfsCnd+U)sZNox zO_ghZe=*r|lk1}QS{iG97>o#WS?9>|T^&7h(@~8dl!qCO&GY+@YT~SvqenZKPXC16 zn-p)FE&D39Y5whe7LV1H^1w!IYvcV@k%pxq&zNuW9Cr9iB<&^W-5mer7%zUE-vb3F z`6~4syAx4UCMs4WmMzCLW!9Wiy_9vroNC#7-Rpjlb?8d=iTnTvTE?@ zyoJ$DCI zj~Tp^zQOm2XJe%Kj3+Cneb}Jk#kYLmxWJY!c`5i}=sxzhjI7)iuSk+0{rXP*q?|px z^Dn>32EF7*ZShwN%5`NS ztm8Jq*Kds)jag65eOWVpp4G_1HCeuWIHH4A{=z4_)Pu(7cxzEcubynIoXk0B7`#&| z@$jkCd#s}y3Tr!4<=5Chj0`utYrn;FS=*=xcR_Py&A<)2n5z@)og1|!%ndCB0cywM zUbM}tSCXCa_ByjIC@W;s>b=x!VcwYuPakDXe$Sg8&n-`{?vZu!!BPdYwZnF zmiD@ziPUOf?(lLNtG@mDeqNNLbnq6pWjn)0m!2YJRW)9xC9b!zpZ9d;;LhT)Cs;He zMS5)Pfk*6i<%u2}&*m)L9C?3Y&By&e&J5U{JAc&pSqpZ@s8>g$&p&oy<&IP1>nEsH z&2UvTxqGeX=6E~4-nODOCXz%CL8<1UXR)CtE2H(4-#A`25Kh2jHeH8{Ri|Exb|*^o zp01LaG)pmO&7ndqIa0@4ndg?>3VSj=f^T0hICwtVi(%lH+2f49ja7VHTTW^Rtdfr%JsgFIO-q>bzL$qp@VKtJ24hK z#}|gZlidAjnqz~-$708(23N+Zl8U0t!fJm_+au!=4^4dIocGZv?{rn-r%ZE`b9enJ zp3gtHaLJQk!ajv{r<=R4N)Gmq%%AEyPEu~ThOP?Of{AqPoPu z^+@U%+XGqScTc+&?z(vQ-h$2M689_`J`r+_I%-#HWNqob6{AKh*l}s65?ea%t|h5S z{~lw#=UmT}fx`n=LK~TQgZZ1!?s(B*K5Fs=MQYl17tj8Z&zJV3%xa8w9x+JwF4CNk zc|KYCrW;eB+dKRk8A~EqpHA(VF*mS4`sw5B zE}O!E1m9DxQCl7S9M@jEFTb&STXdE^>*r&r_4%ue?juXy0Ts>p6F?lcn35m?Dq3<2xsw330DH;lNO*_{%8G zZ*#A_Jg~>>(sP*;$v?hFnMTRXdb>9x>%L4(_hyw#U$<5bc4|DBeEGFeU*)60indj~ z=P$Odb(qX{DY&deg{ zQy{R9ZJH_Z!SY9{+ZwB^s1^-Xgk|e_!;`gjmql$>En*s?+8)qj(R>gW7e5j zM{l3Hoqj&QdLVgH=lcWLN7ELKvc{PSxYw~Qo@!^I~E4H3f(7E|_6x;Qo#^-PKEfKl+yy^)Q8+oTgQ6@2EZVb(l zM-DR&5I=SK_Al1dj2m6;Ueh{brux{VOHKxNc2>OepdQ)MQW`#z6EJd>yuf$dc=It= zVn04O@Ks^+ZNJu0S$(aqG}Eq^-gtg`nLl^Bc6M^ez{blO!Q>ZKa}(Rj!(%s?NZy;a=5)o4+&iJI3#HCo%dPVv z;cg}vo=&Yjqm>jRKmFSKK(%A%zLI!}`0e8!ZI^m!^*qEv{XMfp4m+WHf3xh?&y)Jo zO^ES%BdlC5dtX^QKXLQ-<w=iQ`Pf9PgPS6R?nh*SlB$)^uw2yh&|2=w{C3dN-T`X5ArH+=t)|A_N5w~_E5R! zfxk+GTnt!RnT#4mp1k}aLX@*Ki0t#aFbg*~q_ z^g*X~;B>76ORb#fq1QSCjIMemZyNl(@c@N(QOtE~9zyuPJia?m# zyY*Msu!1jlM;09j?06N)J4x;7y<)F;WzVT=Ihs3tgFYRM_SRh*Z*yI6;`7(`E2%9X zHrh*8-8o;kYvIY~Sm3O2;})o`8W)#3mvXb%YE0e=6Nw_Fg-kh36G2R4$YQ6Rn_NO` z4cyxd)>*CJye9PW>xa$-{m=Q)Y6V*Y>q~d&ecnH?O=I#le_^%u-9X*!MzeW0vNElj z{R|E&8(%lNJ97CfRp!{`w-&q@qb~b-{+hiT9{LkKxnoBAr6^^zWHn~J_F~>XS(LmL zFA=)RE9OO4{xUf^o5rajS>kRv_Ij0yCHmlCiwN;3@ zKGKP0mvVK!P1TJH9NEv>7y5Y+B2(ir)IUykyCn`eX{#^)s0oRlI%Ec(7f)!!;kIhN+nh!Ct6Gk zciUjNJ;-?~wIz4)>%z@7XDclG*Gn``|B}DS_DOqI*72Rv>EU+^Mzw4VduCx*s97fE zoc{da1>4)*hrDeH4qm!6rS!&fV}kB@d2+u~-SpY_R&LR2`urnwjHKdng8RmZTpg{Y zNv}zA*5zF?c{j~(zUgYUy>kBf^@UeG7ZTlXT~lCg{S=n2dQp+Jr^&c%ij7vGBt7Ts zU9*%mk6OG=&d9i0!+vo2;Mz6Z8b`fD3%1PL6ScpS#oT@5<8@|A=>r>m`r0?glxAeC zeXzHVyI+|yqEmIGC!SX?!Q+4^!>iL zsfrUT0yNu?t>zl8uHLa)!W{kqpUR~1+x=dq{FtvO?Aa%CA~AIG4*2azscHXFAI-6I zdO8kDemAOa$hm9K+0l?)e8#IXpI~z^JG>-+etuKzq%^um{!*@=fr{dz_w`rZ9?)wN zt`86bU8b@3)+psJDfnRZ(XBv3wMmsO*tT-lZ2J$(&(&7Rp4Tk$l{s5N!#!9f%}Lj? z@_c1y)Ujrfg=53Jn7Sv+Q=CGY^)0R)R#R5_aQX-%Ft>A{q@t|(NMu#KSI14Sr)M$d zjqc1{4@hcnK6ez4?No1$)60G{xa{t+@r{i5g4yjC7B6ovD`!bpx{p4-ZfYY{OZ9tP zF=O*8bNUXGPgh(!9&OAwxAI*1C2`}kCT*8>v_hRbXB9ka57C@vd}U2t-($Cge!9Xw zM|!dJ_k_-llTl$C(xrPUF0VD|T%1TgOFVO?Bc9@Ztjpp$+fUN|rokm+ql<^FoAb<; zjh*$wwiJ^wIH%=vCsgt2!WFw)RzMiZf;IY98>UZ=y&mjP7%j#L_dzo^YF0zNcO?S?<*T zBlS^$l=tLyN5UB&VxFJ9oUu9%dd|jOG1R)YYUb|! zs%MnXAC(#5cfxhd;Hp;nX1meHXe!UTR?Rtev(oX-)#GE0M~ulC@7Q0l>elWpxmS3k z_BM*;vEUn?&*EpTFP!G2r8G*zu&(Ch98>Jp!^&5e^$wo28+578t-6*Nws2eMx1ilu zc(3rw)UG^PxlVPLPu+_ytu?n!Jij^+@ZlY;c&tG8;SrUs7GvMHuAQwiWy{5!CsNn= z7N(EcDM72hR#kmyx7cc{P9q&X6Qw_Tb9w3(LVA~T%)9oNb~jaT9;!O$-Bx|)PNh(D z-eN{tM390ZY0h`vEB_A~_l#C`5HkbFZ+oY|c>ZGIf&z!ZW6`~*jvezePcR&nAf@-A zkRH>0D7o5pfZTKAqk{VGrQ=SGkO^=gq*RZ6ydiVs%&V7n?JT_Gb9rfMUq??)Tf%Yv zq3cUB;uEyaPN-Jw!IcL3Cn&gOMN2r=^c`?iIav7a(#h99+ym$vO~yK}{x~V|>WB21 zcIh+s&(N3mG;2N8R$dx5c~ZbP$Eru3Gx9q(P7WU2u-|f5_*Ti(EgmEL)JKjSIC#~6 zQINwnwVm`^SI>Aa#!Nd(uFIZWb!nD+5p4&Pn3cP6hUGzt$ffPC$WPl9B|5UaTQ*M9 zCY-m6b*jA6eIkh&Q*^l@&DAge>b(;iF5NryuyWPRb{?nfi^9v7&DQNE_Je0iWt3|V zoc0|EFVI!*Hol*==-p>`7S~x&dCTQH{c_mop!7g|&VloXa#s=ew?rKOk$yAI)04g~ zD!1Na-h+psE?V<~_bZiTs9e&0Hu7YdrL;fEbjeHdRS9N>mQp$YRzC5#tVOhP;vC12 zuWR0fCB8mXWbtTlL+al9iw`t-o~@getxn*cZb+^gA#wbMj$u-{qoD0{-i?Sv>N(rw zdh^N&W0pAYNb0&{nzL@K4(Yvy)}*h^r(4fxVW#h&)JZqduU$AL(UFsX^LBBA6nC|9 z;JI;zVaNFMV$CN~$IgEJWnteB=Hq;7AO`|NhJMGI)RSgtCcb{UyTfa=$JPxO7bx9n zQoYMfIJcD~T`Upa{q1sD^VAF0C4|>~R~D%qkz8}O)$nlGoNBU9s^tlaB1z z?V{*l^wo3m_CJ*!BVxPMvA$IZp6 zUzPp5mru;w6J&kb{-{2t`114(>j%25{rhV1sSNzF1>=?T*Ut}EzV0XQZ4xraO)zNQ z9`xO&Y2p@@thnsBCJ2qVouQd z$s5Z*>{@3>@jgN`SR(KK{CxYqJ=P~X!*Z)u&K*&?yrWd^-7!+4vt(INbkp=*$FaQs zr@eQ9kF%=w{-0^nHibe86ew7vYPqx&$XqhXBt)8P8%WzUNiQfcB$G)KI=MKPHmy*C zDaa6`Ij`u8isx_?k9a**P!TVuP^EaKfS1ZedjK(AaQ~W9?_c+UZ^-@| z-5acX%GpJCv~zNLe+n04%$5CSnOWJ>*)-O`1_<^+-S^=I4gcfSeZD8MyB|0>HT%Q^ zubs`^1a;4G8B)Q|iQiec+qWZIx0f?soHT#jTs^Yyf!7MMd*nirUo3nm`_f23_JO@q zVaon`;Y0o>*{8K|=r4suANo4}+5477xUHl0mhs_&TO{IxBXd5IfW)3dIgPiI>tL4L ze|H%?wO<_{p7T|?GK7=IH!08R{n=`{{BU~qaoNk)EZfD_j(v>1Rczz1G zidVGli)2=dDBI;^>)cS8uV~vxp~~Le;j8Apa4T2>PZzc&1&4}Fd?UZ&0OZxwMdbC& zWy3Q@X59pzGjikkYy%j%P4D>5KD%&d^wT zd+t!^rhaNe3;GmkWgpC5HD_Ot^Vk!Du8@Kg=d68iVGm+1%p~}2PF2_hGbNG`(ML$= z6q4Y=5UIl(iF)5`%4|30t<^j9-CQ1Lwm>cZ9D3H9RF!H|x5yvcBOn?Ow{JL&<_e?}KUoOd_c&7%te(3)zB?uh{&|3!jCB{k5})R~6hhAI#w~4u-K2b3FUN(8DoleQo(4&2STowIUm3zamvHL==_hdrUxiR{p=DHxu&o&BAU zKTAZzwcAPJz~f_jr%T%a5}sz95^{r0?w-`rX;t>&LU~?wvML z?USCf+W%za@#{|+g^^o|cNNIqNv9_A_;r7f4YFKXl6@%q%c9S``uOv&aC=EX_ErBY z**|6fB72PK4|8s>$^Ov)1M2G?BPm}tGtLzpkvF#5zHyq=gT^bBbrpey*|R0P-n+;O z*v>5XmKALi@hIDdS2)tzyW~kyaTY#Y^gh|jDfi8}8&$)yPnGdz_o+UB6%io$+J?`G7=)q(eg&`x+poW@P@XeOc=Da`yiY-9Z1DKJ-U+M<2*u z&cNZF+}>6)MNU>6zE9SZzAvA?^u%<5?`(Gu>^IpbyYF5j0lws(6=IJxF|yZt_XA_o zmJFZG8O3R^^^azMG4wo7nNwsW)!sgyeMx%E_`Y+=kM=OG^IBOj-1;%;sLu$j{n$Za znu(wvzkGOYfu;my@3Obmeq5^JG@=^1?sm$@9Tu0TXDCj;lI4o4{O#V(Meg@2N z!teQK+hfNo!FrhQd7!*-I624{kg1wjQ$js3LtwYb8jkp>lVBfXW5n=l;*-Mzj zHuOx9h%&a&?OS2O4qmcf&V3C%BiEl}1vzq$H1CXGa*%gK0T_B_ss_z>m?Aa4H!c~^ zw0=uA;SN3H(=ex?-v0xRa-B#pTTdH&=F+0?J~s2g`YH~8 zJr!9!zUdS#&~#JOks6=MT%lqt1`RXWFD(w>)9wvB{^9I)uQF_5_-kc**d`5soahD_!y?Wko{GIh8~(av}bHLGo5FoJU!VO-!6{SH zoC@1}%j_kCWlrYB?8D|J04-}S|0nq#S^3vLeR(`nII>heYp{_@i|%|fv7q2rzwP|Z zUT)pmJG6J{t%Ikm_c=QY_)Xy}fb#eM&Ce-t3Vi&JG5$*Jf)fTgZmM&b+;_k+gd;cS zt|~TNa*Vy|)Y<9dhc=(jfmgXRw{mdv9OwE|hpWzKFaL?dt2oN;OP?a2dRXN-M9-LV>gM>;Z$*a7?D??Xr4c!pn%2oh0`I=@FT68Hv*jc*rD)rSh;8i)H=2CN)z3vY z^)MQEcQ`7y18y2_nHy=Dv$1cuhEtt|MgRKXNbA)3`Mj>>V#rr_Ax+Tqj+o)F&G1Fp z-wZwC%Wg4=AF7!vIg)opK%}`vfJ^7rjQvE;)9=^2tKDPD_HMVMpUvm|#?X!n7H|k; zyppV6TJ(N;6bj(@*rl@3m>Y5Bn-HfJeW(fY@ap}dI$ZZ?F^8PC$tQxSw;A^RgB&`H z>@Ip=k&yYC$MV@DoJ4x{S8sb*?uZ;II5Sdru;_g+kzwDjwT)IXb&M1QI7i{kFM9tT z{+PzvohqTR(#0b;%fZ5P$jzaJ`+Yl^5=RQo&`3n9A4#8Gn1B1@P}Z94jnqC`%$c{T zWOr@B&@%@)EI2Z<)tNP5V_9aO{fY3(_-a&nZ01L7UYtW{=B0YzopiTaHhf{BAsR zWL6ovAO^_pCQg)c$yDLk+o>2)+@DO(M%g`}_b{AjXwofm&GAkycB45sD>HmUAr*Gh zqnsx^BzFw&KdtD4+j+=qJ+__nPE(YP>yI+%(0lA{335D3KIpM#xW15&jc_5noHn#~ zsK`8_SND!{w`d=yC&(^Wi7y_mmlHNKXF&p zihDjvCvUxD_h|Q~j?~a)BYRTQiJdzSX@c3rcapgWfY{IAX{DQ1`gj}u663=i7#5Ozn)BQ`%X8i2t z%u{AOyAv&?=wEjZ?U;XU!L^0-q{6W|WY0CNYIaTe{U2gaXOmn4QkX?5P0v=(&c16- zcFWxCmU*bO+3H!@H4=De$@#u@i#<7elp6uF585&Bx#vXc5a}&S-%*Za4-buzd%ieR zv+RMr1(AE_zQ|*ed%h$02uc-^y9Z}4iQIdp2D~hlxCYLVZBvE7(aLYqg}K0p`qmoe zYTQeqjQir<20-hIXrLYH9aqH=bGVFTzQ_EFg=0I-xOGlc4zPU*FJgFdw_?h>bPzi>m>&*Bef499fpDV^LTDm z9eJXY2Bo((ja?)!weBq5RX>Z&JHu1x?bEXTv-VAuhMSVDFU$sPq~wt~%#D|siCbij z9DBCDVC1p`*%L>q&qfG07LPZNJtUR*pGn6myK*S~XsK*17->3?J#A=*q|#bE9@#V} zUCo_UM&!M`aOW#E1yeKP`!IL9WZzq0%RPL`(1RBYJ+pVDcFF;UZg%QOlRRc?&m8BP z7E?DP^NJ(UxoOU-5Xl7^Nt{9)C5Gv441saIzGKUTP9u8Lk*n&+)a|~Tryb-=6x%pD z*d<_0PQ5W}4WA{~ZXgslTw8eUtg$&z*^_8e@0V$D$B=VT-ck&CO?W&zy%)1VM zL-MzJ=(W?fKD$e0fgaI&EW3Mj*S5L)C6FKRfI$KeS~#?0c6H>#B0p|;eAkd6~3t<$4pu$;izz3pR}miE@EJ`5v(_sBk(^pn1bf z81VB^4yVxR>_>o%OsOlpu}q@K%#KWxMot$-rtRUQ9`5{S^yR;K4@cqH<#_Upuja@d z3#Cd%!>D1C`9kH)k(uw|Zn&|w5&eGTEqiXBzHJBRlig3en7L-29C=1F zQ5V5>Dn#!3xtqV@6RJDtdw`RzMei5oQogy=!l~T-T<|RCaBpBb&0atD@)yu4t{=l` zGt5^7ID0!gyZSl*lYHCm)%bH<+NS4TeR52i^RErr$1~5PtelKBkIz8vA03+E111j+ zaS8NL-B`h)c?5x>^_QNFb| zQgB?h2LCS?+;bx=0=Kzk)ta#)GLrjbo9gl^E2M8OKbp_`>bVTcw~Y?h%$iy=FS0v5 zWBA>L%rJk1di<(p6xgkF>3!uxe~E4kj#STJ26~qEnWI7Hp^8NIXWo)caq*-G|LoOs z57jRa!J2v+o5Oyu#eQN+1;|36@0ozVl@a%^SVeX&x&S+DZ7|^?or?Det3V=NxdiX3t&q765BR~M2u?$pB!xC8e+#e;^iifwAVoP6o!%U3j6S!uDI(%bF`tp6NM{hi# zfUl7GBp1^pm(KB1KnHTDkWiV4_tlPs|2f3NU}XUXaIT*|t6KUFcJb2Medmo1p3p&H z^}e%+JNv{ixu-Pvv*4>$zJhFR`5d_qW_;{n-dEEuJ#DPx9)wBVc=6EA;-R{O`7d!k zMUQre=283P*mNpo><2`r?Wk>{b}{D6(d=R_ZpX|YI`jtXJlYpdpsrpxl?oW;>zPyR zrJI8>JSOJbmHIt6zR^1eRR+8^#_IF3-^Z(QN3Lb>wIIMgRFIx;hMkO=m0pw!}rTj`Q~nPQ^t91p^mAc z2XSe>5-~B@=-hR^!|Cp~2=rc&#WeGAk=dE)X1d>1t+`b_)U0X! z&H8mef?7RlzJVI_egkz72~jEkWKPjps3oT4va4ny) z+23+#wSE~tQ7W^vCnBfxqc~aUXu9DS8xgD{?m;GW1lxgSu^%E#Djc6 zcH*6D@-5H5S#NH?3`xChE!=ue_I1iTJbm!GxwxWFqI%JM3x5V}nh5so2CGp%XJD;zjQYQ=`h4|M&lJ}*PU;z>ULW-gJPu1|?Gwj?uZA}_Jv4&5^9DZR#$8EM@b=9d zX__Tp8qK`Kr#i{mBVR)JQZMzhvRt{jW=!wxwaTaIAL@fyeYD(OUSQlYMyUql_nFR@ z2Jt;*@$MH6wik>K*UVdn<%V}})!6H_rn+cU9}*+@s8LTb9+p+jvgCgOw^EyW*3Tgv z?UPdUsAXtstYhCj6+8Z=FJi}|lRtBCcuJ)>)6&QBC-ro?h`WVbRyB{!LsswOzCXbU z!Q5dr_ATC$I#ExOm4p93xQo%ORjGEe-TBj(SIVl@7e9|p`I@`BqbRtV}S3GO!8g17QsdCTg#$-xOH9wsFyGQ1)%TUBb-}Fd=MWw^ zO1K-x9C%KAGY{*9vq@u?=C^w6#p_5Vb%H0W8y!gtmV)i?B8nfu@a#;J3;Ml;-CI2N zHK;quZo&2w;rZ;FdF1_jtHwqMNwSu{uZVX&iD-Rj8V>KThf6F;d#kEcsa6|_wU9`m z&F}2(B`}x6e0aThc}n3q?M*zASE4E0UPSP#?2@f9n{}S|JKS>1Ka~{8-xLD<HbBao5X)N*q>wL z_+QG%fAyDVyT4-jxexijckY<@`#|nz=~?~Vc!Zx}xK)4eJHk)G@pt~;{keUBMVN=@ zo31MBQS#rh-?17vRs+Xs;8+bDtAS%R@PEDrbpHg&%3Lg3Crd}{XPbyc^A!4>ai4SL zfN+^_KM3t%HfzZ5Xzyy^v44)$z_A)QRs+Xs;P2Le?D^4sKS)&BUL&{+ESr8@T;ajX z!5x-ood>sr2l-Ea+xTx#06)1KVo(4-Ij}t_fZs3pZ%_cg1N=8AfL|GceNd6(T<5{^ z1u~cZZ4Z9JgJ1RFnV5Yp|2z*a@!)n3zTSi7`#$cwa%R}YvQ=YHx8Xa^&pdS50XgXS z9r+zl+@tui0-+}rU!j=I@BG#)R_J_C@!R#`6COI(raObqc}jm&@ixVORh(74h`j}a z&Ic9C_qhk1uPbg>{0+rDirE3mZ;Rsl72l-zTZ%ubSX#$%KCSq>iodFOhvM%jen9b0 z6@Opx6N(>F{DNY$S?hq}hm~HyZnQz?2a0Da)>}`wt6u28RQg4V_b6VX_zA_0il0<` zwc@80Z&3Ve#ak8cRh(7)?}|UJ_*upOqWC$*_bGl}@edULPVtk9Ur_ve#rqT&%#eJ( zsQ6UHe^7jp;y)^0qIkdJD-^$^c!T0UDc+{|WyK#={Aa~?DSk!qJ&F%1eo(QTv2~nZ zDt=w@?-a}75Xbqe;x`nZSSa~ab;>zMvFurOoPgpfit7~@C|;|0y5g8(z0||ms928W zJI?zQ^KnvsA5knvQTUdY;u92qN3k4KWwVyz*@~Z1e6r#f6w9H1@~l|4lRD0EY@Zo) zPE-6=#X@zQQ@QeF&^e<(@HvVF;TtRx`YNT@DQ;GLjbg)7ivw!Vxkl-&irW-ltGJk+ z$#=ID`xSpsaZvFm6^9gmNpV>5w-lEuenhcJ>v)FrpmV9x&s4lb@x_V_PfYPrr6(0H zQ~Z7p&%Y^Nsq`N!Zc_Xk56@dpmbBI=eX-)Tifa^`v^FcgO6fN%zFP6eJUl;F+@bX6 z6~`6-)x%TEg*t;yLg~$lMUt=&RIy3xhl)2UeUIWzieL2bEMig_N-xH;ztx;quB6lJyUpoqx9Pp?^V2AvEljETZCu7 z(*LOVCB?_HC4SJbICWoL0;+1nA~BtoXf3|AgY}6o19T^Mc|JA~_xB4aFZ)e8#!? zcs_BS;D1*7cEz7k{3FFCt>e!Zo(qw*jx%5JMT#pF8=mhdE>-%E6qhOfjfdww3niXv zrEgVSqxc^bn|Ll-Bs?pWUZHrU;uVTlDZW;5v*H^Rn|IGgF&%VvDZN7R!-`uK8=gB9 zKce*Qigzpiq2k{v{)OV_6~Ca^yn8k~!I|ro9#H&y#g{8KJU1%7M0Qv@w<)ev{3Q?1 z*?jqR&{?WPMB=$y>E|o{oZ@#XHt~F1@mH1pdByiA-r?bC ztCV=2QhKlArxo9**u-<GKuK6^7WqiVe>lim#g^Pumr9%OJlWdU&Q@D)GFc z^wSi-s`z5X!p-+Q6*r)1IL<#QzD)5w9-gu#5>Knr8x*fme2wBypUtaIzv9m*-m3Ut z6n|Lp-HPv2{5i$3y;6*nk0JR^#CEB#Kzk1GDAhvyl^zf}55iuWj{48#^d}Y9D*m&F=ZeeZ-A1MNDqgNQtN6?BaQJ;% zu^@JBWj4QrxK6@LaF>$4dX8;-4t~jECnb#g8lf zPl|u0_{8NBzxiFN_z9)2Q~adjO&*?qQvB~q|BB*g6#u}(bLI+(^FNfnSn)o^wTewz zC#)2nzbO4I#jhz2Dn4a_aMdcFqxjv5PgC5Z_;kfLDLzB-hZUcx__K=VDgK&blkU7G zN%tJ37b`wj@nwn)PvI)z`JB?vQ2cqruh{UsPx0N0Z^-pIZ7h@S{pE#0NRW`6ajje(`6@uhu!v6e3tXE96sB*D~IPh-^k&&IS=OW+nq;pc!Bd&4xi(U=kU4CiN;Mt z9?o~>=I}zNEQc34m*wz~ws&`7M_|^Wax3-VM(o4?c0NDZ9|;d$8Z)+ZOtqhzBq8;CFd&r^UB$ z;Iz+!w|elX#Sg>taS#5S2Y<`rSr>AQ_BrqM;9EWT4vP=M^Jx$M zst141;zF(m{i(&@EAcsdEWRepeZ>}cfdA~l1@AKD68dQt?*PyD;EO%D%Ho6E$8x#F z>sXMz+Tt{Ly$5gf;9ER+)MEMM!0i^xCkpPgSiU=Ox5f8Hea=@rc!vi+W^utaKIcgf z{tpixw|D@aY40}W6+Fj-&$ak2=ofqNJ3Y9`;=OG?=L!$*^588NkGA`qn=B5+m^&=q z2L7xEf8B#0wpjMEKkmWLc<=#>=fgAZ!N*@|$|dx(Jor2h4twx2i)H^*iwC!RaN6P* z;kn-8(>i_52P~co{)ojT;JYj?1AoclcY(ic@s;3*EdCepFD$+r{2LGcg9kfTnR4xc z=QxXB2fxMQaqv4lIN-sx9=y`xleud*Zt<1iev3Q7Ll$>|Kj6Wi@Zc|5{2V-A_u%h) z@GmVc?)EwRE#7mj&zW+yDa&;me9kErFH88G^DO>i4}H&r-|4|k7Vqst7xm!v9=sVW zx|v+b_&!VjVn5&b@ZdW<_{$b!JUCzX;O~3zFD+gS&#yiB_a1!6;wE?sqo$04Pxs)3 z77suVcyN^mw^)2HJXg7N?uG2PSnh~?uLs}i!FO0JH%fligTL;<4_ho3PCo9z&v@_w zi{*OCLmqtMHKtrbpKoyjyvTzi9(=jQp-qf04{rD1G+5e8?)$pl((i)*W)J>|2Y=S$ z^9Ov+mn~if{;tLAz`H#77alxjvFw%H@4<&W_@p+IAGy2gbga`DyMJ=pKTH5RwN z*XOM8;Hx~i&*FR8s59Wf@Au%3SuB^>e9D8r;=wyDei5FZdhpX8{6~wgC>cO9~_&IpKU~$2XKIeXm z3&9V1@S`65ti?_6{NCbz@T(p?J!Z-%^tl#)5&U)!_Iq%R#bfX^T3r1;_R?D10q(GP z8#rz8E#R#de*}D+#kYe$VewtyPh0#w@I4kk4F0ag&w(Gacntic#f3vY=S7QWfe%<* z3@+#}WekCfEN%q9!{R3JVvE;;t1MmzZm_r?e1*knaJ$8~fm0UW4&Gw%H^EtpzYV_4 z;-|oOTf7&1kHyY5pYsEY3&4+Ad@A@^i|2x0v^WI*tHovDX>r?E!KYe$4S2o>FZSRv z53cjz%fZtazoG}OwODlft1a$8SM0P{^u3MXZusRl>cL;IJkq}RSUj6K=tmYe^)h!` zEOz}L!83^CPHcqNEnRf!DV-)iVzDGNchKX~|uXS6jM_yY=81(8V9sXX&D^Zn0SA@f*RC?k(_)TDsU@ zcUUZbj89uEdi9qr-izMyU5kJAR^}RuML&NGJcBsrk^iSHU3BR&i)An#=^(M=Z1IoA=3#g_a8cm{F*jE{+Y8Z7m88};@T%Om>OZi~gveaiCBC0ApX zEK56ka z$c-<9`M>_YZ|S1z{t7Jl{2uvy*2CjVm^@!cKbdWD2lz~jWo}wvvCNwRi)C)T)MD`| zEwy-@KD^3eu?Mek>9kju#S5;&k7}{lfLkmU|MsmG&jx?o;!DoQw+5Crm9yjbSi0Di z-?CWry@xCoU&@V z#p1K7axwJFEEaoYjm0uYM=cgv(P{BGTVZ=F79D=0#bP7eY;hMpy$@O}e&CNWR3^L>kd2K{O9mGPc|D-+%ASH_a* z;*0v6n(`}KYnmFGu54Z2bY(0SD=zj&N};ch#RAb-Ur&E`BHnS46OBgK_hxd0Xw12| zKiPL}JeE#f?4;wVbUKl`DCTtcrpwd*%A~*I!hk5+am1&w23GNl@sHyWZoQWTUj)zz0wo4l7*Cd(==33TwKLJzCe1>n`zxf@oQ}Rs zdm;{r8uwR}2}z5Wqf@PO6W|qtxw5wSj#IhMkND6ifE~$+-BR|F#sVDFp=^oPbDTwX%cy@Jg_)WR<^jT zBAV%4A5X^^OqvxqNgQ%ddn(ygX0> zIb1oAigq$a1Lcc@CAJl`O45PS%7EYL?C(oyWtCM1B9$qBAPS*8XzM2#PsNiP;~jn| zrVTy0po%0DE>D1rl@$w#=4gv1x>K}4u(&c1a5iZf<A$>Cs&e7 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 aFmz{W($jP(lB|1=GPyu;8=U;hsgys%3E literal 0 HcmV?d00001