/* Jim - A small embeddable Tcl interpreter * * Copyright 2005 Salvatore Sanfilippo * Copyright 2005 Clemens Hintze * Copyright 2005 patthoyts - Pat Thoyts * Copyright 2008,2009 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com * Copyright 2008 Andrew Lunn * Copyright 2008 Duane Ellis * Copyright 2008 Uwe Klein * Copyright 2008 Steve Bennett * Copyright 2009 Nico Coesel * Copyright 2009 Zachary T Welch zw@superlucidity.net * Copyright 2009 David Brownell * * The FreeBSD license * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE JIM TCL PROJECT ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * JIM TCL PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation * are those of the authors and should not be interpreted as representing * official policies, either expressed or implied, of the Jim Tcl Project. **/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define __JIM_CORE__ #define JIM_OPTIMIZATION /* comment to avoid optimizations and reduce size */ #ifdef __ECOS #include #include #include typedef CYG_ADDRWORD intptr_t; #include #include #include #include #include #include #include #endif #ifndef JIM_ANSIC #define JIM_DYNLIB /* Dynamic library support for UNIX and WIN32 */ #endif /* JIM_ANSIC */ #include #include /* Include the platform dependent libraries for * dynamic loading of libraries. */ #ifdef JIM_DYNLIB #if defined(_WIN32) || defined(WIN32) #ifndef WIN32 #define WIN32 1 #endif #ifndef STRICT #define STRICT #endif #define WIN32_LEAN_AND_MEAN #include #if _MSC_VER >= 1000 #pragma warning(disable:4146) #endif /* _MSC_VER */ #else #include #endif /* WIN32 */ #endif /* JIM_DYNLIB */ #ifdef __ECOS #include #else #include "jim.h" #endif #ifdef HAVE_BACKTRACE #include #endif /* ----------------------------------------------------------------------------- * Global variables * ---------------------------------------------------------------------------*/ /* A shared empty string for the objects string representation. * Jim_InvalidateStringRep knows about it and don't try to free. */ static char *JimEmptyStringRep = (char*) ""; /* ----------------------------------------------------------------------------- * Required prototypes of not exported functions * ---------------------------------------------------------------------------*/ static void JimChangeCallFrameId(Jim_Interp *interp, Jim_CallFrame *cf); static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int flags); static void JimRegisterCoreApi(Jim_Interp *interp); static Jim_HashTableType *getJimVariablesHashTableType(void); /* ----------------------------------------------------------------------------- * Utility functions * ---------------------------------------------------------------------------*/ static char * jim_vasprintf(const char *fmt, va_list ap) { #ifndef HAVE_VASPRINTF /* yucky way */ static char buf[2048]; vsnprintf(buf, sizeof(buf), fmt, ap); /* garentee termination */ buf[sizeof(buf)-1] = 0; #else char *buf; int result; result = vasprintf(&buf, fmt, ap); if (result < 0) exit(-1); #endif return buf; } static void jim_vasprintf_done(void *buf) { #ifndef HAVE_VASPRINTF (void)(buf); #else free(buf); #endif } /* * Convert a string to a jim_wide INTEGER. * This function originates from BSD. * * Ignores `locale' stuff. Assumes that the upper and lower case * alphabets and digits are each contiguous. */ #ifdef HAVE_LONG_LONG_INT #define JimIsAscii(c) (((c) & ~0x7f) == 0) static jim_wide JimStrtoll(const char *nptr, char **endptr, register int base) { register const char *s; register unsigned jim_wide acc; register unsigned char c; register unsigned jim_wide qbase, cutoff; register int neg, any, cutlim; /* * Skip white space and pick up leading +/- sign if any. * If base is 0, allow 0x for hex and 0 for octal, else * assume decimal; if base is already 16, allow 0x. */ s = nptr; do { c = *s++; } while (isspace(c)); if (c == '-') { neg = 1; c = *s++; } else { neg = 0; if (c == '+') c = *s++; } if ((base == 0 || base == 16) && c == '0' && (*s == 'x' || *s == 'X')) { c = s[1]; s += 2; base = 16; } if (base == 0) base = c == '0' ? 8 : 10; /* * Compute the cutoff value between legal numbers and illegal * numbers. That is the largest legal value, divided by the * base. An input number that is greater than this value, if * followed by a legal input character, is too big. One that * is equal to this value may be valid or not; the limit * between valid and invalid numbers is then based on the last * digit. For instance, if the range for quads is * [-9223372036854775808..9223372036854775807] and the input base * is 10, cutoff will be set to 922337203685477580 and cutlim to * either 7 (neg == 0) or 8 (neg == 1), meaning that if we have * accumulated a value > 922337203685477580, or equal but the * next digit is > 7 (or 8), the number is too big, and we will * return a range error. * * Set any if any `digits' consumed; make it negative to indicate * overflow. */ qbase = (unsigned)base; cutoff = neg ? (unsigned jim_wide)-(LLONG_MIN + LLONG_MAX) + LLONG_MAX : LLONG_MAX; cutlim = (int)(cutoff % qbase); cutoff /= qbase; for (acc = 0, any = 0;; c = *s++) { if (!JimIsAscii(c)) break; if (isdigit(c)) c -= '0'; else if (isalpha(c)) c -= isupper(c) ? 'A' - 10 : 'a' - 10; else break; if (c >= base) break; if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) any = -1; else { any = 1; acc *= qbase; acc += c; } } if (any < 0) { acc = neg ? LLONG_MIN : LLONG_MAX; errno = ERANGE; } else if (neg) acc = -acc; if (endptr != 0) *endptr = (char *)(any ? s - 1 : nptr); return (acc); } #endif /* Glob-style pattern matching. */ static int JimStringMatch(const char *pattern, int patternLen, const char *string, int stringLen, int nocase) { while (patternLen) { switch (pattern[0]) { case '*': while (pattern[1] == '*') { pattern++; patternLen--; } if (patternLen == 1) return 1; /* match */ while (stringLen) { if (JimStringMatch(pattern + 1, patternLen-1, string, stringLen, nocase)) return 1; /* match */ string++; stringLen--; } return 0; /* no match */ break; case '?': if (stringLen == 0) return 0; /* no match */ string++; stringLen--; break; case '[': { int not, match; pattern++; patternLen--; not = pattern[0] == '^'; if (not) { pattern++; patternLen--; } match = 0; while (1) { if (pattern[0] == '\\') { pattern++; patternLen--; if (pattern[0] == string[0]) match = 1; } else if (pattern[0] == ']') { break; } else if (patternLen == 0) { pattern--; patternLen++; break; } else if (pattern[1] == '-' && patternLen >= 3) { int start = pattern[0]; int end = pattern[2]; int c = string[0]; if (start > end) { int t = start; start = end; end = t; } if (nocase) { start = tolower(start); end = tolower(end); c = tolower(c); } pattern += 2; patternLen -= 2; if (c >= start && c <= end) match = 1; } else { if (!nocase) { if (pattern[0] == string[0]) match = 1; } else { if (tolower((int)pattern[0]) == tolower((int)string[0])) match = 1; } } pattern++; patternLen--; } if (not) match = !match; if (!match) return 0; /* no match */ string++; stringLen--; break; } case '\\': if (patternLen >= 2) { pattern++; patternLen--; } /* fall through */ default: if (!nocase) { if (pattern[0] != string[0]) return 0; /* no match */ } else { if (tolower((int)pattern[0]) != tolower((int)string[0])) return 0; /* no match */ } string++; stringLen--; break; } pattern++; patternLen--; if (stringLen == 0) { while (*pattern == '*') { pattern++; patternLen--; } break; } } if (patternLen == 0 && stringLen == 0) return 1; return 0; } int JimStringCompare(const char *s1, int l1, const char *s2, int l2, int nocase) { unsigned char *u1 = (unsigned char*) s1, *u2 = (unsigned char*) s2; if (nocase == 0) { while (l1 && l2) { if (*u1 != *u2) return (int)*u1-*u2; u1++; u2++; l1--; l2--; } if (!l1 && !l2) return 0; return l1-l2; } else { while (l1 && l2) { if (tolower((int)*u1) != tolower((int)*u2)) return tolower((int)*u1)-tolower((int)*u2); u1++; u2++; l1--; l2--; } if (!l1 && !l2) return 0; return l1-l2; } } /* Search 's1' inside 's2', starting to search from char 'index' of 's2'. * The index of the first occurrence of s1 in s2 is returned. * If s1 is not found inside s2, -1 is returned. */ int JimStringFirst(const char *s1, int l1, const char *s2, int l2, int index) { int i; if (!l1 || !l2 || l1 > l2) return -1; if (index < 0) index = 0; s2 += index; for (i = index; i <= l2-l1; i++) { if (memcmp(s2, s1, l1) == 0) return i; s2++; } return -1; } int Jim_WideToString(char *buf, jim_wide wideValue) { const char *fmt = "%" JIM_WIDE_MODIFIER; return sprintf(buf, fmt, wideValue); } int Jim_StringToWide(const char *str, jim_wide *widePtr, int base) { char *endptr; #ifdef HAVE_LONG_LONG_INT *widePtr = JimStrtoll(str, &endptr, base); #else *widePtr = strtol(str, &endptr, base); #endif if ((str[0] == '\0') || (str == endptr)) return JIM_ERR; if (endptr[0] != '\0') { while (*endptr) { if (!isspace((int)*endptr)) return JIM_ERR; endptr++; } } return JIM_OK; } int Jim_StringToIndex(const char *str, int *intPtr) { char *endptr; *intPtr = strtol(str, &endptr, 10); if ((str[0] == '\0') || (str == endptr)) return JIM_ERR; if (endptr[0] != '\0') { while (*endptr) { if (!isspace((int)*endptr)) return JIM_ERR; endptr++; } } return JIM_OK; } /* The string representation of references has two features in order * to make the GC faster. The first is that every reference starts * with a non common character '~', in order to make the string matching * fater. The second is that the reference string rep his 32 characters * in length, this allows to avoid to check every object with a string * repr < 32, and usually there are many of this objects. */ #define JIM_REFERENCE_SPACE (35 + JIM_REFERENCE_TAGLEN) static int JimFormatReference(char *buf, Jim_Reference *refPtr, jim_wide id) { const char *fmt = ".%020" JIM_WIDE_MODIFIER ">"; sprintf(buf, fmt, refPtr->tag, id); return JIM_REFERENCE_SPACE; } int Jim_DoubleToString(char *buf, double doubleValue) { char *s; int len; len = sprintf(buf, "%.17g", doubleValue); s = buf; while (*s) { if (*s == '.') return len; s++; } /* Add a final ".0" if it's a number. But not * for NaN or InF */ if (isdigit((int)buf[0]) || ((buf[0] == '-' || buf[0] == '+') && isdigit((int)buf[1]))) { s[0] = '.'; s[1] = '0'; s[2] = '\0'; return len + 2; } return len; } int Jim_StringToDouble(const char *str, double *doublePtr) { char *endptr; *doublePtr = strtod(str, &endptr); if (str[0] == '\0' || endptr[0] != '\0' || (str == endptr)) return JIM_ERR; return JIM_OK; } static jim_wide JimPowWide(jim_wide b, jim_wide e) { jim_wide i, res = 1; if ((b == 0 && e != 0) || (e < 0)) return 0; for (i = 0; i < e; i++) {res *= b;} return res; } /* ----------------------------------------------------------------------------- * Special functions * ---------------------------------------------------------------------------*/ /* Note that 'interp' may be NULL if not available in the * context of the panic. It's only useful to get the error * file descriptor, it will default to stderr otherwise. */ void Jim_Panic(Jim_Interp *interp, const char *fmt, ...) { va_list ap; va_start(ap, fmt); /* * Send it here first.. Assuming STDIO still works */ fprintf(stderr, JIM_NL "JIM INTERPRETER PANIC: "); vfprintf(stderr, fmt, ap); fprintf(stderr, JIM_NL JIM_NL); va_end(ap); #ifdef HAVE_BACKTRACE { void *array[40]; int size, i; char **strings; size = backtrace(array, 40); strings = backtrace_symbols(array, size); for (i = 0; i < size; i++) fprintf(fp,"[backtrace] %s" JIM_NL, strings[i]); fprintf(fp,"[backtrace] Include the above lines and the output" JIM_NL); fprintf(fp,"[backtrace] of 'nm ' in the bug report." JIM_NL); } #endif /* This may actually crash... we do it last */ if (interp && interp->cookie_stderr) { Jim_fprintf(interp, interp->cookie_stderr, JIM_NL "JIM INTERPRETER PANIC: "); Jim_vfprintf(interp, interp->cookie_stderr, fmt, ap); Jim_fprintf(interp, interp->cookie_stderr, JIM_NL JIM_NL); } abort(); } /* ----------------------------------------------------------------------------- * Memory allocation * ---------------------------------------------------------------------------*/ /* Macro used for memory debugging. * In order for they to work you have to rename Jim_Alloc into _Jim_Alloc * and similary for Jim_Realloc and Jim_Free */ #if 0 #define Jim_Alloc(s) (printf("%s %d: Jim_Alloc(%d)\n",__FILE__,__LINE__,s),_Jim_Alloc(s)) #define Jim_Free(p) (printf("%s %d: Jim_Free(%p)\n",__FILE__,__LINE__,p),_Jim_Free(p)) #define Jim_Realloc(p,s) (printf("%s %d: Jim_Realloc(%p,%d)\n",__FILE__,__LINE__,p,s),_Jim_Realloc(p,s)) #endif void *Jim_Alloc(int size) { /* We allocate zero length arrayes, etc. to use a single orthogonal codepath */ if (size == 0) size = 1; void *p = malloc(size); if (p == NULL) Jim_Panic(NULL,"malloc: Out of memory"); return p; } void Jim_Free(void *ptr) { free(ptr); } void *Jim_Realloc(void *ptr, int size) { /* We allocate zero length arrayes, etc. to use a single orthogonal codepath */ if (size == 0) size = 1; void *p = realloc(ptr, size); if (p == NULL) Jim_Panic(NULL,"realloc: Out of memory"); return p; } char *Jim_StrDup(const char *s) { int l = strlen(s); char *copy = Jim_Alloc(l + 1); memcpy(copy, s, l + 1); return copy; } char *Jim_StrDupLen(const char *s, int l) { char *copy = Jim_Alloc(l + 1); memcpy(copy, s, l + 1); copy[l] = 0; /* Just to be sure, original could be substring */ return copy; } /* ----------------------------------------------------------------------------- * Time related functions * ---------------------------------------------------------------------------*/ /* Returns microseconds of CPU used since start. */ static jim_wide JimClock(void) { #if (defined WIN32) && !(defined JIM_ANSIC) LARGE_INTEGER t, f; QueryPerformanceFrequency(&f); QueryPerformanceCounter(&t); return (long)((t.QuadPart * 1000000) / f.QuadPart); #else /* !WIN32 */ clock_t clocks = clock(); return (long)(clocks*(1000000/CLOCKS_PER_SEC)); #endif /* WIN32 */ } /* ----------------------------------------------------------------------------- * Hash Tables * ---------------------------------------------------------------------------*/ /* -------------------------- private prototypes ---------------------------- */ static int JimExpandHashTableIfNeeded(Jim_HashTable *ht); static unsigned int JimHashTableNextPower(unsigned int size); static int JimInsertHashEntry(Jim_HashTable *ht, const void *key); /* -------------------------- hash functions -------------------------------- */ /* Thomas Wang's 32 bit Mix Function */ unsigned int Jim_IntHashFunction(unsigned int key) { key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); return key; } /* Identity hash function for integer keys */ unsigned int Jim_IdentityHashFunction(unsigned int key) { return key; } /* Generic hash function (we are using to multiply by 9 and add the byte * as Tcl) */ unsigned int Jim_GenHashFunction(const unsigned char *buf, int len) { unsigned int h = 0; while (len--) h += (h << 3)+*buf++; return h; } /* ----------------------------- API implementation ------------------------- */ /* reset an hashtable already initialized with ht_init(). * NOTE: This function should only called by ht_destroy(). */ static void JimResetHashTable(Jim_HashTable *ht) { ht->table = NULL; ht->size = 0; ht->sizemask = 0; ht->used = 0; ht->collisions = 0; } /* Initialize the hash table */ int Jim_InitHashTable(Jim_HashTable *ht, Jim_HashTableType *type, void *privDataPtr) { JimResetHashTable(ht); ht->type = type; ht->privdata = privDataPtr; return JIM_OK; } /* Resize the table to the minimal size that contains all the elements, * but with the invariant of a USER/BUCKETS ration near to <= 1 */ int Jim_ResizeHashTable(Jim_HashTable *ht) { int minimal = ht->used; if (minimal < JIM_HT_INITIAL_SIZE) minimal = JIM_HT_INITIAL_SIZE; return Jim_ExpandHashTable(ht, minimal); } /* Expand or create the hashtable */ int Jim_ExpandHashTable(Jim_HashTable *ht, unsigned int size) { Jim_HashTable n; /* the new hashtable */ unsigned int realsize = JimHashTableNextPower(size), i; /* the size is invalid if it is smaller than the number of * elements already inside the hashtable */ if (ht->used >= size) return JIM_ERR; Jim_InitHashTable(&n, ht->type, ht->privdata); n.size = realsize; n.sizemask = realsize-1; n.table = Jim_Alloc(realsize*sizeof(Jim_HashEntry*)); /* Initialize all the pointers to NULL */ memset(n.table, 0, realsize*sizeof(Jim_HashEntry*)); /* Copy all the elements from the old to the new table: * note that if the old hash table is empty ht->size is zero, * so Jim_ExpandHashTable just creates an hash table. */ n.used = ht->used; for (i = 0; i < ht->size && ht->used > 0; i++) { Jim_HashEntry *he, *nextHe; if (ht->table[i] == NULL) continue; /* For each hash entry on this slot... */ he = ht->table[i]; while (he) { unsigned int h; nextHe = he->next; /* Get the new element index */ h = Jim_HashKey(ht, he->key) & n.sizemask; he->next = n.table[h]; n.table[h] = he; ht->used--; /* Pass to the next element */ he = nextHe; } } assert(ht->used == 0); Jim_Free(ht->table); /* Remap the new hashtable in the old */ *ht = n; return JIM_OK; } /* Add an element to the target hash table */ int Jim_AddHashEntry(Jim_HashTable *ht, const void *key, void *val) { int index; Jim_HashEntry *entry; /* Get the index of the new element, or -1 if * the element already exists. */ if ((index = JimInsertHashEntry(ht, key)) == -1) return JIM_ERR; /* Allocates the memory and stores key */ entry = Jim_Alloc(sizeof(*entry)); entry->next = ht->table[index]; ht->table[index] = entry; /* Set the hash entry fields. */ Jim_SetHashKey(ht, entry, key); Jim_SetHashVal(ht, entry, val); ht->used++; return JIM_OK; } /* Add an element, discarding the old if the key already exists */ int Jim_ReplaceHashEntry(Jim_HashTable *ht, const void *key, void *val) { Jim_HashEntry *entry; /* Try to add the element. If the key * does not exists Jim_AddHashEntry will suceed. */ if (Jim_AddHashEntry(ht, key, val) == JIM_OK) return JIM_OK; /* It already exists, get the entry */ entry = Jim_FindHashEntry(ht, key); /* Free the old value and set the new one */ Jim_FreeEntryVal(ht, entry); Jim_SetHashVal(ht, entry, val); return JIM_OK; } /* Search and remove an element */ int Jim_DeleteHashEntry(Jim_HashTable *ht, const void *key) { unsigned int h; Jim_HashEntry *he, *prevHe; if (ht->size == 0) return JIM_ERR; h = Jim_HashKey(ht, key) & ht->sizemask; he = ht->table[h]; prevHe = NULL; while (he) { if (Jim_CompareHashKeys(ht, key, he->key)) { /* Unlink the element from the list */ if (prevHe) prevHe->next = he->next; else ht->table[h] = he->next; Jim_FreeEntryKey(ht, he); Jim_FreeEntryVal(ht, he); Jim_Free(he); ht->used--; return JIM_OK; } prevHe = he; he = he->next; } return JIM_ERR; /* not found */ } /* Destroy an entire hash table */ int Jim_FreeHashTable(Jim_HashTable *ht) { unsigned int i; /* Free all the elements */ for (i = 0; i < ht->size && ht->used > 0; i++) { Jim_HashEntry *he, *nextHe; if ((he = ht->table[i]) == NULL) continue; while (he) { nextHe = he->next; Jim_FreeEntryKey(ht, he); Jim_FreeEntryVal(ht, he); Jim_Free(he); ht->used--; he = nextHe; } } /* Free the table and the allocated cache structure */ Jim_Free(ht->table); /* Re-initialize the table */ JimResetHashTable(ht); return JIM_OK; /* never fails */ } Jim_HashEntry *Jim_FindHashEntry(Jim_HashTable *ht, const void *key) { Jim_HashEntry *he; unsigned int h; if (ht->size == 0) return NULL; h = Jim_HashKey(ht, key) & ht->sizemask; he = ht->table[h]; while (he) { if (Jim_CompareHashKeys(ht, key, he->key)) return he; he = he->next; } return NULL; } Jim_HashTableIterator *Jim_GetHashTableIterator(Jim_HashTable *ht) { Jim_HashTableIterator *iter = Jim_Alloc(sizeof(*iter)); iter->ht = ht; iter->index = -1; iter->entry = NULL; iter->nextEntry = NULL; return iter; } Jim_HashEntry *Jim_NextHashEntry(Jim_HashTableIterator *iter) { while (1) { if (iter->entry == NULL) { iter->index++; if (iter->index >= (signed)iter->ht->size) break; iter->entry = iter->ht->table[iter->index]; } else { iter->entry = iter->nextEntry; } if (iter->entry) { /* We need to save the 'next' here, the iterator user * may delete the entry we are returning. */ iter->nextEntry = iter->entry->next; return iter->entry; } } return NULL; } /* ------------------------- private functions ------------------------------ */ /* Expand the hash table if needed */ static int JimExpandHashTableIfNeeded(Jim_HashTable *ht) { /* If the hash table is empty expand it to the intial size, * if the table is "full" dobule its size. */ if (ht->size == 0) return Jim_ExpandHashTable(ht, JIM_HT_INITIAL_SIZE); if (ht->size == ht->used) return Jim_ExpandHashTable(ht, ht->size*2); return JIM_OK; } /* Our hash table capability is a power of two */ static unsigned int JimHashTableNextPower(unsigned int size) { unsigned int i = JIM_HT_INITIAL_SIZE; if (size >= 2147483648U) return 2147483648U; while (1) { if (i >= size) return i; i *= 2; } } /* Returns the index of a free slot that can be populated with * an hash entry for the given 'key'. * If the key already exists, -1 is returned. */ static int JimInsertHashEntry(Jim_HashTable *ht, const void *key) { unsigned int h; Jim_HashEntry *he; /* Expand the hashtable if needed */ if (JimExpandHashTableIfNeeded(ht) == JIM_ERR) return -1; /* Compute the key hash value */ h = Jim_HashKey(ht, key) & ht->sizemask; /* Search if this slot does not already contain the given key */ he = ht->table[h]; while (he) { if (Jim_CompareHashKeys(ht, key, he->key)) return -1; he = he->next; } return h; } /* ----------------------- StringCopy Hash Table Type ------------------------*/ static unsigned int JimStringCopyHTHashFunction(const void *key) { return Jim_GenHashFunction(key, strlen(key)); } static const void *JimStringCopyHTKeyDup(void *privdata, const void *key) { int len = strlen(key); char *copy = Jim_Alloc(len + 1); JIM_NOTUSED(privdata); memcpy(copy, key, len); copy[len] = '\0'; return copy; } static void *JimStringKeyValCopyHTValDup(void *privdata, const void *val) { int len = strlen(val); char *copy = Jim_Alloc(len + 1); JIM_NOTUSED(privdata); memcpy(copy, val, len); copy[len] = '\0'; return copy; } static int JimStringCopyHTKeyCompare(void *privdata, const void *key1, const void *key2) { JIM_NOTUSED(privdata); return strcmp(key1, key2) == 0; } static void JimStringCopyHTKeyDestructor(void *privdata, const void *key) { JIM_NOTUSED(privdata); Jim_Free((void*)key); /* ATTENTION: const cast */ } static void JimStringKeyValCopyHTValDestructor(void *privdata, void *val) { JIM_NOTUSED(privdata); Jim_Free((void*)val); /* ATTENTION: const cast */ } static Jim_HashTableType JimStringCopyHashTableType = { JimStringCopyHTHashFunction, /* hash function */ JimStringCopyHTKeyDup, /* key dup */ NULL, /* val dup */ JimStringCopyHTKeyCompare, /* key compare */ JimStringCopyHTKeyDestructor, /* key destructor */ NULL /* val destructor */ }; /* This is like StringCopy but does not auto-duplicate the key. * It's used for intepreter's shared strings. */ static Jim_HashTableType JimSharedStringsHashTableType = { JimStringCopyHTHashFunction, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ JimStringCopyHTKeyCompare, /* key compare */ JimStringCopyHTKeyDestructor, /* key destructor */ NULL /* val destructor */ }; /* This is like StringCopy but also automatically handle dynamic * allocated C strings as values. */ static Jim_HashTableType JimStringKeyValCopyHashTableType = { JimStringCopyHTHashFunction, /* hash function */ JimStringCopyHTKeyDup, /* key dup */ JimStringKeyValCopyHTValDup, /* val dup */ JimStringCopyHTKeyCompare, /* key compare */ JimStringCopyHTKeyDestructor, /* key destructor */ JimStringKeyValCopyHTValDestructor, /* val destructor */ }; typedef struct AssocDataValue { Jim_InterpDeleteProc *delProc; void *data; } AssocDataValue; static void JimAssocDataHashTableValueDestructor(void *privdata, void *data) { AssocDataValue *assocPtr = (AssocDataValue *)data; if (assocPtr->delProc != NULL) assocPtr->delProc((Jim_Interp *)privdata, assocPtr->data); Jim_Free(data); } static Jim_HashTableType JimAssocDataHashTableType = { JimStringCopyHTHashFunction, /* hash function */ JimStringCopyHTKeyDup, /* key dup */ NULL, /* val dup */ JimStringCopyHTKeyCompare, /* key compare */ JimStringCopyHTKeyDestructor, /* key destructor */ JimAssocDataHashTableValueDestructor /* val destructor */ }; /* ----------------------------------------------------------------------------- * Stack - This is a simple generic stack implementation. It is used for * example in the 'expr' expression compiler. * ---------------------------------------------------------------------------*/ void Jim_InitStack(Jim_Stack *stack) { stack->len = 0; stack->maxlen = 0; stack->vector = NULL; } void Jim_FreeStack(Jim_Stack *stack) { Jim_Free(stack->vector); } int Jim_StackLen(Jim_Stack *stack) { return stack->len; } void Jim_StackPush(Jim_Stack *stack, void *element) { int neededLen = stack->len + 1; if (neededLen > stack->maxlen) { stack->maxlen = neededLen*2; stack->vector = Jim_Realloc(stack->vector, sizeof(void*)*stack->maxlen); } stack->vector[stack->len] = element; stack->len++; } void *Jim_StackPop(Jim_Stack *stack) { if (stack->len == 0) return NULL; stack->len--; return stack->vector[stack->len]; } void *Jim_StackPeek(Jim_Stack *stack) { if (stack->len == 0) return NULL; return stack->vector[stack->len-1]; } void Jim_FreeStackElements(Jim_Stack *stack, void (*freeFunc)(void *ptr)) { int i; for (i = 0; i < stack->len; i++) freeFunc(stack->vector[i]); } /* ----------------------------------------------------------------------------- * Parser * ---------------------------------------------------------------------------*/ /* Token types */ #define JIM_TT_NONE -1 /* No token returned */ #define JIM_TT_STR 0 /* simple string */ #define JIM_TT_ESC 1 /* string that needs escape chars conversion */ #define JIM_TT_VAR 2 /* var substitution */ #define JIM_TT_DICTSUGAR 3 /* Syntax sugar for [dict get], $foo(bar) */ #define JIM_TT_CMD 4 /* command substitution */ #define JIM_TT_SEP 5 /* word separator */ #define JIM_TT_EOL 6 /* line separator */ /* Additional token types needed for expressions */ #define JIM_TT_SUBEXPR_START 7 #define JIM_TT_SUBEXPR_END 8 #define JIM_TT_EXPR_NUMBER 9 #define JIM_TT_EXPR_OPERATOR 10 /* Parser states */ #define JIM_PS_DEF 0 /* Default state */ #define JIM_PS_QUOTE 1 /* Inside "" */ /* Parser context structure. The same context is used both to parse * Tcl scripts and lists. */ struct JimParserCtx { const char *prg; /* Program text */ const char *p; /* Pointer to the point of the program we are parsing */ int len; /* Left length of 'prg' */ int linenr; /* Current line number */ const char *tstart; const char *tend; /* Returned token is at tstart-tend in 'prg'. */ int tline; /* Line number of the returned token */ int tt; /* Token type */ int eof; /* Non zero if EOF condition is true. */ int state; /* Parser state */ int comment; /* Non zero if the next chars may be a comment. */ }; #define JimParserEof(c) ((c)->eof) #define JimParserTstart(c) ((c)->tstart) #define JimParserTend(c) ((c)->tend) #define JimParserTtype(c) ((c)->tt) #define JimParserTline(c) ((c)->tline) static int JimParseScript(struct JimParserCtx *pc); static int JimParseSep(struct JimParserCtx *pc); static int JimParseEol(struct JimParserCtx *pc); static int JimParseCmd(struct JimParserCtx *pc); static int JimParseVar(struct JimParserCtx *pc); static int JimParseBrace(struct JimParserCtx *pc); static int JimParseStr(struct JimParserCtx *pc); static int JimParseComment(struct JimParserCtx *pc); static char *JimParserGetToken(struct JimParserCtx *pc, int *lenPtr, int *typePtr, int *linePtr); /* Initialize a parser context. * 'prg' is a pointer to the program text, linenr is the line * number of the first line contained in the program. */ void JimParserInit(struct JimParserCtx *pc, const char *prg, int len, int linenr) { pc->prg = prg; pc->p = prg; pc->len = len; pc->tstart = NULL; pc->tend = NULL; pc->tline = 0; pc->tt = JIM_TT_NONE; pc->eof = 0; pc->state = JIM_PS_DEF; pc->linenr = linenr; pc->comment = 1; } int JimParseScript(struct JimParserCtx *pc) { while (1) { /* the while is used to reiterate with continue if needed */ if (!pc->len) { pc->tstart = pc->p; pc->tend = pc->p-1; pc->tline = pc->linenr; pc->tt = JIM_TT_EOL; pc->eof = 1; return JIM_OK; } switch (*(pc->p)) { case '\\': if (*(pc->p + 1) == '\n') return JimParseSep(pc); else { pc->comment = 0; return JimParseStr(pc); } break; case ' ': case '\t': case '\r': if (pc->state == JIM_PS_DEF) return JimParseSep(pc); else { pc->comment = 0; return JimParseStr(pc); } break; case '\n': case ';': pc->comment = 1; if (pc->state == JIM_PS_DEF) return JimParseEol(pc); else return JimParseStr(pc); break; case '[': pc->comment = 0; return JimParseCmd(pc); break; case '$': pc->comment = 0; if (JimParseVar(pc) == JIM_ERR) { pc->tstart = pc->tend = pc->p++; pc->len--; pc->tline = pc->linenr; pc->tt = JIM_TT_STR; return JIM_OK; } else return JIM_OK; break; case '#': if (pc->comment) { JimParseComment(pc); continue; } else { return JimParseStr(pc); } default: pc->comment = 0; return JimParseStr(pc); break; } return JIM_OK; } } int JimParseSep(struct JimParserCtx *pc) { pc->tstart = pc->p; pc->tline = pc->linenr; while (*pc->p == ' ' || *pc->p == '\t' || *pc->p == '\r' || (*pc->p == '\\' && *(pc->p + 1) == '\n')) { if (*pc->p == '\\') { pc->p++; pc->len--; pc->linenr++; } pc->p++; pc->len--; } pc->tend = pc->p-1; pc->tt = JIM_TT_SEP; return JIM_OK; } int JimParseEol(struct JimParserCtx *pc) { pc->tstart = pc->p; pc->tline = pc->linenr; while (*pc->p == ' ' || *pc->p == '\n' || *pc->p == '\t' || *pc->p == '\r' || *pc->p == ';') { if (*pc->p == '\n') pc->linenr++; pc->p++; pc->len--; } pc->tend = pc->p-1; pc->tt = JIM_TT_EOL; return JIM_OK; } /* Todo. Don't stop if ']' appears inside {} or quoted. * Also should handle the case of puts [string length "]"] */ int JimParseCmd(struct JimParserCtx *pc) { int level = 1; int blevel = 0; pc->tstart = ++pc->p; pc->len--; pc->tline = pc->linenr; while (1) { if (pc->len == 0) { break; } else if (*pc->p == '[' && blevel == 0) { level++; } else if (*pc->p == ']' && blevel == 0) { level--; if (!level) break; } else if (*pc->p == '\\') { pc->p++; pc->len--; } else if (*pc->p == '{') { blevel++; } else if (*pc->p == '}') { if (blevel != 0) blevel--; } else if (*pc->p == '\n') pc->linenr++; pc->p++; pc->len--; } pc->tend = pc->p-1; pc->tt = JIM_TT_CMD; if (*pc->p == ']') { pc->p++; pc->len--; } return JIM_OK; } int JimParseVar(struct JimParserCtx *pc) { int brace = 0, stop = 0, ttype = JIM_TT_VAR; pc->tstart = ++pc->p; pc->len--; /* skip the $ */ pc->tline = pc->linenr; if (*pc->p == '{') { pc->tstart = ++pc->p; pc->len--; brace = 1; } if (brace) { while (!stop) { if (*pc->p == '}' || pc->len == 0) { pc->tend = pc->p-1; stop = 1; if (pc->len == 0) break; } else if (*pc->p == '\n') pc->linenr++; pc->p++; pc->len--; } } else { /* Include leading colons */ while (*pc->p == ':') { pc->p++; pc->len--; } while (!stop) { if (!((*pc->p >= 'a' && *pc->p <= 'z') || (*pc->p >= 'A' && *pc->p <= 'Z') || (*pc->p >= '0' && *pc->p <= '9') || *pc->p == '_')) stop = 1; else { pc->p++; pc->len--; } } /* Parse [dict get] syntax sugar. */ if (*pc->p == '(') { while (*pc->p != ')' && pc->len) { pc->p++; pc->len--; if (*pc->p == '\\' && pc->len >= 2) { pc->p += 2; pc->len -= 2; } } if (*pc->p != '\0') { pc->p++; pc->len--; } ttype = JIM_TT_DICTSUGAR; } pc->tend = pc->p-1; } /* Check if we parsed just the '$' character. * That's not a variable so an error is returned * to tell the state machine to consider this '$' just * a string. */ if (pc->tstart == pc->p) { pc->p--; pc->len++; return JIM_ERR; } pc->tt = ttype; return JIM_OK; } int JimParseBrace(struct JimParserCtx *pc) { int level = 1; pc->tstart = ++pc->p; pc->len--; pc->tline = pc->linenr; while (1) { if (*pc->p == '\\' && pc->len >= 2) { pc->p++; pc->len--; if (*pc->p == '\n') pc->linenr++; } else if (*pc->p == '{') { level++; } else if (pc->len == 0 || *pc->p == '}') { level--; if (pc->len == 0 || level == 0) { pc->tend = pc->p-1; if (pc->len != 0) { pc->p++; pc->len--; } pc->tt = JIM_TT_STR; return JIM_OK; } } else if (*pc->p == '\n') { pc->linenr++; } pc->p++; pc->len--; } return JIM_OK; /* unreached */ } int JimParseStr(struct JimParserCtx *pc) { int newword = (pc->tt == JIM_TT_SEP || pc->tt == JIM_TT_EOL || pc->tt == JIM_TT_NONE || pc->tt == JIM_TT_STR); if (newword && *pc->p == '{') { return JimParseBrace(pc); } else if (newword && *pc->p == '"') { pc->state = JIM_PS_QUOTE; pc->p++; pc->len--; } pc->tstart = pc->p; pc->tline = pc->linenr; while (1) { if (pc->len == 0) { pc->tend = pc->p-1; pc->tt = JIM_TT_ESC; return JIM_OK; } switch (*pc->p) { case '\\': if (pc->state == JIM_PS_DEF && *(pc->p + 1) == '\n') { pc->tend = pc->p-1; pc->tt = JIM_TT_ESC; return JIM_OK; } if (pc->len >= 2) { pc->p++; pc->len--; } break; case '$': case '[': pc->tend = pc->p-1; pc->tt = JIM_TT_ESC; return JIM_OK; case ' ': case '\t': case '\n': case '\r': case ';': if (pc->state == JIM_PS_DEF) { pc->tend = pc->p-1; pc->tt = JIM_TT_ESC; return JIM_OK; } else if (*pc->p == '\n') { pc->linenr++; } break; case '"': if (pc->state == JIM_PS_QUOTE) { pc->tend = pc->p-1; pc->tt = JIM_TT_ESC; pc->p++; pc->len--; pc->state = JIM_PS_DEF; return JIM_OK; } break; } pc->p++; pc->len--; } return JIM_OK; /* unreached */ } int JimParseComment(struct JimParserCtx *pc) { while (*pc->p) { if (*pc->p == '\n') { pc->linenr++; if (*(pc->p-1) != '\\') { pc->p++; pc->len--; return JIM_OK; } } pc->p++; pc->len--; } return JIM_OK; } /* xdigitval and odigitval are helper functions for JimParserGetToken() */ static int xdigitval(int c) { if (c >= '0' && c <= '9') return c-'0'; if (c >= 'a' && c <= 'f') return c-'a'+10; if (c >= 'A' && c <= 'F') return c-'A'+10; return -1; } static int odigitval(int c) { if (c >= '0' && c <= '7') return c-'0'; return -1; } /* Perform Tcl escape substitution of 's', storing the result * string into 'dest'. The escaped string is guaranteed to * be the same length or shorted than the source string. * Slen is the length of the string at 's', if it's -1 the string * length will be calculated by the function. * * The function returns the length of the resulting string. */ static int JimEscape(char *dest, const char *s, int slen) { char *p = dest; int i, len; if (slen == -1) slen = strlen(s); for (i = 0; i < slen; i++) { switch (s[i]) { case '\\': switch (s[i + 1]) { case 'a': *p++ = 0x7; i++; break; case 'b': *p++ = 0x8; i++; break; case 'f': *p++ = 0xc; i++; break; case 'n': *p++ = 0xa; i++; break; case 'r': *p++ = 0xd; i++; break; case 't': *p++ = 0x9; i++; break; case 'v': *p++ = 0xb; i++; break; case '\0': *p++ = '\\'; i++; break; case '\n': *p++ = ' '; i++; break; default: if (s[i + 1] == 'x') { int val = 0; int c = xdigitval(s[i + 2]); if (c == -1) { *p++ = 'x'; i++; break; } val = c; c = xdigitval(s[i + 3]); if (c == -1) { *p++ = val; i += 2; break; } val = (val*16) + c; *p++ = val; i += 3; break; } else if (s[i + 1] >= '0' && s[i + 1] <= '7') { int val = 0; int c = odigitval(s[i + 1]); val = c; c = odigitval(s[i + 2]); if (c == -1) { *p++ = val; i ++; break; } val = (val*8) + c; c = odigitval(s[i + 3]); if (c == -1) { *p++ = val; i += 2; break; } val = (val*8) + c; *p++ = val; i += 3; } else { *p++ = s[i + 1]; i++; } break; } break; default: *p++ = s[i]; break; } } len = p-dest; *p++ = '\0'; return len; } /* Returns a dynamically allocated copy of the current token in the * parser context. The function perform conversion of escapes if * the token is of type JIM_TT_ESC. * * Note that after the conversion, tokens that are grouped with * braces in the source code, are always recognizable from the * identical string obtained in a different way from the type. * * For exmple the string: * * {expand}$a * * will return as first token "expand", of type JIM_TT_STR * * While the string: * * expand$a * * will return as first token "expand", of type JIM_TT_ESC */ char *JimParserGetToken(struct JimParserCtx *pc, int *lenPtr, int *typePtr, int *linePtr) { const char *start, *end; char *token; int len; start = JimParserTstart(pc); end = JimParserTend(pc); if (start > end) { if (lenPtr) *lenPtr = 0; if (typePtr) *typePtr = JimParserTtype(pc); if (linePtr) *linePtr = JimParserTline(pc); token = Jim_Alloc(1); token[0] = '\0'; return token; } len = (end-start) + 1; token = Jim_Alloc(len + 1); if (JimParserTtype(pc) != JIM_TT_ESC) { /* No escape conversion needed? Just copy it. */ memcpy(token, start, len); token[len] = '\0'; } else { /* Else convert the escape chars. */ len = JimEscape(token, start, len); } if (lenPtr) *lenPtr = len; if (typePtr) *typePtr = JimParserTtype(pc); if (linePtr) *linePtr = JimParserTline(pc); return token; } /* The following functin is not really part of the parsing engine of Jim, * but it somewhat related. Given an string and its length, it tries * to guess if the script is complete or there are instead " " or { } * open and not completed. This is useful for interactive shells * implementation and for [info complete]. * * If 'stateCharPtr' != NULL, the function stores ' ' on complete script, * '{' on scripts incomplete missing one or more '}' to be balanced. * '"' on scripts incomplete missing a '"' char. * * If the script is complete, 1 is returned, otherwise 0. */ int Jim_ScriptIsComplete(const char *s, int len, char *stateCharPtr) { int level = 0; int state = ' '; while (len) { switch (*s) { case '\\': if (len > 1) s++; break; case '"': if (state == ' ') { state = '"'; } else if (state == '"') { state = ' '; } break; case '{': if (state == '{') { level++; } else if (state == ' ') { state = '{'; level++; } break; case '}': if (state == '{') { level--; if (level == 0) state = ' '; } break; } s++; len--; } if (stateCharPtr) *stateCharPtr = state; return state == ' '; } /* ----------------------------------------------------------------------------- * Tcl Lists parsing * ---------------------------------------------------------------------------*/ static int JimParseListSep(struct JimParserCtx *pc); static int JimParseListStr(struct JimParserCtx *pc); int JimParseList(struct JimParserCtx *pc) { if (pc->len == 0) { pc->tstart = pc->tend = pc->p; pc->tline = pc->linenr; pc->tt = JIM_TT_EOL; pc->eof = 1; return JIM_OK; } switch (*pc->p) { case ' ': case '\n': case '\t': case '\r': if (pc->state == JIM_PS_DEF) return JimParseListSep(pc); else return JimParseListStr(pc); break; default: return JimParseListStr(pc); break; } return JIM_OK; } int JimParseListSep(struct JimParserCtx *pc) { pc->tstart = pc->p; pc->tline = pc->linenr; while (*pc->p == ' ' || *pc->p == '\t' || *pc->p == '\r' || *pc->p == '\n') { pc->p++; pc->len--; } pc->tend = pc->p-1; pc->tt = JIM_TT_SEP; return JIM_OK; } int JimParseListStr(struct JimParserCtx *pc) { int newword = (pc->tt == JIM_TT_SEP || pc->tt == JIM_TT_EOL || pc->tt == JIM_TT_NONE); if (newword && *pc->p == '{') { return JimParseBrace(pc); } else if (newword && *pc->p == '"') { pc->state = JIM_PS_QUOTE; pc->p++; pc->len--; } pc->tstart = pc->p; pc->tline = pc->linenr; while (1) { if (pc->len == 0) { pc->tend = pc->p-1; pc->tt = JIM_TT_ESC; return JIM_OK; } switch (*pc->p) { case '\\': pc->p++; pc->len--; break; case ' ': case '\t': case '\n': case '\r': if (pc->state == JIM_PS_DEF) { pc->tend = pc->p-1; pc->tt = JIM_TT_ESC; return JIM_OK; } else if (*pc->p == '\n') { pc->linenr++; } break; case '"': if (pc->state == JIM_PS_QUOTE) { pc->tend = pc->p-1; pc->tt = JIM_TT_ESC; pc->p++; pc->len--; pc->state = JIM_PS_DEF; return JIM_OK; } break; } pc->p++; pc->len--; } return JIM_OK; /* unreached */ } /* ----------------------------------------------------------------------------- * Jim_Obj related functions * ---------------------------------------------------------------------------*/ /* Return a new initialized object. */ Jim_Obj *Jim_NewObj(Jim_Interp *interp) { Jim_Obj *objPtr; /* -- Check if there are objects in the free list -- */ if (interp->freeList != NULL) { /* -- Unlink the object from the free list -- */ objPtr = interp->freeList; interp->freeList = objPtr->nextObjPtr; } else { /* -- No ready to use objects: allocate a new one -- */ objPtr = Jim_Alloc(sizeof(*objPtr)); } /* Object is returned with refCount of 0. Every * kind of GC implemented should take care to don't try * to scan objects with refCount == 0. */ objPtr->refCount = 0; /* All the other fields are left not initialized to save time. * The caller will probably want set they to the right * value anyway. */ /* -- Put the object into the live list -- */ objPtr->prevObjPtr = NULL; objPtr->nextObjPtr = interp->liveList; if (interp->liveList) interp->liveList->prevObjPtr = objPtr; interp->liveList = objPtr; return objPtr; } /* Free an object. Actually objects are never freed, but * just moved to the free objects list, where they will be * reused by Jim_NewObj(). */ void Jim_FreeObj(Jim_Interp *interp, Jim_Obj *objPtr) { /* Check if the object was already freed, panic. */ if (objPtr->refCount != 0) { Jim_Panic(interp,"!!!Object %p freed with bad refcount %d", objPtr, objPtr->refCount); } /* Free the internal representation */ Jim_FreeIntRep(interp, objPtr); /* Free the string representation */ if (objPtr->bytes != NULL) { if (objPtr->bytes != JimEmptyStringRep) Jim_Free(objPtr->bytes); } /* Unlink the object from the live objects list */ if (objPtr->prevObjPtr) objPtr->prevObjPtr->nextObjPtr = objPtr->nextObjPtr; if (objPtr->nextObjPtr) objPtr->nextObjPtr->prevObjPtr = objPtr->prevObjPtr; if (interp->liveList == objPtr) interp->liveList = objPtr->nextObjPtr; /* Link the object into the free objects list */ objPtr->prevObjPtr = NULL; objPtr->nextObjPtr = interp->freeList; if (interp->freeList) interp->freeList->prevObjPtr = objPtr; interp->freeList = objPtr; objPtr->refCount = -1; } /* Invalidate the string representation of an object. */ void Jim_InvalidateStringRep(Jim_Obj *objPtr) { if (objPtr->bytes != NULL) { if (objPtr->bytes != JimEmptyStringRep) Jim_Free(objPtr->bytes); } objPtr->bytes = NULL; } #define Jim_SetStringRep(o, b, l) \ do { (o)->bytes = b; (o)->length = l; } while (0) /* Set the initial string representation for an object. * Does not try to free an old one. */ void Jim_InitStringRep(Jim_Obj *objPtr, const char *bytes, int length) { if (length == 0) { objPtr->bytes = JimEmptyStringRep; objPtr->length = 0; } else { objPtr->bytes = Jim_Alloc(length + 1); objPtr->length = length; memcpy(objPtr->bytes, bytes, length); objPtr->bytes[length] = '\0'; } } /* Duplicate an object. The returned object has refcount = 0. */ Jim_Obj *Jim_DuplicateObj(Jim_Interp *interp, Jim_Obj *objPtr) { Jim_Obj *dupPtr; dupPtr = Jim_NewObj(interp); if (objPtr->bytes == NULL) { /* Object does not have a valid string representation. */ dupPtr->bytes = NULL; } else { Jim_InitStringRep(dupPtr, objPtr->bytes, objPtr->length); } if (objPtr->typePtr != NULL) { if (objPtr->typePtr->dupIntRepProc == NULL) { dupPtr->internalRep = objPtr->internalRep; } else { objPtr->typePtr->dupIntRepProc(interp, objPtr, dupPtr); } dupPtr->typePtr = objPtr->typePtr; } else { dupPtr->typePtr = NULL; } return dupPtr; } /* Return the string representation for objPtr. If the object * string representation is invalid, calls the method to create * a new one starting from the internal representation of the object. */ const char *Jim_GetString(Jim_Obj *objPtr, int *lenPtr) { if (objPtr->bytes == NULL) { /* Invalid string repr. Generate it. */ if (objPtr->typePtr->updateStringProc == NULL) { Jim_Panic(NULL,"UpdataStringProc called against '%s' type.", objPtr->typePtr->name); } objPtr->typePtr->updateStringProc(objPtr); } if (lenPtr) *lenPtr = objPtr->length; return objPtr->bytes; } /* Just returns the length of the object's string rep */ int Jim_Length(Jim_Obj *objPtr) { int len; Jim_GetString(objPtr, &len); return len; } /* ----------------------------------------------------------------------------- * String Object * ---------------------------------------------------------------------------*/ static void DupStringInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static int SetStringFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr); static Jim_ObjType stringObjType = { "string", NULL, DupStringInternalRep, NULL, JIM_TYPE_REFERENCES, }; void DupStringInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { JIM_NOTUSED(interp); /* This is a bit subtle: the only caller of this function * should be Jim_DuplicateObj(), that will copy the * string representaion. After the copy, the duplicated * object will not have more room in teh buffer than * srcPtr->length bytes. So we just set it to length. */ dupPtr->internalRep.strValue.maxLength = srcPtr->length; } int SetStringFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { /* Get a fresh string representation. */ (void) Jim_GetString(objPtr, NULL); /* Free any other internal representation. */ Jim_FreeIntRep(interp, objPtr); /* Set it as string, i.e. just set the maxLength field. */ objPtr->typePtr = &stringObjType; objPtr->internalRep.strValue.maxLength = objPtr->length; return JIM_OK; } Jim_Obj *Jim_NewStringObj(Jim_Interp *interp, const char *s, int len) { Jim_Obj *objPtr = Jim_NewObj(interp); if (len == -1) len = strlen(s); /* Alloc/Set the string rep. */ if (len == 0) { objPtr->bytes = JimEmptyStringRep; objPtr->length = 0; } else { objPtr->bytes = Jim_Alloc(len + 1); objPtr->length = len; memcpy(objPtr->bytes, s, len); objPtr->bytes[len] = '\0'; } /* No typePtr field for the vanilla string object. */ objPtr->typePtr = NULL; return objPtr; } /* This version does not try to duplicate the 's' pointer, but * use it directly. */ Jim_Obj *Jim_NewStringObjNoAlloc(Jim_Interp *interp, char *s, int len) { Jim_Obj *objPtr = Jim_NewObj(interp); if (len == -1) len = strlen(s); Jim_SetStringRep(objPtr, s, len); objPtr->typePtr = NULL; return objPtr; } /* Low-level string append. Use it only against objects * of type "string". */ void StringAppendString(Jim_Obj *objPtr, const char *str, int len) { int needlen; if (len == -1) len = strlen(str); needlen = objPtr->length + len; if (objPtr->internalRep.strValue.maxLength < needlen || objPtr->internalRep.strValue.maxLength == 0) { if (objPtr->bytes == JimEmptyStringRep) { objPtr->bytes = Jim_Alloc((needlen*2) + 1); } else { objPtr->bytes = Jim_Realloc(objPtr->bytes, (needlen*2) + 1); } objPtr->internalRep.strValue.maxLength = needlen*2; } memcpy(objPtr->bytes + objPtr->length, str, len); objPtr->bytes[objPtr->length + len] = '\0'; objPtr->length += len; } /* Low-level wrapper to append an object. */ void StringAppendObj(Jim_Obj *objPtr, Jim_Obj *appendObjPtr) { int len; const char *str; str = Jim_GetString(appendObjPtr, &len); StringAppendString(objPtr, str, len); } /* Higher level API to append strings to objects. */ void Jim_AppendString(Jim_Interp *interp, Jim_Obj *objPtr, const char *str, int len) { if (Jim_IsShared(objPtr)) Jim_Panic(interp,"Jim_AppendString called with shared object"); if (objPtr->typePtr != &stringObjType) SetStringFromAny(interp, objPtr); StringAppendString(objPtr, str, len); } void Jim_AppendString_sprintf(Jim_Interp *interp, Jim_Obj *objPtr, const char *fmt, ...) { char *buf; va_list ap; va_start(ap, fmt); buf = jim_vasprintf(fmt, ap); va_end(ap); if (buf) { Jim_AppendString(interp, objPtr, buf, -1); jim_vasprintf_done(buf); } } void Jim_AppendObj(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *appendObjPtr) { int len; const char *str; str = Jim_GetString(appendObjPtr, &len); Jim_AppendString(interp, objPtr, str, len); } void Jim_AppendStrings(Jim_Interp *interp, Jim_Obj *objPtr, ...) { va_list ap; if (objPtr->typePtr != &stringObjType) SetStringFromAny(interp, objPtr); va_start(ap, objPtr); while (1) { char *s = va_arg(ap, char*); if (s == NULL) break; Jim_AppendString(interp, objPtr, s, -1); } va_end(ap); } int Jim_StringEqObj(Jim_Obj *aObjPtr, Jim_Obj *bObjPtr, int nocase) { const char *aStr, *bStr; int aLen, bLen, i; if (aObjPtr == bObjPtr) return 1; aStr = Jim_GetString(aObjPtr, &aLen); bStr = Jim_GetString(bObjPtr, &bLen); if (aLen != bLen) return 0; if (nocase == 0) return memcmp(aStr, bStr, aLen) == 0; for (i = 0; i < aLen; i++) { if (tolower((int)aStr[i]) != tolower((int)bStr[i])) return 0; } return 1; } int Jim_StringMatchObj(Jim_Obj *patternObjPtr, Jim_Obj *objPtr, int nocase) { const char *pattern, *string; int patternLen, stringLen; pattern = Jim_GetString(patternObjPtr, &patternLen); string = Jim_GetString(objPtr, &stringLen); return JimStringMatch(pattern, patternLen, string, stringLen, nocase); } int Jim_StringCompareObj(Jim_Obj *firstObjPtr, Jim_Obj *secondObjPtr, int nocase) { const char *s1, *s2; int l1, l2; s1 = Jim_GetString(firstObjPtr, &l1); s2 = Jim_GetString(secondObjPtr, &l2); return JimStringCompare(s1, l1, s2, l2, nocase); } /* Convert a range, as returned by Jim_GetRange(), into * an absolute index into an object of the specified length. * This function may return negative values, or values * bigger or equal to the length of the list if the index * is out of range. */ static int JimRelToAbsIndex(int len, int index) { if (index < 0) return len + index; return index; } /* Convert a pair of index as normalize by JimRelToAbsIndex(), * into a range stored in *firstPtr, *lastPtr, *rangeLenPtr, suitable * for implementation of commands like [string range] and [lrange]. * * The resulting range is guaranteed to address valid elements of * the structure. */ static void JimRelToAbsRange(int len, int first, int last, int *firstPtr, int *lastPtr, int *rangeLenPtr) { int rangeLen; if (first > last) { rangeLen = 0; } else { rangeLen = last-first + 1; if (rangeLen) { if (first < 0) { rangeLen += first; first = 0; } if (last >= len) { rangeLen -= (last-(len-1)); last = len-1; } } } if (rangeLen < 0) rangeLen = 0; *firstPtr = first; *lastPtr = last; *rangeLenPtr = rangeLen; } Jim_Obj *Jim_StringRangeObj(Jim_Interp *interp, Jim_Obj *strObjPtr, Jim_Obj *firstObjPtr, Jim_Obj *lastObjPtr) { int first, last; const char *str; int len, rangeLen; if (Jim_GetIndex(interp, firstObjPtr, &first) != JIM_OK || Jim_GetIndex(interp, lastObjPtr, &last) != JIM_OK) return NULL; str = Jim_GetString(strObjPtr, &len); first = JimRelToAbsIndex(len, first); last = JimRelToAbsIndex(len, last); JimRelToAbsRange(len, first, last, &first, &last, &rangeLen); return Jim_NewStringObj(interp, str + first, rangeLen); } static Jim_Obj *JimStringToLower(Jim_Interp *interp, Jim_Obj *strObjPtr) { char *buf; int i; if (strObjPtr->typePtr != &stringObjType) { SetStringFromAny(interp, strObjPtr); } buf = Jim_Alloc(strObjPtr->length + 1); memcpy(buf, strObjPtr->bytes, strObjPtr->length + 1); for (i = 0; i < strObjPtr->length; i++) buf[i] = tolower(buf[i]); return Jim_NewStringObjNoAlloc(interp, buf, strObjPtr->length); } static Jim_Obj *JimStringToUpper(Jim_Interp *interp, Jim_Obj *strObjPtr) { char *buf; int i; if (strObjPtr->typePtr != &stringObjType) { SetStringFromAny(interp, strObjPtr); } buf = Jim_Alloc(strObjPtr->length + 1); memcpy(buf, strObjPtr->bytes, strObjPtr->length + 1); for (i = 0; i < strObjPtr->length; i++) buf[i] = toupper(buf[i]); return Jim_NewStringObjNoAlloc(interp, buf, strObjPtr->length); } /* This is the core of the [format] command. * TODO: Lots of things work - via a hack * However, no format item can be >= JIM_MAX_FMT */ #define JIM_MAX_FMT 2048 static Jim_Obj *Jim_FormatString_Inner(Jim_Interp *interp, Jim_Obj *fmtObjPtr, int objc, Jim_Obj *const *objv, char *sprintf_buf) { const char *fmt, *_fmt; int fmtLen; Jim_Obj *resObjPtr; fmt = Jim_GetString(fmtObjPtr, &fmtLen); _fmt = fmt; resObjPtr = Jim_NewStringObj(interp, "", 0); while (fmtLen) { const char *p = fmt; char spec[2], c; jim_wide wideValue; double doubleValue; /* we cheat and use Sprintf()! */ char fmt_str[100]; char *cp; int width; int ljust; int zpad; int spad; int altfm; int forceplus; int prec; int inprec; int haveprec; int accum; while (*fmt != '%' && fmtLen) { fmt++; fmtLen--; } Jim_AppendString(interp, resObjPtr, p, fmt-p); if (fmtLen == 0) break; fmt++; fmtLen--; /* skip '%' */ zpad = 0; spad = 0; width = -1; ljust = 0; altfm = 0; forceplus = 0; inprec = 0; haveprec = 0; prec = -1; /* not found yet */ next_fmt: if (fmtLen <= 0) { break; } switch (*fmt) { /* terminals */ case 'b': /* binary - not all printfs() do this */ case 's': /* string */ case 'i': /* integer */ case 'd': /* decimal */ case 'x': /* hex */ case 'X': /* CAP hex */ case 'c': /* char */ case 'o': /* octal */ case 'u': /* unsigned */ case 'f': /* float */ break; /* non-terminals */ case '0': /* zero pad */ zpad = 1; fmt++; fmtLen--; goto next_fmt; break; case '+': forceplus = 1; fmt++; fmtLen--; goto next_fmt; break; case ' ': /* sign space */ spad = 1; fmt++; fmtLen--; goto next_fmt; break; case '-': ljust = 1; fmt++; fmtLen--; goto next_fmt; break; case '#': altfm = 1; fmt++; fmtLen--; goto next_fmt; case '.': inprec = 1; fmt++; fmtLen--; goto next_fmt; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': accum = 0; while (isdigit(*fmt) && (fmtLen > 0)) { accum = (accum * 10) + (*fmt - '0'); fmt++; fmtLen--; } if (inprec) { haveprec = 1; prec = accum; } else { width = accum; } goto next_fmt; case '*': /* suck up the next item as an integer */ fmt++; fmtLen--; objc--; if (objc <= 0) { goto not_enough_args; } if (Jim_GetWide(interp,objv[0],&wideValue)== JIM_ERR) { Jim_FreeNewObj(interp, resObjPtr); return NULL; } if (inprec) { haveprec = 1; prec = wideValue; if (prec < 0) { /* man 3 printf says */ /* if prec is negative, it is zero */ prec = 0; } } else { width = wideValue; if (width < 0) { ljust = 1; width = -width; } } objv++; goto next_fmt; break; } if (*fmt != '%') { if (objc == 0) { not_enough_args: Jim_FreeNewObj(interp, resObjPtr); Jim_SetResultString(interp, "not enough arguments for all format specifiers", -1); return NULL; } else { objc--; } } /* * Create the formatter * cause we cheat and use sprintf() */ cp = fmt_str; *cp++ = '%'; if (altfm) { *cp++ = '#'; } if (forceplus) { *cp++ = '+'; } else if (spad) { /* PLUS overrides */ *cp++ = ' '; } if (ljust) { *cp++ = '-'; } if (zpad) { *cp++ = '0'; } if (width > 0) { sprintf(cp, "%d", width); /* skip ahead */ cp = strchr(cp,0); } /* did we find a period? */ if (inprec) { /* then add it */ *cp++ = '.'; /* did something occur after the period? */ if (haveprec) { sprintf(cp, "%d", prec); } cp = strchr(cp,0); } *cp = 0; /* here we do the work */ /* actually - we make sprintf() do it for us */ switch (*fmt) { case 's': *cp++ = 's'; *cp = 0; /* BUG: we do not handled embeded NULLs */ snprintf(sprintf_buf, JIM_MAX_FMT, fmt_str, Jim_GetString(objv[0], NULL)); break; case 'c': *cp++ = 'c'; *cp = 0; if (Jim_GetWide(interp, objv[0], &wideValue) == JIM_ERR) { Jim_FreeNewObj(interp, resObjPtr); return NULL; } c = (char) wideValue; snprintf(sprintf_buf, JIM_MAX_FMT, fmt_str, c); break; case 'f': case 'F': case 'g': case 'G': case 'e': case 'E': *cp++ = *fmt; *cp = 0; if (Jim_GetDouble(interp, objv[0], &doubleValue) == JIM_ERR) { Jim_FreeNewObj(interp, resObjPtr); return NULL; } snprintf(sprintf_buf, JIM_MAX_FMT, fmt_str, doubleValue); break; case 'b': case 'd': case 'o': case 'i': case 'u': case 'x': case 'X': /* jim widevaluse are 64bit */ if (sizeof(jim_wide) == sizeof(long long)) { *cp++ = 'l'; *cp++ = 'l'; } else { *cp++ = 'l'; } *cp++ = *fmt; *cp = 0; if (Jim_GetWide(interp, objv[0], &wideValue) == JIM_ERR) { Jim_FreeNewObj(interp, resObjPtr); return NULL; } snprintf(sprintf_buf, JIM_MAX_FMT, fmt_str, wideValue); break; case '%': sprintf_buf[0] = '%'; sprintf_buf[1] = 0; objv--; /* undo the objv++ below */ break; default: spec[0] = *fmt; spec[1] = '\0'; Jim_FreeNewObj(interp, resObjPtr); Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "bad field specifier \"", spec, "\"", NULL); return NULL; } /* force terminate */ #if 0 printf("FMT was: %s\n", fmt_str); printf("RES was: |%s|\n", sprintf_buf); #endif sprintf_buf[ JIM_MAX_FMT - 1] = 0; Jim_AppendString(interp, resObjPtr, sprintf_buf, strlen(sprintf_buf)); /* next obj */ objv++; fmt++; fmtLen--; } return resObjPtr; } Jim_Obj *Jim_FormatString(Jim_Interp *interp, Jim_Obj *fmtObjPtr, int objc, Jim_Obj *const *objv) { char *sprintf_buf = malloc(JIM_MAX_FMT); Jim_Obj *t = Jim_FormatString_Inner(interp, fmtObjPtr, objc, objv, sprintf_buf); free(sprintf_buf); return t; } /* ----------------------------------------------------------------------------- * Compared String Object * ---------------------------------------------------------------------------*/ /* This is strange object that allows to compare a C literal string * with a Jim object in very short time if the same comparison is done * multiple times. For example every time the [if] command is executed, * Jim has to check if a given argument is "else". This comparions if * the code has no errors are true most of the times, so we can cache * inside the object the pointer of the string of the last matching * comparison. Because most C compilers perform literal sharing, * so that: char *x = "foo", char *y = "foo", will lead to x == y, * this works pretty well even if comparisons are at different places * inside the C code. */ static Jim_ObjType comparedStringObjType = { "compared-string", NULL, NULL, NULL, JIM_TYPE_REFERENCES, }; /* The only way this object is exposed to the API is via the following * function. Returns true if the string and the object string repr. * are the same, otherwise zero is returned. * * Note: this isn't binary safe, but it hardly needs to be.*/ int Jim_CompareStringImmediate(Jim_Interp *interp, Jim_Obj *objPtr, const char *str) { if (objPtr->typePtr == &comparedStringObjType && objPtr->internalRep.ptr == str) return 1; else { const char *objStr = Jim_GetString(objPtr, NULL); if (strcmp(str, objStr) != 0) return 0; if (objPtr->typePtr != &comparedStringObjType) { Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &comparedStringObjType; } objPtr->internalRep.ptr = (char*)str; /*ATTENTION: const cast */ return 1; } } int qsortCompareStringPointers(const void *a, const void *b) { char * const *sa = (char * const *)a; char * const *sb = (char * const *)b; return strcmp(*sa, *sb); } int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr, const char * const *tablePtr, int *indexPtr, const char *name, int flags) { const char * const *entryPtr = NULL; char **tablePtrSorted; int i, count = 0; *indexPtr = -1; for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; entryPtr++, i++) { if (Jim_CompareStringImmediate(interp, objPtr, *entryPtr)) { *indexPtr = i; return JIM_OK; } count++; /* If nothing matches, this will reach the len of tablePtr */ } if (flags & JIM_ERRMSG) { if (name == NULL) name = "option"; Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "bad ", name, " \"", Jim_GetString(objPtr, NULL), "\": must be one of ", NULL); tablePtrSorted = Jim_Alloc(sizeof(char*)*count); memcpy(tablePtrSorted, tablePtr, sizeof(char*)*count); qsort(tablePtrSorted, count, sizeof(char*), qsortCompareStringPointers); for (i = 0; i < count; i++) { if (i + 1 == count && count > 1) Jim_AppendString(interp, Jim_GetResult(interp), "or ", -1); Jim_AppendString(interp, Jim_GetResult(interp), tablePtrSorted[i], -1); if (i + 1 != count) Jim_AppendString(interp, Jim_GetResult(interp), ", ", -1); } Jim_Free(tablePtrSorted); } return JIM_ERR; } int Jim_GetNvp(Jim_Interp *interp, Jim_Obj *objPtr, const Jim_Nvp *nvp_table, const Jim_Nvp ** result) { Jim_Nvp *n; int e; e = Jim_Nvp_name2value_obj(interp, nvp_table, objPtr, &n); if (e == JIM_ERR) { return e; } /* Success? found? */ if (n->name) { /* remove const */ *result = (Jim_Nvp *)n; return JIM_OK; } else { return JIM_ERR; } } /* ----------------------------------------------------------------------------- * Source Object * * This object is just a string from the language point of view, but * in the internal representation it contains the filename and line number * where this given token was read. This information is used by * Jim_EvalObj() if the object passed happens to be of type "source". * * This allows to propagate the information about line numbers and file * names and give error messages with absolute line numbers. * * Note that this object uses shared strings for filenames, and the * pointer to the filename together with the line number is taken into * the space for the "inline" internal represenation of the Jim_Object, * so there is almost memory zero-overhead. * * Also the object will be converted to something else if the given * token it represents in the source file is not something to be * evaluated (not a script), and will be specialized in some other way, * so the time overhead is alzo null. * ---------------------------------------------------------------------------*/ static void FreeSourceInternalRep(Jim_Interp *interp, Jim_Obj *objPtr); static void DupSourceInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static Jim_ObjType sourceObjType = { "source", FreeSourceInternalRep, DupSourceInternalRep, NULL, JIM_TYPE_REFERENCES, }; void FreeSourceInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { Jim_ReleaseSharedString(interp, objPtr->internalRep.sourceValue.fileName); } void DupSourceInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { dupPtr->internalRep.sourceValue.fileName = Jim_GetSharedString(interp, srcPtr->internalRep.sourceValue.fileName); dupPtr->internalRep.sourceValue.lineNumber = dupPtr->internalRep.sourceValue.lineNumber; dupPtr->typePtr = &sourceObjType; } static void JimSetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr, const char *fileName, int lineNumber) { if (Jim_IsShared(objPtr)) Jim_Panic(interp,"JimSetSourceInfo called with shared object"); if (objPtr->typePtr != NULL) Jim_Panic(interp,"JimSetSourceInfo called with typePtr != NULL"); objPtr->internalRep.sourceValue.fileName = Jim_GetSharedString(interp, fileName); objPtr->internalRep.sourceValue.lineNumber = lineNumber; objPtr->typePtr = &sourceObjType; } /* ----------------------------------------------------------------------------- * Script Object * ---------------------------------------------------------------------------*/ #define JIM_CMDSTRUCT_EXPAND -1 static void FreeScriptInternalRep(Jim_Interp *interp, Jim_Obj *objPtr); static void DupScriptInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static int SetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr); static Jim_ObjType scriptObjType = { "script", FreeScriptInternalRep, DupScriptInternalRep, NULL, JIM_TYPE_REFERENCES, }; /* The ScriptToken structure represents every token into a scriptObj. * Every token contains an associated Jim_Obj that can be specialized * by commands operating on it. */ typedef struct ScriptToken { int type; Jim_Obj *objPtr; int linenr; } ScriptToken; /* This is the script object internal representation. An array of * ScriptToken structures, with an associated command structure array. * The command structure is a pre-computed representation of the * command length and arguments structure as a simple liner array * of integers. * * For example the script: * * puts hello * set $i $x$y [foo]BAR * * will produce a ScriptObj with the following Tokens: * * ESC puts * SEP * ESC hello * EOL * ESC set * EOL * VAR i * SEP * VAR x * VAR y * SEP * CMD foo * ESC BAR * EOL * * This is a description of the tokens, separators, and of lines. * The command structure instead represents the number of arguments * of every command, followed by the tokens of which every argument * is composed. So for the example script, the cmdstruct array will * contain: * * 2 1 1 4 1 1 2 2 * * Because "puts hello" has two args (2), composed of single tokens (1 1) * While "set $i $x$y [foo]BAR" has four (4) args, the first two * composed of single tokens (1 1) and the last two of double tokens * (2 2). * * The precomputation of the command structure makes Jim_Eval() faster, * and simpler because there aren't dynamic lengths / allocations. * * -- {expand} handling -- * * Expand is handled in a special way. When a command * contains at least an argument with the {expand} prefix, * the command structure presents a -1 before the integer * describing the number of arguments. This is used in order * to send the command exection to a different path in case * of {expand} and guarantee a fast path for the more common * case. Also, the integers describing the number of tokens * are expressed with negative sign, to allow for fast check * of what's an {expand}-prefixed argument and what not. * * For example the command: * * list {expand}{1 2} * * Will produce the following cmdstruct array: * * -1 2 1 -2 * * -- the substFlags field of the structure -- * * The scriptObj structure is used to represent both "script" objects * and "subst" objects. In the second case, the cmdStruct related * fields are not used at all, but there is an additional field used * that is 'substFlags': this represents the flags used to turn * the string into the intenral representation used to perform the * substitution. If this flags are not what the application requires * the scriptObj is created again. For example the script: * * subst -nocommands $string * subst -novariables $string * * Will recreate the internal representation of the $string object * two times. */ typedef struct ScriptObj { int len; /* Length as number of tokens. */ int commands; /* number of top-level commands in script. */ ScriptToken *token; /* Tokens array. */ int *cmdStruct; /* commands structure */ int csLen; /* length of the cmdStruct array. */ int substFlags; /* flags used for the compilation of "subst" objects */ int inUse; /* Used to share a ScriptObj. Currently only used by Jim_EvalObj() as protection against shimmering of the currently evaluated object. */ char *fileName; } ScriptObj; void FreeScriptInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { int i; struct ScriptObj *script = (void*) objPtr->internalRep.ptr; if (!script) return; script->inUse--; if (script->inUse != 0) return; for (i = 0; i < script->len; i++) { if (script->token[i].objPtr != NULL) Jim_DecrRefCount(interp, script->token[i].objPtr); } Jim_Free(script->token); Jim_Free(script->cmdStruct); Jim_Free(script->fileName); Jim_Free(script); } void DupScriptInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { JIM_NOTUSED(interp); JIM_NOTUSED(srcPtr); /* Just returns an simple string. */ dupPtr->typePtr = NULL; } /* Add a new token to the internal repr of a script object */ static void ScriptObjAddToken(Jim_Interp *interp, struct ScriptObj *script, char *strtoken, int len, int type, char *filename, int linenr) { int prevtype; struct ScriptToken *token; prevtype = (script->len == 0) ? JIM_TT_EOL : \ script->token[script->len-1].type; /* Skip tokens without meaning, like words separators * following a word separator or an end of command and * so on. */ if (prevtype == JIM_TT_EOL) { if (type == JIM_TT_EOL || type == JIM_TT_SEP) { Jim_Free(strtoken); return; } } else if (prevtype == JIM_TT_SEP) { if (type == JIM_TT_SEP) { Jim_Free(strtoken); return; } else if (type == JIM_TT_EOL) { /* If an EOL is following by a SEP, drop the previous * separator. */ script->len--; Jim_DecrRefCount(interp, script->token[script->len].objPtr); } } else if (prevtype != JIM_TT_EOL && prevtype != JIM_TT_SEP && type == JIM_TT_ESC && len == 0) { /* Don't add empty tokens used in interpolation */ Jim_Free(strtoken); return; } /* Make space for a new istruction */ script->len++; script->token = Jim_Realloc(script->token, sizeof(ScriptToken)*script->len); /* Initialize the new token */ token = script->token + (script->len-1); token->type = type; /* Every object is intially as a string, but the * internal type may be specialized during execution of the * script. */ token->objPtr = Jim_NewStringObjNoAlloc(interp, strtoken, len); /* To add source info to SEP and EOL tokens is useless because * they will never by called as arguments of Jim_EvalObj(). */ if (filename && type != JIM_TT_SEP && type != JIM_TT_EOL) JimSetSourceInfo(interp, token->objPtr, filename, linenr); Jim_IncrRefCount(token->objPtr); token->linenr = linenr; } /* Add an integer into the command structure field of the script object. */ static void ScriptObjAddInt(struct ScriptObj *script, int val) { script->csLen++; script->cmdStruct = Jim_Realloc(script->cmdStruct, sizeof(int)*script->csLen); script->cmdStruct[script->csLen-1] = val; } /* Search a Jim_Obj contained in 'script' with the same stinrg repr. * of objPtr. Search nested script objects recursively. */ static Jim_Obj *ScriptSearchLiteral(Jim_Interp *interp, ScriptObj *script, ScriptObj *scriptBarrier, Jim_Obj *objPtr) { int i; for (i = 0; i < script->len; i++) { if (script->token[i].objPtr != objPtr && Jim_StringEqObj(script->token[i].objPtr, objPtr, 0)) { return script->token[i].objPtr; } /* Enter recursively on scripts only if the object * is not the same as the one we are searching for * shared occurrences. */ if (script->token[i].objPtr->typePtr == &scriptObjType && script->token[i].objPtr != objPtr) { Jim_Obj *foundObjPtr; ScriptObj *subScript = script->token[i].objPtr->internalRep.ptr; /* Don't recursively enter the script we are trying * to make shared to avoid circular references. */ if (subScript == scriptBarrier) continue; if (subScript != script) { foundObjPtr = ScriptSearchLiteral(interp, subScript, scriptBarrier, objPtr); if (foundObjPtr != NULL) return foundObjPtr; } } } return NULL; } /* Share literals of a script recursively sharing sub-scripts literals. */ static void ScriptShareLiterals(Jim_Interp *interp, ScriptObj *script, ScriptObj *topLevelScript) { int i, j; return; /* Try to share with toplevel object. */ if (topLevelScript != NULL) { for (i = 0; i < script->len; i++) { Jim_Obj *foundObjPtr; char *str = script->token[i].objPtr->bytes; if (script->token[i].objPtr->refCount != 1) continue; if (script->token[i].objPtr->typePtr == &scriptObjType) continue; if (strchr(str, ' ') || strchr(str, '\n')) continue; foundObjPtr = ScriptSearchLiteral(interp, topLevelScript, script, /* barrier */ script->token[i].objPtr); if (foundObjPtr != NULL) { Jim_IncrRefCount(foundObjPtr); Jim_DecrRefCount(interp, script->token[i].objPtr); script->token[i].objPtr = foundObjPtr; } } } /* Try to share locally */ for (i = 0; i < script->len; i++) { char *str = script->token[i].objPtr->bytes; if (script->token[i].objPtr->refCount != 1) continue; if (strchr(str, ' ') || strchr(str, '\n')) continue; for (j = 0; j < script->len; j++) { if (script->token[i].objPtr != script->token[j].objPtr && Jim_StringEqObj(script->token[i].objPtr, script->token[j].objPtr, 0)) { Jim_IncrRefCount(script->token[j].objPtr); Jim_DecrRefCount(interp, script->token[i].objPtr); script->token[i].objPtr = script->token[j].objPtr; } } } } /* This method takes the string representation of an object * as a Tcl script, and generates the pre-parsed internal representation * of the script. */ int SetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) { int scriptTextLen; const char *scriptText = Jim_GetString(objPtr, &scriptTextLen); struct JimParserCtx parser; struct ScriptObj *script = Jim_Alloc(sizeof(*script)); ScriptToken *token; int args, tokens, start, end, i; int initialLineNumber; int propagateSourceInfo = 0; script->len = 0; script->csLen = 0; script->commands = 0; script->token = NULL; script->cmdStruct = NULL; script->inUse = 1; /* Try to get information about filename / line number */ if (objPtr->typePtr == &sourceObjType) { script->fileName = Jim_StrDup(objPtr->internalRep.sourceValue.fileName); initialLineNumber = objPtr->internalRep.sourceValue.lineNumber; propagateSourceInfo = 1; } else { script->fileName = Jim_StrDup(""); initialLineNumber = 1; } JimParserInit(&parser, scriptText, scriptTextLen, initialLineNumber); while (!JimParserEof(&parser)) { char *token; int len, type, linenr; JimParseScript(&parser); token = JimParserGetToken(&parser, &len, &type, &linenr); ScriptObjAddToken(interp, script, token, len, type, propagateSourceInfo ? script->fileName : NULL, linenr); } token = script->token; /* Compute the command structure array * (see the ScriptObj struct definition for more info) */ start = 0; /* Current command start token index */ end = -1; /* Current command end token index */ while (1) { int expand = 0; /* expand flag. set to 1 on {expand} form. */ int interpolation = 0; /* set to 1 if there is at least one argument of the command obtained via interpolation of more tokens. */ /* Search for the end of command, while * count the number of args. */ start = ++end; if (start >= script->len) break; args = 1; /* Number of args in current command */ while (token[end].type != JIM_TT_EOL) { if (end == 0 || token[end-1].type == JIM_TT_SEP || token[end-1].type == JIM_TT_EOL) { if (token[end].type == JIM_TT_STR && token[end + 1].type != JIM_TT_SEP && token[end + 1].type != JIM_TT_EOL && (!strcmp(token[end].objPtr->bytes, "expand") || !strcmp(token[end].objPtr->bytes, "*"))) expand++; } if (token[end].type == JIM_TT_SEP) args++; end++; } interpolation = !((end-start + 1) == args*2); /* Add the 'number of arguments' info into cmdstruct. * Negative value if there is list expansion involved. */ if (expand) ScriptObjAddInt(script, -1); ScriptObjAddInt(script, args); /* Now add info about the number of tokens. */ tokens = 0; /* Number of tokens in current argument. */ expand = 0; for (i = start; i <= end; i++) { if (token[i].type == JIM_TT_SEP || token[i].type == JIM_TT_EOL) { if (tokens == 1 && expand) expand = 0; ScriptObjAddInt(script, expand ? -tokens : tokens); expand = 0; tokens = 0; continue; } else if (tokens == 0 && token[i].type == JIM_TT_STR && (!strcmp(token[i].objPtr->bytes, "expand") || !strcmp(token[i].objPtr->bytes, "*"))) { expand++; } tokens++; } } /* Perform literal sharing, but only for objects that appear * to be scripts written as literals inside the source code, * and not computed at runtime. Literal sharing is a costly * operation that should be done only against objects that * are likely to require compilation only the first time, and * then are executed multiple times. */ if (propagateSourceInfo && interp->framePtr->procBodyObjPtr) { Jim_Obj *bodyObjPtr = interp->framePtr->procBodyObjPtr; if (bodyObjPtr->typePtr == &scriptObjType) { ScriptObj *bodyScript = bodyObjPtr->internalRep.ptr; ScriptShareLiterals(interp, script, bodyScript); } } else if (propagateSourceInfo) { ScriptShareLiterals(interp, script, NULL); } /* Free the old internal rep and set the new one. */ Jim_FreeIntRep(interp, objPtr); Jim_SetIntRepPtr(objPtr, script); objPtr->typePtr = &scriptObjType; return JIM_OK; } ScriptObj *Jim_GetScript(Jim_Interp *interp, Jim_Obj *objPtr) { if (objPtr->typePtr != &scriptObjType) { SetScriptFromAny(interp, objPtr); } return (ScriptObj*) Jim_GetIntRepPtr(objPtr); } /* ----------------------------------------------------------------------------- * Commands * ---------------------------------------------------------------------------*/ /* Commands HashTable Type. * * Keys are dynamic allocated strings, Values are Jim_Cmd structures. */ static void Jim_CommandsHT_ValDestructor(void *interp, void *val) { Jim_Cmd *cmdPtr = (void*) val; if (cmdPtr->cmdProc == NULL) { Jim_DecrRefCount(interp, cmdPtr->argListObjPtr); Jim_DecrRefCount(interp, cmdPtr->bodyObjPtr); if (cmdPtr->staticVars) { Jim_FreeHashTable(cmdPtr->staticVars); Jim_Free(cmdPtr->staticVars); } } else if (cmdPtr->delProc != NULL) { /* If it was a C coded command, call the delProc if any */ cmdPtr->delProc(interp, cmdPtr->privData); } Jim_Free(val); } static Jim_HashTableType JimCommandsHashTableType = { JimStringCopyHTHashFunction, /* hash function */ JimStringCopyHTKeyDup, /* key dup */ NULL, /* val dup */ JimStringCopyHTKeyCompare, /* key compare */ JimStringCopyHTKeyDestructor, /* key destructor */ Jim_CommandsHT_ValDestructor /* val destructor */ }; /* ------------------------- Commands related functions --------------------- */ int Jim_CreateCommand(Jim_Interp *interp, const char *cmdName, Jim_CmdProc cmdProc, void *privData, Jim_DelCmdProc delProc) { Jim_HashEntry *he; Jim_Cmd *cmdPtr; he = Jim_FindHashEntry(&interp->commands, cmdName); if (he == NULL) { /* New command to create */ cmdPtr = Jim_Alloc(sizeof(*cmdPtr)); Jim_AddHashEntry(&interp->commands, cmdName, cmdPtr); } else { Jim_InterpIncrProcEpoch(interp); /* Free the arglist/body objects if it was a Tcl procedure */ cmdPtr = he->val; if (cmdPtr->cmdProc == NULL) { Jim_DecrRefCount(interp, cmdPtr->argListObjPtr); Jim_DecrRefCount(interp, cmdPtr->bodyObjPtr); if (cmdPtr->staticVars) { Jim_FreeHashTable(cmdPtr->staticVars); Jim_Free(cmdPtr->staticVars); } cmdPtr->staticVars = NULL; } else if (cmdPtr->delProc != NULL) { /* If it was a C coded command, call the delProc if any */ cmdPtr->delProc(interp, cmdPtr->privData); } } /* Store the new details for this proc */ cmdPtr->delProc = delProc; cmdPtr->cmdProc = cmdProc; cmdPtr->privData = privData; /* There is no need to increment the 'proc epoch' because * creation of a new procedure can never affect existing * cached commands. We don't do negative caching. */ return JIM_OK; } int Jim_CreateProcedure(Jim_Interp *interp, const char *cmdName, Jim_Obj *argListObjPtr, Jim_Obj *staticsListObjPtr, Jim_Obj *bodyObjPtr, int arityMin, int arityMax) { Jim_Cmd *cmdPtr; cmdPtr = Jim_Alloc(sizeof(*cmdPtr)); cmdPtr->cmdProc = NULL; /* Not a C coded command */ cmdPtr->argListObjPtr = argListObjPtr; cmdPtr->bodyObjPtr = bodyObjPtr; Jim_IncrRefCount(argListObjPtr); Jim_IncrRefCount(bodyObjPtr); cmdPtr->arityMin = arityMin; cmdPtr->arityMax = arityMax; cmdPtr->staticVars = NULL; /* Create the statics hash table. */ if (staticsListObjPtr) { int len, i; Jim_ListLength(interp, staticsListObjPtr, &len); if (len != 0) { cmdPtr->staticVars = Jim_Alloc(sizeof(Jim_HashTable)); Jim_InitHashTable(cmdPtr->staticVars, getJimVariablesHashTableType(), interp); for (i = 0; i < len; i++) { Jim_Obj *objPtr=NULL, *initObjPtr=NULL, *nameObjPtr=NULL; Jim_Var *varPtr; int subLen; Jim_ListIndex(interp, staticsListObjPtr, i, &objPtr, JIM_NONE); /* Check if it's composed of two elements. */ Jim_ListLength(interp, objPtr, &subLen); if (subLen == 1 || subLen == 2) { /* Try to get the variable value from the current * environment. */ Jim_ListIndex(interp, objPtr, 0, &nameObjPtr, JIM_NONE); if (subLen == 1) { initObjPtr = Jim_GetVariable(interp, nameObjPtr, JIM_NONE); if (initObjPtr == NULL) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "variable for initialization of static \"", Jim_GetString(nameObjPtr, NULL), "\" not found in the local context", NULL); goto err; } } else { Jim_ListIndex(interp, objPtr, 1, &initObjPtr, JIM_NONE); } varPtr = Jim_Alloc(sizeof(*varPtr)); varPtr->objPtr = initObjPtr; Jim_IncrRefCount(initObjPtr); varPtr->linkFramePtr = NULL; if (Jim_AddHashEntry(cmdPtr->staticVars, Jim_GetString(nameObjPtr, NULL), varPtr) != JIM_OK) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "static variable name \"", Jim_GetString(objPtr, NULL), "\"", " duplicated in statics list", NULL); Jim_DecrRefCount(interp, initObjPtr); Jim_Free(varPtr); goto err; } } else { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "too many fields in static specifier \"", objPtr, "\"", NULL); goto err; } } } } /* Add the new command */ /* it may already exist, so we try to delete the old one */ if (Jim_DeleteHashEntry(&interp->commands, cmdName) != JIM_ERR) { /* There was an old procedure with the same name, this requires * a 'proc epoch' update. */ Jim_InterpIncrProcEpoch(interp); } /* If a procedure with the same name didn't existed there is no need * to increment the 'proc epoch' because creation of a new procedure * can never affect existing cached commands. We don't do * negative caching. */ Jim_AddHashEntry(&interp->commands, cmdName, cmdPtr); return JIM_OK; err: Jim_FreeHashTable(cmdPtr->staticVars); Jim_Free(cmdPtr->staticVars); Jim_DecrRefCount(interp, argListObjPtr); Jim_DecrRefCount(interp, bodyObjPtr); Jim_Free(cmdPtr); return JIM_ERR; } int Jim_DeleteCommand(Jim_Interp *interp, const char *cmdName) { if (Jim_DeleteHashEntry(&interp->commands, cmdName) == JIM_ERR) return JIM_ERR; Jim_InterpIncrProcEpoch(interp); return JIM_OK; } int Jim_RenameCommand(Jim_Interp *interp, const char *oldName, const char *newName) { Jim_Cmd *cmdPtr; Jim_HashEntry *he; Jim_Cmd *copyCmdPtr; if (newName[0] == '\0') /* Delete! */ return Jim_DeleteCommand(interp, oldName); /* Rename */ he = Jim_FindHashEntry(&interp->commands, oldName); if (he == NULL) return JIM_ERR; /* Invalid command name */ cmdPtr = he->val; copyCmdPtr = Jim_Alloc(sizeof(Jim_Cmd)); *copyCmdPtr = *cmdPtr; /* In order to avoid that a procedure will get arglist/body/statics * freed by the hash table methods, fake a C-coded command * setting cmdPtr->cmdProc as not NULL */ cmdPtr->cmdProc = (void*)1; /* Also make sure delProc is NULL. */ cmdPtr->delProc = NULL; /* Destroy the old command, and make sure the new is freed * as well. */ Jim_DeleteHashEntry(&interp->commands, oldName); Jim_DeleteHashEntry(&interp->commands, newName); /* Now the new command. We are sure it can't fail because * the target name was already freed. */ Jim_AddHashEntry(&interp->commands, newName, copyCmdPtr); /* Increment the epoch */ Jim_InterpIncrProcEpoch(interp); return JIM_OK; } /* ----------------------------------------------------------------------------- * Command object * ---------------------------------------------------------------------------*/ static int SetCommandFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr); static Jim_ObjType commandObjType = { "command", NULL, NULL, NULL, JIM_TYPE_REFERENCES, }; int SetCommandFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { Jim_HashEntry *he; const char *cmdName; /* Get the string representation */ cmdName = Jim_GetString(objPtr, NULL); /* Lookup this name into the commands hash table */ he = Jim_FindHashEntry(&interp->commands, cmdName); if (he == NULL) return JIM_ERR; /* Free the old internal repr and set the new one. */ Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &commandObjType; objPtr->internalRep.cmdValue.procEpoch = interp->procEpoch; objPtr->internalRep.cmdValue.cmdPtr = (void*)he->val; return JIM_OK; } /* This function returns the command structure for the command name * stored in objPtr. It tries to specialize the objPtr to contain * a cached info instead to perform the lookup into the hash table * every time. The information cached may not be uptodate, in such * a case the lookup is performed and the cache updated. */ Jim_Cmd *Jim_GetCommand(Jim_Interp *interp, Jim_Obj *objPtr, int flags) { if ((objPtr->typePtr != &commandObjType || objPtr->internalRep.cmdValue.procEpoch != interp->procEpoch) && SetCommandFromAny(interp, objPtr) == JIM_ERR) { if (flags & JIM_ERRMSG) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "invalid command name \"", objPtr->bytes, "\"", NULL); } return NULL; } return objPtr->internalRep.cmdValue.cmdPtr; } /* ----------------------------------------------------------------------------- * Variables * ---------------------------------------------------------------------------*/ /* Variables HashTable Type. * * Keys are dynamic allocated strings, Values are Jim_Var structures. */ static void JimVariablesHTValDestructor(void *interp, void *val) { Jim_Var *varPtr = (void*) val; Jim_DecrRefCount(interp, varPtr->objPtr); Jim_Free(val); } static Jim_HashTableType JimVariablesHashTableType = { JimStringCopyHTHashFunction, /* hash function */ JimStringCopyHTKeyDup, /* key dup */ NULL, /* val dup */ JimStringCopyHTKeyCompare, /* key compare */ JimStringCopyHTKeyDestructor, /* key destructor */ JimVariablesHTValDestructor /* val destructor */ }; static Jim_HashTableType *getJimVariablesHashTableType(void) { return &JimVariablesHashTableType; } /* ----------------------------------------------------------------------------- * Variable object * ---------------------------------------------------------------------------*/ #define JIM_DICT_SUGAR 100 /* Only returned by SetVariableFromAny() */ static int SetVariableFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr); static Jim_ObjType variableObjType = { "variable", NULL, NULL, NULL, JIM_TYPE_REFERENCES, }; /* Return true if the string "str" looks like syntax sugar for [dict]. I.e. * is in the form "varname(key)". */ static int Jim_NameIsDictSugar(const char *str, int len) { if (len == -1) len = strlen(str); if (len && str[len-1] == ')' && strchr(str, '(') != NULL) return 1; return 0; } /* This method should be called only by the variable API. * It returns JIM_OK on success (variable already exists), * JIM_ERR if it does not exists, JIM_DICT_GLUE if it's not * a variable name, but syntax glue for [dict] i.e. the last * character is ')' */ int SetVariableFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) { Jim_HashEntry *he; const char *varName; int len; /* Check if the object is already an uptodate variable */ if (objPtr->typePtr == &variableObjType && objPtr->internalRep.varValue.callFrameId == interp->framePtr->id) return JIM_OK; /* nothing to do */ /* Get the string representation */ varName = Jim_GetString(objPtr, &len); /* Make sure it's not syntax glue to get/set dict. */ if (Jim_NameIsDictSugar(varName, len)) return JIM_DICT_SUGAR; if (varName[0] == ':' && varName[1] == ':') { he = Jim_FindHashEntry(&interp->topFramePtr->vars, varName + 2); if (he == NULL) { return JIM_ERR; } } else { /* Lookup this name into the variables hash table */ he = Jim_FindHashEntry(&interp->framePtr->vars, varName); if (he == NULL) { /* Try with static vars. */ if (interp->framePtr->staticVars == NULL) return JIM_ERR; if (!(he = Jim_FindHashEntry(interp->framePtr->staticVars, varName))) return JIM_ERR; } } /* Free the old internal repr and set the new one. */ Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &variableObjType; objPtr->internalRep.varValue.callFrameId = interp->framePtr->id; objPtr->internalRep.varValue.varPtr = (void*)he->val; return JIM_OK; } /* -------------------- Variables related functions ------------------------- */ static int JimDictSugarSet(Jim_Interp *interp, Jim_Obj *ObjPtr, Jim_Obj *valObjPtr); static Jim_Obj *JimDictSugarGet(Jim_Interp *interp, Jim_Obj *ObjPtr); /* For now that's dummy. Variables lookup should be optimized * in many ways, with caching of lookups, and possibly with * a table of pre-allocated vars in every CallFrame for local vars. * All the caching should also have an 'epoch' mechanism similar * to the one used by Tcl for procedures lookup caching. */ int Jim_SetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, Jim_Obj *valObjPtr) { const char *name; Jim_Var *var; int err; if ((err = SetVariableFromAny(interp, nameObjPtr)) != JIM_OK) { /* Check for [dict] syntax sugar. */ if (err == JIM_DICT_SUGAR) return JimDictSugarSet(interp, nameObjPtr, valObjPtr); /* New variable to create */ name = Jim_GetString(nameObjPtr, NULL); var = Jim_Alloc(sizeof(*var)); var->objPtr = valObjPtr; Jim_IncrRefCount(valObjPtr); var->linkFramePtr = NULL; /* Insert the new variable */ if (name[0] == ':' && name[1] == ':') { /* Into to the top evel frame */ Jim_AddHashEntry(&interp->topFramePtr->vars, name + 2, var); } else { Jim_AddHashEntry(&interp->framePtr->vars, name, var); } /* Make the object int rep a variable */ Jim_FreeIntRep(interp, nameObjPtr); nameObjPtr->typePtr = &variableObjType; nameObjPtr->internalRep.varValue.callFrameId = interp->framePtr->id; nameObjPtr->internalRep.varValue.varPtr = var; } else { var = nameObjPtr->internalRep.varValue.varPtr; if (var->linkFramePtr == NULL) { Jim_IncrRefCount(valObjPtr); Jim_DecrRefCount(interp, var->objPtr); var->objPtr = valObjPtr; } else { /* Else handle the link */ Jim_CallFrame *savedCallFrame; savedCallFrame = interp->framePtr; interp->framePtr = var->linkFramePtr; err = Jim_SetVariable(interp, var->objPtr, valObjPtr); interp->framePtr = savedCallFrame; if (err != JIM_OK) return err; } } return JIM_OK; } int Jim_SetVariableStr(Jim_Interp *interp, const char *name, Jim_Obj *objPtr) { Jim_Obj *nameObjPtr; int result; nameObjPtr = Jim_NewStringObj(interp, name, -1); Jim_IncrRefCount(nameObjPtr); result = Jim_SetVariable(interp, nameObjPtr, objPtr); Jim_DecrRefCount(interp, nameObjPtr); return result; } int Jim_SetGlobalVariableStr(Jim_Interp *interp, const char *name, Jim_Obj *objPtr) { Jim_CallFrame *savedFramePtr; int result; savedFramePtr = interp->framePtr; interp->framePtr = interp->topFramePtr; result = Jim_SetVariableStr(interp, name, objPtr); interp->framePtr = savedFramePtr; return result; } int Jim_SetVariableStrWithStr(Jim_Interp *interp, const char *name, const char *val) { Jim_Obj *nameObjPtr, *valObjPtr; int result; nameObjPtr = Jim_NewStringObj(interp, name, -1); valObjPtr = Jim_NewStringObj(interp, val, -1); Jim_IncrRefCount(nameObjPtr); Jim_IncrRefCount(valObjPtr); result = Jim_SetVariable(interp, nameObjPtr, valObjPtr); Jim_DecrRefCount(interp, nameObjPtr); Jim_DecrRefCount(interp, valObjPtr); return result; } int Jim_SetVariableLink(Jim_Interp *interp, Jim_Obj *nameObjPtr, Jim_Obj *targetNameObjPtr, Jim_CallFrame *targetCallFrame) { const char *varName; int len; /* Check for cycles. */ if (interp->framePtr == targetCallFrame) { Jim_Obj *objPtr = targetNameObjPtr; Jim_Var *varPtr; /* Cycles are only possible with 'uplevel 0' */ while (1) { if (Jim_StringEqObj(objPtr, nameObjPtr, 0)) { Jim_SetResultString(interp, "can't upvar from variable to itself", -1); return JIM_ERR; } if (SetVariableFromAny(interp, objPtr) != JIM_OK) break; varPtr = objPtr->internalRep.varValue.varPtr; if (varPtr->linkFramePtr != targetCallFrame) break; objPtr = varPtr->objPtr; } } varName = Jim_GetString(nameObjPtr, &len); if (Jim_NameIsDictSugar(varName, len)) { Jim_SetResultString(interp, "Dict key syntax invalid as link source", -1); return JIM_ERR; } /* Perform the binding */ Jim_SetVariable(interp, nameObjPtr, targetNameObjPtr); /* We are now sure 'nameObjPtr' type is variableObjType */ nameObjPtr->internalRep.varValue.varPtr->linkFramePtr = targetCallFrame; return JIM_OK; } /* Return the Jim_Obj pointer associated with a variable name, * or NULL if the variable was not found in the current context. * The same optimization discussed in the comment to the * 'SetVariable' function should apply here. */ Jim_Obj *Jim_GetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags) { int err; /* All the rest is handled here */ if ((err = SetVariableFromAny(interp, nameObjPtr)) != JIM_OK) { /* Check for [dict] syntax sugar. */ if (err == JIM_DICT_SUGAR) return JimDictSugarGet(interp, nameObjPtr); if (flags & JIM_ERRMSG) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "can't read \"", nameObjPtr->bytes, "\": no such variable", NULL); } return NULL; } else { Jim_Var *varPtr; Jim_Obj *objPtr; Jim_CallFrame *savedCallFrame; varPtr = nameObjPtr->internalRep.varValue.varPtr; if (varPtr->linkFramePtr == NULL) return varPtr->objPtr; /* The variable is a link? Resolve it. */ savedCallFrame = interp->framePtr; interp->framePtr = varPtr->linkFramePtr; objPtr = Jim_GetVariable(interp, varPtr->objPtr, JIM_NONE); if (objPtr == NULL && flags & JIM_ERRMSG) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "can't read \"", nameObjPtr->bytes, "\": no such variable", NULL); } interp->framePtr = savedCallFrame; return objPtr; } } Jim_Obj *Jim_GetGlobalVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags) { Jim_CallFrame *savedFramePtr; Jim_Obj *objPtr; savedFramePtr = interp->framePtr; interp->framePtr = interp->topFramePtr; objPtr = Jim_GetVariable(interp, nameObjPtr, flags); interp->framePtr = savedFramePtr; return objPtr; } Jim_Obj *Jim_GetVariableStr(Jim_Interp *interp, const char *name, int flags) { Jim_Obj *nameObjPtr, *varObjPtr; nameObjPtr = Jim_NewStringObj(interp, name, -1); Jim_IncrRefCount(nameObjPtr); varObjPtr = Jim_GetVariable(interp, nameObjPtr, flags); Jim_DecrRefCount(interp, nameObjPtr); return varObjPtr; } Jim_Obj *Jim_GetGlobalVariableStr(Jim_Interp *interp, const char *name, int flags) { Jim_CallFrame *savedFramePtr; Jim_Obj *objPtr; savedFramePtr = interp->framePtr; interp->framePtr = interp->topFramePtr; objPtr = Jim_GetVariableStr(interp, name, flags); interp->framePtr = savedFramePtr; return objPtr; } /* Unset a variable. * Note: On success unset invalidates all the variable objects created * in the current call frame incrementing. */ int Jim_UnsetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags) { const char *name; Jim_Var *varPtr; int err; if ((err = SetVariableFromAny(interp, nameObjPtr)) != JIM_OK) { /* Check for [dict] syntax sugar. */ if (err == JIM_DICT_SUGAR) return JimDictSugarSet(interp, nameObjPtr, NULL); Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "can't unset \"", nameObjPtr->bytes, "\": no such variable", NULL); return JIM_ERR; /* var not found */ } varPtr = nameObjPtr->internalRep.varValue.varPtr; /* If it's a link call UnsetVariable recursively */ if (varPtr->linkFramePtr) { int retval; Jim_CallFrame *savedCallFrame; savedCallFrame = interp->framePtr; interp->framePtr = varPtr->linkFramePtr; retval = Jim_UnsetVariable(interp, varPtr->objPtr, JIM_NONE); interp->framePtr = savedCallFrame; if (retval != JIM_OK && flags & JIM_ERRMSG) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "can't unset \"", nameObjPtr->bytes, "\": no such variable", NULL); } return retval; } else { name = Jim_GetString(nameObjPtr, NULL); if (Jim_DeleteHashEntry(&interp->framePtr->vars, name) != JIM_OK) return JIM_ERR; /* Change the callframe id, invalidating var lookup caching */ JimChangeCallFrameId(interp, interp->framePtr); return JIM_OK; } } /* ---------- Dict syntax sugar (similar to array Tcl syntax) -------------- */ /* Given a variable name for [dict] operation syntax sugar, * this function returns two objects, the first with the name * of the variable to set, and the second with the rispective key. * For example "foo(bar)" will return objects with string repr. of * "foo" and "bar". * * The returned objects have refcount = 1. The function can't fail. */ static void JimDictSugarParseVarKey(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj **varPtrPtr, Jim_Obj **keyPtrPtr) { const char *str, *p; char *t; int len, keyLen, nameLen; Jim_Obj *varObjPtr, *keyObjPtr; str = Jim_GetString(objPtr, &len); p = strchr(str, '('); p++; keyLen = len-((p-str) + 1); nameLen = (p-str)-1; /* Create the objects with the variable name and key. */ t = Jim_Alloc(nameLen + 1); memcpy(t, str, nameLen); t[nameLen] = '\0'; varObjPtr = Jim_NewStringObjNoAlloc(interp, t, nameLen); t = Jim_Alloc(keyLen + 1); memcpy(t, p, keyLen); t[keyLen] = '\0'; keyObjPtr = Jim_NewStringObjNoAlloc(interp, t, keyLen); Jim_IncrRefCount(varObjPtr); Jim_IncrRefCount(keyObjPtr); *varPtrPtr = varObjPtr; *keyPtrPtr = keyObjPtr; } /* Helper of Jim_SetVariable() to deal with dict-syntax variable names. * Also used by Jim_UnsetVariable() with valObjPtr = NULL. */ static int JimDictSugarSet(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *valObjPtr) { Jim_Obj *varObjPtr, *keyObjPtr; int err = JIM_OK; JimDictSugarParseVarKey(interp, objPtr, &varObjPtr, &keyObjPtr); err = Jim_SetDictKeysVector(interp, varObjPtr, &keyObjPtr, 1, valObjPtr); Jim_DecrRefCount(interp, varObjPtr); Jim_DecrRefCount(interp, keyObjPtr); return err; } /* Helper of Jim_GetVariable() to deal with dict-syntax variable names */ static Jim_Obj *JimDictSugarGet(Jim_Interp *interp, Jim_Obj *objPtr) { Jim_Obj *varObjPtr, *keyObjPtr, *dictObjPtr, *resObjPtr; JimDictSugarParseVarKey(interp, objPtr, &varObjPtr, &keyObjPtr); dictObjPtr = Jim_GetVariable(interp, varObjPtr, JIM_ERRMSG); if (!dictObjPtr) { resObjPtr = NULL; goto err; } if (Jim_DictKey(interp, dictObjPtr, keyObjPtr, &resObjPtr, JIM_ERRMSG) != JIM_OK) { resObjPtr = NULL; } err: Jim_DecrRefCount(interp, varObjPtr); Jim_DecrRefCount(interp, keyObjPtr); return resObjPtr; } /* --------- $var(INDEX) substitution, using a specialized object ----------- */ static void FreeDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *objPtr); static void DupDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static Jim_ObjType dictSubstObjType = { "dict-substitution", FreeDictSubstInternalRep, DupDictSubstInternalRep, NULL, JIM_TYPE_NONE, }; void FreeDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { Jim_DecrRefCount(interp, objPtr->internalRep.dictSubstValue.varNameObjPtr); Jim_DecrRefCount(interp, objPtr->internalRep.dictSubstValue.indexObjPtr); } void DupDictSubstInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { JIM_NOTUSED(interp); dupPtr->internalRep.dictSubstValue.varNameObjPtr = srcPtr->internalRep.dictSubstValue.varNameObjPtr; dupPtr->internalRep.dictSubstValue.indexObjPtr = srcPtr->internalRep.dictSubstValue.indexObjPtr; dupPtr->typePtr = &dictSubstObjType; } /* This function is used to expand [dict get] sugar in the form * of $var(INDEX). The function is mainly used by Jim_EvalObj() * to deal with tokens of type JIM_TT_DICTSUGAR. objPtr points to an * object that is *guaranteed* to be in the form VARNAME(INDEX). * The 'index' part is [subst]ituted, and is used to lookup a key inside * the [dict]ionary contained in variable VARNAME. */ Jim_Obj *Jim_ExpandDictSugar(Jim_Interp *interp, Jim_Obj *objPtr) { Jim_Obj *varObjPtr, *keyObjPtr, *dictObjPtr, *resObjPtr; Jim_Obj *substKeyObjPtr = NULL; if (objPtr->typePtr != &dictSubstObjType) { JimDictSugarParseVarKey(interp, objPtr, &varObjPtr, &keyObjPtr); Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &dictSubstObjType; objPtr->internalRep.dictSubstValue.varNameObjPtr = varObjPtr; objPtr->internalRep.dictSubstValue.indexObjPtr = keyObjPtr; } if (Jim_SubstObj(interp, objPtr->internalRep.dictSubstValue.indexObjPtr, &substKeyObjPtr, JIM_NONE) != JIM_OK) { substKeyObjPtr = NULL; goto err; } Jim_IncrRefCount(substKeyObjPtr); dictObjPtr = Jim_GetVariable(interp, objPtr->internalRep.dictSubstValue.varNameObjPtr, JIM_ERRMSG); if (!dictObjPtr) { resObjPtr = NULL; goto err; } if (Jim_DictKey(interp, dictObjPtr, substKeyObjPtr, &resObjPtr, JIM_ERRMSG) != JIM_OK) { resObjPtr = NULL; goto err; } err: if (substKeyObjPtr) Jim_DecrRefCount(interp, substKeyObjPtr); return resObjPtr; } /* ----------------------------------------------------------------------------- * CallFrame * ---------------------------------------------------------------------------*/ static Jim_CallFrame *JimCreateCallFrame(Jim_Interp *interp) { Jim_CallFrame *cf; if (interp->freeFramesList) { cf = interp->freeFramesList; interp->freeFramesList = cf->nextFramePtr; } else { cf = Jim_Alloc(sizeof(*cf)); cf->vars.table = NULL; } cf->id = interp->callFrameEpoch++; cf->parentCallFrame = NULL; cf->argv = NULL; cf->argc = 0; cf->procArgsObjPtr = NULL; cf->procBodyObjPtr = NULL; cf->nextFramePtr = NULL; cf->staticVars = NULL; if (cf->vars.table == NULL) Jim_InitHashTable(&cf->vars, &JimVariablesHashTableType, interp); return cf; } /* Used to invalidate every caching related to callframe stability. */ static void JimChangeCallFrameId(Jim_Interp *interp, Jim_CallFrame *cf) { cf->id = interp->callFrameEpoch++; } #define JIM_FCF_NONE 0 /* no flags */ #define JIM_FCF_NOHT 1 /* don't free the hash table */ static void JimFreeCallFrame(Jim_Interp *interp, Jim_CallFrame *cf, int flags) { if (cf->procArgsObjPtr) Jim_DecrRefCount(interp, cf->procArgsObjPtr); if (cf->procBodyObjPtr) Jim_DecrRefCount(interp, cf->procBodyObjPtr); if (!(flags & JIM_FCF_NOHT)) Jim_FreeHashTable(&cf->vars); else { int i; Jim_HashEntry **table = cf->vars.table, *he; for (i = 0; i < JIM_HT_INITIAL_SIZE; i++) { he = table[i]; while (he != NULL) { Jim_HashEntry *nextEntry = he->next; Jim_Var *varPtr = (void*) he->val; Jim_DecrRefCount(interp, varPtr->objPtr); Jim_Free(he->val); Jim_Free((void*)he->key); /* ATTENTION: const cast */ Jim_Free(he); table[i] = NULL; he = nextEntry; } } cf->vars.used = 0; } cf->nextFramePtr = interp->freeFramesList; interp->freeFramesList = cf; } /* ----------------------------------------------------------------------------- * References * ---------------------------------------------------------------------------*/ /* References HashTable Type. * * Keys are jim_wide integers, dynamically allocated for now but in the * future it's worth to cache this 8 bytes objects. Values are poitners * to Jim_References. */ static void JimReferencesHTValDestructor(void *interp, void *val) { Jim_Reference *refPtr = (void*) val; Jim_DecrRefCount(interp, refPtr->objPtr); if (refPtr->finalizerCmdNamePtr != NULL) { Jim_DecrRefCount(interp, refPtr->finalizerCmdNamePtr); } Jim_Free(val); } unsigned int JimReferencesHTHashFunction(const void *key) { /* Only the least significant bits are used. */ const jim_wide *widePtr = key; unsigned int intValue = (unsigned int) *widePtr; return Jim_IntHashFunction(intValue); } unsigned int JimReferencesHTDoubleHashFunction(const void *key) { /* Only the least significant bits are used. */ const jim_wide *widePtr = key; unsigned int intValue = (unsigned int) *widePtr; return intValue; /* identity function. */ } const void *JimReferencesHTKeyDup(void *privdata, const void *key) { void *copy = Jim_Alloc(sizeof(jim_wide)); JIM_NOTUSED(privdata); memcpy(copy, key, sizeof(jim_wide)); return copy; } int JimReferencesHTKeyCompare(void *privdata, const void *key1, const void *key2) { JIM_NOTUSED(privdata); return memcmp(key1, key2, sizeof(jim_wide)) == 0; } void JimReferencesHTKeyDestructor(void *privdata, const void *key) { JIM_NOTUSED(privdata); Jim_Free((void*)key); } static Jim_HashTableType JimReferencesHashTableType = { JimReferencesHTHashFunction, /* hash function */ JimReferencesHTKeyDup, /* key dup */ NULL, /* val dup */ JimReferencesHTKeyCompare, /* key compare */ JimReferencesHTKeyDestructor, /* key destructor */ JimReferencesHTValDestructor /* val destructor */ }; /* ----------------------------------------------------------------------------- * Reference object type and References API * ---------------------------------------------------------------------------*/ static void UpdateStringOfReference(struct Jim_Obj *objPtr); static Jim_ObjType referenceObjType = { "reference", NULL, NULL, UpdateStringOfReference, JIM_TYPE_REFERENCES, }; void UpdateStringOfReference(struct Jim_Obj *objPtr) { int len; char buf[JIM_REFERENCE_SPACE + 1]; Jim_Reference *refPtr; refPtr = objPtr->internalRep.refValue.refPtr; len = JimFormatReference(buf, refPtr, objPtr->internalRep.refValue.id); objPtr->bytes = Jim_Alloc(len + 1); memcpy(objPtr->bytes, buf, len + 1); objPtr->length = len; } /* returns true if 'c' is a valid reference tag character. * i.e. inside the range [_a-zA-Z0-9] */ static int isrefchar(int c) { if (c == '_' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) return 1; return 0; } int SetReferenceFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { jim_wide wideValue; int i, len; const char *str, *start, *end; char refId[21]; Jim_Reference *refPtr; Jim_HashEntry *he; /* Get the string representation */ str = Jim_GetString(objPtr, &len); /* Check if it looks like a reference */ if (len < JIM_REFERENCE_SPACE) goto badformat; /* Trim spaces */ start = str; end = str + len-1; while (*start == ' ') start++; while (*end == ' ' && end > start) end--; if (end-start + 1 != JIM_REFERENCE_SPACE) goto badformat; /* .%020> */ if (memcmp(start, "references, &wideValue); if (he == NULL) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "Invalid reference ID \"", str, "\"", NULL); return JIM_ERR; } refPtr = he->val; /* Free the old internal repr and set the new one. */ Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &referenceObjType; objPtr->internalRep.refValue.id = wideValue; objPtr->internalRep.refValue.refPtr = refPtr; return JIM_OK; badformat: Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "expected reference but got \"", str, "\"", NULL); return JIM_ERR; } /* Returns a new reference pointing to objPtr, having cmdNamePtr * as finalizer command (or NULL if there is no finalizer). * The returned reference object has refcount = 0. */ Jim_Obj *Jim_NewReference(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *tagPtr, Jim_Obj *cmdNamePtr) { struct Jim_Reference *refPtr; jim_wide wideValue = interp->referenceNextId; Jim_Obj *refObjPtr; const char *tag; int tagLen, i; /* Perform the Garbage Collection if needed. */ Jim_CollectIfNeeded(interp); refPtr = Jim_Alloc(sizeof(*refPtr)); refPtr->objPtr = objPtr; Jim_IncrRefCount(objPtr); refPtr->finalizerCmdNamePtr = cmdNamePtr; if (cmdNamePtr) Jim_IncrRefCount(cmdNamePtr); Jim_AddHashEntry(&interp->references, &wideValue, refPtr); refObjPtr = Jim_NewObj(interp); refObjPtr->typePtr = &referenceObjType; refObjPtr->bytes = NULL; refObjPtr->internalRep.refValue.id = interp->referenceNextId; refObjPtr->internalRep.refValue.refPtr = refPtr; interp->referenceNextId++; /* Set the tag. Trimmered at JIM_REFERENCE_TAGLEN. Everything * that does not pass the 'isrefchar' test is replaced with '_' */ tag = Jim_GetString(tagPtr, &tagLen); if (tagLen > JIM_REFERENCE_TAGLEN) tagLen = JIM_REFERENCE_TAGLEN; for (i = 0; i < JIM_REFERENCE_TAGLEN; i++) { if (i < tagLen) refPtr->tag[i] = tag[i]; else refPtr->tag[i] = '_'; } refPtr->tag[JIM_REFERENCE_TAGLEN] = '\0'; return refObjPtr; } Jim_Reference *Jim_GetReference(Jim_Interp *interp, Jim_Obj *objPtr) { if (objPtr->typePtr != &referenceObjType && SetReferenceFromAny(interp, objPtr) == JIM_ERR) return NULL; return objPtr->internalRep.refValue.refPtr; } int Jim_SetFinalizer(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *cmdNamePtr) { Jim_Reference *refPtr; if ((refPtr = Jim_GetReference(interp, objPtr)) == NULL) return JIM_ERR; Jim_IncrRefCount(cmdNamePtr); if (refPtr->finalizerCmdNamePtr) Jim_DecrRefCount(interp, refPtr->finalizerCmdNamePtr); refPtr->finalizerCmdNamePtr = cmdNamePtr; return JIM_OK; } int Jim_GetFinalizer(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj **cmdNamePtrPtr) { Jim_Reference *refPtr; if ((refPtr = Jim_GetReference(interp, objPtr)) == NULL) return JIM_ERR; *cmdNamePtrPtr = refPtr->finalizerCmdNamePtr; return JIM_OK; } /* ----------------------------------------------------------------------------- * References Garbage Collection * ---------------------------------------------------------------------------*/ /* This the hash table type for the "MARK" phase of the GC */ static Jim_HashTableType JimRefMarkHashTableType = { JimReferencesHTHashFunction, /* hash function */ JimReferencesHTKeyDup, /* key dup */ NULL, /* val dup */ JimReferencesHTKeyCompare, /* key compare */ JimReferencesHTKeyDestructor, /* key destructor */ NULL /* val destructor */ }; /* #define JIM_DEBUG_GC 1 */ /* Performs the garbage collection. */ int Jim_Collect(Jim_Interp *interp) { Jim_HashTable marks; Jim_HashTableIterator *htiter; Jim_HashEntry *he; Jim_Obj *objPtr; int collected = 0; /* Avoid recursive calls */ if (interp->lastCollectId == -1) { /* Jim_Collect() already running. Return just now. */ return 0; } interp->lastCollectId = -1; /* Mark all the references found into the 'mark' hash table. * The references are searched in every live object that * is of a type that can contain references. */ Jim_InitHashTable(&marks, &JimRefMarkHashTableType, NULL); objPtr = interp->liveList; while (objPtr) { if (objPtr->typePtr == NULL || objPtr->typePtr->flags & JIM_TYPE_REFERENCES) { const char *str, *p; int len; /* If the object is of type reference, to get the * Id is simple... */ if (objPtr->typePtr == &referenceObjType) { Jim_AddHashEntry(&marks, &objPtr->internalRep.refValue.id, NULL); #ifdef JIM_DEBUG_GC Jim_fprintf(interp,interp->cookie_stdout, "MARK (reference): %d refcount: %d" JIM_NL, (int) objPtr->internalRep.refValue.id, objPtr->refCount); #endif objPtr = objPtr->nextObjPtr; continue; } /* Get the string repr of the object we want * to scan for references. */ p = str = Jim_GetString(objPtr, &len); /* Skip objects too little to contain references. */ if (len < JIM_REFERENCE_SPACE) { objPtr = objPtr->nextObjPtr; continue; } /* Extract references from the object string repr. */ while (1) { int i; jim_wide id; char buf[21]; if ((p = strstr(p, "cookie_stdout,"MARK: %d" JIM_NL, (int)id); #endif p += JIM_REFERENCE_SPACE; } } objPtr = objPtr->nextObjPtr; } /* Run the references hash table to destroy every reference that * is not referenced outside (not present in the mark HT). */ htiter = Jim_GetHashTableIterator(&interp->references); while ((he = Jim_NextHashEntry(htiter)) != NULL) { const jim_wide *refId; Jim_Reference *refPtr; refId = he->key; /* Check if in the mark phase we encountered * this reference. */ if (Jim_FindHashEntry(&marks, refId) == NULL) { #ifdef JIM_DEBUG_GC Jim_fprintf(interp,interp->cookie_stdout,"COLLECTING %d" JIM_NL, (int)*refId); #endif collected++; /* Drop the reference, but call the * finalizer first if registered. */ refPtr = he->val; if (refPtr->finalizerCmdNamePtr) { char *refstr = Jim_Alloc(JIM_REFERENCE_SPACE + 1); Jim_Obj *objv[3], *oldResult; JimFormatReference(refstr, refPtr, *refId); objv[0] = refPtr->finalizerCmdNamePtr; objv[1] = Jim_NewStringObjNoAlloc(interp, refstr, 32); objv[2] = refPtr->objPtr; Jim_IncrRefCount(objv[0]); Jim_IncrRefCount(objv[1]); Jim_IncrRefCount(objv[2]); /* Drop the reference itself */ Jim_DeleteHashEntry(&interp->references, refId); /* Call the finalizer. Errors ignored. */ oldResult = interp->result; Jim_IncrRefCount(oldResult); Jim_EvalObjVector(interp, 3, objv); Jim_SetResult(interp, oldResult); Jim_DecrRefCount(interp, oldResult); Jim_DecrRefCount(interp, objv[0]); Jim_DecrRefCount(interp, objv[1]); Jim_DecrRefCount(interp, objv[2]); } else { Jim_DeleteHashEntry(&interp->references, refId); } } } Jim_FreeHashTableIterator(htiter); Jim_FreeHashTable(&marks); interp->lastCollectId = interp->referenceNextId; interp->lastCollectTime = time(NULL); return collected; } #define JIM_COLLECT_ID_PERIOD 5000 #define JIM_COLLECT_TIME_PERIOD 300 void Jim_CollectIfNeeded(Jim_Interp *interp) { jim_wide elapsedId; int elapsedTime; elapsedId = interp->referenceNextId - interp->lastCollectId; elapsedTime = time(NULL) - interp->lastCollectTime; if (elapsedId > JIM_COLLECT_ID_PERIOD || elapsedTime > JIM_COLLECT_TIME_PERIOD) { Jim_Collect(interp); } } /* ----------------------------------------------------------------------------- * Interpreter related functions * ---------------------------------------------------------------------------*/ Jim_Interp *Jim_CreateInterp(void) { Jim_Interp *i = Jim_Alloc(sizeof(*i)); Jim_Obj *pathPtr; i->errorLine = 0; i->errorFileName = Jim_StrDup(""); i->numLevels = 0; i->maxNestingDepth = JIM_MAX_NESTING_DEPTH; i->returnCode = JIM_OK; i->exitCode = 0; i->procEpoch = 0; i->callFrameEpoch = 0; i->liveList = i->freeList = NULL; i->scriptFileName = Jim_StrDup(""); i->referenceNextId = 0; i->lastCollectId = 0; i->lastCollectTime = time(NULL); i->freeFramesList = NULL; i->prngState = NULL; i->evalRetcodeLevel = -1; i->cookie_stdin = stdin; i->cookie_stdout = stdout; i->cookie_stderr = stderr; i->cb_fwrite = ((size_t (*)(const void *, size_t, size_t, void *))(fwrite)); i->cb_fread = ((size_t (*)(void *, size_t, size_t, void *))(fread)); i->cb_vfprintf = ((int (*)(void *, const char *fmt, va_list))(vfprintf)); i->cb_fflush = ((int (*)(void *))(fflush)); i->cb_fgets = ((char * (*)(char *, int, void *))(fgets)); /* Note that we can create objects only after the * interpreter liveList and freeList pointers are * initialized to NULL. */ Jim_InitHashTable(&i->commands, &JimCommandsHashTableType, i); Jim_InitHashTable(&i->references, &JimReferencesHashTableType, i); Jim_InitHashTable(&i->sharedStrings, &JimSharedStringsHashTableType, NULL); Jim_InitHashTable(&i->stub, &JimStringCopyHashTableType, NULL); Jim_InitHashTable(&i->assocData, &JimAssocDataHashTableType, i); Jim_InitHashTable(&i->packages, &JimStringKeyValCopyHashTableType, NULL); i->framePtr = i->topFramePtr = JimCreateCallFrame(i); i->emptyObj = Jim_NewEmptyStringObj(i); i->result = i->emptyObj; i->stackTrace = Jim_NewListObj(i, NULL, 0); i->unknown = Jim_NewStringObj(i, "unknown", -1); i->unknown_called = 0; Jim_IncrRefCount(i->emptyObj); Jim_IncrRefCount(i->result); Jim_IncrRefCount(i->stackTrace); Jim_IncrRefCount(i->unknown); /* Initialize key variables every interpreter should contain */ pathPtr = Jim_NewStringObj(i, "./", -1); Jim_SetVariableStr(i, "jim_libpath", pathPtr); Jim_SetVariableStrWithStr(i, "jim_interactive", "0"); /* Export the core API to extensions */ JimRegisterCoreApi(i); return i; } /* This is the only function Jim exports directly without * to use the STUB system. It is only used by embedders * in order to get an interpreter with the Jim API pointers * registered. */ Jim_Interp *ExportedJimCreateInterp(void) { return Jim_CreateInterp(); } void Jim_FreeInterp(Jim_Interp *i) { Jim_CallFrame *cf = i->framePtr, *prevcf, *nextcf; Jim_Obj *objPtr, *nextObjPtr; Jim_DecrRefCount(i, i->emptyObj); Jim_DecrRefCount(i, i->result); Jim_DecrRefCount(i, i->stackTrace); Jim_DecrRefCount(i, i->unknown); Jim_Free((void*)i->errorFileName); Jim_Free((void*)i->scriptFileName); Jim_FreeHashTable(&i->commands); Jim_FreeHashTable(&i->references); Jim_FreeHashTable(&i->stub); Jim_FreeHashTable(&i->assocData); Jim_FreeHashTable(&i->packages); Jim_Free(i->prngState); /* Free the call frames list */ while (cf) { prevcf = cf->parentCallFrame; JimFreeCallFrame(i, cf, JIM_FCF_NONE); cf = prevcf; } /* Check that the live object list is empty, otherwise * there is a memory leak. */ if (i->liveList != NULL) { Jim_Obj *objPtr = i->liveList; Jim_fprintf(i, i->cookie_stdout,JIM_NL "-------------------------------------" JIM_NL); Jim_fprintf(i, i->cookie_stdout,"Objects still in the free list:" JIM_NL); while (objPtr) { const char *type = objPtr->typePtr ? objPtr->typePtr->name : ""; Jim_fprintf(i, i->cookie_stdout,"%p \"%-10s\": '%.20s' (refCount: %d)" JIM_NL, objPtr, type, objPtr->bytes ? objPtr->bytes : "(null)", objPtr->refCount); if (objPtr->typePtr == &sourceObjType) { Jim_fprintf(i, i->cookie_stdout, "FILE %s LINE %d" JIM_NL, objPtr->internalRep.sourceValue.fileName, objPtr->internalRep.sourceValue.lineNumber); } objPtr = objPtr->nextObjPtr; } Jim_fprintf(i, i->cookie_stdout, "-------------------------------------" JIM_NL JIM_NL); Jim_Panic(i,"Live list non empty freeing the interpreter! Leak?"); } /* Free all the freed objects. */ objPtr = i->freeList; while (objPtr) { nextObjPtr = objPtr->nextObjPtr; Jim_Free(objPtr); objPtr = nextObjPtr; } /* Free cached CallFrame structures */ cf = i->freeFramesList; while (cf) { nextcf = cf->nextFramePtr; if (cf->vars.table != NULL) Jim_Free(cf->vars.table); Jim_Free(cf); cf = nextcf; } /* Free the sharedString hash table. Make sure to free it * after every other Jim_Object was freed. */ Jim_FreeHashTable(&i->sharedStrings); /* Free the interpreter structure. */ Jim_Free(i); } /* Store the call frame relative to the level represented by * levelObjPtr into *framePtrPtr. If levelObjPtr == NULL, the * level is assumed to be '1'. * * If a newLevelptr int pointer is specified, the function stores * the absolute level integer value of the new target callframe into * *newLevelPtr. (this is used to adjust interp->numLevels * in the implementation of [uplevel], so that [info level] will * return a correct information). * * This function accepts the 'level' argument in the form * of the commands [uplevel] and [upvar]. * * For a function accepting a relative integer as level suitable * for implementation of [info level ?level?] check the * GetCallFrameByInteger() function. */ int Jim_GetCallFrameByLevel(Jim_Interp *interp, Jim_Obj *levelObjPtr, Jim_CallFrame **framePtrPtr, int *newLevelPtr) { long level; const char *str; Jim_CallFrame *framePtr; if (newLevelPtr) *newLevelPtr = interp->numLevels; if (levelObjPtr) { str = Jim_GetString(levelObjPtr, NULL); if (str[0] == '#') { char *endptr; /* speedup for the toplevel (level #0) */ if (str[1] == '0' && str[2] == '\0') { if (newLevelPtr) *newLevelPtr = 0; *framePtrPtr = interp->topFramePtr; return JIM_OK; } level = strtol(str + 1, &endptr, 0); if (str[1] == '\0' || endptr[0] != '\0' || level < 0) goto badlevel; /* An 'absolute' level is converted into the * 'number of levels to go back' format. */ level = interp->numLevels - level; if (level < 0) goto badlevel; } else { if (Jim_GetLong(interp, levelObjPtr, &level) != JIM_OK || level < 0) goto badlevel; } } else { str = "1"; /* Needed to format the error message. */ level = 1; } /* Lookup */ framePtr = interp->framePtr; if (newLevelPtr) *newLevelPtr = (*newLevelPtr)-level; while (level--) { framePtr = framePtr->parentCallFrame; if (framePtr == NULL) goto badlevel; } *framePtrPtr = framePtr; return JIM_OK; badlevel: Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "bad level \"", str, "\"", NULL); return JIM_ERR; } /* Similar to Jim_GetCallFrameByLevel() but the level is specified * as a relative integer like in the [info level ?level?] command. */ static int JimGetCallFrameByInteger(Jim_Interp *interp, Jim_Obj *levelObjPtr, Jim_CallFrame **framePtrPtr) { jim_wide level; jim_wide relLevel; /* level relative to the current one. */ Jim_CallFrame *framePtr; if (Jim_GetWide(interp, levelObjPtr, &level) != JIM_OK) goto badlevel; if (level > 0) { /* An 'absolute' level is converted into the * 'number of levels to go back' format. */ relLevel = interp->numLevels - level; } else { relLevel = -level; } /* Lookup */ framePtr = interp->framePtr; while (relLevel--) { framePtr = framePtr->parentCallFrame; if (framePtr == NULL) goto badlevel; } *framePtrPtr = framePtr; return JIM_OK; badlevel: Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "bad level \"", Jim_GetString(levelObjPtr, NULL), "\"", NULL); return JIM_ERR; } static void JimSetErrorFileName(Jim_Interp *interp, char *filename) { Jim_Free((void*)interp->errorFileName); interp->errorFileName = Jim_StrDup(filename); } static void JimSetErrorLineNumber(Jim_Interp *interp, int linenr) { interp->errorLine = linenr; } static void JimResetStackTrace(Jim_Interp *interp) { Jim_DecrRefCount(interp, interp->stackTrace); interp->stackTrace = Jim_NewListObj(interp, NULL, 0); Jim_IncrRefCount(interp->stackTrace); } static void JimAppendStackTrace(Jim_Interp *interp, const char *procname, const char *filename, int linenr) { /* No need to add this dummy entry to the stack trace */ if (strcmp(procname, "unknown") == 0) { return; } if (Jim_IsShared(interp->stackTrace)) { interp->stackTrace = Jim_DuplicateObj(interp, interp->stackTrace); Jim_IncrRefCount(interp->stackTrace); } Jim_ListAppendElement(interp, interp->stackTrace, Jim_NewStringObj(interp, procname, -1)); Jim_ListAppendElement(interp, interp->stackTrace, Jim_NewStringObj(interp, filename, -1)); Jim_ListAppendElement(interp, interp->stackTrace, Jim_NewIntObj(interp, linenr)); } int Jim_SetAssocData(Jim_Interp *interp, const char *key, Jim_InterpDeleteProc *delProc, void *data) { AssocDataValue *assocEntryPtr = (AssocDataValue *)Jim_Alloc(sizeof(AssocDataValue)); assocEntryPtr->delProc = delProc; assocEntryPtr->data = data; return Jim_AddHashEntry(&interp->assocData, key, assocEntryPtr); } void *Jim_GetAssocData(Jim_Interp *interp, const char *key) { Jim_HashEntry *entryPtr = Jim_FindHashEntry(&interp->assocData, key); if (entryPtr != NULL) { AssocDataValue *assocEntryPtr = (AssocDataValue *)entryPtr->val; return assocEntryPtr->data; } return NULL; } int Jim_DeleteAssocData(Jim_Interp *interp, const char *key) { return Jim_DeleteHashEntry(&interp->assocData, key); } int Jim_GetExitCode(Jim_Interp *interp) { return interp->exitCode; } void *Jim_SetStdin(Jim_Interp *interp, void *fp) { if (fp != NULL) interp->cookie_stdin = fp; return interp->cookie_stdin; } void *Jim_SetStdout(Jim_Interp *interp, void *fp) { if (fp != NULL) interp->cookie_stdout = fp; return interp->cookie_stdout; } void *Jim_SetStderr(Jim_Interp *interp, void *fp) { if (fp != NULL) interp->cookie_stderr = fp; return interp->cookie_stderr; } /* ----------------------------------------------------------------------------- * Shared strings. * Every interpreter has an hash table where to put shared dynamically * allocate strings that are likely to be used a lot of times. * For example, in the 'source' object type, there is a pointer to * the filename associated with that object. Every script has a lot * of this objects with the identical file name, so it is wise to share * this info. * * The API is trivial: Jim_GetSharedString(interp, "foobar") * returns the pointer to the shared string. Every time a reference * to the string is no longer used, the user should call * Jim_ReleaseSharedString(interp, stringPointer). Once no one is using * a given string, it is removed from the hash table. * ---------------------------------------------------------------------------*/ const char *Jim_GetSharedString(Jim_Interp *interp, const char *str) { Jim_HashEntry *he = Jim_FindHashEntry(&interp->sharedStrings, str); if (he == NULL) { char *strCopy = Jim_StrDup(str); Jim_AddHashEntry(&interp->sharedStrings, strCopy, (void*)1); return strCopy; } else { intptr_t refCount = (intptr_t) he->val; refCount++; he->val = (void*) refCount; return he->key; } } void Jim_ReleaseSharedString(Jim_Interp *interp, const char *str) { intptr_t refCount; Jim_HashEntry *he = Jim_FindHashEntry(&interp->sharedStrings, str); if (he == NULL) Jim_Panic(interp,"Jim_ReleaseSharedString called with " "unknown shared string '%s'", str); refCount = (intptr_t) he->val; refCount--; if (refCount == 0) { Jim_DeleteHashEntry(&interp->sharedStrings, str); } else { he->val = (void*) refCount; } } /* ----------------------------------------------------------------------------- * Integer object * ---------------------------------------------------------------------------*/ #define JIM_INTEGER_SPACE 24 static void UpdateStringOfInt(struct Jim_Obj *objPtr); static int SetIntFromAny(Jim_Interp *interp, Jim_Obj *objPtr, int flags); static Jim_ObjType intObjType = { "int", NULL, NULL, UpdateStringOfInt, JIM_TYPE_NONE, }; void UpdateStringOfInt(struct Jim_Obj *objPtr) { int len; char buf[JIM_INTEGER_SPACE + 1]; len = Jim_WideToString(buf, objPtr->internalRep.wideValue); objPtr->bytes = Jim_Alloc(len + 1); memcpy(objPtr->bytes, buf, len + 1); objPtr->length = len; } int SetIntFromAny(Jim_Interp *interp, Jim_Obj *objPtr, int flags) { jim_wide wideValue; const char *str; /* Get the string representation */ str = Jim_GetString(objPtr, NULL); /* Try to convert into a jim_wide */ if (Jim_StringToWide(str, &wideValue, 0) != JIM_OK) { if (flags & JIM_ERRMSG) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "expected integer but got \"", str, "\"", NULL); } return JIM_ERR; } if ((wideValue == JIM_WIDE_MIN || wideValue == JIM_WIDE_MAX) && errno == ERANGE) { Jim_SetResultString(interp, "Integer value too big to be represented", -1); return JIM_ERR; } /* Free the old internal repr and set the new one. */ Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &intObjType; objPtr->internalRep.wideValue = wideValue; return JIM_OK; } int Jim_GetWide(Jim_Interp *interp, Jim_Obj *objPtr, jim_wide *widePtr) { if (objPtr->typePtr != &intObjType && SetIntFromAny(interp, objPtr, JIM_ERRMSG) == JIM_ERR) return JIM_ERR; *widePtr = objPtr->internalRep.wideValue; return JIM_OK; } /* Get a wide but does not set an error if the format is bad. */ static int JimGetWideNoErr(Jim_Interp *interp, Jim_Obj *objPtr, jim_wide *widePtr) { if (objPtr->typePtr != &intObjType && SetIntFromAny(interp, objPtr, JIM_NONE) == JIM_ERR) return JIM_ERR; *widePtr = objPtr->internalRep.wideValue; return JIM_OK; } int Jim_GetLong(Jim_Interp *interp, Jim_Obj *objPtr, long *longPtr) { jim_wide wideValue; int retval; retval = Jim_GetWide(interp, objPtr, &wideValue); if (retval == JIM_OK) { *longPtr = (long) wideValue; return JIM_OK; } return JIM_ERR; } void Jim_SetWide(Jim_Interp *interp, Jim_Obj *objPtr, jim_wide wideValue) { if (Jim_IsShared(objPtr)) Jim_Panic(interp,"Jim_SetWide called with shared object"); if (objPtr->typePtr != &intObjType) { Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &intObjType; } Jim_InvalidateStringRep(objPtr); objPtr->internalRep.wideValue = wideValue; } Jim_Obj *Jim_NewIntObj(Jim_Interp *interp, jim_wide wideValue) { Jim_Obj *objPtr; objPtr = Jim_NewObj(interp); objPtr->typePtr = &intObjType; objPtr->bytes = NULL; objPtr->internalRep.wideValue = wideValue; return objPtr; } /* ----------------------------------------------------------------------------- * Double object * ---------------------------------------------------------------------------*/ #define JIM_DOUBLE_SPACE 30 static void UpdateStringOfDouble(struct Jim_Obj *objPtr); static int SetDoubleFromAny(Jim_Interp *interp, Jim_Obj *objPtr); static Jim_ObjType doubleObjType = { "double", NULL, NULL, UpdateStringOfDouble, JIM_TYPE_NONE, }; void UpdateStringOfDouble(struct Jim_Obj *objPtr) { int len; char buf[JIM_DOUBLE_SPACE + 1]; len = Jim_DoubleToString(buf, objPtr->internalRep.doubleValue); objPtr->bytes = Jim_Alloc(len + 1); memcpy(objPtr->bytes, buf, len + 1); objPtr->length = len; } int SetDoubleFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { double doubleValue; const char *str; /* Get the string representation */ str = Jim_GetString(objPtr, NULL); /* Try to convert into a double */ if (Jim_StringToDouble(str, &doubleValue) != JIM_OK) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "expected number but got '", str, "'", NULL); return JIM_ERR; } /* Free the old internal repr and set the new one. */ Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &doubleObjType; objPtr->internalRep.doubleValue = doubleValue; return JIM_OK; } int Jim_GetDouble(Jim_Interp *interp, Jim_Obj *objPtr, double *doublePtr) { if (objPtr->typePtr != &doubleObjType && SetDoubleFromAny(interp, objPtr) == JIM_ERR) return JIM_ERR; *doublePtr = objPtr->internalRep.doubleValue; return JIM_OK; } void Jim_SetDouble(Jim_Interp *interp, Jim_Obj *objPtr, double doubleValue) { if (Jim_IsShared(objPtr)) Jim_Panic(interp,"Jim_SetDouble called with shared object"); if (objPtr->typePtr != &doubleObjType) { Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &doubleObjType; } Jim_InvalidateStringRep(objPtr); objPtr->internalRep.doubleValue = doubleValue; } Jim_Obj *Jim_NewDoubleObj(Jim_Interp *interp, double doubleValue) { Jim_Obj *objPtr; objPtr = Jim_NewObj(interp); objPtr->typePtr = &doubleObjType; objPtr->bytes = NULL; objPtr->internalRep.doubleValue = doubleValue; return objPtr; } /* ----------------------------------------------------------------------------- * List object * ---------------------------------------------------------------------------*/ static void ListAppendElement(Jim_Obj *listPtr, Jim_Obj *objPtr); static void FreeListInternalRep(Jim_Interp *interp, Jim_Obj *objPtr); static void DupListInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static void UpdateStringOfList(struct Jim_Obj *objPtr); static int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr); /* Note that while the elements of the list may contain references, * the list object itself can't. This basically means that the * list object string representation as a whole can't contain references * that are not presents in the single elements. */ static Jim_ObjType listObjType = { "list", FreeListInternalRep, DupListInternalRep, UpdateStringOfList, JIM_TYPE_NONE, }; void FreeListInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { int i; for (i = 0; i < objPtr->internalRep.listValue.len; i++) { Jim_DecrRefCount(interp, objPtr->internalRep.listValue.ele[i]); } Jim_Free(objPtr->internalRep.listValue.ele); } void DupListInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { int i; JIM_NOTUSED(interp); dupPtr->internalRep.listValue.len = srcPtr->internalRep.listValue.len; dupPtr->internalRep.listValue.maxLen = srcPtr->internalRep.listValue.maxLen; dupPtr->internalRep.listValue.ele = Jim_Alloc(sizeof(Jim_Obj*)*srcPtr->internalRep.listValue.maxLen); memcpy(dupPtr->internalRep.listValue.ele, srcPtr->internalRep.listValue.ele, sizeof(Jim_Obj*)*srcPtr->internalRep.listValue.len); for (i = 0; i < dupPtr->internalRep.listValue.len; i++) { Jim_IncrRefCount(dupPtr->internalRep.listValue.ele[i]); } dupPtr->typePtr = &listObjType; } /* The following function checks if a given string can be encoded * into a list element without any kind of quoting, surrounded by braces, * or using escapes to quote. */ #define JIM_ELESTR_SIMPLE 0 #define JIM_ELESTR_BRACE 1 #define JIM_ELESTR_QUOTE 2 static int ListElementQuotingType(const char *s, int len) { int i, level, trySimple = 1; /* Try with the SIMPLE case */ if (len == 0) return JIM_ELESTR_BRACE; if (s[0] == '"' || s[0] == '{') { trySimple = 0; goto testbrace; } for (i = 0; i < len; i++) { switch (s[i]) { case ' ': case '$': case '"': case '[': case ']': case ';': case '\\': case '\r': case '\n': case '\t': case '\f': case '\v': trySimple = 0; case '{': case '}': goto testbrace; } } return JIM_ELESTR_SIMPLE; testbrace: /* Test if it's possible to do with braces */ if (s[len-1] == '\\' || s[len-1] == ']') return JIM_ELESTR_QUOTE; level = 0; for (i = 0; i < len; i++) { switch (s[i]) { case '{': level++; break; case '}': level--; if (level < 0) return JIM_ELESTR_QUOTE; break; case '\\': if (s[i + 1] == '\n') return JIM_ELESTR_QUOTE; else if (s[i + 1] != '\0') i++; break; } } if (level == 0) { if (!trySimple) return JIM_ELESTR_BRACE; for (i = 0; i < len; i++) { switch (s[i]) { case ' ': case '$': case '"': case '[': case ']': case ';': case '\\': case '\r': case '\n': case '\t': case '\f': case '\v': return JIM_ELESTR_BRACE; break; } } return JIM_ELESTR_SIMPLE; } return JIM_ELESTR_QUOTE; } /* Returns the malloc-ed representation of a string * using backslash to quote special chars. */ char *BackslashQuoteString(const char *s, int len, int *qlenPtr) { char *q = Jim_Alloc(len*2 + 1), *p; p = q; while (*s) { switch (*s) { case ' ': case '$': case '"': case '[': case ']': case '{': case '}': case ';': case '\\': *p++ = '\\'; *p++ = *s++; break; case '\n': *p++ = '\\'; *p++ = 'n'; s++; break; case '\r': *p++ = '\\'; *p++ = 'r'; s++; break; case '\t': *p++ = '\\'; *p++ = 't'; s++; break; case '\f': *p++ = '\\'; *p++ = 'f'; s++; break; case '\v': *p++ = '\\'; *p++ = 'v'; s++; break; default: *p++ = *s++; break; } } *p = '\0'; *qlenPtr = p-q; return q; } void UpdateStringOfList(struct Jim_Obj *objPtr) { int i, bufLen, realLength; const char *strRep; char *p; int *quotingType; Jim_Obj **ele = objPtr->internalRep.listValue.ele; /* (Over) Estimate the space needed. */ quotingType = Jim_Alloc(sizeof(int)*objPtr->internalRep.listValue.len + 1); bufLen = 0; for (i = 0; i < objPtr->internalRep.listValue.len; i++) { int len; strRep = Jim_GetString(ele[i], &len); quotingType[i] = ListElementQuotingType(strRep, len); switch (quotingType[i]) { case JIM_ELESTR_SIMPLE: bufLen += len; break; case JIM_ELESTR_BRACE: bufLen += len + 2; break; case JIM_ELESTR_QUOTE: bufLen += len*2; break; } bufLen++; /* elements separator. */ } bufLen++; /* Generate the string rep. */ p = objPtr->bytes = Jim_Alloc(bufLen + 1); realLength = 0; for (i = 0; i < objPtr->internalRep.listValue.len; i++) { int len, qlen; const char *strRep = Jim_GetString(ele[i], &len); char *q; switch (quotingType[i]) { case JIM_ELESTR_SIMPLE: memcpy(p, strRep, len); p += len; realLength += len; break; case JIM_ELESTR_BRACE: *p++ = '{'; memcpy(p, strRep, len); p += len; *p++ = '}'; realLength += len + 2; break; case JIM_ELESTR_QUOTE: q = BackslashQuoteString(strRep, len, &qlen); memcpy(p, q, qlen); Jim_Free(q); p += qlen; realLength += qlen; break; } /* Add a separating space */ if (i + 1 != objPtr->internalRep.listValue.len) { *p++ = ' '; realLength ++; } } *p = '\0'; /* nul term. */ objPtr->length = realLength; Jim_Free(quotingType); } int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) { struct JimParserCtx parser; const char *str; int strLen; /* Get the string representation */ str = Jim_GetString(objPtr, &strLen); /* Free the old internal repr just now and initialize the * new one just now. The string->list conversion can't fail. */ Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &listObjType; objPtr->internalRep.listValue.len = 0; objPtr->internalRep.listValue.maxLen = 0; objPtr->internalRep.listValue.ele = NULL; /* Convert into a list */ JimParserInit(&parser, str, strLen, 1); while (!JimParserEof(&parser)) { char *token; int tokenLen, type; Jim_Obj *elementPtr; JimParseList(&parser); if (JimParserTtype(&parser) != JIM_TT_STR && JimParserTtype(&parser) != JIM_TT_ESC) continue; token = JimParserGetToken(&parser, &tokenLen, &type, NULL); elementPtr = Jim_NewStringObjNoAlloc(interp, token, tokenLen); ListAppendElement(objPtr, elementPtr); } return JIM_OK; } Jim_Obj *Jim_NewListObj(Jim_Interp *interp, Jim_Obj *const *elements, int len) { Jim_Obj *objPtr; int i; objPtr = Jim_NewObj(interp); objPtr->typePtr = &listObjType; objPtr->bytes = NULL; objPtr->internalRep.listValue.ele = NULL; objPtr->internalRep.listValue.len = 0; objPtr->internalRep.listValue.maxLen = 0; for (i = 0; i < len; i++) { ListAppendElement(objPtr, elements[i]); } return objPtr; } /* Return a vector of Jim_Obj with the elements of a Jim list, and the * length of the vector. Note that the user of this function should make * sure that the list object can't shimmer while the vector returned * is in use, this vector is the one stored inside the internal representation * of the list object. This function is not exported, extensions should * always access to the List object elements using Jim_ListIndex(). */ static void JimListGetElements(Jim_Interp *interp, Jim_Obj *listObj, int *argc, Jim_Obj ***listVec) { Jim_ListLength(interp, listObj, argc); assert(listObj->typePtr == &listObjType); *listVec = listObj->internalRep.listValue.ele; } /* ListSortElements type values */ enum {JIM_LSORT_ASCII, JIM_LSORT_NOCASE, JIM_LSORT_ASCII_DECR, JIM_LSORT_NOCASE_DECR}; /* Sort the internal rep of a list. */ static int ListSortString(Jim_Obj **lhsObj, Jim_Obj **rhsObj) { return Jim_StringCompareObj(*lhsObj, *rhsObj, 0); } static int ListSortStringDecr(Jim_Obj **lhsObj, Jim_Obj **rhsObj) { return Jim_StringCompareObj(*lhsObj, *rhsObj, 0) * -1; } static int ListSortStringNoCase(Jim_Obj **lhsObj, Jim_Obj **rhsObj) { return Jim_StringCompareObj(*lhsObj, *rhsObj, 1); } static int ListSortStringNoCaseDecr(Jim_Obj **lhsObj, Jim_Obj **rhsObj) { return Jim_StringCompareObj(*lhsObj, *rhsObj, 1) * -1; } /* Sort a list *in place*. MUST be called with non-shared objects. */ static void ListSortElements(Jim_Interp *interp, Jim_Obj *listObjPtr, int type) { typedef int (qsort_comparator)(const void *, const void *); int (*fn)(Jim_Obj**, Jim_Obj**); Jim_Obj **vector; int len; if (Jim_IsShared(listObjPtr)) Jim_Panic(interp,"Jim_ListSortElements called with shared object"); if (listObjPtr->typePtr != &listObjType) SetListFromAny(interp, listObjPtr); vector = listObjPtr->internalRep.listValue.ele; len = listObjPtr->internalRep.listValue.len; switch (type) { case JIM_LSORT_ASCII: fn = ListSortString; break; case JIM_LSORT_NOCASE: fn = ListSortStringNoCase; break; case JIM_LSORT_ASCII_DECR: fn = ListSortStringDecr; break; case JIM_LSORT_NOCASE_DECR: fn = ListSortStringNoCaseDecr; break; default: fn = NULL; /* avoid warning */ Jim_Panic(interp,"ListSort called with invalid sort type"); } qsort(vector, len, sizeof(Jim_Obj *), (qsort_comparator *)fn); Jim_InvalidateStringRep(listObjPtr); } /* This is the low-level function to append an element to a list. * The higher-level Jim_ListAppendElement() performs shared object * check and invalidate the string repr. This version is used * in the internals of the List Object and is not exported. * * NOTE: this function can be called only against objects * with internal type of List. */ void ListAppendElement(Jim_Obj *listPtr, Jim_Obj *objPtr) { int requiredLen = listPtr->internalRep.listValue.len + 1; if (requiredLen > listPtr->internalRep.listValue.maxLen) { int maxLen = requiredLen * 2; listPtr->internalRep.listValue.ele = Jim_Realloc(listPtr->internalRep.listValue.ele, sizeof(Jim_Obj*)*maxLen); listPtr->internalRep.listValue.maxLen = maxLen; } listPtr->internalRep.listValue.ele[listPtr->internalRep.listValue.len] = objPtr; listPtr->internalRep.listValue.len ++; Jim_IncrRefCount(objPtr); } /* This is the low-level function to insert elements into a list. * The higher-level Jim_ListInsertElements() performs shared object * check and invalidate the string repr. This version is used * in the internals of the List Object and is not exported. * * NOTE: this function can be called only against objects * with internal type of List. */ void ListInsertElements(Jim_Obj *listPtr, int index, int elemc, Jim_Obj *const *elemVec) { int currentLen = listPtr->internalRep.listValue.len; int requiredLen = currentLen + elemc; int i; Jim_Obj **point; if (requiredLen > listPtr->internalRep.listValue.maxLen) { int maxLen = requiredLen * 2; listPtr->internalRep.listValue.ele = Jim_Realloc(listPtr->internalRep.listValue.ele, sizeof(Jim_Obj*)*maxLen); listPtr->internalRep.listValue.maxLen = maxLen; } point = listPtr->internalRep.listValue.ele + index; memmove(point + elemc, point, (currentLen-index) * sizeof(Jim_Obj*)); for (i = 0; i < elemc; ++i) { point[i] = elemVec[i]; Jim_IncrRefCount(point[i]); } listPtr->internalRep.listValue.len += elemc; } /* Appends every element of appendListPtr into listPtr. * Both have to be of the list type. */ void ListAppendList(Jim_Obj *listPtr, Jim_Obj *appendListPtr) { int i, oldLen = listPtr->internalRep.listValue.len; int appendLen = appendListPtr->internalRep.listValue.len; int requiredLen = oldLen + appendLen; if (requiredLen > listPtr->internalRep.listValue.maxLen) { int maxLen = requiredLen * 2; listPtr->internalRep.listValue.ele = Jim_Realloc(listPtr->internalRep.listValue.ele, sizeof(Jim_Obj*)*maxLen); listPtr->internalRep.listValue.maxLen = maxLen; } for (i = 0; i < appendLen; i++) { Jim_Obj *objPtr = appendListPtr->internalRep.listValue.ele[i]; listPtr->internalRep.listValue.ele[oldLen + i] = objPtr; Jim_IncrRefCount(objPtr); } listPtr->internalRep.listValue.len += appendLen; } void Jim_ListAppendElement(Jim_Interp *interp, Jim_Obj *listPtr, Jim_Obj *objPtr) { if (Jim_IsShared(listPtr)) Jim_Panic(interp,"Jim_ListAppendElement called with shared object"); if (listPtr->typePtr != &listObjType) SetListFromAny(interp, listPtr); Jim_InvalidateStringRep(listPtr); ListAppendElement(listPtr, objPtr); } void Jim_ListAppendList(Jim_Interp *interp, Jim_Obj *listPtr, Jim_Obj *appendListPtr) { if (Jim_IsShared(listPtr)) Jim_Panic(interp,"Jim_ListAppendList called with shared object"); if (listPtr->typePtr != &listObjType) SetListFromAny(interp, listPtr); Jim_InvalidateStringRep(listPtr); ListAppendList(listPtr, appendListPtr); } void Jim_ListLength(Jim_Interp *interp, Jim_Obj *listPtr, int *intPtr) { if (listPtr->typePtr != &listObjType) SetListFromAny(interp, listPtr); *intPtr = listPtr->internalRep.listValue.len; } void Jim_ListInsertElements(Jim_Interp *interp, Jim_Obj *listPtr, int index, int objc, Jim_Obj *const *objVec) { if (Jim_IsShared(listPtr)) Jim_Panic(interp,"Jim_ListInsertElement called with shared object"); if (listPtr->typePtr != &listObjType) SetListFromAny(interp, listPtr); if (index >= 0 && index > listPtr->internalRep.listValue.len) index = listPtr->internalRep.listValue.len; else if (index < 0) index = 0; Jim_InvalidateStringRep(listPtr); ListInsertElements(listPtr, index, objc, objVec); } int Jim_ListIndex(Jim_Interp *interp, Jim_Obj *listPtr, int index, Jim_Obj **objPtrPtr, int flags) { if (listPtr->typePtr != &listObjType) SetListFromAny(interp, listPtr); if ((index >= 0 && index >= listPtr->internalRep.listValue.len) || (index < 0 && (-index-1) >= listPtr->internalRep.listValue.len)) { if (flags & JIM_ERRMSG) { Jim_SetResultString(interp, "list index out of range", -1); } return JIM_ERR; } if (index < 0) index = listPtr->internalRep.listValue.len + index; *objPtrPtr = listPtr->internalRep.listValue.ele[index]; return JIM_OK; } static int ListSetIndex(Jim_Interp *interp, Jim_Obj *listPtr, int index, Jim_Obj *newObjPtr, int flags) { if (listPtr->typePtr != &listObjType) SetListFromAny(interp, listPtr); if ((index >= 0 && index >= listPtr->internalRep.listValue.len) || (index < 0 && (-index-1) >= listPtr->internalRep.listValue.len)) { if (flags & JIM_ERRMSG) { Jim_SetResultString(interp, "list index out of range", -1); } return JIM_ERR; } if (index < 0) index = listPtr->internalRep.listValue.len + index; Jim_DecrRefCount(interp, listPtr->internalRep.listValue.ele[index]); listPtr->internalRep.listValue.ele[index] = newObjPtr; Jim_IncrRefCount(newObjPtr); return JIM_OK; } /* Modify the list stored into the variable named 'varNamePtr' * setting the element specified by the 'indexc' indexes objects in 'indexv', * with the new element 'newObjptr'. */ int Jim_SetListIndex(Jim_Interp *interp, Jim_Obj *varNamePtr, Jim_Obj *const *indexv, int indexc, Jim_Obj *newObjPtr) { Jim_Obj *varObjPtr, *objPtr, *listObjPtr; int shared, i, index; varObjPtr = objPtr = Jim_GetVariable(interp, varNamePtr, JIM_ERRMSG); if (objPtr == NULL) return JIM_ERR; if ((shared = Jim_IsShared(objPtr))) varObjPtr = objPtr = Jim_DuplicateObj(interp, objPtr); for (i = 0; i < indexc-1; i++) { listObjPtr = objPtr; if (Jim_GetIndex(interp, indexv[i], &index) != JIM_OK) goto err; if (Jim_ListIndex(interp, listObjPtr, index, &objPtr, JIM_ERRMSG) != JIM_OK) { goto err; } if (Jim_IsShared(objPtr)) { objPtr = Jim_DuplicateObj(interp, objPtr); ListSetIndex(interp, listObjPtr, index, objPtr, JIM_NONE); } Jim_InvalidateStringRep(listObjPtr); } if (Jim_GetIndex(interp, indexv[indexc-1], &index) != JIM_OK) goto err; if (ListSetIndex(interp, objPtr, index, newObjPtr, JIM_ERRMSG) == JIM_ERR) goto err; Jim_InvalidateStringRep(objPtr); Jim_InvalidateStringRep(varObjPtr); if (Jim_SetVariable(interp, varNamePtr, varObjPtr) != JIM_OK) goto err; Jim_SetResult(interp, varObjPtr); return JIM_OK; err: if (shared) { Jim_FreeNewObj(interp, varObjPtr); } return JIM_ERR; } Jim_Obj *Jim_ConcatObj(Jim_Interp *interp, int objc, Jim_Obj *const *objv) { int i; /* If all the objects in objv are lists without string rep. * it's possible to return a list as result, that's the * concatenation of all the lists. */ for (i = 0; i < objc; i++) { if (objv[i]->typePtr != &listObjType || objv[i]->bytes) break; } if (i == objc) { Jim_Obj *objPtr = Jim_NewListObj(interp, NULL, 0); for (i = 0; i < objc; i++) Jim_ListAppendList(interp, objPtr, objv[i]); return objPtr; } else { /* Else... we have to glue strings together */ int len = 0, objLen; char *bytes, *p; /* Compute the length */ for (i = 0; i < objc; i++) { Jim_GetString(objv[i], &objLen); len += objLen; } if (objc) len += objc-1; /* Create the string rep, and a stinrg object holding it. */ p = bytes = Jim_Alloc(len + 1); for (i = 0; i < objc; i++) { const char *s = Jim_GetString(objv[i], &objLen); while (objLen && (*s == ' ' || *s == '\t' || *s == '\n')) { s++; objLen--; len--; } while (objLen && (s[objLen-1] == ' ' || s[objLen-1] == '\n' || s[objLen-1] == '\t')) { objLen--; len--; } memcpy(p, s, objLen); p += objLen; if (objLen && i + 1 != objc) { *p++ = ' '; } else if (i + 1 != objc) { /* Drop the space calcuated for this * element that is instead null. */ len--; } } *p = '\0'; return Jim_NewStringObjNoAlloc(interp, bytes, len); } } /* Returns a list composed of the elements in the specified range. * first and start are directly accepted as Jim_Objects and * processed for the end?-index? case. */ Jim_Obj *Jim_ListRange(Jim_Interp *interp, Jim_Obj *listObjPtr, Jim_Obj *firstObjPtr, Jim_Obj *lastObjPtr) { int first, last; int len, rangeLen; if (Jim_GetIndex(interp, firstObjPtr, &first) != JIM_OK || Jim_GetIndex(interp, lastObjPtr, &last) != JIM_OK) return NULL; Jim_ListLength(interp, listObjPtr, &len); /* will convert into list */ first = JimRelToAbsIndex(len, first); last = JimRelToAbsIndex(len, last); JimRelToAbsRange(len, first, last, &first, &last, &rangeLen); return Jim_NewListObj(interp, listObjPtr->internalRep.listValue.ele + first, rangeLen); } /* ----------------------------------------------------------------------------- * Dict object * ---------------------------------------------------------------------------*/ static void FreeDictInternalRep(Jim_Interp *interp, Jim_Obj *objPtr); static void DupDictInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static void UpdateStringOfDict(struct Jim_Obj *objPtr); static int SetDictFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr); /* Dict HashTable Type. * * Keys and Values are Jim objects. */ unsigned int JimObjectHTHashFunction(const void *key) { const char *str; Jim_Obj *objPtr = (Jim_Obj*) key; int len, h; str = Jim_GetString(objPtr, &len); h = Jim_GenHashFunction((unsigned char*)str, len); return h; } int JimObjectHTKeyCompare(void *privdata, const void *key1, const void *key2) { JIM_NOTUSED(privdata); return Jim_StringEqObj((Jim_Obj*)key1, (Jim_Obj*)key2, 0); } static void JimObjectHTKeyValDestructor(void *interp, void *val) { Jim_Obj *objPtr = val; Jim_DecrRefCount(interp, objPtr); } static Jim_HashTableType JimDictHashTableType = { JimObjectHTHashFunction, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ JimObjectHTKeyCompare, /* key compare */ (void(*)(void*, const void*)) /* ATTENTION: const cast */ JimObjectHTKeyValDestructor, /* key destructor */ JimObjectHTKeyValDestructor /* val destructor */ }; /* Note that while the elements of the dict may contain references, * the list object itself can't. This basically means that the * dict object string representation as a whole can't contain references * that are not presents in the single elements. */ static Jim_ObjType dictObjType = { "dict", FreeDictInternalRep, DupDictInternalRep, UpdateStringOfDict, JIM_TYPE_NONE, }; void FreeDictInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { JIM_NOTUSED(interp); Jim_FreeHashTable(objPtr->internalRep.ptr); Jim_Free(objPtr->internalRep.ptr); } void DupDictInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { Jim_HashTable *ht, *dupHt; Jim_HashTableIterator *htiter; Jim_HashEntry *he; /* Create a new hash table */ ht = srcPtr->internalRep.ptr; dupHt = Jim_Alloc(sizeof(*dupHt)); Jim_InitHashTable(dupHt, &JimDictHashTableType, interp); if (ht->size != 0) Jim_ExpandHashTable(dupHt, ht->size); /* Copy every element from the source to the dup hash table */ htiter = Jim_GetHashTableIterator(ht); while ((he = Jim_NextHashEntry(htiter)) != NULL) { const Jim_Obj *keyObjPtr = he->key; Jim_Obj *valObjPtr = he->val; Jim_IncrRefCount((Jim_Obj*)keyObjPtr); /* ATTENTION: const cast */ Jim_IncrRefCount(valObjPtr); Jim_AddHashEntry(dupHt, keyObjPtr, valObjPtr); } Jim_FreeHashTableIterator(htiter); dupPtr->internalRep.ptr = dupHt; dupPtr->typePtr = &dictObjType; } void UpdateStringOfDict(struct Jim_Obj *objPtr) { int i, bufLen, realLength; const char *strRep; char *p; int *quotingType, objc; Jim_HashTable *ht; Jim_HashTableIterator *htiter; Jim_HashEntry *he; Jim_Obj **objv; /* Trun the hash table into a flat vector of Jim_Objects. */ ht = objPtr->internalRep.ptr; objc = ht->used*2; objv = Jim_Alloc(objc*sizeof(Jim_Obj*)); htiter = Jim_GetHashTableIterator(ht); i = 0; while ((he = Jim_NextHashEntry(htiter)) != NULL) { objv[i++] = (Jim_Obj*)he->key; /* ATTENTION: const cast */ objv[i++] = he->val; } Jim_FreeHashTableIterator(htiter); /* (Over) Estimate the space needed. */ quotingType = Jim_Alloc(sizeof(int)*objc); bufLen = 0; for (i = 0; i < objc; i++) { int len; strRep = Jim_GetString(objv[i], &len); quotingType[i] = ListElementQuotingType(strRep, len); switch (quotingType[i]) { case JIM_ELESTR_SIMPLE: bufLen += len; break; case JIM_ELESTR_BRACE: bufLen += len + 2; break; case JIM_ELESTR_QUOTE: bufLen += len*2; break; } bufLen++; /* elements separator. */ } bufLen++; /* Generate the string rep. */ p = objPtr->bytes = Jim_Alloc(bufLen + 1); realLength = 0; for (i = 0; i < objc; i++) { int len, qlen; const char *strRep = Jim_GetString(objv[i], &len); char *q; switch (quotingType[i]) { case JIM_ELESTR_SIMPLE: memcpy(p, strRep, len); p += len; realLength += len; break; case JIM_ELESTR_BRACE: *p++ = '{'; memcpy(p, strRep, len); p += len; *p++ = '}'; realLength += len + 2; break; case JIM_ELESTR_QUOTE: q = BackslashQuoteString(strRep, len, &qlen); memcpy(p, q, qlen); Jim_Free(q); p += qlen; realLength += qlen; break; } /* Add a separating space */ if (i + 1 != objc) { *p++ = ' '; realLength ++; } } *p = '\0'; /* nul term. */ objPtr->length = realLength; Jim_Free(quotingType); Jim_Free(objv); } int SetDictFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) { struct JimParserCtx parser; Jim_HashTable *ht; Jim_Obj *objv[2]; const char *str; int i, strLen; /* Get the string representation */ str = Jim_GetString(objPtr, &strLen); /* Free the old internal repr just now and initialize the * new one just now. The string->list conversion can't fail. */ Jim_FreeIntRep(interp, objPtr); ht = Jim_Alloc(sizeof(*ht)); Jim_InitHashTable(ht, &JimDictHashTableType, interp); objPtr->typePtr = &dictObjType; objPtr->internalRep.ptr = ht; /* Convert into a dict */ JimParserInit(&parser, str, strLen, 1); i = 0; while (!JimParserEof(&parser)) { char *token; int tokenLen, type; JimParseList(&parser); if (JimParserTtype(&parser) != JIM_TT_STR && JimParserTtype(&parser) != JIM_TT_ESC) continue; token = JimParserGetToken(&parser, &tokenLen, &type, NULL); objv[i++] = Jim_NewStringObjNoAlloc(interp, token, tokenLen); if (i == 2) { i = 0; Jim_IncrRefCount(objv[0]); Jim_IncrRefCount(objv[1]); if (Jim_AddHashEntry(ht, objv[0], objv[1]) != JIM_OK) { Jim_HashEntry *he; he = Jim_FindHashEntry(ht, objv[0]); Jim_DecrRefCount(interp, objv[0]); /* ATTENTION: const cast */ Jim_DecrRefCount(interp, (Jim_Obj*)he->val); he->val = objv[1]; } } } if (i) { Jim_FreeNewObj(interp, objv[0]); objPtr->typePtr = NULL; Jim_FreeHashTable(ht); Jim_SetResultString(interp, "invalid dictionary value: must be a list with an even number of elements", -1); return JIM_ERR; } return JIM_OK; } /* Dict object API */ /* Add an element to a dict. objPtr must be of the "dict" type. * The higer-level exported function is Jim_DictAddElement(). * If an element with the specified key already exists, the value * associated is replaced with the new one. * * if valueObjPtr == NULL, the key is instead removed if it exists. */ static void DictAddElement(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *keyObjPtr, Jim_Obj *valueObjPtr) { Jim_HashTable *ht = objPtr->internalRep.ptr; if (valueObjPtr == NULL) { /* unset */ Jim_DeleteHashEntry(ht, keyObjPtr); return; } Jim_IncrRefCount(keyObjPtr); Jim_IncrRefCount(valueObjPtr); if (Jim_AddHashEntry(ht, keyObjPtr, valueObjPtr) != JIM_OK) { Jim_HashEntry *he = Jim_FindHashEntry(ht, keyObjPtr); Jim_DecrRefCount(interp, keyObjPtr); /* ATTENTION: const cast */ Jim_DecrRefCount(interp, (Jim_Obj*)he->val); he->val = valueObjPtr; } } /* Add an element, higher-level interface for DictAddElement(). * If valueObjPtr == NULL, the key is removed if it exists. */ int Jim_DictAddElement(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *keyObjPtr, Jim_Obj *valueObjPtr) { if (Jim_IsShared(objPtr)) Jim_Panic(interp,"Jim_DictAddElement called with shared object"); if (objPtr->typePtr != &dictObjType) { if (SetDictFromAny(interp, objPtr) != JIM_OK) return JIM_ERR; } DictAddElement(interp, objPtr, keyObjPtr, valueObjPtr); Jim_InvalidateStringRep(objPtr); return JIM_OK; } Jim_Obj *Jim_NewDictObj(Jim_Interp *interp, Jim_Obj *const *elements, int len) { Jim_Obj *objPtr; int i; if (len % 2) Jim_Panic(interp,"Jim_NewDicObj() 'len' argument must be even"); objPtr = Jim_NewObj(interp); objPtr->typePtr = &dictObjType; objPtr->bytes = NULL; objPtr->internalRep.ptr = Jim_Alloc(sizeof(Jim_HashTable)); Jim_InitHashTable(objPtr->internalRep.ptr, &JimDictHashTableType, interp); for (i = 0; i < len; i += 2) DictAddElement(interp, objPtr, elements[i], elements[i + 1]); return objPtr; } /* Return the value associated to the specified dict key */ int Jim_DictKey(Jim_Interp *interp, Jim_Obj *dictPtr, Jim_Obj *keyPtr, Jim_Obj **objPtrPtr, int flags) { Jim_HashEntry *he; Jim_HashTable *ht; if (dictPtr->typePtr != &dictObjType) { if (SetDictFromAny(interp, dictPtr) != JIM_OK) return JIM_ERR; } ht = dictPtr->internalRep.ptr; if ((he = Jim_FindHashEntry(ht, keyPtr)) == NULL) { if (flags & JIM_ERRMSG) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "key \"", Jim_GetString(keyPtr, NULL), "\" not found in dictionary", NULL); } return JIM_ERR; } *objPtrPtr = he->val; return JIM_OK; } /* Return the value associated to the specified dict keys */ int Jim_DictKeysVector(Jim_Interp *interp, Jim_Obj *dictPtr, Jim_Obj *const *keyv, int keyc, Jim_Obj **objPtrPtr, int flags) { Jim_Obj *objPtr = NULL; int i; if (keyc == 0) { *objPtrPtr = dictPtr; return JIM_OK; } for (i = 0; i < keyc; i++) { if (Jim_DictKey(interp, dictPtr, keyv[i], &objPtr, flags) != JIM_OK) return JIM_ERR; dictPtr = objPtr; } *objPtrPtr = objPtr; return JIM_OK; } /* Modify the dict stored into the variable named 'varNamePtr' * setting the element specified by the 'keyc' keys objects in 'keyv', * with the new value of the element 'newObjPtr'. * * If newObjPtr == NULL the operation is to remove the given key * from the dictionary. */ int Jim_SetDictKeysVector(Jim_Interp *interp, Jim_Obj *varNamePtr, Jim_Obj *const *keyv, int keyc, Jim_Obj *newObjPtr) { Jim_Obj *varObjPtr, *objPtr, *dictObjPtr; int shared, i; varObjPtr = objPtr = Jim_GetVariable(interp, varNamePtr, JIM_ERRMSG); if (objPtr == NULL) { if (newObjPtr == NULL) /* Cannot remove a key from non existing var */ return JIM_ERR; varObjPtr = objPtr = Jim_NewDictObj(interp, NULL, 0); if (Jim_SetVariable(interp, varNamePtr, objPtr) != JIM_OK) { Jim_FreeNewObj(interp, varObjPtr); return JIM_ERR; } } if ((shared = Jim_IsShared(objPtr))) varObjPtr = objPtr = Jim_DuplicateObj(interp, objPtr); for (i = 0; i < keyc-1; i++) { dictObjPtr = objPtr; /* Check if it's a valid dictionary */ if (dictObjPtr->typePtr != &dictObjType) { if (SetDictFromAny(interp, dictObjPtr) != JIM_OK) goto err; } /* Check if the given key exists. */ Jim_InvalidateStringRep(dictObjPtr); if (Jim_DictKey(interp, dictObjPtr, keyv[i], &objPtr, newObjPtr ? JIM_NONE : JIM_ERRMSG) == JIM_OK) { /* This key exists at the current level. * Make sure it's not shared!. */ if (Jim_IsShared(objPtr)) { objPtr = Jim_DuplicateObj(interp, objPtr); DictAddElement(interp, dictObjPtr, keyv[i], objPtr); } } else { /* Key not found. If it's an [unset] operation * this is an error. Only the last key may not * exist. */ if (newObjPtr == NULL) goto err; /* Otherwise set an empty dictionary * as key's value. */ objPtr = Jim_NewDictObj(interp, NULL, 0); DictAddElement(interp, dictObjPtr, keyv[i], objPtr); } } if (Jim_DictAddElement(interp, objPtr, keyv[keyc-1], newObjPtr) != JIM_OK) goto err; Jim_InvalidateStringRep(objPtr); Jim_InvalidateStringRep(varObjPtr); if (Jim_SetVariable(interp, varNamePtr, varObjPtr) != JIM_OK) goto err; Jim_SetResult(interp, varObjPtr); return JIM_OK; err: if (shared) { Jim_FreeNewObj(interp, varObjPtr); } return JIM_ERR; } /* ----------------------------------------------------------------------------- * Index object * ---------------------------------------------------------------------------*/ static void UpdateStringOfIndex(struct Jim_Obj *objPtr); static int SetIndexFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr); static Jim_ObjType indexObjType = { "index", NULL, NULL, UpdateStringOfIndex, JIM_TYPE_NONE, }; void UpdateStringOfIndex(struct Jim_Obj *objPtr) { int len; char buf[JIM_INTEGER_SPACE + 1]; if (objPtr->internalRep.indexValue >= 0) len = sprintf(buf, "%d", objPtr->internalRep.indexValue); else if (objPtr->internalRep.indexValue == -1) len = sprintf(buf, "end"); else { len = sprintf(buf, "end%d", objPtr->internalRep.indexValue + 1); } objPtr->bytes = Jim_Alloc(len + 1); memcpy(objPtr->bytes, buf, len + 1); objPtr->length = len; } int SetIndexFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { int index, end = 0; const char *str; /* Get the string representation */ str = Jim_GetString(objPtr, NULL); /* Try to convert into an index */ if (!strcmp(str, "end")) { index = 0; end = 1; } else { if (!strncmp(str, "end-", 4)) { str += 4; end = 1; } if (Jim_StringToIndex(str, &index) != JIM_OK) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "bad index \"", Jim_GetString(objPtr, NULL), "\": " "must be integer or end?-integer?", NULL); return JIM_ERR; } } if (end) { if (index < 0) index = INT_MAX; else index = -(index + 1); } else if (!end && index < 0) index = -INT_MAX; /* Free the old internal repr and set the new one. */ Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &indexObjType; objPtr->internalRep.indexValue = index; return JIM_OK; } int Jim_GetIndex(Jim_Interp *interp, Jim_Obj *objPtr, int *indexPtr) { /* Avoid shimmering if the object is an integer. */ if (objPtr->typePtr == &intObjType) { jim_wide val = objPtr->internalRep.wideValue; if (!(val < LONG_MIN) && !(val > LONG_MAX)) { *indexPtr = (val < 0) ? -INT_MAX : (long)val;; return JIM_OK; } } if (objPtr->typePtr != &indexObjType && SetIndexFromAny(interp, objPtr) == JIM_ERR) return JIM_ERR; *indexPtr = objPtr->internalRep.indexValue; return JIM_OK; } /* ----------------------------------------------------------------------------- * Return Code Object. * ---------------------------------------------------------------------------*/ static int SetReturnCodeFromAny(Jim_Interp *interp, Jim_Obj *objPtr); static Jim_ObjType returnCodeObjType = { "return-code", NULL, NULL, NULL, JIM_TYPE_NONE, }; int SetReturnCodeFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { const char *str; int strLen, returnCode; jim_wide wideValue; /* Get the string representation */ str = Jim_GetString(objPtr, &strLen); /* Try to convert into an integer */ if (JimGetWideNoErr(interp, objPtr, &wideValue) != JIM_ERR) returnCode = (int) wideValue; else if (!JimStringCompare(str, strLen, "ok", 2, JIM_NOCASE)) returnCode = JIM_OK; else if (!JimStringCompare(str, strLen, "error", 5, JIM_NOCASE)) returnCode = JIM_ERR; else if (!JimStringCompare(str, strLen, "return", 6, JIM_NOCASE)) returnCode = JIM_RETURN; else if (!JimStringCompare(str, strLen, "break", 5, JIM_NOCASE)) returnCode = JIM_BREAK; else if (!JimStringCompare(str, strLen, "continue", 8, JIM_NOCASE)) returnCode = JIM_CONTINUE; else if (!JimStringCompare(str, strLen, "eval", 4, JIM_NOCASE)) returnCode = JIM_EVAL; else if (!JimStringCompare(str, strLen, "exit", 4, JIM_NOCASE)) returnCode = JIM_EXIT; else { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "expected return code but got '", str, "'", NULL); return JIM_ERR; } /* Free the old internal repr and set the new one. */ Jim_FreeIntRep(interp, objPtr); objPtr->typePtr = &returnCodeObjType; objPtr->internalRep.returnCode = returnCode; return JIM_OK; } int Jim_GetReturnCode(Jim_Interp *interp, Jim_Obj *objPtr, int *intPtr) { if (objPtr->typePtr != &returnCodeObjType && SetReturnCodeFromAny(interp, objPtr) == JIM_ERR) return JIM_ERR; *intPtr = objPtr->internalRep.returnCode; return JIM_OK; } /* ----------------------------------------------------------------------------- * Expression Parsing * ---------------------------------------------------------------------------*/ static int JimParseExprOperator(struct JimParserCtx *pc); static int JimParseExprNumber(struct JimParserCtx *pc); static int JimParseExprIrrational(struct JimParserCtx *pc); /* Exrp's Stack machine operators opcodes. */ /* Binary operators (numbers) */ #define JIM_EXPROP_BINARY_NUM_FIRST 0 /* first */ #define JIM_EXPROP_MUL 0 #define JIM_EXPROP_DIV 1 #define JIM_EXPROP_MOD 2 #define JIM_EXPROP_SUB 3 #define JIM_EXPROP_ADD 4 #define JIM_EXPROP_LSHIFT 5 #define JIM_EXPROP_RSHIFT 6 #define JIM_EXPROP_ROTL 7 #define JIM_EXPROP_ROTR 8 #define JIM_EXPROP_LT 9 #define JIM_EXPROP_GT 10 #define JIM_EXPROP_LTE 11 #define JIM_EXPROP_GTE 12 #define JIM_EXPROP_NUMEQ 13 #define JIM_EXPROP_NUMNE 14 #define JIM_EXPROP_BITAND 15 #define JIM_EXPROP_BITXOR 16 #define JIM_EXPROP_BITOR 17 #define JIM_EXPROP_LOGICAND 18 #define JIM_EXPROP_LOGICOR 19 #define JIM_EXPROP_LOGICAND_LEFT 20 #define JIM_EXPROP_LOGICOR_LEFT 21 #define JIM_EXPROP_POW 22 #define JIM_EXPROP_BINARY_NUM_LAST 22 /* last */ /* Binary operators (strings) */ #define JIM_EXPROP_STREQ 23 #define JIM_EXPROP_STRNE 24 /* Unary operators (numbers) */ #define JIM_EXPROP_NOT 25 #define JIM_EXPROP_BITNOT 26 #define JIM_EXPROP_UNARYMINUS 27 #define JIM_EXPROP_UNARYPLUS 28 #define JIM_EXPROP_LOGICAND_RIGHT 29 #define JIM_EXPROP_LOGICOR_RIGHT 30 /* Ternary operators */ #define JIM_EXPROP_TERNARY 31 /* Operands */ #define JIM_EXPROP_NUMBER 32 #define JIM_EXPROP_COMMAND 33 #define JIM_EXPROP_VARIABLE 34 #define JIM_EXPROP_DICTSUGAR 35 #define JIM_EXPROP_SUBST 36 #define JIM_EXPROP_STRING 37 /* Operators table */ typedef struct Jim_ExprOperator { const char *name; int precedence; int arity; int opcode; } Jim_ExprOperator; /* name - precedence - arity - opcode */ static struct Jim_ExprOperator Jim_ExprOperators[] = { {"!", 300, 1, JIM_EXPROP_NOT}, {"~", 300, 1, JIM_EXPROP_BITNOT}, {"unarymin", 300, 1, JIM_EXPROP_UNARYMINUS}, {"unaryplus", 300, 1, JIM_EXPROP_UNARYPLUS}, {"**", 250, 2, JIM_EXPROP_POW}, {"*", 200, 2, JIM_EXPROP_MUL}, {"/", 200, 2, JIM_EXPROP_DIV}, {"%", 200, 2, JIM_EXPROP_MOD}, {"-", 100, 2, JIM_EXPROP_SUB}, {"+", 100, 2, JIM_EXPROP_ADD}, {"<<<", 90, 3, JIM_EXPROP_ROTL}, {">>>", 90, 3, JIM_EXPROP_ROTR}, {"<<", 90, 2, JIM_EXPROP_LSHIFT}, {">>", 90, 2, JIM_EXPROP_RSHIFT}, {"<", 80, 2, JIM_EXPROP_LT}, {">", 80, 2, JIM_EXPROP_GT}, {"<=", 80, 2, JIM_EXPROP_LTE}, {">=", 80, 2, JIM_EXPROP_GTE}, {"==", 70, 2, JIM_EXPROP_NUMEQ}, {"!=", 70, 2, JIM_EXPROP_NUMNE}, {"eq", 60, 2, JIM_EXPROP_STREQ}, {"ne", 60, 2, JIM_EXPROP_STRNE}, {"&", 50, 2, JIM_EXPROP_BITAND}, {"^", 49, 2, JIM_EXPROP_BITXOR}, {"|", 48, 2, JIM_EXPROP_BITOR}, {"&&", 10, 2, JIM_EXPROP_LOGICAND}, {"||", 10, 2, JIM_EXPROP_LOGICOR}, {"?", 5, 3, JIM_EXPROP_TERNARY}, /* private operators */ {NULL, 10, 2, JIM_EXPROP_LOGICAND_LEFT}, {NULL, 10, 1, JIM_EXPROP_LOGICAND_RIGHT}, {NULL, 10, 2, JIM_EXPROP_LOGICOR_LEFT}, {NULL, 10, 1, JIM_EXPROP_LOGICOR_RIGHT}, }; #define JIM_EXPR_OPERATORS_NUM \ (sizeof(Jim_ExprOperators)/sizeof(struct Jim_ExprOperator)) int JimParseExpression(struct JimParserCtx *pc) { /* Discard spaces and quoted newline */ while (*(pc->p) == ' ' || *(pc->p) == '\t' || *(pc->p) == '\r' || *(pc->p) == '\n' || (*(pc->p) == '\\' && *(pc->p + 1) == '\n')) { pc->p++; pc->len--; } if (pc->len == 0) { pc->tstart = pc->tend = pc->p; pc->tline = pc->linenr; pc->tt = JIM_TT_EOL; pc->eof = 1; return JIM_OK; } switch (*(pc->p)) { case '(': pc->tstart = pc->tend = pc->p; pc->tline = pc->linenr; pc->tt = JIM_TT_SUBEXPR_START; pc->p++; pc->len--; break; case ')': pc->tstart = pc->tend = pc->p; pc->tline = pc->linenr; pc->tt = JIM_TT_SUBEXPR_END; pc->p++; pc->len--; break; case '[': return JimParseCmd(pc); break; case '$': if (JimParseVar(pc) == JIM_ERR) return JimParseExprOperator(pc); else return JIM_OK; break; case '-': if ((pc->tt == JIM_TT_NONE || pc->tt == JIM_TT_EXPR_OPERATOR) && isdigit((int)*(pc->p + 1))) return JimParseExprNumber(pc); else return JimParseExprOperator(pc); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': return JimParseExprNumber(pc); break; case '"': case '{': /* Here it's possible to reuse the List String parsing. */ pc->tt = JIM_TT_NONE; /* Make sure it's sensed as a new word. */ return JimParseListStr(pc); break; case 'N': case 'I': case 'n': case 'i': if (JimParseExprIrrational(pc) == JIM_ERR) return JimParseExprOperator(pc); break; default: return JimParseExprOperator(pc); break; } return JIM_OK; } int JimParseExprNumber(struct JimParserCtx *pc) { int allowdot = 1; int allowhex = 0; pc->tstart = pc->p; pc->tline = pc->linenr; if (*pc->p == '-') { pc->p++; pc->len--; } while (isdigit((int)*pc->p) || (allowhex && isxdigit((int)*pc->p)) || (allowdot && *pc->p == '.') || (pc->p-pc->tstart == 1 && *pc->tstart == '0' && (*pc->p == 'x' || *pc->p == 'X')) ) { if ((*pc->p == 'x') || (*pc->p == 'X')) { allowhex = 1; allowdot = 0; } if (*pc->p == '.') allowdot = 0; pc->p++; pc->len--; if (!allowdot && *pc->p == 'e' && *(pc->p + 1) == '-') { pc->p += 2; pc->len -= 2; } } pc->tend = pc->p-1; pc->tt = JIM_TT_EXPR_NUMBER; return JIM_OK; } int JimParseExprIrrational(struct JimParserCtx *pc) { const char *Tokens[] = {"NaN", "nan", "NAN", "Inf", "inf", "INF", NULL}; const char **token; for (token = Tokens; *token != NULL; token++) { int len = strlen(*token); if (strncmp(*token, pc->p, len) == 0) { pc->tstart = pc->p; pc->tend = pc->p + len - 1; pc->p += len; pc->len -= len; pc->tline = pc->linenr; pc->tt = JIM_TT_EXPR_NUMBER; return JIM_OK; } } return JIM_ERR; } int JimParseExprOperator(struct JimParserCtx *pc) { int i; int bestIdx = -1, bestLen = 0; /* Try to get the longest match. */ for (i = 0; i < (signed)JIM_EXPR_OPERATORS_NUM; i++) { const char *opname; int oplen; opname = Jim_ExprOperators[i].name; if (opname == NULL) continue; oplen = strlen(opname); if (strncmp(opname, pc->p, oplen) == 0 && oplen > bestLen) { bestIdx = i; bestLen = oplen; } } if (bestIdx == -1) return JIM_ERR; pc->tstart = pc->p; pc->tend = pc->p + bestLen - 1; pc->p += bestLen; pc->len -= bestLen; pc->tline = pc->linenr; pc->tt = JIM_TT_EXPR_OPERATOR; return JIM_OK; } struct Jim_ExprOperator *JimExprOperatorInfo(const char *opname) { int i; for (i = 0; i < (signed)JIM_EXPR_OPERATORS_NUM; i++) if (Jim_ExprOperators[i].name && strcmp(opname, Jim_ExprOperators[i].name) == 0) return &Jim_ExprOperators[i]; return NULL; } struct Jim_ExprOperator *JimExprOperatorInfoByOpcode(int opcode) { int i; for (i = 0; i < (signed)JIM_EXPR_OPERATORS_NUM; i++) if (Jim_ExprOperators[i].opcode == opcode) return &Jim_ExprOperators[i]; return NULL; } /* ----------------------------------------------------------------------------- * Expression Object * ---------------------------------------------------------------------------*/ static void FreeExprInternalRep(Jim_Interp *interp, Jim_Obj *objPtr); static void DupExprInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr); static Jim_ObjType exprObjType = { "expression", FreeExprInternalRep, DupExprInternalRep, NULL, JIM_TYPE_REFERENCES, }; /* Expr bytecode structure */ typedef struct ExprByteCode { int *opcode; /* Integer array of opcodes. */ Jim_Obj **obj; /* Array of associated Jim Objects. */ int len; /* Bytecode length */ int inUse; /* Used for sharing. */ } ExprByteCode; void FreeExprInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { int i; ExprByteCode *expr = (void*) objPtr->internalRep.ptr; expr->inUse--; if (expr->inUse != 0) return; for (i = 0; i < expr->len; i++) Jim_DecrRefCount(interp, expr->obj[i]); Jim_Free(expr->opcode); Jim_Free(expr->obj); Jim_Free(expr); } void DupExprInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { JIM_NOTUSED(interp); JIM_NOTUSED(srcPtr); /* Just returns an simple string. */ dupPtr->typePtr = NULL; } /* Add a new instruction to an expression bytecode structure. */ static void ExprObjAddInstr(Jim_Interp *interp, ExprByteCode *expr, int opcode, char *str, int len) { expr->opcode = Jim_Realloc(expr->opcode, sizeof(int)*(expr->len + 1)); expr->obj = Jim_Realloc(expr->obj, sizeof(Jim_Obj*)*(expr->len + 1)); expr->opcode[expr->len] = opcode; expr->obj[expr->len] = Jim_NewStringObjNoAlloc(interp, str, len); Jim_IncrRefCount(expr->obj[expr->len]); expr->len++; } /* Check if an expr program looks correct. */ static int ExprCheckCorrectness(ExprByteCode *expr) { int i; int stacklen = 0; /* Try to check if there are stack underflows, * and make sure at the end of the program there is * a single result on the stack. */ for (i = 0; i < expr->len; i++) { switch (expr->opcode[i]) { case JIM_EXPROP_NUMBER: case JIM_EXPROP_STRING: case JIM_EXPROP_SUBST: case JIM_EXPROP_VARIABLE: case JIM_EXPROP_DICTSUGAR: case JIM_EXPROP_COMMAND: stacklen++; break; case JIM_EXPROP_NOT: case JIM_EXPROP_BITNOT: case JIM_EXPROP_UNARYMINUS: case JIM_EXPROP_UNARYPLUS: /* Unary operations */ if (stacklen < 1) return JIM_ERR; break; case JIM_EXPROP_ADD: case JIM_EXPROP_SUB: case JIM_EXPROP_MUL: case JIM_EXPROP_DIV: case JIM_EXPROP_MOD: case JIM_EXPROP_LT: case JIM_EXPROP_GT: case JIM_EXPROP_LTE: case JIM_EXPROP_GTE: case JIM_EXPROP_ROTL: case JIM_EXPROP_ROTR: case JIM_EXPROP_LSHIFT: case JIM_EXPROP_RSHIFT: case JIM_EXPROP_NUMEQ: case JIM_EXPROP_NUMNE: case JIM_EXPROP_STREQ: case JIM_EXPROP_STRNE: case JIM_EXPROP_BITAND: case JIM_EXPROP_BITXOR: case JIM_EXPROP_BITOR: case JIM_EXPROP_LOGICAND: case JIM_EXPROP_LOGICOR: case JIM_EXPROP_POW: /* binary operations */ if (stacklen < 2) return JIM_ERR; stacklen--; break; default: Jim_Panic(NULL,"Default opcode reached ExprCheckCorrectness"); break; } } if (stacklen != 1) return JIM_ERR; return JIM_OK; } static void ExprShareLiterals(Jim_Interp *interp, ExprByteCode *expr, ScriptObj *topLevelScript) { int i; return; for (i = 0; i < expr->len; i++) { Jim_Obj *foundObjPtr; if (expr->obj[i] == NULL) continue; foundObjPtr = ScriptSearchLiteral(interp, topLevelScript, NULL, expr->obj[i]); if (foundObjPtr != NULL) { Jim_IncrRefCount(foundObjPtr); Jim_DecrRefCount(interp, expr->obj[i]); expr->obj[i] = foundObjPtr; } } } /* This procedure converts every occurrence of || and && opereators * in lazy unary versions. * * a b || is converted into: * * a |L b |R * * a b && is converted into: * * a &L b &R * * "|L" checks if 'a' is true: * 1) if it is true pushes 1 and skips istructions to reach * the opcode just after |R. * 2) if it is false does nothing. * "|R" checks if 'b' is true: * 1) if it is true pushes 1, otherwise pushes 0. * * "&L" checks if 'a' is true: * 1) if it is true does nothing. * 2) If it is false pushes 0 and skips istructions to reach * the opcode just after &R * "&R" checks if 'a' is true: * if it is true pushes 1, otherwise pushes 0. */ static void ExprMakeLazy(Jim_Interp *interp, ExprByteCode *expr) { while (1) { int index = -1, leftindex, arity, i, offset; Jim_ExprOperator *op; /* Search for || or && */ for (i = 0; i < expr->len; i++) { if (expr->opcode[i] == JIM_EXPROP_LOGICAND || expr->opcode[i] == JIM_EXPROP_LOGICOR) { index = i; break; } } if (index == -1) return; /* Search for the end of the first operator */ leftindex = index-1; arity = 1; while (arity) { switch (expr->opcode[leftindex]) { case JIM_EXPROP_NUMBER: case JIM_EXPROP_COMMAND: case JIM_EXPROP_VARIABLE: case JIM_EXPROP_DICTSUGAR: case JIM_EXPROP_SUBST: case JIM_EXPROP_STRING: break; default: op = JimExprOperatorInfoByOpcode(expr->opcode[leftindex]); if (op == NULL) { Jim_Panic(interp,"Default reached in ExprMakeLazy()"); } arity += op->arity; break; } arity--; leftindex--; } leftindex++; expr->opcode = Jim_Realloc(expr->opcode, sizeof(int)*(expr->len + 2)); expr->obj = Jim_Realloc(expr->obj, sizeof(Jim_Obj*)*(expr->len + 2)); memmove(&expr->opcode[leftindex + 2], &expr->opcode[leftindex], sizeof(int)*(expr->len-leftindex)); memmove(&expr->obj[leftindex + 2], &expr->obj[leftindex], sizeof(Jim_Obj*)*(expr->len-leftindex)); expr->len += 2; index += 2; offset = (index-leftindex)-1; Jim_DecrRefCount(interp, expr->obj[index]); if (expr->opcode[index] == JIM_EXPROP_LOGICAND) { expr->opcode[leftindex + 1] = JIM_EXPROP_LOGICAND_LEFT; expr->opcode[index] = JIM_EXPROP_LOGICAND_RIGHT; expr->obj[leftindex + 1] = Jim_NewStringObj(interp, "&L", -1); expr->obj[index] = Jim_NewStringObj(interp, "&R", -1); } else { expr->opcode[leftindex + 1] = JIM_EXPROP_LOGICOR_LEFT; expr->opcode[index] = JIM_EXPROP_LOGICOR_RIGHT; expr->obj[leftindex + 1] = Jim_NewStringObj(interp, "|L", -1); expr->obj[index] = Jim_NewStringObj(interp, "|R", -1); } expr->opcode[leftindex] = JIM_EXPROP_NUMBER; expr->obj[leftindex] = Jim_NewIntObj(interp, offset); Jim_IncrRefCount(expr->obj[index]); Jim_IncrRefCount(expr->obj[leftindex]); Jim_IncrRefCount(expr->obj[leftindex + 1]); } } /* This method takes the string representation of an expression * and generates a program for the Expr's stack-based VM. */ int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) { int exprTextLen; const char *exprText = Jim_GetString(objPtr, &exprTextLen); struct JimParserCtx parser; int i, shareLiterals; ExprByteCode *expr = Jim_Alloc(sizeof(*expr)); Jim_Stack stack; Jim_ExprOperator *op; /* Perform literal sharing with the current procedure * running only if this expression appears to be not generated * at runtime. */ shareLiterals = objPtr->typePtr == &sourceObjType; expr->opcode = NULL; expr->obj = NULL; expr->len = 0; expr->inUse = 1; Jim_InitStack(&stack); JimParserInit(&parser, exprText, exprTextLen, 1); while (!JimParserEof(&parser)) { char *token; int len, type; if (JimParseExpression(&parser) != JIM_OK) { Jim_SetResultString(interp, "Syntax error in expression", -1); goto err; } token = JimParserGetToken(&parser, &len, &type, NULL); if (type == JIM_TT_EOL) { Jim_Free(token); break; } switch (type) { case JIM_TT_STR: ExprObjAddInstr(interp, expr, JIM_EXPROP_STRING, token, len); break; case JIM_TT_ESC: ExprObjAddInstr(interp, expr, JIM_EXPROP_SUBST, token, len); break; case JIM_TT_VAR: ExprObjAddInstr(interp, expr, JIM_EXPROP_VARIABLE, token, len); break; case JIM_TT_DICTSUGAR: ExprObjAddInstr(interp, expr, JIM_EXPROP_DICTSUGAR, token, len); break; case JIM_TT_CMD: ExprObjAddInstr(interp, expr, JIM_EXPROP_COMMAND, token, len); break; case JIM_TT_EXPR_NUMBER: ExprObjAddInstr(interp, expr, JIM_EXPROP_NUMBER, token, len); break; case JIM_TT_EXPR_OPERATOR: op = JimExprOperatorInfo(token); while (1) { Jim_ExprOperator *stackTopOp; if (Jim_StackPeek(&stack) != NULL) { stackTopOp = JimExprOperatorInfo(Jim_StackPeek(&stack)); } else { stackTopOp = NULL; } if (Jim_StackLen(&stack) && op->arity != 1 && stackTopOp && stackTopOp->precedence >= op->precedence) { ExprObjAddInstr(interp, expr, stackTopOp->opcode, Jim_StackPeek(&stack), -1); Jim_StackPop(&stack); } else { break; } } Jim_StackPush(&stack, token); break; case JIM_TT_SUBEXPR_START: Jim_StackPush(&stack, Jim_StrDup("(")); Jim_Free(token); break; case JIM_TT_SUBEXPR_END: { int found = 0; while (Jim_StackLen(&stack)) { char *opstr = Jim_StackPop(&stack); if (!strcmp(opstr, "(")) { Jim_Free(opstr); found = 1; break; } op = JimExprOperatorInfo(opstr); ExprObjAddInstr(interp, expr, op->opcode, opstr, -1); } if (!found) { Jim_SetResultString(interp, "Unexpected close parenthesis", -1); goto err; } } Jim_Free(token); break; default: Jim_Panic(interp,"Default reached in SetExprFromAny()"); break; } } while (Jim_StackLen(&stack)) { char *opstr = Jim_StackPop(&stack); op = JimExprOperatorInfo(opstr); if (op == NULL && !strcmp(opstr, "(")) { Jim_Free(opstr); Jim_SetResultString(interp, "Missing close parenthesis", -1); goto err; } ExprObjAddInstr(interp, expr, op->opcode, opstr, -1); } /* Check program correctness. */ if (ExprCheckCorrectness(expr) != JIM_OK) { Jim_SetResultString(interp, "Invalid expression", -1); goto err; } /* Free the stack used for the compilation. */ Jim_FreeStackElements(&stack, Jim_Free); Jim_FreeStack(&stack); /* Convert || and && operators in unary |L |R and &L &R for lazyness */ ExprMakeLazy(interp, expr); /* Perform literal sharing */ if (shareLiterals && interp->framePtr->procBodyObjPtr) { Jim_Obj *bodyObjPtr = interp->framePtr->procBodyObjPtr; if (bodyObjPtr->typePtr == &scriptObjType) { ScriptObj *bodyScript = bodyObjPtr->internalRep.ptr; ExprShareLiterals(interp, expr, bodyScript); } } /* Free the old internal rep and set the new one. */ Jim_FreeIntRep(interp, objPtr); Jim_SetIntRepPtr(objPtr, expr); objPtr->typePtr = &exprObjType; return JIM_OK; err: /* we jump here on syntax/compile errors. */ Jim_FreeStackElements(&stack, Jim_Free); Jim_FreeStack(&stack); Jim_Free(expr->opcode); for (i = 0; i < expr->len; i++) { Jim_DecrRefCount(interp,expr->obj[i]); } Jim_Free(expr->obj); Jim_Free(expr); return JIM_ERR; } ExprByteCode *Jim_GetExpression(Jim_Interp *interp, Jim_Obj *objPtr) { if (objPtr->typePtr != &exprObjType) { if (SetExprFromAny(interp, objPtr) != JIM_OK) return NULL; } return (ExprByteCode*) Jim_GetIntRepPtr(objPtr); } /* ----------------------------------------------------------------------------- * Expressions evaluation. * Jim uses a specialized stack-based virtual machine for expressions, * that takes advantage of the fact that expr's operators * can't be redefined. * * Jim_EvalExpression() uses the bytecode compiled by * SetExprFromAny() method of the "expression" object. * * On success a Tcl Object containing the result of the evaluation * is stored into expResultPtrPtr (having refcount of 1), and JIM_OK is * returned. * On error the function returns a retcode != to JIM_OK and set a suitable * error on the interp. * ---------------------------------------------------------------------------*/ #define JIM_EE_STATICSTACK_LEN 10 int Jim_EvalExpression(Jim_Interp *interp, Jim_Obj *exprObjPtr, Jim_Obj **exprResultPtrPtr) { ExprByteCode *expr; Jim_Obj **stack, *staticStack[JIM_EE_STATICSTACK_LEN]; int stacklen = 0, i, error = 0, errRetCode = JIM_ERR; Jim_IncrRefCount(exprObjPtr); expr = Jim_GetExpression(interp, exprObjPtr); if (!expr) { Jim_DecrRefCount(interp, exprObjPtr); return JIM_ERR; /* error in expression. */ } /* In order to avoid that the internal repr gets freed due to * shimmering of the exprObjPtr's object, we make the internal rep * shared. */ expr->inUse++; /* The stack-based expr VM itself */ /* Stack allocation. Expr programs have the feature that * a program of length N can't require a stack longer than * N. */ if (expr->len > JIM_EE_STATICSTACK_LEN) stack = Jim_Alloc(sizeof(Jim_Obj*)*expr->len); else stack = staticStack; /* Execute every istruction */ for (i = 0; i < expr->len; i++) { Jim_Obj *A, *B, *objPtr; jim_wide wA, wB, wC; double dA, dB, dC; const char *sA, *sB; int Alen, Blen, retcode; int opcode = expr->opcode[i]; if (opcode == JIM_EXPROP_NUMBER || opcode == JIM_EXPROP_STRING) { stack[stacklen++] = expr->obj[i]; Jim_IncrRefCount(expr->obj[i]); } else if (opcode == JIM_EXPROP_VARIABLE) { objPtr = Jim_GetVariable(interp, expr->obj[i], JIM_ERRMSG); if (objPtr == NULL) { error = 1; goto err; } stack[stacklen++] = objPtr; Jim_IncrRefCount(objPtr); } else if (opcode == JIM_EXPROP_SUBST) { if ((retcode = Jim_SubstObj(interp, expr->obj[i], &objPtr, JIM_NONE)) != JIM_OK) { error = 1; errRetCode = retcode; goto err; } stack[stacklen++] = objPtr; Jim_IncrRefCount(objPtr); } else if (opcode == JIM_EXPROP_DICTSUGAR) { objPtr = Jim_ExpandDictSugar(interp, expr->obj[i]); if (objPtr == NULL) { error = 1; goto err; } stack[stacklen++] = objPtr; Jim_IncrRefCount(objPtr); } else if (opcode == JIM_EXPROP_COMMAND) { if ((retcode = Jim_EvalObj(interp, expr->obj[i])) != JIM_OK) { error = 1; errRetCode = retcode; goto err; } stack[stacklen++] = interp->result; Jim_IncrRefCount(interp->result); } else if (opcode >= JIM_EXPROP_BINARY_NUM_FIRST && opcode <= JIM_EXPROP_BINARY_NUM_LAST) { /* Note that there isn't to increment the * refcount of objects. the references are moved * from stack to A and B. */ B = stack[--stacklen]; A = stack[--stacklen]; /* --- Integer --- */ if ((A->typePtr == &doubleObjType && !A->bytes) || (B->typePtr == &doubleObjType && !B->bytes) || JimGetWideNoErr(interp, A, &wA) != JIM_OK || JimGetWideNoErr(interp, B, &wB) != JIM_OK) { goto trydouble; } Jim_DecrRefCount(interp, A); Jim_DecrRefCount(interp, B); switch (expr->opcode[i]) { case JIM_EXPROP_ADD: wC = wA + wB; break; case JIM_EXPROP_SUB: wC = wA-wB; break; case JIM_EXPROP_MUL: wC = wA*wB; break; case JIM_EXPROP_LT: wC = wA < wB; break; case JIM_EXPROP_GT: wC = wA > wB; break; case JIM_EXPROP_LTE: wC = wA <= wB; break; case JIM_EXPROP_GTE: wC = wA >= wB; break; case JIM_EXPROP_LSHIFT: wC = wA << wB; break; case JIM_EXPROP_RSHIFT: wC = wA >> wB; break; case JIM_EXPROP_NUMEQ: wC = wA == wB; break; case JIM_EXPROP_NUMNE: wC = wA != wB; break; case JIM_EXPROP_BITAND: wC = wA&wB; break; case JIM_EXPROP_BITXOR: wC = wA^wB; break; case JIM_EXPROP_BITOR: wC = wA | wB; break; case JIM_EXPROP_POW: wC = JimPowWide(wA,wB); break; case JIM_EXPROP_LOGICAND_LEFT: if (wA == 0) { i += (int)wB; wC = 0; } else { continue; } break; case JIM_EXPROP_LOGICOR_LEFT: if (wA != 0) { i += (int)wB; wC = 1; } else { continue; } break; case JIM_EXPROP_DIV: if (wB == 0) goto divbyzero; wC = wA/wB; break; case JIM_EXPROP_MOD: if (wB == 0) goto divbyzero; wC = wA%wB; break; case JIM_EXPROP_ROTL: { /* uint32_t would be better. But not everyone has inttypes.h?*/ unsigned long uA = (unsigned long)wA; #ifdef _MSC_VER wC = _rotl(uA,(unsigned long)wB); #else const unsigned int S = sizeof(unsigned long) * 8; wC = (unsigned long)((uA << wB) | (uA >> (S-wB))); #endif break; } case JIM_EXPROP_ROTR: { unsigned long uA = (unsigned long)wA; #ifdef _MSC_VER wC = _rotr(uA,(unsigned long)wB); #else const unsigned int S = sizeof(unsigned long) * 8; wC = (unsigned long)((uA >> wB) | (uA << (S-wB))); #endif break; } default: wC = 0; /* avoid gcc warning */ break; } stack[stacklen] = Jim_NewIntObj(interp, wC); Jim_IncrRefCount(stack[stacklen]); stacklen++; continue; trydouble: /* --- Double --- */ if (Jim_GetDouble(interp, A, &dA) != JIM_OK || Jim_GetDouble(interp, B, &dB) != JIM_OK) { /* Hmmm! For compatibility, maybe convert != and == into ne and eq */ if (expr->opcode[i] == JIM_EXPROP_NUMNE) { opcode = JIM_EXPROP_STRNE; goto retry_as_string; } else if (expr->opcode[i] == JIM_EXPROP_NUMEQ) { opcode = JIM_EXPROP_STREQ; goto retry_as_string; } Jim_DecrRefCount(interp, A); Jim_DecrRefCount(interp, B); error = 1; goto err; } Jim_DecrRefCount(interp, A); Jim_DecrRefCount(interp, B); switch (expr->opcode[i]) { case JIM_EXPROP_ROTL: case JIM_EXPROP_ROTR: case JIM_EXPROP_LSHIFT: case JIM_EXPROP_RSHIFT: case JIM_EXPROP_BITAND: case JIM_EXPROP_BITXOR: case JIM_EXPROP_BITOR: case JIM_EXPROP_MOD: case JIM_EXPROP_POW: Jim_SetResultString(interp, "Got floating-point value where integer was expected", -1); error = 1; goto err; break; case JIM_EXPROP_ADD: dC = dA + dB; break; case JIM_EXPROP_SUB: dC = dA-dB; break; case JIM_EXPROP_MUL: dC = dA*dB; break; case JIM_EXPROP_LT: dC = dA < dB; break; case JIM_EXPROP_GT: dC = dA > dB; break; case JIM_EXPROP_LTE: dC = dA <= dB; break; case JIM_EXPROP_GTE: dC = dA >= dB; break; case JIM_EXPROP_NUMEQ: dC = dA == dB; break; case JIM_EXPROP_NUMNE: dC = dA != dB; break; case JIM_EXPROP_LOGICAND_LEFT: if (dA == 0) { i += (int)dB; dC = 0; } else { continue; } break; case JIM_EXPROP_LOGICOR_LEFT: if (dA != 0) { i += (int)dB; dC = 1; } else { continue; } break; case JIM_EXPROP_DIV: if (dB == 0) goto divbyzero; dC = dA/dB; break; default: dC = 0; /* avoid gcc warning */ break; } stack[stacklen] = Jim_NewDoubleObj(interp, dC); Jim_IncrRefCount(stack[stacklen]); stacklen++; } else if (opcode == JIM_EXPROP_STREQ || opcode == JIM_EXPROP_STRNE) { B = stack[--stacklen]; A = stack[--stacklen]; retry_as_string: sA = Jim_GetString(A, &Alen); sB = Jim_GetString(B, &Blen); switch (opcode) { case JIM_EXPROP_STREQ: if (Alen == Blen && memcmp(sA, sB, Alen) ==0) wC = 1; else wC = 0; break; case JIM_EXPROP_STRNE: if (Alen != Blen || memcmp(sA, sB, Alen) != 0) wC = 1; else wC = 0; break; default: wC = 0; /* avoid gcc warning */ break; } Jim_DecrRefCount(interp, A); Jim_DecrRefCount(interp, B); stack[stacklen] = Jim_NewIntObj(interp, wC); Jim_IncrRefCount(stack[stacklen]); stacklen++; } else if (opcode == JIM_EXPROP_NOT || opcode == JIM_EXPROP_BITNOT || opcode == JIM_EXPROP_LOGICAND_RIGHT || opcode == JIM_EXPROP_LOGICOR_RIGHT) { /* Note that there isn't to increment the * refcount of objects. the references are moved * from stack to A and B. */ A = stack[--stacklen]; /* --- Integer --- */ if ((A->typePtr == &doubleObjType && !A->bytes) || JimGetWideNoErr(interp, A, &wA) != JIM_OK) { goto trydouble_unary; } Jim_DecrRefCount(interp, A); switch (expr->opcode[i]) { case JIM_EXPROP_NOT: wC = !wA; break; case JIM_EXPROP_BITNOT: wC = ~wA; break; case JIM_EXPROP_LOGICAND_RIGHT: case JIM_EXPROP_LOGICOR_RIGHT: wC = (wA != 0); break; default: wC = 0; /* avoid gcc warning */ break; } stack[stacklen] = Jim_NewIntObj(interp, wC); Jim_IncrRefCount(stack[stacklen]); stacklen++; continue; trydouble_unary: /* --- Double --- */ if (Jim_GetDouble(interp, A, &dA) != JIM_OK) { Jim_DecrRefCount(interp, A); error = 1; goto err; } Jim_DecrRefCount(interp, A); switch (expr->opcode[i]) { case JIM_EXPROP_NOT: dC = !dA; break; case JIM_EXPROP_LOGICAND_RIGHT: case JIM_EXPROP_LOGICOR_RIGHT: dC = (dA != 0); break; case JIM_EXPROP_BITNOT: Jim_SetResultString(interp, "Got floating-point value where integer was expected", -1); error = 1; goto err; break; default: dC = 0; /* avoid gcc warning */ break; } stack[stacklen] = Jim_NewDoubleObj(interp, dC); Jim_IncrRefCount(stack[stacklen]); stacklen++; } else { Jim_Panic(interp,"Unknown opcode in Jim_EvalExpression"); } } err: /* There is no need to decerement the inUse field because * this reference is transfered back into the exprObjPtr. */ Jim_FreeIntRep(interp, exprObjPtr); exprObjPtr->typePtr = &exprObjType; Jim_SetIntRepPtr(exprObjPtr, expr); Jim_DecrRefCount(interp, exprObjPtr); if (!error) { *exprResultPtrPtr = stack[0]; Jim_IncrRefCount(stack[0]); errRetCode = JIM_OK; } for (i = 0; i < stacklen; i++) { Jim_DecrRefCount(interp, stack[i]); } if (stack != staticStack) Jim_Free(stack); return errRetCode; divbyzero: error = 1; Jim_SetResultString(interp, "Division by zero", -1); goto err; } int Jim_GetBoolFromExpr(Jim_Interp *interp, Jim_Obj *exprObjPtr, int *boolPtr) { int retcode; jim_wide wideValue; double doubleValue; Jim_Obj *exprResultPtr; retcode = Jim_EvalExpression(interp, exprObjPtr, &exprResultPtr); if (retcode != JIM_OK) return retcode; if (JimGetWideNoErr(interp, exprResultPtr, &wideValue) != JIM_OK) { if (Jim_GetDouble(interp, exprResultPtr, &doubleValue) != JIM_OK) { Jim_DecrRefCount(interp, exprResultPtr); return JIM_ERR; } else { Jim_DecrRefCount(interp, exprResultPtr); *boolPtr = doubleValue != 0; return JIM_OK; } } Jim_DecrRefCount(interp, exprResultPtr); *boolPtr = wideValue != 0; return JIM_OK; } /* ----------------------------------------------------------------------------- * ScanFormat String Object * ---------------------------------------------------------------------------*/ /* This Jim_Obj will held a parsed representation of a format string passed to * the Jim_ScanString command. For error diagnostics, the scanformat string has * to be parsed in its entirely first and then, if correct, can be used for * scanning. To avoid endless re-parsing, the parsed representation will be * stored in an internal representation and re-used for performance reason. */ /* A ScanFmtPartDescr will held the information of /one/ part of the whole * scanformat string. This part will later be used to extract information * out from the string to be parsed by Jim_ScanString */ typedef struct ScanFmtPartDescr { char type; /* Type of conversion (e.g. c, d, f) */ char modifier; /* Modify type (e.g. l - long, h - short */ size_t width; /* Maximal width of input to be converted */ int pos; /* -1 - no assign, 0 - natural pos, >0 - XPG3 pos */ char *arg; /* Specification of a CHARSET conversion */ char *prefix; /* Prefix to be scanned literally before conversion */ } ScanFmtPartDescr; /* The ScanFmtStringObj will held the internal representation of a scanformat * string parsed and separated in part descriptions. Furthermore it contains * the original string representation of the scanformat string to allow for * fast update of the Jim_Obj's string representation part. * * As add-on the internal object representation add some scratch pad area * for usage by Jim_ScanString to avoid endless allocating and freeing of * memory for purpose of string scanning. * * The error member points to a static allocated string in case of a mal- * formed scanformat string or it contains '0' (NULL) in case of a valid * parse representation. * * The whole memory of the internal representation is allocated as a single * area of memory that will be internally separated. So freeing and duplicating * of such an object is cheap */ typedef struct ScanFmtStringObj { jim_wide size; /* Size of internal repr in bytes */ char *stringRep; /* Original string representation */ size_t count; /* Number of ScanFmtPartDescr contained */ size_t convCount; /* Number of conversions that will assign */ size_t maxPos; /* Max position index if XPG3 is used */ const char *error; /* Ptr to error text (NULL if no error */ char *scratch; /* Some scratch pad used by Jim_ScanString */ ScanFmtPartDescr descr[1]; /* The vector of partial descriptions */ } ScanFmtStringObj; static void FreeScanFmtInternalRep(Jim_Interp *interp, Jim_Obj *objPtr); static void DupScanFmtInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr); static void UpdateStringOfScanFmt(Jim_Obj *objPtr); static Jim_ObjType scanFmtStringObjType = { "scanformatstring", FreeScanFmtInternalRep, DupScanFmtInternalRep, UpdateStringOfScanFmt, JIM_TYPE_NONE, }; void FreeScanFmtInternalRep(Jim_Interp *interp, Jim_Obj *objPtr) { JIM_NOTUSED(interp); Jim_Free((char*)objPtr->internalRep.ptr); objPtr->internalRep.ptr = 0; } void DupScanFmtInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr) { size_t size = (size_t)((ScanFmtStringObj*)srcPtr->internalRep.ptr)->size; ScanFmtStringObj *newVec = (ScanFmtStringObj*)Jim_Alloc(size); JIM_NOTUSED(interp); memcpy(newVec, srcPtr->internalRep.ptr, size); dupPtr->internalRep.ptr = newVec; dupPtr->typePtr = &scanFmtStringObjType; } void UpdateStringOfScanFmt(Jim_Obj *objPtr) { char *bytes = ((ScanFmtStringObj*)objPtr->internalRep.ptr)->stringRep; objPtr->bytes = Jim_StrDup(bytes); objPtr->length = strlen(bytes); } /* SetScanFmtFromAny will parse a given string and create the internal * representation of the format specification. In case of an error * the error data member of the internal representation will be set * to an descriptive error text and the function will be left with * JIM_ERR to indicate unsucessful parsing (aka. malformed scanformat * specification */ static int SetScanFmtFromAny(Jim_Interp *interp, Jim_Obj *objPtr) { ScanFmtStringObj *fmtObj; char *buffer; int maxCount, i, approxSize, lastPos = -1; const char *fmt = objPtr->bytes; int maxFmtLen = objPtr->length; const char *fmtEnd = fmt + maxFmtLen; int curr; Jim_FreeIntRep(interp, objPtr); /* Count how many conversions could take place maximally */ for (i = 0, maxCount = 0; i < maxFmtLen; ++i) if (fmt[i] == '%') ++maxCount; /* Calculate an approximation of the memory necessary */ approxSize = sizeof(ScanFmtStringObj) /* Size of the container */ + (maxCount + 1) * sizeof(ScanFmtPartDescr) /* Size of all partials */ + maxFmtLen * sizeof(char) + 3 + 1 /* Scratch + "%n" + '\0' */ + maxFmtLen * sizeof(char) + 1 /* Original stringrep */ + maxFmtLen * sizeof(char) /* Arg for CHARSETs */ + (maxCount +1) * sizeof(char) /* '\0' for every partial */ + 1; /* safety byte */ fmtObj = (ScanFmtStringObj*)Jim_Alloc(approxSize); memset(fmtObj, 0, approxSize); fmtObj->size = approxSize; fmtObj->maxPos = 0; fmtObj->scratch = (char*)&fmtObj->descr[maxCount + 1]; fmtObj->stringRep = fmtObj->scratch + maxFmtLen + 3 + 1; memcpy(fmtObj->stringRep, fmt, maxFmtLen); buffer = fmtObj->stringRep + maxFmtLen + 1; objPtr->internalRep.ptr = fmtObj; objPtr->typePtr = &scanFmtStringObjType; for (i = 0, curr = 0; fmt < fmtEnd; ++fmt) { int width = 0, skip; ScanFmtPartDescr *descr = &fmtObj->descr[curr]; fmtObj->count++; descr->width = 0; /* Assume width unspecified */ /* Overread and store any "literal" prefix */ if (*fmt != '%' || fmt[1] == '%') { descr->type = 0; descr->prefix = &buffer[i]; for (; fmt < fmtEnd; ++fmt) { if (*fmt == '%') { if (fmt[1] != '%') break; ++fmt; } buffer[i++] = *fmt; } buffer[i++] = 0; } /* Skip the conversion introducing '%' sign */ ++fmt; /* End reached due to non-conversion literal only? */ if (fmt >= fmtEnd) goto done; descr->pos = 0; /* Assume "natural" positioning */ if (*fmt == '*') { descr->pos = -1; /* Okay, conversion will not be assigned */ ++fmt; } else fmtObj->convCount++; /* Otherwise count as assign-conversion */ /* Check if next token is a number (could be width or pos */ if (sscanf(fmt, "%d%n", &width, &skip) == 1) { fmt += skip; /* Was the number a XPG3 position specifier? */ if (descr->pos != -1 && *fmt == '$') { int prev; ++fmt; descr->pos = width; width = 0; /* Look if "natural" postioning and XPG3 one was mixed */ if ((lastPos == 0 && descr->pos > 0) || (lastPos > 0 && descr->pos == 0)) { fmtObj->error = "cannot mix \"%\" and \"%n$\" conversion specifiers"; return JIM_ERR; } /* Look if this position was already used */ for (prev = 0; prev < curr; ++prev) { if (fmtObj->descr[prev].pos == -1) continue; if (fmtObj->descr[prev].pos == descr->pos) { fmtObj->error = "same \"%n$\" conversion specifier " "used more than once"; return JIM_ERR; } } /* Try to find a width after the XPG3 specifier */ if (sscanf(fmt, "%d%n", &width, &skip) == 1) { descr->width = width; fmt += skip; } if (descr->pos > 0 && (size_t)descr->pos > fmtObj->maxPos) fmtObj->maxPos = descr->pos; } else { /* Number was not a XPG3, so it has to be a width */ descr->width = width; } } /* If positioning mode was undetermined yet, fix this */ if (lastPos == -1) lastPos = descr->pos; /* Handle CHARSET conversion type ... */ if (*fmt == '[') { int swapped = 1, beg = i, end, j; descr->type = '['; descr->arg = &buffer[i]; ++fmt; if (*fmt == '^') buffer[i++] = *fmt++; if (*fmt == ']') buffer[i++] = *fmt++; while (*fmt && *fmt != ']') buffer[i++] = *fmt++; if (*fmt != ']') { fmtObj->error = "unmatched [ in format string"; return JIM_ERR; } end = i; buffer[i++] = 0; /* In case a range fence was given "backwards", swap it */ while (swapped) { swapped = 0; for (j = beg + 1; j < end-1; ++j) { if (buffer[j] == '-' && buffer[j-1] > buffer[j + 1]) { char tmp = buffer[j-1]; buffer[j-1] = buffer[j + 1]; buffer[j + 1] = tmp; swapped = 1; } } } } else { /* Remember any valid modifier if given */ if (strchr("hlL", *fmt) != 0) descr->modifier = tolower((int)*fmt++); descr->type = *fmt; if (strchr("efgcsndoxui", *fmt) == 0) { fmtObj->error = "bad scan conversion character"; return JIM_ERR; } else if (*fmt == 'c' && descr->width != 0) { fmtObj->error = "field width may not be specified in %c " "conversion"; return JIM_ERR; } else if (*fmt == 'u' && descr->modifier == 'l') { fmtObj->error = "unsigned wide not supported"; return JIM_ERR; } } curr++; } done: if (fmtObj->convCount == 0) { fmtObj->error = "no any conversion specifier given"; return JIM_ERR; } return JIM_OK; } /* Some accessor macros to allow lowlevel access to fields of internal repr */ #define FormatGetCnvCount(_fo_) \ ((ScanFmtStringObj*)((_fo_)->internalRep.ptr))->convCount #define FormatGetMaxPos(_fo_) \ ((ScanFmtStringObj*)((_fo_)->internalRep.ptr))->maxPos #define FormatGetError(_fo_) \ ((ScanFmtStringObj*)((_fo_)->internalRep.ptr))->error /* Some Bit testing/setting/cleaning routines. For now only used in handling * charsets ([a-z123]) within scanning. Later on perhaps a base for a * bitvector implementation in Jim? */ static int JimTestBit(const char *bitvec, char ch) { div_t pos = div(ch-1, 8); return bitvec[pos.quot] & (1 << pos.rem); } static void JimSetBit(char *bitvec, char ch) { div_t pos = div(ch-1, 8); bitvec[pos.quot] |= (1 << pos.rem); } #if 0 /* currently not used */ static void JimClearBit(char *bitvec, char ch) { div_t pos = div(ch-1, 8); bitvec[pos.quot] &= ~(1 << pos.rem); } #endif /* JimScanAString is used to scan an unspecified string that ends with * next WS, or a string that is specified via a charset. The charset * is currently implemented in a way to only allow for usage with * ASCII. Whenever we will switch to UNICODE, another idea has to * be born :-/ * * FIXME: Works only with ASCII */ static Jim_Obj * JimScanAString(Jim_Interp *interp, const char *sdescr, const char *str) { size_t i; Jim_Obj *result; char charset[256/8 + 1]; /* A Charset may contain max 256 chars */ char *buffer = Jim_Alloc(strlen(str) + 1), *anchor = buffer; /* First init charset to nothing or all, depending if a specified * or an unspecified string has to be parsed */ memset(charset, (sdescr ? 0 : 255), sizeof(charset)); if (sdescr) { /* There was a set description given, that means we are parsing * a specified string. So we have to build a corresponding * charset reflecting the description */ int notFlag = 0; /* Should the set be negated at the end? */ if (*sdescr == '^') { notFlag = 1; ++sdescr; } /* Here '-' is meant literally and not to define a range */ if (*sdescr == '-') { JimSetBit(charset, '-'); ++sdescr; } while (*sdescr) { if (sdescr[1] == '-' && sdescr[2] != 0) { /* Handle range definitions */ int i; for (i = sdescr[0]; i <= sdescr[2]; ++i) JimSetBit(charset, (char)i); sdescr += 3; } else { /* Handle verbatim character definitions */ JimSetBit(charset, *sdescr++); } } /* Negate the charset if there was a NOT given */ for (i = 0; notFlag && i < sizeof(charset); ++i) charset[i] = ~charset[i]; } /* And after all the mess above, the real work begin ... */ while (str && *str) { if (!sdescr && isspace((int)*str)) break; /* EOS via WS if unspecified */ if (JimTestBit(charset, *str)) *buffer++ = *str++; else break; /* EOS via mismatch if specified scanning */ } *buffer = 0; /* Close the string properly ... */ result = Jim_NewStringObj(interp, anchor, -1); Jim_Free(anchor); /* ... and free it afer usage */ return result; } /* ScanOneEntry will scan one entry out of the string passed as argument. * It use the sscanf() function for this task. After extracting and * converting of the value, the count of scanned characters will be * returned of -1 in case of no conversion tool place and string was * already scanned thru */ static int ScanOneEntry(Jim_Interp *interp, const char *str, long pos, ScanFmtStringObj *fmtObj, long index, Jim_Obj **valObjPtr) { # define MAX_SIZE (sizeof(jim_wide) > sizeof(double) \ ? sizeof(jim_wide) \ : sizeof(double)) char buffer[MAX_SIZE]; char *value = buffer; const char *tok; const ScanFmtPartDescr *descr = &fmtObj->descr[index]; size_t sLen = strlen(&str[pos]), scanned = 0; size_t anchor = pos; int i; /* First pessimiticly assume, we will not scan anything :-) */ *valObjPtr = 0; if (descr->prefix) { /* There was a prefix given before the conversion, skip it and adjust * the string-to-be-parsed accordingly */ for (i = 0; str[pos] && descr->prefix[i]; ++i) { /* If prefix require, skip WS */ if (isspace((int)descr->prefix[i])) while (str[pos] && isspace((int)str[pos])) ++pos; else if (descr->prefix[i] != str[pos]) break; /* Prefix do not match here, leave the loop */ else ++pos; /* Prefix matched so far, next round */ } if (str[pos] == 0) return -1; /* All of str consumed: EOF condition */ else if (descr->prefix[i] != 0) return 0; /* Not whole prefix consumed, no conversion possible */ } /* For all but following conversion, skip leading WS */ if (descr->type != 'c' && descr->type != '[' && descr->type != 'n') while (isspace((int)str[pos])) ++pos; /* Determine how much skipped/scanned so far */ scanned = pos - anchor; if (descr->type == 'n') { /* Return pseudo conversion means: how much scanned so far? */ *valObjPtr = Jim_NewIntObj(interp, anchor + scanned); } else if (str[pos] == 0) { /* Cannot scan anything, as str is totally consumed */ return -1; } else { /* Processing of conversions follows ... */ if (descr->width > 0) { /* Do not try to scan as fas as possible but only the given width. * To ensure this, we copy the part that should be scanned. */ size_t tLen = descr->width > sLen ? sLen : descr->width; tok = Jim_StrDupLen(&str[pos], tLen); } else { /* As no width was given, simply refer to the original string */ tok = &str[pos]; } switch (descr->type) { case 'c': *valObjPtr = Jim_NewIntObj(interp, *tok); scanned += 1; break; case 'd': case 'o': case 'x': case 'u': case 'i': { jim_wide jwvalue = 0; long lvalue = 0; char *endp; /* Position where the number finished */ int base = descr->type == 'o' ? 8 : descr->type == 'x' ? 16 : descr->type == 'i' ? 0 : 10; do { /* Try to scan a number with the given base */ if (descr->modifier == 'l') { #ifdef HAVE_LONG_LONG_INT jwvalue = JimStrtoll(tok, &endp, base), #else jwvalue = strtol(tok, &endp, base), #endif memcpy(value, &jwvalue, sizeof(jim_wide)); } else { if (descr->type == 'u') lvalue = strtoul(tok, &endp, base); else lvalue = strtol(tok, &endp, base); memcpy(value, &lvalue, sizeof(lvalue)); } /* If scanning failed, and base was undetermined, simply * put it to 10 and try once more. This should catch the * case where %i begin to parse a number prefix (e.g. * '0x' but no further digits follows. This will be * handled as a ZERO followed by a char 'x' by Tcl */ if (endp == tok && base == 0) base = 10; else break; } while (1); if (endp != tok) { /* There was some number sucessfully scanned! */ if (descr->modifier == 'l') *valObjPtr = Jim_NewIntObj(interp, jwvalue); else *valObjPtr = Jim_NewIntObj(interp, lvalue); /* Adjust the number-of-chars scanned so far */ scanned += endp - tok; } else { /* Nothing was scanned. We have to determine if this * happened due to e.g. prefix mismatch or input str * exhausted */ scanned = *tok ? 0 : -1; } break; } case 's': case '[': { *valObjPtr = JimScanAString(interp, descr->arg, tok); scanned += Jim_Length(*valObjPtr); break; } case 'e': case 'f': case 'g': { char *endp; double dvalue = strtod(tok, &endp); memcpy(value, &dvalue, sizeof(double)); if (endp != tok) { /* There was some number sucessfully scanned! */ *valObjPtr = Jim_NewDoubleObj(interp, dvalue); /* Adjust the number-of-chars scanned so far */ scanned += endp - tok; } else { /* Nothing was scanned. We have to determine if this * happened due to e.g. prefix mismatch or input str * exhausted */ scanned = *tok ? 0 : -1; } break; } } /* If a substring was allocated (due to pre-defined width) do not * forget to free it */ if (tok != &str[pos]) Jim_Free((char*)tok); } return scanned; } /* Jim_ScanString is the workhorse of string scanning. It will scan a given * string and returns all converted (and not ignored) values in a list back * to the caller. If an error occured, a NULL pointer will be returned */ Jim_Obj *Jim_ScanString(Jim_Interp *interp, Jim_Obj *strObjPtr, Jim_Obj *fmtObjPtr, int flags) { size_t i, pos; int scanned = 1; const char *str = Jim_GetString(strObjPtr, 0); Jim_Obj *resultList = 0; Jim_Obj **resultVec =NULL; int resultc; Jim_Obj *emptyStr = 0; ScanFmtStringObj *fmtObj; /* If format specification is not an object, convert it! */ if (fmtObjPtr->typePtr != &scanFmtStringObjType) SetScanFmtFromAny(interp, fmtObjPtr); fmtObj = (ScanFmtStringObj*)fmtObjPtr->internalRep.ptr; /* Check if format specification was valid */ if (fmtObj->error != 0) { if (flags & JIM_ERRMSG) Jim_SetResultString(interp, fmtObj->error, -1); return 0; } /* Allocate a new "shared" empty string for all unassigned conversions */ emptyStr = Jim_NewEmptyStringObj(interp); Jim_IncrRefCount(emptyStr); /* Create a list and fill it with empty strings up to max specified XPG3 */ resultList = Jim_NewListObj(interp, 0, 0); if (fmtObj->maxPos > 0) { for (i = 0; i < fmtObj->maxPos; ++i) Jim_ListAppendElement(interp, resultList, emptyStr); JimListGetElements(interp, resultList, &resultc, &resultVec); } /* Now handle every partial format description */ for (i = 0, pos = 0; i < fmtObj->count; ++i) { ScanFmtPartDescr *descr = &(fmtObj->descr[i]); Jim_Obj *value = 0; /* Only last type may be "literal" w/o conversion - skip it! */ if (descr->type == 0) continue; /* As long as any conversion could be done, we will proceed */ if (scanned > 0) scanned = ScanOneEntry(interp, str, pos, fmtObj, i, &value); /* In case our first try results in EOF, we will leave */ if (scanned == -1 && i == 0) goto eof; /* Advance next pos-to-be-scanned for the amount scanned already */ pos += scanned; /* value == 0 means no conversion took place so take empty string */ if (value == 0) value = Jim_NewEmptyStringObj(interp); /* If value is a non-assignable one, skip it */ if (descr->pos == -1) { Jim_FreeNewObj(interp, value); } else if (descr->pos == 0) /* Otherwise append it to the result list if no XPG3 was given */ Jim_ListAppendElement(interp, resultList, value); else if (resultVec[descr->pos-1] == emptyStr) { /* But due to given XPG3, put the value into the corr. slot */ Jim_DecrRefCount(interp, resultVec[descr->pos-1]); Jim_IncrRefCount(value); resultVec[descr->pos-1] = value; } else { /* Otherwise, the slot was already used - free obj and ERROR */ Jim_FreeNewObj(interp, value); goto err; } } Jim_DecrRefCount(interp, emptyStr); return resultList; eof: Jim_DecrRefCount(interp, emptyStr); Jim_FreeNewObj(interp, resultList); return (Jim_Obj*)EOF; err: Jim_DecrRefCount(interp, emptyStr); Jim_FreeNewObj(interp, resultList); return 0; } /* ----------------------------------------------------------------------------- * Pseudo Random Number Generation * ---------------------------------------------------------------------------*/ static void JimPrngSeed(Jim_Interp *interp, const unsigned char *seed, int seedLen); /* Initialize the sbox with the numbers from 0 to 255 */ static void JimPrngInit(Jim_Interp *interp) { int i; unsigned int seed[256]; interp->prngState = Jim_Alloc(sizeof(Jim_PrngState)); for (i = 0; i < 256; i++) seed[i] = (rand() ^ time(NULL) ^ clock()); JimPrngSeed(interp, (unsigned char*) seed, sizeof(int)*256); } /* Generates N bytes of random data */ static void JimRandomBytes(Jim_Interp *interp, void *dest, unsigned int len) { Jim_PrngState *prng; unsigned char *destByte = (unsigned char*) dest; unsigned int si, sj, x; /* initialization, only needed the first time */ if (interp->prngState == NULL) JimPrngInit(interp); prng = interp->prngState; /* generates 'len' bytes of pseudo-random numbers */ for (x = 0; x < len; x++) { prng->i = (prng->i + 1) & 0xff; si = prng->sbox[prng->i]; prng->j = (prng->j + si) & 0xff; sj = prng->sbox[prng->j]; prng->sbox[prng->i] = sj; prng->sbox[prng->j] = si; *destByte++ = prng->sbox[(si + sj)&0xff]; } } /* Re-seed the generator with user-provided bytes */ static void JimPrngSeed(Jim_Interp *interp, const unsigned char *seed, int seedLen) { int i; unsigned char buf[256]; Jim_PrngState *prng; /* initialization, only needed the first time */ if (interp->prngState == NULL) JimPrngInit(interp); prng = interp->prngState; /* Set the sbox[i] with i */ for (i = 0; i < 256; i++) prng->sbox[i] = i; /* Now use the seed to perform a random permutation of the sbox */ for (i = 0; i < seedLen; i++) { unsigned char t; t = prng->sbox[i&0xFF]; prng->sbox[i&0xFF] = prng->sbox[seed[i]]; prng->sbox[seed[i]] = t; } prng->i = prng->j = 0; /* discard the first 256 bytes of stream. */ JimRandomBytes(interp, buf, 256); } /* ----------------------------------------------------------------------------- * Dynamic libraries support (WIN32 not supported) * ---------------------------------------------------------------------------*/ #ifdef JIM_DYNLIB #ifdef WIN32 #define RTLD_LAZY 0 void * dlopen(const char *path, int mode) { JIM_NOTUSED(mode); return (void *)LoadLibraryA(path); } int dlclose(void *handle) { FreeLibrary((HANDLE)handle); return 0; } void *dlsym(void *handle, const char *symbol) { return GetProcAddress((HMODULE)handle, symbol); } static char win32_dlerror_string[121]; const char *dlerror(void) { FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), LANG_NEUTRAL, win32_dlerror_string, 120, NULL); return win32_dlerror_string; } #endif /* WIN32 */ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName) { Jim_Obj *libPathObjPtr; int prefixc, i; void *handle; int (*onload)(Jim_Interp *interp); libPathObjPtr = Jim_GetGlobalVariableStr(interp, "jim_libpath", JIM_NONE); if (libPathObjPtr == NULL) { prefixc = 0; libPathObjPtr = NULL; } else { Jim_IncrRefCount(libPathObjPtr); Jim_ListLength(interp, libPathObjPtr, &prefixc); } for (i = -1; i < prefixc; i++) { if (i < 0) { handle = dlopen(pathName, RTLD_LAZY); } else { FILE *fp; char buf[JIM_PATH_LEN]; const char *prefix; int prefixlen; Jim_Obj *prefixObjPtr; buf[0] = '\0'; if (Jim_ListIndex(interp, libPathObjPtr, i, &prefixObjPtr, JIM_NONE) != JIM_OK) continue; prefix = Jim_GetString(prefixObjPtr, &prefixlen); if (prefixlen + strlen(pathName) + 1 >= JIM_PATH_LEN) continue; if (*pathName == '/') { strcpy(buf, pathName); } else if (prefixlen && prefix[prefixlen-1] == '/') sprintf(buf, "%s%s", prefix, pathName); else sprintf(buf, "%s/%s", prefix, pathName); fp = fopen(buf, "r"); if (fp == NULL) continue; fclose(fp); handle = dlopen(buf, RTLD_LAZY); } if (handle == NULL) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "error loading extension \"", pathName, "\": ", dlerror(), NULL); if (i < 0) continue; goto err; } if ((onload = dlsym(handle, "Jim_OnLoad")) == NULL) { Jim_SetResultString(interp, "No Jim_OnLoad symbol found on extension", -1); goto err; } if (onload(interp) == JIM_ERR) { dlclose(handle); goto err; } Jim_SetEmptyResult(interp); if (libPathObjPtr != NULL) Jim_DecrRefCount(interp, libPathObjPtr); return JIM_OK; } err: if (libPathObjPtr != NULL) Jim_DecrRefCount(interp, libPathObjPtr); return JIM_ERR; } #else /* JIM_DYNLIB */ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName) { JIM_NOTUSED(interp); JIM_NOTUSED(pathName); Jim_SetResultString(interp, "the Jim binary has no support for [load]", -1); return JIM_ERR; } #endif/* JIM_DYNLIB */ /* ----------------------------------------------------------------------------- * Packages handling * ---------------------------------------------------------------------------*/ #define JIM_PKG_ANY_VERSION -1 /* Convert a string of the type "1.2" into an integer. * MAJOR.MINOR is converted as MAJOR*100 + MINOR, so "1.2" is converted * to the integer with value 102 */ static int JimPackageVersionToInt(Jim_Interp *interp, const char *v, int *intPtr, int flags) { char *copy; jim_wide major, minor; char *majorStr, *minorStr, *p; if (v[0] == '\0') { *intPtr = JIM_PKG_ANY_VERSION; return JIM_OK; } copy = Jim_StrDup(v); p = strchr(copy, '.'); if (p == NULL) goto badfmt; *p = '\0'; majorStr = copy; minorStr = p + 1; if (Jim_StringToWide(majorStr, &major, 10) != JIM_OK || Jim_StringToWide(minorStr, &minor, 10) != JIM_OK) goto badfmt; *intPtr = (int)(major*100 + minor); Jim_Free(copy); return JIM_OK; badfmt: Jim_Free(copy); if (flags & JIM_ERRMSG) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "invalid package version '", v, "'", NULL); } return JIM_ERR; } #define JIM_MATCHVER_EXACT (1 << JIM_PRIV_FLAG_SHIFT) static int JimPackageMatchVersion(int needed, int actual, int flags) { if (needed == JIM_PKG_ANY_VERSION) return 1; if (flags & JIM_MATCHVER_EXACT) { return needed == actual; } else { return needed/100 == actual/100 && (needed <= actual); } } int Jim_PackageProvide(Jim_Interp *interp, const char *name, const char *ver, int flags) { int intVersion; /* Check if the version format is ok */ if (JimPackageVersionToInt(interp, ver, &intVersion, JIM_ERRMSG) != JIM_OK) return JIM_ERR; /* If the package was already provided returns an error. */ if (Jim_FindHashEntry(&interp->packages, name) != NULL) { if (flags & JIM_ERRMSG) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "package '", name, "' was already provided", NULL); } return JIM_ERR; } Jim_AddHashEntry(&interp->packages, name, (char*) ver); return JIM_OK; } #ifndef JIM_ANSIC #ifndef WIN32 # include # include #else # include /* Posix dirent.h compatiblity layer for WIN32. * Copyright Kevlin Henney, 1997, 2003. All rights reserved. * Copyright Salvatore Sanfilippo ,2005. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose is hereby granted without fee, provided * that this copyright and permissions notice appear in all copies and * derivatives. * * This software is supplied "as is" without express or implied warranty. * This software was modified by Salvatore Sanfilippo for the Jim Interpreter. */ struct dirent { char *d_name; }; typedef struct DIR { long handle; /* -1 for failed rewind */ struct _finddata_t info; struct dirent result; /* d_name null iff first time */ char *name; /* null-terminated char string */ } DIR; DIR *opendir(const char *name) { DIR *dir = 0; if (name && name[0]) { size_t base_length = strlen(name); const char *all = /* search pattern must end with suitable wildcard */ strchr("/\\", name[base_length - 1]) ? "*" : "/*"; if ((dir = (DIR *) Jim_Alloc(sizeof *dir)) != 0 && (dir->name = (char *) Jim_Alloc(base_length + strlen(all) + 1)) != 0) { strcat(strcpy(dir->name, name), all); if ((dir->handle = (long) _findfirst(dir->name, &dir->info)) != -1) dir->result.d_name = 0; else { /* rollback */ Jim_Free(dir->name); Jim_Free(dir); dir = 0; } } else { /* rollback */ Jim_Free(dir); dir = 0; errno = ENOMEM; } } else { errno = EINVAL; } return dir; } int closedir(DIR *dir) { int result = -1; if (dir) { if (dir->handle != -1) result = _findclose(dir->handle); Jim_Free(dir->name); Jim_Free(dir); } if (result == -1) /* map all errors to EBADF */ errno = EBADF; return result; } struct dirent *readdir(DIR *dir) { struct dirent *result = 0; if (dir && dir->handle != -1) { if (!dir->result.d_name || _findnext(dir->handle, &dir->info) != -1) { result = &dir->result; result->d_name = dir->info.name; } } else { errno = EBADF; } return result; } #endif /* WIN32 */ static char *JimFindBestPackage(Jim_Interp *interp, char **prefixes, int prefixc, const char *pkgName, int pkgVer, int flags) { int bestVer = -1, i; int pkgNameLen = strlen(pkgName); char *bestPackage = NULL; struct dirent *de; for (i = 0; i < prefixc; i++) { DIR *dir; char buf[JIM_PATH_LEN]; int prefixLen; if (prefixes[i] == NULL) continue; strncpy(buf, prefixes[i], JIM_PATH_LEN); buf[JIM_PATH_LEN-1] = '\0'; prefixLen = strlen(buf); if (prefixLen && buf[prefixLen-1] == '/') buf[prefixLen-1] = '\0'; if ((dir = opendir(buf)) == NULL) continue; while ((de = readdir(dir)) != NULL) { char *fileName = de->d_name; int fileNameLen = strlen(fileName); if (strncmp(fileName, "jim-", 4) == 0 && strncmp(fileName + 4, pkgName, pkgNameLen) == 0 && *(fileName + 4+pkgNameLen) == '-' && fileNameLen > 4 && /* note that this is not really useful */ (strncmp(fileName + fileNameLen-4, ".tcl", 4) == 0 || strncmp(fileName + fileNameLen-4, ".dll", 4) == 0 || strncmp(fileName + fileNameLen-3, ".so", 3) == 0)) { char ver[6]; /* xx.yy < nulterm> */ char *p = strrchr(fileName, '.'); int verLen, fileVer; verLen = p - (fileName + 4+pkgNameLen + 1); if (verLen < 3 || verLen > 5) continue; memcpy(ver, fileName + 4+pkgNameLen + 1, verLen); ver[verLen] = '\0'; if (JimPackageVersionToInt(interp, ver, &fileVer, JIM_NONE) != JIM_OK) continue; if (JimPackageMatchVersion(pkgVer, fileVer, flags) && (bestVer == -1 || bestVer < fileVer)) { bestVer = fileVer; Jim_Free(bestPackage); bestPackage = Jim_Alloc(strlen(buf) + strlen(fileName) + 2); sprintf(bestPackage, "%s/%s", buf, fileName); } } } closedir(dir); } return bestPackage; } #else /* JIM_ANSIC */ static char *JimFindBestPackage(Jim_Interp *interp, char **prefixes, int prefixc, const char *pkgName, int pkgVer, int flags) { JIM_NOTUSED(interp); JIM_NOTUSED(prefixes); JIM_NOTUSED(prefixc); JIM_NOTUSED(pkgName); JIM_NOTUSED(pkgVer); JIM_NOTUSED(flags); return NULL; } #endif /* JIM_ANSIC */ /* Search for a suitable package under every dir specified by jim_libpath * and load it if possible. If a suitable package was loaded with success * JIM_OK is returned, otherwise JIM_ERR is returned. */ static int JimLoadPackage(Jim_Interp *interp, const char *name, int ver, int flags) { Jim_Obj *libPathObjPtr; char **prefixes, *best; int prefixc, i, retCode = JIM_OK; libPathObjPtr = Jim_GetGlobalVariableStr(interp, "jim_libpath", JIM_NONE); if (libPathObjPtr == NULL) { prefixc = 0; libPathObjPtr = NULL; } else { Jim_IncrRefCount(libPathObjPtr); Jim_ListLength(interp, libPathObjPtr, &prefixc); } prefixes = Jim_Alloc(sizeof(char*)*prefixc); for (i = 0; i < prefixc; i++) { Jim_Obj *prefixObjPtr; if (Jim_ListIndex(interp, libPathObjPtr, i, &prefixObjPtr, JIM_NONE) != JIM_OK) { prefixes[i] = NULL; continue; } prefixes[i] = Jim_StrDup(Jim_GetString(prefixObjPtr, NULL)); } /* Scan every directory to find the "best" package. */ best = JimFindBestPackage(interp, prefixes, prefixc, name, ver, flags); if (best != NULL) { char *p = strrchr(best, '.'); /* Try to load/source it */ if (p && strcmp(p, ".tcl") == 0) { retCode = Jim_EvalFile(interp, best); } else { retCode = Jim_LoadLibrary(interp, best); } } else { retCode = JIM_ERR; } Jim_Free(best); for (i = 0; i < prefixc; i++) Jim_Free(prefixes[i]); Jim_Free(prefixes); if (libPathObjPtr) Jim_DecrRefCount(interp, libPathObjPtr); return retCode; } const char *Jim_PackageRequire(Jim_Interp *interp, const char *name, const char *ver, int flags) { Jim_HashEntry *he; int requiredVer; /* Start with an empty error string */ Jim_SetResultString(interp, "", 0); if (JimPackageVersionToInt(interp, ver, &requiredVer, JIM_ERRMSG) != JIM_OK) return NULL; he = Jim_FindHashEntry(&interp->packages, name); if (he == NULL) { /* Try to load the package. */ if (JimLoadPackage(interp, name, requiredVer, flags) == JIM_OK) { he = Jim_FindHashEntry(&interp->packages, name); if (he == NULL) { return "?"; } return he->val; } /* No way... return an error. */ if (flags & JIM_ERRMSG) { int len; Jim_GetString(Jim_GetResult(interp), &len); Jim_AppendStrings(interp, Jim_GetResult(interp), len ? "\n" : "", "Can't find package '", name, "'", NULL); } return NULL; } else { int actualVer; if (JimPackageVersionToInt(interp, he->val, &actualVer, JIM_ERRMSG) != JIM_OK) { return NULL; } /* Check if version matches. */ if (JimPackageMatchVersion(requiredVer, actualVer, flags) == 0) { Jim_AppendStrings(interp, Jim_GetResult(interp), "Package '", name, "' already loaded, but with version ", he->val, NULL); return NULL; } return he->val; } } /* ----------------------------------------------------------------------------- * Eval * ---------------------------------------------------------------------------*/ #define JIM_EVAL_SARGV_LEN 8 /* static arguments vector length */ #define JIM_EVAL_SINTV_LEN 8 /* static interpolation vector length */ static int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, int argc, Jim_Obj *const *argv); /* Handle calls to the [unknown] command */ static int JimUnknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj **v, *sv[JIM_EVAL_SARGV_LEN]; int retCode; /* If JimUnknown() is recursively called (e.g. error in the unknown proc, * done here */ if (interp->unknown_called) { return JIM_ERR; } /* If the [unknown] command does not exists returns * just now */ if (Jim_GetCommand(interp, interp->unknown, JIM_NONE) == NULL) return JIM_ERR; /* The object interp->unknown just contains * the "unknown" string, it is used in order to * avoid to lookup the unknown command every time * but instread to cache the result. */ if (argc + 1 <= JIM_EVAL_SARGV_LEN) v = sv; else v = Jim_Alloc(sizeof(Jim_Obj*)*(argc + 1)); /* Make a copy of the arguments vector, but shifted on * the right of one position. The command name of the * command will be instead the first argument of the * [unknonw] call. */ memcpy(v + 1, argv, sizeof(Jim_Obj*)*argc); v[0] = interp->unknown; /* Call it */ interp->unknown_called++; retCode = Jim_EvalObjVector(interp, argc + 1, v); interp->unknown_called--; /* Clean up */ if (v != sv) Jim_Free(v); return retCode; } /* Eval the object vector 'objv' composed of 'objc' elements. * Every element is used as single argument. * Jim_EvalObj() will call this function every time its object * argument is of "list" type, with no string representation. * * This is possible because the string representation of a * list object generated by the UpdateStringOfList is made * in a way that ensures that every list element is a different * command argument. */ int Jim_EvalObjVector(Jim_Interp *interp, int objc, Jim_Obj *const *objv) { int i, retcode; Jim_Cmd *cmdPtr; /* Incr refcount of arguments. */ for (i = 0; i < objc; i++) Jim_IncrRefCount(objv[i]); /* Command lookup */ cmdPtr = Jim_GetCommand(interp, objv[0], JIM_ERRMSG); if (cmdPtr == NULL) { retcode = JimUnknown(interp, objc, objv); } else { /* Call it -- Make sure result is an empty object. */ Jim_SetEmptyResult(interp); if (cmdPtr->cmdProc) { interp->cmdPrivData = cmdPtr->privData; retcode = cmdPtr->cmdProc(interp, objc, objv); if (retcode == JIM_ERR_ADDSTACK) { //JimAppendStackTrace(interp, "", script->fileName, token[i-argc*2].linenr); retcode = JIM_ERR; } } else { retcode = JimCallProcedure(interp, cmdPtr, objc, objv); if (retcode == JIM_ERR) { JimAppendStackTrace(interp, Jim_GetString(objv[0], NULL), "", 1); } } } /* Decr refcount of arguments and return the retcode */ for (i = 0; i < objc; i++) Jim_DecrRefCount(interp, objv[i]); return retcode; } /* Interpolate the given tokens into a unique Jim_Obj returned by reference * via *objPtrPtr. This function is only called by Jim_EvalObj(). * The returned object has refcount = 0. */ int Jim_InterpolateTokens(Jim_Interp *interp, ScriptToken *token, int tokens, Jim_Obj **objPtrPtr) { int totlen = 0, i, retcode; Jim_Obj **intv; Jim_Obj *sintv[JIM_EVAL_SINTV_LEN]; Jim_Obj *objPtr; char *s; if (tokens <= JIM_EVAL_SINTV_LEN) intv = sintv; else intv = Jim_Alloc(sizeof(Jim_Obj*)* tokens); /* Compute every token forming the argument * in the intv objects vector. */ for (i = 0; i < tokens; i++) { switch (token[i].type) { case JIM_TT_ESC: case JIM_TT_STR: intv[i] = token[i].objPtr; break; case JIM_TT_VAR: intv[i] = Jim_GetVariable(interp, token[i].objPtr, JIM_ERRMSG); if (!intv[i]) { retcode = JIM_ERR; goto err; } break; case JIM_TT_DICTSUGAR: intv[i] = Jim_ExpandDictSugar(interp, token[i].objPtr); if (!intv[i]) { retcode = JIM_ERR; goto err; } break; case JIM_TT_CMD: retcode = Jim_EvalObj(interp, token[i].objPtr); if (retcode != JIM_OK) goto err; intv[i] = Jim_GetResult(interp); break; default: Jim_Panic(interp, "default token type reached " "in Jim_InterpolateTokens()."); break; } Jim_IncrRefCount(intv[i]); /* Make sure there is a valid * string rep, and add the string * length to the total legnth. */ Jim_GetString(intv[i], NULL); totlen += intv[i]->length; } /* Concatenate every token in an unique * object. */ objPtr = Jim_NewStringObjNoAlloc(interp, NULL, 0); s = objPtr->bytes = Jim_Alloc(totlen + 1); objPtr->length = totlen; for (i = 0; i < tokens; i++) { memcpy(s, intv[i]->bytes, intv[i]->length); s += intv[i]->length; Jim_DecrRefCount(interp, intv[i]); } objPtr->bytes[totlen] = '\0'; /* Free the intv vector if not static. */ if (tokens > JIM_EVAL_SINTV_LEN) Jim_Free(intv); *objPtrPtr = objPtr; return JIM_OK; err: i--; for (; i >= 0; i--) Jim_DecrRefCount(interp, intv[i]); if (tokens > JIM_EVAL_SINTV_LEN) Jim_Free(intv); return retcode; } /* Helper of Jim_EvalObj() to perform argument expansion. * Basically this function append an argument to 'argv' * (and increments argc by reference accordingly), performing * expansion of the list object if 'expand' is non-zero, or * just adding objPtr to argv if 'expand' is zero. */ void Jim_ExpandArgument(Jim_Interp *interp, Jim_Obj ***argv, int *argcPtr, int expand, Jim_Obj *objPtr) { if (!expand) { (*argv) = Jim_Realloc(*argv, sizeof(Jim_Obj*)*((*argcPtr) + 1)); /* refcount of objPtr not incremented because * we are actually transfering a reference from * the old 'argv' to the expanded one. */ (*argv)[*argcPtr] = objPtr; (*argcPtr)++; } else { int len, i; Jim_ListLength(interp, objPtr, &len); (*argv) = Jim_Realloc(*argv, sizeof(Jim_Obj*)*((*argcPtr) + len)); for (i = 0; i < len; i++) { (*argv)[*argcPtr] = objPtr->internalRep.listValue.ele[i]; Jim_IncrRefCount(objPtr->internalRep.listValue.ele[i]); (*argcPtr)++; } /* The original object reference is no longer needed, * after the expansion it is no longer present on * the argument vector, but the single elements are * in its place. */ Jim_DecrRefCount(interp, objPtr); } } int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr) { int i, j = 0, len; ScriptObj *script; ScriptToken *token; int *cs; /* command structure array */ int retcode = JIM_OK; Jim_Obj *sargv[JIM_EVAL_SARGV_LEN], **argv = NULL, *tmpObjPtr; interp->errorFlag = 0; /* If the object is of type "list" and there is no * string representation for this object, we can call * a specialized version of Jim_EvalObj() */ if (scriptObjPtr->typePtr == &listObjType && scriptObjPtr->internalRep.listValue.len && scriptObjPtr->bytes == NULL) { Jim_IncrRefCount(scriptObjPtr); retcode = Jim_EvalObjVector(interp, scriptObjPtr->internalRep.listValue.len, scriptObjPtr->internalRep.listValue.ele); Jim_DecrRefCount(interp, scriptObjPtr); return retcode; } Jim_IncrRefCount(scriptObjPtr); /* Make sure it's shared. */ script = Jim_GetScript(interp, scriptObjPtr); /* Now we have to make sure the internal repr will not be * freed on shimmering. * * Think for example to this: * * set x {llength $x; ... some more code ...}; eval $x * * In order to preserve the internal rep, we increment the * inUse field of the script internal rep structure. */ script->inUse++; token = script->token; len = script->len; cs = script->cmdStruct; i = 0; /* 'i' is the current token index. */ /* Reset the interpreter result. This is useful to * return the emtpy result in the case of empty program. */ Jim_SetEmptyResult(interp); /* Execute every command sequentially, returns on * error (i.e. if a command does not return JIM_OK) */ while (i < len) { int expand = 0; int argc = *cs++; /* Get the number of arguments */ Jim_Cmd *cmd; /* Set the expand flag if needed. */ if (argc == -1) { expand++; argc = *cs++; } /* Allocate the arguments vector */ if (argc <= JIM_EVAL_SARGV_LEN) argv = sargv; else argv = Jim_Alloc(sizeof(Jim_Obj*)*argc); /* Populate the arguments objects. */ for (j = 0; j < argc; j++) { int tokens = *cs++; /* tokens is negative if expansion is needed. * for this argument. */ if (tokens < 0) { tokens = (-tokens)-1; i++; } if (tokens == 1) { /* Fast path if the token does not * need interpolation */ switch (token[i].type) { case JIM_TT_ESC: case JIM_TT_STR: argv[j] = token[i].objPtr; break; case JIM_TT_VAR: tmpObjPtr = Jim_GetVariable(interp, token[i].objPtr, JIM_ERRMSG); if (!tmpObjPtr) { retcode = JIM_ERR; goto err; } argv[j] = tmpObjPtr; break; case JIM_TT_DICTSUGAR: tmpObjPtr = Jim_ExpandDictSugar(interp, token[i].objPtr); if (!tmpObjPtr) { retcode = JIM_ERR; goto err; } argv[j] = tmpObjPtr; break; case JIM_TT_CMD: retcode = Jim_EvalObj(interp, token[i].objPtr); if (retcode != JIM_OK) goto err; argv[j] = Jim_GetResult(interp); break; default: Jim_Panic(interp, "default token type reached " "in Jim_EvalObj()."); break; } Jim_IncrRefCount(argv[j]); i += 2; } else { /* For interpolation we call an helper * function doing the work for us. */ if ((retcode = Jim_InterpolateTokens(interp, token + i, tokens, &tmpObjPtr)) != JIM_OK) { goto err; } argv[j] = tmpObjPtr; Jim_IncrRefCount(argv[j]); i += tokens + 1; } } /* Handle {expand} expansion */ if (expand) { int *ecs = cs - argc; int eargc = 0; Jim_Obj **eargv = NULL; for (j = 0; j < argc; j++) { Jim_ExpandArgument(interp, &eargv, &eargc, ecs[j] < 0, argv[j]); } if (argv != sargv) Jim_Free(argv); argc = eargc; argv = eargv; j = argc; if (argc == 0) { /* Nothing to do with zero args. */ Jim_Free(eargv); continue; } } /* Lookup the command to call */ cmd = Jim_GetCommand(interp, argv[0], JIM_ERRMSG); if (cmd != NULL) { /* Call it -- Make sure result is an empty object. */ Jim_SetEmptyResult(interp); if (cmd->cmdProc) { interp->cmdPrivData = cmd->privData; retcode = cmd->cmdProc(interp, argc, argv); if ((retcode == JIM_ERR)||(retcode == JIM_ERR_ADDSTACK)) { JimAppendStackTrace(interp, "", script->fileName, token[i-argc*2].linenr); retcode = JIM_ERR; } } else { retcode = JimCallProcedure(interp, cmd, argc, argv); if (retcode == JIM_ERR) { JimAppendStackTrace(interp, Jim_GetString(argv[0], NULL), script->fileName, token[i-argc*2].linenr); } } } else { /* Call [unknown] */ retcode = JimUnknown(interp, argc, argv); if (retcode == JIM_ERR) { JimAppendStackTrace(interp, "", script->fileName, token[i-argc*2].linenr); } } if (retcode != JIM_OK) { i -= argc*2; /* point to the command name. */ goto err; } /* Decrement the arguments count */ for (j = 0; j < argc; j++) { Jim_DecrRefCount(interp, argv[j]); } if (argv != sargv) { Jim_Free(argv); argv = NULL; } } /* Note that we don't have to decrement inUse, because the * following code transfers our use of the reference again to * the script object. */ j = 0; /* on normal termination, the argv array is already Jim_DecrRefCount-ed. */ err: /* Handle errors. */ if (retcode == JIM_ERR && !interp->errorFlag) { interp->errorFlag = 1; JimSetErrorFileName(interp, script->fileName); JimSetErrorLineNumber(interp, token[i].linenr); JimResetStackTrace(interp); } Jim_FreeIntRep(interp, scriptObjPtr); scriptObjPtr->typePtr = &scriptObjType; Jim_SetIntRepPtr(scriptObjPtr, script); Jim_DecrRefCount(interp, scriptObjPtr); for (i = 0; i < j; i++) { Jim_DecrRefCount(interp, argv[i]); } if (argv != sargv) Jim_Free(argv); return retcode; } /* Call a procedure implemented in Tcl. * It's possible to speed-up a lot this function, currently * the callframes are not cached, but allocated and * destroied every time. What is expecially costly is * to create/destroy the local vars hash table every time. * * This can be fixed just implementing callframes caching * in JimCreateCallFrame() and JimFreeCallFrame(). */ int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, int argc, Jim_Obj *const *argv) { int i, retcode; Jim_CallFrame *callFramePtr; int num_args; /* Check arity */ if (argc < cmd->arityMin || (cmd->arityMax != -1 && argc > cmd->arityMax)) { Jim_Obj *objPtr = Jim_NewEmptyStringObj(interp); Jim_AppendStrings(interp, objPtr, "wrong # args: should be \"", Jim_GetString(argv[0], NULL), (cmd->arityMin > 1) ? " " : "", Jim_GetString(cmd->argListObjPtr, NULL), "\"", NULL); Jim_SetResult(interp, objPtr); return JIM_ERR; } /* Check if there are too nested calls */ if (interp->numLevels == interp->maxNestingDepth) { Jim_SetResultString(interp, "Too many nested calls. Infinite recursion?", -1); return JIM_ERR; } /* Create a new callframe */ callFramePtr = JimCreateCallFrame(interp); callFramePtr->parentCallFrame = interp->framePtr; callFramePtr->argv = argv; callFramePtr->argc = argc; callFramePtr->procArgsObjPtr = cmd->argListObjPtr; callFramePtr->procBodyObjPtr = cmd->bodyObjPtr; callFramePtr->staticVars = cmd->staticVars; Jim_IncrRefCount(cmd->argListObjPtr); Jim_IncrRefCount(cmd->bodyObjPtr); interp->framePtr = callFramePtr; interp->numLevels ++; /* Set arguments */ Jim_ListLength(interp, cmd->argListObjPtr, &num_args); /* If last argument is 'args', don't set it here */ if (cmd->arityMax == -1) { num_args--; } for (i = 0; i < num_args; i++) { Jim_Obj *argObjPtr=NULL; Jim_Obj *nameObjPtr=NULL; Jim_Obj *valueObjPtr=NULL; Jim_ListIndex(interp, cmd->argListObjPtr, i, &argObjPtr, JIM_NONE); if (i + 1 >= cmd->arityMin) { /* The name is the first element of the list */ Jim_ListIndex(interp, argObjPtr, 0, &nameObjPtr, JIM_NONE); } else { /* The element arg is the name */ nameObjPtr = argObjPtr; } if (i + 1 >= argc) { /* No more values, so use default */ /* The value is the second element of the list */ Jim_ListIndex(interp, argObjPtr, 1, &valueObjPtr, JIM_NONE); } else { valueObjPtr = argv[i + 1]; } Jim_SetVariable(interp, nameObjPtr, valueObjPtr); } /* Set optional arguments */ if (cmd->arityMax == -1) { Jim_Obj *listObjPtr=NULL, *objPtr=NULL; i++; listObjPtr = Jim_NewListObj(interp, argv + i, argc-i); Jim_ListIndex(interp, cmd->argListObjPtr, num_args, &objPtr, JIM_NONE); Jim_SetVariable(interp, objPtr, listObjPtr); } /* Eval the body */ retcode = Jim_EvalObj(interp, cmd->bodyObjPtr); /* Destroy the callframe */ interp->numLevels --; interp->framePtr = interp->framePtr->parentCallFrame; if (callFramePtr->vars.size != JIM_HT_INITIAL_SIZE) { JimFreeCallFrame(interp, callFramePtr, JIM_FCF_NONE); } else { JimFreeCallFrame(interp, callFramePtr, JIM_FCF_NOHT); } /* Handle the JIM_EVAL return code */ if (retcode == JIM_EVAL && interp->evalRetcodeLevel != interp->numLevels) { int savedLevel = interp->evalRetcodeLevel; interp->evalRetcodeLevel = interp->numLevels; while (retcode == JIM_EVAL) { Jim_Obj *resultScriptObjPtr = Jim_GetResult(interp); Jim_IncrRefCount(resultScriptObjPtr); retcode = Jim_EvalObj(interp, resultScriptObjPtr); Jim_DecrRefCount(interp, resultScriptObjPtr); } interp->evalRetcodeLevel = savedLevel; } /* Handle the JIM_RETURN return code */ if (retcode == JIM_RETURN) { retcode = interp->returnCode; interp->returnCode = JIM_OK; } return retcode; } int Jim_Eval_Named(Jim_Interp *interp, const char *script, const char *filename, int lineno) { int retval; Jim_Obj *scriptObjPtr; scriptObjPtr = Jim_NewStringObj(interp, script, -1); Jim_IncrRefCount(scriptObjPtr); if (filename) { JimSetSourceInfo(interp, scriptObjPtr, filename, lineno); } retval = Jim_EvalObj(interp, scriptObjPtr); Jim_DecrRefCount(interp, scriptObjPtr); return retval; } int Jim_Eval(Jim_Interp *interp, const char *script) { return Jim_Eval_Named(interp, script, NULL, 0); } /* Execute script in the scope of the global level */ int Jim_EvalGlobal(Jim_Interp *interp, const char *script) { Jim_CallFrame *savedFramePtr; int retval; savedFramePtr = interp->framePtr; interp->framePtr = interp->topFramePtr; retval = Jim_Eval(interp, script); interp->framePtr = savedFramePtr; return retval; } int Jim_EvalObjBackground(Jim_Interp *interp, Jim_Obj *scriptObjPtr) { Jim_CallFrame *savedFramePtr; int retval; savedFramePtr = interp->framePtr; interp->framePtr = interp->topFramePtr; retval = Jim_EvalObj(interp, scriptObjPtr); interp->framePtr = savedFramePtr; /* Try to report the error (if any) via the bgerror proc */ if (retval != JIM_OK) { Jim_Obj *objv[2]; objv[0] = Jim_NewStringObj(interp, "bgerror", -1); objv[1] = Jim_GetResult(interp); Jim_IncrRefCount(objv[0]); Jim_IncrRefCount(objv[1]); if (Jim_EvalObjVector(interp, 2, objv) != JIM_OK) { /* Report the error to stderr. */ Jim_fprintf(interp, interp->cookie_stderr, "Background error:" JIM_NL); Jim_PrintErrorMessage(interp); } Jim_DecrRefCount(interp, objv[0]); Jim_DecrRefCount(interp, objv[1]); } return retval; } int Jim_EvalFile(Jim_Interp *interp, const char *filename) { char *prg = NULL; FILE *fp; int nread, totread, maxlen, buflen; int retval; Jim_Obj *scriptObjPtr; if ((fp = fopen(filename, "r")) == NULL) { const int cwd_len = 2048; char *cwd = malloc(cwd_len); Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); if (!getcwd(cwd, cwd_len)) strcpy(cwd, "unknown"); Jim_AppendStrings(interp, Jim_GetResult(interp), "Error loading script \"", filename, "\"", " cwd: ", cwd, " err: ", strerror(errno), NULL); free(cwd); return JIM_ERR; } buflen = 1024; maxlen = totread = 0; while (1) { if (maxlen < totread + buflen + 1) { maxlen = totread + buflen + 1; prg = Jim_Realloc(prg, maxlen); } /* do not use Jim_fread() - this is really a file */ if ((nread = fread(prg + totread, 1, buflen, fp)) == 0) break; totread += nread; } prg[totread] = '\0'; /* do not use Jim_fclose() - this is really a file */ fclose(fp); scriptObjPtr = Jim_NewStringObjNoAlloc(interp, prg, totread); JimSetSourceInfo(interp, scriptObjPtr, filename, 1); Jim_IncrRefCount(scriptObjPtr); retval = Jim_EvalObj(interp, scriptObjPtr); Jim_DecrRefCount(interp, scriptObjPtr); return retval; } /* ----------------------------------------------------------------------------- * Subst * ---------------------------------------------------------------------------*/ static int JimParseSubstStr(struct JimParserCtx *pc) { pc->tstart = pc->p; pc->tline = pc->linenr; while (*pc->p && *pc->p != '$' && *pc->p != '[') { pc->p++; pc->len--; } pc->tend = pc->p-1; pc->tt = JIM_TT_ESC; return JIM_OK; } static int JimParseSubst(struct JimParserCtx *pc, int flags) { int retval; if (pc->len == 0) { pc->tstart = pc->tend = pc->p; pc->tline = pc->linenr; pc->tt = JIM_TT_EOL; pc->eof = 1; return JIM_OK; } switch (*pc->p) { case '[': retval = JimParseCmd(pc); if (flags & JIM_SUBST_NOCMD) { pc->tstart--; pc->tend++; pc->tt = (flags & JIM_SUBST_NOESC) ? JIM_TT_STR : JIM_TT_ESC; } return retval; break; case '$': if (JimParseVar(pc) == JIM_ERR) { pc->tstart = pc->tend = pc->p++; pc->len--; pc->tline = pc->linenr; pc->tt = JIM_TT_STR; } else { if (flags & JIM_SUBST_NOVAR) { pc->tstart--; if (flags & JIM_SUBST_NOESC) pc->tt = JIM_TT_STR; else pc->tt = JIM_TT_ESC; if (*pc->tstart == '{') { pc->tstart--; if (*(pc->tend + 1)) pc->tend++; } } } break; default: retval = JimParseSubstStr(pc); if (flags & JIM_SUBST_NOESC) pc->tt = JIM_TT_STR; return retval; break; } return JIM_OK; } /* The subst object type reuses most of the data structures and functions * of the script object. Script's data structures are a bit more complex * for what is needed for [subst]itution tasks, but the reuse helps to * deal with a single data structure at the cost of some more memory * usage for substitutions. */ static Jim_ObjType substObjType = { "subst", FreeScriptInternalRep, DupScriptInternalRep, NULL, JIM_TYPE_REFERENCES, }; /* This method takes the string representation of an object * as a Tcl string where to perform [subst]itution, and generates * the pre-parsed internal representation. */ int SetSubstFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr, int flags) { int scriptTextLen; const char *scriptText = Jim_GetString(objPtr, &scriptTextLen); struct JimParserCtx parser; struct ScriptObj *script = Jim_Alloc(sizeof(*script)); script->len = 0; script->csLen = 0; script->commands = 0; script->token = NULL; script->cmdStruct = NULL; script->inUse = 1; script->substFlags = flags; script->fileName = NULL; JimParserInit(&parser, scriptText, scriptTextLen, 1); while (1) { char *token; int len, type, linenr; JimParseSubst(&parser, flags); if (JimParserEof(&parser)) break; token = JimParserGetToken(&parser, &len, &type, &linenr); ScriptObjAddToken(interp, script, token, len, type, NULL, linenr); } /* Free the old internal rep and set the new one. */ Jim_FreeIntRep(interp, objPtr); Jim_SetIntRepPtr(objPtr, script); objPtr->typePtr = &scriptObjType; return JIM_OK; } ScriptObj *Jim_GetSubst(Jim_Interp *interp, Jim_Obj *objPtr, int flags) { struct ScriptObj *script = Jim_GetIntRepPtr(objPtr); if (objPtr->typePtr != &substObjType || script->substFlags != flags) SetSubstFromAny(interp, objPtr, flags); return (ScriptObj*) Jim_GetIntRepPtr(objPtr); } /* Performs commands,variables,blackslashes substitution, * storing the result object (with refcount 0) into * resObjPtrPtr. */ int Jim_SubstObj(Jim_Interp *interp, Jim_Obj *substObjPtr, Jim_Obj **resObjPtrPtr, int flags) { ScriptObj *script; ScriptToken *token; int i, len, retcode = JIM_OK; Jim_Obj *resObjPtr, *savedResultObjPtr; script = Jim_GetSubst(interp, substObjPtr, flags); #ifdef JIM_OPTIMIZATION /* Fast path for a very common case with array-alike syntax, * that's: $foo($bar) */ if (script->len == 1 && script->token[0].type == JIM_TT_VAR) { Jim_Obj *varObjPtr = script->token[0].objPtr; Jim_IncrRefCount(varObjPtr); resObjPtr = Jim_GetVariable(interp, varObjPtr, JIM_ERRMSG); if (resObjPtr == NULL) { Jim_DecrRefCount(interp, varObjPtr); return JIM_ERR; } Jim_DecrRefCount(interp, varObjPtr); *resObjPtrPtr = resObjPtr; return JIM_OK; } #endif Jim_IncrRefCount(substObjPtr); /* Make sure it's shared. */ /* In order to preserve the internal rep, we increment the * inUse field of the script internal rep structure. */ script->inUse++; token = script->token; len = script->len; /* Save the interp old result, to set it again before * to return. */ savedResultObjPtr = interp->result; Jim_IncrRefCount(savedResultObjPtr); /* Perform the substitution. Starts with an empty object * and adds every token (performing the appropriate * var/command/escape substitution). */ resObjPtr = Jim_NewStringObj(interp, "", 0); for (i = 0; i < len; i++) { Jim_Obj *objPtr; switch (token[i].type) { case JIM_TT_STR: case JIM_TT_ESC: Jim_AppendObj(interp, resObjPtr, token[i].objPtr); break; case JIM_TT_VAR: objPtr = Jim_GetVariable(interp, token[i].objPtr, JIM_ERRMSG); if (objPtr == NULL) goto err; Jim_IncrRefCount(objPtr); Jim_AppendObj(interp, resObjPtr, objPtr); Jim_DecrRefCount(interp, objPtr); break; case JIM_TT_DICTSUGAR: objPtr = Jim_ExpandDictSugar(interp, token[i].objPtr); if (!objPtr) { retcode = JIM_ERR; goto err; } break; case JIM_TT_CMD: if (Jim_EvalObj(interp, token[i].objPtr) != JIM_OK) goto err; Jim_AppendObj(interp, resObjPtr, interp->result); break; default: Jim_Panic(interp, "default token type (%d) reached " "in Jim_SubstObj().", token[i].type); break; } } ok: if (retcode == JIM_OK) Jim_SetResult(interp, savedResultObjPtr); Jim_DecrRefCount(interp, savedResultObjPtr); /* Note that we don't have to decrement inUse, because the * following code transfers our use of the reference again to * the script object. */ Jim_FreeIntRep(interp, substObjPtr); substObjPtr->typePtr = &scriptObjType; Jim_SetIntRepPtr(substObjPtr, script); Jim_DecrRefCount(interp, substObjPtr); *resObjPtrPtr = resObjPtr; return retcode; err: Jim_FreeNewObj(interp, resObjPtr); retcode = JIM_ERR; goto ok; } /* ----------------------------------------------------------------------------- * API Input/Export functions * ---------------------------------------------------------------------------*/ int Jim_GetApi(Jim_Interp *interp, const char *funcname, void *targetPtrPtr) { Jim_HashEntry *he; he = Jim_FindHashEntry(&interp->stub, funcname); if (!he) return JIM_ERR; memcpy(targetPtrPtr, &he->val, sizeof(void*)); return JIM_OK; } int Jim_RegisterApi(Jim_Interp *interp, const char *funcname, void *funcptr) { return Jim_AddHashEntry(&interp->stub, funcname, funcptr); } #define JIM_REGISTER_API(name) \ Jim_RegisterApi(interp, "Jim_" #name, (void *)Jim_ ## name) void JimRegisterCoreApi(Jim_Interp *interp) { interp->getApiFuncPtr = Jim_GetApi; JIM_REGISTER_API(Alloc); JIM_REGISTER_API(Free); JIM_REGISTER_API(Eval); JIM_REGISTER_API(Eval_Named); JIM_REGISTER_API(EvalGlobal); JIM_REGISTER_API(EvalFile); JIM_REGISTER_API(EvalObj); JIM_REGISTER_API(EvalObjBackground); JIM_REGISTER_API(EvalObjVector); JIM_REGISTER_API(InitHashTable); JIM_REGISTER_API(ExpandHashTable); JIM_REGISTER_API(AddHashEntry); JIM_REGISTER_API(ReplaceHashEntry); JIM_REGISTER_API(DeleteHashEntry); JIM_REGISTER_API(FreeHashTable); JIM_REGISTER_API(FindHashEntry); JIM_REGISTER_API(ResizeHashTable); JIM_REGISTER_API(GetHashTableIterator); JIM_REGISTER_API(NextHashEntry); JIM_REGISTER_API(NewObj); JIM_REGISTER_API(FreeObj); JIM_REGISTER_API(InvalidateStringRep); JIM_REGISTER_API(InitStringRep); JIM_REGISTER_API(DuplicateObj); JIM_REGISTER_API(GetString); JIM_REGISTER_API(Length); JIM_REGISTER_API(InvalidateStringRep); JIM_REGISTER_API(NewStringObj); JIM_REGISTER_API(NewStringObjNoAlloc); JIM_REGISTER_API(AppendString); JIM_REGISTER_API(AppendString_sprintf); JIM_REGISTER_API(AppendObj); JIM_REGISTER_API(AppendStrings); JIM_REGISTER_API(StringEqObj); JIM_REGISTER_API(StringMatchObj); JIM_REGISTER_API(StringRangeObj); JIM_REGISTER_API(FormatString); JIM_REGISTER_API(CompareStringImmediate); JIM_REGISTER_API(NewReference); JIM_REGISTER_API(GetReference); JIM_REGISTER_API(SetFinalizer); JIM_REGISTER_API(GetFinalizer); JIM_REGISTER_API(CreateInterp); JIM_REGISTER_API(FreeInterp); JIM_REGISTER_API(GetExitCode); JIM_REGISTER_API(SetStdin); JIM_REGISTER_API(SetStdout); JIM_REGISTER_API(SetStderr); JIM_REGISTER_API(CreateCommand); JIM_REGISTER_API(CreateProcedure); JIM_REGISTER_API(DeleteCommand); JIM_REGISTER_API(RenameCommand); JIM_REGISTER_API(GetCommand); JIM_REGISTER_API(SetVariable); JIM_REGISTER_API(SetVariableStr); JIM_REGISTER_API(SetGlobalVariableStr); JIM_REGISTER_API(SetVariableStrWithStr); JIM_REGISTER_API(SetVariableLink); JIM_REGISTER_API(GetVariable); JIM_REGISTER_API(GetCallFrameByLevel); JIM_REGISTER_API(Collect); JIM_REGISTER_API(CollectIfNeeded); JIM_REGISTER_API(GetIndex); JIM_REGISTER_API(NewListObj); JIM_REGISTER_API(ListAppendElement); JIM_REGISTER_API(ListAppendList); JIM_REGISTER_API(ListLength); JIM_REGISTER_API(ListIndex); JIM_REGISTER_API(SetListIndex); JIM_REGISTER_API(ConcatObj); JIM_REGISTER_API(NewDictObj); JIM_REGISTER_API(DictKey); JIM_REGISTER_API(DictKeysVector); JIM_REGISTER_API(GetIndex); JIM_REGISTER_API(GetReturnCode); JIM_REGISTER_API(EvalExpression); JIM_REGISTER_API(GetBoolFromExpr); JIM_REGISTER_API(GetWide); JIM_REGISTER_API(GetLong); JIM_REGISTER_API(SetWide); JIM_REGISTER_API(NewIntObj); JIM_REGISTER_API(GetDouble); JIM_REGISTER_API(SetDouble); JIM_REGISTER_API(NewDoubleObj); JIM_REGISTER_API(WrongNumArgs); JIM_REGISTER_API(SetDictKeysVector); JIM_REGISTER_API(SubstObj); JIM_REGISTER_API(RegisterApi); JIM_REGISTER_API(PrintErrorMessage); JIM_REGISTER_API(InteractivePrompt); JIM_REGISTER_API(RegisterCoreCommands); JIM_REGISTER_API(GetSharedString); JIM_REGISTER_API(ReleaseSharedString); JIM_REGISTER_API(Panic); JIM_REGISTER_API(StrDup); JIM_REGISTER_API(UnsetVariable); JIM_REGISTER_API(GetVariableStr); JIM_REGISTER_API(GetGlobalVariable); JIM_REGISTER_API(GetGlobalVariableStr); JIM_REGISTER_API(GetAssocData); JIM_REGISTER_API(SetAssocData); JIM_REGISTER_API(DeleteAssocData); JIM_REGISTER_API(GetEnum); JIM_REGISTER_API(ScriptIsComplete); JIM_REGISTER_API(PackageRequire); JIM_REGISTER_API(PackageProvide); JIM_REGISTER_API(InitStack); JIM_REGISTER_API(FreeStack); JIM_REGISTER_API(StackLen); JIM_REGISTER_API(StackPush); JIM_REGISTER_API(StackPop); JIM_REGISTER_API(StackPeek); JIM_REGISTER_API(FreeStackElements); JIM_REGISTER_API(fprintf); JIM_REGISTER_API(vfprintf); JIM_REGISTER_API(fwrite); JIM_REGISTER_API(fread); JIM_REGISTER_API(fflush); JIM_REGISTER_API(fgets); JIM_REGISTER_API(GetNvp); JIM_REGISTER_API(Nvp_name2value); JIM_REGISTER_API(Nvp_name2value_simple); JIM_REGISTER_API(Nvp_name2value_obj); JIM_REGISTER_API(Nvp_name2value_nocase); JIM_REGISTER_API(Nvp_name2value_obj_nocase); JIM_REGISTER_API(Nvp_value2name); JIM_REGISTER_API(Nvp_value2name_simple); JIM_REGISTER_API(Nvp_value2name_obj); JIM_REGISTER_API(GetOpt_Setup); JIM_REGISTER_API(GetOpt_Debug); JIM_REGISTER_API(GetOpt_Obj); JIM_REGISTER_API(GetOpt_String); JIM_REGISTER_API(GetOpt_Double); JIM_REGISTER_API(GetOpt_Wide); JIM_REGISTER_API(GetOpt_Nvp); JIM_REGISTER_API(GetOpt_NvpUnknown); JIM_REGISTER_API(GetOpt_Enum); JIM_REGISTER_API(Debug_ArgvString); JIM_REGISTER_API(SetResult_sprintf); JIM_REGISTER_API(SetResult_NvpUnknown); } /* ----------------------------------------------------------------------------- * Core commands utility functions * ---------------------------------------------------------------------------*/ void Jim_WrongNumArgs(Jim_Interp *interp, int argc, Jim_Obj *const *argv, const char *msg) { int i; Jim_Obj *objPtr = Jim_NewEmptyStringObj(interp); Jim_AppendString(interp, objPtr, "wrong # args: should be \"", -1); for (i = 0; i < argc; i++) { Jim_AppendObj(interp, objPtr, argv[i]); if (!(i + 1 == argc && msg[0] == '\0')) Jim_AppendString(interp, objPtr, " ", 1); } Jim_AppendString(interp, objPtr, msg, -1); Jim_AppendString(interp, objPtr, "\"", 1); Jim_SetResult(interp, objPtr); } static Jim_Obj *JimCommandsList(Jim_Interp *interp, Jim_Obj *patternObjPtr) { Jim_HashTableIterator *htiter; Jim_HashEntry *he; Jim_Obj *listObjPtr = Jim_NewListObj(interp, NULL, 0); const char *pattern; int patternLen=0; pattern = patternObjPtr ? Jim_GetString(patternObjPtr, &patternLen) : NULL; htiter = Jim_GetHashTableIterator(&interp->commands); while ((he = Jim_NextHashEntry(htiter)) != NULL) { if (pattern && !JimStringMatch(pattern, patternLen, he->key, strlen((const char*)he->key), 0)) continue; Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, he->key, -1)); } Jim_FreeHashTableIterator(htiter); return listObjPtr; } #define JIM_VARLIST_GLOBALS 0 #define JIM_VARLIST_LOCALS 1 #define JIM_VARLIST_VARS 2 static Jim_Obj *JimVariablesList(Jim_Interp *interp, Jim_Obj *patternObjPtr, int mode) { Jim_HashTableIterator *htiter; Jim_HashEntry *he; Jim_Obj *listObjPtr = Jim_NewListObj(interp, NULL, 0); const char *pattern; int patternLen=0; pattern = patternObjPtr ? Jim_GetString(patternObjPtr, &patternLen) : NULL; if (mode == JIM_VARLIST_GLOBALS) { htiter = Jim_GetHashTableIterator(&interp->topFramePtr->vars); } else { /* For [info locals], if we are at top level an emtpy list * is returned. I don't agree, but we aim at compatibility (SS) */ if (mode == JIM_VARLIST_LOCALS && interp->framePtr == interp->topFramePtr) return listObjPtr; htiter = Jim_GetHashTableIterator(&interp->framePtr->vars); } while ((he = Jim_NextHashEntry(htiter)) != NULL) { Jim_Var *varPtr = (Jim_Var*) he->val; if (mode == JIM_VARLIST_LOCALS) { if (varPtr->linkFramePtr != NULL) continue; } if (pattern && !JimStringMatch(pattern, patternLen, he->key, strlen((const char*)he->key), 0)) continue; Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, he->key, -1)); } Jim_FreeHashTableIterator(htiter); return listObjPtr; } static int JimInfoLevel(Jim_Interp *interp, Jim_Obj *levelObjPtr, Jim_Obj **objPtrPtr) { Jim_CallFrame *targetCallFrame; if (JimGetCallFrameByInteger(interp, levelObjPtr, &targetCallFrame) != JIM_OK) return JIM_ERR; /* No proc call at toplevel callframe */ if (targetCallFrame == interp->topFramePtr) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "bad level \"", Jim_GetString(levelObjPtr, NULL), "\"", NULL); return JIM_ERR; } *objPtrPtr = Jim_NewListObj(interp, targetCallFrame->argv, targetCallFrame->argc); return JIM_OK; } /* ----------------------------------------------------------------------------- * Core commands * ---------------------------------------------------------------------------*/ /* fake [puts] -- not the real puts, just for debugging. */ static int Jim_PutsCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { const char *str; int len, nonewline = 0; if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "-nonewline string"); return JIM_ERR; } if (argc == 3) { if (!Jim_CompareStringImmediate(interp, argv[1], "-nonewline")) { Jim_SetResultString(interp, "The second argument must " "be -nonewline", -1); return JIM_OK; } else { nonewline = 1; argv++; } } str = Jim_GetString(argv[1], &len); Jim_fwrite(interp, str, 1, len, interp->cookie_stdout); if (!nonewline) Jim_fprintf(interp, interp->cookie_stdout, JIM_NL); return JIM_OK; } /* Helper for [+] and [*] */ static int Jim_AddMulHelper(Jim_Interp *interp, int argc, Jim_Obj *const *argv, int op) { jim_wide wideValue, res; double doubleValue, doubleRes; int i; res = (op == JIM_EXPROP_ADD) ? 0 : 1; for (i = 1; i < argc; i++) { if (Jim_GetWide(interp, argv[i], &wideValue) != JIM_OK) goto trydouble; if (op == JIM_EXPROP_ADD) res += wideValue; else res *= wideValue; } Jim_SetResult(interp, Jim_NewIntObj(interp, res)); return JIM_OK; trydouble: doubleRes = (double) res; for (;i < argc; i++) { if (Jim_GetDouble(interp, argv[i], &doubleValue) != JIM_OK) return JIM_ERR; if (op == JIM_EXPROP_ADD) doubleRes += doubleValue; else doubleRes *= doubleValue; } Jim_SetResult(interp, Jim_NewDoubleObj(interp, doubleRes)); return JIM_OK; } /* Helper for [-] and [/] */ static int Jim_SubDivHelper(Jim_Interp *interp, int argc, Jim_Obj *const *argv, int op) { jim_wide wideValue, res = 0; double doubleValue, doubleRes = 0; int i = 2; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "number ?number ... number?"); return JIM_ERR; } else if (argc == 2) { /* The arity = 2 case is different. For [- x] returns -x, * while [/ x] returns 1/x. */ if (Jim_GetWide(interp, argv[1], &wideValue) != JIM_OK) { if (Jim_GetDouble(interp, argv[1], &doubleValue) != JIM_OK) { return JIM_ERR; } else { if (op == JIM_EXPROP_SUB) doubleRes = -doubleValue; else doubleRes = 1.0/doubleValue; Jim_SetResult(interp, Jim_NewDoubleObj(interp, doubleRes)); return JIM_OK; } } if (op == JIM_EXPROP_SUB) { res = -wideValue; Jim_SetResult(interp, Jim_NewIntObj(interp, res)); } else { doubleRes = 1.0/wideValue; Jim_SetResult(interp, Jim_NewDoubleObj(interp, doubleRes)); } return JIM_OK; } else { if (Jim_GetWide(interp, argv[1], &res) != JIM_OK) { if (Jim_GetDouble(interp, argv[1], &doubleRes) != JIM_OK) { return JIM_ERR; } else { goto trydouble; } } } for (i = 2; i < argc; i++) { if (Jim_GetWide(interp, argv[i], &wideValue) != JIM_OK) { doubleRes = (double) res; goto trydouble; } if (op == JIM_EXPROP_SUB) res -= wideValue; else res /= wideValue; } Jim_SetResult(interp, Jim_NewIntObj(interp, res)); return JIM_OK; trydouble: for (;i < argc; i++) { if (Jim_GetDouble(interp, argv[i], &doubleValue) != JIM_OK) return JIM_ERR; if (op == JIM_EXPROP_SUB) doubleRes -= doubleValue; else doubleRes /= doubleValue; } Jim_SetResult(interp, Jim_NewDoubleObj(interp, doubleRes)); return JIM_OK; } /* [+] */ static int Jim_AddCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { return Jim_AddMulHelper(interp, argc, argv, JIM_EXPROP_ADD); } /* [*] */ static int Jim_MulCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { return Jim_AddMulHelper(interp, argc, argv, JIM_EXPROP_MUL); } /* [-] */ static int Jim_SubCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { return Jim_SubDivHelper(interp, argc, argv, JIM_EXPROP_SUB); } /* [/] */ static int Jim_DivCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { return Jim_SubDivHelper(interp, argc, argv, JIM_EXPROP_DIV); } /* [set] */ static int Jim_SetCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "varName ?newValue?"); return JIM_ERR; } if (argc == 2) { Jim_Obj *objPtr; objPtr = Jim_GetVariable(interp, argv[1], JIM_ERRMSG); if (!objPtr) return JIM_ERR; Jim_SetResult(interp, objPtr); return JIM_OK; } /* argc == 3 case. */ if (Jim_SetVariable(interp, argv[1], argv[2]) != JIM_OK) return JIM_ERR; Jim_SetResult(interp, argv[2]); return JIM_OK; } /* [unset] */ static int Jim_UnsetCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int i; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "varName ?varName ...?"); return JIM_ERR; } for (i = 1; i < argc; i++) { if (Jim_UnsetVariable(interp, argv[i], JIM_ERRMSG) != JIM_OK) return JIM_ERR; } return JIM_OK; } /* [incr] */ static int Jim_IncrCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { jim_wide wideValue, increment = 1; Jim_Obj *intObjPtr; if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "varName ?increment?"); return JIM_ERR; } if (argc == 3) { if (Jim_GetWide(interp, argv[2], &increment) != JIM_OK) return JIM_ERR; } intObjPtr = Jim_GetVariable(interp, argv[1], JIM_ERRMSG); if (!intObjPtr) return JIM_ERR; if (Jim_GetWide(interp, intObjPtr, &wideValue) != JIM_OK) return JIM_ERR; if (Jim_IsShared(intObjPtr)) { intObjPtr = Jim_NewIntObj(interp, wideValue + increment); if (Jim_SetVariable(interp, argv[1], intObjPtr) != JIM_OK) { Jim_FreeNewObj(interp, intObjPtr); return JIM_ERR; } } else { Jim_SetWide(interp, intObjPtr, wideValue + increment); /* The following step is required in order to invalidate the * string repr of "FOO" if the var name is on the form of "FOO(IDX)" */ if (Jim_SetVariable(interp, argv[1], intObjPtr) != JIM_OK) { return JIM_ERR; } } Jim_SetResult(interp, intObjPtr); return JIM_OK; } /* [while] */ static int Jim_WhileCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "condition body"); return JIM_ERR; } /* Try to run a specialized version of while if the expression * is in one of the following forms: * * $a < CONST, $a < $b * $a <= CONST, $a <= $b * $a > CONST, $a > $b * $a >= CONST, $a >= $b * $a != CONST, $a != $b * $a == CONST, $a == $b * $a * !$a * CONST */ #ifdef JIM_OPTIMIZATION { ExprByteCode *expr; Jim_Obj *varAObjPtr = NULL, *varBObjPtr = NULL, *objPtr; int exprLen, retval; /* STEP 1 -- Check if there are the conditions to run the specialized * version of while */ if ((expr = Jim_GetExpression(interp, argv[1])) == NULL) goto noopt; if (expr->len <= 0 || expr->len > 3) goto noopt; switch (expr->len) { case 1: if (expr->opcode[0] != JIM_EXPROP_VARIABLE && expr->opcode[0] != JIM_EXPROP_NUMBER) goto noopt; break; case 2: if (expr->opcode[1] != JIM_EXPROP_NOT || expr->opcode[0] != JIM_EXPROP_VARIABLE) goto noopt; break; case 3: if (expr->opcode[0] != JIM_EXPROP_VARIABLE || (expr->opcode[1] != JIM_EXPROP_NUMBER && expr->opcode[1] != JIM_EXPROP_VARIABLE)) goto noopt; switch (expr->opcode[2]) { case JIM_EXPROP_LT: case JIM_EXPROP_LTE: case JIM_EXPROP_GT: case JIM_EXPROP_GTE: case JIM_EXPROP_NUMEQ: case JIM_EXPROP_NUMNE: /* nothing to do */ break; default: goto noopt; } break; default: Jim_Panic(interp, "Unexpected default reached in Jim_WhileCoreCommand()"); break; } /* STEP 2 -- conditions meet. Initialization. Take different * branches for different expression lengths. */ exprLen = expr->len; if (exprLen == 1) { jim_wide wideValue=0; if (expr->opcode[0] == JIM_EXPROP_VARIABLE) { varAObjPtr = expr->obj[0]; Jim_IncrRefCount(varAObjPtr); } else { if (Jim_GetWide(interp, expr->obj[0], &wideValue) != JIM_OK) goto noopt; } while (1) { if (varAObjPtr) { if (!(objPtr = Jim_GetVariable(interp, varAObjPtr, JIM_NONE)) || Jim_GetWide(interp, objPtr, &wideValue) != JIM_OK) { Jim_DecrRefCount(interp, varAObjPtr); goto noopt; } } if (!wideValue) break; if ((retval = Jim_EvalObj(interp, argv[2])) != JIM_OK) { switch (retval) { case JIM_BREAK: if (varAObjPtr) Jim_DecrRefCount(interp, varAObjPtr); goto out; break; case JIM_CONTINUE: continue; break; default: if (varAObjPtr) Jim_DecrRefCount(interp, varAObjPtr); return retval; } } } if (varAObjPtr) Jim_DecrRefCount(interp, varAObjPtr); } else if (exprLen == 3) { jim_wide wideValueA, wideValueB=0, cmpRes = 0; int cmpType = expr->opcode[2]; varAObjPtr = expr->obj[0]; Jim_IncrRefCount(varAObjPtr); if (expr->opcode[1] == JIM_EXPROP_VARIABLE) { varBObjPtr = expr->obj[1]; Jim_IncrRefCount(varBObjPtr); } else { if (Jim_GetWide(interp, expr->obj[1], &wideValueB) != JIM_OK) goto noopt; } while (1) { if (!(objPtr = Jim_GetVariable(interp, varAObjPtr, JIM_NONE)) || Jim_GetWide(interp, objPtr, &wideValueA) != JIM_OK) { Jim_DecrRefCount(interp, varAObjPtr); if (varBObjPtr) Jim_DecrRefCount(interp, varBObjPtr); goto noopt; } if (varBObjPtr) { if (!(objPtr = Jim_GetVariable(interp, varBObjPtr, JIM_NONE)) || Jim_GetWide(interp, objPtr, &wideValueB) != JIM_OK) { Jim_DecrRefCount(interp, varAObjPtr); if (varBObjPtr) Jim_DecrRefCount(interp, varBObjPtr); goto noopt; } } switch (cmpType) { case JIM_EXPROP_LT: cmpRes = wideValueA < wideValueB; break; case JIM_EXPROP_LTE: cmpRes = wideValueA <= wideValueB; break; case JIM_EXPROP_GT: cmpRes = wideValueA > wideValueB; break; case JIM_EXPROP_GTE: cmpRes = wideValueA >= wideValueB; break; case JIM_EXPROP_NUMEQ: cmpRes = wideValueA == wideValueB; break; case JIM_EXPROP_NUMNE: cmpRes = wideValueA != wideValueB; break; } if (!cmpRes) break; if ((retval = Jim_EvalObj(interp, argv[2])) != JIM_OK) { switch (retval) { case JIM_BREAK: Jim_DecrRefCount(interp, varAObjPtr); if (varBObjPtr) Jim_DecrRefCount(interp, varBObjPtr); goto out; break; case JIM_CONTINUE: continue; break; default: Jim_DecrRefCount(interp, varAObjPtr); if (varBObjPtr) Jim_DecrRefCount(interp, varBObjPtr); return retval; } } } Jim_DecrRefCount(interp, varAObjPtr); if (varBObjPtr) Jim_DecrRefCount(interp, varBObjPtr); } else { /* TODO: case for len == 2 */ goto noopt; } Jim_SetEmptyResult(interp); return JIM_OK; } noopt: #endif /* The general purpose implementation of while starts here */ while (1) { int boolean, retval; if ((retval = Jim_GetBoolFromExpr(interp, argv[1], &boolean)) != JIM_OK) return retval; if (!boolean) break; if ((retval = Jim_EvalObj(interp, argv[2])) != JIM_OK) { switch (retval) { case JIM_BREAK: goto out; break; case JIM_CONTINUE: continue; break; default: return retval; } } } out: Jim_SetEmptyResult(interp); return JIM_OK; } /* [for] */ static int Jim_ForCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int retval; if (argc != 5) { Jim_WrongNumArgs(interp, 1, argv, "start test next body"); return JIM_ERR; } /* Check if the for is on the form: * for {set i CONST} {$i < CONST} {incr i} * for {set i CONST} {$i < $j} {incr i} * for {set i CONST} {$i <= CONST} {incr i} * for {set i CONST} {$i <= $j} {incr i} * XXX: NOTE: if variable traces are implemented, this optimization * need to be modified to check for the proc epoch at every variable * update. */ #ifdef JIM_OPTIMIZATION { ScriptObj *initScript, *incrScript; ExprByteCode *expr; jim_wide start, stop=0, currentVal; unsigned jim_wide procEpoch = interp->procEpoch; Jim_Obj *varNamePtr, *stopVarNamePtr = NULL, *objPtr; int cmpType; struct Jim_Cmd *cmdPtr; /* Do it only if there aren't shared arguments */ if (argv[1] == argv[2] || argv[2] == argv[3] || argv[1] == argv[3]) goto evalstart; initScript = Jim_GetScript(interp, argv[1]); expr = Jim_GetExpression(interp, argv[2]); incrScript = Jim_GetScript(interp, argv[3]); /* Ensure proper lengths to start */ if (initScript->len != 6) goto evalstart; if (incrScript->len != 4) goto evalstart; if (expr->len != 3) goto evalstart; /* Ensure proper token types. */ if (initScript->token[2].type != JIM_TT_ESC || initScript->token[4].type != JIM_TT_ESC || incrScript->token[2].type != JIM_TT_ESC || expr->opcode[0] != JIM_EXPROP_VARIABLE || (expr->opcode[1] != JIM_EXPROP_NUMBER && expr->opcode[1] != JIM_EXPROP_VARIABLE) || (expr->opcode[2] != JIM_EXPROP_LT && expr->opcode[2] != JIM_EXPROP_LTE)) goto evalstart; cmpType = expr->opcode[2]; /* Initialization command must be [set] */ cmdPtr = Jim_GetCommand(interp, initScript->token[0].objPtr, JIM_NONE); if (cmdPtr == NULL || cmdPtr->cmdProc != Jim_SetCoreCommand) goto evalstart; /* Update command must be incr */ cmdPtr = Jim_GetCommand(interp, incrScript->token[0].objPtr, JIM_NONE); if (cmdPtr == NULL || cmdPtr->cmdProc != Jim_IncrCoreCommand) goto evalstart; /* set, incr, expression must be about the same variable */ if (!Jim_StringEqObj(initScript->token[2].objPtr, incrScript->token[2].objPtr, 0)) goto evalstart; if (!Jim_StringEqObj(initScript->token[2].objPtr, expr->obj[0], 0)) goto evalstart; /* Check that the initialization and comparison are valid integers */ if (Jim_GetWide(interp, initScript->token[4].objPtr, &start) == JIM_ERR) goto evalstart; if (expr->opcode[1] == JIM_EXPROP_NUMBER && Jim_GetWide(interp, expr->obj[1], &stop) == JIM_ERR) { goto evalstart; } /* Initialization */ varNamePtr = expr->obj[0]; if (expr->opcode[1] == JIM_EXPROP_VARIABLE) { stopVarNamePtr = expr->obj[1]; Jim_IncrRefCount(stopVarNamePtr); } Jim_IncrRefCount(varNamePtr); /* --- OPTIMIZED FOR --- */ /* Start to loop */ objPtr = Jim_NewIntObj(interp, start); if (Jim_SetVariable(interp, varNamePtr, objPtr) != JIM_OK) { Jim_DecrRefCount(interp, varNamePtr); if (stopVarNamePtr) Jim_DecrRefCount(interp, stopVarNamePtr); Jim_FreeNewObj(interp, objPtr); goto evalstart; } while (1) { /* === Check condition === */ /* Common code: */ objPtr = Jim_GetVariable(interp, varNamePtr, JIM_NONE); if (objPtr == NULL || Jim_GetWide(interp, objPtr, ¤tVal) != JIM_OK) { Jim_DecrRefCount(interp, varNamePtr); if (stopVarNamePtr) Jim_DecrRefCount(interp, stopVarNamePtr); goto testcond; } /* Immediate or Variable? get the 'stop' value if the latter. */ if (stopVarNamePtr) { objPtr = Jim_GetVariable(interp, stopVarNamePtr, JIM_NONE); if (objPtr == NULL || Jim_GetWide(interp, objPtr, &stop) != JIM_OK) { Jim_DecrRefCount(interp, varNamePtr); Jim_DecrRefCount(interp, stopVarNamePtr); goto testcond; } } if (cmpType == JIM_EXPROP_LT) { if (currentVal >= stop) break; } else { if (currentVal > stop) break; } /* Eval body */ if ((retval = Jim_EvalObj(interp, argv[4])) != JIM_OK) { switch (retval) { case JIM_BREAK: if (stopVarNamePtr) Jim_DecrRefCount(interp, stopVarNamePtr); Jim_DecrRefCount(interp, varNamePtr); goto out; case JIM_CONTINUE: /* nothing to do */ break; default: if (stopVarNamePtr) Jim_DecrRefCount(interp, stopVarNamePtr); Jim_DecrRefCount(interp, varNamePtr); return retval; } } /* If there was a change in procedures/command continue * with the usual [for] command implementation */ if (procEpoch != interp->procEpoch) { if (stopVarNamePtr) Jim_DecrRefCount(interp, stopVarNamePtr); Jim_DecrRefCount(interp, varNamePtr); goto evalnext; } /* Increment */ objPtr = Jim_GetVariable(interp, varNamePtr, JIM_ERRMSG); if (objPtr->refCount == 1 && objPtr->typePtr == &intObjType) { objPtr->internalRep.wideValue ++; Jim_InvalidateStringRep(objPtr); } else { Jim_Obj *auxObjPtr; if (Jim_GetWide(interp, objPtr, ¤tVal) == JIM_ERR) { if (stopVarNamePtr) Jim_DecrRefCount(interp, stopVarNamePtr); Jim_DecrRefCount(interp, varNamePtr); goto evalnext; } auxObjPtr = Jim_NewIntObj(interp, currentVal + 1); if (Jim_SetVariable(interp, varNamePtr, auxObjPtr) == JIM_ERR) { if (stopVarNamePtr) Jim_DecrRefCount(interp, stopVarNamePtr); Jim_DecrRefCount(interp, varNamePtr); Jim_FreeNewObj(interp, auxObjPtr); goto evalnext; } } } if (stopVarNamePtr) Jim_DecrRefCount(interp, stopVarNamePtr); Jim_DecrRefCount(interp, varNamePtr); Jim_SetEmptyResult(interp); return JIM_OK; } #endif evalstart: /* Eval start */ if ((retval = Jim_EvalObj(interp, argv[1])) != JIM_OK) return retval; while (1) { int boolean; testcond: /* Test the condition */ if ((retval = Jim_GetBoolFromExpr(interp, argv[2], &boolean)) != JIM_OK) return retval; if (!boolean) break; /* Eval body */ if ((retval = Jim_EvalObj(interp, argv[4])) != JIM_OK) { switch (retval) { case JIM_BREAK: goto out; break; case JIM_CONTINUE: /* Nothing to do */ break; default: return retval; } } evalnext: /* Eval next */ if ((retval = Jim_EvalObj(interp, argv[3])) != JIM_OK) { switch (retval) { case JIM_BREAK: goto out; break; case JIM_CONTINUE: continue; break; default: return retval; } } } out: Jim_SetEmptyResult(interp); return JIM_OK; } /* foreach + lmap implementation. */ static int JimForeachMapHelper(Jim_Interp *interp, int argc, Jim_Obj *const *argv, int doMap) { int result = JIM_ERR, i, nbrOfLists, *listsIdx, *listsEnd; int nbrOfLoops = 0; Jim_Obj *emptyStr, *script, *mapRes = NULL; if (argc < 4 || argc % 2 != 0) { Jim_WrongNumArgs(interp, 1, argv, "varList list ?varList list ...? script"); return JIM_ERR; } if (doMap) { mapRes = Jim_NewListObj(interp, NULL, 0); Jim_IncrRefCount(mapRes); } emptyStr = Jim_NewEmptyStringObj(interp); Jim_IncrRefCount(emptyStr); script = argv[argc-1]; /* Last argument is a script */ nbrOfLists = (argc - 1 - 1) / 2; /* argc - 'foreach' - script */ listsIdx = (int*)Jim_Alloc(nbrOfLists * sizeof(int)); listsEnd = (int*)Jim_Alloc(nbrOfLists*2 * sizeof(int)); /* Initialize iterators and remember max nbr elements each list */ memset(listsIdx, 0, nbrOfLists * sizeof(int)); /* Remember lengths of all lists and calculate how much rounds to loop */ for (i = 0; i < nbrOfLists*2; i += 2) { div_t cnt; int count; Jim_ListLength(interp, argv[i + 1], &listsEnd[i]); Jim_ListLength(interp, argv[i + 2], &listsEnd[i + 1]); if (listsEnd[i] == 0) { Jim_SetResultString(interp, "foreach varlist is empty", -1); goto err; } cnt = div(listsEnd[i + 1], listsEnd[i]); count = cnt.quot + (cnt.rem ? 1 : 0); if (count > nbrOfLoops) nbrOfLoops = count; } for (; nbrOfLoops-- > 0;) { for (i = 0; i < nbrOfLists; ++i) { int varIdx = 0, var = i * 2; while (varIdx < listsEnd[var]) { Jim_Obj *varName, *ele; int lst = i * 2 + 1; if (Jim_ListIndex(interp, argv[var + 1], varIdx, &varName, JIM_ERRMSG) != JIM_OK) goto err; if (listsIdx[i] < listsEnd[lst]) { if (Jim_ListIndex(interp, argv[lst + 1], listsIdx[i], &ele, JIM_ERRMSG) != JIM_OK) goto err; if (Jim_SetVariable(interp, varName, ele) != JIM_OK) { Jim_SetResultString(interp, "couldn't set loop variable: ", -1); goto err; } ++listsIdx[i]; /* Remember next iterator of current list */ } else if (Jim_SetVariable(interp, varName, emptyStr) != JIM_OK) { Jim_SetResultString(interp, "couldn't set loop variable: ", -1); goto err; } ++varIdx; /* Next variable */ } } switch (result = Jim_EvalObj(interp, script)) { case JIM_OK: if (doMap) Jim_ListAppendElement(interp, mapRes, interp->result); break; case JIM_CONTINUE: break; case JIM_BREAK: goto out; break; default: goto err; } } out: result = JIM_OK; if (doMap) Jim_SetResult(interp, mapRes); else Jim_SetEmptyResult(interp); err: if (doMap) Jim_DecrRefCount(interp, mapRes); Jim_DecrRefCount(interp, emptyStr); Jim_Free(listsIdx); Jim_Free(listsEnd); return result; } /* [foreach] */ static int Jim_ForeachCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { return JimForeachMapHelper(interp, argc, argv, 0); } /* [lmap] */ static int Jim_LmapCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { return JimForeachMapHelper(interp, argc, argv, 1); } /* [if] */ static int Jim_IfCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int boolean, retval, current = 1, falsebody = 0; if (argc >= 3) { while (1) { /* Far not enough arguments given! */ if (current >= argc) goto err; if ((retval = Jim_GetBoolFromExpr(interp, argv[current++], &boolean)) != JIM_OK) return retval; /* There lacks something, isn't it? */ if (current >= argc) goto err; if (Jim_CompareStringImmediate(interp, argv[current], "then")) current++; /* Tsk tsk, no then-clause? */ if (current >= argc) goto err; if (boolean) return Jim_EvalObj(interp, argv[current]); /* Ok: no else-clause follows */ if (++current >= argc) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); return JIM_OK; } falsebody = current++; if (Jim_CompareStringImmediate(interp, argv[falsebody], "else")) { /* IIICKS - else-clause isn't last cmd? */ if (current != argc-1) goto err; return Jim_EvalObj(interp, argv[current]); } else if (Jim_CompareStringImmediate(interp, argv[falsebody], "elseif")) /* Ok: elseif follows meaning all the stuff * again (how boring...) */ continue; /* OOPS - else-clause is not last cmd?*/ else if (falsebody != argc-1) goto err; return Jim_EvalObj(interp, argv[falsebody]); } return JIM_OK; } err: Jim_WrongNumArgs(interp, 1, argv, "condition ?then? trueBody ?elseif ...? ?else? falseBody"); return JIM_ERR; } enum {SWITCH_EXACT, SWITCH_GLOB, SWITCH_RE, SWITCH_CMD, SWITCH_UNKNOWN}; /* [switch] */ static int Jim_SwitchCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int retcode = JIM_ERR, matchOpt = SWITCH_EXACT, opt = 1, patCount, i; Jim_Obj *command = 0, *const *caseList = 0, *strObj; Jim_Obj *script = 0; if (argc < 3) goto wrongnumargs; for (opt = 1; opt < argc; ++opt) { const char *option = Jim_GetString(argv[opt], 0); if (*option != '-') break; else if (strncmp(option, "--", 2) == 0) { ++opt; break; } else if (strncmp(option, "-exact", 2) == 0) matchOpt = SWITCH_EXACT; else if (strncmp(option, "-glob", 2) == 0) matchOpt = SWITCH_GLOB; else if (strncmp(option, "-regexp", 2) == 0) matchOpt = SWITCH_RE; else if (strncmp(option, "-command", 2) == 0) { matchOpt = SWITCH_CMD; if ((argc - opt) < 2) goto wrongnumargs; command = argv[++opt]; } else { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "bad option \"", option, "\": must be -exact, -glob, " "-regexp, -command procname or --", 0); goto err; } if ((argc - opt) < 2) goto wrongnumargs; } strObj = argv[opt++]; patCount = argc - opt; if (patCount == 1) { Jim_Obj **vector; JimListGetElements(interp, argv[opt], &patCount, &vector); caseList = vector; } else caseList = &argv[opt]; if (patCount == 0 || patCount % 2 != 0) goto wrongnumargs; for (i = 0; script == 0 && i < patCount; i += 2) { Jim_Obj *patObj = caseList[i]; if (!Jim_CompareStringImmediate(interp, patObj, "default") || i < (patCount-2)) { switch (matchOpt) { case SWITCH_EXACT: if (Jim_StringEqObj(strObj, patObj, 0)) script = caseList[i + 1]; break; case SWITCH_GLOB: if (Jim_StringMatchObj(patObj, strObj, 0)) script = caseList[i + 1]; break; case SWITCH_RE: command = Jim_NewStringObj(interp, "regexp", -1); /* Fall thru intentionally */ case SWITCH_CMD: { Jim_Obj *parms[] = {command, patObj, strObj}; int rc = Jim_EvalObjVector(interp, 3, parms); long matching; /* After the execution of a command we need to * make sure to reconvert the object into a list * again. Only for the single-list style [switch]. */ if (argc-opt == 1) { Jim_Obj **vector; JimListGetElements(interp, argv[opt], &patCount, &vector); caseList = vector; } /* command is here already decref'd */ if (rc != JIM_OK) { retcode = rc; goto err; } rc = Jim_GetLong(interp, Jim_GetResult(interp), &matching); if (rc != JIM_OK) { retcode = rc; goto err; } if (matching) script = caseList[i + 1]; break; } default: Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "internal error: no such option implemented", 0); goto err; } } else { script = caseList[i + 1]; } } for (; i < patCount && Jim_CompareStringImmediate(interp, script, "-"); i += 2) script = caseList[i + 1]; if (script && Jim_CompareStringImmediate(interp, script, "-")) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "no body specified for pattern \"", Jim_GetString(caseList[i-2], 0), "\"", 0); goto err; } retcode = JIM_OK; Jim_SetEmptyResult(interp); if (script != 0) retcode = Jim_EvalObj(interp, script); return retcode; wrongnumargs: Jim_WrongNumArgs(interp, 1, argv, "?options? string " "pattern body ... ?default body? or " "{pattern body ?pattern body ...?}"); err: return retcode; } /* [list] */ static int Jim_ListCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *listObjPtr; listObjPtr = Jim_NewListObj(interp, argv + 1, argc-1); Jim_SetResult(interp, listObjPtr); return JIM_OK; } /* [lindex] */ static int Jim_LindexCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *objPtr, *listObjPtr; int i; int index; if (argc < 3) { Jim_WrongNumArgs(interp, 1, argv, "list index ?...?"); return JIM_ERR; } objPtr = argv[1]; Jim_IncrRefCount(objPtr); for (i = 2; i < argc; i++) { listObjPtr = objPtr; if (Jim_GetIndex(interp, argv[i], &index) != JIM_OK) { Jim_DecrRefCount(interp, listObjPtr); return JIM_ERR; } if (Jim_ListIndex(interp, listObjPtr, index, &objPtr, JIM_NONE) != JIM_OK) { /* Returns an empty object if the index * is out of range. */ Jim_DecrRefCount(interp, listObjPtr); Jim_SetEmptyResult(interp); return JIM_OK; } Jim_IncrRefCount(objPtr); Jim_DecrRefCount(interp, listObjPtr); } Jim_SetResult(interp, objPtr); Jim_DecrRefCount(interp, objPtr); return JIM_OK; } /* [llength] */ static int Jim_LlengthCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int len; if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "list"); return JIM_ERR; } Jim_ListLength(interp, argv[1], &len); Jim_SetResult(interp, Jim_NewIntObj(interp, len)); return JIM_OK; } /* [lappend] */ static int Jim_LappendCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *listObjPtr; int shared, i; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "varName ?value value ...?"); return JIM_ERR; } listObjPtr = Jim_GetVariable(interp, argv[1], JIM_NONE); if (!listObjPtr) { /* Create the list if it does not exists */ listObjPtr = Jim_NewListObj(interp, NULL, 0); if (Jim_SetVariable(interp, argv[1], listObjPtr) != JIM_OK) { Jim_FreeNewObj(interp, listObjPtr); return JIM_ERR; } } shared = Jim_IsShared(listObjPtr); if (shared) listObjPtr = Jim_DuplicateObj(interp, listObjPtr); for (i = 2; i < argc; i++) Jim_ListAppendElement(interp, listObjPtr, argv[i]); if (Jim_SetVariable(interp, argv[1], listObjPtr) != JIM_OK) { if (shared) Jim_FreeNewObj(interp, listObjPtr); return JIM_ERR; } Jim_SetResult(interp, listObjPtr); return JIM_OK; } /* [linsert] */ static int Jim_LinsertCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int index, len; Jim_Obj *listPtr; if (argc < 4) { Jim_WrongNumArgs(interp, 1, argv, "list index element " "?element ...?"); return JIM_ERR; } listPtr = argv[1]; if (Jim_IsShared(listPtr)) listPtr = Jim_DuplicateObj(interp, listPtr); if (Jim_GetIndex(interp, argv[2], &index) != JIM_OK) goto err; Jim_ListLength(interp, listPtr, &len); if (index >= len) index = len; else if (index < 0) index = len + index + 1; Jim_ListInsertElements(interp, listPtr, index, argc-3, &argv[3]); Jim_SetResult(interp, listPtr); return JIM_OK; err: if (listPtr != argv[1]) { Jim_FreeNewObj(interp, listPtr); } return JIM_ERR; } /* [lset] */ static int Jim_LsetCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc < 3) { Jim_WrongNumArgs(interp, 1, argv, "listVar ?index...? newVal"); return JIM_ERR; } else if (argc == 3) { if (Jim_SetVariable(interp, argv[1], argv[2]) != JIM_OK) return JIM_ERR; Jim_SetResult(interp, argv[2]); return JIM_OK; } if (Jim_SetListIndex(interp, argv[1], argv + 2, argc-3, argv[argc-1]) == JIM_ERR) return JIM_ERR; return JIM_OK; } /* [lsort] */ static int Jim_LsortCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const argv[]) { const char *options[] = { "-ascii", "-nocase", "-increasing", "-decreasing", NULL }; enum {OPT_ASCII, OPT_NOCASE, OPT_INCREASING, OPT_DECREASING}; Jim_Obj *resObj; int i, lsortType = JIM_LSORT_ASCII; /* default sort type */ int decreasing = 0; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "?options? list"); return JIM_ERR; } for (i = 1; i < (argc-1); i++) { int option; if (Jim_GetEnum(interp, argv[i], options, &option, "option", JIM_ERRMSG) != JIM_OK) return JIM_ERR; switch (option) { case OPT_ASCII: lsortType = JIM_LSORT_ASCII; break; case OPT_NOCASE: lsortType = JIM_LSORT_NOCASE; break; case OPT_INCREASING: decreasing = 0; break; case OPT_DECREASING: decreasing = 1; break; } } if (decreasing) { switch (lsortType) { case JIM_LSORT_ASCII: lsortType = JIM_LSORT_ASCII_DECR; break; case JIM_LSORT_NOCASE: lsortType = JIM_LSORT_NOCASE_DECR; break; } } resObj = Jim_DuplicateObj(interp, argv[argc-1]); ListSortElements(interp, resObj, lsortType); Jim_SetResult(interp, resObj); return JIM_OK; } /* [append] */ static int Jim_AppendCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *stringObjPtr; int shared, i; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "varName ?value value ...?"); return JIM_ERR; } if (argc == 2) { stringObjPtr = Jim_GetVariable(interp, argv[1], JIM_ERRMSG); if (!stringObjPtr) return JIM_ERR; } else { stringObjPtr = Jim_GetVariable(interp, argv[1], JIM_NONE); if (!stringObjPtr) { /* Create the string if it does not exists */ stringObjPtr = Jim_NewEmptyStringObj(interp); if (Jim_SetVariable(interp, argv[1], stringObjPtr) != JIM_OK) { Jim_FreeNewObj(interp, stringObjPtr); return JIM_ERR; } } } shared = Jim_IsShared(stringObjPtr); if (shared) stringObjPtr = Jim_DuplicateObj(interp, stringObjPtr); for (i = 2; i < argc; i++) Jim_AppendObj(interp, stringObjPtr, argv[i]); if (Jim_SetVariable(interp, argv[1], stringObjPtr) != JIM_OK) { if (shared) Jim_FreeNewObj(interp, stringObjPtr); return JIM_ERR; } Jim_SetResult(interp, stringObjPtr); return JIM_OK; } /* [debug] */ static int Jim_DebugCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { const char *options[] = { "refcount", "objcount", "objects", "invstr", "scriptlen", "exprlen", "exprbc", NULL }; enum { OPT_REFCOUNT, OPT_OBJCOUNT, OPT_OBJECTS, OPT_INVSTR, OPT_SCRIPTLEN, OPT_EXPRLEN, OPT_EXPRBC }; int option; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "option ?...?"); return JIM_ERR; } if (Jim_GetEnum(interp, argv[1], options, &option, "option", JIM_ERRMSG) != JIM_OK) return JIM_ERR; if (option == OPT_REFCOUNT) { if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "object"); return JIM_ERR; } Jim_SetResult(interp, Jim_NewIntObj(interp, argv[2]->refCount)); return JIM_OK; } else if (option == OPT_OBJCOUNT) { int freeobj = 0, liveobj = 0; char buf[256]; Jim_Obj *objPtr; if (argc != 2) { Jim_WrongNumArgs(interp, 2, argv, ""); return JIM_ERR; } /* Count the number of free objects. */ objPtr = interp->freeList; while (objPtr) { freeobj++; objPtr = objPtr->nextObjPtr; } /* Count the number of live objects. */ objPtr = interp->liveList; while (objPtr) { liveobj++; objPtr = objPtr->nextObjPtr; } /* Set the result string and return. */ sprintf(buf, "free %d used %d", freeobj, liveobj); Jim_SetResultString(interp, buf, -1); return JIM_OK; } else if (option == OPT_OBJECTS) { Jim_Obj *objPtr, *listObjPtr, *subListObjPtr; /* Count the number of live objects. */ objPtr = interp->liveList; listObjPtr = Jim_NewListObj(interp, NULL, 0); while (objPtr) { char buf[128]; const char *type = objPtr->typePtr ? objPtr->typePtr->name : ""; subListObjPtr = Jim_NewListObj(interp, NULL, 0); sprintf(buf, "%p", objPtr); Jim_ListAppendElement(interp, subListObjPtr, Jim_NewStringObj(interp, buf, -1)); Jim_ListAppendElement(interp, subListObjPtr, Jim_NewStringObj(interp, type, -1)); Jim_ListAppendElement(interp, subListObjPtr, Jim_NewIntObj(interp, objPtr->refCount)); Jim_ListAppendElement(interp, subListObjPtr, objPtr); Jim_ListAppendElement(interp, listObjPtr, subListObjPtr); objPtr = objPtr->nextObjPtr; } Jim_SetResult(interp, listObjPtr); return JIM_OK; } else if (option == OPT_INVSTR) { Jim_Obj *objPtr; if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "object"); return JIM_ERR; } objPtr = argv[2]; if (objPtr->typePtr != NULL) Jim_InvalidateStringRep(objPtr); Jim_SetEmptyResult(interp); return JIM_OK; } else if (option == OPT_SCRIPTLEN) { ScriptObj *script; if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "script"); return JIM_ERR; } script = Jim_GetScript(interp, argv[2]); Jim_SetResult(interp, Jim_NewIntObj(interp, script->len)); return JIM_OK; } else if (option == OPT_EXPRLEN) { ExprByteCode *expr; if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "expression"); return JIM_ERR; } expr = Jim_GetExpression(interp, argv[2]); if (expr == NULL) return JIM_ERR; Jim_SetResult(interp, Jim_NewIntObj(interp, expr->len)); return JIM_OK; } else if (option == OPT_EXPRBC) { Jim_Obj *objPtr; ExprByteCode *expr; int i; if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "expression"); return JIM_ERR; } expr = Jim_GetExpression(interp, argv[2]); if (expr == NULL) return JIM_ERR; objPtr = Jim_NewListObj(interp, NULL, 0); for (i = 0; i < expr->len; i++) { const char *type; Jim_ExprOperator *op; switch (expr->opcode[i]) { case JIM_EXPROP_NUMBER: type = "number"; break; case JIM_EXPROP_COMMAND: type = "command"; break; case JIM_EXPROP_VARIABLE: type = "variable"; break; case JIM_EXPROP_DICTSUGAR: type = "dictsugar"; break; case JIM_EXPROP_SUBST: type = "subst"; break; case JIM_EXPROP_STRING: type = "string"; break; default: op = JimExprOperatorInfo(Jim_GetString(expr->obj[i], NULL)); if (op == NULL) { type = "private"; } else { type = "operator"; } break; } Jim_ListAppendElement(interp, objPtr, Jim_NewStringObj(interp, type, -1)); Jim_ListAppendElement(interp, objPtr, expr->obj[i]); } Jim_SetResult(interp, objPtr); return JIM_OK; } else { Jim_SetResultString(interp, "bad option. Valid options are refcount, " "objcount, objects, invstr", -1); return JIM_ERR; } return JIM_OK; /* unreached */ } /* [eval] */ static int Jim_EvalCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc == 2) { return Jim_EvalObj(interp, argv[1]); } else if (argc > 2) { Jim_Obj *objPtr; int retcode; objPtr = Jim_ConcatObj(interp, argc-1, argv + 1); Jim_IncrRefCount(objPtr); retcode = Jim_EvalObj(interp, objPtr); Jim_DecrRefCount(interp, objPtr); return retcode; } else { Jim_WrongNumArgs(interp, 1, argv, "script ?...?"); return JIM_ERR; } } /* [uplevel] */ static int Jim_UplevelCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc >= 2) { int retcode, newLevel, oldLevel; Jim_CallFrame *savedCallFrame, *targetCallFrame; Jim_Obj *objPtr; const char *str; /* Save the old callframe pointer */ savedCallFrame = interp->framePtr; /* Lookup the target frame pointer */ str = Jim_GetString(argv[1], NULL); if ((str[0] >= '0' && str[0] <= '9') || str[0] == '#') { if (Jim_GetCallFrameByLevel(interp, argv[1], &targetCallFrame, &newLevel) != JIM_OK) return JIM_ERR; argc--; argv++; } else { if (Jim_GetCallFrameByLevel(interp, NULL, &targetCallFrame, &newLevel) != JIM_OK) return JIM_ERR; } if (argc < 2) { argc++; argv--; Jim_WrongNumArgs(interp, 1, argv, "?level? command ?arg ...?"); return JIM_ERR; } /* Eval the code in the target callframe. */ interp->framePtr = targetCallFrame; oldLevel = interp->numLevels; interp->numLevels = newLevel; if (argc == 2) { retcode = Jim_EvalObj(interp, argv[1]); } else { objPtr = Jim_ConcatObj(interp, argc-1, argv + 1); Jim_IncrRefCount(objPtr); retcode = Jim_EvalObj(interp, objPtr); Jim_DecrRefCount(interp, objPtr); } interp->numLevels = oldLevel; interp->framePtr = savedCallFrame; return retcode; } else { Jim_WrongNumArgs(interp, 1, argv, "?level? command ?arg ...?"); return JIM_ERR; } } /* [expr] */ static int Jim_ExprCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *exprResultPtr; int retcode; if (argc == 2) { retcode = Jim_EvalExpression(interp, argv[1], &exprResultPtr); } else if (argc > 2) { Jim_Obj *objPtr; objPtr = Jim_ConcatObj(interp, argc-1, argv + 1); Jim_IncrRefCount(objPtr); retcode = Jim_EvalExpression(interp, objPtr, &exprResultPtr); Jim_DecrRefCount(interp, objPtr); } else { Jim_WrongNumArgs(interp, 1, argv, "expression ?...?"); return JIM_ERR; } if (retcode != JIM_OK) return retcode; Jim_SetResult(interp, exprResultPtr); Jim_DecrRefCount(interp, exprResultPtr); return JIM_OK; } /* [break] */ static int Jim_BreakCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 1) { Jim_WrongNumArgs(interp, 1, argv, ""); return JIM_ERR; } return JIM_BREAK; } /* [continue] */ static int Jim_ContinueCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 1) { Jim_WrongNumArgs(interp, 1, argv, ""); return JIM_ERR; } return JIM_CONTINUE; } /* [return] */ static int Jim_ReturnCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc == 1) { return JIM_RETURN; } else if (argc == 2) { Jim_SetResult(interp, argv[1]); interp->returnCode = JIM_OK; return JIM_RETURN; } else if (argc == 3 || argc == 4) { int returnCode; if (Jim_GetReturnCode(interp, argv[2], &returnCode) == JIM_ERR) return JIM_ERR; interp->returnCode = returnCode; if (argc == 4) Jim_SetResult(interp, argv[3]); return JIM_RETURN; } else { Jim_WrongNumArgs(interp, 1, argv, "?-code code? ?result?"); return JIM_ERR; } return JIM_RETURN; /* unreached */ } /* [tailcall] */ static int Jim_TailcallCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *objPtr; objPtr = Jim_NewListObj(interp, argv + 1, argc-1); Jim_SetResult(interp, objPtr); return JIM_EVAL; } /* [proc] */ static int Jim_ProcCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int argListLen; int arityMin, arityMax; if (argc != 4 && argc != 5) { Jim_WrongNumArgs(interp, 1, argv, "name arglist ?statics? body"); return JIM_ERR; } Jim_ListLength(interp, argv[2], &argListLen); arityMin = arityMax = argListLen + 1; if (argListLen) { const char *str; int len; Jim_Obj *argPtr=NULL; /* Check for 'args' and adjust arityMin and arityMax if necessary */ Jim_ListIndex(interp, argv[2], argListLen-1, &argPtr, JIM_NONE); str = Jim_GetString(argPtr, &len); if (len == 4 && memcmp(str, "args", 4) == 0) { arityMin--; arityMax = -1; } /* Check for default arguments and reduce arityMin if necessary */ while (arityMin > 1) { int len; Jim_ListIndex(interp, argv[2], arityMin - 2, &argPtr, JIM_NONE); Jim_ListLength(interp, argPtr, &len); if (len != 2) { /* No default argument */ break; } arityMin--; } } if (argc == 4) { return Jim_CreateProcedure(interp, Jim_GetString(argv[1], NULL), argv[2], NULL, argv[3], arityMin, arityMax); } else { return Jim_CreateProcedure(interp, Jim_GetString(argv[1], NULL), argv[2], argv[3], argv[4], arityMin, arityMax); } } /* [concat] */ static int Jim_ConcatCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_SetResult(interp, Jim_ConcatObj(interp, argc-1, argv + 1)); return JIM_OK; } /* [upvar] */ static int Jim_UpvarCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { const char *str; int i; Jim_CallFrame *targetCallFrame; /* Lookup the target frame pointer */ str = Jim_GetString(argv[1], NULL); if (argc > 3 && ((str[0] >= '0' && str[0] <= '9') || str[0] == '#')) { if (Jim_GetCallFrameByLevel(interp, argv[1], &targetCallFrame, NULL) != JIM_OK) return JIM_ERR; argc--; argv++; } else { if (Jim_GetCallFrameByLevel(interp, NULL, &targetCallFrame, NULL) != JIM_OK) return JIM_ERR; } /* Check for arity */ if (argc < 3 || ((argc-1)%2) != 0) { Jim_WrongNumArgs(interp, 1, argv, "?level? otherVar localVar ?otherVar localVar ...?"); return JIM_ERR; } /* Now... for every other/local couple: */ for (i = 1; i < argc; i += 2) { if (Jim_SetVariableLink(interp, argv[i + 1], argv[i], targetCallFrame) != JIM_OK) return JIM_ERR; } return JIM_OK; } /* [global] */ static int Jim_GlobalCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int i; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "varName ?varName ...?"); return JIM_ERR; } /* Link every var to the toplevel having the same name */ if (interp->numLevels == 0) return JIM_OK; /* global at toplevel... */ for (i = 1; i < argc; i++) { if (Jim_SetVariableLink(interp, argv[i], argv[i], interp->topFramePtr) != JIM_OK) return JIM_ERR; } return JIM_OK; } /* does the [string map] operation. On error NULL is returned, * otherwise a new string object with the result, having refcount = 0, * is returned. */ static Jim_Obj *JimStringMap(Jim_Interp *interp, Jim_Obj *mapListObjPtr, Jim_Obj *objPtr, int nocase) { int numMaps; const char **key, *str, *noMatchStart = NULL; Jim_Obj **value; int *keyLen, strLen, i; Jim_Obj *resultObjPtr; Jim_ListLength(interp, mapListObjPtr, &numMaps); if (numMaps % 2) { Jim_SetResultString(interp, "list must contain an even number of elements", -1); return NULL; } /* Initialization */ numMaps /= 2; key = Jim_Alloc(sizeof(char*)*numMaps); keyLen = Jim_Alloc(sizeof(int)*numMaps); value = Jim_Alloc(sizeof(Jim_Obj*)*numMaps); resultObjPtr = Jim_NewStringObj(interp, "", 0); for (i = 0; i < numMaps; i++) { Jim_Obj *eleObjPtr=NULL; Jim_ListIndex(interp, mapListObjPtr, i*2, &eleObjPtr, JIM_NONE); key[i] = Jim_GetString(eleObjPtr, &keyLen[i]); Jim_ListIndex(interp, mapListObjPtr, i*2 + 1, &eleObjPtr, JIM_NONE); value[i] = eleObjPtr; } str = Jim_GetString(objPtr, &strLen); /* Map it */ while (strLen) { for (i = 0; i < numMaps; i++) { if (strLen >= keyLen[i] && keyLen[i]) { if (!JimStringCompare(str, keyLen[i], key[i], keyLen[i], nocase)) { if (noMatchStart) { Jim_AppendString(interp, resultObjPtr, noMatchStart, str-noMatchStart); noMatchStart = NULL; } Jim_AppendObj(interp, resultObjPtr, value[i]); str += keyLen[i]; strLen -= keyLen[i]; break; } } } if (i == numMaps) { /* no match */ if (noMatchStart == NULL) noMatchStart = str; str ++; strLen --; } } if (noMatchStart) { Jim_AppendString(interp, resultObjPtr, noMatchStart, str-noMatchStart); } Jim_Free((void*)key); Jim_Free(keyLen); Jim_Free(value); return resultObjPtr; } /* [string] */ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int option; const char *options[] = { "length", "compare", "match", "equal", "range", "map", "repeat", "index", "first", "tolower", "toupper", NULL }; enum { OPT_LENGTH, OPT_COMPARE, OPT_MATCH, OPT_EQUAL, OPT_RANGE, OPT_MAP, OPT_REPEAT, OPT_INDEX, OPT_FIRST, OPT_TOLOWER, OPT_TOUPPER }; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "option ?arguments ...?"); return JIM_ERR; } if (Jim_GetEnum(interp, argv[1], options, &option, "option", JIM_ERRMSG) != JIM_OK) return JIM_ERR; if (option == OPT_LENGTH) { int len; if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "string"); return JIM_ERR; } Jim_GetString(argv[2], &len); Jim_SetResult(interp, Jim_NewIntObj(interp, len)); return JIM_OK; } else if (option == OPT_COMPARE) { int nocase = 0; if ((argc != 4 && argc != 5) || (argc == 5 && Jim_CompareStringImmediate(interp, argv[2], "-nocase") == 0)) { Jim_WrongNumArgs(interp, 2, argv, "string1 string2"); return JIM_ERR; } if (argc == 5) { nocase = 1; argv++; } Jim_SetResult(interp, Jim_NewIntObj(interp, Jim_StringCompareObj(argv[2], argv[3], nocase))); return JIM_OK; } else if (option == OPT_MATCH) { int nocase = 0; if ((argc != 4 && argc != 5) || (argc == 5 && Jim_CompareStringImmediate(interp, argv[2], "-nocase") == 0)) { Jim_WrongNumArgs(interp, 2, argv, "?-nocase? pattern " "string"); return JIM_ERR; } if (argc == 5) { nocase = 1; argv++; } Jim_SetResult(interp, Jim_NewIntObj(interp, Jim_StringMatchObj(argv[2], argv[3], nocase))); return JIM_OK; } else if (option == OPT_EQUAL) { if (argc != 4) { Jim_WrongNumArgs(interp, 2, argv, "string1 string2"); return JIM_ERR; } Jim_SetResult(interp, Jim_NewIntObj(interp, Jim_StringEqObj(argv[2], argv[3], 0))); return JIM_OK; } else if (option == OPT_RANGE) { Jim_Obj *objPtr; if (argc != 5) { Jim_WrongNumArgs(interp, 2, argv, "string first last"); return JIM_ERR; } objPtr = Jim_StringRangeObj(interp, argv[2], argv[3], argv[4]); if (objPtr == NULL) return JIM_ERR; Jim_SetResult(interp, objPtr); return JIM_OK; } else if (option == OPT_MAP) { int nocase = 0; Jim_Obj *objPtr; if ((argc != 4 && argc != 5) || (argc == 5 && Jim_CompareStringImmediate(interp, argv[2], "-nocase") == 0)) { Jim_WrongNumArgs(interp, 2, argv, "?-nocase? mapList " "string"); return JIM_ERR; } if (argc == 5) { nocase = 1; argv++; } objPtr = JimStringMap(interp, argv[2], argv[3], nocase); if (objPtr == NULL) return JIM_ERR; Jim_SetResult(interp, objPtr); return JIM_OK; } else if (option == OPT_REPEAT) { Jim_Obj *objPtr; jim_wide count; if (argc != 4) { Jim_WrongNumArgs(interp, 2, argv, "string count"); return JIM_ERR; } if (Jim_GetWide(interp, argv[3], &count) != JIM_OK) return JIM_ERR; objPtr = Jim_NewStringObj(interp, "", 0); while (count--) { Jim_AppendObj(interp, objPtr, argv[2]); } Jim_SetResult(interp, objPtr); return JIM_OK; } else if (option == OPT_INDEX) { int index, len; const char *str; if (argc != 4) { Jim_WrongNumArgs(interp, 2, argv, "string index"); return JIM_ERR; } if (Jim_GetIndex(interp, argv[3], &index) != JIM_OK) return JIM_ERR; str = Jim_GetString(argv[2], &len); if (index != INT_MIN && index != INT_MAX) index = JimRelToAbsIndex(len, index); if (index < 0 || index >= len) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); return JIM_OK; } else { Jim_SetResult(interp, Jim_NewStringObj(interp, str + index, 1)); return JIM_OK; } } else if (option == OPT_FIRST) { int index = 0, l1, l2; const char *s1, *s2; if (argc != 4 && argc != 5) { Jim_WrongNumArgs(interp, 2, argv, "subString string ?startIndex?"); return JIM_ERR; } s1 = Jim_GetString(argv[2], &l1); s2 = Jim_GetString(argv[3], &l2); if (argc == 5) { if (Jim_GetIndex(interp, argv[4], &index) != JIM_OK) return JIM_ERR; index = JimRelToAbsIndex(l2, index); } Jim_SetResult(interp, Jim_NewIntObj(interp, JimStringFirst(s1, l1, s2, l2, index))); return JIM_OK; } else if (option == OPT_TOLOWER) { if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "string"); return JIM_ERR; } Jim_SetResult(interp, JimStringToLower(interp, argv[2])); } else if (option == OPT_TOUPPER) { if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "string"); return JIM_ERR; } Jim_SetResult(interp, JimStringToUpper(interp, argv[2])); } return JIM_OK; } /* [time] */ static int Jim_TimeCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { long i, count = 1; jim_wide start, elapsed; char buf [256]; const char *fmt = "%" JIM_WIDE_MODIFIER " microseconds per iteration"; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "script ?count?"); return JIM_ERR; } if (argc == 3) { if (Jim_GetLong(interp, argv[2], &count) != JIM_OK) return JIM_ERR; } if (count < 0) return JIM_OK; i = count; start = JimClock(); while (i-- > 0) { int retval; if ((retval = Jim_EvalObj(interp, argv[1])) != JIM_OK) return retval; } elapsed = JimClock() - start; sprintf(buf, fmt, elapsed/count); Jim_SetResultString(interp, buf, -1); return JIM_OK; } /* [exit] */ static int Jim_ExitCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { long exitCode = 0; if (argc > 2) { Jim_WrongNumArgs(interp, 1, argv, "?exitCode?"); return JIM_ERR; } if (argc == 2) { if (Jim_GetLong(interp, argv[1], &exitCode) != JIM_OK) return JIM_ERR; } interp->exitCode = exitCode; return JIM_EXIT; } /* [catch] */ static int Jim_CatchCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int exitCode = 0; if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "script ?varName?"); return JIM_ERR; } exitCode = Jim_EvalObj(interp, argv[1]); if (argc == 3) { if (Jim_SetVariable(interp, argv[2], Jim_GetResult(interp)) != JIM_OK) return JIM_ERR; } Jim_SetResult(interp, Jim_NewIntObj(interp, exitCode)); return JIM_OK; } /* [ref] */ static int Jim_RefCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 3 && argc != 4) { Jim_WrongNumArgs(interp, 1, argv, "string tag ?finalizer?"); return JIM_ERR; } if (argc == 3) { Jim_SetResult(interp, Jim_NewReference(interp, argv[1], argv[2], NULL)); } else { Jim_SetResult(interp, Jim_NewReference(interp, argv[1], argv[2], argv[3])); } return JIM_OK; } /* [getref] */ static int Jim_GetrefCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Reference *refPtr; if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "reference"); return JIM_ERR; } if ((refPtr = Jim_GetReference(interp, argv[1])) == NULL) return JIM_ERR; Jim_SetResult(interp, refPtr->objPtr); return JIM_OK; } /* [setref] */ static int Jim_SetrefCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Reference *refPtr; if (argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "reference newValue"); return JIM_ERR; } if ((refPtr = Jim_GetReference(interp, argv[1])) == NULL) return JIM_ERR; Jim_IncrRefCount(argv[2]); Jim_DecrRefCount(interp, refPtr->objPtr); refPtr->objPtr = argv[2]; Jim_SetResult(interp, argv[2]); return JIM_OK; } /* [collect] */ static int Jim_CollectCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 1) { Jim_WrongNumArgs(interp, 1, argv, ""); return JIM_ERR; } Jim_SetResult(interp, Jim_NewIntObj(interp, Jim_Collect(interp))); return JIM_OK; } /* [finalize] reference ?newValue? */ static int Jim_FinalizeCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "reference ?finalizerProc?"); return JIM_ERR; } if (argc == 2) { Jim_Obj *cmdNamePtr; if (Jim_GetFinalizer(interp, argv[1], &cmdNamePtr) != JIM_OK) return JIM_ERR; if (cmdNamePtr != NULL) /* otherwise the null string is returned. */ Jim_SetResult(interp, cmdNamePtr); } else { if (Jim_SetFinalizer(interp, argv[1], argv[2]) != JIM_OK) return JIM_ERR; Jim_SetResult(interp, argv[2]); } return JIM_OK; } /* TODO */ /* [info references] (list of all the references/finalizers) */ /* [rename] */ static int Jim_RenameCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { const char *oldName, *newName; if (argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "oldName newName"); return JIM_ERR; } oldName = Jim_GetString(argv[1], NULL); newName = Jim_GetString(argv[2], NULL); if (Jim_RenameCommand(interp, oldName, newName) != JIM_OK) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "can't rename \"", oldName, "\": ", "command doesn't exist", NULL); return JIM_ERR; } return JIM_OK; } /* [dict] */ static int Jim_DictCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int option; const char *options[] = { "create", "get", "set", "unset", "exists", NULL }; enum { OPT_CREATE, OPT_GET, OPT_SET, OPT_UNSET, OPT_EXIST }; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "option ?arguments ...?"); return JIM_ERR; } if (Jim_GetEnum(interp, argv[1], options, &option, "option", JIM_ERRMSG) != JIM_OK) return JIM_ERR; if (option == OPT_CREATE) { Jim_Obj *objPtr; if (argc % 2) { Jim_WrongNumArgs(interp, 2, argv, "?key value ...?"); return JIM_ERR; } objPtr = Jim_NewDictObj(interp, argv + 2, argc-2); Jim_SetResult(interp, objPtr); return JIM_OK; } else if (option == OPT_GET) { Jim_Obj *objPtr; if (Jim_DictKeysVector(interp, argv[2], argv + 3, argc-3, &objPtr, JIM_ERRMSG) != JIM_OK) return JIM_ERR; Jim_SetResult(interp, objPtr); return JIM_OK; } else if (option == OPT_SET) { if (argc < 5) { Jim_WrongNumArgs(interp, 2, argv, "varName key ?key ...? value"); return JIM_ERR; } return Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc-4, argv[argc-1]); } else if (option == OPT_UNSET) { if (argc < 4) { Jim_WrongNumArgs(interp, 2, argv, "varName key ?key ...?"); return JIM_ERR; } return Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc-3, NULL); } else if (option == OPT_EXIST) { Jim_Obj *objPtr; int exists; if (Jim_DictKeysVector(interp, argv[2], argv + 3, argc-3, &objPtr, JIM_ERRMSG) == JIM_OK) exists = 1; else exists = 0; Jim_SetResult(interp, Jim_NewIntObj(interp, exists)); return JIM_OK; } else { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "bad option \"", Jim_GetString(argv[1], NULL), "\":", " must be create, get, set", NULL); return JIM_ERR; } return JIM_OK; } /* [load] */ static int Jim_LoadCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "libaryFile"); return JIM_ERR; } return Jim_LoadLibrary(interp, Jim_GetString(argv[1], NULL)); } /* [subst] */ static int Jim_SubstCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int i, flags = 0; Jim_Obj *objPtr; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "?-nobackslashes? ?-nocommands? ?-novariables? string"); return JIM_ERR; } i = argc-2; while (i--) { if (Jim_CompareStringImmediate(interp, argv[i + 1], "-nobackslashes")) flags |= JIM_SUBST_NOESC; else if (Jim_CompareStringImmediate(interp, argv[i + 1], "-novariables")) flags |= JIM_SUBST_NOVAR; else if (Jim_CompareStringImmediate(interp, argv[i + 1], "-nocommands")) flags |= JIM_SUBST_NOCMD; else { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "bad option \"", Jim_GetString(argv[i + 1], NULL), "\": must be -nobackslashes, -nocommands, or " "-novariables", NULL); return JIM_ERR; } } if (Jim_SubstObj(interp, argv[argc-1], &objPtr, flags) != JIM_OK) return JIM_ERR; Jim_SetResult(interp, objPtr); return JIM_OK; } /* [info] */ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int cmd, result = JIM_OK; static const char *commands[] = { "body", "commands", "exists", "globals", "level", "locals", "vars", "version", "complete", "args", "hostname", NULL }; enum {INFO_BODY, INFO_COMMANDS, INFO_EXISTS, INFO_GLOBALS, INFO_LEVEL, INFO_LOCALS, INFO_VARS, INFO_VERSION, INFO_COMPLETE, INFO_ARGS, INFO_HOSTNAME}; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "command ?args ...?"); return JIM_ERR; } if (Jim_GetEnum(interp, argv[1], commands, &cmd, "command", JIM_ERRMSG) != JIM_OK) { return JIM_ERR; } if (cmd == INFO_COMMANDS) { if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "?pattern?"); return JIM_ERR; } if (argc == 3) Jim_SetResult(interp,JimCommandsList(interp, argv[2])); else Jim_SetResult(interp, JimCommandsList(interp, NULL)); } else if (cmd == INFO_EXISTS) { Jim_Obj *exists; if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "varName"); return JIM_ERR; } exists = Jim_GetVariable(interp, argv[2], 0); Jim_SetResult(interp, Jim_NewIntObj(interp, exists != 0)); } else if (cmd == INFO_GLOBALS || cmd == INFO_LOCALS || cmd == INFO_VARS) { int mode; switch (cmd) { case INFO_GLOBALS: mode = JIM_VARLIST_GLOBALS; break; case INFO_LOCALS: mode = JIM_VARLIST_LOCALS; break; case INFO_VARS: mode = JIM_VARLIST_VARS; break; default: mode = 0; /* avoid warning */; break; } if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "?pattern?"); return JIM_ERR; } if (argc == 3) Jim_SetResult(interp,JimVariablesList(interp, argv[2], mode)); else Jim_SetResult(interp, JimVariablesList(interp, NULL, mode)); } else if (cmd == INFO_LEVEL) { Jim_Obj *objPtr; switch (argc) { case 2: Jim_SetResult(interp, Jim_NewIntObj(interp, interp->numLevels)); break; case 3: if (JimInfoLevel(interp, argv[2], &objPtr) != JIM_OK) return JIM_ERR; Jim_SetResult(interp, objPtr); break; default: Jim_WrongNumArgs(interp, 2, argv, "?levelNum?"); return JIM_ERR; } } else if (cmd == INFO_BODY || cmd == INFO_ARGS) { Jim_Cmd *cmdPtr; if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "procname"); return JIM_ERR; } if ((cmdPtr = Jim_GetCommand(interp, argv[2], JIM_ERRMSG)) == NULL) return JIM_ERR; if (cmdPtr->cmdProc != NULL) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "command \"", Jim_GetString(argv[2], NULL), "\" is not a procedure", NULL); return JIM_ERR; } if (cmd == INFO_BODY) Jim_SetResult(interp, cmdPtr->bodyObjPtr); else Jim_SetResult(interp, cmdPtr->argListObjPtr); } else if (cmd == INFO_VERSION) { char buf[(JIM_INTEGER_SPACE * 2) + 1]; sprintf(buf, "%d.%d", JIM_VERSION / 100, JIM_VERSION % 100); Jim_SetResultString(interp, buf, -1); } else if (cmd == INFO_COMPLETE) { const char *s; int len; if (argc != 3) { Jim_WrongNumArgs(interp, 2, argv, "script"); return JIM_ERR; } s = Jim_GetString(argv[2], &len); Jim_SetResult(interp, Jim_NewIntObj(interp, Jim_ScriptIsComplete(s, len, NULL))); } else if (cmd == INFO_HOSTNAME) { /* Redirect to os.hostname if it exists */ Jim_Obj *command = Jim_NewStringObj(interp, "os.gethostname", -1); result = Jim_EvalObjVector(interp, 1, &command); } return result; } /* [split] */ static int Jim_SplitCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { const char *str, *splitChars, *noMatchStart; int splitLen, strLen, i; Jim_Obj *resObjPtr; if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "string ?splitChars?"); return JIM_ERR; } /* Init */ if (argc == 2) { splitChars = " \n\t\r"; splitLen = 4; } else { splitChars = Jim_GetString(argv[2], &splitLen); } str = Jim_GetString(argv[1], &strLen); if (!strLen) return JIM_OK; noMatchStart = str; resObjPtr = Jim_NewListObj(interp, NULL, 0); /* Split */ if (splitLen) { while (strLen) { for (i = 0; i < splitLen; i++) { if (*str == splitChars[i]) { Jim_Obj *objPtr; objPtr = Jim_NewStringObj(interp, noMatchStart, (str-noMatchStart)); Jim_ListAppendElement(interp, resObjPtr, objPtr); noMatchStart = str + 1; break; } } str ++; strLen --; } Jim_ListAppendElement(interp, resObjPtr, Jim_NewStringObj(interp, noMatchStart, (str-noMatchStart))); } else { /* This handles the special case of splitchars eq {}. This * is trivial but we want to perform object sharing as Tcl does. */ Jim_Obj *objCache[256]; const unsigned char *u = (unsigned char*) str; memset(objCache, 0, sizeof(objCache)); for (i = 0; i < strLen; i++) { int c = u[i]; if (objCache[c] == NULL) objCache[c] = Jim_NewStringObj(interp, (char*)u + i, 1); Jim_ListAppendElement(interp, resObjPtr, objCache[c]); } } Jim_SetResult(interp, resObjPtr); return JIM_OK; } /* [join] */ static int Jim_JoinCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { const char *joinStr; int joinStrLen, i, listLen; Jim_Obj *resObjPtr; if (argc != 2 && argc != 3) { Jim_WrongNumArgs(interp, 1, argv, "list ?joinString?"); return JIM_ERR; } /* Init */ if (argc == 2) { joinStr = " "; joinStrLen = 1; } else { joinStr = Jim_GetString(argv[2], &joinStrLen); } Jim_ListLength(interp, argv[1], &listLen); resObjPtr = Jim_NewStringObj(interp, NULL, 0); /* Split */ for (i = 0; i < listLen; i++) { Jim_Obj *objPtr=NULL; Jim_ListIndex(interp, argv[1], i, &objPtr, JIM_NONE); Jim_AppendObj(interp, resObjPtr, objPtr); if (i + 1 != listLen) { Jim_AppendString(interp, resObjPtr, joinStr, joinStrLen); } } Jim_SetResult(interp, resObjPtr); return JIM_OK; } /* [format] */ static int Jim_FormatCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *objPtr; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "formatString ?arg arg ...?"); return JIM_ERR; } objPtr = Jim_FormatString(interp, argv[1], argc-2, argv + 2); if (objPtr == NULL) return JIM_ERR; Jim_SetResult(interp, objPtr); return JIM_OK; } /* [scan] */ static int Jim_ScanCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *listPtr, **outVec; int outc, i, count = 0; if (argc < 3) { Jim_WrongNumArgs(interp, 1, argv, "string formatString ?varName ...?"); return JIM_ERR; } if (argv[2]->typePtr != &scanFmtStringObjType) SetScanFmtFromAny(interp, argv[2]); if (FormatGetError(argv[2]) != 0) { Jim_SetResultString(interp, FormatGetError(argv[2]), -1); return JIM_ERR; } if (argc > 3) { int maxPos = FormatGetMaxPos(argv[2]); int count = FormatGetCnvCount(argv[2]); if (maxPos > argc-3) { Jim_SetResultString(interp, "\"%n$\" argument index out of range", -1); return JIM_ERR; } else if (count != 0 && count < argc-3) { Jim_SetResultString(interp, "variable is not assigned by any " "conversion specifiers", -1); return JIM_ERR; } else if (count > argc-3) { Jim_SetResultString(interp, "different numbers of variable names and " "field specifiers", -1); return JIM_ERR; } } listPtr = Jim_ScanString(interp, argv[1], argv[2], JIM_ERRMSG); if (listPtr == 0) return JIM_ERR; if (argc > 3) { int len = 0; if (listPtr != 0 && listPtr != (Jim_Obj*)EOF) Jim_ListLength(interp, listPtr, &len); if (listPtr == (Jim_Obj*)EOF || len == 0) { // XXX Jim_SetResult(interp, Jim_NewIntObj(interp, -1)); return JIM_OK; } JimListGetElements(interp, listPtr, &outc, &outVec); for (i = 0; i < outc; ++i) { if (Jim_Length(outVec[i]) > 0) { ++count; if (Jim_SetVariable(interp, argv[3 + i], outVec[i]) != JIM_OK) goto err; } } Jim_FreeNewObj(interp, listPtr); Jim_SetResult(interp, Jim_NewIntObj(interp, count)); } else { if (listPtr == (Jim_Obj*)EOF) { Jim_SetResult(interp, Jim_NewListObj(interp, 0, 0)); return JIM_OK; } Jim_SetResult(interp, listPtr); } return JIM_OK; err: Jim_FreeNewObj(interp, listPtr); return JIM_ERR; } /* [error] */ static int Jim_ErrorCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "message"); return JIM_ERR; } Jim_SetResult(interp, argv[1]); return JIM_ERR; } /* [lrange] */ static int Jim_LrangeCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *objPtr; if (argc != 4) { Jim_WrongNumArgs(interp, 1, argv, "list first last"); return JIM_ERR; } if ((objPtr = Jim_ListRange(interp, argv[1], argv[2], argv[3])) == NULL) return JIM_ERR; Jim_SetResult(interp, objPtr); return JIM_OK; } /* [env] */ static int Jim_EnvCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { const char *key; char *val; if (argc == 1) { #ifdef NEED_ENVIRON_EXTERN extern char **environ; #endif int i; Jim_Obj *listObjPtr = Jim_NewListObj(interp, NULL, 0); for (i = 0; environ[i]; i++) { const char *equals = strchr(environ[i], '='); if (equals) { Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, environ[i], equals - environ[i])); Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, equals + 1, -1)); } } Jim_SetResult(interp, listObjPtr); return JIM_OK; } if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "varName"); return JIM_ERR; } key = Jim_GetString(argv[1], NULL); val = getenv(key); if (val == NULL) { Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); Jim_AppendStrings(interp, Jim_GetResult(interp), "environment variable \"", key, "\" does not exist", NULL); return JIM_ERR; } Jim_SetResult(interp, Jim_NewStringObj(interp, val, -1)); return JIM_OK; } /* [source] */ static int Jim_SourceCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int retval; if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "fileName"); return JIM_ERR; } retval = Jim_EvalFile(interp, Jim_GetString(argv[1], NULL)); if (retval == JIM_ERR) { return JIM_ERR_ADDSTACK; } if (retval == JIM_RETURN) return JIM_OK; return retval; } /* [lreverse] */ static int Jim_LreverseCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *revObjPtr, **ele; int len; if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "list"); return JIM_ERR; } JimListGetElements(interp, argv[1], &len, &ele); len--; revObjPtr = Jim_NewListObj(interp, NULL, 0); while (len >= 0) ListAppendElement(revObjPtr, ele[len--]); Jim_SetResult(interp, revObjPtr); return JIM_OK; } static int JimRangeLen(jim_wide start, jim_wide end, jim_wide step) { jim_wide len; if (step == 0) return -1; if (start == end) return 0; else if (step > 0 && start > end) return -1; else if (step < 0 && end > start) return -1; len = end-start; if (len < 0) len = -len; /* abs(len) */ if (step < 0) step = -step; /* abs(step) */ len = 1 + ((len-1)/step); /* We can truncate safely to INT_MAX, the range command * will always return an error for a such long range * because Tcl lists can't be so long. */ if (len > INT_MAX) len = INT_MAX; return (int)((len < 0) ? -1 : len); } /* [range] */ static int Jim_RangeCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { jim_wide start = 0, end, step = 1; int len, i; Jim_Obj *objPtr; if (argc < 2 || argc > 4) { Jim_WrongNumArgs(interp, 1, argv, "?start? end ?step?"); return JIM_ERR; } if (argc == 2) { if (Jim_GetWide(interp, argv[1], &end) != JIM_OK) return JIM_ERR; } else { if (Jim_GetWide(interp, argv[1], &start) != JIM_OK || Jim_GetWide(interp, argv[2], &end) != JIM_OK) return JIM_ERR; if (argc == 4 && Jim_GetWide(interp, argv[3], &step) != JIM_OK) return JIM_ERR; } if ((len = JimRangeLen(start, end, step)) == -1) { Jim_SetResultString(interp, "Invalid (infinite?) range specified", -1); return JIM_ERR; } objPtr = Jim_NewListObj(interp, NULL, 0); for (i = 0; i < len; i++) ListAppendElement(objPtr, Jim_NewIntObj(interp, start + i*step)); Jim_SetResult(interp, objPtr); return JIM_OK; } /* [rand] */ static int Jim_RandCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { jim_wide min = 0, max =0, len, maxMul; if (argc < 1 || argc > 3) { Jim_WrongNumArgs(interp, 1, argv, "?min? max"); return JIM_ERR; } if (argc == 1) { max = JIM_WIDE_MAX; } else if (argc == 2) { if (Jim_GetWide(interp, argv[1], &max) != JIM_OK) return JIM_ERR; } else if (argc == 3) { if (Jim_GetWide(interp, argv[1], &min) != JIM_OK || Jim_GetWide(interp, argv[2], &max) != JIM_OK) return JIM_ERR; } len = max-min; if (len < 0) { Jim_SetResultString(interp, "Invalid arguments (max < min)", -1); return JIM_ERR; } maxMul = JIM_WIDE_MAX - (len ? (JIM_WIDE_MAX%len) : 0); while (1) { jim_wide r; JimRandomBytes(interp, &r, sizeof(jim_wide)); if (r < 0 || r >= maxMul) continue; r = (len == 0) ? 0 : r%len; Jim_SetResult(interp, Jim_NewIntObj(interp, min + r)); return JIM_OK; } } /* [package] */ static int Jim_PackageCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int option; const char *options[] = { "require", "provide", NULL }; enum {OPT_REQUIRE, OPT_PROVIDE}; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "option ?arguments ...?"); return JIM_ERR; } if (Jim_GetEnum(interp, argv[1], options, &option, "option", JIM_ERRMSG) != JIM_OK) return JIM_ERR; if (option == OPT_REQUIRE) { int exact = 0; const char *ver; if (Jim_CompareStringImmediate(interp, argv[2], "-exact")) { exact = 1; argv++; argc--; } if (argc != 3 && argc != 4) { Jim_WrongNumArgs(interp, 2, argv, "?-exact? package ?version?"); return JIM_ERR; } ver = Jim_PackageRequire(interp, Jim_GetString(argv[2], NULL), argc == 4 ? Jim_GetString(argv[3], NULL) : "", JIM_ERRMSG); if (ver == NULL) return JIM_ERR_ADDSTACK; Jim_SetResultString(interp, ver, -1); } else if (option == OPT_PROVIDE) { if (argc != 4) { Jim_WrongNumArgs(interp, 2, argv, "package version"); return JIM_ERR; } return Jim_PackageProvide(interp, Jim_GetString(argv[2], NULL), Jim_GetString(argv[3], NULL), JIM_ERRMSG); } return JIM_OK; } static struct { const char *name; Jim_CmdProc cmdProc; } Jim_CoreCommandsTable[] = { {"set", Jim_SetCoreCommand}, {"unset", Jim_UnsetCoreCommand}, {"puts", Jim_PutsCoreCommand}, {"+", Jim_AddCoreCommand}, {"*", Jim_MulCoreCommand}, {"-", Jim_SubCoreCommand}, {"/", Jim_DivCoreCommand}, {"incr", Jim_IncrCoreCommand}, {"while", Jim_WhileCoreCommand}, {"for", Jim_ForCoreCommand}, {"foreach", Jim_ForeachCoreCommand}, {"lmap", Jim_LmapCoreCommand}, {"if", Jim_IfCoreCommand}, {"switch", Jim_SwitchCoreCommand}, {"list", Jim_ListCoreCommand}, {"lindex", Jim_LindexCoreCommand}, {"lset", Jim_LsetCoreCommand}, {"llength", Jim_LlengthCoreCommand}, {"lappend", Jim_LappendCoreCommand}, {"linsert", Jim_LinsertCoreCommand}, {"lsort", Jim_LsortCoreCommand}, {"append", Jim_AppendCoreCommand}, {"debug", Jim_DebugCoreCommand}, {"eval", Jim_EvalCoreCommand}, {"uplevel", Jim_UplevelCoreCommand}, {"expr", Jim_ExprCoreCommand}, {"break", Jim_BreakCoreCommand}, {"continue", Jim_ContinueCoreCommand}, {"proc", Jim_ProcCoreCommand}, {"concat", Jim_ConcatCoreCommand}, {"return", Jim_ReturnCoreCommand}, {"upvar", Jim_UpvarCoreCommand}, {"global", Jim_GlobalCoreCommand}, {"string", Jim_StringCoreCommand}, {"time", Jim_TimeCoreCommand}, {"exit", Jim_ExitCoreCommand}, {"catch", Jim_CatchCoreCommand}, {"ref", Jim_RefCoreCommand}, {"getref", Jim_GetrefCoreCommand}, {"setref", Jim_SetrefCoreCommand}, {"finalize", Jim_FinalizeCoreCommand}, {"collect", Jim_CollectCoreCommand}, {"rename", Jim_RenameCoreCommand}, {"dict", Jim_DictCoreCommand}, {"load", Jim_LoadCoreCommand}, {"subst", Jim_SubstCoreCommand}, {"info", Jim_InfoCoreCommand}, {"split", Jim_SplitCoreCommand}, {"join", Jim_JoinCoreCommand}, {"format", Jim_FormatCoreCommand}, {"scan", Jim_ScanCoreCommand}, {"error", Jim_ErrorCoreCommand}, {"lrange", Jim_LrangeCoreCommand}, {"env", Jim_EnvCoreCommand}, {"source", Jim_SourceCoreCommand}, {"lreverse", Jim_LreverseCoreCommand}, {"range", Jim_RangeCoreCommand}, {"rand", Jim_RandCoreCommand}, {"package", Jim_PackageCoreCommand}, {"tailcall", Jim_TailcallCoreCommand}, {NULL, NULL}, }; /* Some Jim core command is actually a procedure written in Jim itself. */ static void Jim_RegisterCoreProcedures(Jim_Interp *interp) { Jim_Eval(interp, (char*) "proc lambda {arglist args} {\n" " set name [ref {} function lambdaFinalizer]\n" " uplevel 1 [list proc $name $arglist {expand}$args]\n" " return $name\n" "}\n" "proc lambdaFinalizer {name val} {\n" " rename $name {}\n" "}\n" ); } void Jim_RegisterCoreCommands(Jim_Interp *interp) { int i = 0; while (Jim_CoreCommandsTable[i].name != NULL) { Jim_CreateCommand(interp, Jim_CoreCommandsTable[i].name, Jim_CoreCommandsTable[i].cmdProc, NULL, NULL); i++; } Jim_RegisterCoreProcedures(interp); } /* ----------------------------------------------------------------------------- * Interactive prompt * ---------------------------------------------------------------------------*/ void Jim_PrintErrorMessage(Jim_Interp *interp) { int len, i; if (*interp->errorFileName) { Jim_fprintf(interp, interp->cookie_stderr, "Runtime error, file \"%s\", line %d:" JIM_NL " ", interp->errorFileName, interp->errorLine); } Jim_fprintf(interp,interp->cookie_stderr, "%s" JIM_NL, Jim_GetString(interp->result, NULL)); Jim_ListLength(interp, interp->stackTrace, &len); for (i = len-3; i >= 0; i-= 3) { Jim_Obj *objPtr=NULL; const char *proc, *file, *line; Jim_ListIndex(interp, interp->stackTrace, i, &objPtr, JIM_NONE); proc = Jim_GetString(objPtr, NULL); Jim_ListIndex(interp, interp->stackTrace, i + 1, &objPtr, JIM_NONE); file = Jim_GetString(objPtr, NULL); Jim_ListIndex(interp, interp->stackTrace, i + 2, &objPtr, JIM_NONE); line = Jim_GetString(objPtr, NULL); if (*proc) { Jim_fprintf(interp, interp->cookie_stderr, "in procedure '%s' ", proc); } if (*file) { Jim_fprintf(interp, interp->cookie_stderr, "called at file \"%s\", line %s", file, line); } if (*file || *proc) { Jim_fprintf(interp, interp->cookie_stderr, JIM_NL); } } } int Jim_InteractivePrompt(Jim_Interp *interp) { int retcode = JIM_OK; Jim_Obj *scriptObjPtr; Jim_fprintf(interp,interp->cookie_stdout, "Welcome to Jim version %d.%d, " "Copyright (c) 2005-8 Salvatore Sanfilippo" JIM_NL, JIM_VERSION / 100, JIM_VERSION % 100); Jim_SetVariableStrWithStr(interp, "jim_interactive", "1"); while (1) { char buf[1024]; const char *result; const char *retcodestr[] = { "ok", "error", "return", "break", "continue", "eval", "exit" }; int reslen; if (retcode != 0) { if (retcode >= 2 && retcode <= 6) Jim_fprintf(interp,interp->cookie_stdout, "[%s] . ", retcodestr[retcode]); else Jim_fprintf(interp,interp->cookie_stdout, "[%d] . ", retcode); } else Jim_fprintf(interp, interp->cookie_stdout, ". "); Jim_fflush(interp, interp->cookie_stdout); scriptObjPtr = Jim_NewStringObj(interp, "", 0); Jim_IncrRefCount(scriptObjPtr); while (1) { const char *str; char state; int len; if (Jim_fgets(interp, buf, 1024, interp->cookie_stdin) == NULL) { Jim_DecrRefCount(interp, scriptObjPtr); goto out; } Jim_AppendString(interp, scriptObjPtr, buf, -1); str = Jim_GetString(scriptObjPtr, &len); if (Jim_ScriptIsComplete(str, len, &state)) break; Jim_fprintf(interp, interp->cookie_stdout, "%c> ", state); Jim_fflush(interp, interp->cookie_stdout); } retcode = Jim_EvalObj(interp, scriptObjPtr); Jim_DecrRefCount(interp, scriptObjPtr); result = Jim_GetString(Jim_GetResult(interp), &reslen); if (retcode == JIM_ERR) { Jim_PrintErrorMessage(interp); } else if (retcode == JIM_EXIT) { exit(Jim_GetExitCode(interp)); } else { if (reslen) { Jim_fwrite(interp, result, 1, reslen, interp->cookie_stdout); Jim_fprintf(interp,interp->cookie_stdout, JIM_NL); } } } out: return 0; } /* ----------------------------------------------------------------------------- * Jim's idea of STDIO.. * ---------------------------------------------------------------------------*/ int Jim_fprintf(Jim_Interp *interp, void *cookie, const char *fmt, ...) { int r; va_list ap; va_start(ap,fmt); r = Jim_vfprintf(interp, cookie, fmt,ap); va_end(ap); return r; } int Jim_vfprintf(Jim_Interp *interp, void *cookie, const char *fmt, va_list ap) { if ((interp == NULL) || (interp->cb_vfprintf == NULL)) { errno = ENOTSUP; return -1; } return (*(interp->cb_vfprintf))(cookie, fmt, ap); } size_t Jim_fwrite(Jim_Interp *interp, const void *ptr, size_t size, size_t n, void *cookie) { if ((interp == NULL) || (interp->cb_fwrite == NULL)) { errno = ENOTSUP; return 0; } return (*(interp->cb_fwrite))(ptr, size, n, cookie); } size_t Jim_fread(Jim_Interp *interp, void *ptr, size_t size, size_t n, void *cookie) { if ((interp == NULL) || (interp->cb_fread == NULL)) { errno = ENOTSUP; return 0; } return (*(interp->cb_fread))(ptr, size, n, cookie); } int Jim_fflush(Jim_Interp *interp, void *cookie) { if ((interp == NULL) || (interp->cb_fflush == NULL)) { /* pretend all is well */ return 0; } return (*(interp->cb_fflush))(cookie); } char* Jim_fgets(Jim_Interp *interp, char *s, int size, void *cookie) { if ((interp == NULL) || (interp->cb_fgets == NULL)) { errno = ENOTSUP; return NULL; } return (*(interp->cb_fgets))(s, size, cookie); } Jim_Nvp * Jim_Nvp_name2value_simple(const Jim_Nvp *p, const char *name) { while (p->name) { if (0 == strcmp(name, p->name)) { break; } p++; } return ((Jim_Nvp *)(p)); } Jim_Nvp * Jim_Nvp_name2value_nocase_simple(const Jim_Nvp *p, const char *name) { while (p->name) { if (0 == strcasecmp(name, p->name)) { break; } p++; } return ((Jim_Nvp *)(p)); } int Jim_Nvp_name2value_obj(Jim_Interp *interp, const Jim_Nvp *p, Jim_Obj *o, Jim_Nvp **result) { return Jim_Nvp_name2value(interp, p, Jim_GetString(o, NULL), result); } int Jim_Nvp_name2value(Jim_Interp *interp, const Jim_Nvp *_p, const char *name, Jim_Nvp **result) { const Jim_Nvp *p; p = Jim_Nvp_name2value_simple(_p, name); /* result */ if (result) { *result = (Jim_Nvp *)(p); } /* found? */ if (p->name) { return JIM_OK; } else { return JIM_ERR; } } int Jim_Nvp_name2value_obj_nocase(Jim_Interp *interp, const Jim_Nvp *p, Jim_Obj *o, Jim_Nvp **puthere) { return Jim_Nvp_name2value_nocase(interp, p, Jim_GetString(o, NULL), puthere); } int Jim_Nvp_name2value_nocase(Jim_Interp *interp, const Jim_Nvp *_p, const char *name, Jim_Nvp **puthere) { const Jim_Nvp *p; p = Jim_Nvp_name2value_nocase_simple(_p, name); if (puthere) { *puthere = (Jim_Nvp *)(p); } /* found */ if (p->name) { return JIM_OK; } else { return JIM_ERR; } } int Jim_Nvp_value2name_obj(Jim_Interp *interp, const Jim_Nvp *p, Jim_Obj *o, Jim_Nvp **result) { int e;; jim_wide w; e = Jim_GetWide(interp, o, &w); if (e != JIM_OK) { return e; } return Jim_Nvp_value2name(interp, p, w, result); } Jim_Nvp * Jim_Nvp_value2name_simple(const Jim_Nvp *p, int value) { while (p->name) { if (value == p->value) { break; } p++; } return ((Jim_Nvp *)(p)); } int Jim_Nvp_value2name(Jim_Interp *interp, const Jim_Nvp *_p, int value, Jim_Nvp **result) { const Jim_Nvp *p; p = Jim_Nvp_value2name_simple(_p, value); if (result) { *result = (Jim_Nvp *)(p); } if (p->name) { return JIM_OK; } else { return JIM_ERR; } } int Jim_GetOpt_Setup(Jim_GetOptInfo *p, Jim_Interp *interp, int argc, Jim_Obj * const * argv) { memset(p, 0, sizeof(*p)); p->interp = interp; p->argc = argc; p->argv = argv; return JIM_OK; } void Jim_GetOpt_Debug(Jim_GetOptInfo *p) { int x; Jim_fprintf(p->interp, p->interp->cookie_stderr, "---args---\n"); for (x = 0 ; x < p->argc ; x++) { Jim_fprintf(p->interp, p->interp->cookie_stderr, "%2d) %s\n", x, Jim_GetString(p->argv[x], NULL)); } Jim_fprintf(p->interp, p->interp->cookie_stderr, "-------\n"); } int Jim_GetOpt_Obj(Jim_GetOptInfo *goi, Jim_Obj **puthere) { Jim_Obj *o; o = NULL; // failure if (goi->argc) { // success o = goi->argv[0]; goi->argc -= 1; goi->argv += 1; } if (puthere) { *puthere = o; } if (o != NULL) { return JIM_OK; } else { return JIM_ERR; } } int Jim_GetOpt_String(Jim_GetOptInfo *goi, char **puthere, int *len) { int r; Jim_Obj *o; const char *cp; r = Jim_GetOpt_Obj(goi, &o); if (r == JIM_OK) { cp = Jim_GetString(o, len); if (puthere) { /* remove const */ *puthere = (char *)(cp); } } return r; } int Jim_GetOpt_Double(Jim_GetOptInfo *goi, double *puthere) { int r; Jim_Obj *o; double _safe; if (puthere == NULL) { puthere = &_safe; } r = Jim_GetOpt_Obj(goi, &o); if (r == JIM_OK) { r = Jim_GetDouble(goi->interp, o, puthere); if (r != JIM_OK) { Jim_SetResult_sprintf(goi->interp, "not a number: %s", Jim_GetString(o, NULL)); } } return r; } int Jim_GetOpt_Wide(Jim_GetOptInfo *goi, jim_wide *puthere) { int r; Jim_Obj *o; jim_wide _safe; if (puthere == NULL) { puthere = &_safe; } r = Jim_GetOpt_Obj(goi, &o); if (r == JIM_OK) { r = Jim_GetWide(goi->interp, o, puthere); } return r; } int Jim_GetOpt_Nvp(Jim_GetOptInfo *goi, const Jim_Nvp *nvp, Jim_Nvp **puthere) { Jim_Nvp *_safe; Jim_Obj *o; int e; if (puthere == NULL) { puthere = &_safe; } e = Jim_GetOpt_Obj(goi, &o); if (e == JIM_OK) { e = Jim_Nvp_name2value_obj(goi->interp, nvp, o, puthere); } return e; } void Jim_GetOpt_NvpUnknown(Jim_GetOptInfo *goi, const Jim_Nvp *nvptable, int hadprefix) { if (hadprefix) { Jim_SetResult_NvpUnknown(goi->interp, goi->argv[-2], goi->argv[-1], nvptable); } else { Jim_SetResult_NvpUnknown(goi->interp, NULL, goi->argv[-1], nvptable); } } int Jim_GetOpt_Enum(Jim_GetOptInfo *goi, const char * const * lookup, int *puthere) { int _safe; Jim_Obj *o; int e; if (puthere == NULL) { puthere = &_safe; } e = Jim_GetOpt_Obj(goi, &o); if (e == JIM_OK) { e = Jim_GetEnum(goi->interp, o, lookup, puthere, "option", JIM_ERRMSG); } return e; } int Jim_SetResult_sprintf(Jim_Interp *interp, const char *fmt,...) { va_list ap; char *buf; va_start(ap,fmt); buf = jim_vasprintf(fmt, ap); va_end(ap); if (buf) { Jim_SetResultString(interp, buf, -1); jim_vasprintf_done(buf); } return JIM_OK; } void Jim_SetResult_NvpUnknown(Jim_Interp *interp, Jim_Obj *param_name, Jim_Obj *param_value, const Jim_Nvp *nvp) { if (param_name) { Jim_SetResult_sprintf(interp, "%s: Unknown: %s, try one of: ", Jim_GetString(param_name, NULL), Jim_GetString(param_value, NULL)); } else { Jim_SetResult_sprintf(interp, "Unknown param: %s, try one of: ", Jim_GetString(param_value, NULL)); } while (nvp->name) { const char *a; const char *b; if ((nvp + 1)->name) { a = nvp->name; b = ", "; } else { a = "or "; b = nvp->name; } Jim_AppendStrings(interp, Jim_GetResult(interp), a, b, NULL); nvp++; } } static Jim_Obj *debug_string_obj; const char * Jim_Debug_ArgvString(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int x; if (debug_string_obj) { Jim_FreeObj(interp, debug_string_obj); } debug_string_obj = Jim_NewEmptyStringObj(interp); for (x = 0 ; x < argc ; x++) { Jim_AppendStrings(interp, debug_string_obj, Jim_GetString(argv[x], NULL), " ", NULL); } return Jim_GetString(debug_string_obj, NULL); } 6il虹ʼn"M/o2R`bn5Γ;N>1\6[ewQ3xcLA4::'g۰ML%y$M{Z7p$h܄vnݷ슱l۝۷gqVr r9ɦBs%XLC@Ji Űlٺ-5{^{c0]LcX K*RdCGƾ{ϖ$m[xビŋx}hsfm7gTG{9]{9<8SA 8<:x#辉Sz[oD@tbEѰeCAe@Z221S ",L&Z:n4K5vQQ,F霛lZ>(-.O3菝Xe7 2fm6 v`l,3p3,t43$5e)uJ=Fs$*Rppp-l"oA 30H#Łƍ&"T#\86!C%"-R1B,oeJ3Be7ri%aH$VFe-STLTJ)$Y3(JC+g׸&LHҔ30X$Z,޲",7=T ^ԈSfKfcnv܂bVڌ&(ixOv ^  @4 8LQ5Vhx0;Y(SR@RH0s+2! 2̨8)Ԇ) kfޛh8$f0!BE)hPPIL ѻޅ1P5 $T%!H *!Pmmi+C:%SM-Xvm=87<, I uV”:1h qƛ.`u 5MF3dSIY)= QMH3scQHʜE|n%ȴb[n2>R ѳd%7 hJל1I f,r;f&"D=Hc$'&Ydt譊nR;ط q4?b~ N!p>  8 0($H Q{0΍1\~!ZJCB joI.0 >H7!B'9\H. ~[~XȪ=:;6IL!RUV[Z"JvC \q!}pfm2`el!Ylam(J%"RF۬7qls_bݡD@V|‰j(,]+#F2߶n3lkJ$E61''i<rMN*>҇R9z*V0<1uLM$!ju0S,eIXY)R:d Nb>Ee&#ۃ?VkX"y+pY؞:a%99"it$|`U&J+!mn*m[y>QiJOsBAXh $䇾"j D!0 1!_@-*bmD_cxYgF͎M[m`B"PDy5Y P4 87=aYE==D;Ԭp/<|XQs;w6۱K6,Վvݹm͖ug"ec\Ӭ"ԘhEnv682ŴͺmAśirJ$@KC9eft3=& 0fG YH 3Ƞ ab%\ILQ3hu(S{AkYG3,lG5@[ -f1ȶэaWJJ2iisFͬ` S=;*(8H1XKgX]v83γoYŞM-LmkMga[m7d[8턑L (HŰݝpq-sw;6ܷ걻]nXjسV[GKj9wY88m1hV+2f,ڒsY )B!ZZSe-c7-cngvg1ǎ8L,T]fy!q㝲ʓI3C+Q$҄A,I +"mze[x-i2l(ֶFBçݰ$ѢHITZťi7jMy ͻbg,22 lDQ*$?̉G-ܑgblWH SHv k-5Fݜs,V(XB{EB7ٱ_f4HʆB^&h[*&#AfVRhqi`6|lF@A*p;N*(@r^5@M6Hf>{y1ŔдXe%-VkVWw'zRH:&U d%PccvE5P1 l)l ,"jak(-fefQ)TӐ)K@`ʡh@s`¡(jQ?cG?;n`ϑRĬdRA r!9wtWbeUt+)IRtg F"Ih-AɽF Sd#.rL`@+R(y/UpC(Yx\BDR$\Th, V}S m {9 @NZdC ğȀ!,K\))pΔ*hd5hA0J\"{ ;Xoo\D)'OPUȆ98 )TEj`cI2袳:v~zѾ(!yY2]JHĢ.Ҋ%GYXҺ),[-H/LCO.5GVmE>VAt|Z$%aR{@|\R7%J;h gWDyU=J!i $ QZhֳV-LLBɵkm s>c.jBTZ&h(Y+-VhZ"LVS$ȍ[BʬMmtJ5*Ԑ$"#M4U*+,!(ֶ,bn,rms"b`Eibi d)j,S,T %E$3 TՖ[-Q$YXEl;Iս"99JBs#! }CҨҴQJDRbXDT6:\) e)%u[ l-ltlmga@>T\wJ@eQ#J#B-"P?[oFz©_;elIi lDHkX/^ -M ~?`B'zhpYKAI" D2Ȅ0%Cj(ZaXmem&%2K+QlDkkEm+%-LH jCFPOP)X&aBdHVI]lّ 3l[gѱ>Bde&II&y_S,@0?"{G_E?x)Md<ӴPBމ bT!W1lE@LV*-?i3F`OQ)ALRB`&@ҨwL! Ѫܭ%~+NEf=ߘFÆ@2 *b 3"A !"=ygtQûA3V^ppS^Cz|[b-[L[ihl6[dKXEJD; AI̥+A1ʼnSml&m* `9ڶa@:tiZ a8n'L c2ϦI 2R L?^Mg7)2q۬CM8 [G1Vi+-bin87C" "q`5 B2>A` QAu(KHT&GZD DPAe*v"f46 X5n:arTK % =91Rk%7/M#ʠ ($C9ض4j]!ĥ*@'3U5d9,X,'2G&Jxt"Ru9%&@A *LQň6ơ0D R PGߠ@4* ҁ2U#GPP̈́x,T$~j>;  =MčJMRP ?1H}֮='2A(E~Rjֻ[M1=BT 3\=H@ir2?+ QWJ `e=4 F " W2Zhٺ D9*b9`J,H:mhCgLXŭLLifg m[m3,1p8LC EX 3QQɬ,#z)Ra֘BE&Tt2 #1D-+m3[X" U$%beH@)2 *J#)-Y )( $©ӰE&!ZGzǽcG>mRzʜA(v/ B6!1 /˟z ?C\^է00t29}Coz~Oiu}_Y?[I3L^(*leP x}(@o!y z:AX4r#FKij+4ڛHJTiTb@)D>x=FHH==Хbe`v֒Z$j*F~鏩Od࿄<i| _E~?!(d_d9x/ kMBP Z٭BFݣZ)eP)FJVTK%eʪZEZbQa[j4Rmj@իTjB!mk2mFZ)DZj5*5J&5Z&kZk)TXh[*JHJZjU$%2ֵ"5V+-1hZEőֲl56mf%+VEKjlXR 䀋L!` dD M$}, }?K4㭓kV5T:(hk)lACl$' Govg~_@hA5AIިpp2'LDh#Oq?+=&QfT$fDf:|v5i~=gX[#/3=Nf"ϦbbKKMH_%G8)3Lc#5c#?EJAPU@ʽ82kJA$꿅rtZg2dd UhfL!ibն?ՈA&(d!SU% 4<SB| iU) l2$w#G®'4*4Қqr2^·EڟKVU#m>gg*mh"/{iG^=ςH"@2TՍC+@!U[Md4$hp;mv4_ `?Kğ 4}aitL`х:nlM g xtS-x#~9mo+O3>ESq`}_kc ,gdebif?q!LRP*bj'k T"dDdPȆz3Wօmf e4>pCS5t0P?Éq "p+uG dyؐ~A킘ҢvҡĄe:{Vs&?v焁ĶI6"H_"hN""CZ#$&$iY<#P &?B!X֛gNkڇYAd>!"FNB=lOt؜sv#(@B2ĭ ߲<_("&>0.ؐ`GI K!͎H2I0 H#2? THh 4[  Q`jK@GB=24/a:E0]1 AթJ)b@2He*k,'?~|SHt 鎉q\s;v/<0p q 1dڗC @U=J.006gf[XLP ,dGz6TL)JHs? !"ފ)i"$ ȥ06dR>G 60v9{\X&" GvDmgL 10t)Z-DIX?!Q IR(uVw li-YhQwjh3$V1E7. hKRNI<GLd|pH6ʐBA@"Ja i#*1.09(פ`;PU/ :Ơ!)Ye7m8DĶƦ-fd! HdM,(d3?lc|(W0"db+त K (>SL}<xz2 9#՗88 "靼q[&a]ӲS %o_g6/2P4%($ЩJ `4\@\O\??tjѻ.}]B ROTW&h 1\QV#{#=3="?YD8){o#揑dSGpbEb$pG1aKՍL!Penn(s|X|z-*X&f0ZtwMN/\9Pݢ&!OCo)=-&LrXba$KikJ٭Z>v5ghaz[,Y,u"Iw4&A8&;F[mQSIR2T)b9۳Syia& Z6#M4œd- س멷foostj,k2KedݺGdbjiV5wfdFi[%S9,re5E-M,@JA4Ĭ*w4r#f|yڻw$wgkjv,oZjfr7n7 eǵ{Ʋ°j,(m{i33n9vok+2uuejbZո9Xۦo=NEQkkZE ba*FZ=n5:6욄V5 kUZͲ'FkXKII&&2cRcY1"IDK-kYV,Ѩy۵sPvoDGqz+8.xmC-b#-ecς6LE݁K3$D #&Rtvvs`ٽ3pp[-c^vqRBmkGE#V2Zd kYuXjE,im͵a4e#znx톴3Cq=Znx/Mɬ\̛-kD lĖzvfa)j{5EQ1Q0IعC 2piR&(+6g6a$&gI&NBIy{օdkLQ7)',LfY)1r:;9l14R Q&n֍3ZdYֻnĕmUaYl-V4ɒS5d1ERCSH3:q[#aJnsikJbAh @$$h5խiH,+IPČT #Q(S>M4=>|,!)R9 mH:Wκzbbn5G7;d$"l,5EXeΎVqiֻ{n%юLMHl$`DFBQZ.CO?twSGtn5wi|4jeORQd-~O:~|kK2X,U4A+ K) eH%}l=grcg)aIo2bvQKP Ԯm89ٖr&y"LLq04Q43>i)kg26,#cfmgbAhi`JkFPˋ+֦-2 IGXrQ!()*S)8XYqݣ,$9Cbs92UnVb7jI̖F̩R7w(pwI:p{( siw3JڍkBйLaRi-(-HTcm8:9k3%'y o,8daRs"jUva-`BpfN;AK; Rw8tjN#0dJRhEN 4A"<%, ,p1|YEȾ,&l=|D=owHCQ`'bU'Z'S!.-"fmy{Ty%(ölx5e*qD?Rc! OҬ|7S5f_OCl4XM:,);3[@+Y=Ȓ#fNX/Őf$a$a"Ac_mVۗm D舞(#Z0*to[nw3;-ɌeY  8`MGXt"ʑnIO KcHXʻeˈ>qdql;@,gMnicP)[" a y%sdGF5#T`k,Ⱀ8A1;q0px-A@ʞ@cda& @(rbBZ>>3 f^4lKY)3, Q-dFj&FpGKD`6OJjLIu1 tyG#4> OڛID%|Q$SŃ"Oe#fdm[fkPȶf4m&h2JM3@Jm2Lֆ6X{B\fŋlS#YVًm66#q!iMfmp :VmͳudML,2*..b;_0OU>dR $\[e-Z(Qg0A@*GaKj6S)Z%HR,lDի"ZE)eem& 3S$@2L*֫ZD,kY*&յ)ZD"6e GczʬC}"ԂI> ù8J= cP|lb'xHx `F݊x_zBNT}>i!רc&B(P"% 0ȝO+$rT:(Aflb16l8wnA2-UKSf&&̨3-7;=c9Dޞnq&'=ݕZ+e!g x2VmwhK'p!ņg01;vqqeecx*@L(J8)#pcmK%+WFcٕo`mNdi%qSњ]$Axdj#YD[ {=E>{W  ^pww5h60nkff4v,"%%d h8rEťM5|XygAѺ~϶RĸA3gWRSz>RM?U1V-VJ9s  QI g^!]8hzf%=|_”çhRIܔrSg/V4s ax5\:צYB$ 5g+MjcSݦ 5&JC6J֯,4"4n y6kJ7#l0t),8'FIW'ani773ڰLR%fbh5O3Þ;uĊR(NnIc2MdǧIE7x[  cSpѬWe g(?(ݲ|J84:TK;tkzl(t,.ѭTuo~*FqC7-&}?[ qhHnci:lɭ"u-#:|ӢNfӲGᳩ4N 'ql9&љb1U jMLw<&h3.L.y[xBW[ިˠaaf<!Mpa^J4'Tj'm©NpjR: T)h-I>7aoi\u:3 ȇ|[ttrI @ lm.Fa` :2{#dH8=бS3(l$ ykoHK,Dfy,hdðlk_x?=v h(Pu_؉a3Lc4+al&g !ibYk A~ 3_x4=T2 =={ὉSŮTJ[x^ndAkqhc;`\\v fg Bj5OtZ3AZ!`6GS<,*chReccw #AC]6vP8^&$ fޜX| *kl -CNS!x7 .Y%.L+`@緓yMo2;24d88[s߸#CaQn&P|)r oȍ3h7q 6٘jjc7Z:i7TkT[>V\Յ$EúgV:(8:Ї7GO6&Ӑfh04I:975"78JV$ƒOH1`ث`IGG3wJL5ǃӇVoT UUD(%YMdZɺhT^u-T_6~6=3 %&y34RU32y}Exh]ѩA¹:/Rעf&;s3^~l{ymwSA ZOT a-2MrLvwP'~cF7tF8=gg0"}<[[:pN(́ 9 gH ~,#xU>"頳 {jYϢ@ `Bc GUo0>DԩNJS-чJndGfcm9L?rs^5 5[7iH *Dn!U ^[@wN6Ld9yΜ!) uN2;vQ:}=wȽB!̣iya-k0,CFP-F0h4Մ`y{+5,ZpJWC^ l-42^K,AWaUg8_mMgX8:054} }J}Lvrƌjy\,ʏMdS懁H{[q CX/ٸx"s1HG꺲h0ku5tdI%ƳNfїjӼ7J6@FcwhnΉ='4!+VntԤI$K"ɣV\ ɯܓ}3v?M .`)Kǧ FvGB]m`i> 0 6TDCENM''Ua6V BLN BEr60HVY3 }wfCVFDsO09V[q) Fu\uF!7wRI0Q C˹6| Un5ְS IL\tKN޶(4a]5(,.>~8^̧OgkY b8OI%rC}h4@㠗G>X.vi0)²-w\jƒڤu*8tѠK[vM{0)߬55pLl$ sUD|9–QZi-AlwN~VU %ˆHO6i<m{d_J TgϺ L i$?O=%頶E*PܿNcdUJk?IZ'YTwWe$jgv|굲Rj!%>DK;;ޝ l;ί I[h/ov՞SMGe%A*z^SGoR{&d0z .2[zRCV$$#iCvA"*~ZYrbG{=X6 LEAҚʢEQ.S>+MFc0LMVvt@N4BMGc0C$OQ8L80K%#@!,@_-P PlHqCMPLG$ ,2@L"[M808A\")W`&i"@=!`p K5"7KTp*’`rEF]FQJCB5"D\ 7MRZ-w waP}6Rjc2a2CxqrCZxm҆@H:H EKD8RAf#a+9n~4N!/V,S%ऺ,մLiV07 Ƅ*TQqU4-G LLEoyK *Up+QpA,844*,ʮ14G3u1cEt3M!N@ND !D1,+Y/ `Y ^XH$x72dZB+4e , T-iID!-* WI N0<gkTP#Ad 5ll!B*/wҲ@e5!$=m= ;qtN.#ps*"d T=BͅrH% g37 0YJd=UVHB&nmioo@lM@e׳D>,6LtBDaV_G7_jB #SYÎ8,ĉ kdPl $@i.-)*`7_`LmMYL;gl}L%F'i h}sl;*wibl=~ _:,S@)@P "X`P#t`p)<,YOY##S(ܩܥ5)&N-㚤V~L]v"7Haٌ+[-DdLNB}V7qhe.t8ae!a˰%5(RIpGWAD|uz YJ!TT$C2C|DY`~IGP)OS%ZCPC=L CRBR^$)J GR!ײB23_LiA }Q全ϣ{xG !ܜ:4Q͢%#u7=own[|nuLrSCL9"Y`45Ahz(65n›-Zn#rBVj6.Z3Vݖ&,#MU{#!6{y'[,rبހ504%1͑DMwǷמӛ׺yZqC׷mj9nYݝǦ)Ѻ17!˰eG:"-u @y: -e28GGxV3P'00 )-%S`lI4iOԙV %v+Lv۵+n؆"}wY2VAldT2` PJ` @PR|I?7OGPɣ#ԛ󞷌#HQB @(E(i`a @8T)ۃh 2 H>abhhB͋퓻bfcB6dX-o5cٵk?<ՊͭK$P区xR1bJ $%&@Gb2&'. h3md. ݔ N`aseX31G1g''CIN#fEYYnbN09&H01JR#08k 1` y _LB5Um!4sKJhpLWdr w0~V`'NAHv_JkAOs ϸ5(v"xJ#-)휪|BT(\Sb8%42؋@͜ @/x_DHXsՉbC?+@RRu$YVjA jR*R?jHJ_dNrR6MAXmU 7#~|x΍8Gyz )=`1o W90׏a̘5g# &HMw!oƹ趥r\Ǥi(!G"Z?&4EZK AA w;,p(x]0:P!D'laLtZE[ h΍I\.qw]p1i>FK&#ު Xpq|h6P3A (-;x0.֢l#v Gk ^jav04ǟ A Ӻ&EO$6$,')wn@ AIBJ-qjk2}v0QNNXL5Q @OzB!N)4:*zOt mF6n/A(9- >n;4]ɤBE*q l4"V0 fC4h ,Q$R$ՋG``D |b^|rkc(D !Z>U1M/.`PRQ)}jYs%yaAյְ5aAE80S ;/Rl>XZyRtɋAUZ eWOC~˸=G5Gv=zCκxנ(i/hB=HW.O4ӯ1 w$פ\6 uI/{NbN{s|']yK<| yB/exmrE; v*BkKtg_]y  Ud˨(+3Vf(l3ZIY: :G›2f2jK*VMB.Fm3zkKz\\wF_.PKN&(zfV?#!hZ`q4`ʘuז6O P,XFFʴjGAT+*ѿl,FN R0>`Mu!3P [ɸsEDk45spcG !rݢu6 wn *')اY a,G{wa|12p;B+Ѧ“tŦ*6 /{lLJ5C򸱅. t|NŵU B[ (!iӤMdv t߸)g<Ȧ 4S67 TokG\ d"A{HoAjnH]@ G4v":M釒|Rv4d3mIEI,K,y;wD+*/a[ 66L PT@ݻa#O:rN ٺ@YDsAISX  l~ F9;^lbuq\\:O,%z9ˎ w$؅%&YS#G%:vlYM衛 N@xEeq; z4r=ѧƭa!-CZ$4xUd Mw}n4"+ X9Cs.G͐(=Ѥ-cIB@Zu:5&1u~4e]QxZG,C_ )n1SAz3@8#(&@4:iGA+өӣ)T3Lo-8F@s4iac* pt^%~3ƍTâGJGk9y̾1δjFu˕S.Gx)8G$3rSؙQrpk ad0(*1(b6@N\^GZe4(טkIiAAA1k{ĭ]YZvV㠃G6a&1_AOOM)8%3z 3dEv68Q^~M2;.dg4bQSeI[tuǚZ*FqP,!dxrKOga(-h(%J %3xr{tu4YIDq*QAďT5&qt^ixdNEleޝÖ.ܵg^NtŀY*T7ͮznM=1L=A2Idd0 ^*xĊFDM#X))586pԓXY'#z )5v~[_6$"ƚz1 L133M#B*1)&F[xsCvz{{Gng|]dhjX);R, w-g-t@.~GǢ??{)IOsс2 /<D5K% Nvyd7mPM49;1bc$Lgl)Os!Ӽ]LUގڒ- de, 2rO{ߑAZp:2n)٫ #l )$]] ZA%U]ˀ,,CBtRF\453 {E?Plo[cPVYV;KhHS}t0'(85߂2 Dr#,K dqe2DCnm0Au= >L'"|xcu3xl=={lbYlVmcPV`S%H?+=4* H*"P?\iAh>lle`}C;YEI[6t3o? ͷLHH[-|l,(l:)EFfj6jG SZ)2QrRAhR [ 鱺tVec(R5lٟٶ0)6mFնŒ\Zܪ"(4@:b[FڕT̖ͷFMƭ)S+cVb)DEU@;c#HD6%VٔV+6P}K12m(УH*"3 uT;$Sd8jh]Yv]beb28aݹK4J٧,$g1Sąry۾m,Xlrg2n/FߊY-珆Q[y[jںlg(#$gõf"HyyE;)H`6̧X E$Q&iB?[l+3ج ݆tf 2)L45lF A=~64}D († 8Н=ZEY02X`|*jHAbO@88XGJ 2eE U#JIE|hҲ6l 3;"'z{e[h{ntdQW1eq'qn{jnǙ{~DG~EZaɄG`y $p,uU6 QD~zDμ>L~o?^`wVi/w*3m!SsxGA:谧_3 .`d :}i٦ Diz4:g))sѳLz'<É'w,bwiYZ3T{v=}k ϤsڔJ7n,M+e3ϏgC]'ek{M'v۳>|G;ڵvd9SHK Zj iOnnYx(Ün=HtvlDLGn|}}sޤ'01#$C8Z[8ԕZ+7vBch`L)@D[r[ePn1-ܸF2!6\#p鼽[}Y>Yxl֩3HP:q8I6SgY:LLs.EW&XË1Q$Ka}EԦ['phI4*l6̄m-@h݌B]KPjԵ]B HNefQp\ FDBȥMKa;z=e]b:<_9NջyocGtuzv{קnVG˟7n Lj4fF8ՙޓb|>E[t*ƭ,1B!DLlNXД7lb -6[vBDPl7aKf cSlиA+h)h.(t(IiٸF7ďvM,w? vv7T$bM-qhr1#|sH2JKH[]وCsyDqYw] Mh/ Y4աF 2flRV2T`Pb9Fc 4 #B#7'X)UL43[L1CMo=oab>G^ng'ӭmծѺ#qcq \I[ֱ o7-8Lf5& ͎ Hbeoй'; ml "$aB02:r&XW$ xJ@"ldŶfY,41 D$$e"DضԋHRE 2`DD8A k͜HӆГPJv)5ܡi^hT|RCtdkr"f h4flV`ΰ :fg mmĘ,tٽl5c?mdϑ2rUQB$K3?rzf;YYjm[mb7kH6R@ =-= LߐAJb6`*:tu,xbnvP!#wNu)0JԨk"!Gu!wKj6d8m#t!Yb2mI#&33sL@`VBW~@*BH6z;4a"ѳ )z6fʙ6kIN lQIjTI*,L(45ftcP9LPƣun쌓Fֆ戶κݻq]fћ$ζ]ݺM%sNVԖs$RZYZYBL)(EH!i F ͨke eb[ 4Qa2Cѳsu9$h&Ȇ $ʳ[7?6Jk٤̢u@YLUؔ"̡T9> zJh,"FTT>0;f-ЁiaXP$is{{o}:ig{yY/@B4vz頺ƴ a:06@e8TjOWvt] `F0&e(t˽l=Øٹ XG rYMe%iZȱ9Ix`DBF.@YV[*q-u#j ,$ S ,bv' ,RXO&M4]7M:01\-! /F0[M^7*kSKaT iPSgV Kq^D1DHW![-",$FHԁK (X=iXI&x%=f)DzINs5u{L\-+A>M".:Ȑ$R |*}$}Џ?1ejb_^\ #ֵGV0V*h6u5Moc|v[xZ0pvȆR &-s)>-  ܡ\ @IprFFƓ$A9 u2$" ʱbM53f}޻G =A *f"fڍdCvp4- X`@mXJiԋh`b[p[-md6Q9 6v)(0JCP7V bhI 3okۋ hBll, 6O6] O+I 4klD֏3?UBE m 5&o{l-6%e"BͱblL53LR P) 2 RT+~Sܨ%)%:KPL֤q~୅8>N'Ɗj 898.0h ܰ!8bREu<`B/BWx-o#qIJ^熎)2)d\m$Taԏ%%*gx= ZXD'ٌ85C%+UIϓK,Bx$?/^ O!`p?7 bb{;p&)CtI CGTԿHdm x} f{xx;Eqݸ-Zlj9'F"2qR Ij pc>%1?vhS$CA!:(`U"=Kƿmz7͔e)pdцB"lq%=Ladl!nBO\ R`MDkM?[Y3SkO[XñŨaVy7Jm]Dmslro !LcG+ D+=@HY|!=l"EXgQ.L~1liձ,x0daYR{`Hkyۙ[n8;guѷE"w+&3%/;3Yo"C$NeZG Éd٥>FxY6-1(:v5%G(.(\WRGxh{٫,F5Q#"eVŭ-fKKqpW1 Cx(<@`fSzc"d[DmݳjQ#(SDI)$QAe,G;pgŞfE(>ߦ#Oت.vHPaP+VRJ*NCv8*{hYF78]˫4-^э i`DNِHӘ1ZMcFfc*P2MLMoN"37do4{O*Mcvhknkg79nW lv;rlO& c8 itSr q$UfQY/ew4i7 pd}'`B*7bjf7C"2()$BpR,SU[k$Qbdljh,'tcuuǜ׏qo,qkyiSLG k_(U*A M?pҮ4+V-O1E9v$kC$ Pz.>A(|q$HTAde//\$s7!ĵdR)xӌ8t)<֧}c]m |)!F4Un,zN+ҡ)40Hs+Hzws+#rv.]Z.ik9PL%LkB$J5ZԴ?CM9?dD{4a<چH{ H%Ra NLPoknYpG[t<j?ߊ$i,!=%N"!jaۚяL`1iփ~;bo1V5;lHȟt#A~?%'C]$S4h&Ma#dsWzt%@>lñ 4V,֭-"dUmVTؚ͘( J ZV"IH1 @n`T73m) ZS! P/??}~J׽[VG xh5VqʒMu ?`.r:@{wߏzx!bp.cfaA 4ih[jU ,]~Z8 k(8ĔM ee1hYD tXڙ@}C 4:*҂7wp>3iв% mBՆU-hd.[9sa>S7u:o\  W(reA/4ȾQ{rĿt`'oo_ͯJ9G.1AY&SY.9-,t}{t:7Vmש/^{||wU@ko}>Zi^7׽fSO[`ʢ}`9]]>|VÕMgklwh{pճ|.OJ(<d_gA+lg0ܠ;/޾>}}x}}|>|ﯽ:^5.{{v@qL48nu}W;h֚ҊhjۀP9$zMS>ls>^ۅr)}ǟf*a\+L+YT%TçF'B(tIX3mJ)tn9ۂ)]U*QU}jJUQ} Chiց:݀mͳ Klqƴ q hQtGCx6 5ҕ@Vwjh( {O춷\ǭn{{(}/k;۫(w)$t@vPRo{W=uzjf4҉ $H)t0\*om **B jtY׸wE%]t+cáwGvޜ9x.{]ᆵ}_oJ }e{}•JB-;2*dzjmBHQg>Cowsmvl)oujvW{7R3}8I=_^]|{׵v /{>3w'uAٗa{Sn_f؀ت7e^On3׸P{vι-ݶ[oEgv>vt^OzMg-|=zg^z$u]R:IuԺ֣fogx>]/tr}h<ݾ}k(9]mޯYnvzwͯ>C{Kڏ%ʦMΘvtҦW׵{)c;=˩l㙃n;w{=︙muBzr8b/}ye(pOׯWcd=r ^oY9{4}|]}Ko{!W\ny(+AOy gҊSl( @@(@/a4Emz;>nPb[ov{X^5cY}=5Z@aeh}7lIqS@>4k>9Ҹnxxw[6{'n>cj>8f[S=vs@}v{7sqhMP﷼ WL_@ }Ծ[@ձTkv!#wf[ۧ9t=ݵu7=ݻOw׸6ϕ_G7l}]6/}=(}vOAxϥWlM =k>s*ut۶`ykl:%G͢R&Uvw]^{״{=s+k{Gѐ_k9Z}}:;r U{ ѧxR,A5{h&izw} śZ+etɯ[c۹kۯ`7vI<6X:Vw2n;.`oxgXn,w|}t:*uМ:hTU4  ۷vEއR$Pl^wNu{>o딻/$6z&F={J:hח^Y,^@Ew{YJ f^޸:P$J/{;g$7=<}v}NשCד}Vfz}7v<kӷ}}4 PWnxzswd^%'o{= "  LM444ɄСh4hyOPe"!@&i10JcfzIb=@@$"h&&M$42TO?J?TTOCSTGꞑj4PA DS4 `LSFzST4xԍ?T=F =C#Aj= @i#FL!2OI&?SFjOR~4d@@H @#M dM4M15۸AV";1,S_B,ԁhu)B?z]Y?d0qyC&"#ürG(cFuE vN9iIk49p! EI SL: 06!gZYb<QTc"E78֭74kkζѬ6yb5͹l-xRhO㇋siZiU-_q+lWr'piJߎe T׌',6S @9{AwkPЃ$_;Lϳ"26ۀ!i(0u+}@2,l2\̰>)ٺԥRY(# RgdCѻL"ijNz 0`f( J!T d(LTDk*U& ά6]CC[KÿrQxH&F,HPzA=hX Ѕޓx\q9j !%30zٮ؟||=?ɧ8}0u{:wLjj|lz*)]1_, E{ fP9PM{W'N*{z~v@o` _'@F>oAjEs+ę{0PAavЖSY\kr2hȚvé{06x; q#0^%AS.n*P%el)7~;3Bo3310mrSAAM4SMPWw+AQUR8rQ:k '{Ҥ|^!5FZSE/z쎊~cKCs?$h=s4~ht7whHCi΍v~sC<8KgCYҧn0dVF,ُÒ9&vr'L;AYHʋ&߳={AѬFD{xǍV(Aq$;L/",X LzS&{OɌ,,H´CZv8(bsI[m2nfQv폅5yhsAFi^l2R _G"Ɂ,vH9#.`3{?M5CѭaNp}.z{<>AIŖ8a^&ۧ)בόLy02ASJh}СU,ׁˠ3s NЩTs~=t4[trt") EG5vbصȜf?? Il=}0ܛ G[1WܕuQ="I~-ccÿ_OϼZM?V{_a!NĊR=/.; pY'vN5Icv t (Vt#Qݱ\AI_/'5jt>+Fi tO9.;WbÇkϓ#g1E&^ii-#Lsw!'~NDߓ4ؿfV "m\6; `m* %܇ BN80!kl+|scљ&&/40 srj0H퍅mƘׄ𱌜Ѵnܝ5) [f[O=G< DCajyR,m\B4EuX2(=}ܢ;|Ӥɢ#k w뎢HMWf3l4PUM{zԼ&z2$cm?7=|t9kG?=3bNE |LɘD"h6Yշ5]g>z[{||p ; x$ }(dzUPmG8k3h_o}eE# x2zvr5QGyƊL_ ?W!vyէn,gU|ꦢhU܀g-(=kߴ(z.o9B䞊[jRTiA[1 l&ToKӂs=Mfςp 11Bխf>/:u9G~Y,ǡfkڑNx/Fެao:n*bB sڭfdfa]%z]Y ,-ݣW4͇l!\ &0!`n&a5Mj:c맷ߨ쫙0&2I>Y4n# GS<c1IHD9K>A;6 w^RSqVj.2c~KM,8hIxoʎOg# {H1 X%1{??=IBp8-4cKd+{Ps`RLI)]ȹ6|.X`˃M6Ș%ί?Dj)zKݥgPLJBPx;8hf`h6Yāa@TcA})"$ ǔ ;, 6CBD/yOOO2KiZmB[B"'-$i]1-go՝k{i> (aDFCa[3Au;ַPoyw뵐_ŒC<8ceV_)k)UO/DMSvvܛmypfCz{c?/} VG%;lźK33N*c:1AzTQIJ՚o-{-+۞AV59H!wVSU *[]326MmZ'Dѭ3[%Yc z2z K{NY"oAⲝ9#hlr@gVc<OElֵ'2W$lmBm$#`^szӭdt"1Ï[HX!';i."eoGofNCI1uXx/}.;}tqkc#'(u& {z" nٝB ٥npi"QPԝP̏fWRϑC,q?Qù # WKv=x f$P+OFL1[]7>_/4X7dZ)27FbLb=3/1?9YAG =!%0rq3Ê<0l z'Pu;&IPvRrS2$Lzԍ|JLxCezt5E+ j- m'%FϿoj14Җ0!{MWm,.--s.Í݋iHISbZGa0ȿ^ֽt`XQ5ae>ɗ 0DU^^cV[HH51_Ebíw%wvM̮6g?ff5pATp80{!\o~嬨k͑"76%Ń12"m't.?:|> ~ó:dDێѻoOČ|][efelΎ}yKEsB!HP4'~ S5 vXIf@`vL$nB-FDh?ύ+zÍxxϫ+k5matO—UNkKQ\q Hh zI h&*J) *(`Hj "b&)(iص5n˜ћw#R fౕZ/o#|K<-g!U"֥$ &N+-P͵Km;@VF[͜dĜzX I hË(b3ff`ffd =9?&d?›.55~9p_MieUvq׸l+ͧCk`Y^sd aϬVȏf*VW___L۽٭OI7fApu@ @0 R';_jv Sp'߻|5XՈ.Y321X_`3mKpO_S#mOוk];=q{*"dFo󣙹t @s&ͣ<#}de"cn$4|clctC}ۓ8tv_KLVV6Acj&2d g߉(_zQ̃wSCC5Ǣ; +5c}L 0ȳesw}=-bģ"T~|u! n%!O{I*} J? ]2 ΟUݛS5u~/)ϭ.ᩆf*C_^ ڏo^w/ \;~'eo~/~cvfDp>8M猉> Cl B $"C!rsP2B^RA=4W݌eB:p)@M# DOEDEDR߳|%(1/~yY$U 9Cez%8>);5llT0F /.^tYգ8VLC`m$i$;{׭}F`L*0ԢW/-d 78;'paZ5hՕ5'uʹa%"T}42f<|[p.3|X,H"2E1NY0Jk+,U5۞]:nS`5#PZn ?uY1e7w--L8%~ ")췙Ɵ3ԁa);O;J!xtٿ5_T!O~޾ 9Y)Λuo."z*/}[-CL"wvZ7>u^"ɾjos  zApMYrfA_0%LwnDjBՅFwF;jyꙶgKύ-~7ck߼V 6R;aS<)#=[+fz5]_=xOp{Ųxx=IB\KMYeE=q9 oץê8xk|VH,6^ -t,ymZzy?k 8 =g 9~H]Llct;vCdNLe{ i϶ b5z $1VG_էJ0qV@ f9(~0)aJ Q;%@H)Zu.DA\u EPqU=PC1'F.?SpFYx*1T$P`p!p` /B@B^]JZ  *}4+@"xA:SsUe#^tƪ못,glӆk/A !V o&hgc٘po\d>➘#6>Ϙ#T 0L+$Db*0C>?8@vݍe -U~i WSS[s<}9 8hcf:7A3*v@% ՊɘI>5{m/1 ]V}Z?C(,Z"5)xh!.C" #%)DvhD!2yln@\x*o{J҅X۠ "N%(WS&cDW*r 10MZR -!t2!uV*U0rэsm K-r$`Fk*u]pvDmP$~|7:(OP Yrv(A,. -ewQ٫M#h䚪1dR'ˆSbfHh-{ߟX jT*Xg}qF:ɄمuDeE%3_#k@ =POj1(*Rp8=ڔ%W$V||xw: :f)gV(@l[1-#ZiߨK8$FO_b+GҰasz10V]j\}'х.㡴:?ɦt8gEpKϾ@wS8Oׁ=KeL:#jҞMܐ M^ Y832w#F,SiYg&gd ~f=,W4ݝc(DV>&8ߺ")[5yP$̱p(ࠈ?O6MWٕ>P*D5@e { -d^mҁG&kp{h%(JL.h %w3䛊3`} >h,cqߘSe\r G_k!q/aTF30RcJ"H[A"-f)iX ϻR㬇}#sr$QEdʨ&-B+{ll y<r6DlVq8"Ӟ$8NFSB !gxDzP; : oI_2@Pm;Vt3 Kʝ3P3rqj~+`2-p&J+P52:[o{k'!<D8:a+sPߺ1,yM8rqL333md> P<53B_9 Sm%{*5GC("$qiFmL8``^p6{c 1/0x_&d3ØA Mϟo?.TQסHID4Kc&j~0Oڻ |n->K,'m-cJ*c?,8cQj!2K*yTI`{p?&$=2h`+?7;f/o{0)֞ciu}X6%,֯ecOoX*^ d2܊htF* X&⃏R>lξt[0\{L(b(F'ÐpQ$>%\Ehpcm(cSmZבL 2 Kޖ6ĵPFQfϧx i9 NGM%#5nѦ'\uv;)W^v]D' `<5^oOw +L|]'\5._5}L I EI$aA2rr^<ԗf1KUgfBjɃpT2áOMW ~\tlV3c^Us%b]Cl%˦l#qq-gJE()-%kW˒yJKTfvXZi/XX≚ȴ (ɥ) 5L^nSR=0v _ˡA:(CZͅ-RGDd'3 Gx­| Abd>Jj {?A5/w) P0Ĵ')e!`h v(O*KH040 6m%A>`bp0(m znҖoA#KCeH.U0,f)~;v+\1"!<7Co|}/-?/?-7NN:'bp0Q]A}B+?b wCзY r;x]eA%I4T,`DO'w" XsO \=?Od eJQtքܩqwm؇ju@',H/(8 .z  'G1Duam JY*]17$CcaS5SCTb.`|zMO(i ѯM4vˁMf?()0qfߏv}L&>C2k\֭}%lcZUųViI VA=R̨h"mm]kN˥&uESʩT6_^8[ӿsޥc$%:3V :Ktx0A:iK fR54?`]q\,&+zW1D$|c&‡Pq +R^r |<SWE$sC3/?v_ 5b< @L&KIq2fL! f`.h9l>W'hϕ}ݾUlwi~arSU̼QNt¸5۶<mi~i^BEOṺ ~ Hԟ?ovǧ3cOadC ʖ]OJݮO3FɺTĻo/OPuZL0u .螮U>Qa:ZO_c Q#) uӻr]4yƉC>3Oa9ucZM@0vPŷ/̎BZK @pMm6l6[멡$aű7^Rl65q(F4sAQ|3.()fPjפ,F8,\W]GK!yCQail5$SfxUDO2_ ?Ȉ Xט}-DH;LFt][A4j2PJ2%_:,'{8/㓗^v(7/Î{}= lUkcPpq Zm٫>Mp~ [Ze?NA.'CH}vUXLoJ PG* 7f?$%IvM`<1($ՕHS"چMW\0ƷQ~2rY VXv=Q=P,ӰXbh1RW=ʘ;d^{}K^I˦]܅jc' 1ꇆs0.E Ըi+B[ajjb;F:_wkdSu/4yƊk~\+:k-^&fY7ɹ]=$|#EJV5 >Js3)D&2j߉śV)"Ozߘ0<_%Q tL|ƣ>&_Ka*3%p Ɂ3@ЇAfXU 6ҒӖT0HZyϨ(HC^YXT{2з]{)l۴"$sNiHR㨘RKBE=Wl[l2"Hp42:IBy4 &{0+A;P5- P/=7T;yt"zD>Uϊh%*Ņק\2jhpߏ'?sh6#A&%HU7xF}FN}X\ŢFG8ub3>9ߎ,) )h ?g؜sJw@w}D+Ȧ~,Ps᣿?`ׅBBHfU֎0PMoU0~1r JsUyvok8cx|{Q}i 5n7_ቯ Tǰ`\ut jQ?nIH_025Gaٙ(wǒH폍y*X -at(P/a/-Ȑf{Y ^1/c әxa7ʙjj3f8ͯwZ+K@N` tNFӎQI.~QBpQ>FQLwj $<M΃rL<7=!#O, h afb,R0jaP_?v)g}0z1Db# 3᫄h4xgMuv:od[~|2^[cݳe\+{..}6,y9;oYV조~0·_\<~?zN:[Vx~>m6|z5tC#~ңoV!\rL>g}n̓&Cv!fߒJ]?}^KFtZ'|TdMz*\9oJ1A%]Ħ@HI #C, HB%"$11 D0h2)Œa4 cb4V.F ,Ll9H&$ 13QL+M8[j[>y\tvRY)VP(K )6G`-{ ,3U dJ3߻Y`szQ.q)x (%tAZ.E(c;+@o cjS"&$"fJٙ #`6<2Ev$P3 6;(]#0xg`|ҊAמbT~E!I_K8bx "PC`R#Kh$w頗M p ^FIUpYs|X?`~f,/AR9[(ţ̠ENgHB ;?lD| tQi2UZ+֑$s\Ҹ}&2" Ah>.< JWHz~ߘPݓ&NdFYgu_yZeD. gM;36a醎r F9G+t='G6 m'& V~܃a;_>/݌( z9S]`jm1*^/ɹM6PCx9Y7F4ƀu؊̂Cȹ?8й*qrlK>9xA~⿄Wg-C%$VV!) ),uŀH "ݧj}fѽx5S3d[̾=:ӧ|cgMT( I!\`{ZJ"y ) *p>i=r̐ %]̈HuFFY ȆYmmL%BECq:[  ΂1`&%|>چ1r~KXN'r@zA GPу#@}a&+9bK)|zx:&wJLmdq>ٺKdq380C932(Ξz]?>?Xl,s$srr\XS}gm(<.9[FVII SnG3e':t!I2NpwJh%ӛcBDd~u7 oO$=~b!쪪|GA nQmLOUGgPTa+(C9|ElpG멐p8ANg_YA$MЄJ`37`5?a>]cRdxҟn#g‡82+B`+dj@>?GfZ[k;7jrQ6գ0N+!ʁ0Z};T8tD__>ʹտ,F&q;@:pD~Vb{/fR_1N?x4 xfz|18|$E14sVAwT;~}*KM2Vg=Gj񒇮KpRs=ߋ' j_Ԓ$ h?2Cngԣ}ݮv_|i܋k-E1W+y 4TOǮ@4<yקxA.HcۮC;oz_HY{y8oDDD}眃9/BxBR}ї '@!A(q=mgd %lٟcrXZ!uװUD:4}tC8 |ۭszE:K!ͼaBeH>(kaQzvGvB 8bwd-ah-&ܴ8.?s"s G+&8 c$Ɠg ryi2 Wƨ:(W)fݑ8cqN$`NBD٤;,V8F%^Аf 0/J;y (jDAǃaLq>g҉%梿>GFv0CF?l?9=e|ƾzD>Z0Y3v3?%5D5Ͻ*v`kh # g,f)q)Ƴpj҇ sS5rQYr*(r 4ظz면t'?L^ʩiv\LZ; N ݛ//yz^-:O{ y>OFZ\Ѐ)Qp7-R[c Θq|R3(B*]G塂l d*k|"[/7MzNCퟝˣBXE1J%h1C0AѻDP =V_$^s1sV'b!M,̜E R )2aR7-)əe9çqW ZےnP;>5*KX.g~ܾZ; jCUDzJ|c9upܧ2);zvlF*%&aɐdU) "fC+BʇGtJޡb&bIDLwCO_o;tGcՂ5Q. (72n& :+ۛ(-,- ˹TzTSp{at|ڡ;6y49Sj\LK \L24/H3tRoC2&xd aOՎe{r((m*+reX-jfD-nF0Q=i\ŝdK4IWc: Shk“_Vx'·a&ud,"1` >;貵ׄA3Eى8 L j#cZ\0QGQ?'|m-:(#P@ hZE& LW .'2!6RcY4 "!(Ê,4j׋qXah&ݼF^.-zθWq $g}ta`rAD IYK o$I0 Al%ÒBi`YtxJHfvٝFyZ ʆO "hɂ JP OGb"tA$!&5PUv4c" ?{on-< PjO:CBX`ᗂZpo+MzuyQ] G}䰭!Hr @̂ PbHXHGCq6A}^A蒡YjJPljWeEdh7.uӪeD0O#S 71g>1I3^Fg2I\隉IyyܑT-<K7 y*̾g1M[S +qrK:$-㜐r plVWB/!d Pa0lhC.Hv>D=a>bW"(´5='y)iSM$hfR6 HR7{')rE^5Oxp0=1Ʋ`\5#CwXu$~Y*-&e<>8y"!oU1d+ d !z1t?H7dyy~Df(q ૗BvIN2u}`wP'6zGgL- *!fWay-({Mێj U]MčX +CD &}M6^a$MhBdJ\F ծW?Q }K> D&'>2aA<"PN67z hf#ddf 13p2(YhvL~(H.0~)!y"CG 3/ԋXn5e9λ{QkCƸ`̟W2 2(0.mH;L狳7s~gU \+jd.0Kf:!V 0T3Ic:5PHb&`3;B_AÑ?^}*488W&u'AGҳIa,>;>ݞ3,;6y84pERp®prȈ̦ u%0t#"z˦ȿJq(T|ɒ'd;"Ja?S&ڠR`TSFfI  8\!HR4J%"RqdH0U1=4SWYY pa?g^;(iIw:'vF 4oxp^k_wh%\$<C>i}x&qQcrb۹ݿTM-#%{W |6eUY*dLVżp:Sdd!܌D i.7y,1MW-$CAJQ-8|:~yXN1N[9\fJrW2'HN`\\I7ƴ[2^^ܗ{2"!%0uu<ڥcC{qhl$b@J9puܐ2hvah% Ox2 Xf2DNHusd (qSc 'R X환ێsв. uۈALg://0|ÃA(%W#K^)Ju;=8"n"L%'&%]boLH4yjRNE=A'3# R NF$M8 ȭCī], ] H92ev9ŘA6C {qvvM4vCzZ}fd__hm @P"1]~,<ětY|wX5ZX fVgX*m,b`9ϺS*">٭YK:A0C18OJM~*2-?䣥*輘B:!#>k#8޸4ĝqTA]-Y`kk/+5b t]wlm'WFJ) @|%A.KZ Qh3,'" f"8CiKH9R{J3K_ϻVh!wR("+diz,F9fsORǵLn\JHJ\.S\ #ayUfe(];ucw&s"&~+I}wtT4*9R D퓵iF;T x7Š>u\e~~,*+1>9NVU`Ǐmy\WПq  PVs5b< Ȇ~*ʫ|ka?sv)E Dtѣy7r 0wz8ag[rZhl̢{ -l#;P+y}0(m˲#\ Θ/d"Xr*ki=@iug3gÖJ@yN0 V%bMOWTkbOAm)h#1eS^XϺa fJpSߘTvDr<9?yԐmanhz}+pߣ(Ah#4ZU$f g%Ewm\hrYw3}zq<1CQ  A-IqC9=(4%5fE@̼`9٤,VK '{ӕ{s=4JʒS a-`t0С1I4g9rc^ fY&[46WK9* 8a²',x(# I%adn7+F0KA*zeL-E ֒)hV46)=EulC荞;j61xfPd@v}`T`ٌa(G4bh3L̘ErQe{B*o[ۤW*>b62=(",2Y cɿX;ap VU KO/c=Q)/75 7߈[$SQs~9~3OCYBt2?W}MYe,"D|ʻZw1Sgair[|weɻڍGdH-`Q_~MJ+GO%tP1۩0 3j5QUʻaMH?봁$Wjy UOD`U&h1q; 8̔#\ }`ow<)@SQޙɏs*q,=x MQ-b330fRRbn`ZVlzuˌON(]`HR4Cmg!hjg!†a8Aةv׹SJ䃤Ow*zs>,QaHch. @!k$a,ߤAĽ3QԥCGV- 0*4@q= q i8eJEHAs}.8ݗQrqCU+VHDFI`kI&'gWK]w04 Y-XrTEH§@rLsQK(:u?)_@5 K뺨;mOÏrqkTWW8XIeyX$ڕZ"y zYZN{Qn/bƆ-'%0e (P3Q S^p#`~<j8~+6` G15’jCPbˏwIk#,38z /IxƼ2qe& џl%&טx lja@fsFTF(=-o_z~z'qE<&9"6L78N_eiGm&g9ȗ"3$e[cewKBoLVfa,@CWc6N$Mi Sy#?+)8(3EP5P`чLV ^oC '4L{^yWŸg,]MAaU48  lӯV&}eh[Ƈty T&B1vx-7 ?Ȍ: QA~e.E;9IP7C\خIe_LU( N,01YA\F/Q-+~sw{o5`,!_c R!K2($!y}BhEMĚ\QgiH GY&!c# F:CX8KVK5|b8CC|$9Tbil(j=[X?JP%v88+Z02D38 6=l-Qc(GvJ.1\ 9Z1jz-(lR>^bӡ+ JmLќDۈbL
Y!T}yqzjs<NmH!a]A2% 3<0(7\-`P 1ID_d-~}hiNJq =bVLBɚ;_Y- ;j.>ٮL} H;:<|_%H 7+1_*feT0$~[]r.*M7KG˪"j/stcI}̑@²wWf0C+,EO,r#eA 83\DwP0-ٴ # 6m&c@3I 0@' ÔY{E% )J Jn Eހ<|y;^ eDN3A2<ꉊ 2cAGx>XAݳ^ιr@eCo2YDCI :K2$|=2+>#uԓ<"͞NB:0z՚! \SRi\նhAhJr\$%A38$&Q.CyB'߮OvsUFl,3hJHrD#x{AM=;#-"ft%?ߣx'Y]x/=~cL( #m? OKUD7Z>Q4L(rz<^ YqHw0끌щ&WkM8MujTGrVƕ<9L0GWW$9),Z<壃'cKXr?]sHz0rբ~W8sXey|H(S|\Jkjkت8HL05 ZLF%M7ٿYp `4{>;g8o^^b0Ic7DQŎq.9u%\-|?qB+' ބH*}oI0x#*`|Tk2IbdAjgJx egV6}o\+q,to5pKq`S#\WaESaYģ^6>3ЭDvƋwF,~pfA n16jLp 7hɤĞY_͇>N4+;IKQ':jN,e'EKxGH04Vs|T]6m ~4wi1mU(z6WԕH֪  hkjI2ј!T;>qX9$?Y ~B.qDɜkH3&X{i3b g9ƪ$-Q#l0g$m [<5uU6v(dt$gVd ˸QF #o-\TK^RXhL4#8OKţYUqGj}wb{q0I; N6K< #ADi^h\t3DaMKՌ䃷S)+&~<8B}W^94 aqLaDn].'90]#xm2)&eɷyWX(J.UF'Q_w_[^҂RrQBCj,% `d珄Q$zZ0b`]QKey</ĺsw.4 ZYGf A#=)5D%Dpnrjp޿'07v'uJ)łd䈊r8cI`dsc'L 0uj:aj9Y1?A1pZ=?>C7WjpKǣfu1鯻fńi:tTa2J}1N qGA9o,5 4"TM̍f^Ё5ku1ƹ 5z>w#)g]L{cUUZny"ZNϪ|W J\xa/G3 {v ܖQgH#Mc9a`vF>>~)XyaE“@07\Lv33n&9[I=D2I$#[YuYš#\,Lise3$4&E#fb\튜 J L P =e5ŷjCUUUEaG4 gazPET(iSXpcEc7Yluq_%IZ!aIČƜI2 \9ǔقG p*q&_FC܄YzgU s"Pfld NQB\!_9ıCL!\8;tAl}ƙ7.I}3 ɥsڷ3냡cSQl$jA5hF"/"W|rQ75 miS`]oSYTRз$% 9{dհ2D+o48xPx?m~S4D$Ɇg!~qR!<ʜ}]=paQXF= )񿓤5;rOg;\fE48y13^?-`׸̉osNG;ZGtHǜg'~: b++":d2Petd.:}EDqֈkfH r@/{HÝIJLHA%,g[l_l| Ga$ {3+s c,3|zg8^AG ~R4C]+EbR m&'fd>hӜϙEWt 1A*% F*~˷IX+Fx~?'>epy3aJf*e Dި>?AYMv|hyrW池bIT,CMJu ^NJ Vs )у0+ x(KdFZRB¼U$2p0j"ta4:ú5oCS]F ?k*RQF#MsFwu ].G#Ȉqr.N]:,/FR2ICJנT;Sɹ)31 hD|}6 q"=,&Nٞ5XdָѶ^";mhh#cK)88("9Iwwqߓ݆k5<;0HRTWPN kIѴ]*WhWT@d8#)27(+kl(mS8J>*N\艉'q<}vjVr,zg[Qڨ<:UNy|vҰPM8 Xl8aףhly&};CE5_l,I XVD8ة*sꏏsC&x hi.fX^$F.}ِNFQ òąAOJY V@r-rvtr4o06u?%ٯpAY' _5V&Fz)b>\ #X]JPe@6rNY)< Ւf?mBjj҃j e07#OTmIkߞ =gՆ% ?, >N$E ۖ/hG@ZBÉf)T:iU1R_G2f*C#V.ik80(0 qD훥Pm nP9Pgo'=u/Ej$7 Rχ*H(r 0ߤT\Uq!m~_ oWYAsYuKZ (quܺ.ճ Cc!<~?mglR~>&Hϴ; @kEIUHZPnL4(*w\/B 4pIbAる,tnˢ9HsfkZ`M8@b < dy"4E71{&7<,ޟBإ2⹳iF/n^,() 9Pq%L eyMtV%AwN1HV'FO3uEfeWGd*NJQRaGu߿}?/符B럟Al*8FB`0eսw @0&)1V-K첣DIШE!g}Ÿ؜(i  >Ɖq$j`DI8罵 ;DBqć2RFIB Uq)Ļ\IB>vTʚE7|lJ=<b:}XPV|Ar_,r#7 !0pp`uvdD}/BLO"zzn*a$%n$q:W*.3䝃2\upf |gA0I>1M=Z = $B>Ox煻yߍl'un %/Aǽomna!Z W\4!괁h#+z\s[5_.{iqxT=9w&bdd|ed=+9 #1ݘB s7t { e߽ 0,yD6pN'._%84<>ɕxTFw?)WN~49!7G : }+ȟ)Ń#B @4;on\CY' ӛѩA0zB@;ÿ" ϯh۷6tNEnZ:A$<$H]%N %)%v*l~" .@V.(0y8SqWC;4 r' A@>?LនJؑ2i&A("r7󼜬35& c)C&#"?^߰4B i=LH}f8ȁKAr}_{7;OP1}g!ڿYUϠO-U+bS<' if1og l!6GN5LUN`d0&VPй]/-au["˂(d_/pLq1NXaVqXN'j[@sL%U664 Lj|1v4|! e[0SE}zQ2/N Q@ +W+bz L߰J0BK#)wCyfDڿ=WU@b Ӧ&U$#LT0a (RϧdΙ;ȃP L?7 &EQb0+xO4>ۄx[&jJkl/YMkbw4$݅N@"V*&0x10FVX`a1&JR8lnedN_iHM qI}UP[ko3=B%to1D2ZG 8Xp.ru`Lzv~X3DmPIPmv,! xdcK3&W, 9G=&T[Z8Om%gWE ~7l6t4Y0<8$SfsXJG?dT{}%E=d#S#hĩ]VFb<ҹcp66 GϳmFonk/cp.U}$9ƒ1TY@R(a`@D M3!31[X##rw,ieg] c"D(ƣc k]JKp}pYٛL#Ýa0ql`NhRA~hf~_ū A,}6i`̙#2 b.JpB 4̌20 jrf4 *3P@v'Q'^HQQr-5܍h0#(ii`n|EAٝ1*! Ldx|>7)Gca%ˀHeZlMqfό x|%Ȥɉ$ T|Vc+#ؕgC71JHpro(f&50bMFtcm V&髋``_~fg 5dۚńL<) 4A .ZI0Rj1yk-j]q߹'I^('N0^*4wB$vx0qA;b*S*XܕId(1sܝ' u9r sx&T,NƔ$)-j0`KalJG) f 9o QDF_Fq)c"qc!yygeI*b"6靡c0mҀݫvGUq@kv1tF%o4AzIY4j1TBZ쓛NdQ춨Ѥ.Ɠ3uiFЊD|n74Gr80`߼T i@zs͒U% )=Y)$ͩgպ%,`A\z̉~$]JXi6[%k{d,@0[ ]p*Pׅ9!!ѕmF2֡A/z]YͶ A`4Ua^3׭jZD+0OG&'k@jF 6RTRN1bihެ'&,}I/tqÙ{I'QI{APdJC%16[ɺ1lBT 7DZ?0@q`RѠ8$H?Mأ"AH"&16:aۺeĆzvDDL2˗|w$C!0`!-~s͒Zlc | ~^ gbA@|p4=i-@uZ`:+ LV@dRר[^u |1")bl !(rY$  T˺Q{ YqBa?a⓽8N~-r+̃G)ڻ#5h$fQE"- ]35Cz=xwL҃SXkr;wcK7[ F_t}B;,r s?e9Y|g!>(,4,MP8i$ Ii,DoSc~`q6_.I4Wƿ `< @Q!E#P -oBFw$"QdLfbNI]R>ym,3gAw5ai1/"lK߬YHtЛApB>Xv=8]mAlEd >I211UH;v$;W~^uO/ŕZ8w&F`YC< Pu}syfgS#0W* D`䒇;pPKTX 9&pSE\9JN6y8@7 ƵT {~k$,"bE'??đH+ٰгQh5Dھ_$a] lg`<Ϗ{H(hץ0L/θLDx4r5Ymt_ +v% XZJ޹ב{'"G],m*<7F:0l10bpOyc1FG 8M4O8 h=ΒwwbVp\DMF<y2Y[$@8>0}; H^8ͫM߸v`t!f 3M5rfD,: 1"DDL:IXaTY8(Qp%M[$KX5kfnrsY3 Xn&qqW{bVOcݵeDnEc^qm}WTK-S@ L;A4fg|6$h6M|.F1>ۄ1U+3\im07"fLHtBeȤ:4g0h |E /1ʄp4pV 0QǒI2uӜ⁨baǂpŲN6Hj #lRhl2C:(g7igSl/#(41o =%S뱗d f? |ȃn)y^L=ʤ]v((`ֶ%>/\vHDe.byz D[`^44BE1Øpb_R(b4tJJ;C!>g6bE{՘dW3Jt#y(0 )Ǿ!< R0h,{ˆcRl?{U\)f4 #Qi+P!u5R(3)zb<-rěi|ȫN:AqPLT!*>=t\BTwE* jz}GSr^C7{If*J.XA"1'Qը{ $72~ w9+%q{slӍu븨j^n 1xGs ahǙzAi9j؝+jI !PB5M*h+& ITBm %P}Z*nK_h$dG$eRcat0SQv>Ҫ$Fjl/l] qR<ޤdv.Bʮ_ j6OAK5CYzZ F\x O-;%&5>.e#j[nd vvLz!&Uc8ƀy ]t_1;;Z/pSDB8{?:X]FSƶIpuf]FxaLJjnj&0‘",'{/(Yy3 "$wf~U߲3L3>S 0׷Փ$f-[8oU)5D)EW!ǁdGLȪM'sg7C'➩=zS!=I$9\oO[^' M 4|j \tlλIC*5iۚgz `9 2Q#c ߖ&dr^YV /CulaF"Zjy杤m$S$ '"!H57ӫר {A9;Etg/p夅|q&X_ ͓E^AM`@ :ky;vMN U,u,Sf'tVPsnKLiQ}c3PvfG@z8:o  ~2{#Hhe~`E J9,"oF.$IH1Gr‡P/Z-68BbFQ`1mgl!ۓig$f)ݒ ҋxwIbGUrqPBg+OFqJ}CPNTcJ⦶cROQi^>>ƭ7O6ђ%!Ǒ1eMrXSx3mvq '6}ܶܢB0#ud~-HyK.2=C!@՘n^Τ"vZCATl/=*A^ILxaz6u!8B'ǯG 1O .EkTȚ>CP>hٲ*3&֨9v~Vi0`a;31^q),'.l"M,)Oa\ _6̲-:6q>aR#('}o pOd6 ?:ovˢIN&vX?YRPqq?>aWWe[U>B/B1;,U.Y$ǢNv8mJ8p Lf&=nŐK0F'a>%;nHy|88cJ+w o\JsKӆr♳;h'pKlU]bXq-[PB̋cKc"HSI[!mq$+h7dbaR2%*MV 촠'CgP 476h!Ѳ+Ly3gJ:0hRgDnUE>JᚣPliqk6sw#/C2 $C2B/A8#}:j( ѠR'n>Iq`Vh(k(וZ+ɞ|4'U70ro'djt!.!+IDjyD% w9&+GoZ>nJ#"%NC( ] ^egl8tE?MӆDIUs\՝L,E0YAlV{6$t֨էbn3(RR8|M6GOl|K6YWa,,B8"Hخ )IS\Cl&9 'H{Mj2N;FJ:3AbKz%| lTbyzJHN{:@^kRlzfV fcP8(h >ƛ2,d< hISw=kL")eT04AcJ9z`!Z̷ihaH6`YYA(8W3 DWD QF6ARFǬov%`;JvBs:ӛFr qūPbcBc98bI:YҥmDl02*s,5ʅSmgWk`oD[*2G,AB:}JθŽ$$rDrC)a%dC}ZOmacv?=;ѓ x c̝Dz|K0Q$)-, h6` (ětC$>8(T.qpy*1O нҟsUq-|.>c YCiiyA'{P cRbY,?5D/,=h`s' rb%gAAGgr>5,S#K 6)3rVpTEYQ-% IcS\ 14G՚v"o V1TfU~ yXȸ)O;Mn2_y6d (FHƨf_f0}iIu _iyBC! =:m.RM KL#jpTD|EkFK gsqĤ4 4n\f\r\NgX(5H2=< D<' Qd5c'@Ko| 渚X[FQؗ)L5zevicNE$Giggݘ0vc ZyEg]`< )6j86̧$7wxU CF cI%`Lߌw}/NmsrL*|\CN鿆NtCD,gFK]cP']gt֌kq]I\Ҙ^-fYX\qI p[*͸WgXXS’D, Se b ُ l =Y.J~k! 2銻%}^ 3Pz'̊1z@Qx%=bT k+L`t)9"1`9P2 ,Ճͨ)qb}((| X2`&qœ I_! r`aEY*lg,m <ɪ z5{K6Q"I{W)x\.qY 9Z f %L }"/%F>A;\6َ̖%]k4;zJ#Q"ĦBݺjuqk{{qѴP({Ht(ѨR} JN'AK8zե٘(SѶĹQ 6•ed_BGFTuMo;X&%쉡 rs<  &5w E yMx+/N\Ȑœ0J{LgOh%0 h?80D0GO;\3R3J ga‚ `F$=Ee{7 5HϠτؼ{[U{ H<rJ(Ӑ,̇;$xEì> jPLBlcѦ_Tcdt8c(UXXb“፽zmky4_sAྔNJٽjL<דPuh[0cZ1ڼ? q4iv?.{0>2&VQ(@CV=ߠ_v1>gf狀ݓ׶m?6GWvud ]^_$VJFwa&TҢk(m' Ca&,*'~1ܽڧP)-P\hs WsF33yGq/\)vaq !inl%,os [iWqh콵]~Y-Icu,zn_  o>^:m0)h=57dzuPCWGmc K؈vu1p{,;5D3fVkEǵXy,w I,STFʇ=2phOt 㜧~6<"VBTzb˞Ϻ? 5JͅH;#mnd1&q4[? ;}]HƟ^M[깥^D"{Z+d\WvJ#ۄyeT̝.RcFJӣ; C٤ryc3m MѠAxuLZfݕvb/4OݯNƋiAcGjۏ@k՝k>8r@f _W;fcmo_&w5 0UnpO8P?G4Ф$  ö5jo"dBv-嶶ֿFDuk%nOW]ůȍdm %qkV:,բ7yMG9:aj~w-_ܼZxBP密^y]t<(,;/ץͣL`5 :=ۢg..BlSDنcF73&C&vAA>?忇栠^&O#( B^)ЃL%;4pѡowq7]UUsO@7'06Y`farȌDGvyi{ AzѥPgD`-FTӒ01WƣN4qp# j 1!c釕yQ@jeHcD#ys$T݃xiMu?'١fupbmD8CHrX&mm5i܀VU/{C4x ."6@41IF0+%'%L;cG?ϓ>siaA .zŴdFwJҴfCI(MA ZOJJM"D"RrC V ~ q )`??,D h>MT䪣,`&I&$sM(gX2: J.ec?㊡pET>p9őQNhۼR>"w2up\zsSj9r^80F8"^2NX&VJILtԡۤ5}I|LM$90P#`Ԡѭro8gtW7-FFq U|vE_=s|"? }׵,޳R?fZEeWo~7Vw XbjiQһiq67 tȬ G=(,Z&dUEUFC6-E)Ӹph+Httmȉe!+ڶCqg\>q>=W3Vg $"G--X 0yyB/m+QOf(@!5 liؿMB;c#sdyQ6,X Ȇo 4m1?ޣnE"F=UWpntқ\_!hGo?c F+e2|Hg^=„ "k{6m 1<$bR*h(b/@7gx~[/1ǜz7Ww7xRj3 46ƭzKqױ1'ˇ!v]C‹p~8 _IL'oz{ ͞8prÉo^nвp-UCKoQuE \ iz6,轡ertV4us4࿘,GTgW]t{q A,6L;'e7F{h?N'yMGYyA(.6UϨ6Jv8>I7+C ^}_}^uR 7H'3L.׮\rLmPQRE[BЦ6}L/=>n%iFToɴ>wk姧ۤô$ q硲oYkV >#וL1C 2o%^~L[1+򶚵ԬS[)3JO#4Y*2^v [á]q тi]; v@uKADG|asݽ_?.?sQ0C(b+E&o'"F Ia "ǘ Mp{=&7;ސEr8`MѰ5 лȷ$\-c wf2d k~޽ez8?וs۷2r&s}'` %-a֟{.^u]?D 67̊鱍Ea`R-11c3!ymG`@ ` cJ~ Cn>7h 8MU2(,;41/vzq7)uL\3-Ra+Ke7=-fd??<$f?~IPLhYi6rm-,hAG ?ˮMKhEwgωx>kK<^xe veq1#[v793AͶ=13`~!۰}~;;e 0x F)boNG9?8 %Kgv "nGp1 _w:PiZh )ub7Hi Uhfax4VZ08J*=k?l__f3O%\`͹P-ntfzF?D4?,p0`" ߏu2#=|FT`7񣛥_|h-I @(O|8qM?E&'E1>R!,}'-)@T#q붜-ag3/ ԡ@fkr?wo#:}a^@l)w'/,c{qv6:e){#T ]4<ˠ͈0lyAQO=y6v :,[bBl1vOL4I4^*"E|kWuI˶ku跺wZ*EbZθ]Ң%b3T8T'&`JLr̕&x;w=ϖ[' ވ?g19 F-C}εqhL(CQ) wXK]|NJoO%u1ChaQlxx?cޔ}3ԳL:?duZ53TW9?辧xof@g3=Q 2ܨ%Ѧ6Xkc\,vB(`E]\GFv0tl֓xWۍF*rPy{kkc3e)n.t{q 2I=vNۚ+Q aLJa! e:^,T7%uC f7.+gz&hb">>S=pmTMϟN-Ѭ? W~/r^or|hȑ}d6*5Z`bVrVM6WKawW*Ej%3:;մ{r\lc~dv!(9(%I_?E 5"jGb nn,q%w||3{=\f-8?5u}vT;O\G9081*[~h8_Wsl4b Z’M}ty'WL|p=M;?CTxO gI6f[\S$r^rytY]YEFqu!L:\i+a!tJ+@/L 1릠nLPJNt>fuqI.C\ eF\u)!GqY=0dRtTC0}^AEF-d߰~l"jyYyͳ³D>,eaU-+]ݺ(tqqtP.3f7 9k$<ҤE 3E@u.r+mp63k.0b-$^73 ,;>HB}+]Gixsg0\Um5{{:i+YDO0ӆʋ%CP1Yc;)(x,kJeb"Ϋy݅wpI;M0Ϫ1:c2Q9|;uh3^svUVkZoP}߬sNb^Ϧßb;b ך8_qQdgۻpWz4=1/:5>}>MaÝ]3T>2c1MkvNnmVǃ07caod959c"Wz]t3t+wy]Cٹav`ih%8*(s浈G8pP|ܑ$3.|l{=yS]$p ?ŖUzH'GXE& h@_\!(>\|aMq:2ޓ~8&iD?UWPp j'i@gVR%nwa 7оSȼ̣#o/}Q*mny9 ;<7F6W:k((OL뱹궪4JxLbF[mvΣe.σlQk07 ka"="|He :pUD9Ex{h16 `5Yżý!L)T(hbCIfNAxz** H(:zDŕ]Z(Tȋ5D&߬gNJ;cD0 aAhyO/9PL?'΄&_wϻf3J X~!kw&H^~D`nbD0q@[D'Ho,y8啅}ҌTs52FAOXDUoߣn+2ѝp$7Ó=30Aa <:0حOXwWW}@Ѽ" )NjiI 5Vj 93Eh0]'i6jopy.`7ݏ"R 3ހ$e|ȫuxV ŊȮ{z#I8M uNG-%(d.TGAZ3V89aw;g]{շ?:_=Xv,l,L09 gLM̸Jr*6fffÌpo{T4=H?=6Q.6ڇw*N0K>iw_^\*i%Qm毄-#>5kLčB(-LbqN1=GJ e>k->#:0-Z;*嬛+Ӣb ^ji_Y2˴ť#?"aald&@~1 qT/V Pbn. u[kxC*dLVi04?q( U5f$"'|TKZ1:Yj`IXcQ%:+^L[%2$3VzȴF2[)&W:~*YS=ztۢ^?*TCB;lEH ; z}rҩx\)Av8K'೟6wQGhԥo{fsILg(eRPoZ}cG^i>Jv'M>f_ĝBǸ%%ߐ;>.u)G}uځ[ɓٶ(c?yh >|YCwf]돎0<1.08λ7]:iSRa ;4AWAEL+5ɫ2cFUlf1]eF4*ZsҨmy0pk9wFs%~|Z~(E)?Qi@MwQte lv G0!rHFK Gh. cـ44+֍bhDϹ:8 gyR)z~Џӆ _gV : ɷCĜ50DeYD4[ U36g_PP1"^"7AB 6{}&ZzuS]~)9B@X( X\y64:D1epv:(emhU\qS2,Q3jA5JKЅ롗w|#{]7/A/S$g;^H,^2aq2fUOq\*{a̚o5oDg9tތ9tgYczˌLbKp[^էG(PA9?Ux@ (,%r-@wNH i<XKL__gf<#{DR M>N۩oqϥSrB4`_4C$>NN1җgz0*\!~1cM(~AtHE?Nd"`TGp>`?~'>ߙqB RD/$Rf08'GFt#шհ>X1?SɶSkӠ389dc̘Fe8BĚJik<%7u&z)w_u2eW|&}P,NB}쇡,t;L#Hc$ڽ|a>RI +Sўoc x^O|7!JU"P4@|Id0A 㗕* ǁ>0D}Mi6z"e?|8r"[iW(ƹ[@R*He?GJ1`Ff`,J-U48uyغl>'A^>ii4ՃU0jQPU"-%b}p+c'-ˋ0)t Nyᘇ|Pu]HJ:Ѓ$Ar?~_4A!&$ 0}IDmobdϊ,=@P%a/K`{("?G`?`T5TG.(Mu Cg@B, ?{9,aZQ!i__a5T:Dnv2{ Y D09DS#i~j1YY *<߬@ILX#nUU Fdy!C8ߕ42]I{F9Z9uHpm N~*Fdu鵙ep(؍ H0oA5 v ʨYg(4LLmk#%/x)"'K*32`[xI^*SO$D}n! lIGٯ |R·0 ΃%m.Gj@nL;›< ShZrLB #& Iu.0EՍk& DY݇vw-$ZJ윈t0mL%iRA0*acW*1kMC_wn4Q|o7OhZiy$bH?u1vUQm>üE =wX([;)Xtȭ1ȅR6@e;`6D тbv^KG_UAg je#d2WwIdT|'!,clpc3 k Cr0AJPڸ\7>ڟdb=$N2~|EEͯ2 0orPo|Vuz‰wmWQW|YpzƤm0`qOҽ~%2JDG׮+1\y?V~J_,LK1fg2>/ϝ"6Q'vuF_ &۝ek;e 5JDwF<ޞGx eEk(2WmbyZ"H!B(ևIrih HGI#YIHˢw2F۱?km3anGQhSpp8r2k< @q7_sCE%ٲOOQ7"zwwnsor9;'b]1΂]!⡋HV`cvG]*ngBK] _8ha뮾v-ViYV+>g\`TbkuӖpϞ7ն?U3S4ׄ!1ʎVxTTZ]:-hӍ ˿뫍\])^B<>mu,v(J/?%5YM{zh4GDmFqMa+*-Qq6;9313hbnN|]9bSQ0!&fvx-&\EIc9Yd"-;,/Geԅ2lik$@[ILB(Fndk*,Fz;ѿzx,~u[gȨ0K:cbr}X1h u]s[xgೝw49o8翧ʏO݂s(8]sҢkcڰ3Geڛ?NuGAr˃.A8ps^c_6Ks+SQ!~zΪwwGYկK;q4=bm&ݏa6uO%@^RI~~{V5&2{ ;8*䫃LJB.S-:.HQCDk$z;k#Y@g#"6h&R&ʊ._a_~sǎIF62(/K cTXq=T"cO<~Ī͏F@ _'cQT)U8 k`Gh$d0+;6K=J }=]Sٯjdɻ:SkDUfC~`(_Ƞ޸Kz LFsB&( Q;Mp{&#aR4(hq8`JJmх4ṟQL5<ܠ";bvx'KP℩(X Gq(9礬12XU\f#E>w)aL-7Y#U7uD 7jԸ86c91NrSW]W.{%.X58YܻwyNIkw|3o`Ʌ Y0cV_x"r19pY7m$!ڔa(.r*2=;<]Kj:gG9l$G[*P~5ј~B2>۴NI~9*ښrq 3JC5g|X%kh =MJKd jJ Vk8b?'drr_bD&s7Ƶ  .]V|7/֜fA#]ބ217u]RMgMx}5qÌO) Bz#!A7d!`PDkZX Zz PfBMe#DeaFI]7rI bQ@r:]:4EuLJZP1x%ILaFF%$5YP ˽;T r-w`!LAebe1I I;#ԍĄ¬DXid.3yϬaQPq@%JE?LyN%S7sM~IʀaqaoF0#Ҫc?䏰)DE =YK 2>?IPA,CJ[MD bHrO%ވ7hF%#s RZ&"d<1D83aq-A5Iм}F/?x܌tEB㦤h212#̔cydFG&:i*ě:)OqObIQlm@F~l7l1{"C%Y@/I[p6ۇ T(;CtcjbLّ欑@ ~=IcI4}|k@/dKqGseZ:/f>r( UkL#`Y>J@\Ji֣u-d4/eqk; iM$m]:7VY6QP C](a<ƭɌzuHjJUH^&یA!d{|4pðYAT"1Q 9حu9z XTĞ@E'<.ܶTYK-R⠹0md06ؘêy~K2aqLbduTFY ٴr4{>A?Zt |i-TnCq")v:'Y }VBLtFyU߫[1!z vjY(-#!v%$~ULޖ0k SSwnVG j>i)Ӫk} bVX)6c':ȟ,V_W|tȪm)1nL=MZL,pŤKJ-U6VMJ ,dpo6#ua`FW (vCrUQ^ww5jB->Os:d;SCo^d7a8ѧ X Qէ fjFD`܊q$)0לHEir:Yǻ%4B|2<%[&4QT*@A7?F^?QFWQAn_xY\naqf-k]l\"V]bb=G| s877؛_ ~ч?B(~{h4俞c1"lhu9^1=0zҶ4L$Czf4X䍶dei1L%BG3L1َH4i`Uۆ9*w*y0$8D&7h<ڼ|XkȎaG7ty[ß5s<'r11U\pfn##tk<['NMk kB҃cQĜD" kႆ&Y63 _/9T&N0wRoN1Gm*|Dm6qGbegGD}{5G,P13Ox-ƅ7z7#Gd̑Hkp]*b6µ4(7 WQ!fh$U9XT1N_u=-Yeם$Nˣ$`09e}yE EEiZPyBxhPSqvTX"rZfSO ^~$to{4H@FT~fYX Hdc??a)㪓{t1@"DFNgĥޟN{Vd)B(r4_;VV%DDDJ~Zumj5 `cŌT R Lք "$a W8bbˆO]D^v\d=@Y~LP6>/S\su|.!JIB NCkufLG?3 \c} dJM9F7562`Ŏ섘u MCѹd-膭9(c2jg($iMʾe5ѨO 1{No R-H䬉$8O!"DDSg l aqsԓ\zwٗ1h^vz\ h!#]hh Ti?9'>)|o}{I3׼1:\wVM#e+ʅPV )}3wU1ޥT&>/4Cӌ.!Ze3 Dvcep\aEo #^^ci^Cijaܱ=\^I' Fj!2'ei#O5?Ú,h KG]j|Ê`9M i[xN(s$@5 @.RFa6 c [1XBh. _՘k܃i҈#9C @'p}\]e&:!L+9<7 6mNG%u.Q9{DDt|k&Uch%BHw}m1d3B(ߒ>-}o,Qu {;y=\Xᝅ9Ӆ%Q*$7緦XR1$vGw?Ma>v-]=k^lf=iV@F45X ci[^y= n1M1)"8UY@ 1Z XHU5-TQsܐ|W!U~D@H#J'ϯϤE#̑9SXډ_ er[ne,ղ2l1xu+x\{)|ڨ#pƺdAiD[(ɧQ82CvXK_3B@#N ^3*8Cl&hg[gegrFS'ISfjߟ<*WxV%BX}lX63>.xd,,s1c¨x{縎&EZ(WA@'nEvPL?e%*3@E(3vt[aeݾQ~[/56ih@<{pLlk2(Q NJ):Lu)?+kN9'A3SILpmmuV6|ߍ+*ߤXс_|.A&2)/QQģd?q (w&,啪\88(yjȐHClrlEyFA놃 <}=W_MX+ ?1Xmٻɫ)+#i ]Yy[[ ]'5W4MC>Pͥ%{ @HM+zKI~vm}_ Ж;F{pvBzAL% }10rє_mh]_?6xLo`뭘~=~=KקF7-onnH!YY%I~}}-BɫvH|`ǗoU~~cQNq g|+A,WГr@;sQ0f0G-oXO@oΙ BFG*~pW= ]5pQflXg2t\vьiWR;aRS᪅2ҵ`@.O>aa*R$[FP~)Wb(1.!# hH~oҟ17E]:vT!fHH>1( F %7Qz֏, cHqn pU WӍPfKh=ө5@a4R!(#TUa~Awſ57LCn$ygp"݈V@1 pet7Ѽf6v<>F~&\nJbL}nk..eP tZ`-<&sܯtsǜq8@#DzYϯjY9^ڼ)Vnk}9MAVbO =\xJIp8ɘ\8w L4yp"g(pw|KM H.Ck~e-] o&RU gʇ%~ f}U֫H8),Cd vcS:su}% +yA &L&*"#EEK/H<㱓'(;֪>6Xˏ t:DCn#:g~ IJ4f'B<~uvwyb5ޭf]{g%) x]OB8Nng9w;Ē6._& }R{< p~R2aTԖcHxنB !K*$ m;Y]k8#)h=]6|X9dfTשC!aed%YNVGQsE qD̢(n, B/fv6_DLݓH^Qo)q@ޝ/E8I TmEѯ[+$ErEJ-FUdi5\!Z|=yDDnwlӱ!i׿>GZ@"h,M'/&)edq]w>󬹠7sFdWy`'k!#4!pV78-N6cUZ_+&s\V1fG a2aJ˿4FYkѥ~*bp;ΊW[!`{;4A4u7Qg\RBZc4I/Ip@3*uOǟ0sp+SqCPOAJF ? 0kU$ E5,D^W<[п#$.u~ld1v6A̦C:ct3aUeYi]l)l]Ksm4K} ~sB F$0$HgSh'oqMJ5OXH sgR$ ТX\u9[:|a {lIJB;PaEy,P~z9p#Tpz:$*լNzD^/RZ#C^2EIf_/x߶]=K u,۬[[u^+UޯHn&JQ^=9J;9]H3y +T+XxocN0ao #/2g3q%] "y]j6Nc:3wn`81q5?JuJhgXk8۟~EvD䍦ރ/H3q5uUFcV79뗉ȗPWW - #3 + x|6 |,-HNͬ(rY/nE|]]tꜥ,a|Q..dMßw;vnnw1r_8͞.,;?*O=P0.["A1}m yuFn3d7nrme̤l9KmqDd jCKfBk۝L(3؃W`g+9k0s}xB^W]w'“jͭީ=}|m7YKDhj|s-f {kbxr8蓹s7o798vt98O<]BptMyYMk"H\*w1~38VJ#g:sk>y^` z㻸h:32f alu>{%;no>L:h[ZKIM^==:bNu~;z.)'g(% xwhT.FծQ+?TbVbKc "iEn }xɘat5"= D~H,wQI@*Ci)2hJ{?D)g4ooTQw<KNp8n9TVc>fy,4w=a'dv: ͮE#4Bz ;~yz~Ko2i+"W0݅8ڿqS!q[/J˽?d0 ɿ>t%znKT`Bm 3 0edҦk(dV"E҇cJ7H&8<9b@v?)<&GCq_ CiԁT;DlAд[7tGAe{ >ZQ8Q:e&`( "` [|9;H4%JBjWҞS^OZ ϨJ8H )@s'PFD (y@2y=HbNzùb3j |xK?7<]}) lӮE誅PSz٪ϲس 1gZ?n1K,PM?Ir[q :g'_נaNcԹldt @Aؐ>1\9#D-q01Dx9ZeXA}!YM@Vy`b=);=* $Dh%6c:CMu3p"a m}8  %RFxNc0~_ ="AdC3F2WT"H!;[f^?|Y2~#2,9QQX[7ЊN@2?෌$w;p.28x0Zce$H@~>oWbl`HTkg0ƪ*\7Oy)`[;8K!G,̦Tʿ^m0}oa:H@G17mm IĐPp$[RB`׳ETbL~BBFL#2VE22pGzuCKRYQ˩%P00Dаl?:tXh9& 45z{bO-I,S60li&dd"r:쯆~A#9^ 0TҴ􈈀VT(fbq0oEk4ΨJ9@J}t.|c'iH9DwE6>& DDUMJd4Ĵ J!RNR@9$VMpg]|@vmw_~+ vdD9w@[gҸuŀuđOyq+^7_Cx=jY ٖGBquÉyjOx1 A!u# $_ ^jz A&s Pbyk<{bAx"MᢾAg}fcИЅb32˩$"y,0l 1d@ՅTPЃZL5FSJ#3("L"2._ףP5ONHP6od`MׅM*'D!^%HrH5&rx>{@jk"p*Cw!p>{` t]0cя`!2Iq1B-"Dܔѳo{4e^ +H.R$ x 5`ba 3oR|>ك֤ f]);f} ]䴭 օlG,WCTCyI]jO@&Ep-קQI~DJM'ig+-schhJjRN *C$w扖w:J>{-ğdB; 4`eĴ2QMh6`B!oVE;X}>Ih)ԟ'|1F?B4y 6*~IS8 Z T(PEJVAfh(XWh!;,LWa܁zd0#Q( C("m!cJihiiv%4Θ$5M`54!BPPR'qX(44=%ZT3BↃZK\!y!#Y5wv#(m7+s(䩈;^F>%?xPD VZ.zUU691>Ov!qZ0l( Ȏ₴L5ǀȏ`.tepQ')S&0 >0dKҋUF'a [DBR@B$ю_|TzgUYjtu@mv"GRc]%i~=ffS^4%oc^d @IXB`mX[  pB3HiEfgIu i5\XS0L;ౣ0[n}#6wF~L MKM` jcټ"j|@eۤ" hP+0?PH0YEo7|DJ|* M0kC$ \m7* Pp@duUHIU]n Po<3 33TS`ĻK#IjQPm 6h>πD41;6TyOCH3O*A9/Č t;y|xKL;z &.PvmM A $"0EaI&y@,|- C"x7CqGH2kJL )VB/%{4d:fƘyr3 Ґ&a,Bw; ĭ 9zJ>Fx'+tQ @!mz<AebE!##AzPLA] o0a jA 9aYY\QSD E݈(D1Sɗ8N$0CF"S#@ jI#IgeMed/ÂZi3(\C;:V &3ahU2 _T#3&.,ˉ ($l7d@a'ZSy"1<Ѕ"}Zfh]n㒻$|(nN/ @%s AMaAKΰuQG30p,vB :H`#oH0iXؖ]~² *TCG8."};We6y3 B.YpA{3eT$i ~ltβӂ -d pB 2,`_S;j_GOʡ&./65y3$?#x' CTSAE{drS]+|Ph9Ix9izOdG׈+DVоT{O wy?(5zw !DP&8;͉+8Gd{NP>YT GމY(P:' ݀*x0@jyCbyiDdac@H>~%}q@3+BfC C 'r h47B[$R1shi^rJ\H—| 4wG~#G/J~s H5 ?2Aʐ`4`zwaJ@dI+w0.9 }wcD1{9&GY۠"lDpKD~d<ۮeiDd(Jb !g\ ~zδ """ꦃ턍 n<Gc@{R sleJmErdYj$sG,ΫzR&ar?aH ;d@!_EpuoWc{z h4e%7,+CwwqFJ(G% -V:ҳrVXR\<%< =nAgxLqЂiȅ[.@9'="tAH[6GL~nޤPs<7qIk&D0'CDjz0se؁Q`nĈZFG(yG7`B";<Q# D||C"L4u!>)C-)&RX i}&@D%(iUB̂ȌOqvh$X&(*hYmبhR&xډ٨EEQTCЗTڅ-,H vQɺ*-Ry$&w@d{^P8@8ʬz$5Rmͣ, tf|齵 gW%J P $%fbX( P(bZu/aܸP:f}8)H%@D|D]LB>94P}[iTYx8sv}pk0: Qz t#ꇬ¯4l&$VHaPUnz},<]";)CC-3<)U5"ګ܁ezó(391=C,!a0p(0 ?:G >G!#'Zw`%H dȞB i}8Nd ]bILZՐ}Lz !P% QT (I" T'KO&?٣9+KRq_glDϵNak 'c F/M /; #ǧver$H Bb" t,s4T#w=֨z#(> êx݇^ԭyG %05`m8 4H l"8E?oʣ=힋(ǎ6 TƠG̣@juT/pu'e|Oq@4]j johsKC UIDChu }u<0wyve31bFNۑPҀhԖ#/{BȞNa b /}D%-*s2=_f2^T HȚEh_1t 8zv Z"d@7/0I`H#!B!mJ8:$Ha)@FjѹΏOt( GL\ )oRZWr(U5ǵKySx( Q>WҫԌg򒇇$aP$pm]]D$,&GwsN"ʰxPR ųlއ"w}@)82hD| P̈N׶Or1=o f! JgYAf@(9%n'^ Jw"61NED< 0BRo!`X`PpP4'C+p3MJn(4CG#<אa p[;#FA-??pAz'iq9X+X&D4y񷀰 G0ǽv7Rq\u%'ΆwoO!FjNb-]APM i4Q^F^SEhS"Ѫ a-¸S&)d&4YH (@c?8x&S$#8@WăR/8wVNz`WVK24LLLhFѽKs & "' LOR->Ez =*i1E'/sHHOٞ˯7)8VPF UAzzbSJ(b2Qa\'$ p }8CNHbNh-*`6CI!cBMP*!" i!0b"y:@]:pb!Z&5CFʚYtzCNA*lX2` x zFGH Rd'8DA/*$Da"Ebx'E؇VPR{ɩNH(51#UB 䉐c> a4 AriH2f$Aͫj\b(ХBҩH@ #HP8r r"FzJG I+i(רGmT"4T`U MH>`#(D `ռ3LvЌ'C$Xʡ Di)x7xGáIk0sK~Hɯq ԏƪ _)3yS]9Fe GzЎ{HFhG>n;b!Rt@~+xIb@h oR +m?k/e4S:D Nw+99%f"Q7ʮv=B IwaRkFUWB/W5w / 3Sb"={C@1wjo}"EH=d_g}+<T{;7Iw߱8A9ʘH`M)&ar!{p Hn[Ac%W`tnZ$Z!@T};T[T$ e(bVXQyiSE%5_Yj! ( o9ų*v,|5D h@ii!Ծ)*3/}q>}hNo Y}J 0$Cx_(Myd  u[llj%s=s瑱 <.gMbj|tоb(*x~pPZb!! V+//˻v@TDZr*I K C BJg0"$G(4Q"R@a*F P 43N+H6*dY~(+clM:T~1p;Ƶv {5E0E; ɫ,jGDL#--zlV`>F{B t3~xHtʃ7vj@"P'vP2`39 pkBhI@``QX)JDT9`l҇aOy@UǪ3&}f@N3W:Pb i`5%ևO3eGl8Kxܤ E4XȋtJHn;)Q7_S #$2b6 }_]W>B\9:?N%i55H !ĺ&Bhz5iO2"# zIc*_߽w5*( ߲ţy312D3տI>h0 8 Q;b1 ,rQp9NW(Ӭg,ΈJA$E5Ay=Tӯ;:pg80#2Z%,J= KF"6Z#&Qe$W R`LHJ'Jmݩ(r!b)B]:RPҌb  :2nIrKV BR6:҆i̫ :1+hoy|Cd8-1(+oQ1"MXiTA /G '-Qڤtkܚq52ko}#L$^jZ^ 4] t_80T-[^Fd}#4"ă &ȧX ,ݙ}p&F@8wI8"DBezWxS7 <$񰈄<#pvlnHnQ10F(,Qxgzr@̹AF SɁp0&ղVЙ/RK0$xi.Xb/b6*vs3L^0W 9*TA$h@ӳDJ+qMuJ醽%db/..27 bJBrߣ@ #k}R;}04Q4{|z $v^7=&h .0}{_^c7 f\ZRR)rhD afB4} 0 fy)[iy.a᬴FhTu/p5 "?SIi9( ha_YJh yHhWS)HNr$JPPJ'AҎ~,= ㍛K|0TzXc>o >h{}#h9f4IP?$Z/lE!Hč HX΁1#CR@8 qu?H|$+Aa<~7܋{ztBIJ PP JGֳ'oFt @?BHl:7',t߸=;+ \ #;!Cs0s3hW[+}&D>>nΦ揔R8&`$ )V0 ,^⃆ D;$S 02n8N(NbGTXFHR(j $bQ7UoIWZ@2N!xH Cc2"AHANy9:(!vMnJHc$HϛjSpІ9PR8h%! l"ϮUx+) Q))W`s%d@;3Pȷ)  'P1ICaY"&U#hS1 84 (CI"X=A1>Ħ63=3 :\62U'@T'8J <&rx$rf Ef8y[@ VF6C {LN%Dk#b8&ݐ3QN\)=v  ;~l;SGbV7oᄺx*R @8 }KڝX0,Df`[RNL⋢0.a+Ttz7tܨdPR2 OLSwQ˳jCTwј,Q*[9'?Ϟ="h 0øX SLU(hD06ǯMZޫ쫲n, D9ḡoak C0_ Z~DEPW6{C2y ZH `Կ_MQc ogQ06W<"E)ZE6T0r(}sv"LdVE, 󖃢6Op Љ̖V`%:I179"!*OCyzAbN!g|RA~B>y:' /Iph/'u0H_#nJ@B.d5dE>GkKw#-Xl4HS[$PC] gbvr7 ]I$qE/r<焀Ȅqlts=cOӤH` R*oOt*R`Sd%,XEB;Qv <8a4a*!`b1F٤cKP[m(1Ry6@͢płƋnbi*IAb &+E+-epj3`o a>O=4n r@ks%˭q9<գk7g> W&,rXȲUi[#oLF>gQT l^XEfque^ ? w?ZK7MxJܹgm]?[Ӗ\PcQRZ<҃=R pg`N@W87w!'Fltx@*1Dx[2r&˿0{?hB7VBM1|Y~WXVC}L{[yPǣRv"]m2dû^2Gy==$0UcߪUpR:j]À3/`Nb]9A0(w6e,EVb|8r`sct!>3 3v؏=:QwmT#e ]I";eGBzVà*oC0 (47+I1صJ z€yg&v0@ʾVIcV.]KIRUeͿ=EE(l@Tf cߗ%p #+@HuHZz@ڸ lϴ8T'w;zR G %Fk) 3R;3#r E+}/q^3lb d34XIla8U\ &G }a'S X6ph dnmQjg7j\g0p6 a~B$8H7$+qڹFa18B9 UJ/A{S;\ pUh+{K-b񞬁L//a.ժҔSUcSc(>#\OA&L03C#Z SxyG@;(8 8D弴B]ȥHTO)j&`l{;i]C+nbL!rU[/_IInKI<=b`D r S/uaYe\Q*'$aN ;ĝ;<^.pc LS3LB'2l#ꧨ.ij)VzGu ىe&mP=wE2 g >}""0I!L@V|+~{hAćcGғCQi0<H^3&xd[li@1na)"2"Sa+2JMV@[Pi +qk#eˎ\p A3 ( Dž&6`1hh!UlvQQI8UezFo 0&p,dΏV_X[M !a,d YD$Q*) C5`Fa: Ng$! råwJ(uT􄺄_WE9q0"4tJ8ҧ!G2豗3t:ӥ:L|*$* &^Axv1a J44,,?-Ĥ({ |񀦗/6 Ԟ9bK2영f)'AL|[W̽  1`@ؔu>λCqć@% 0Q- z>!4@0#'1f/ ;Hȃd?^% RVTР}L;N}" Chi F] ;BhhWI샪),1bgRPL ,nH*T}?Hclc?p1$5v`0MzC_<3y6z+!Z(4dScmiL m#Uo98e3?e1FL,!i bèu><'TҔ УIlsځ'htЍJ@l-8%  `8(XCI یPv6DҦi(әPAYf{.Ҋt @HB5`bm#1U z3:(/OY2|a1&9%1<%Rr@?dĈ3$)J@!; 5)q"Cvd/ *i(i ̊NaxpXFY EH#D*%},| ±pbbiiX C%("8mt 1ݢg2]646`diP|b gc8k: dVڋzC&ud.zJ- w&ܐ / ߙ*6M^hj4ȻsI* * ~uA1ӛް#[Ȣ54Pȩ 6Hͽ,%?Bc3:%5#@T@'桴#L1(v`=Te?XS!#|j,E4t"!_h]Tb9 #j_ ma32w/5ģ p ~6:#"y1P>t>a=_SK ;1dB _BrHb!CNp~qZg5\L]c| <Ң'"-TRCHvfǒQBtQt#!GAF?Tυ(q :'|؇kbCmRvS5A_&qyD&AWcDpqMf:B L,q߁{H< x *Ogg~Nx%OVWZm[Do(`i`(FSL y?ʯ*$wW.?DX&A4R%~ܦ{ *[P)Rii?HIJD)>L^8b$Dd4P1i>C^IP4y?C| B1n!eB466S^͓@ kFP{gK>, |2&F1 tx9̺\LS{TmQ"BD VHOa#?BywuM@[P>P.&41 @V҅ sΌjE7f7C-@JSCw hAL$ '@4>@9>4iS zHx22E()+QOrd$G܉iD@OAʮ2>9b[A2ƵWШ+NLsf!}wBR=\м%y& HdK~bPӁ='SE=1k,S$>PC}rSMpGT^ AX|p1%ZDTmMsaMtpF dQN!w~O) L 42HiR7:'S+BM' (@\Ћ4nJDx/O Cem!a`J^gA]Q9\QL̐0^4 %N&^$W;TiZ;# (^o<`(E(RE+͏ LlxZPob{=.c㑳)a0e$gH9 s,3iupnSt5R_T֋"xmϺ-xkGӊd;Q+${'m`Ԅ+`#( VB;]a |M fJH|EmۍP&IUE1'!hBƂW !()'&%"`bBI&!H"T!٢eSB?L&d8JS݀`>I )"̈rJct &չr<ZE}~` g$A1D`QG_O iA{N6l+0 =r5;\uy.8+_P(wD:j<~ߵ7f E>H&JBM@6yl/#B@@ Zތ<⚔I0.8s!䡍3 $t@hWkT2@Bv^͊F=18e*yw= LTZ{K"]tId+Dž*}i hp:I i#TA)oO8_FewPRKBxz4E >|/$5-BȆ~?&_0ҶzZu)8#ISP'LRI"TJ7< V=Ё΢dSDĸ<;I]'!y 7dȑ"9R%/ %PLH%}0U8X xDy▆4%H1 "h fxǍ'8\d!h@bYPhFJ)a6ð=BR)V$%4 eHo1 f(~LMeO rpx/"%̥p2pb 8@`PšOFj`1 9&zRSp(#}5C&1pn,KWIs8 >d>o$z' R''p#%CxM!Æ4׾^$HA.ԐKN v۩._Q %Xgt Z`㪬3`9V;HAZ b;$H $kLFG@Ty"QvyhJ$Ogہ'R@Ѓw`iJ (J)PBAt@X{{Q}3戏b l->jdoc"4 H|CnAh_g.! MKRC( <r`X 3aTˎT%=C's0;!D!rL~W?uhSgvvdG)*yizf56ߠmE`xRSaF@?kj !a"g9Y#jSOxZUБW.N?K5P@m& D#!hb9%'OT>d5& M?'|YA1o"NH\-!@PhSUy+ % 6 RGJv(x_-Zҏ}ުTvxO^m RO~i8DIR'7Hw@썉 g"-Ԩ^2bQ9?GaA+EHydG fr3?+'CAlQ<ýڃZ LԿ?/;Gn;yqNS4MzC`tLDM $ }f ɢ"OPe>>'DNQ8JI KB$JD0%-M!0DHҒ…1 R4JJ EC RĔMU"2P4+ $`0%9FFAX9a ^ xP~zhhAxb(J2`8G+||ʓ`VH2;a`A`CƂ "Mv)\.\) pdqYȮZuTh oE~i>Jp,4H+%ܪ@NqGE7mN-&6n.Bc_Ub}J%qG+EsAQ<[aA~x ?H 4д!H RdA&zAU}BI^2)屁J%"J Gdhm?m.W$2Zěܤ\?X[ &M;QHepklkw~K,\ hLtıbn@<H/&|Ǟ<,k4NᙌJT=iBd X&:}L5k& >@H),bz>I$Lm?y"/.CD~~h0B)'WT(G Au°an@1m$ pZu!~>XUJNhQUO)"b% Xo:8Ö AW0"Yvmݣ3`#F ȡcnϠ81>6HH %1)  P Plv)#D')APr:70U\H t Z@MP1tXu $ىbWx(ߟ9k["lb: hh\qX@xrJhj )jb(R:$tA8!nZN RQTȎ0wY M@};=Ǜ.r9A}0X5@v- bHez|gQ^a?X \:z,SX.F2jCy<2Cߣ"#P|ȃqHb:\_)xר98.9 e&WQ wiM8vGw"q1'#d9 w Ɯe첐dRJ'#n@}7HdO9Fڵpphx)@ Rp)W"!"w'i0tQ8b,Gz}jZeT] #uMk!: {22@L&5B*@Hv /7a] 䛬ޜ~L O ; z`=;|baR~lxE JAE*R({ ĪtG$زShy^y$PMx@v@"&=' b CvxTvCus&KLC}a!.=r;6ænqΜ[RE̤(hPxM:s$3C vIIK jg(bDn[Aha:Jy=edWL81]jINjyMQóli`r h)3Ls v^p$bKXJdO))9 A^fjH.eR#0*.pZb0.Vw*&8;cN %X=b:؎r8P N HTaN=fZF*^2I•"b5 I+TeEqpsS1,`#%PW yWVW q hL.;߉?1dWP"@w$0ݦiDr #}IJWCOFO#m_N ,ϧ#I;-)ҊS0`iڪI툀Hݞ;̱T@Au0>jԬP)u{Ak"!BAA1&,d@Ins &XH0hGr XQhtQpeH8@@M͈ r1G .xBlFC) Ȝ6 @(~_{ BHJHX"BYsH== =O]U&x]:vOyhpzVÑg{GkjBRA}GgXV|(DDEv{FBN2b=f$`N;ۈpZH"*U @!fC $pP)th|q^Jy@LF bbB*E<0`9V' y1zQl9*Lj 49}mqSmIB_ᛁāx{|aI! A5A׌G4 L!Jj4Jj %* |?^Ȇ 0z%!O9 )BDCJʁ StZ>)$ ]f|Z?3+lD VSaHaҚD"H0; 0 *L)8bdXZU}tj2y736 bNo(> L$UhAFhAQ")*D_|uAM;oJ.LЏ[%^ʏpOF!8gHl1G t*/q5r/$ ',N07 gTNwAFg5۴CIY,N+F1!p7=˜0„ 0/?&BoNG'g3&lbhVԔYgڦ8! h pdŪ6:m mi?3Vh0Vڤ1I"C]~<<;8cfJS'Vh$(at7 2 *JBЦ?@^ !t >@|76y?2Y5{IFnXupsp![+\`A}wtw&Xil𝬃a;~]]eپ4Vפqrk<ړH+cn 1ci!;z91v4w(3oќ| e%  !t0XYe[ 2xf`SGb@4Y$ "!Iw9U2#c@7%j(fQ2@ "=F[9Lm]H(˦,lhmF_8Ffɲ.xє5CeC[ҜRcQ `k&B"͚LKoz|uOF9f3bc25͝d]G6g< ҥ}0ps5 %1[[e/^92'!w;q٘ o x:b-m2ׁCY Acc;Bw52;.LRu#k6Ch< * mU! y[38Ey}R1D !R[3U)@{4mt't$=nG,9G 7:>}Ɨ-vi,*|&8uCCL.v@مwhm-,J&tsm6 VAhMաb`/;= ! BD"P 9 H~*-ՆAQ0D(b)")*h`jJCu5F, b 0 "TN~׊yy%d(PZL0 rks `;FU+: eqmӌ*ovg$o2bP1[]QdFA#Fɴogh[re#0zq\0U-(3KekKfcGE(2xcLLK"W[De*T `,\N.td!6A.+)wԥT2\ F`eIt Eh<4v}v6WHEݫXfMɳFwɡHBn=Uf}yCFL00J~ 9Nh+/sA|Z\\$.AjC!V b [$o|8[:)i#9LD(ᮬNX=r45u[ SQ! N>#5(h lLsR=Yh}`Cˤfra 25#+CסeL\%ڢCaaaVJS ;e:}:irF1ti)b@.J82bV1{]Y̆v`(VFZ Fưb F mx@Dmry<2tdM10 5 >ܖzlL{`[0CHj\e"q'#*$[oPklnlKk!DZI!@|; hEl1xk Ht=I,T DTEu6ޗ4tbE5hl =*x$#yqtM2Ywe!b!wc$Q9٫fwZfbBg.]<`^"DV"G0maD;D=`e8}tB\*⊌X'YK 1B$(c+WhB!B 1Ē`}<Lqtd)_8H[ƦDYi|3-ԗmő +ܑ](QLI4a瀩b&x2hc`6Nּp8e&3G]Ylq}:"4'YSPqCw]ĄlH 78d A,"H0  M&fDqp2Iaqvk,1cCeYSyp4 ґmah Hÿo;kĨh5B* ;f|wTpBr.<@fFdXbƁBt{c<l`腠4Rf^+`W$2,E#`ϧs&Og#"{"*V_ΑuUK2$xH&Iy%ţT<ߜ z@4q#tөTQNLai"X  ,>KFӢ,ך mdE/Le@wHW/A. ia qb9ydw1" TzŊG#%WpeSV.-7 GEc 7!KMmb}7ndBM8!<"P4IrPU 1 QqrJmeyaD#hO٥B=lHH/XC`%%EpZ)3}m.p@jUcf/5foZh5Ўp `Fh`@IۮUdy[Y5Tc%̀e5,m a.%wwԧ[<ܮ9LS>Hc! DY䲪Ƙ4=4; @7D/JDiNw4xPzs"A8%܀sP8-iFxrBMIHJMCPQŘHƉ{Ę2^Hۆ3䁓]F0mcLh$[d - t0cMBBEm*,̦ s&J唖N+ϕGNؕ~)JH2 /.4c:3lJIJXb;4f^dג-;^`#PdH S"./<4i8.D@Зac*9/Cf>KjqR ?9‚ޢ0t՝a=6EUVk8hɍTi2V'8 inp3WtE]k|=VnpFyO6w.Ŏ1!߱,slZpĤCo!+*x;\Kpwm(vjQZU5$b6KcLH˪ߞz5Xg4Z\OgVMVqF̺kWG5{#p RP"5.Cb)G=Ngh 2c]9n`[a:gwe5L|.pBQL2aǃey|;c5xݬ(4^bxlaÈG.Y]0SEm6|rh[@cdqkNN֫}[c1<',EF,y`` тU֍b C6f-;23Z`ڢQ-\ҳ7QM0 ý2I]Ѹ\0j˪SSӅD#N5nPdhŪPm;H{)ie5BZّA FgP),PJ,dɥgE{8Z\ .#mq]fW ]1fʩkFU 9B'#6s 3 amC$rRZQ۷TjͲ+hFrpTYc  K0\olI2At6 {L(;ceZѠ,WU)$Ήt`U @R9F,2IQM<^O|.aTɢd9],E8f`94$6*bˀ c -3$ɱ4FP3;CiZ"0L!.rI`d8m 4o6%۫ئ4,0FS9ahu9&Y.FctQ`ȫ[IȻj0c,##PH_h+!!YuyÏRcVA`%VkDKW隿zyjr;s[`͐K0'#;!;m wL%cNnH'OgaQ#p|h rY'$Lq(edA$u*սcrHPmt}d;Fb}݋Gd); Pr o|4AI}+z[Jc0"?T,ߊGC;p 9XNʆoy\,83`ِ[KӍ;gE&f*naSrZ4v,ɥ#Q}p2ymm8ra?)C3` A%e͊0 (t~zj_^R1IسۈA>zf&x>Lta`*Jz{kϝe梃!쎣c)"(``4?\9w2Q\Á@%+ѭ3)[pq2[ 4SM(V;sٮ[Ք^*E82G(ɓ-6`.6H3 y?>/A~`7מW30V:CN "s$tu8C4I;N\ Ok<п08>zUiѵ Y2Հ PMz @i!>i(>i&eѭh$HHB鄈 @H(B) S=ɷ ?]ФΥ"yvcOd)J}9|4sL<=T9lR2oyڝ}qyfa 裌/p }h qxFz nH ? R2]>(+wCր}>O oPH_窚?!^1  hc Dg?;O *=;b[@b !0 a6p: |xi7C HEӘ[U. :wt㇯xL0 QLC"qbz+ 5:,u$m i{ ˫ _FݨQNoG=##`ˍbI1F1XrDj7.^x8U'S TärW[FDb> Dt_u!k&f~@"`2КA b1?$8^"&a,Z&wSw!m7x (c'E_uL  D% P!@btSBP%AIHR48HĀPRҘ4ym܂ G&= b0Z\UBmUTUATQG`2!rHD]1$b~}cx'īzy6D(Ngz&4T,aކ}mG)&Wx^F $[M{nCaFH?8,F|YafVːgPZSD&maW\:%^*̒tE.GFOlhGffEaugcJʣ|9U fcCjP,JҶ<ՁDӆxǯǒģH("JA{o1[5z53;x~b: @@5#͋'`4N޲bihK A#VTq35V٥뜊ۧN{T68w2^!&3 u2us  Cem:K - (Lq}[{ AU]j ~#&m/U;tFC;E4bIˢ`0sCgJZu>$QD]:3-8mkqHq=G{Β< ؋YwPhgt2 :Ȫ+ a=w%A=In.~r!]r"&(g0r6>I?~P &M&XP_OD&")5}o˕ !srHDy:a>32̀65Ʉ\[\ 1 #ZXvR/ 9A)ŽRmPpI%]Mt! fì~P{,zlx|=\100G)c+x3, xub <%l&xY9HJ'Am @~, ]rwZ&~`ZR& KITL ʽ1v=a_;ϩހ@Hm}GAIj|z?=ay&-@M(p@/BR>DD{*DzJ:DR=}aK0a["6ߗiY6C1A( pD8}Ȃ"=1"z\] eyUH:do8){.A;L4C' ?BQPaR}1ȋ< |as'C"D[*hbF;4Ai%)h+ qT,W(D)hZD(w:q4nCs#cl%?7T=>= ~ybt#6 n2 ;rY ŒmcX5O@b8Twvnc  cRi@bVz'|ria+6:?h 0́vЌJ>G\4Ÿ8r8 9ӥILMcSs,WY "Al"{:ǹ  4 $v1jQQRD܅*@8,D!iHMdѼ!^nw XD$ F]?e/*>rU4>9l$ grf߻Kd !m|h><|\uߓN;*af@LN5%&H/.;; ;~@aN<6_=@N DE裥T= P B Bnluӈ#TGHjm QR>W t `=% b;QM115+zb ) f *|X;% 0i ]I812N±1v (`dQH2e1.AB\ym2P@]`2LkGyV`2Фl- !lPxL,R @᳒2i{pSDDhS'y쟼#r OGq8]x$멚{납N\:; ߒ`1M)$0 DE@H@=GEQ*A KHD!D󐐧nP©? w-% ~S\>mLRʟ l <]Hi(PTC@-A2HRR RA KD,$D%4T OLMBSSS C8QRʮ4m['߆JH)OZEi# i#1+^}>m*Y'0Y][qEڮs1)| ud$*b5?oY(x]<h=t0T`hE%Gّf\Dcg74q80 (dQׇ71|*PzҔ7|j[ЧY$NA_ȢO'&8E`0M%o : BcwT= Hh03i^Tq D$9ʄ0<öO7D+dcj~j93y8?N>H)!SLy -ldЍڶ3Ybfȹ3R*颤T8i:Ry/~>t$I>a(( BISN1, Cz_Spl b@ϭXotHk=HG"%!0dž{bHFC6% ,m6/H$ =x?PvF է#L|x׎oPQ :! be ""(U)@""I$\6P|wKΡT@O?U|?=$'sE<|QL'aH܇;CDS1}(L<}%JQ?]1,Oj<~CcR!{q (wv}a yHW}ߤ ?M͐5F b$`Z_?#<!4&ʏ,^30IB2zy?LFSEl-d=SYI1Sz  >aH"laI:hdl(8&$W)'N yxHrQ 63(ClgFS `ʺ}$zAt,XƂ[Tpf0=K4EMeAK GbĚt@]D„HeiāZ) )mdVsąH9H1_9^H=$ *11OE˲7_5 F@v~ D˝+j$Nx2BAw#偉A0R!(=bnS s:Q$F/UO`@vh JD(&RbU֛juXvxk鋤UVTk-`A4*mŒ»xeemPEVQz!:-aчA?{)Olwoq'Uoݳ#A(6I r0EG92H!#,}{v;åtEk(BH"vw&_k:v/y+CH-2)~R9!pLL |@O1ѨZcI*9~=*6p$wT%\D=.K肓!,H#t^ETvzH6{7?>{iI Ue"C꠩ =̬TO#>,'mC2GʦOPX-ߔF]0.K7 *7O=?e2^^CCke"G_<`]yngQ:= ITTT$uYԛFjbz/4/=A0vjqM\@=]ϑY 9XOI ?N A<"/Z۩tGvW*t|xa+(+-c"sK0r RuVefGn@ishBvy(̯`(*Ѕ(RdP%60%8!+e(<.F8~ҾNƃ9@4,DXn*{h㥬Љ*+"hNddd?S5 OYJdA LC$S60v"EGXuAsb<((Q:`2&*Z"n," {3a"9@xC 2Hth gЏJ@@$Wd73}[3㒡:[qCA  x̢c.d$]:Dqt)C1)T?_jKvP>&tɬPTD:@i1 H<b8Uz>@m:SB|YsD?l+9'UP-4@4N-@ i@ƉCztvْ!vUqH NS |@'ĆT%!͐|tr>Ose!#> O >ytvrR~X8 6nRP(`9SWDAy]{.fOR DNt.TA  2Fh@41&gF4T6#D'B$,X.2SM:\s`6I) hxXZ1EA!( M, 02HI"y%$f5L HSIaÓx<ӟL¸AW,$ŗ! IJu.HhH!J  mI44/ * ͏ |ab/` @"$Cݣ8;"DdA"C%&<$䃩R3ywi+kCcS^#|qU!EHYk3PFB/pJjy5nP[T`A>tҙ4yq˨NT*Q ;HoEށw'A{'B)P%ZQ DUC|9Ӽ] yIK᥄r@o-$tDu`g^nK#>ID D"~0Y['!5!G??sb?UbZyN1 xw=u?{yr0n/3\ $h=oz9@`s8PLkpL&4-cbΘIVtL[ͲdihS5W -d U H@P}' Q PI QJЬԘ@dgԪܣ>e1T#b?,D 0HuNRiHiG;}lgnAOH>_B>B! aH$$S1qQ]p|FcX40Us tN8'OE?!!!Gr&Ѧo>Nϓ1( -FR:4ܖX0!twA [fL䠈0!p/fBHɅE8 qN8Dr#)αJE'’%cO8pzI: KDr!t, B3- D$@$Hcb@<B64@!7-$M1P'ݗQGpQ"fZA R\,a"I ،h&s9Ҙ6M gŤ0׉zC|$ k{9,Cƣ!1RcPќcj.G``9wx3K cӪjxtaĄп B-pBI\DIBH[vFâ[A+<!עI J-`6 1L@Bhw9aTE/˫ϳL|7WRc8hP0 UϔR:Iӈ +B>X8$}?qA35ty`~B( Td!1,H#D?($H?bH}G!,R(_!.O<:CM A$CJ+Dh U)A VRFhDd!)b BRZQ a([t( ),(0ȬC2TB(G) L"4P ЉJ@Q RP A*BЅ-!M)MD)L%T"P54bQN8Э-Б$AGB4P ЃJRIDB-D4 S J,!AabbRd U)"b@"Y) HRJJVU $hZRbB!}p0fT_r4 @RB Ҋpg9d/ZMC;"F cADrb3)3d63  &2BPԷTOM.,2n K(J>~d  #LNG5GXHrDJNf!$N^g)T'XDS QHF=Š$r#~uUMO:&9"CUMνK]%m i1gHK804hQO1"R0@0JB1$D(A@H0ECKP$ $)4K@ʢ-!H-3HPP̳$@SQ)@TT2 AHR0DTT%@APMJDTA=df"$H!F( " RJ)_亪w*y0DQA(#l!mv!0pm<(\fa~< Z:IHhM'/Еw{$n _}߄t<)1POBhh!롸dRre>5^"ENDd@Ϭ%EF;@hQ+6:RT 3aFr%J4tIsp14J9|hU U|Gc*w?`o+eK8 g^/,9ff("&aM{LeGOD~<5| 'ht?!K=. 峗Ɔōa-d8Aš]0Rk2AYh$z911+1  NYCI@UPhz'6gz}N[)@@sD, E3i LXA@&A`o-ѵTo b`3*I:ai>++L$C  D%y1}:4>& \24LIV؆7Y D)0cۋv"U4 EF Ѝ4X:0ɄXd0fi0̆c{ .(`Ʋo98 R" ` 'euBav2B#H E)$)B0w.j5P){iHB!)3vCQncFr1 &?())B!&)%"* hRIJ$ Ie!`RJ J "("iVJ "$*!J Rd BaXT@YF HbfXi$I JfB$j)"di" "h "()(i IX%aVB &"B"hU"@(j!D"@ooCt GY1%4H}TC3kP,M_HԠ2H7.dږ g0)LB) e* 0#yTLp<8H4%LRbRSkmy(S#]"1`&6$̵3-aÖK饍+RC'j2" 4 ']px)56uaB%PVn7? OG If:, sb Q QKh>3D4BdJrل P`c Dk;q Ə(TAk`I)w؄PP24x`x#fgT$ TiLH`xAz;(-40*Z`3P Oldzߨ]DJyJC$?{)m H~\!W;A49i /φU|a`jT8ǝ=#‥CuO(vUb&apbUҮHG"u6U&!fB!B$ P(((E$Dyze@PHDVݽb/~0udH$mݾA#OFD^T`hQƯBR{;!s V)D X Z5 %b)QU$C:HJ8@/ ЊHðPC>" ddR\"t ;Ix7 R„R hS@0~-zD)Oq>(u=#; PsB,O(BnB H CWQ#b><0ڧ:*+F_we+ a^eښ)C0Ma*BՒ\LHr96Da&?$ʘC1!9!TB٨'aTۀKP C5vcӘAC9e9LfܦB!8@! {:t⇐PRe*$;er_$i(Lj Q d'uu5 eI> Č((ꑭ/!dSGU (C@x/%1b)&SU(eXër$@8rOcǎ0_`(ႎ,! l;[AHi\|x4tE*aH(D2%/݉cD=]~xP10IT T* XLn(+wfF{_rt2# Br8 %3!RDA#$8Cʍ({,M >B =GԴ)HAAiCA$WP Td|wQ(c =V`OSBD5O֐d`aͤNp/bBnnnd??BeW"0PҘhHyͱѱc_PFA`?F!" \OlL RB\}ژ4r%}(7}裝.8frRm^ur7e!a`LgiJTFC~gǍ`)O N'F,XZ)N֑1[x\FJ(d3q.ȈJuy 9TtXo^s\&$Pk{7\dpL}&w;!cmNMl\!۲ y!NN>Dlli-CG: GnCILã@ڞ x7Ձ<y!iLYj>'>%^VSrÌ!9djF _v*v?Vi%6}]@7L?5=t+2*g;JƘ'ji >J6Ki WcPx)9aJ WyT3`Jj<<hMZ ,`\!uʍbu0KR{HG; ZZ@t{v G>jt fu\*}"/`Jhno=hNiWv'Cs((ZHhh R aJf B"IaX$h*!)" HJ@& d) ZUd J R"@ $ T*! %"bJ($@AA-HC "S"HD$RĈKD@DH 2H$1LH%KĎa%JBBR%$YXVZ" %" Z$iHBY$y,R+$ E DPRULELQE!TDA-4%ұ J,@TC$ QR+@4PA JDMD% B1KBE2APBL T QPРP"DIR$@P%RIHRCA!T 4LP%A#%B^PucH<'YO4U#L)hAXCND)R,E6P W,Tw5=9 "P J:m "A!9hA5~6 #QTHDPE"/tDT=43 D}S")$)C h!jܵ )[)&%IHVV*3KMH M@EH"t~23$D 0=-- 42$E$J% P*`$  >lCNN<6ZD{|^ qJC" /B 7A[imĻ8RB쇿Y.=Ek-t i?FH#sa XK 7DґX9.s?y ɒ|qښ.AGRlB!8) "2^*8:B 0qٮH=<hiAJI hA:E:y h22`NGq@wDNϞl;:l'tc2p"](|Y;.ـ9MLE5hS 3# 7>4kUlQ)-: w:=Pn`@gѡYhg+v4 i}OQ=zs 7 n4_iB&QdBM;s%͓3iьYD -:GyI@K"{N2*Q?(@πHvJ fA #  4R5RD['ŸД ټ /55Ʃi~hY.mc;&1j [JZP4ؠā]7|ugۑ5jǠ@"'nqIs idL %{1ŐBz٣LE(7D7\ ll`|EYEd. X`I$5F8{"D kѐ `2 1Ojp3!rаx+t<Lȟ=8by!@F}2! Ht `21E;4z HQx2)Ȃ`콻ˣ">R2dH|ݩE>M+""a"Fz/tJLzcQ4 2*H"r53"E5( !U s %Θe4^ɄuB;q<" UY {ܢ4H2 B[Hl#w 1I-ÄGAGQ#Tw8k%.Fvb<30G;lD)bN؊OEF!En!*FHZ@N!!8:҅$H% QQ_(wvujtd( HE[ r& Qh K2'4tADb9)@BM4#Ct^B.(bM3~:e$bB n)7@_S(!H@",tZB Λ$y@D)^|CJ`qDD$0!ьC (0XagJ+T^jc0DQ' .dƚ#DW'9D&1X:Bi.d2.=Z<'CF 8 IRZ ǟ\jHH#*8벧ɓa1q KDBtGM]ezA4b 1na6i~%#}\^nuP.Ӑ08k+ÈEmE'FM8 +a(,4~s)m9Q/dahBD*XkCLEc'I]p%4nP\0dm5!l!4pnKV7D 6; tqw 3{(T r`|@_Mx2@3&n#A’,E %-[8e *)#!o(HLKEZX"{~i0=r@SP%D轊"?p+(APH /6'OGӗ웂zK&x> 1!b G:(̄)G h@`C7Η\t=^ R vAe!GAڑ]˶;M)-"BY)L l*#D cF'$DIn){NoGhjx%NA*a30ҽEtՇHmke j"36Z>#8n4;WT=lxAOZ20Z{g~EE$a%W_k 4 0SW,>Kdg) xk9S@ / KbT|LpG":F\d'Zoo2sZ!I L8_1Sיy<^c#õ>Bj( -xNv̂G?'[=Tۺ M&Ϟ5R0PFPc_o/*.cHɀ4@hH+ 4;KBC(Pbt hbFs;|ɵl>؞HnEhshOW,7b o8nV=N9I)q#=FY.~Y$AlA!&=҉?,y,(nڂ˂}DX vp>$zB@7C {D+ۏ{ G^!B'Wc)L딉5+4+]&B>XM=D)_'DInZmȡ"ȦRsӍd~(`:K9'$}r߬_p, n=Cy㠶`r&`: 鞠v>$= ҺȈ@΄N C9_'Ѱ_^9b7-SAi}߷.;,ƾߦI=`N+'N0^4173fg}]T\iIbbYeTN5Ǚ/Xx_ kߜP/|>.|-{FP\6BѰcC׷ʥ^cDw򅿔X0Xs=TY>~cL%mɟ^XC惾!4P 6oS 4.72xCۅrnc–.6h 5zq#BS)SvJ@! ((qa! h%I41} f>iԹ'rneNm^;,0D@0JLE2ĔL%T#1Hs32Q(rF#8`1Bj&11PP!JЪeCDxHfM .v0s0=ĨEK,s!ʆSΰXaժB1 8 ѹiBӪZBDD #T!qIm9"QFƄR„F&Bd&Ѡ Q ' Lv;ɰ)j%y hEC=7T2!,}ԇat*r3#s 0B:3Y'Q'qi)A $D^VCĢpsN90!q}_T<~GK)" <@}N/k?~\ө=g626M2jOpBeo+RK%v=Am'vA<Հ2>bJyKѐ7Xÿ2H`pNq!f | 5fC0ɷM0^ʂxR@I41i"rfD"@R5uE(De44rxtƘ\ASd4F2#"gGX7U5x4=ޙCI9ޠ75Ex11@1PS@@hMCS0v ^b0H\r4!-DT&aT aes:$s` Z HPCM^ X4f,&{1#\Jpl!f QVDž߂SDkJD]bݐ̗,!¨!e`J  * ӦvTN\f;k) ҍO%ZŠ 㑤u6xu{ ߮|_\nPVC|70SOM&o:D1A~_Zy?)Pi?a&bJ O ߞ؉*"F!}qOL|\LNR'냚{ pA9+#";"7xװ?[Ta䝴P>T>"~S#;!pqTh&C0A?~%`mAϢWJVp4O,C`>_W/i*bQ[X; 8q7kF$"Q N[;:.Љ)K72  1hR C hs|F2$T `)H\OdcNH}z1aq8h*tQqa Tcuc; (F4χ4LONa n $ys1[N8a sN`9*iQ((PFb`lShV\F $ T * hJ(J) 9"i@WnF1% BIr=MIs3 #GP{o=ߟK2^c5^-)!d'z9&G@)d2 8qP%r=2CezBG8,r@<^1ӰYǪCz%XL[9ⱍ0EHh "Kh q% r18{=>ud`*ʺǛ t9DRhd>A+=~ sҧOi58Z|MLoPƑ /Pra^w:샰0($(4i B `d&9A9mH u;k55i?jb:JZ(wʺߺ(0JAs:\i3AG>h# +N/֡H c3m1DyA$UCC#ҪX!|e (p,g ,<&J'gXϖb#ȑNzCHNm$!%0C/+0Dn&tIz4o]L#Lt'C{jI(6nAHUhF􂁰b2/$Pcr 042! K$^0UBIP$ %P@/6]\B{\9@Bh-!mLhQ"&-DXh`C$Fm`cT H$-IRJe1cmĜy5Llh T?>K;+ٸXhԅH=Pd' L![I 3J8&L 4ݗoE#tx;hhT 1&d+l"G;'cRhD҆& iP(NjOTpGE>`q8òoE`c),~mLUF6@h2;DɥFV"J4lvkzH7n59\5k%S;8>otMउ%8Te*P@`V O9Š{9IGq G 1,B}!U$TD ;M"LRcFV9U Qb)qlg{I$bJQ,bCbR+EBGiE=%f?~Yo HLXnA21,r<@:3#DCw E3H}ШCzkt< 癁R\sqzΖ@ij`4-@|px j6 F<\3/c3<# d(*#E5 % dn1L.D@42Q4HfB8q8XV$aTH47UF5:уlr'ꔦP,8mˆFHKUD5u$f2 oF#Z)SHԌ0CQ$VzMӭБgf'95<8Jx4vLs xG ќ%̧鎿1WRcnyHa.S)>*LA]4rZjxr'$oTmڈp)`R%5?2TyHx[1v%d.-TĂG0)i#:%BVq4 1eP4L[Gb"b1r8Ië )L$:Y> #~H'q$>G\X })!U+6JH(<ԞsyUتNF%M sxmQ )wb&&4\^ :Б߅ eI2`J$8' t<6߯ݓ&Bi=9xG)6Ely&'&̉,ie=$GbzLP! /QꅋzE} ;X#?v:&(ILAns, iJ AE-G,h25O8f,`!MKA$툍}ߙϴ@|&c_tlCdQ޽Z oF %AO=ֱ-@f#th"9y`2T@O AqD(OϬQ~t6lԏ hz~pa 2:nEv2|f=Vkqm@t탟L]hwghjvku|dHr"lUg%IL3)^b=#Ak48x?1n[o1ݰ~)+xm׿Ny\IKB}+ŐC TTa00ny:BOjH&tҡ@ ("b D$@v"~pAeG֪Np:0Dd`?ttt!4ԘIj.أcȆ.p*(%5GHD=H"4-*@ JХ*Z<a(DA N zJZ7pB Ĩ@vP}#aGZiУ rPШpW*4((d{zc*!x-@BpiЫE *ijP8J``)JLBvVe@ / { %ɀ,aѤ 5x4AmpFNĝD8\`'x;!Ab( ?1$JTl HxH12y*qIx|<E]$Bp1ÂA IJ!J\CiL0La`Ċ,, 55JqH$O AA@RAT4!HP)H& ZR#B$$h `2B*j%Ky `@OB~*J`>l74FPt:`1!&H lFga^b8 2C@$_P+{դX "5g6G!iӛΨ5CzO.?>ELXP ;`g\/^~Gwr ӻ08h}t#藥S(,2z@F0eeTWH `0H`j绺wI X8 :Y%E؆Y|9MN ^#r+SԀsHCC y( ܰGGYtu~aH1xq#Ȉ?L*𣴡.H/at NB z@i1 ;6ғjP4EQJP JClY%*U~H{;@zāô֪_hmY&ꋑ $)L ɿ{sS 8+ &Ap(DdR1d\UЏ% 9^@rn 2:C̙Zz4(L)Uy HE `D"JQH>H!\dEAҨʑ=蔢4PpXRD7]) bhSTH(%TOP#BСRFJ4)fp;d* aI> RU{*RФes!CÜ`a|{K cx948t Kl$y+.&.rDzN@4rpTQC#IP %eÊ&A9d @%2f8l @@ C1$c uM39g)FY5B9h.((@TE2YN*0lJC 3Ja4PR@4ȄIHT䘄 X"XÈDHLɥ AZBe{p| B !`Bw,);Q`X 039EǴqD> 4P>H!)r< "F "`(U$%X$!)TC0 0=s?Fr6ߊ=B ڀJ3 Y_wPV*dsA)hJQ l5Jhl)iʔbgwg+r6_ьƀ[$YBb$)]SGywpHs僠%cp`UDCu.z+&7H!CJ غE28@0@7]n1Ye$2 q oC{oA2r<&a"Qc7d% + Bl` 0GX'>z k#fCJp}θ(!1xJa8y1cp7Æ PU2Ei-IDJ؍EVlk" Zՠ҇A/"PE%B*\d#`|V@1etlVOr~(`2&!!'_ cDV+`اCh lho8//L6H7/ ]1!1dO;]uR$"CsD .BTZ?2!eLK1( }~=x@=gTQ.s1,W!!hƛ#@҅ R I $ETDJ$ R(Y 01!DJ@PD$̐ C@LSh2,!B1c&l%#HNВCJ B M./@|R pw &a-U/h{vf%iV%$H I(" $))B"`$!JDQ)ppB@M bYc݅]b^VSnO7W "Ncj#D!0Pa-Q}ЋUB% @ #YIA4ҊAt*hSù]#+')uTO")$PUZJ{h5" 0i@ZU(TJI@CJ~2//vPGJ.>T>IQ\x+" hd*Eb&" RaHbb HB&*" &ZJd %( `")" a!/>DGiG|! C vE 0-O2UD^#Osh؄dl3*?2!!N߇M' Ou#: $ѬO6tI~N tG]4 G!.BXeM2s9> 4k$ 3U1? ~1G K7xޣ(X?ػrRv(\au35*;nSQ*؁O9]|!}}p( E0)*6AL1!@LqB͐QۥDE-e")3x{z|E:0G4 U#" H)!J"J%$N2!CT%02}-rM1A8 `H *"/HwM,.W1!(HTeJ- MT&;gͳ#9Оlu oA@B +G)R#N%d@䆗,ITǐBЁB!8E >O}8vM1Hh6 J56&!KEAB'OBN+0KbD|(O2) ' y1y =~1/&LEBD5 %4ܠlr0\඀|8 G!OA{ y'`]r;& ;DT!Faf {͆}0 )b{s'@PJBbxF F"c,αutTw n$ Xiqw?{PHP)W_y)PR)J^Go h !9P(dN VBhPH)Ubb Qh@z0EœXS]mJ*Co;Kv f!"$ JZ!C!W$b)B!(zYg׻a[ C0{CX}o{nx|Ob"P:uNÂF@>ZX,9xPc+*iS)^Ah/Jw/yA7?^#r`cHQQ@@|3?iWm/y?7gO~?6W_ʿW_ 6(?s?{Kaq ?`!P }$Gi(1SX$ˣG/tUK` OOW'"_PBTHƒ"%P- q[ b?ڬ53 2H#N/@o$ijá. dha'GfZ}0ȷԠA2$ry K;BR$(4zdr7#8 X/1zh:4D x6{/bTIL& IWS#5tA莿|H%i6_!){!JćAȕ}%< d2 i8}[%$z/ 153f^APaөAF 1`8{x, N (}:hs!cg&Kpt8D8өDΠ5 w>&$x]bo2|KvXs338E lcv4M9RPAZ F 02'n4}$| Ο8PǫZwj&i)rb4 d5@v:h3 $yÈ?U$)@^!D& y_ zPpI?)_rCLJ ;|tĽنCc:49bQs9ؔF"F !0'/.XGSi(ccB*2Y]0 dΔOOos0kJop'Rr牘.ADIx-hn' IElR͢ 2=VeY;3IIly'xFTW!12=% .aS "y;6w.F1K_@L/;@; x=872:y?H7]T `bm(E]gvdZڀ4< YHM) GWqKy~)&۝1T1KL)1$K4K-PPQ4 1Q4DKH4EHL30DPE!BA0RG >I@TV#DR*!Mi`?փDYS#R:Kp>:& dА̅UHH|m;f,>ۻkS–#IoipeY 5!$G {~?iUE0`p_];|e$@ Wmc,R- zp6;1qc񽹥Rw~EA'$=G=ك\)S^@ƣ5hc'h3iAOO t]}*0" w{ @4r]*YZELʸ">ql bxD$DVN[ oNP=NB O'%i %SJ4Th$5S21HJCHA00O/7i_qIM8CarIY% !H)TJDbV %BN;@nuhhZE{ @n OhZOP RP4Q%M"SCT BE SIT)ET ĥRAE 4SL@L3%%Q4HDD4 -TBD1BRC@L,SMIE$0MU @LR±%EPP4RD @J 1#CKTA{GB2AsB$*a?/ʬ2 s~^t„DHg10J7>!3X30ִw8b b6PW"v"Y'ξ\G%`Ԓ;("f om U0sGhC? )X@y r& 0TJ0 m27C8҆81v~)B@@?_|``9P%jk1Iaޏ烲cf1,[W%yw9=| iL644FZL޳ 0uNf[(_Nqkw\5K$'Aњ}X#lcyK~2$euN w-XRUcB#\Lpr"CD! FD]$ye@`I2D;gaAA)gU(,(iCADO埏3ǁ Τqי}P0&EgA$aIvts?Xu#Cս'G(TRD/̉, F_fu q_ˆ|@mAD'5&D6(H ȃh&Q޽@4~S ŵ9@;"D>ԩ@ҍ>bb@AѝОA Ah <$ l!]ҡ.z%!)F٠; hg~ a~5up_:hr5ZMߊ&R{m7˶ 3 DM|<Æ}bYX ІHBGuLh*YP:PZF87G@$z;HXG=qM: @*%H" (CiXs) IT3<>FfvRQ2Nn~#|՘w]i șA@fnywlS8>ob'RP KR'0Ehd ZnoKnעQB^w?zMo C 9LD<{{2Q/FlH@ q`=(mpF/(xdq<0 UL6w3,̲PRuPġ8 9] )cs#0q51CGA~rS 2@;<Ąj`$GSJ@_^ pDISL.> %s [[ %RChxr0ĀL%@ 4Jў$J` rE 5dORA!( SK@Rk4) u vs d9e׼ VP.NԎZ`jw0n>4I+! [@^yi|ܿYe-jTՇ! `IXl K4$ CA8aqDRR\:'`tzPhCB 9ؚ+犡ݚWz$:<(2Bt*`)nN7Q)"JE JB V8 eyvqJS*Tzcܻ(HYfگ×u֟Y&y!NF4cfjE?bkr`BLf"1"RXf X +YA. wf@RbI "68Θt )JI!  %000\ۊIArTRгT!KͮXrvER@)B(DPhbj`7Em0ĄnY0N 0@k&Ӓ^1ԩ2-bah<|̰Bd]5 EcMm Hā(I1KX+z*4vnq'B &h (A$JLA t h =JR!lR ZI$K@` 4~܀IA&2&J #@G!@D8@8b$ % *(rJFc (Ja*DqU4h؋@BPH1TD104 EJ0J0EEB  $IQa(fF&d$<ؖ)U*hBd( dH``%$ %s2Q{NĞs]xe4/D&:e8*}!ED-4TTQBtE50J4ij?+Md{},g>L݊4FBDc0gL#FWj4 (S.4 *(ӊ`öԀhR|t+42a2%بj;5xix HZ##x rM <.?<Ȉyt"/l)ju.o E0]wexBDeamg"A /@JvF;G6.zӣ#$1T C2pS< dM(trذ5SiH@Q@N!G1"v3O% 12AB#s~v1b'"טm=p1&(B(=i΁'k9x$FP DR"bH*WaR!E4l{wD !t֬:'`Ao t 1IJ=LOzR" @D?XD0Mb,/8ii=t,ri; CJ21hFPrfa!#ډ w<|x'#3S)'&wW2`"B]2#RbO1fO`Є>dGp0E8*'`{pyF)iAb|~>26`vyndf欥$J`| R)@pT_mlq@{<=Ч7DTBT1+0MhNB{P92 '}":>xH9 ϗ^O? %))lm{_0NAI.7ZF'́\ZYxBB% Wr2Hns,2DJIPv@lIѧPIPHPo۵^,σj![&m ȋt;P1u dGp0Lvr2q+jZŨcU#eaI2G!"u0f4pF)ci4;+YfFMRY O ;?=Jb U$(|pyPmRzumT (z=PփB");(D1B ?D?^ 2< H7$Eh7%  pVA'Ur?`3TV `oIHpZawc%B[0}1쀸h"eFX?<RwLI5KM  @B4J4$'HrGФ,Bc..PD1+8vw8Sx}]}t_ُ$D⢐M`#]ƂRQY =hd:'"sFۼNL_P#tӠ [D /9П+߆"AU/PM -$H,JҴE$H4|LcS! M K P00@@IFT/ CN ு'Bg*wH%(iC ~s/1ASc!hLJ*0 p b@iiA A hw_<IaR bl+HD&TV i!TtAy.CA&W0|GѸb%Q@> |y!@BӘ*̣R ( Hb "H (DJYCBP~}¡$4R 2(2A4s*ZHc>鿼$Czgh) Q "Ԋہ y }c? I|zB%Q&R(9ɸTAJ {FOJ?,x c|֩BD5AH@`  dܙJj!RPTêM&n-$O$ LLTQBsh%HH3Hѓ38I4&262"إ/JFAMA M#b%n).cg5N"W!ɮIS'4DLBDMF[R`" 3V(9!1 fiKxy~jjPwś5PjO0~Sw6PPЍHR7r<̞FL,=a#Km0)FL JMvCa"F+!ZwSAZGY tĐIRF#aICSkPbU@kf(R#M82'rkWz&`@T[ƷI)HGT nQ*yUŠ=E^Dc[ɻ ډQJ!1J#Iy=ff%[adhTeF~0PI|'gT#c8}/!3 aiW<4c{уr7֐%Mi"6Pnġ A13B:bXFdN % ^N4#DtbRVOcӳ!PXd M7\ oA HΠb1" 0+K اMINfXD^qMX7@}mt-AAFV mXbۻɮ3ц!\ qNG0} ;GMOv " Sp>T\o>}K$6603(U"p^zvdmi֧5rzi;&%m0O*T׶=cLPK؀r.~Bɥ.7A 9zPta9dHw4F1L'99v^̓g.w&,cUAu3fȍ ᮘ,ċ)ء!DDVH`ÑLhC̥kΈoWrdɍ}hEFYf.[ gEI i e`0!0`:"*"h#@LL\kd*GƇb# ]\M%#+U#fZ鴶sNO#Ș2k#ѫc^ZAV),I~8*IA93-爆-߀brGdpN $!\5 p@7H4J2aj#K0$XٿGOK3!ՊDnfR ETLRDTT9ʙUD>CI$^)2Ruq;o+AH[XS[ $dE\'$d )x:0\q\ȓ­1ݶT3HD2FLS0TqHA^YPM80&iq Q- DL C l͍"m9"= aX1ɂh0C"44qt 2evf.!Eb٠}2/D'2!׹VcX8J";$Zd/y0 p|#ȓ ^!iSψP"2)N5%ҳ131̨@';eַVUU u(Gv U]Q3b7d\FmQL\W+#7xLZCL9Û Gk %aRC, \In9L8b2X+k7n#$G]pD%Cѻ7sPЇLPIDfUL Bh脇*.IR 7Bi$1>N=x _9HD=96 gkrh!͆DagrvMzF;l7'8 74)0wؼi"Qt!S¯y,0c5M{JtTL@  8'pis! 5\5Q]]ϦyKQi9K%KHc 5{ApPrtB.a)D`pNg;f={Kca+fuk7Ob!ך\6g@mv3 Jo$3-,/8a/=H˨KӼȌ^ܙ&G˜]A2jqatdCE |Z4M<EdGCthJzu&7U2=U;+ b"v]Q,ƳwfrS_|Ihwa'bYdJ۱>!8wY2AÁ<(TF`5;Qex[aNM֞wPrbVM.\AVAI^faa#Ln(DxP\zW^D%{8X\f15rk6.nlbBZ#Jw<3G 54J\s& rUkM638GZ2vpv}?D$:")yݝ~Z\60{R45@.k/ J>^W{@Ӏ5<9JpE` &d02{#<,]!l=,`!:@ d7DW/ LŃ4Te ";Aذw^bAx@ІRuҙ]p6g >}c܀oL ?.XTA-* {@^JoT}>PO&6`GI(Hf\4q#N\eHT<`  <]6ܴV_< hg>aqm@@1,TJG5cC73gGN}[d{Im n!J'@rV!)q&A8O P:r UdkxZ&Q!4hbT`LjR3YDLa  Ï' L"c&2L<"/*WM%;½N!ƻI2C:o˼8TO\464`طfmJBXH^;iSx{$(.KN*DpLE QpԎ4Z`0S[0z%C$pM"1A. ! O]?O}"LH]Lu{pƚK4fo фc1bp"6k3ͺqw!q卤 n::m?/iPz6*RL Jthcl+=GБ):-  (C͂~&652ɰ ߿ǯ@E}Tқ=/jv <&%hMfwE9I !h* <@0˶6oAp6~:Q  1GlmJ3V+AZzj ap\6CIT26mI GL; (cx^Ek!K&)]jL)X^>>Qd'FpT>P(U 1dBH鐖[ڽtԇB#%0>#ڎ@`ti|\r0)BUD췑s!kMƁ#=s zPQpGt''X q✿rs΁=D4m?b>»&-#NR[* D2 A!fWp #,F Taٌ- ?D>e҂E8m đ9Horᄮ8$!ӄfħ!7yÐLD=8M9BCc;x$&jCwu.2x;]t#Bw#<3H1D:&TMgl1d )A;hIp m -%%6P LŨS$@vO# 0#k⟢xv~p?63D &Hb'޳$*n|p3e/=-BZpM⎡2j) =6Q–&0Z|zYD&㟡+یS(_d< p ?`#"=ޛNEEٽ<4wÎz_xwU}hSzO@y(ZdX$I2RHRi315 0hÀS!H' YP?:Ã~go+c;G&RXhJPh W= ӋPM-.frf"Pžܒ% UTx*cBĂB l N\büFK-lr @".6^+D A`;Z',b`!Ri\4 `< @bMbcCΞH&\$I-hCfbRh iЃz"H9*2l9=$||sdUvkLe$|$lcXuQ0%W…b┎bm0 zdpNuWX'׹@y>pC/'Q kS? !}ñg@? &zd ge3 &{H#M07LCr8X4Abf!0p͗.JeλB`е0Upx|9)$/jHC;k?Vsۊ!&\d""JKl*O3JFϏӂjb:n8A2 ZXR'SDA D?-: LqhNILOƎQGFtehhldqI+r~@L="|~rhݷ#{{< 63E9kQ lLM5P֤"g1e@0M)LDé@o`LQŋ c8MGgA'O'GP{iP(:b$2@N-]h]y9H4}2sac%?IP+B ((Vؤ*]~rP Fy|`j(i-աiW!!(@D_b"gG"w]_v0=ZOP;Cqh0Lw?F/dC^džOg|wY_,̊zA.Ѡ DMRJ^l϶_ɉ8JU:9QUVֵfWhr\ķ 0}cx6VhFd e)>;X1* F:W՘ۺxͳ*tn7J]UIYy,y%nuznń82b q`+‚RA#4Dti!Kg%s |I/#YX,r>KI-`0{͜ -u6ya&CRaC!Iܢsu͢|$V(bJ 'úpɌP(&BA|Vɉ@J%ctj5f0u|hL %m, /[i(\VB, :ĕ 4rjdD$i\W %dr004j$] \u`yAz 8~'/qN*eYtR*Bd>>oQvm 4`#Χ !V9|RR\ ]#TIeH)e,w6 =q8pr` L `tQv $-w PfkM`z uׁx6A&Aϛ98) e .;l0g df3JT(.vu+7hܑRU!8Dc",,Ruz!T#@gC'S15ƄΣ(T \TPPw9՛/rM(wehٺpѝ^\iMCx#q$3ђ#!1x`}v#J[+sP(^ *-+ĦWDA jBR4kvjȬdգnT ,p Y%dW،04 M 4b96fC m4$c೹<#g3F;Q9 ӓ(2qqC lӸķIH;(&2 b6<-tNsz|{ 7Q 0٠V lvD8*;ȧ 5|iI 4"CBکѬ-=wu~#6"tB,ab\H<-\.:`#eCTCOfBIWB2M3(KuzGl6s)f|cf JKAtIRe`Jh6'} I]Cfr^8nZјdhZƔ,e%s&͙8Fb4L.#WM_0YF}DNF^yT6VrZ*t8Pm0K*7jkݻKȃyjF+=-B20QedP-*$P N$t0 k@E ޤkB8'⊈fMAf\cm*D-\MJ`\QQG)R8jFQX# 3θ--'tu Y)Z̈@DȒbD 8i$yT9 DDK+&"؜u#p;H›M[PY("{:?| `>_ckBG÷EPD9&ʜ(&D)T݈bI2JQ$0IS 4F1@7 4"HGo7*FPxa I2pJeS<W'Jlz/"A@B"{ ף%Q::j `sgLJďv8\ 11i0Rɣ)*CEp#4W2 R Μ!] ;91p@F<,P`WE BHC%̈QAH9c! NKՙ'*iI X8L$6  sriiiRJiGH )@&#DB)?^^|惗F㲋6Cѣt4>Sь;F1LH1DnuP}%͒~ '!c "j S]/5|~: 0s V 72A`#pj1HF W` Ty'GPAod4}jd-p*ZB41pHH'#bʀq486z Xh9V b'/}!@RygJP| ȒF3;N8"?`>@P7R@Tm+@g )ԆRC#,- @met!@ WBK@z Q'{!ҔR- +@{ %УBR# "-#BNBž ,AຘR )WGV4ӴD8HpsKl]H݁vő3t#/qD; N9J$KC B RnԏH)(8SlRJpr!*q"GEߑTfc(Z\bT:aDyQ2Q  BM !%IWH@QI`{ vQP $H$ nP2 1B(|l"'[xR ҁ8Pz_ʀHɬŀdiϔ B"gP% @2Vl!_`"pW՜R" 9iJUŒȀlv°&C'r}S)9&`T?XdQ_J<:#Cd'p` >0RB?'[ uj/ҽdN(VhD 3l|rd |9%i * V`2(rO$s #qص͛PH$Ɉb$  e' I!4%)¢BhaR% Ei#;#"6#Dqym:1@ru6d8~sQ'= O+K;." )qc8Ɩr* DTh{Kc㘪<Jv^+/G^F짜ؑ[a =#h6Q-$:ZGO $`9D唁8gs`J E# !̝79pD8OKQ =jЛnaܸBFQxxFĆČFM%JiJ6cBu7a(Ō "TvիI0#: 働rْ{hA¢bgk>pt&Y4f22C% L\cAqQq20m$ȑ8DMO^yYL Sp <,܃1IBk޽t(1>B#X#a""q)Z}OXf:BLEԊhO,- w8kUV—`@0Fyh:7{x.)8 v0b4/̨>:)%]TQp1Am-JKWd2s Qd7Ex=J-`x:Rs7JOLir>F5xC*|zT־m0ج;XzJ(aCrg@),  .Wix S0=w/U0>Oa>s NHj{u7jɗW,Sei?;2q 9~Lq%0 +^A#(P!" )FDwD+80*b"Ee`r|)@ CVK(P%)j]@FrU IQX R &JYYEGy_>#m5Z`1J3WYҶ RGFLPU% )0$DL1$- d`L4X9Fzw\!s1f B>&jSMMDNIXEn) n*9)?98Flf8ihTP/Rԥ) { ?𧣤;p <>Kl0D=a-!4)Q@0]*^d0RO,rN U$2E Tc4{fkgAM'O=y+TY6ӯQTRO䎿yJ/V U"y XCD>h Г~xKjĎ*$*/^D4S$ D42hr;$D]~_ЂiL2k^3BH>@rxQoF뎣xSh/Ogoos]"DɑJPWhR C.V')-ј`_a>" IpB)~>MͽŬuvעz6'}lF8{å0:2!o 57Ё e" Q ѷO!UM;G0y=}'3v>`vfGC.|`q+ޫrP0b_7҉ oЉӀDO""=h*R`О}(sx 2=e DWLJbL=e2dP0:3/@xtjɡ X%"&z@ b(!if:2|1h@8?ȡЂS䥠hCP/tفRxQQC<@9_b#"ԁ?{|zT&@CP$V@A ar,y9~>:|$@*Bu,|f6 hdpc=82?9{8 bt4c1u3m(cQ%h>8C6wDOyj`"LD`Y$d`M'%a΄8BdS_r6dS''|D&+=.0ZZj6xy#GR$)ϭ۲[LF> m :Ź113XT\M Nsi8I TNI wV3)( u@t 0r>;Çovڜit@yELIQ$PD9%d< G()@汩nwi^@zGPxQQ >$dH&&HFoQÃpq)M|bQi [IZS쿕aQCs# PAݺl72Dd Д"kcPЍA+47N%'g CJ IC;(gI3^>6On%R}p>O~1x|F]/A$b <` (:A foQ۰!3kd4HPD<#uD zB1 70s ı1DwMbt=ǮK@֒4,+qtA$ hJQ4wClcS1$xN\?-g%`v:Z r z::>s>CR!WhzPJ8읇F!4@hNSEhGrM@@Bwu' Der"/ _v>kaܚbbDnˆt_7_} `}bL(C|C6%i!J2-=O mwT'eBhF hGX&CTSt}E2B$!NЀ\RhM%x#W O(+ð\ȃ 9y& TF* 6)!q@@j1cDc 'Hp˔K8@;B <' PCDV$*PNS"n~qyqr?K`&{q! #_{'ξsOެ)Ǜ0YJ\t̅IC 2zB43E Y|15ULtJRrbm&ޣfܱ: rۏ <8z:m= VK0afxav`~~6IG/ ϙSP4`Kj?Jop&jb",QB*k#`E c@n"2EP7)9GR72f:?7b,A+i&799ȅ rJX0Hc@(1fHcS8%YO i)LSiK]WNE<RfiAM$ؐ`Umci&Q1Ed (EJ{aA ;% MD N b[(dZ)@-' ToZHyj4X NR 5 n3BnjtrZ-P c7#[䍆/(AdzӬѰ[ D`03vp`"F1q lgn8%MhaO"R{' FKC%!7d] ҐRF5 3R3FVcTA1 zI1]&_NL)ѫ %Roͱ;H, n} (&@cB `mJԢCBq WXzɉ_=X;C<:"gܯt[A*l ɟ[8clYsv>fSn cY8R98dK$n2<$I,)rɓY=Iw#hF1Ï^7}YOqX3yb -qTٷ"no1d~_'v\Oc 7<8֪YQ/:^cz몚[wr8{qn8s JީэWlQ 8uۭfxc:^{ֺax]c\p7o'3+df9\C{sn;&y^sbc-|TDO:汊_YƺqLG\kn:dLtZNq'&b]ɜpcS1j.ZD18tu{&8yd>C_>LY#zuaJjexUh?h2\`=xYبdnW&>#߯FrMX"qs1{o.ƟWg:p5 2S)( ~IsPxO ?gЯyk `}ڇB2!jzPG/C57 n@3ɧኪ*t\mudoZm!E1!:%AC}rȿW]jVo\L?TɵcHJGz 7XYt?, \؍u[V6K(Ky}˹wD!˯ b\mvJL~]N&:de!fEIxAl>^XbL/* &`_/{#p۽M^$Poh-o_;>m=}ʧg oȞDR}7} `F4-+c  ;`uh]msh`=t#=ݵ(dh`>cG^{:p507Vw>>{.]l>#րB99z{Р*oI4(w> ;v҅v@wƃ4֯,@{w{9mu^w53vuk E|} u`wP4x8`>@ 4@} t J)TlM4 aU+. E@ $(A)J(T B`Ƙj( T@E6PH ko^[ƺlVbZ=g7w+d@@w: 9+>랞@^KOjQ.US@8o]-4zڢCi-[ӷӶ i[VA*D|eׯ}9k"Ph}{=ǷK>}=8*@a>( 5PD'Ā`lO}R!aMLJ)_,J9MY$.d{{"vҋ Dڽ=O'Tn+u{x: e࡞㥶mRO PU׺v=Ъ=nolw:[iz[,=ޟ}5}si(Q[J/v|9_nE;3em.ttWwO=r͹6҃kQyo=Om oRtNãk.箫 8jԻӄRݒwٯWnvk{7v;go)Tр}݃^qkkÓsiѠEvPZmޏ-+p7|SGrtA}Mwh͹!}B_|>/j.u ;W]nG z^t{[xmݠDZcU;^w!{5ݝ^a)Gh ($ozy =trO;`pg.O{] 9窭Я^m9tuwnIo{gn3Lf:a=si6mH-v0ZmFٽ{|Ĩm%Ωzϛ0sfn==͝Rz܀6>ݯm]kvc{<ncvc9t1˧޹{xܕ$=>{Y;tnW>{Q*}vKBڝvfs"}T{;VtO٫qhv7*l.˃{\uunf'u=2bttʍv}}omqӢw{Ηgp6hJРhP׮CFzՌvֶ7*>eo]׹4AcםajjaXz]JM-Pn>w@@0 "h4L?)Q M jd)4#LQ4F @ A"$&SM2izlSzSѴm&Hd @OTD&FjcI H4ɧi&bP 4 CS2hbh=40bLzh ~H60@I'O2i14ʟz*MS꟪~~TSzd@$ __?$A'~فpoDZ|UƖl?) 2X\d$/ب b #ڄ_lP(#jE߻3Bi bS*Ʊ]To`$P0T/BGA8]*77 Iv59әEf/E30[4um1sfۨEfI( FX4A1 &mQ[Tj B!"W4-"$ q@"У^V*_[n͵dZ6%FMkFͭ( $E % -bH)c@P0F$)`2* '"ErO(!E-7 `I+PL`#LW0[ fTҐ xЩ<ʟ]S_~N65&5?~^[9AB_o MBIpYV@a f璼SP?jZFF)^W7[@ VJE`REImי]h4iL)5<댊TߡVl4tPԅKHXD֋V%I6Š$YJ(?x9J 4XHD2U^W\2ȟ6UOW2lHBӿNCFn$H$vqh "#O{~tR*BH-3uאDڭ[0(u%k߷+mb1ͥfI,(J(!jP6[-g^iy%651r;<ߩ]iלbiYfLDS57W,f6;"+;xK4iݳ\ĻkxR$9a$1~X/9L@a5.hد#N\Td# 17s, YJ]oޝoWmԡpH cA0bIF cx:Jsউ\i\o:'YMRRo~FW+cU8w^ kc<:fO&c^tޮ' ՊpBoM>'q֍O<ΏC.!$\7}З()1l#S\j=v*F:Hp<=L$Ǡ5 Znaov 8:铖hފ쑴m-~?ak3 m@eVҰ5m=~v@i&6ŲW pA8&Ʊ4BP)%*.M11 9$Lci6`6(&sO⚄Uݔ]7T~竽)ڽRjWi_m,5ӄchvE%LJ6a1JM …E "#Pէ~o_G=~;y>@>V͔rKbL[xWQjnwsҿH&=.œ1p0y!bQ Z 墳tfyx?a6&.C$ mAׄ"M҈4 $'|<+q^zaݪf]q(/ t)C43zN9{tcYAq"iAEDCHHqkń=gf.:gJ 3uxjɩFur-dM&~7 [wϨ}8 %X+hʊƜi2bhQb1^:WDժ \Lz![Uǎ' ]>_΀/o:&t&v_̝Fsv4M08m`麗.ǼeJdrww,*ӳ|>Nfa*tĄ6f~xd*Hen^ gl//Mbn9CXdwY=NkBG`@u3v/N+W5~Oꛣ'!F 8볯Ǟnj|Ti=DlNv9% )QFBޡ [YDq*͔4Zo0#AǤVi&!֡J (\W4M&n2c[G  o/bV6+ +iFB~Pߖ6eK;[΍HݕNs9TL>/,o} pCX}Y' >Nߪd\-^u}oyX@,Q4\`1n0G>Yٳ2_=>G&cfqۍ<4xQ@w$^Tް(:Iμjj-s t}#Q ?hź&7b´9] qedx&?G)/CÃ.Z`Œ*}Z_"?2aj]ǾQIH&ӱ š+Mqisb>GÊbt8Z["610QY"\H*%oPM%<%cQ3"]e}nkX1Es&Ȋ$b2ad9R%1bB*XHcKΨ{+ <7gA^O[qi3\EzZ+m8=U42C F?\MmWRD:=!rT~$KW9$@0(z,xi i9CĨ$ߙԉD7 X,>/[k5}-Zw E^zۮ?q /2nL]}h?ZظCT] IlES`VqEM^Fcd,b`btrk;fLF@1n(wꞍb X3蕴$|̋IjsyWS^NrAR22x"?a<8mP p36*Nku2#=Ɍ:T #?=Ýjy!߂ :m/B$$ cYWրrU|Çr mSQ lN0 ,O6 j kNB ;܉k5YӢ]hܚ޵"ps/!?QoXy̌! kcea,ևAFMHͺISS31ru Py8?$ ;tS7RF* 6= D/uNeb+Nx94Pq%k躚.:r3ܛ=v>D{nHx wzE0lkQV\fWt2A؄s$[F5n26{ A\YЌd PXV7*F}.4rʎv{Oi3oYC)2N7]LJ[ю:"'_Fg["(h}V[:cn&HBdTJ)KʧM#eBڥ]Us*m^=7R%mf̢_N!@d!7It"wȡ = S-B ^IxT6glDkɑ2HGJhW/Sӵ;&ۼKrdt}_l>9s*,pBg ~;ax9|S[kG h 7$Dccj70)Y`Ri;2L7Ƈ-xk86 [(XHJ[uF 3u a vڶbN ~ܠ{Lx&2}D!_++C.ؚmj{+Pī#_.Tj0u*lHDqtTG:L1%9rRΛŪF(Qf';B\7k杕YV5Hߏҏ\擾 [fgM֜aPQjl[\xsdYGI->GJYb&"KR:ᬼVg]ҪwA卖/|.'5bD^楿(:yͨE՝y0*72Va|p$"WDa iY2"7ʽcXز!MpG :|- ǶFdԠ w$Xy5I.Q.'7Mܔ9akDRΛ6ik[|#E0ܯ.\ ex=n4m2r҄3Uy'bHm혡#{FT)dᅊK7約%b6KqvH:$#=3og+D?f~P#YK ON,|\~G޻VZ>OAMv ok:|Oa{V9ٺtB!sbSweT,ov 0SBoM.ms Fm}Cr4ſ|nw|#wtZCBn5C| {I.z3 j}>! 3ъl`ɻ~|'ȾNF>N$g\C}<^  {ye/sWّUO̡%d<&~YS%)URhyE5f>$z_!BJR!B)kVmֵ[mZֵmۭkZնJUk^C Klv<"E9T4sEho}+'_>~BzcjwV4O1ZAjJ?:U`2aתlUTk;jQwAΝIάlWB ^gWs"+ B8]gQsw;Dڂk3_߼=Ϻyo}_qiYe~8Jwe ^{uB3w|  ")ȟD;?u^w_ndf+LAuD뇲mBZWE*t;AM [Ij/_ xESrǿ5̔ß8U&Ρds̶] ЯpCA\D.[圾 쳗*`8c 팔AJ$j2QHH_y>mo[ܒ괎2A;1}^@Iʜ`LODw@@*!ЦS41טX PL` [2dR1tr<\ur)po,ҲFҌ+~(q?gQ%&s_Jw_}d܃ ]Sola?g}c)C*Msbm|B|(v Ϧp#lBG<؏&1?/>-"Baߣ~ Vy7@=>V|qjȉW{Wf5kWџQ ӷLpoQnQ3-@D.p~\ߢ'Wm^)ozy};xxU9O{Ҏ6s Ұ 7Y2BjL%7{yۻ z9xi ǣMD sXZw$qW{6tTnin=ewvǣNߖGv.rfFtӲofC5jO>ĘPD.)vݯetD1"-&yTMU߂kL̷L1R˝"ςgH\ڌ`W<1ӝ:GZhyX'w Cn:m9NOP:_t{r3Պt:+-;)\*[˧~^sts㞼ңҳxq=oݭ3ξg=Vg_&C$ӳ>R\wapʮ*W˽ܼA"@BCWɦ98/?Mʉ~--UC,s$C!δ}T"|9xrUmwK>=}5O6#<|t/YG?_r ĕ^@3HZmAI옑]?>p%* 4Hi *k' G%ʨtB.S^;ö ?;*\*D E3g7wÚql-?j „)f]MkۄB;.< t'uI\{PhCAWy;& ~}nN(<"yD9Bw3 '}6=: u mdYiʴkXwD5Vsia,TcqC/`b<'7$?**צc>0ۓGN`+oKУ}*>UcbiIt뙣ԒI$ QzHj-i|ojޕ8!oS"9T.OG8ȁgdNR'(s*ycR߭uUD6W<`#HCj7:I3>=-DKD! uw-#M(Q"kӯWQ;jjly>fZYe00ڀkv7oU4qIcrnbTfx9d^1C k/!J"3 q[-S;¸-Y]٬bZ]jS>P3Q@$@d b\{D jDȟ @ @>~(WQ^X}P&H!"(,OA sw E#RB23BFOD#KH !P0`a#mUDmQ%a(/%Gu$I&Tl8Wkxnpji)ml)1q18b?+3I)O *"ĹE&TU/--zZD4wn Hf{|)v&:V.^uu]rwݹ¥+|OMa5'cMid$HqJ6Bf(-FAeuCMJ,  (RMnk;6'8@cmy\z=}0_w^5tU9]s".Tw׷C+\ҷFcBm!?rc ,5^8F7(V$" }]ﯗyدwKM'~Sk b-ARM0-s2EFڐIZzm."L~ Ei6jA12W[ߪj5ڹYLgR&4dD=D{(Bfu@bkJz5֬D"J?"'#1̍4kgsY!mG/H٘YHs?#IM,0WY "@pWӆM7?=ExvhN1 @ɡnĄ DTv ~w^H 8O褂"8JAlԼ𽛞6@# rI2/PQRgp쯸bB>WMlS[t|Z@G&*E @hJ>\o ,,(\iu21cl| k*AݳŠ[5"4_| 0VQ(y F`6ƛId޼//Zc'HE "QF:PI!A((V3Y;vmvՖn0md+ǍV F6ߜsD2̅ ɈT^v<2]-l/C1{+˯.5fi7y28cbi&0Md>"-gUVHmmdRDvF$Ad\ XZ@p4"D*QXUDaE• EJFH S@oGw(Ȼ+^2#] G/3 H\-hɉXWD>Xh 2!`2cn)I-jDԎLИбӜIɰ 2)W(Y rC39OoZf&҅{>?Oo#Eԛ XԤ:Uel.re]BW"PkzӾ5ThRD z>6rI,+!UNm1 RȂlBT~bQB}M%,xT:MQj&YT嫊>s (En_|m^~@}ռ w?=O^뾿K,|Z,fFGn-B56(]0ݪQ\)MNeT~IJQ,+ZJ65n*8IYbbd])"!!+YB "j(LafKq0ȥgK臛:ׅW +AL{c4yy[4ꁒiCq|TR9P}skxL#ӥz+1=ZzkMPc'c\5`:YHJ,ɦڮ[Ss6͞CEQo80Ooycgo9P!#7$' ?V~:f=ɞ1S i޿QV(H ZE!aa M4ibA2d $W ~&uJ t|(?quBnYeK^ʹ4$:皨8Jѹ )l[54ZL GZ3f>L~MգY釛C%ĒT/Np -]|KN( YVAOjt=cĉYךB5֫a ^ZDhDS0sAϜF5x^}GPaEs}v9΢u"e_8m;lFm$[? ۚ1]n<n>΀eṾLͰ?db&G充R4s!'8"ÍNJA:ZQ/F,V_JFXv<t;E6>=^"NB%krEva lڭ~81&@m uZԐpCB@cG@603ʳm[fHURTsw3#.Xxreh֣~fUտխt!'^Oe AB>trC$jb̴h 8jx&{W!ץT}-!vYgLbMy1k2//ISYUf\6ULi6vaU{"Ze(6,{U5ov*mk"0D݇h*X01}_cVTnLD6 D;c9x@ic2Nt2t٭>;}qxfX!Gv:.f(A0GG5_+uv1ې6,b0.}'afo5JUɗAAJ)S+Z\x(wMupw'#K#3@b&H-႕$EwKl5Q*8Y4M7s -CJ baP4-rE 3@1J/z $ Oe<vswkZ᠉O_Ą}Ԅ}cHF9ݲ5USp2yG~o kv l6nd P#tH$/,7fSkC^z-UcwkϱA"=:,ߵ oDGRFA ?V1؃m@؋24#i@'S#ԓ&G7@yo;#? :}CYgWY'rӄLXs79 FHCnv1fxӺDu?Pՙ}/IN h}`m!"4@9s/ޟ:tj?ީT˩:a8Gt}(A~\grg9*FiAӿ=L}5tq37BAǃϳ~q=?7}ߴ^?q|s~_{?v *5{*Y 3{c/9womE%&\Q'̒f-?n5H{j~z>~f_;{&+yvt'P}R%gr|K/ MH4ĀDwGqWA"[˷l9oiS 5p:*j}\w xN3gtOwO࿟e iaI1S}׻,!Pk GVᆐ|{/оFy=MV {yt=h!JG.'ZKy/330_-U[DUoz鶳'.C U? 7_[wE (HZk07!_1?ݓꗢ9%A(g: |߇Hb8Y"ez$[2jS0kv]=骪0֮D;XJ QzfXɹ hV؊ ͈`Pl'$X9OZNl4%}2\?7k>7\{m78gmX4$<\I\Dmvz/ 2r_ZcwfWi o<Dtw't9uJŸI j'}+`وɊ[gYè%Su7v+ĥ͔>EjxXU5hƋN[WQ7 .s )sX]lfJ?bŲw5OnD҂QJ$a[4l^0/ɭ^'kN | 6)ųHipTjz6*"&xJ&RM{cCU"vf$!V4w uRH1Ye brPyG(Odp!PAUda?I0a"ڟeXjl]]X&(VYl*v(+P-VwBy[FkbMLx1;h0t!2,1?V TwG視a>c.{V$2A$(fn~Er 2•+<3B{"eUwHml#o~6٦~bl,GMv2-/8(IS%kArMn]QI0NHsiՄE]rFG2a6C Wf̙lc c @^H.6E͞A,_Me(mvIzBBBBBL}k9<>#K3uyQQt93X-R^qV VhWtK/8cj$͘Ωs){?Օ=N<_2~IOۡa(ό% SGE mV5Bă K}Co2{y•cadL~r]נ[V h@T?l>@h~Ӏ>&׫|nNH@8]W'VVIY]5t(k#Ƽ;G|l(û)+aw=&ify MMUGXVo<,ԠC2ziit3-bbw/&ߣ0 !FyOQ15t%#ەZ<-Sv 93tA3AőghCݐ3t00!:FY#e ;5 l21;Xz̤jr7V&4+5",o#zK֊iE:C_;sQY܂& g&^Hrp5ƄYCr#?z8]ruզ&@xȉsb㻎;ނ桱7_W(n¤koL,]N "2~MRB)>ID$\񂧁&c7hEߜ "yQQvHҊ_YGof?Lg#|%m]b9<|fY)q@bД1K{%$@[sxNkۤ"*`6 &d#'oZ|HA}#ƌ#  $>?7}5ۃ#Sŋ/4&syb9Bq|ʊ78Vcmf#\p[j9 H&+jW&dbŸ:,f[RcnP` @h{D6WMy"&# >{wf֐!;aCr8~\9yaՇ!~r!Hd|Y =x$!Ԇ<~C$Τ=!C!zCă܆HjDć ! ܐjBHnCRHu!܆1w;XP]Ll$xNgT;v  z!@# SrcmI#[mZҝ_Ok#qv"J鄽m<< +HxEe8f,0˲^ô>B~TB5ߝNhL Adž=Z'%A˕ s=E0"9Ӹwqq㻒B"@@E$$BHBE8$CC.?C2\-x)CCZyaJ5GHA0aYYF\jz4Ņ#L6^w%l3Hi$RɢD;?]?hY@ a&M絣df$tזƁWrnOg<~6duʒOt]8;MG0 N1zqʈoGY | Nϯ(}G܅#5Dܐrpcnv1(8==綮R%]Q>y3$:՞ݔJvdpH#IG+QT&v(\,sAxBK Ŕ;*hDY&Ak١*Bu>J-T fRB.aF}%$o?퍯}oɡdu1}4gQBm?oy Ҟ(pǷuGGg筱9LCNN&NL2]S$O?8EQ !#$ C4oHuM;p>|@?o秞wwqW?U%w07akx%(Lv8TTJ_֦u|U>EwW{NN/%"}a~͙{`mh !-)}y̱IMzTbpޭI$IP[d_&bH;u<c@%]cUyV=ZAQ֪al|Dϐ/&ߍmy`$fgdʎ'?khbS0D|q1\}vܵ]mҭ#:(JQ/ڲ'`8` EbN/Q6ĚSVɇV,V7NFQ[̜ٹ۸ΠQsdn9=Ey5rѪ+[c9eނa4od:3 dUl[)!ϱ{'8iڼ 6~$ëll~3Mر@$9H'fv5鑌P wQm}^1h ]J. q֊C߸Fscm f)p."al ñv2͙u:̚МOfimPI}0!u_l-^\'booqC0`lkvdr қt+guİĉ$~E2Y~F'?ra[XFk"1|SGuI {Dh,hȀx]QzuJge011g GHn;|pLrz'h5~?_E2f8e!,&u4%_&mVi&&Ju:ءC!rg8ʍ19o︁<+O ;Jm.!YY&KIۦ=v<]xrń.:cG!aN Uem#0/3W|&cʒvh0N1"-!"> gI;]D2$ʢ@2(̐@p a 69;&FH2`I"l8L&/Hf?ߚj9/#r(CTKw$X3T83T ҾL͋W %ɞ%KsL}H"aGedM{^a nռtZ"3F|t5-_|s,$?ǀ卥i;ZMm{iJ%chȧqÒf&>FV;9XLG XoNkQ*yfC (\h٣e B0,%k ᆒr@1(3F{4{y>rG4d̷܀̎{7[R0[ /i[@^z l,,:h;l،.x*v1^qJCj!-4w.bY6a4WUhf Yiwg2%YZ{krSlF,3Q@Fp`NtrK80.tX6?9_\Y̝`Lbc ىӖ&-x )8$K]$Lz}o>dKOor Q _ ["s|%W9KTb D,\- :vӸ꠫bo/Q1 vaj 6D4?MUG4i) Y\(9&+Do) : t!{tY& f.!+b53aHЇk%2E2TƣKoƱzv/^"ey%]"밁rfPi/+p(/xҜc9ı.$\ '/O%f=;-ǟz_V i 0D!M5ٿġup5y]KJJG1)BF Yp$=4GBt.LPr^pдȐ@!e#O꺴\׃3 *9ehVl,h-`C~ Bz[¦c, 1VeRH%>җ AG4 ~Wƒ|. }E&j0Y3'#p^`؄l`r CSGgG{DFK"2]pիUA5m@Щi:%ºn5KIK ͏ۼ޺T.NR$DBw Md́}^C߰%nq4(aq"/h  ȀT9x4'+x 4a&3N&eDXLjw4iNpFPa8IFɸD]09hsK.(nToNBQ]EmV*-dHl5?nM<YO(Tp=d}{E٭hhD(v\ K !m zVT>fu~6oER>bL&,tjcV!m΄U/6 "?T8r$)/Dn@JT@$`LUq4PCYj4Ք! 2)`@dmd5Wt]d 1Z HUh`kSMm-DW2e']хWgrΚ|-h(X̅ꆮ*WKau .%{̯G™'o26ճcU g\OH3ƀ Ii)oDqyO"faO䶳#(ikj6xYtl)9)Ljg5o}G _&P#t .!1DLtR<R3lcŔ"$@ l&-O6K|㽷o) )杸5> 7OSwz-6Nn-'Zbq=3Q$4ؼm7^P=3Y]w09i[-[)kmɴ\J6OL=k(^9apZDw=u_\xyڔmql?TO: L<.xAk& 3MjI%i-9(q> @j@ǷnP˧VW?0f$$$H `CDĐRIƾK>'i6; k A XDyWjl0]љ fF){+ 运9Y.wy4{?} {?{DӯaFԪBjghrmܹJ}EI rw}1LBW#"vE*TJEb~&/NZCE<)2WḌ([eRK) @# Ȏ Λ^&ճAQ:\VDO֕}1"-Dp" *4Bvp®ƓG܌n7r٘KFt}KҪiI;6K2^*M5+CԬxB$h\!x4A.ǛŋGfԆ9-HGXl tU;_{0ZH3D@}g% rSkae9Ut'u,'۵U_k Ej44KﶖPR]21,m mL>r~wЗkb\ʥ)e&suD"A_, \ TD'ytN)M|u qC͝pwHmTMAsޭ{1 I?3Z<§h^J!]U ~LOy)'TKۋqtEP뎲X1/j`"l%Uv)D~/HB:7AO[n4a"TFr( YJђ>r齨3Pk9~ӽl|g~x,'\B)h oDdV~s=NmrYކ-lFnj}jkښiaUeYR/tfE$m`5['_^Noe{|ցٸMv/7f1*}i+!m;`v^7 r*Nks6(4#%'cU$arޛGAvYp}:J.؋L9[JYtU~sKQb_Hy)j2jb.=7Fܮ{]JNRm4Ų0HI;I%S-9FՓz]5+ö=\B$+L{ ENza T`"$Dț|#]# COEl-%0 @8ť"GiL@-d IgJ$|t-[o_7-osVב-7kc \,ڡZ&mc-oz2{lH:cqǚl-Qۮm;#g8fmspa6svڱ#,5yzm{}%|IJΉryk!*^9uq&푟]9RD6O?*| >}tߚ@\؇+T9p`:Ky-6ǢaӉv MDloVp. 匁"31fxuL}mf`kKE={lsK3t"zukOqΫL|2&7+ʏ p׫w\V,*"e)4@ChQhsՙ!I Umkή`--F&JO#FXQZ>/-8dy|2M rYlQd]TqMh9G ?R_pr~KTMЁDN-o }$$cr[+H4H4GBbxiԕDfБ>wHqd\Ź33^#ƏΑGqɛ 6NGW-;pR?l 5ɻz0TA "j)eZQ ^AWA"ĒM# jYu4c\t/QQ=E lzzƚKcÔNd"HwAt<*@*T"BnC\R+ \D*\JoHh= I8X]  *H_\F#{f^ BBϕ4 \D@!A& 6tCIӎ$gKMQV6ΆiO=Se3ndɵ@r"DRf@ D%%2qOd䰚ݎ\.zlIΙq8OZ?1ObδZwawq}.'us=1ޱ:$r Ƹ+^;"$㩆l6p95<1o_ߎ /G sBa=&fWJ\7t΂e yΒdHS"Cd(AGeOGMAp=r\lWNnDNAc? T~Ep!htGn,\+&'mɱ#I}sށADZ`8H! R ;f93Q#qzLh.n *T %jt Vh1v6i 0ގ:>Qg>ۓR9@El.WB]+]iKlm> s@i^ɴ1;+SM[sX;^t.x#M摔s&N3"a#"/ q30 Ss,27քf7aYzj+n7(4CoVf껗nBXk6Cuv;JJ;/`y]ų~eE5M44: 志+*->g!;1! =C\gw8jۢB|u^%S}ѼVHe9l9)3sJ9D <#҃m9r3ѣʒNL%Qq7D(@.q |=]vl6TlcwUW!l'Mu囖 1ai)A{)$Eq%'"RWJ*hD4)>beh@k_M# K4Z*ċWIJ3i>ZlRK@o]9MZ= oG~wA d,C~ +.EHֽ*ias{mr3 j56J#g,FMW fKNN#vz%-~hGcHŜ_<mb~1B[E7Nw ѕqqVOb]9 qӞgvk7Nd+уܮ TUSwCs#DiЙZ.CtYf͙&zknbLq\~pC7NwFS1Зh}#qº2I ,z9=-`Ob,!̋'8BZZ$>UFG?-IN~cqKf"s"֡Xqf$m(ѺA4TlJ$R lSY Blj`NHX.,lꬫ]VEЙ]57ZI:03 *MC; 2~CiomAͧ~=ʔLɐ}[ *υģuuGϺ^ۥJG8ڦі!JMњi ᮎ3޲jN .NGbDz=4dI}=a0S7r?$O ʇ5e5Txt>M%PāIYU^ja,̈ cQ8鯟߈9ꂈiGr[hnUIm.dԡ/V ',DqV= 4OQ'e E£Iu#*b]^lrgRzzMś.qܜa- +7|斚qbt#pniE~O)JWr"h,l3ePjllCR> .!: qCe|,Јaw4-;„GE߄1ZVS6>& •w$ &b7Ե:qFapP1|-J䭜ӒtFWҚ7|/_@g8Z"cmʆT^0ȟyl33< *m3]|R5=j@$Lks0ox%,3Z޶{ދYu! H4ʾR=rX7n&\)\bm yT+'J/a*ql4c:Nj ( +@{idiD[=&Kq\ZBG+'m[e\.avM7GDɐ VeOQ9**fSgFJhY+3F3.↳ad!(D?6FJ[KLM+S䇫% s6HP6N={)³·na tBN*!ʨ- c.`K AjuD., g= 'MK!4pՈm*: D5D $ Q">KH]ܾ3Ƹ2pxC@ C@eŃ& mxzh޳ ^`ߣfIٿ*Z~RAFh %.9ZJ(<ǔıPQMq1kn#hEXL!9.w7QNuMra0#E c, H)yfDڷR9QU3UXЁ $@ґ"72-DP#,;5;+ܛH<9k{ |֪8*R (2|&Y8ek44ۺm$'gc:ES>SRjIEA5lѐF<)><LlFrz/4'~wcC0X,vnoIe~c;,{[?fs_' oeu[!v~yJR!BjmZֵmkZ֭ukZBR0EG֭x|&[Wm4|lL[#hu|tͣѢ"8 Y4~jf&ҾmXD;f amxW*kY17'x}p-}^;K~HtcO:C ʈU5z,Q]0}"P=ڨި_pZ./ᮛEXG-7KP7XE( ٙ)HRnq_}:eE're\)IȄ$FSvH~`F}9-ۿ:MD/Mt0QO滰,20p`}mB{HyvB^oˏe"_7ehGWoF]G_[3J^/6Χ ̚ݔ??3YE7ٙ tdSg`3%??WGweUWRʹIuuaVDGamb@|%1Ci ]^ /->g|)JR)jCӓ~;)vyvڄ@㧚\Љ~HZ||g*:,БA.OmBawEc gERR9oyz0U\8l-N5ȐDD~VL }r# &Oه1zj$RSL dPhJ"Me7o$ɷk)۩u(Vmw`! \-Zm^yJ&YS!-*h%10Owac8c&m?&Jkxַ5F2ow.jݥo?-lR{Zە&ҥmny72;B"m3{/C,vROL؅T"UݻeQ!ҫ$$8O$ C$Voe[mNLu1a5^z'aIi&1Av S^7sQHVcö9I!An,v폼D?+3<PJMX.b%BG#1!tLvF4AmG4mm $ HYÛL{4dRHmȣ3}2x9W_ $!Q5IrYE\%0F)8?atdA HMzt5w Bs4Uh4gk'4X!D1RX0T (9Ԙ81)m7c Q:<-b'wGX(OEG-q T+ 50a?!S>[@ dlLV \Ƌ^@%lU'kD&gds91$rQ!i'LзloBxLlH75LHxZ1P\l3|zWƖ~Ljg;%jU8&a|js d0#A B IB @$Ja&Op-'^ԡRETGL&M[7O|xcOFMe/y|Զ]=H2@/>v?~!OTo{tUٸtiFn_dc:?էͿ?mC'|S7~|r]=_=|gEno&LnhϷx7Ȣ?=,1E꩘>rGȶyhu&Z~_ qPzu,@e)o"~lu MeZP,1aU˟2,xhtjy{y+Y,ˢg/iߴO>2/}u&OEs3wޡ30$o wϐω>;&?A=ƣ{Q|^m,?}IAjyPQk>c #("" &L$Q?̣l1a V3@p)"uL:}=z 911dDgVwS!*ޗl4`0W6|3vQI-B!Q4DÌ hr Kϻ~$}[*fTt!bo9C0iֽS)LXNHE~8TIZSދB~w?,_RC P}X\c  nhN"=Z2xy@lko~73ծk2[ ڝP0TfcdZ 40G=,U !m(Ö|ܓR{yL"lB'.իf?:_ONX+`^x$$ I$I,>|9miI${' ?b!Cb)A G(q#D$BjO0Pu @ }& >IomotVҘEѯM[Umip0p MO6$!E:azf~ȱO9)T}t-`O0y #HXӲê\􄫆o q!B~#MEAQAL> #Ѻ[:MmE'qM%ng ")FH87(a `²Uz6ҕKfүĀ5}Uhr 0I9~w o~ge#T9qW=[0 Bg*[ SJ6,N!K^uٟjFAtowvl1&W,J]zs]ʹ {')Hܒ}Js> l!]'x(AB؈d%cwJXH=<3,-\vU &`0az?Z<$.=&0}FD,|%=ꂈAɩˢpHYirкύЙG,`~)ɳ+RA]/tzKИlj+RԚ;1l{bwA̟t20S}:!}rO}Ml5Tr15?{D̜2rߖH P\Rk:}nj$p~V% qrh"'sAԠ g=_<^@ٰx'&+upTvC .|lQؠYշ%٢vP;zᠬ㎇rtxkSQ/D,v`,m@޳]9ýzPUCȮ?G gMC$IٻV?q4az@_ǩxru*_+:s6FgCtCqZеo$1r( +C1ynx6aynXw'!"o6 mJKb_ˋݸEFYLlYHnF6K˵[\s]N :S)>'h+g;ѲI$ImoIAM_CtCLEEF +мwAE~:j?G pZ0>~~@~hym'Qi- ,s`J=2VyڵCXG[=l^==v՞`Y!yMS4 ~-lXg^N1,uû3};=T$>O~U# vjwX9q )+kަﰛ l_/+RL}CeyY|YE5GO& 3zfu_e)?)AJ!Q V-lKIi ubwkC jp(j #mU'`}WC 'Lm8?3v?ӓ{6_CsmABᾣU8|t$d l9l G ꂈz"|?\PLVcI??2o|ͫKU8Pu׏=<Ą=!XƪK,TZ:_ZRm[v:׀TUW[ֺm2*55W+{{vZl%WE`[=@@!@To4| RK4H(!y"eB@ AJ"z~.'Vzp@AD*EDWGp?r!LsHvŚ*vm`@>S﫟,,J _Ͷֱ%hڴҚZՊԖÀR% F"9o:{YC:Mi-DVEuN_J޵r\Mr~*갫F=P栂cVY$_F_.ڗR‰,XxQ%kTKgT5NObk؆4;AdZV/s]̙\ڟtrDU߮Ȓܲ52,&qa>{B.8[֑<Db'l7Bk 3q(56;xKՃe < [%O*{w|6C垿U=>ekOO$5HJrծDez>Yomߑ^yRtXCUt+0eMan]XyK{zSNTB}8iuRf!6CUb0D7kbćC;8,^p{zDz\JiU>H]{ V<βQHJt4G ]gq[š/ۥD߄;2T6es% -4{M~Pzi'F߽)46oy^}|u;:!gs>tu}R|ɷש{~U[Ɍ# J3?>0$& }uH`0^^'XRg֯1F/#ǏJ|jOI&\s8LF9tO{ۮkLqhF&Ve}k;XDVwg}-6xrJΰYR߼OZ!qQ5>/_RZzmVp>fq7cN6ՔꙉFfU;N!*;^R8pې#[3ɪ~[:*Cyf\vb6y9y[<"V`u䜈w\2GٽNFk '#gOlV>NS睵*DsWNq]eq {$V>ص$R=TizE1y~Y*zLzU^{U~pCqqEB366ᄌS_}כ~[ٙI;ݡ{|K$i';q J}9>_{UUc;e>[L9evBwU*WG&|ɑ7UјLh7}pdょweޢAgFL`̪|)}6cRၱ%h6y׭TvΒ$l(O)STjVnaΔqC-ܵa1 9Q9.;&51%IxŘޢֵ~vO+]U׿4'9Zט=gqN4j ٚЦ;RzM]Oa5e7lAƠQVx-,3XTFYwP'3 B&^`0ٹӮt S4I8/e9}n~I{G;[[g9VRI hlqg9^M]9uz{` ~ϗ?)g Uyxl=FNـx I$$$*]e:qݖ:Rrˤ-vG=6<* #$#~fcW|^(H[nwV̖}6.%f#ڎpwo4ol~ХlZHIV9sH$0ƽв;/YHUji CͦUp])d~chCceп㬉ZFvã OAS-(A#O5ΦzoEg!}qfsZV 4Q=yTZ@iCh349iv7XySEY ]zδ Ѭ}I_T$tdE9u!fdI.E|~X3T*ć< 9+q?#qb,q DK`Saw 4\ʱND2.8Skqt8&o3,xo~o;-"]/(04 }_rss]wX7߼uf|ru92y8Ƽygy/yfbΎ[ƫli{Cm袐6(!QLxD$PuQE]a:ӦtސtM#FHN9+gz}ɉBfNI =^f)R.\42f>2vGˆ=|fĪǾ9j_w?S ̻MY|<+HCVJ#n: Gԙ-JQյ96V|-;<T]Pf 31^AQ,xI򛗈wh \zלVT/c^:WT#8Xoqh/<|S# z/qg/gsdp=zsYp<;+^{ۦB҅M؋"b>rkYGZ8;$EV+g]W=y8BKINa*O\ڼG{H7֖GǯgOuG{[Q3>?>}=`19ٯ#GDZהB{rż3;OMuϯ[3s7qWcdMTLfT2}{z禽{{^=Db|PNuLa^ sgv=g1'>Wq}h֣#㼻[r1IdF>yvb#8snόgڙ#e i7{|xoIQfCUN'+֣k6$C*eg>iAq)a zٸ! .cXQC>.q~kлΔ$a=N'u;f[4gڅ)0gZgZެx*tF>vji3y07S{Q2KR:,я4ВBkLmQ'1+Q 81XZ㑨eڲKz]A8s֎{?K;.$vk6ܣ۷;kϱIe$)ۧm#kZc;{(1*@@9t$`H˭*i Af_< ]Cx⠤RQij³ؽiӯ2>/83f=*g3p6}$1Ә%`ʆ\YM5qOiWo Kcayk>y>s?|xwޏ|ϱϫ53ߺ \f}߽}Sm1JD5߹k7%g >SuNA\c|\ֽɏ\ YSYrmh\Ja@&y}Nn}HXiRØsf{"T=8$!!9*aM]I%3~7<^hÁŸBBsw=LJ϶le^#7Ҳ^}R( y}nB|XH^ ڱ7ו\}Ƶ]=[NrQU+X)6gܹo=r=OLԹ ^;1UwSC0G{̚V;'|A|Σ4ǽϞOs\Pf1q"svõ;j 20NP=4_m`eooے|>K w~p>#suW-1,8:=9/hf}sqN(Jt-hѥtݩεspG1s Ϗ皫o,+ϮqNW0,[Ms{`B :ٽ9$"&BC:%0z<󩷁(o6n|V]i监^{wDKWkn|cQN|%pقz7N/UKӿۼb\22lb!|xW6{ѫL8_ѿ;:,N<>ӈh|/)G޿k4+fv}U_AxoZF澌V3Ϲ}]&׊(ra5a)voUtZ+ES x;8azz+sxvqk'+{~T1-J-\D:8gsG ?rsV{+{!gy.4y:U^T?^{^}A{g͝>'d͉|(S?SygV̟Tymsܱŗ{ݾ<\R^*yj8?&Rs}ٰ5wg7T]mbxz6k)~E`zG\x=1L ֍1ś{ͬ{7ǁ,8|Qk3"#sS}}&6~CEO^ fÞ"J.[ _\Bҵy2ŢcHƟ#89D^^qȯ>3q}&fIDI&̭N(OK#i]rx( f` YGuODB'ooSo1j{"EJ*buX&`s>8.eXpa&Uxz!19\FB^m8;sF2')}1!1+5/ᏺ)N}*(MzZ!ȄUƞ1s U76O+Uiw9kك&Ta.aBl&M4o{d[m#m $C;7}ô$SS4:N3 IJ"y4>CD7: \f#q.Jj̷',PaJ0<͝ey3f6mȫWqe.:oZ;?@ü\V?c{6!ͻyښ wzbr<۰J1qi,?y1G)i9Uؙ9}i]s!}vI7=P9Unۊ#{gZ1PXޏ(ױ{O4Rxur<чM:ֻvODx8-^4V\2 aA뎻Kn+ 8$#.-P3@2Ha'L <'ʹ+uʄzqYbϽArIԡ7]nYϗGu޴[u/D}zZe-_m(ޜ;+X-ssHꎹqR`L> \6t96ս#׫66ࡍ.o>NX9(4[NVtHHhewn"Ȩ)*pdqTޟܱtVkV+N{H/SQs- ;n6'|'}S+Lxhfa i jux70E`_(^[lZaJqORO|#G:̬F֭;e7|ozj \rVC`>_+ݱW;5>} ;٪RL>]JM%-6S2@[s3+nUNq*KB@ &oen%_k}{71^/SLM!F~o r9bvlKoiw}C7SgYG7|ELqH~_/~}B崵['[׎km L(J̞ĴUCheP&%>sb`coIק'#-s!%}vV.c qizx5yגbl%2wqg4db"ZlD{CinB[U^[P-DILTRJ1&lKA׊ ^'N}PwæL/q|8u0jsܹz<1v̼!#tւ 8XYK)tq{8ۙp$:wYN"cy IJ瑊p)PA3 h˴4k\DW6fPӌF2H2|cE~>q4IҼ5CV7c<^zQ;{Z7tK+iìm}q+ A֪j"1nCB%^!w\t|XG06A];DݚBE6 `ƴ3 tm]V>|v};qD){_~/<0pM',}Kfw'lb!Yqݘӑh%T.XCZSdAXEͲP;zʊ{:hViޭYϘZݿݛ(VL}ZxcWqj'֑e=P5!"-ĴS8B%I(p|=GVԠ[4pD<%7 kX [C*E1qs*+U=])<,l{xcf|itVuio}{[`#]}զ0B.>};XBΦz.v=cbyZW603ɏ2g0~{GcCLp >YxUV:0{sF:s4O}MV鈹˾wXQ,"Bq'/ y:4I\=?ࣱx+q6CBF=|+nNU/|k0Qy=B%ո΄7ΨD[=ۭ֍fMʞ_Y43FH3,ee5(<=2 0 RBf.Jcǩ FY՘"˜dJJ350FukS>7n0'QC^#7b%ہ)! 2O!#x9R>7ŭF"mq.)Y7ӳ•CwHL'D1ciʝJtF/H0.6fg_y9VsCq{DYLJ}nz@XqN@b5WoMYÆLC^fcltj;9z#fȁlG~4XN,ٻxIZz:4}<4p .da\Eja߳kk ,KWKk6,l4-['F}sܾJ:G[[Ss S::Ls)6S'5lCKǛm2A6ow26*cJ1*"d{Sben8Qm\"\r'u&$|z_: ~4]eݡucאi_)>~v KVrޏL.l2Bbr eARIF1cIĒ)SRA:Mb<~/kSpy=,ק8Ǘqn`אhB^׏Ÿˎ CJNgDzfߑy;|;&dkl滫6k\qΓܷa,+s-1C a]e2R~VXbcKc +B!"6A輜xz y{u+ZHVvav:_&GtFZhvF~Yn7aCIqq%yD%.FSoZ9iGa0mA;3,Ps_vVe#tl/NdIyy"3R7Qe/Fl|xǹw2`m¤9h;#'^}=<BP'}1NyC~F6;ȂLy~[L5>k5%)6!.7^`8G9x!Mysl7EӁD4c0>ul~lgF#?>R^8hK;żӰRH4>gPwN@ly_iĐ; (>: ÿ>7,Q.[a.Sμya/yYt$B돯?W,~HL\^|Hczj&`ՒeP)ɸQ5[ t qFZiB8+"fD; ;z`ߘ_ ^VQi[k!Bs"+|1.7rȚ<=qbHgFdmj@rba΅ӣe7]M>Skp\4y1~?)@59vS-eGllFW!{һIxW[igHģa8d$plGx,`[P>!ݶLU%diGwDG *x.X$p@Bo{&[*۫%`wKb!a#q?r)5's6acs?M *%MZflPgv추if.͸$28$#ߵ̳N/f#xk\tWue3n6f5j;ϝdU<~O^"<|C'7S>1vxafs)G#1.iA I:iQ}8.1i@e}R_iGu>}Y,#c籹Xx68.a珘m/c7֞r;kE B1[mZeu6z&Re8r#:rr<n{9>D$4t I'  =Tc G. —0֓i&Vr2s}jƘ=NzD[zKl>j Zտ|Ew`t ;K^$ޘ};_>9vζP#,g"#%"yN]&M^(ɂnz}U9(#^=ukcSy9!.8\<2[Ihfv)!JW5Sͼ=P]Ñ9CnL,rcAypnICt\Dß&Az.ŏMQ$7>Z;U &<8rEEބ31d+R<)+VPC$m$k<3?S;E=/3W*zXa0QVOu^s) 4!޴O4 a|}0{+!ufѭO FW/oQ6jN!O"9ۜ5 Jxͷp DJ%tȔ0U,[^آC J+헉FHK)8^n[ꍘz, 칇MiA*9o,A3NdAnCDߌtB#3.rE"u45:LKn^.%g %­}Uc xMw\Lj]di5{x¡"SNl;Sř8i*CKT:ftE2͓sZ|Îdw+[2k\[KXdg/l*}td3߲׵}RӶz{ BЊ>CAU.lIJ%@/3&5xNEia\)h`R1lc2w& r7ugӼCS'w2RfY H'%d$R9 ѶvO҅3X3[{|\ӃhH>cL]t3Ñ$&W,8 U|HX68:uqNܺ7+t]Fƫw)%3\}yt:pO`!'=Z9دy6F3fG .sOe2 op;_^/$.;sWIy^ 3q#7 VKra9r+Mj44!uZXi->gFfomhnc24JIҚ8s#P604{d&'A #H!y/O=lĦ,69}à":o@@o>[׽1 }Q68-vi [<*lg@]n5=ijY˗e^(>5tR8>f3>Ϝ=V,J1B.Y F$ zb3g]ZUyL cJ4ğqs޼:H4gHU+ ߚ/۶-5m 8Sv v5}RMA21C9D.4(!ye`Bp SNvY/qpd-&.9*S}n\y;0xǫS#wrd7%lYL,Nwm > 3Ɔdl1[dCrhތ},=$MWDz$S{> 50`em[IrE*gwr0Z҄wtQVH^Dei`H}Q!)b7L}zNGժ:ɋIZ T w iNLšeN>_x[w1#+R94Rt(o= "jޣ4{DQu s Ib{M(^@C2(T0@b>)qۍBM]ƌ0\˶C&`F 1!W(q3,d|}׎`Cnk8aa_ EQm|o6oe48Ō1i֖B-52yKDqd 2^)CSV۸O7-e+ yG^S +k}+]<> euq&"2>}"s'jcY =ǕSOaҽ529.Qb!ݿk P !=$gW7l8':UN<̼8MCsi#S,!]nf3a3{Ɛm6vj es8sl'PL/kJQ1;>Ɵ'e{XTxl Iҏ)w1Nw;ߺ(cG¥|YK& nwO9Zl;qKKu7ޙ#Ά+Ė󾝟So S$Fnq g=50&/. a⓱j2w9qR6HŬfi̻jn:.>.M]s\dDKYy2ӈ6]ڄ8L5!(6o[p $cNִicd590mdʹU`仢. 9k 8EMDfExea|DVkaȷqZtm|Ksf~967a Q՜љ<ü>u :,{ϺոkrOC3ÿߒ!`^(`.b;`Wnc$o+ 3*om$]È%!WVz != 6Euzx- Q*yJn Ld 'rIDDĒJԅF .1B))lURVЄMN-L\TT jg/A*-D SuOcR7U'5n; wGg'$54!G;&WĕByxPEKp>3oՎ1ǎQ [nN|+ =eQZ\c9/ _3RѨjZ!5|ҋ׹aVE-`{ w_k\N)( UQh帪i+#EJIQoY\n_46]n2]pkO5IKtK~%(jqA ]MUa:ѨҌeEi=In'QF}s;w(4a&|IW&e\S݋L0o rDm=&PK1>|>޻mQm֝3an>$87i#? t޹3lb8gһ1ٺg-mHIg8b;cZ4rÿr#f4fOS\+çn˙{ѪW5){ޢǨF jYN99Q3ڍ/<Ƨ}w<Є`%ͨ8bX|yntɳ;n]>zk7rrXNTU+ŨUUn*[K2u2!~'I`#ݕ:p>)}%Js O3Vh&CFL:u ~PYμG?Fua1.o& {+<@t!qvHie6GnI$t"N&9RAtLJR[,cCMsuΑʺM>'8 0IJ)$ɷ(gꜥuN{02&d\DNr>4IFqyvL):d<:#["⊗< ּSO)DjL˸bV.5&<^S۲9 GsqQf,ްbKt3{]~xֵ"KAq{BgodxW8ZgǸm5&"p!JȎ"2\>bEM dg&}ʦˬfŧژuyxs;O.qFu)AHcŮmwXal$Mf=-0iMNK1Eh@cI&B_yy<&YeL 0;?nn` *hЄZA#a]۞-Dd~Tm|2ZDɸ,gaMٳ8F}xd6`vAĺa&I|;oʏ A m YMm@tGta,_qˉCv#WqPvuC4艫>W|C9QNv] 0wVm}q͞'S]zςYLXL$g5#1}Ì;gt=NQ73ү2yžt(xj3s8=wݫGp:׏|9;~x9U}/FS^k_g9D{|7E4ww:ǯ+>;( Ƿ{}Y=Fo~}yG;8xq{k߷{zm#fO)'H-'E-vuot2g|uO3ҿGau;<דxu/\99[ %6^姜]tα}y{W_@"W"c(fN$Tsf4<6yf|{wݪ f. 6&GL~EoBL("RY1q

#'sbYA2f$e4yXfr0tw@oAfbS$EɘptRC"ʤV!67 L遅[ +4 X`6.J?npe $ Ou!/tY2;% n9$q4qiR$r8[~]=<]1xUȤYQiWf`BOGw9y@~`xw˄bwKKFFqR uɳ'~eS;wnSWxzԣMbd!OS2eLۓl+Qьll`Ioѹu cc*i݅dZMe=$l X`B!1_>ھ>+d!0;מ<xy0іCj(Ƭ2|Gc4 !#%~BwumؐxɂHۆ3a^GG|@?gr[E[̉66|I]f;7рVs/ڷoGsD턶iѐ,!^nWr-u)#!đ/țL55[¸:,LZAjLDnZ«T|JQ;j3pVӾaͪUgI$do"ԲRǬO3 ̚wDkM>Ƞ5IP&`4/!S7}^0ϸI qJL{ G~8|M=AcjAHd,"GوI!UrBy&-+/.ϝ72SeCeZ:r r-t<@ilxW߾}~WVǾ/1 ̄Aw R*'(#&!Ȳo)n L.T]L8ctZ1~ձv4SWm/rOˍY.B4jRIgPWQvqὝVЋD˪_&0Ng7C 3FgZ5P@'Q홄MA!Svc?QbYq0!ѷq_pmxuĕr R{Wn0ƴ\# oj.hdPw 'Lѯ BT"<%R૴I7 ȇcDn` FQ4FdEUBH# Hb H"%@PCf*DG QZlo7]ױƒǝy`/% #ό1%<Cʓ.nIy2N[}ږ9NxxWtm%X}&A *[>, soI^kOJc+UFdWdba3óJ7 % \y}u6"O8wkO!!9`}HGgBpko,} F[wW=wo{tJpd"k,YF1y|VW8G9Cj1>Sxl|~> >DgP&(xT1["r+],F/^fl"9Ns돞ɍϪJXF@w*pj"ڼBLCm044%59daxZhu5/vsn0Rƽ$+7| *RJǰXuHv1/:N|V1 ژ(<܏S|^eDmtIaRڨ0O6\vw#(!$K91kW\RQs]oʕ԰1K=gM㸱(;ߘj*S"0~s(qcKesco%Oarh/yV`4yחTv "iBT yO LВ)mIvT1~NfO<#f:6jSauX`$w֥HB²PQ%v$ť+,cxXi1iHEaoF6޸Cx5:q%0f"j+iKmhTf-ݣ|c8%6Ҍ)bƪp;`jp'dR$( ^ft prj/uIj4r< /6KY3W !w3hK_؍/h}}ki!2 I$lXTa~-//=,̹&'邤<:CI|"啅\Ć<\ʖMENAg ̆LE29^4}Z(%CJfjLPyٟ+fztqY҆Z8 .٩ Gk"&>ή:D.@BS=@B&)>$Z&G8 b$bDMf|2K~bPfDu3`H M34*qP׮/adk{w{Æ9r@lQDm2kUӭ&d !G]6iBH-8Ly6]tĉ7:"^ve^8Ԑi3$6@(B% +H\ M3#V*Mpx4moO^M'Au*# l{{>|-qyI , Pxxu&Aozzz:iWL!6gv:e ͿCs[7ǻ#&7O13"Wەqw=aK'MGOuxg5PLGwd<:35%tș`iB^s1뾚İ!|l:2"#_L]n[l# Pf;T;vkȆӀa|XOwN0H9`:㐼ȉ{n0} Ho)C%̲4Ѧ h))9iUsw\n'˦viQ(FHAn&jEZQ3̓!34# F{YfdcpV*F;0Od{u̿rjaT4{O5U(%&KYEVwd៱ؗ<۷K瓼<|OW_>.E<J3Z<ߧ,ywH1KmD,ь{zI?՞Z%=Xf;8ccAiяcyf#j׿w]!ם'B&%ެ}G>/ukQ~g>5w(ϫnEpǝTqEDl!Ȯ2!tUzçu̓5>zά>ylkb߻i"Lg4qۤ66/xxW0.y?3U9:v[4TR!("oKGy= yxG{ؕ˘cufάy1VLt>4q}\Ǘz/%EI֝d-}gߝ>/<ʌIYSZ>s{z0}8[YНN-VDšzBcݝ# _=W z&Y#o #W3/kHo5gL":[><ʢ߳sv$?Γ_A[1 k9GpoFc};V=d"{svW絏s;7~v yĄ9|~φqLc>߾h>D{X8F7F_uyb;u9Y|F1<ﴩsSOJ5/cyc?oZ~{m0w-|3yiWlN} 㾝ZqkI˭7xy^&!P:8! I&`m,9ڿ̝'n<2y¼Av%$qZȸrh׆ LR> jy/K֧93:U`Ť3y2yyQ==EO~M<0mZǦ׎S vpU=ѩ29/Dv#37WW2t$G-xW;>QQ5O1dF91{sdpyq> {џ[ZG޾}ʓ׽(q^;v74k}yhKv;ri->IN7#y+W#u1#F;M'E*㉩,r֫vf߼_=Σ 1WXWmUѷ}n9ǟ_s8x>o>pݱ{HE=n ߇_y+P:*QN^6[o~֮!ӑ[}UC{}1ܿgGtVjQOq_t}F>=ΥxLG5qėo3~Zgkufy\?E绍r/xY8w_,8p>Gƍh%i Xzf嫵>a ykF+8S4}+pSLNԗݞVdϗw%*6FEceJ3$5.ЦW}}yn}-_Ǐ܏<.T4˔zD/+̢Sߛ)^H#]y|;rvY_sU/|kd"v^#޹xsOB#h&;M8ˁöժy=3:GRV1c! W|p=bwi8LPgU+°Q 3X0(@ 9,FĂ7:SBq'{ L||}9|557zvIx<0cV11cn\'鄙KR]#1$ubHI!&Lt\1Xpiu*\N$7Q@IXДkih#uD~ CV;#IA ""TZQeTi Z yx k"^.ȃ&! b3֢ o<6>(b@#3P3$BAs2&0u`JƖJ+1` LN7p4[MS|__z&6&>!$FY]K۪#H`16QBʘs (PΆD`>/gF]h'LZ+66cVL4~ zo[20 (HT(e#5W E4sūAxH[$$IesCXK!0eQ҈`cX+xE4pM5@%Dӊ `@ŦD&pȩh\c8xȊD hʴKS}k(?˭|4P@~>yo_Vhwqg;1i04-Fz1lB勑=3f4umLl[@jν3m~4u;PO{Ulٽ kqpߙ3!̌oPֲ9|0 ۡ8}z/6k&k6ĥWf[[{Z}h7iن[pTx16 )Z7M8HBa !)HdH nȞ&}^cQ['V mvam ?ϔ?=}_gQ1~R{[~G PPIbWElڔIM)ImhgH kYU ُVwFK55} ] B<<S.2ǐ'bWmi$M212AƎ/Bdw 3@`>UU`}!XFW40O>F#Ȕ:4b::nr01UB^6*cX.1 >f}^!xKYGRC7)#FED?UjHO}&T̙pA6AOg!#^h~9D  {y}{}hB毣.`ب6=/F}h4HYɠB8^ƆeA ߮}=5h,g;(Xc}d퐈08ߦ "]#8s gI߸\%Sc>m L kW\Gq#¼4@4l<đ\XX9y06Cwr/h}:Wl,uĭرÁx]~>2z _ $كFekI$6|.l^۝O= jmt KcaMQ]wq]hbQI` 0aO.lY$k'Ll L?=$S~|d8/q`UU2&,:` h>)HO  |{MSEkoe~yxuqb> ~VxÈ*ЍPlQe*}˞6M=_ʜgRObAd~w*y+&'1dFUJXFe|^~bů^MY?Lt#^ypT /Z0 o^I c.>ьY]?W-)^]-+%`Bѯ)Ү΢q$JSSYWfs[3|1.nIk|.U}~(dH|,]Nz0[B*j S5yg/ɉK(DO=;?۫^oˁ0Œ%=ya,C/ٞ2Y2OHB s%qIChUӕ>JۼBb呟7ե˺ټmJ*!Oi! l-ǫ(Q%'f,UOLdÙw QWkD%Ex*C><<\QK73q>'mE>X쪸k[;gPog$oTlR:JGl +>ݶ_0 _Xgv9QtHR1֫#:1dqJ+ˈdB]8pF9<&bHD`@+QFUU- 3S]EkH/8=w;JiBeemŃP(#QM@,/Հ3:ȓO ;esVQVEW_Hh 8ЯLGyG5u;,&=,{߲8^/+a镘MopWWxT%۫.k71OYzm9 gAfgxs I$  0˳qT#[:$<nbx )Z*e,;KtBlGU.p#?_6 Ѳ/S.Ϸgcfl|ʊt!_Uaˮj >/4D?q5'?PU $&&CQpAKhAma5Oϣb p҅Ti",ń3 u~tFi9$P! &Ai1:48ʉ̔K-ݖI\` odq -xN'0tg;*d_D :%`\7.b0]mll}=f_8@|Ma2ñ,PڲyTԁ!|439Wl?N 37_yD~d)D9htR1HRY%xVI"#dž.7vq}W&Y]CVC)3'nZJQ?gE~b\xڢRJW7;R|sǟyD&sƗ[dmعKd9x=߈9FټNAxRwbmԚe/-/9 B!0qHFhng%7),kCZ[ԑ\7c8ebݲ)3߶p|T&"뮥] F>цMw؍oTc6Dj_*άbb71b;~OpEy;Pj_{p4o턀m&swww H cMsDfWvzkNcɆSP q*܊ rKlDivH3(8]5= I!]&f&@1N!N21t/pԸhrwkC[ Yc7jc`ǚfF&}VhO~` qwLNtWJ_/O:N}! /~Jbc&ߟTp>N icsM1cwf?<8heVZs)!}·3nB1$IH]\x>J|d@жf՟./25u?aѯsVZ݄! rm#*h&(ƃ9gq=l/BIh喢d)d:Q| y0`?EϡXd2$r~p=gOEAgh"j4I[Y#PahbB $IS]&h\MFI Lg(B[G E7w jBgA$;a_:)A*]SPUt$I$I$7_R`H?pumSxB,Oјmc[ѭ'hƫٿ#\?/Х3K5k6Aa2xOV $D$HVRhTcl*&c&lYD}C3 eTT9/mY7aC-RG(EΒf^ƒnVh]i``#Y@Au1[_ :B9[H V&(w3~~ȟ{&KQ9BeՖyj#&~)E4X~r)a|}Xb`b`A%8epOpv&S1qz#֚*VZ@1y~UdYEC'pkԲJfMo[kd ѢYIJOmӞSHC%}EzCz2{j98,0a8zb8CcfEƔMEpmNXrcarSLك5 $Mlk$(3Cuph,Lkc{Ѭ2ordWvލ-yO&Z bWm9|\KE dQj cq{>+~wnj^671zmAԤL r @'gO a^cUi<]7bLoW<׿^mꗯm!R'J܄о_#^ehurNnvjD:Wu>@pD<"N\ZY%j3@.l aa&OlQi6jCm`Y>.Zp+ua2tcvfhl26GLKC":lk]{x֮j6&^v]]ԙ6b6e1D,ms`|xm4W%+y=oz6$ Aj1FR(( LᑰnF 斸mKb!zbC&2N0c21HreHm "D&5Uð:>1S5Zc bL ̛5xÖō"!"{Tc00+kO$=3ƴrqz[Է+ƛ# kh]M[px,M#iT<4әc6uK:f*ZhllcyܸmpGrsdN$uD4|cJa9f1BtS7 1TBBIcm& &i$u ӃhAl֟3v̻}9q> KC;u.}^>cCa{]3 ,-lƠtaLJRN"9$ZKˆefDtjY(`e3h@3dP6>qC  xiX؎=@SᕭxTRf~R RpqT s-^(z+!k9H$2w$,zbاkUL\$U &ƓÍzZe`ah1"rtSVDn@1uF8rFE%Ҷ0 m1a !l 8A%hz} LF4z F6c@Tzk5 L Wx1h:4Mf1Dz )TI[n&H4XZH#3 f, &-]Em8نmҚkCJH1$"SQ5o2gDZg j0c*`p6C!#n5 H> l0(i:H9w\j)o5$.5+7$aw  @bE r]if鑭H p"\]pml66>^]lo'Ĭ"FHF ޠE19q.:yd8C1m3cbָ⦄m 4Dm!֔-{,-euƵ EY8ݯȢȂJ TC=w!<)N{E&JgZ6sm3 7 b oeD1Ch76ZY@z5bœ`݌$i."T:8BKmץGQC64FoB3o %Fԝx%;"ilm 6m R:nlhэ.Fa w4gXQs."Wk{ӅvC ѽr`+{5ݵy',h*h; {7 r  ŰkB]9Su$8(dA&WLG˗ϧmzxn:,Tb GР1V`)AA/!#E!-4Q83׼{ ~ 1O"bf^t]u$b :hy C3"#aT)AS0vX 4?hC~Yr&9}vkn9 rѻN,jLZ&2~8s 3p|K|$Fm] 9uhˠܒRGGH4۰)}vݐ7%CMF`ANhDA҈S/oET@y7pXuu*jDqvTlr[[oR$6ɶضh[[4mF5TTkI-jhZjōZZ*-Q%$XժaQdڂhj6ōKIh*6YEHQkF([QRF,`Ս-&#mQEkF+h4UHœZLIKQRX6J* b5&cj)TUZ-F$ͩ ţj6ڍF,XVmlTdōFcXшUVJōIc&4lTlmQEbVYm])Q[1`Tm[%dE&ЛDm E*JDh+cQ%d%FтXډ-ƤIlh1YMc`+b- Qh--(ںkmȠbQMi(ƍ(mDXѴDUFI-mE5MTT͢6شkQDUFQbѫFUCi,X@VJmlEIZkJd**6lLbFت(jɤQZZbck[EE[u+kRb X-F شjƢEXcRma5BlQTTc)Z4lUmm$j6B5jJ5W()-XQEFTmP*bRmōQEV2 ̊5BEi*#lUQFhTI5v4hDQL5E5эXMvr,Q"*#FM%bѨؒUMlV6Fة5bTIQElJQm)cbv,&ElmZ$ki5mDUKhij"6ƢhTdY(5p*Ʊ&EmbFF5bAj5ci#P(5\QZ+DV6FѴi5MŮ)F-FɊ[(E%Y۵'fQH5ʍEjV5E)-ˉR`jMdZ1VV-mTm]5֦b hW-sdQh+b3lZw[j-fTFr5m-]+\,Et-6+skTZhm6QsklXcRh+nmb6ٚ1 QX+I6IXpѫb1ѫ%E$X5EXdōc%cB!ƱuVj15b6 DV#-,kATU6*(ZdQbۦPjJ5#EFmmTmY"h6hbV`1Dm^J`A6,1AD5j[Z bK%hEV-UUرU[ڍhEdlj#EdTTkcQbRQh[blѶ*j1]5rQ[Emtksb6Zh"Z&U%ƱQd)FV4h5M5XŨ؊-dvm5QcQlm]+rQhѨɲ[Z65Qjchъ (5ZҮm\mkr5E骹Q4mܶJXsV mFTuZ5b#&VՈW-j*6K\Q6JNcbIPQm`QԆMkFlmbưcbѪ(56f$Ѣ6cAbZ5%ٕdؒY dQTjF4m5l:jAl5!hlElQYjۚشkEtZmmv-hZڳ-kEUVFFV*:VjѶ((XmccEQ ӮksZ FiknVdؤ*HWKW(+& XhJKnlUkm5`[cQmV#]-[W66ڮVQr6ƣI6 ō]6QmMt*fh"ZMlfY6RX66W#lmPܢKVjьjBűcXSmlf[%i ITE+ldU[ѴjdEQQE]7+E$ыb&ԛEbYI#Aj7MlmNU\Z]-EDQIhV२61b6hdKTbXEjHh"&X6j@%%TIXE2m #A[QRFJ[c[FLY*6%Fmk[nj1V QLF mŋj6&JڶlDjŌQX̫H֪[r66 MlZ#PchƵk]5nF1jŵj(5mTƨkUIXEEQ`j5(5A+cm,llFѴj kFղ[ENjܵkIcj5EcFmj+QQmk-ͱJK 56nmkF+hsbeX-[E)4 UֺV,lXڱS bFV UQE E5666(X1j55%h4mQ6λmEKW:kn[W-mWK,lmE֒[YY5EvܶF6]6dMFZܶZ"ţl,UU*4),hՊ-(ŨcZmAU[ըkEjHbڍZ"KIZ+lVFFJEmbj-R[FV-mVmlV5UZbFmh*h655F5lT lmFXh4d26dmF[Ɗ-*h,lQE `TkleIjQkF5QTlTFQj"TmTj6bTQFh!TcA(h حjMEQTF -(‹EY*6TL[%-QlkE@Uւ!Y6 EAѐh1U#lE51Q$hF1cIEIشVZZ(V66ٚ%E(X51XclXmͱlklkFأj1ZQS EQkfɱF[bMV(*mbFѢɣh4j$bcj4h1i#UŬ6(,l4Z,"ZэEb%UZi LXV)4ZLk&4kmVE,Tmh6ѶŠѭDTmQX[h,ZƨŶ65mHmh,j(1#V6ZFb[b4XP(ƍIdhPFAXƲlZ5R[X5lQEhF -jٖ6kQQX6bѨ1X#XIhر5h(5+hbhdd*ţ`+Qh6Xd%J6D5QeA&XDUXkFmQ֢ѪѭbbkUmF5Y4ccm4UIF#QbڍZh5TP#QhֵljV5EEF֤l,UT!i-FƬTljѶ,mQRhd4lm1-Q+cZ5Qi ֣V XԉFlmmFkh"IlZ6EQbE3mضEQlmVEEmF-hڍmVDTmcRcQXmY*ZѶbj5QQ+hQjX#bRZ+EFkkՊ+hڢcUZZ[UTj5*,ml@EP0kke*cQI`XTjj5Zьj""JhնFՍbTm4bƪJՍƶQdQkmmQbժ֤-F5+QLhEXXыcbQ Q-*JƌjK%hՊLTj5F1mj*Bi6j4kQЛQh Xcj,Th1U4d֍*J1EV$,V(DTV-1Ƭ6جFmZ*LX"X(#[,j1&1EEIQY6(ضLFLXMF4X5XűPUF QFEcFKEQQ-DFŴVL%QŶʤKUTQXQFŨڍcMmmm+cch6j6IE[QXhѭhTB) hg׿M9hĜAAm-ā<Jmt =QrJ]’9V/u?+g.-]w]gV]`P0@S tl&zÊg?i v]v^ xjP6h!QhZTB[X(6EvG|dLIO>VqfhdIH߼]7k D9*A}@q"iM1wWo$NB֯tO@I"(p 4(즯JGyip{?}V3a?8-9A궛:͏Imф#B* P)dbҷk;Ill{{^:K dsE ӻ } (/n @fF.kG$Heج!PCf13"c3%*ȋ2.-kUnN!;:ܼ[di3;怛34gITcf4KnrUk.b?ޏޏF_G(")jع8g 1nX8#cf8/aVI \HI!fQwW;=׳0T~<]B[]DU7kT>3y^[59"ܴ具nQ$(B '7m㇒[lu]_5W$xy\դKrl2Kҏ_?(bBAYSB> 8?HjΕۏ?ꀃy{/ꂣ"6sf9jůR현뗹O+FmtS kًoRGI@𐙓y0D!]?xn/ aXMKꔄyrMQfaˢaqc ƛ2Fd$p~ft1sHR4aGg˴ cԙIl fŕٯ;h\ rf\Ks2$>Z>I}ʔf a5tz|,7;đ @.#&"(,ܔMA*R] Fu2EiSsm[pHwa&J^1ŢVͶkz1&9`L|aص=#J ڂz*'szܢQ)9+*άfLivA ""1jymmⷚe+Aj fGN.Z$kP^!HK^bKZ,(]jgsɂldKl8RhD *UH>-HKcQBB jGE?C tV5x6:|O)kuI -8fpx}΍FS&q٠B|%A&]:w9?rH*T +4iFQjP3%mITr̈́$Nכ3߱71`D3K&%Ν=W,3b i oUܷ5hddbe&*CUټvuj}w9תkn˷#}4]HzSvn44ܠ~b ڠcREHGBev k٭; s6ak+%OKX}xmw 13b`1A u.L! ݆,V"1g\+û9dm,5ץ֢cm f`ndž׳}<:[I`ΞʴRYwm f[ ]7vtjȫ[e].F-5ilavktfC )zD|><ߪhgIpѴC|ai:E>z_xh'gW9qAN}z ((F|=JDbWW>|J 2lU[ y<X Jx0>+1ޯuUөJq%Xe=c*B=" hY8i hɽh7l'j=ɷő 77+6̳?:ԳL'?ޱBtZݼBc(ƶ{f !x _庚8kAc&M6hFFN@gPNgNÖ{oǣL2TdNXל $07|G ^pxk\XƞCb˼q{3]8e?LYy#ևyt3N=41/2옪QTY!w5q3\Y.FŬ oHeCڴ=>%DY,qtl&!q̺;IЫ,+y7r9Qxv„rDC/*ZPoJ7d[0I IEK\AYqE f%&9 gB|ZS;|kt6fNX1$#17+G%qW==|to%?W<bo:څb&EʹYל9JMDX ou$":ff-rͪY$O,Woc^ v>[Dב34"CS8҉Hqm2DhÍ^ _f0E*1 2Ãp^.1cӆU;PW&k.#(@ -EE"Z灑\2 G#KtY eܒT݃H8S:t,e.c!ϋMnNB8u[㜚(\t9 N2dT,!=N`C#q֦;$9/g?8Ct *%yIza2h&Aquڅ6mX&is[2g:ܦ4bI 48A`1ZK,ecJy-2qr{cB ]Izћhwe I̧!!$";5ݐ\`ޠm}CYbotNVsY|!M c#`4uMhƎ*k!DlzlF.YTHuãݵ6 ]A/yM(PzR>fj8ڹv$t(F- {oUizZhǁMfԍnAACszЦ=ϲnL91n+qg1 YoZVD#4EP^}6&i)^afCH"1lQ0 b_"{u^b S1|.ݒZ12|74h,Rc2JHP$Zy.vMFi-=FOŷXJ$xUuwp \MC+T"6 f2gmC  Y}oTUY F iV? dw#:6"G*TR*Gb6Tb8C8C45Ḿ@۷6Q'O$`Κ(Nh4CC7ݖMnn@ m60߮Pmկ[}yf!:`-c~Oڸ9n9e! f4 Y-u<#+3`>Vᅗ@.fauZW=~ݡ2xg8ьeUTexW#(diU1ꦜ:1ի^09_$xFf32E ;(簊}w(3Xam10S:X e|4ʯSW"/ak2冃s,3Rί3ݎ;QZʲ"RGWBi݃2<¸"#8Bϭ N+Oю=^j*i崈<ƌR)'uɻ L4p%h*q"N? n(]<LfW4ӮEe\Ƚ:v5'̹6/VЌ&5NR[H!&aAp͌SGxkEY[x/,NpU~ڼ`3,iTqiZP'0L!$K71D$Ybd@v[k>M&%>bANT;4m2ۋVIռMfr5uN_\pbrcOooJEpL{5124|q{$,MB$IA"HAk֜#G<ǜ'&F1hD}7*sNYv3P_a2)N^bF͸y3Bu%?/ܗ> b$q]37.0rSV4]27)lc@l&m$Jqż."hCc[02 C1VE'BFjUό³)ġHHDH7Wzϯg 2ey~*]y/dB(&@Čy*-o}1\ݓ9b1 C&aȚCf[SaM 3 F6"$l3. z`1XM5mo%{WuMyW jޞuYLO JM9$l@q 4$:E }8y\t~|TjW}KMxd "(#lQdp~)5#xb 8cd9^b6L5W"n #d)ELv |"ZccKLJ4kC6jKًH܆s}js1W{{^Å;!ux_IKnb~kbyhm&kwSNe8rJg~w,i3|h܍>4Gwx5|)ߣxBC΍ӎ#6'Z.$((,rP]y-E^4E A_eXŢ N1™ u%HAMME)zcW޸1h;3ymWhBIc(sF(V[2q W`6c$YJQX^k"ƯJSνpv꠲))! 43MO)hf8[O]eE^)%Q!Vq #mEt#^Ko80]__GafWV_V•C !<ɼ*~~V"^aw1u`L30q3FWY;} ŬU[ DCZRb>ñ潆&d/V5Od/D+ȶ*\,"Yh'3PpLe)oԃJ!‡ӷ]yΏE=x#ܟi͸ڣ&v_/\z#oOO\Ӗ5-<%c.u?[0>JJd% 5Y| 8qMڔ+wBwڙ9̹f1akvNϵ0L>2ٍܖ(3v +3B7ˁH&QuEQf+3Ό[25,mI[KuҤJ%{e#p#~bV(:| "ioA)eap>, oK)y*>ij"o@:so_icH aNg \&^ _{11}\IlL&8T3G 1hM~,-a/%3L3˳F. ޢ. ;f:v19ߗy^4P[n85_k4(kF1N``1UcCI30! OQ*oGqYۗn5FsMp*2,rsΒA9 uoɽ1,}0wl@3p X V֐mBEoj(Q]VOA:]LǫM5e! [2T&WrISę&9נ51aϚ) hc9ti.x`IMRXaR:t]QwhfUߘswhva ]]4j 7XRfa]X,:cD ;3 __ /f[=WG6/f|-*+G&fzXtu|;0v nD7ESn7m߮;cpubZ6 UzM1 sl59SȊGztT @/NeS:l .T}oϟw<(ܳ0gQ pso,^cθV5WWԕoGAA]졪_O3-*Q]fr8˄bׁ}F_KxuCx9sxtUrCBHӘG|kkߓߵ#Y{Ns,RXL:o[G{-:zRo7h#>wL >. $&`G'CAiRV둣>!ڋ;۶}{Ʌyfh#%ouHZvd1Eic㙣8^Uw~F m;[]_x/={e}O˾)30k) hj-"n3m||N[_|u&gn 32@;yGu/Pgr0ӳb|*{!?5~VOPc"S領\RHy$Q/}0c>f5"Ìi5B n_M{jXPab1(Akӛ/dw\eQ}u 1E{{_7NuϷ?~33dvތf{ &~k_30IO;d;1OOIx&L#1K fӉ נ ;0ťx_mN0 z!nQ`^.zV7C2{C<6*5Z}֨j^*CM@pffc;j^JksI*x|GB5£=n}~*#m7쾷SyMk`f`g9o$ m :O2C'r {U\8NmM;(|^zWХ/(Se+%^;nܯ&HcHEck3Ӽ|ѾfB"*5 ='$ 1kb;u|🐑hc46ٰ7`X{~۹|Xl^MSNM騇"I N:CDM1qf[f|'@H0$@Ї ͑ۉ $wbmsٙ!a 3t,JEZʑe,5cߌ")﹌d !5M[~n ~kHF[/]n.c]|5I6bӺ 1%cƔH1m)nUww^<)$jHxsQX)IfRDfX-fyT0nuv8 pyB)mPYV/[A|sYKVhDgٮ[<ퟃF?,;*lk:I3w=WkCjX- =}a6"kˆ}#빺§{E7}r)BtXVg8Vä CqyH,%tfN⛢xLmZ>3$AM!7lM* 6bU3xC ǰN7Z=֘&tk;/ntd[NyuR>P$Fz . 'و{pЉk5;b!Bۓ=,xc<[az3h˿ +4x7|QvBw ͏s6&I26D҉$N5:VL2SYްp>4>"4[ V#v}; 1q0'tk_(bem%ՈN΢V6b6qy>X+9Ć@`DI$EfeY=5) G+Yϥ7"T4 ,PGaMSp0 S–DYuK6mikz~w{xC ejvWZC1aUhjlfCE!CYVR{RIɍitfmQ!R_*ꈇim]9ک =(H,:ݹ6֝-kЍdAm}SD W馚[Ln?aSx?Os{;<_dh粓yFHXhmHfM8:0@ -ɳ"y7%cb, fyY?meqZE iŒ =vZW gn?DU~zފ{ח䌜%VlAtֶ.R*kCT':upP3Ύ$K/dIŞz;}TVk!#r+NwaM{r^XZ-~'ZYzΓXuQ;I2 ++*)شESڤ7/?viA.ﵻbGQ8ZL7aڟ""@0=Q4II|S0C.Uh2a EyLh~o1l$6~N|UJKS}LQ< >09Czo3/gQ}qBQZ.G <% qh_eG.Lk[mmmmm]»}uRyK<ݷ_Qԣ}UAށ{r SY>͖yNAs,z RUcYcxkA }Hoz qR? j(ҼtC~NVgz 9 yX& 1ﯕC"cwfK^a.\0 Ƥ+\KUz DUwqsUtg.N>}|)ǟlJqG,!T1#W58zcr®ɇ,'Fv=nl|'TjݧƴkLq”W9 963K%I"5(XLda0!0Q"`%tb}w̫ZN-A.wn:RNPZȀy(;)i[e%ZtzXY˞f慟5`Ѻ@2<:f=V,Z\fg4*!vB _RZ4]-4Dx`ȆOLd~sxS$҆Ө9jXլ;#ZK;OC! t+۳mDMוMPIqo%j>WۆWS,4 Lmʌ7 \:MvD  4do@Џ_' C9":hu}*䗅g*,AEeک]&-f[*0b9Zk>}! /)^ \Dw:ڲAt B 06\ EFBIjM KӌZs(i.HA+N]rH۵_ pP3ᦿ$E;,'fJD6:؎M\̎Mxsٻ)NaT ` #QSK_V3M?Mel˟s&t?k]xD摎QH "jY)ޯ hkNlj.n ʊPS3݉~U6i5tq975O#:6 k@ WHEUX@HI'-U yGyQ%.#zoZ5鍍}O~pMD@q;əM3[73nW-;TcXޓ2so3Q *< BwˢHniFt|yϩۘ`Mܒ%As* xAB7TCBW6T<~ p;orAw)0b Z[F )/ܘ?<4[tՒa[rTr׍ $ݮIzp]&M Lc pI3nvGIoC16:W͚JV@fe f뚨n]f cDI_yںO}Ē ~EڦR,]@,r%*7V`Q3&0.ܳ( Ɔ4 4#c @TX3-X[%br=vzknFѳ*F+Q  \1 N=8ް !i#YBŞk@{+!5}a!C&x"$"& BlI2d: 1:} ݇aRK@bjvx3&;K)V-w8yn`=EY\wXr463hEY6=P',?1rI{@P8Jw;55S  0 NyLا'DrÌ\)f^Em^<(ϛ]A짶'sfOlx=8<#? "~HDEKEXtïW׮z^1un9T{rp^|KRԳqצsjҬ- >ͼE9 X}  H6C{t'+v`E)$u3~ <Ý:oзi, r\q n7ӯK(+n(?oE.mHB2SPܶcܖ-r/I9(.Z#܂SSq ҒUV; \`t*K!< BT̜R@1W  L]sQokB4wJvE W8Dj ; :)$|hDxh4M B61!"߱2X+rxTyfJnB CZ@`&D`0Є#Ԧ p(Aw΁!C,wHË8I7AMjy4NRۊ*ǔtZEξ<1f܈/ܘn.AԷ+Y $Iמg0r'9J8{gL<\ 6 k$pDqٳi8ŭryjRgDopE, Dv Ҟ J)/,<4"Ou4l2 6 t@{;GP{m*fK-GJCH2] $.*A Qxڃ*cD=h9*Y " E"C&2,Xͪ[4O텇pDTC>ޚ Q :MH!GZ%xwW!+cVE.HEj( R[W!j*eR6Xcu(@\lBzaHh~C6{Ix8u@$(RZ'׃Q9wT:nv0Q:mEnio/.բm(ƅOAbX(GL%!u!Y XErEvg.Uc/x9)URi ,`Pt`e㩁%.=#xRH&a #Y@ć9Ig$rJqV2zWC d`ćSCDFҝY9\pkFAO8/70{rÃ==y 6vhÒf5c2еM~ 3EPcar;Vww\ٴG_ H1hkub &:gTrT9ph˔a(4:=.OZYYBcs$`fg7w @*4p ZQN\NVH~羜̄ ܂h*7556 $L':3T8  !T*ك< $=IT36rb'cS@-&}KcrE F.P6uh9wb瑰xB] 0MhAq!j',e nˣ!BMKTfrb[A30 k $UzIPu*l5sCC mH9d"&k't0`Jp$wQ{턥_hpb|Ѝ C[il.usxjfWK`.!   :wH`]3:E8ZmFCȃBz|F6_׍;xtAXͥ9!I ,H(!b*c=8Q PԠ!1!0w z)D X@9.RZ$tQ6@%`MBcJQ HAyW R@NE[l? P|JF$"H)Z(*Qd-~ߢքMwX 'UUUUUUTffUUTUUUUUURUUx,#BDfMSA#ԏ5!.>;̱c8u^)b Vc+&e7oT6ɽӀ_C05 89Zpj/зT@P4{A}{NT'{("2EԜ8 5]釰dnz0݇XH.߱q ]ìGS ''_t<@ bi$:J(L3PбYOg6 y+&0. Z$NNs5;>k O縢T%Zr\މ=kh;JTl$$41Ip7!&Q&@|q AAP @ub^D8/8/ظEp=iQlH z<[  ^q0n`#VB  lEt<>D4 p R0HIЊ UJR(BM`@1AqS @@A逞>򂀰87BHXKvzk5י٦mڞsT8R@H.?@PdBDH|ACJ OseBj$69'큱FbD9&b$5+LWeMzXM؁`& &n:UIRW>`YMrYmGʔ1dg!/ 0m}=˨Rِ"BF537WZ[-ٶfIhhZ!зQd7V`Pir ҹ||^u'xGY :7GQ79:xžҌU >._f3i2'|ejӭUT}OdͱWA}}cUnY.foYk8|> ;ӺH!MoX+]3F2:RBq+DlFcq񾡦ds(9U4y*uQ:fG@"cYt` $H+2}@@xT6Oi :BF55+3T,x 7 B&/8l/V\ëَn^'r:£"eh bw? J xr ] jh@*@h S0PYyY+a/g;CN be܁ :ϖh~oUqd{e4q;b'KÕб.w;}7nWvAX"ǼĹhAC^ H7fh񵚇Tˀc6Ԏ 5Pzh8rVd1A¨^U{M|F0`%DTePsѯ{) wjUvXvۂ0sWI(̧YB;lF:mUxuB^elɵuL#|ݱ)PQuUWlyMF .0CJ`Iϧd&v\ZivFVF4I`cG0lBt.{\/Ip&(6u*2&ӅJọ0‚ˀmGL 9 0f(ëQe6!;v95j합R^i 2: `ʫ^kIWdvRI~|ꄉ ؒ􋈋֡&X.E<X/zOrJ]Hn!EQ*פx9mhABGI[rm5F ȐJn @1@`)H ULD:75CغX:HjLWC}+H:}޺< 5 3l]ۚd> )5ѫm0y2×~ M XƝ,|,(-@r NCTr&%E&0L]wgU3U tMEß幢p 0V6lY[J-VKfZ$2YeYZ[YiK`H0 *fC4vi J ؠۦ`?@XdB3l&jIͯ@_gxI@~/eO(MƩcv j( X`@LcoUUUUUUJfjUULUUUUUU*UUZn tJ`dp j)Dا7)ILu.T2<+6TG~?NMPh&HE0=X XF O~Gl 2Ma0U2,zo+ھf ( 8'B6_D@ 4 0FfP:@I$!@W(Uƽٴ[]%N99ABx't a7 LH1F6C#?sVE!-# ;Me?A/;`p{9օlDB Ҏ! Ÿi\{RT%PQC]F))lwV( Mȏs6&5v^aI*HUUB2HBI.Qa8Z![fpP9 @ j k]Z 4^zKNg=3 ]I-X-puBizA`.b&ItTOXeKTi C*gE,Ay=4*5T*D;ㄑ$>hK_eykSA@霯LLa VZY/~Z{`ďbpOhK@BI0UHwl(0.AXLx&7̫!m)JRHmml$"޺믹 Cp'R&װy[hs&ND̈! eۋDC4 1b0(rFI5e bh,Xdook?tXI\MOժ0d:E0`ܘC`=(e xARfJg8^ =:a3Y# aIb0//Tsh\2y]sQ`ڗT)#mPB >xV%)"I4ۖb+LJ\z\3Q+]'E5}?=g$Z;nw5R1 h(PJMIȂ0h4ʾӋ8r~>4S#liva+Rט&vI /cEGRoiܚ~D-;(N(NREBdU 44Q' !m(0Gxg]Eyl?JfkR.ZmD dJ 8ɨ`R:PȨBD)"RQZ.;G$TDA}642,p`ioXH?@Cr#Z>"Rν\q1yI6-r 0';Z%%Ud JNB(AaiK@x @ ;cErF`0`lD4b-XL,BbnrzCѨ@2a{Ik$.\7AC', |zhny& `:{ǘѷBQoBn:%x5tm &iv9+,YۏXvMg5 6&Dtj@ۨ2$j#%/>T@X1 sU6DXw.zu.: א]^Gjku8P@PLvR4Z"]TC7’r Pt[  4 t `CI&˰Q|. rOǏ9Imw!d(_>xMNwaCA fH! Cؕ#[?p17rG@6\47qgIB<jG'?n ;Qc M6}8RL@nh8iG&p`65䙽blrCHxcs:!-V:'ҤY^|va/NXrG:o<(u:5@1D3F MS9TE{#ww (!EUhsK<@܆spbxo58J ppfR!h|Dw3`':.]@h fK-[e-0El|m$Ȉ$,-k(ۢqvi"Dw{Bz~2)VNss`E5ŠaaqS ;}`j DP؉,B! RܔBӨ/=rsC&e0,``wd pNoIa'̢IC(Y0?c{Nf]4/ffD؂X΁WHgx" dЮ<9g06=JQ9бRl "`tiA!E@$^ue v= k4 I$"<וbXr*]KSdpMh8Ү%]nB1@$ѳ|9 T" Q42&pRp dsp; vM >GjhGyP7SkP'FIT0 #A(SxZ(z44KHEc@Z vIN50A =!dc!u{ʼny*)C?\MQZ?9pp@H) *Q\\%W0^) rJF*/ˋBb7H\9>hń!ú=~;3ACZ# Q~]Qlѳgc҈\ -tk`? 5Kcxbm&LxHt\e#PNV\lQd[de&&ߦG0- hzsyT OQM })f` @r66n}}5M40Ť76iۃˏ D DԷ@Ma Yq~ J$6 JMGEIf8;nA /!rۛ{*[1^v*0%b <٭Ilһ>`aز5@P"C:mk ÛB;. އӨh y,I$ _%W=$I7 ,=!cX\Ȁh2C!bB!E2FEQ6i! ?JӞ<9fC1z!q#@ hM, Ӽ-0z3[hAѵ+]\nEROPT!" *B1 TP"%I``X9>3`b /Ga\6@ƙ@N÷sXnYPРSYH82O_EB+T~XLL=@1Ag `(;X̢Pܩ$7OgpAIcjOsF@0L8 ^+槇S 6L{?HuFH`Gz9qxƚ0aN)H0.4\] Y{NɀA %>=J!9r)4,@0KtzRs6P@5$  !b;Sr`@8(F zksÇ11,Pq961A"hB9`I0n J $^ϗT6Wp0}k ,˂(pV0"!q"@pX*%FSt*xro{L>CD2 xs"tz^>Gk朌Q͋sc`[m B|l з~z ր>m2beChyt@X6"pM󠤣j.C&2yo%RhVJW[ |⢋a疸ߖ݁0] $;S&X0:(5\{j .*t (Z?5dOM6AD4Q!,U@CrƙZ $"iJq7Ns4}9.FvsZ2w h ^ӝy58~F$A`KSRs47*QTQP9M@ $R,r='K'!gb`hY`s ^+&VA*yI9 `Ɛ$_Fi E4Hk!0a`T$@ɿpS,=ux$ ASd%ss>n6bJ5&0]۠*6|`mdc'b83h:} b2RԈ:E/"d(Z̥$'kp4:;bC.I4ҽ"oSQNAbZzg뫚 z:x(i}^FЁ !H @Ÿ7YqqK"x-t:T,qRaE_b$ {з*|d|D8)H+#L$\5jnLO! ?$r%GkpHRHVؗ SH"2ss wW;܏(`:am%UUa`׳zW:aAKժ̃K S[m:ًX棈7(? b{F6{XkE QEema"DF9a#ߩ}І}r$.0bi?D^ sc fLfr"kK ;p8a/ctE5IǒI.>}K5bNǯlmzΜ}W! l?։=hV{sZ6H5gi$ވyqQ |{f-*q ]å|, E' i5̻)ZeSHŬD־Ju9\ dhe:'ߗt(IGv);r`IZ`!L ae*4&?5F!=6nƶaDqa&s̠4%̀#1Eè8NJOe-vXA {IQ謐);Fqv3@D2  ~_jJQTvv9cHUX :b`Nc C'__?̇+]$}[?y 1A> 9gygoC3YlH?ֿCV N?.9?Qw\BbxI~%K=._[H#b@5BT ߼L@9;9*g:|*ybF<K2fBe̳6ݭ^in:@{a<yϻmkpv5L{(1(v>:)kdgc4Lud&ݙh`ye56ϓ3"P`:!a~vV+v(96D3z /uͦܳFS}.5L,㜭l%5mT&DA S x@l/(|@tX śk}^ˤk>!FS kw+H-cAɇ='/uI$r~l$C5a&$5Ӣ#A@c@+Bߦ|{w#{7A֡gOQ6$h3bՉo;`$53@,df7{t#B ^w(_tb Z۞c49Ӻ{ ͣkRXP:*' t~x9M|[`qp?A0TZk琢Ꮤܨ $?^q13@|^DG `/*|G&D{ 3BB?xh, lGWc&Db"fIFaϿe_c`؝})@ry26xx9#$BJ@5zm‡sV FEƓ]K}HI!3A* 9(^''y}3na͑Oxh8+C ry^>|fX{  @MV!3!VzD]0R{ m\gEc6Cilrvt :Hu44)dc΍KZ y2Ԧ ,3)&I]cjN'h@9'mwZ K$AA!h" E h)LrwAֹpA۷k}$;~6꾔1\]Ѽ5D#9 L(q2Č kr@` wn9O[+\XUVjshC^\NFbb&IEG$$DS`=1$W緻W:vk@Ġ Z_7B%Pc#A$nx{EၬRQ %2TR xaX$A(O%- l䭶JiN-1}cII,NȊ%u]ރ-%m)16$9'LrzdNI'5OZ@>6 co$)mqLč9 х5,CD_XK7@x!K?ho`2uQ_c/uď {Jyt$Jͅpf&;gw///.K =C-60* l / 0 CPQOgQpDwh9iJ@z 'ɄcD1O1Lc! 5ܑ ɨ+G:$`܌<pz, 70m4i"WS9H"4U[彬kxsMMwX.hKK@8cj.50iAd_LԹ qc?3Ӑ3^i~>Hp I$LDU]LݵE&BI$M5fo8&5QN[kCظwT{OUhQ"Xl$ĬmJ A$f+3riXaU4N϶q(-*Pƍ W"RN@P)@o٤|'^zLaE@&o #nɼq47ɩFD*GDr,[ut-"CDict]I4^)-bm}a6Zy@Ʊ[gu A 1#ULm de .Ow-oieoVj7XLph"kQh /r:Yd@7܌yҜC{,@bA!2](rzxje .af2y@& MwŽ侼;2r_2@ɆfD8@^&cYfjo6Cĉ |!Br(c*0z2w g/5淲Y3cH`z0XY-:(DLd29|=/u-C;xeȪAE~DZ>Dz-I3:gtDuaO3}%<$=;ox̲&tlJw)xBHg𡦩7)T!>{|( vҮl%ZѲQQr0uS>FöwkNJlK⣋ZTF<#gvZ7J▊F7LD>yx! !TA[R*B=&*|JA9p+ "nHib"ҋ \ÜL?dAtB T!`D vʢ-uֶ!h Dap P280 3#<(ɵ?)LLOHQtNiK:mʄ·$9VC)n D 1fPȒ,j@(e!0gc(|񪄪(0z8 o_}?hH7)t!R먋ݿz̝IY6$1"?דX2 D-jaQk\\mtDޡU*K,StHD" ~zBV.Q-|g$ =lGԏj?팈F :$>AI{m2A42:h *2ұM_G("ne]3]/j^<銂j ` (u/9t{{3 bHz-iq'v($ Ddd]E4Rk=5]"jsvM bHfcphʖkTЗG?Njub {  x:ft! ,b!CGԴX&pGI%6?-!#yI LG:ȡE @`I3yDu:X=c.(ר/Q UM@hq툣cT )-_.j,~q5lհtsK?cYmqn*[\KZ7ܨy";<=Sxq8?< q0Ȍ)@!_JY `kFނ\}d*~Zeb/0tK\Ёf8 `zިR]Œ_+[Wٴ~ׯ^~}捫߮ogtX㲵 HC!@8wxPR pxm6Óc}n%І0q`Mc1$mǝ@ixċy5,|Ē0x #b1MBhȺ;j-S8"wc=H~"b|K^Kwa޹*B6V9e4ba-Q&/alD?PQj1xVF:xV ׫7Š4+dᄚo=!ťcڂߟ1/~plOLlGdLؒr i4c,Q,+7qtX6k´Ⱥ@l7cMKHlחh^Vk PPLrMPVB&G {kQ >G㿋)h飰B51%wr&d'?&O?q09[5q.UeÐ.UnQRpC `>T@pvBQB6 j鮋-bfh T.!d*+A]<9/>Ԥ65V3yY {Qd!?{vStNGBN!ơHf~??xڗY3X&$F!Q@˱H$k@ Ne:q; Rq`;j BC*mcw"8^UȦpd> ?sO%+WacvAaT :!3WDHHi#(k6ޣ|`D*e(D^J+߿b% ۺYÚipy99HC+5UO\vmWf߲ĬG>ƯNU9G137 T'߳!&VM2ȅ[nrl;_.kb5䮮&Ie.k]b;jz Q+`Ӛkf17gP'qyJ'$()W5N<#8B5!>1kzZ5,8<1@8⽃ox߻M*X,-ʡ{gr~~}b$tח>-4fui;C#k.MLڨY*D5JU6%uuMں{q1C 5HaMaQG r߾M:8K;L3y,O{![?(QP-ar)`2"X gK^dކJZ`(B) 1j.H,RtQ2>P@K &Rً~UG)kΠT$ A佂ѐ%6JIdc R:j B Xj2DĊt ~8zUPlmBacDia4~n;iV0U GꉲD"!TrkLaa!GXj2p"HIS!ڣs~.`DC$0dbkJˎEee Av2G!E̊!GP$OESDRI2-v׀ejƊg4GRE7 lQ!B1O0 |ZK }CK[@:ja#tK f)1ҼYa ^k^NM!7r8kӗ{MдÛK;T:I#Zu[PƈhX&PgІDZa98Є ]MWUƉFn[t-&(i&B9)mAJܮRw.mEaXG>Ռk-ƵN1r}Z./o7\  0:ĿIU(+ޭ$xDxYKG 8\EwtLa(RGl<]j70m'?7'[E Y$ꇖU&PHe!b?P2aB$2NKD9.Q[xCHބ0Tl / Oz%vW::-#x$1"D"l毎tXkkYCID` @!(`XMHd\\7xu^d0ŕF6 ѢBkYLqX(Q!4F31V#:fbmKSu|-R4Mu|Bc_ߺ`y_ ?^Vƕ)Ap›%A`x w̱ۧ&6jihfֳ z&r^U>8-oFȧ,ܚ)@3 a4o'^jJR@ҸNE^T~!|A#I*%1 BB QAd)!ˍ(C&{~bn M n8080 $TjVK  [q@+->pl8"SOWTesvY\9ewSe#҃LccA }Ɣ" 28DOxy1nir."9S;vޓI"1TB_&>ab"{97Xx@D6c埣:1Ym2 &8rNG z~_Twa9Q \MLkAbf>M)ADHr&ȃ7'D}͛bHm!@.pGD%^ayc(1эe`6فb@㿣 5PSTH^Ș "iVр> e4KqUi$b=WHBdFªFѫ(b$625^0+4gTh6hAa663IAiC!w;Wx-L%q")\7X`8>Ր` [r2,"6٘*.ǽuRڈSC$48К44fhTe"*VH7 bPQH(b]!̢"QhH,uTěI覈!-b5C#pF``"֤d8J#ت~vCh"Hid!&z8$z:AɆ'Ȉ BF._h _=rgnCoq,wTTuU{$TLe^Fv$˟JY@TB .h4.G25C aE"^b*NqZWuM[ѝ#p,:!{=2<6Ķ4j|!6"|?q$9lVs>BBGyDj\f^w.ƒ@A$aճK&Fd%#:o]ěIĎ["Zt+'_ذwtzI2yQo{޶σ\]UCL2)N& d $NUH j26W`laxj` Akܛ%03i 0%?BKd{>_uZNfIQt⍀|i/xCc p6b!ۍw$4H@`FE.#w8/(4"FL DzChi nif*J;1$Fd׶Z!jI$0fM 9(fmX@7 ( "3א*53mT~q5hq0ZݦKFB<ْ6~oEgL-F:m\V)&TH|Sa5 Ew-F PX$ZXΆp!'( |5:l @orDG#E͆)BHفMl=^.#h}~nUb-P/D9CB! J='D,_O+)F@K6nնuy^]ywH75v9RC?%9 l y 69dP, :yhxQc{IP$t7lQ5{ S`%+ 6K-k־V+B6-EjkE"e)M6 Lf5, HFe_RVRlY~09_'*A]{_v?t$C a$ 0T >28 ,q <$A1ʝ# ."\V@"aydʡNT$H1}w-yzTUY&3^h !=Zdc&f*/]U&"sN<:qY 65W!\}rT 8n@CN9U_u2wx:#,qJ|$6AF~&|>%*'g#o;~X\?@? x9i;E{bwZYF;hX?hۤ)6}$4j@N[?vMܳfjhh:cMllgEb;q1a5"ldd % X`XJQQA8Wo!Z3ޓ&p閤:8#`;S4Ԣm?12&# EIq`@ c,T*lJ cԯj|r{g=tF0ck?YWXio[!uqp X傖@GFk im*k11ԡ9kƹP /\Pbҁih?ֺGZKgtq7nK;+|eߍ%A0mz64QƤu6LCۜOgKÃ(Yw`EģhDy"w֢g`2 (dg1ϞSNW9/.} o4~YG&Sαä oi[^ Ǯ/|Y~';4GʩpJ4݂4Ef?T珳 ?,b\W[H2 HrjLmzzJP7Tto(sÐsr!~NHM; SiLsf-0-c "ߘ4fm;w!aL9g\{f*2)RQ[ܐmH, |t`G .ȩZ SG 52`RD6dgpt̰EK*|?|$6Մ5$:;2 j'}56ij|b~1Θ)WgoXF|,70C9$U~فOЗ:ӝ@ z>#x!~hپ d.%gB0&Џ!i~ H+4hT# b)iS{.E$37 7kֳa bkpnnz x]ơKgS%&|) ~9 l>z<\L1zϲ"49>Q $7Ȋ'{2 ZU*?#&ָ;xLcW ?Kc WCbǁ h_B2'~T^EGPҬAhM.Wt[jӳG9gr߇0@ClOuv;b~0&/E$Hχqi*5dl}ؼ8l*r5[y*̎;@0d`f5A IPYl3xlSL8}Jl`!7=ztO(CA}tZV6M mTL~_[̽6Em~zA"]1dF&: KJ uB/=xUevOڞ21O(ˤC(vY?kxG 9 A?2ĎiS)!`W)]̦SI yߥ㙾^#,ޖ!^B*Hx| b4甑C᤼i$jTkwyɷ:/(R/ESw!! hhEvw #3q.Qɴ\#c?].1?~i>E<;|ʻd˶NH@ԿoZLۼE*>iM?(3_)09yHPbO~+zc$6w[9 r5r2c ۦ3<L픱NXPc/˸:6AvF1kRs˦O/ۭ6 BFT58QQ!E@O bIdޘ=HOR4-1d'c2ۇ.(GN N/z<;y eo80⑘UUg/ Y*AQ/ %$Yl6wyG WM.MVaMu: r4Ts^sT.->?Æ CT3*%LnsHqS&;XM*¦pqIy뺰HJ45Pi^CXjP6*_Zc.<3 8]瑝D[_U/|lX^|N\X*ک6hFaruO!kLW2R@nrN`Ҙ H)^;qߚ >v9!9oE3=[yϹm$j4#ϯLʮyB4R((x{͙2/WXR!l'Ce~e|<}MW&³9k\e'Lh!@(ڊ=Q2 nQE n{Z8pv$N BjK,d=x{?αd9C$CLzox`GPPMӞmT;Y9&L35b%0kri `TtRH~G 6 <%NAW65ʲ=DqI iG0/A?sK[i|㴤''ôx&]qFwSL9I XΔkQKn-7͟[k#/g$xX8M:6K7 $uS!׉ʙxThHv<&SqШ# \b>\@Mn8:('W!9#NՅ؅*P[Ȁ BDH'$7Pzlgf<4{FwͲ^q7.Yb$Zc6q )#1^,ҙUO#E]nv̜U䱙/)OHj0И"ff;/˔EfcB50AJcM9&& qi)thBڧ/Bgx:H)4| X2 BDD$̘*w`Њd`ʟ¡&ZESrX(=?/-zjAx40S5eN- 1a9~uB=򜣦%+Bk” 4PQܼ5X5yHIgVD6 Eѕ@fй.&9z]GH0&LI#ndNpnCD2= BG *DxHS*xs#(D  jȦ.rS?9G':E^r*6i,$FD!juhkZmU6mZLISjb5TʠOZt@ﰣ8sL L @[7pP>D5}E$$5.UPD;3MмMo5@0w)8N zO۷)ssV>H]g!N?s?\hL/{]U{Q`!o nj^{D)i$ @M(p63 7̍1RWz5l11hhq%a ȵj`"dJM5Z/ѱF!k-8 t m!( !2 >ح >hkI7BI# u|_ʢNYMj Hn`}m t,El,F!qXdc@;)D҄hjIbFŬݻmVֱMACr'A홛p^( I1(&pQ?s bkLZArh;'L[A݅[CHa-LPb!l(ipB hk\83pY; qHXB5Cxz i0'olbF')@-!FXEy\DN!:L,/DKSMRZՑ{DAGPDB"L spz=}PMlCQN$@NI}71%0$"s@NCL,`)c!6n{MXn)kHa5kMp$QM\ߦXpPa8N]C=٧q3bpT˫MQaDfbYH "'GD0ϸ,ۑj?i |3i \@t&*%̪D+Q]pf1a;Bf*P5A[ Poo!|Ma1a AMa<=YcBR`ճ\L3!T0x ǣ؟!NjSxH wvtGD88 yȅ*^B pSӍ cԠ>~u!dӳ!8Ȃ &n@/̖p\y2FN8JWwG[A1('PV"$jLfj/?F1+ߖ|ٜ&u>E/42*krqgs_̛<e2!aG )kǺ?k`o43+!&p; Q"̶~gF,= 7T)"&>oEc(v;~ӢƱWh0pm0shm+9ʓA*͌2.v4ZZ戄̦k}{'y& cC]&Q".VsN{tfZ02p3*4Qyts5<7X,c'OQ۠jiw9IB Ab@XG&I0whc84tuA~@E wCT1""I =ʄ0Ha$.cQ=ɓcLaa-QGM}sq1w 4iJs4mԶqT7"=Qwƒ +JF@"(~t ʴP6!gF=1 WN 1砢ZZJ4\ |Z̢֥-YWu.;deoOg ZhC1>5vcl4\=tT> ˩)&^b%|`6 B H~ PUnu?eBNj'沅> 4i }6 {/%!DPLzì"AT"@9" .` hfB01(2.Yr:Ky/x$$a:l53Q|hETB7Ѣvd$JpBY2DBm|k5"I&P:Vs9^BA@}uzz țmmfKIJ(cE2 "ȅ} ªj~7(TB9_-&ksWMV)vHqAN'F m-gk]JuJWeJn嗙x1!7 OAXR ֊W*mb@K0@転;$!l@P*P26DD46)jcd@y4D4X zRur6wP WlӀ $)&ѫ,y%P(`ւqxm1ZQC~l9im7 d$Glmkhb[b+no~Um\UW4Q])+]˦Ʈ96KƼ%Z/w4 ОB2B(ƴ0W2 F (G'w pkaZVh,ENtȌLFGR+FQh Ͱ1dlZ f1#.)e5$RB@c y9m Vڄ Mљ{멁'$oFfswύh朋R~۫ޕW_ ޖ6/j{j^(LHQ9߇O;Z66_cm XVGttCCAƵAE{FRDImdpKNCj{;hf,Imzb@hiK#"-udDGl -`4i0R r9^DHH"% " (^Xh).U%Ƒ+  Zh VdP*I F1H s5@Px1b\ׅ hDP*6.p $[y4ɥx6p˧⭰/-% 1"ȥz"r@VEI{F.]iR\0 AV5S*hjlZl@!+%8")pYsĩ(`kl]Ո 35}ݭ_~_^ؖA 8^_vFX9&B&DtJQ-La !!k:ʓA@svd2Hu[I)ALu קwBP:A5r7qCisE5o[ڵҦLB\Y#.-vmLm~_kX|!0 ! ! ?PڒhO&)\GPBH5"5P P-:05wWKv(p60VD( 5ƣD#C :1eCV ).3J JI8BtXR&b,b֠`2IE?HАyd)N?.t -`C1NA"4U+D$GP LKH]r mU]2>گoѥN,.t^"(hykݻ"zW;9ؿm2$JA O|d-<'$rȥJD*svEE*Vh, &BOO|=AE@w`f{ĩ(H 8 a wq u9KT4J ! {⥏*T]jQ "}?*'r@KcIdS37Ax#< TG;;Z]B@ {atl. ! "%癒=^by\m]u*T &Z5@/$ 6&h8RRo`l,R!N`yKM]FGrTLDi.unori kƢ f(EJM+ִK^B)4Hxa _ҙ|I#\Mv_[ߛ^[Osa\FbFE0HA.|tckokmYf|$wV+"^הm6Dрj$[X'jirVaa` $G>PD@-0 XJ(s`is^XP@/b;=I|x#@@cP 12(iV B 27-?NȞW0hhC< i$IJ.AQT>RVZԛ^ k0pƊfES{LEB`"@U!ںW\Ea])ςk3Uxeg$1 i?4 ȑ0 ]rYvImSwk,a2IzTXY&&N]@\aק 8T9Yƀ bƔETݷRQe >5BpHNC ]>ONA=!RB!9͢l׾f!QNh~ fB/ @kx(c@폓?:dt)%C9<.@ E"k[C4ZU0(ue7P蝜 ujE $ -E Pxa#!!%[̈wɶR |jsyaDbVobRzP1 Grn,cGdz1c. +X/ Bӱ$nځ@&~\Ms,! t\|Ҷ`y!8?[d7piS WJkAt~_a9&iL?C`xҨ#*)N pa0y"&JӁ.Cd<$C )"!!*$>Mi!\5i(WdH166r 镆9 5dYk+cD{ kQ'(أtPI!E]hcVck͕,eK*YRʕ{';yy8k7qql+&<.RC,cḎYE$Ji62i|^2{64)ܵRPT/).gx HM4æarp1%6VYn?,hhﳭyK%Fy~d%UJ_GLt3JH9H~](6666VjR*寭i!j^Dr f#yO*yK2Id-MJց&W.{ؿ[BBp=?Q҈Zn"BSS'RؠPM9 G CEvx)>{r! h ~`7)Hhp(P ABQQ1(FA:8of-jdx.D9?W~|d  NBAR.؉!>4OCjf~l;7H$9G!$tHm0Je%#KLbQS(V4*J+W߲W_0. \?WB>'JMO(Hǹ@aK(A^)ATFJߌtYf޺[] nl.EDꤢBh2R@<)2 lw1;NDkGd׏ϩnY ~{L"mڵOgV%ݥ)e[]"ߐUT'z 殲2kmDx!SGT>_hSXL 3 mãc_8zMi_d#\/2A7fhdjwb-Y.bS&ͽ'SqB66cẗ́3~|38Ǥx}R 8=,(Cu+Q 5zSJ4[‹vU~>z*'4~xQAPB2~\/݊!*v`|qJbB0mVzy $Jh.xM$ҙ! |/gЊvCI0=}ĊmMiAxG#Sh9x"f (A6f8M59`0\ u CprBCЁ'_+@J84hf? myݷK_PTP& c׭ޫ\Dpr>1D q ԗb@uR`jutO{Ox]YBΙm*d ȪeК){Ș8 #(%@*H7PrTGҊ[Ts?hӇh;#̲f\cRBXth"gm '2{HhθmcoC;H@Ծ(B 9ҋʫXqh2 [z:(gz&4]N)Mxf叱Ds1qW$|ozϖ)QGz  <`K3ԙ2336_klVbӨQؖV8eEBJ҉5KD+]J;e=oJ((v7v:^B@-AAIuq!l5#v4ç.<@M#-G 'o4GDMG )-|1Q.mo^ /~o&)yA?ØmXmYf)g%?<_İ?ڼѡ~woїM;㭿UA$XNjI1-3BHIJ-ImkSW"0F>/x *Ny$.#AZ8G,! l RAw-AJvsNPx@ \)=ͦF4#Q8w'pv#>AyPhIS?zfBs^ 1㟈XdH …zBAt*&| A/LA:,B PGB,3bUKh]znѦ]R2]޽z5uDBCN0-BF'\ &¹`DĐd2#qDZ.:9D [$G@F5 bXa `؍CV%b{ 05<\$E?^mKJǼ;w*QE!})%Ft{~|h D%V6Ql]/F+>l:Ĉ~17 [L_v{Iluۨj0dO+54}5Tp)AP$ c]䘄<.ܪ}y~fe柮woj)RDH!!J=@aBuʫ>3w\=zojonԎMXO2h н E Ah Iw !6D?H|u^ŠB66ycZnfh&3 P 1 )PѡҤ)7@.j2&JdY_#迒i(/^kpHn<rFH=OIU (H#DqD24V! t|g^ R("'Q;"悛F5{r s! n'cB$FAQ>(I>„JT Qm2 ցQVlcC[0ަF։32 tLWlWgBp]m| xMRSW0:  db%L(fJbX4FͲGɤ2 "܍QQwTXi^45I-5`5Q,h7( FS#Z{c+S0 qK* ֈ70( ҇0"]Y*H"}752Hdqz h,|&TunA2 $CmCi@T@@`x|8 * YjG*!7ODa BjNo#$$OYC߯,2yr!6lClܜfKPZɭ&`njkWH j7x/9hBb[3CT RǾi䣫ϘD$$j%]0@ $$(o=_J!2/6=O:d@x~BN;B!!*D EqWzhOh@y3 s&25"FvW]ap;!M  8ɬL`xQA $9 {DGcW7Qs8)D$j`:_;,ءZi{_?&y2=ܥ;T3"\rXjڥ_ZB<琜K7J{/>ƀM B],'ՏN!! b3( ZP]Q1R-)v6WjUҕ[k?ŐR)rCE)D9R_6-%do.BF@f@c62Pl |} i!$/{?&s ; %%U!%_1o_C@| 5}M0 舞Hw'/5GQdGl`bD@]kol#*KQg^.יDnjAFI+-5&%IzhH#HxT7.Q ؑm5uN*֯I0N g'ق6T0@$J,'\ C=# 2.(&M|X.4AD \Ǫ׬5=<\2᯵OҢA}hETcGva';5RŤ뱆5Bly )fq(̛plpD,bZlBhڢ4 hpc6,:h$JQ6`0@`# ,aI2mL_NZ#OL0\6dI(c0|snA`q4TMoƈ6= RTAڝ4<9fiYzpF9& x3T(QM5NJ!&[HY6b0F  ǷiǕZkX/5L[n "Ւ'QS FQ-6ނfUjK7JHۉB $̗K%[)c NL!T 9@qFw}kp Li[:۫F%@07V`ɒ0p+Ҍ*b-Gh)df|{뜜^7Z͏BL&(&kٲ)2>h17ՀkfۥݱqhYYY" $I 4rI o!qwlWA-nsnz>I܉+MU=3!=ل=ݔiʞJyHqU@! l4ѩg|A*FK`8o[PO"04pȨCLGz@w$Ef#+˂/)j{aS0r9(r "#b̀&0"pgĔ~4;e`,P 5,٤&Kw+pcJu,u.]wR0Fz[|'jA xx3$H!!%I6w㈒$ "PII9̴r*p&yn}0"H@؆#J{ []) mHbJ*K.]oEtwRMڐ!$D2!PJ8@0bXI+wȆ H(ER_tRS#LʣJ+.}aPƘт(D&IJR痁Ǐ<"RHb#H D&҈c+Wy9dŲIuv;[μ%l-IoI^uvзjF]ELDmXDH0Ձ#]I`"UϢ%EF,-)2BD"P9W+ `+@,b*B(R*; `$Rp0RJ!CjWH,@Q T{ ")Ia z"F#QAy;bGj<30|-$^X <PHA!$U,=vAp cIxg_) TW$5$T*`RǔBJY a8yp'S@IN CГg"e1^rp[LIu2{d,]Lb3 tBr"Պ\] ЈBcBEo1 #Ɔ!́ʆ/o_*^B}<L͡~Elby G|͊zR#S2! 9e1&BL+\Qȉ@g2p;-p}3g)T&$y::K>zT>p 7r5" :d$~%AbAaֶӸmׁkۺl:5\l؈DwFߘ>?ݵ)W)lGYS,MFB撶3 3zkɣQAO oⶡղKԺT!${Nv,j.Q!"!}&O,邻wV $b JʡGn't~K @P)Rdj2RP@ہN,CQxCzP 9|Sm놑 H{Td.oEYDn^d _Ko}3q %!_VSziN Rf1wLĈZC)8$.kS(6 !{삁舐 Q"Th IDvBB×Pi5n^*E*mJu'!QZ T-[@WL!n DFM_un6JEnSPj*Hb "Qjssj_}WezeJItߝoҢH} rhSBi$ /PE؆Ert\ab]jU z7"$ Á2{b$;Lb8FJYt6cBf#Cw~ 3-$ bh U 1xem}ŭ}Uʈ֦r>99Zy$ A %JuD$˞vp2.Tެ >!9`5 l!$=2p?0y%Gh/|yR&x"&a@>S]o=TH@ =\θEvZu6wc_xmh**&:  DƘ>aX0၌TC[$񞩼K \E~˯۫chLKm[+ugPy_8`5#l;&1H"Sd=lq8Ey"$f%!LȡtOQXgE c2m88mDA8PChт mU!)B+t/40'A ~B{9~2IUQD Cg&,,(O‚RW^*Q ~ <|PLRĎU|E}6^6ҳ˭m*+}2%& ݻe]kvkj^E*;9JC~F (4Za}ʀK ==hEqL tLTxF!!pn}_/w0 :AK*a"GX#M"ۣa)gLGAhHZ@0tR HOCI#!s(DTp?dDmIj[i-И;l# i+JGΐIwn]mˮuo{MH;  6  B"a䌂I4!DxfB3_W$J!gRWX?[,X68RX'| U醽YaNAbte:#'V6C[@8¯8fT%0c#L[V0#B!ڍ cD7!UȜ}NX: yĉ<y#.ZTGt:( F;BM> m.fէbZq% ȍmv Ml! mc|dFw pDt Su @cjlO0Gf , pլݠᑣc>7d屛fN_nioѧ#v!P֑єIF9(ȶ;:QWȁDl05k 1u(~ LEMܑ%}JD}.'.0-9㉶紴ռ֍ ]<^ꆢb!#FIP^ aWNuǞ4lFI$ &ElkS$CĘǨt5~-_+=}=)!>s0գ_t"1}4d"OGotPLjإ@HA:NEAC{ et1xv(sÑL?y"_?0daK LOdJ#C Tf4 qYd"? pB{!U5Q`u ?%_>7]8"CI+*j,잙|$x[ ߳/ ٔcǩcW*/Ҙ14t!~E^tODhT["f#))B1"$gh]#; ? oSnrŗW}/JKVaE@r./]Xq :ś.ew$LUHFI0h<<+\d{STFd i!\ !ۖ1z vߡn=4?tj,5i0iO ::.Ou 3~W8p!qUu=iFp A`8'9U^'lN?aw62NF\09NzR  Pv:UXQ8uʮ,/-y9>s0dbRC0'CJD!X:BXx Y~!7j+>Uy}gyS+mS{W{.{<;'׽ʺ&mґ0 Ne/ljfH1@F #źŜ3\M,\ri?l|{|s'ey5W80c61:秠oh{mKc322k2H7'|im5 Zj)) VTVV:Ѧ$m0KwmC?=l Ky(oz"8>;ՅFgJZdx zr"DV7(˖.JSz: ;"HԢ^yj< tTP4Ry"L@.I!p*zֆ 0AW0(l+&orJy3zzWOW?Vޫc)lZ&X!Lh w3!݅2z_¹ы/ p IJ%QLD5V.I-$d!Ƞj1 [#u*YWQ6Nm6!m6:e1:)ՒgJfhoH^<2amp%i*B̤gK^^O'j+7ym[]]켥4,m4nj!Muksyc1hڳP&218&0Q8@U&zQ[x\d,zvuA7e"Y1Bc#uJ4%f鷮v3)4+V6.iWIt.wv"!qm5!Lf[&l6@*e+i$ gɅU4 9kZ`{n EQZs  #Hxx m(1o X EN,ȹVXCƨkFD Eg#0Hipu7)VDЈhʓƶL`U1FQ<1 %&@8t R-) 6@"@C"-l4K$t,?` kb@`)Sd ) On)ddQԐQ? h+"!_W5[~Q$@0 aPP@CJ#h63^mdWGIĈ͓&GCq0WM0Ch PQ r6s!q\(($a66/lmx$^_Q0UazH@ =$Hc¥),0 /L9ADD"($HEw\9fBC\ vB0 v˄6c$ػJ^l!kfL$g5~8гZ( :_]~f~ܣS+ITU7'X4u5(r{(- }`]jCO<wYz ViFa҃Aʏ95A$eN4H| CȱHi TaB9lh~}1j5cPjBch7ϗE=&w*YRʖT(mQ0[h0`%!1. |0.e ]SY)BQE"D$jT"( gA+)Tg> ~œgmQ"pSKdLMtR e'"H2 ؔf+U^[FNCo 6!$ CAA!"# 6`C^ 6hh 1) @L1^HBj{lI-l QEKbp@2n$\Y@$ "P0a,lEYjek6hVA$4XK`tU% }/ضVJR[K$%&K,$eQӵn`A`bD5WKpsnQz~/p'rtP`TfAA e fƍl0W.\=taeJI8N_fn uUFAA!*%ۈlHYC`d2\C/W#isZj 3-M %bc@ `+S0 \]` Fs溰4 HbЭiJ}&T:[u+(g[N4jMw5^fJ斾ijx{%v},?;Sڏ?9@|tOGj[ i8pWef-. AR$BDm7 w_Fwtn$b_hqKe+I#Kru7K39sf좉ƳQMUf\ DF؏T|?N)MbeVj]5i:01=5Tsؼ8BLC~ Ivx,.nٝtv0^1r;ɜC};"-𥑲4ц,1h$Pȭ!,15ui,bJVĠ{)|S?FmnjFwa .PUK-R 鄜E;`8?װH-KXs4Ao4dIu(# R,&"¢r*SCD+ BzFik%Sl1)Q D2;M,F1S6[]!W|[C|s-)#wpЈ^Dc"D^@;q"nl6tdt7x{m/ {KlhI, LiiEY  vc(h;D01p9m$qCHDur82磳z)4Ԝ601Ṵ0єNˏ{,92~R|q}(n_K|oLm0bTѝ&Æ-0餱d&&L̎q0 >3>./ d_1ƈS|d,pgݻ7 4F狌 Hhz4 PPJ frlh0VZ'G+5Mkd5첣ٵm;e 'N$f:^k \U!ߚ dRpU8e߳>g'mO+ZZgj~I*(B?MN?A<$yFJ1kcLN*49sG,h2T|%H}lul__L*}{LWA~%Add2(3UAdF`,x~:^WxZbƃDi*hLN4g(Bty6۪zCuA)pgkj&;t፿L;Z҃_=hуZ#o!OsQVBn}Tr T@Ą$6׆TI~3$⬷xxܘ4GF4s#mG3XykZ!>ü~e'6ޡT/9)MI@I2N 0^"hC0a  kF4D }}7Gf˯ݼLyPTDЅQP;e>|BBUv] WO-DhSDS OeChj>`zhu`y"bD!PQ`=ʛ M-E#~QJ^'~+CAH⋖'Ή i:c2`Ag|OL5"iY:-'0"Ȣ^rN(WWH-Jկѱ.8HPoE+V0 ꡭiR1bU'it^6/U%y]u2ڍ޷-@(Tv} }l 2]iIE@SAJ3;R>cPf։""Hm<5!fT(r 8{YMDhIKhZZ|WHCJ;kYDMkZ*vdьEH1(`$ݻ]B082@WTc݁5`n$5˨Y ԕĆI`hͩ9twIFS=V F};6}(tUy ?R?xs@MƈG>tt@woUc5N k;!2V.fr#!]B<<ԦP=Q_r/3h$Z ~[1K(l/A<iIU )**T@$Fi{U1JX2xqouE?D˷uٯݫͿmrȚ@)&H6I㏖Hq2A*(-C$,)^FȄ64$KA .7[և35J &H2FecE'mm :>xÜ6Cyk 00bP+D1]䠦 o J^y8e.% Dž|T ;nPaH_*Iwj*5 ٠zjzjC/6"T(j,Gޥ ĕ +1 -v*c)Gydk%d=Z,BHO蘇؅",7A0B'RҵRNFJC17AE$qRVy0X݃aP'އlI^] }c  [ vE \:}HU"}p)K8qG"?X>?dHA :4G\0Joֈ>yqfԈ5kOjT*1Ylq>Ƣ\ !~lc]ɘfyA0CM{QŽX'sgrQ*'%G%ѿ30˘cwshƺ_d\e7o<'貛9*&:?2[slC=`h 8݇ġ*f Q^`뼷E#T-;XPow],~B 6$bձ7M?0̖0YHj",u6qvO$kԕCp"*J]Z[LEt /.{Io6 N!3@[XFHO%lgEm.Jq9 ٌ>ַYV{gj,0l3Qkqb,=2f1[8<;u6AE31U Lj@3@d{,=R xL`$}Gj5w:z{,Z Nh6Dhlu: O <A+yzQ0!}ΙxLv;B!~YdDXߏrN?%HRb^~g eXkߞoi#!1v` 2sxf'AY%2fN2&wbcfGI H/N/q4;1&2ԝ9ɲ0!,5ʡ֮EɽYâ$7&_̽ #̜ 6A1.;:eߋvjNoFf5- !]!A=v= 2{F@,Â-2:FYٶu~ z}&4~s{$ض;grFn[N6Ynd}>")j܅B?\rL~fG#I`C?h7P $~[E]^6%u3Rc&i.f#OBBArŭЖ4* ڈp;+I 妴BLjc`M [XʸmFTkΜ}: h >\01+8BaʙL-;aFvZ+TO#6G"a@sS2˙Ĺ[kMW\/0m32VAAv+Z+6f}fB0m.&5t:~y GjNeTyyց#4c0 A*<ԠuFenbx\åFnXKm㍿ # iVFYjl,1HI H. |[ !=VjTȥM`bC߹a$eBʢԐAt(JWZSJfhZPCvS2if 6:Eߓ4ʆ<…ESH$'(xm?dLBE6Caԝ# LR;$#'iT2?HC8"UDö<:z?z%yƺjiw64ks~mje4Z]Y'^o73+6K!XL 5 moj+*T?t֥QrDPȨ@ @P((RvDp |))P jDCh ,؀ {}Y5"1P#;*6((b%Dt ,4Fp2\)pEM d'%QHB8RPHC#!H!AG`HCm_2{s]PwОP ' + %N qDX$$5t3H@)D,i8m%QP'Tt2oԝo^N3=0B,:lv&ITZJj@r 3\X91մm $Wwuʂe^4:k0J#j@$*j o `pQҀ&1 2FPIJ0KT˔6!%6'#lv2fd#1$lcI FB**R`ہSD(J4PVB K˵oWY`y\Wl*6䙐,~7jZmV! 8%WțĵOpa݅iS8p4 :DI*VPQ&Vwv`P)"YXl0v@BFW[گJS5Z bF,-j6p: z L>X`J̝aF`!p-SX eBQqꀣ HwAF&%ѥE?bA"jZ@7N1pav+tĎF 8Ya0q6(2gF BaDLrϛ]6TPI(.Zk8yj6I) }?9 g9XlDFqJ!"$G՟>3DMh!b!ʃa۰nA"JЁh[(/!\LvZwx(Rh*I[R|rIJ* (\@wb"dY? j@ QdtU!hQ/T@)[냊EqV"b AHy-&Xbm^(8@9{AH{IL$DD{ "1^ݎ/B64J+, oAU]&PȊ?#%ޟNi$Q4fp}nh&7Ĺ`w\WIbWe뮖?]C 럙~>bt>xAV@rgtuw=9Ч}(EzϬȌ#A R*=}B1H 6@B1eu$Kz^^xoZhBQ*  G8.zHd"kP¨*ZDDKԆ4,1>1'xoaza<,D%V4h<-=𠏓$-zd10@5r9.>)C0F*$Ezn.IC pI dH@bA"1C>P8'/LE?ȧ+yP0!3{@3d.C_*#~mŇS N5 {SV{_V I%Ab8[Y[H~8Eazjl-.Bw!.6v6KFHHAΗK/<+:⎻mt˞zk ((+RRd'.Qc 2><9؛>uV D|HjL/= # >>gl }9dI& KIqDy :!$$UA⡻hѥEd`#E3ՙ'`HX'= $,V<ȥ= ;`EkWp4!?jEI%d-  D 7LS1}L\C2@?x]1|5Bv^‚g\,6\Hv|IeEdghӅI KR=dҼ醨 dIUA}q[ $ĸb 9й!* (`EAD"DU| ڡ@(,2&̀ȢTUR#B (7 KUu h{k=0d*pD3)넾WamPn"Mxꐘ 8O`gA޸/q/<6~ۘ-%^\ M 02e3sQXĎbjf$i*tW?QऋM$%7Ѣ5_ 0#0Ȳ`s& WJOW04O4h6kMJI_NtJ!9u އ*ً`1Ѡ~!X!4V(Ccg8 pA;B  rEQ29gAL4=r NISH@aȶs,!Q>| /t衑Cd5( 8G@hfɸ–A^0&9wl 4h+<)闟ޮfFc[㻧VYr.!J l) |'.'FOHTVs!;(4SLN)Jɴ?n n>v ֹĢb@ފ>ߢJ?L̊{oLJ'veQhPBh$ " Dw؀}Usx[$w|٦$-S*la5Yp7~mx 9\}MH*Nd8]\X+mBBeE,r5#  HHbH$"\/Zb+dJL +2bo[UZV6TK?, S?J-fJDN]iKm_ky.%mudGɛHT?bw‰>w.`;.7QKV*gQ K/<ɛ5bޜ4Ұ@R47.ml1o(Iw &[$j8L 8ģ cm6A$@T3@~̋ QT*3I qNC˝L ;'8myRo~LEϷPGujA@I9T4w?Wow폧,Œ|WXJ5+Xw: |үrw6;*Nj>@VRwwqU}mi.燐}4R4>}JU }پ|W:6\lgg@}5ws}=Pkm0ѯ;.0(7 |`d/|GUo`= m맰duu$c׽ =*R [} :s (B!Ѫ+j> ҂D딊:=:E) {*Bmxg@ϼw|5q^K^nPUir> z޻Ϯ[o_{.A9{(Pth{/Ovh4 z@ Հz{>{Nzϟ{{o$mٷcֶӽM% R)L]w}҆e(TV :cws sl;g]bswtyrUwRuWLpFPU㼪 [u7ݸ=RJHR*vU@%Q5uέĺ›q%UّT *{TZM]|/t(i J PQ"=ۤwpzxIU|} '}8Mvq]iu\oVk{o[}{vݒy|m7x%צر[>w|\=s^vt:vvDiv{{鷷zQϸ[繺]mW͞}^k$UcG}kS@9Bx7x=vڻg>ﺻلzv=^w5旺u'ԟv;3{7z|vYýnm{/z{=ƥnqt3D[ aooԵWY΋z{^pznu}zͶkuj7ֹyzt1suK;n{  @ijo)>m骑 ն۴lzx]S; w۽tG]zxݍ>v{{я{vwoc@Oorv59:{y 0<={]@o{ٌ9v-ͷmc^ʽC^vG|^ݽw(P{N_|>ҩkR{޻}{toz '޽}{)Ӯ]nnݻuwy/\]ùzz70h۴={9J=+MZ}۹޺G}nu7[=s]'j+w\T9J|($gl|C5ݗ;bJ>뻻zs[}n'w׆;'>>-{yAOgn]n>np&^:=2YݑĞ9z}=dں 5M\^.@Ͻuu[w4}0=znetJގj͑2JPnκ;ws|W=z9;9uwuvҊ]G^v{[juҰ۸.ws^{o}ޛ>̛(P%O{y⫐iy}ys'jPGR/{sfƀvn]e:$ҔcND@:klocCϻsnK45ů[X/v׾sN/VKr5(Tͨ]jy=}Sܺ:˽n3lvmi P usS4jo7p(}j|s{`hv.N3.:{uݹm{:ZCUku t[`(` ݔm)vj޺}w޻]u)TlܾxaWllM{;|}sǞ+l\ɼNۻϛ;8Fe:xsd =޳nϪ@Ko]Ntk}еe>gnF1b)TD j)HMJ陶HBPhMx<==jpܐ"qQ8wUbwU8 |\V0]c UkI3 ŀ;.) -$@d20D! $8"QBBɁ D4@HUS"@aY+-BDX@-Q  !98@nH$lU 3%0b$i$Tr!2ʀ)BE,Y&H4b,MK5Ic8CP A2pVg feD:#zi}  AJER$dib &"&"("& (xӢjH% D40Q2F H`TFHE@)"ztTw#KB @ ,F"pN^5 J9&Q TW:h % X!TSt*?+&OR6rFBQQDӌg!#,ZϷ:QHaMI4aŃfc1cIXPTI[i(" $m6R&r9dQhsOoӡ$f3SPK~-hUgwY{=T|ت&!)ׯ0=:7dTFenl<RALv8KI ' {0hÿxjָBŋj rrY1l1X̜"wpO(Ց<) 9[YEјe$QS1DkAƍaQLrҦvE*JRjd" rm ch>o_~piI!ٰn5YZpFڥ(ᄮ7 J$eX6lᑶԆ!5X YL@L6o62 `n ) ZR%Y]hm%"V#6 SO?;B͔Bf1T/(4putc@zQZ1|0ֱW}bⷀQXwR0LhYbf! L# F0B0`h)D_ٕQ5 %ꤠD?F*ptc |)^YJH/"uzjN5X;u4:`Ӊ4U 6dpYj*iTm!-Q)G(@JjKH42b0EX*cq؝N- 0EșSVƇ ` #Ehlt,fQA1i)HF6x%.Yl4uۂjƦS"ALiDqZe$\fj f'pߑV !a#(Ж%Q d@]GajCbKa3Ahf@5a ĎýH@nW.'O.b27l=Eź HwªN^'B{"jXiIwLWv C3y[)8%=}_~S,~9eMW|0aVSDVd~HB(Bmyj29I䣩T߭hW EoSvOdZ6!'=+)WFb^ ⛒(OeTԹF4:-q%{xS^ʯch? ټrY}"ͧs墝L]ei óS&骻{mPͅI3#_DvG<}5uqE,ƿ4K<Ghs9Oy@aYy>+oL}WVV#cWVǟ_ݺi[!l/3] R Gͬn2vVctrAX$0ȩ_K7Zw-F0+g:ܑNǽ%H|)hY].FvSmZt~6COf/Ek1 @{RFEpAY|c,+É'bae_Q- +f}Vb;ޭi|7|գSGK"? u\7"+ >_Gl:}UU[Qxt+O&En*j:#tiQ4\W"]F:1^+NXTQnU5ax)Yy))2+,vN'6/d#f(Iε]C#™d#9Xu/$Zs]} |abO>mϻPi{`()۴Η!.!/Yx28Ao(N25Ogd|HJ A"RIk|5%ʉ~} Gh\Lmp~+t7~7.y Zj/AI>ɭG*?&mpe"i\R? RӝϡgL|u1࢞wXPG6;ޱӘ?Z<51ݢ$%9h&{U?;6#gpfe~ccN娝'XNo;BB r}:L6;  ^ fcT'SƌR=^ux_^K8ZzN1.OV&1ƠKOөXxo*q'.; -dҥ O?Lpn;I6]hRWF*3 Sgt\YeEi=hGomNji(K=6>yHFSTPĒ̮F;Ijx&v@QSM6fD|N9yGۓe{2Z,>?a.~j/xKugqϧMBNL-ZVU+hx37);1cgקڽ:fVH]1?o]v[6a&t8]zGm_-:Zvcg^^&[xJʞ;(bF۟{ $Autg~|^ךܤ!ͳ %`I,ʔN2ˌ UU^pƀtP]vqb1I<'O;XfY2001' (ͽV ÜɳsZBhY]4\2 3B*t>v9~cڢܬL0a&9o݉=X杵ëa\}|2=]$8P1txLTYؕGęߺ+I<\ɏYQ+⭒hM X"\(7v׿sd :Pe~gOHA|a:n)ZT1I홼u™2MEY[Ic~ސwZ?m^mîjO\LoD諛ycJAM*+1_mkhnoc.<[i^w2_dBhi(CΤ~0>]r]Im Y#P}Iv*#2zMҬ2TOunR4BoFzΜDadnAMV+*"+,+cW'8MNϳm34ϱg:fSoK'!BK$N#_r':z ^ُ$*RloOWg?IbٯEtޝ'3p%QY),X@|nb#&cؤf!_@4TNˉb@UB;+9Z4okvۤC*mrV>psbQFc5BuKE-7 F^fwWKBE!ȭEi&֛w7MzJD*k!5J"ln1j!j*VzPhtWO4R5or>y^UiTCT1Doҝ$5#>PU7X}O:SeA7)2=8Hږ &][LSwa fSYZv#\D[ڑsq`ɿT§Wm ܪj>ou~SEٶN(T-dzԲ k@һNJ,^$.0]fXC1f ZQ H胟Q p -S~T n"Dst1|?0%>;'D<^j=`og""58rPIsՇ׸*鏘w-2^`tvԧuQxGd}}85n;_cLZNZ'z)g/dfVz=b&sp\~{%xO^"?"*=+8cOkMz^z ~lؽ*89ѤzKZz)BrIOl!~|R 3*{w:|pO4E,k?KҿNqgCZ&^0jLΏ;Nh޽||| z'&5`i*scdu7?ߋL|ԯ z믰fZ KZ1!2K/'/4$J<.BUUAU=;>瑓09].'e^sF*>o[}!3W/u|yd>kXu6}~ϫ込7*I$I$IUUUUMUUUUW&5?g]9Úk/9؊b/䓄vn7",#*i܉29Ԫ?گB$+:m -G˂TT"FJVQ:{! Tuo7*6DJta9;b׺/DYVKe<]̷UЌWܡjDRK_9w/ΫQzq)ަ ݺh3{lnW#[ *g"'?:<.f%A>"qjٖ15-$}pB6dsA:j~wiiY Q"?_Xȕ>l֫*§n_ [2jiu;UV9f\s+ HX/2o!2v%oGwcys*0Tnv =whijUSA6ƭmsOw{#5Ӫ/1(MyO6J[/}kyH}c(Cw>J=|8/#sPۖJ]:-ugf3dInO#eW g"D R2T]vQu]e YgA)vTF88t`VT7]'+S{]ZV}lfkhͭjӌJmg+9P]§ZzH,ȲQ]4>\+JuK4zFh{aG͟,xgxYvcTK?Xt/ǖXY'D'_V; '9Oܪ>͉*|]}+tt>Pl܋(כ=GDJVTqОg`ڕ) ~v74`O4_ۙ |xgBӞѽUi3傡9I6br{hwtbULvzOZ$#T!G7eӷQ -08:|jxS>A onNGĭ7 psfN3R1THf"iӾ !V6`L3pG({eo:#nMaeEi3$ɒBLIq2#_IKKwO=uCZga-C#(߱?45 *;b `[ֵW/"zZ>/dbX3poTꀪ *;`S1xǯ-FU!{tcg,p%$HD!MPSQD^h2~Cph*9E$E&ɠ6u0-TM1OF9;wKV1Z<8,gZFu-UOon v,MiDluEH&8\*c!ː7jaT`K8 A⠫ާ֤V7]Uc3nsxI\9Ta|0ִCxhGk۷K0SI}qq6zԆ# 5ǯ95M% (*5~5$DDA c 4Ɵ r:61YQ)ɭR׫p)p/,2،MTY2\eja$0Dahъ:{D.@ t Pŷ1F__1l>(sΚaN,XCjnA|NmUb t̄7!w#6' .}`pSK0mGz XG "S(D$ Uq[x$g) {ƶX6GbCG65LjFߞ66QV`h ӼkkDCLDMEa>ΤnR XFFHI1 CΔ9xmPk>&&8T&_H"D`SHBʅ% 1jʽ'Wdт-C(*&(9Cz̎Ll; ģG3~O:KoA:pϴΟvגS=Brh-g@ɫ>ybwb]3kUCQ hK/їӿ(oTXDtKd>wqKR9I!2l!8YZ>[b{0(2>pVL:jwSNz4pcI6NA.zSR&8i՟ό-d!wŠ TeUq{(zANO㺻ihJݹ"b=HZ<åΎ"PSTFTHGe3'gqX-GϚ.݉vmWܓ9WӧGbXs~yz!Wy;bX3!qHf| E7 _5qf+wa&VnrTuK7Y b܊s~5z5?קKPꊊǧZ$4š jQhȽ6F{}#_׉Q^*25tCv:E- 2|ϳt0c_wN6OHeQ`A2H;N oCw^Mt zb8EzuV ur{uUŽP%?QyW;_7KS;)5e;cѷ o3Kb{ᢙF0 u1)rL S;%$8 i#gLHW[piGn5TJۯO4La-Rgl Q8/h嬵$y;qQ\s)eq}\s3(7V۸kl>_%6qU>[3^&;7ztm2۝%ʊ.GPq/V!fwy}+;b F1Ěv<?ӂA=\Ta&:O)D;K%.9{_ZTRdJ:Qzw9 $j5<~/~;<J9 D,:⅜9f7tN[/!!!ʓ Ze<:ny~בg{ޮ)l_^NѕBg}S2\UO+zy=7W:Nq[>ܘ[t]OU=]i.ڡGm_O%4}uPݍRMS{atNdKWt|v+%9+)β ZSihٳ2rҷ|vYL/ldo(xJ%I\qje]fgEWEmV{kW=To7]c,wntm}MK:,/F .23ۜ:Zsx[\K~81XXk[o^QƟ1~<13|=t{ eS}R{k4YYwTt}u?ae!{C,2JZʟް+, уwj\7Q&ʪ a5H}Vΐ 8ݭ k!Qp&h7sZ>h,I? 'pY)4Q-R%43@QLIGO ^(#;3.߶F_4%FCV&*>_)0J;1s~ FDX*AOFG->)TUB9DIcԗU[?t!ylO8PԱ2hOѸg>Yv5%'M0y]#4MTB~]+CP,T!J#Q7?{;GCPW.$:ri=Rh…rĂU#Q Ȧl=}$ Ⱦ۴GR&'^ъp+5vj'ȯǐZu$J2T"(>ާqS:rVAij3)w}l7z^ۮ_T*9U|/GwY9!\994G 3u?NKO=79V4Rz,W"؝{xyb}jwq@;"j3lVa2}?Z8M{Z8ZxUΟsJ~Uo /MƿkgNusyvsWI77n#zE|E=E"#:Yg}2uxDz!2'e=3~*bɫLC`>:}D|ڴөXo\&W*%*IvDD%}f(g:df\<Uꠃ+hB*?h 4)655/ŢJA NM"kjn `3 1UHxj:$)rbzM.,SQ&a%Qp^@pET="61*XY[aal/V1r;>k X%#Jٿ6EA8 xb-Oܤ]5OOu5B/{g'ה\5W.O" ު;7櫅Y] F&1{,&E_`((_ "U XPrb3 S ӀDH€\(bpOC$'#B  ۚ+ CtIEP:{⫪+ٷ矛N>5͕t~c-z"&Ht$PTwԳ⠬V*Kns$?*OL7B"G.FLPPh7ilE~og,Q$G?BJ08l1bS tc6Ma|MhcUUUUU2Qj0!tKI a@`jQ21pFsi5:6@QB9:SM zި4 h#5K@!"PuFDMnF@mQ7;ڨkt3F|Tm1f" "Ak8lV݊UXѳbmk3QÃBpF?AN b0>Pw'{,}e L RH᭥˄R# Պ8f!Q%-!HnNW>%,T5 !ܔvu֥Cهݮ٣AZ,|JImsgFXD,&I T  &4QTQ,œhM cEAF8YVMKQ, 3Z1*d&j(")#%[md!@f.3 c76N ;A(y"Yr3GD(ױ?c?p;s ~NTrB(3)AEjr &w6S=LfF iB GJ}^v~].ÈbPIAw``IE zjl%te삗,_yt1 @ZGlnE=ݞGz|dO 2Q.9jF̱6?-!0<znIГ#9@ȍPPKc)@ R 3h n_a#u00Ġȥ\mC8wHpfU iruĀxKYz%UUUUUUUUUUUUUUT [:\A)Ƕ@Ifjk((#sV5^|NtL% 2@0,D #=-p`ЎGI|$W j$~ wrf>4վ26hDA"Mh4Dg!•*eFډDĄɣ1,0&|z0Aن=G :Q LZ)]I) d]N.'⟞;qcpJdPm1W16K!)jDþ72hg Zpm`  S*/P4M u$A= M[ ʑLcY9*>tE|\Tv!i`7)KFUP[+MU5,-TdҰ RA; (ఠW6$UHRVR ɿNR!"-nw`RS !5 0hNZ(3| &XaΞx1QЌeV$,hLidhP#>cZʡzʓX,npL<I7I" ޢ(o)+ ;[h~) -Yʹvu@ȱ`ˎz(X]΂߯uQ4I{#@dI^ ˷mtozHl#ovyeBg% pA4XX㠅✴"i Қ<ԐH9'5Ez7a!LԐ@y` U>S/0p) բT \'B/6p3'OG~}|!SSLICwJԷ!E=*RMBąOGOnzb ߂ 5Lwہ.cirzt(5\4T#"lȳCr)h` 8K|,}Prc@T֝F p0.YFil5Ĕ5F%[ʊ& hdmYZ<ݦ,fN+ +J: 5A*)DɁo7ӺH.PN:XQC`ƍTysG;!Dϸ_>G|j""]LDK5@@IoN@p}0򃉗Rp!|*,VR gGkk-.⛨UUUi^s_$Ern># X<ߪy?=XarVK y:ϣG/6?/5Z!?;,"5  .!y KB('d>N;o9]?yUfaզξmF !]`bșOP8cTN--wY5ԯԆgh.יjILqxTU6n%Zzt TV~)U[.DtHhM jPnw(oa= _ň*4k'mRs]DGtQUc:64:OIv5b|vPe(sŖѝD9,Ү<6sRzPZ$vjc)ߞQ[&([Z/Er#RK3 fj+|-8@>L}PUxJĴESGI7ɿA&T)tO(0܈bȢmd1ctL=Me cQ%0qF{3+F"@hvtc,2ȃ;/z]qEk%!|>O!R|ȢRYrTCo! |r `1PaPAH$xe̐ >]ϻM qX1ޭI*rujs(u'ȀepTRyiLi4BKA*&sdiO/gJ$m;j%<-V;ysa{eI=~wl9)[STN|qEsGsˆR64lDQ[oraI`Tb VFU,#tiG =Ӓ$܎>"䡖2eC$51`׫،JP R9\Iaκs =c)"6V$3 ን(Ԥzg'B<˭NLPz ]&3皨D'<YaIE`Ϧ" ن%kB 8Ay9(̀Kn%B^c*!c"7@D#,Ѿ|qsB:z' ?z" F(dF“N8e0HiuбSse t#1jH|܅!lM ^ADx]C:qrC>zKEùt"UƓ}Q4mDIԚ9QH8~刵)Gc, C-ޗ?!` !̉>lÅgfеڢ C@:;%`s_ƥlWb)()BZtiTXPw% 1Dc(CnGQ*ۛXEu.Na,=.L~mG׫pVĹW~yҵOF냸{Tyh&fB M܇,i+u?[UFYCN;wM3-"2ET!͙-#9\h)EU|P/XNB7]u@n088d GH0Jn-Z^bo60R˷@9:qyAuWhD~$i1idC!I2^-9/h:}tQDQ <c >RBU c- <Ƶi)Ah;}eđF:}(*?`Z=V:I'Cv&,4k4xjAUT-jΊ܉ v/Xt5yNy;}ᒿÕY&=kz.^)dyjy; &6̳4!a.1Kk2J0bc.Cc K5S ĕn>\Ƙ@!&1j]0 T9\2Ea9}@O3)%x5iR"0ϧqٖh979{d5(U:k2$b8rel6j.ll0̊.7N_Nr7H77s9cI9Xشr֎涾fBj^2B6.m'Gü8"*&sV&Л̜hƴjx_Uk"}Yi~G2My;rz;L9J%N<7utÇgf`-gTnzEѾLY*}h'0S&CZïziKQR IG1FTGoqz<*# W|vKvwkG^;Q@ Z$;S3u4(oN {ջ`&LDI~Jr>R{L< $!MuC-ty2S|N5\=ZńeLWDSVBYt}#9M`>swGWEn:2{vO;yOg:Y}~mE#  Cllu|皺G=Ipn:'.#Gb.J ]?ۺ܂2oI'/B_:l 諌ss>*b0¢w)!sOT$Fsj<7WG~i;|{:I%Ur6-i:-_o~z8 P $6վQ~6irZBݛ/vñg 놨DU߫ N]w\!aoR)oA IudoybyyP7<:~} *QD(o"B+z6YCI1܉ɮćOu|o,N3?Cy(Daa㐃OʢQu۪97WEoQza8U4d玩^9f]~A;Gܴ܉E6*yq,*ltOe?gep1 # fQ;J)J(;sڈX +(Nv1tNRE`E9dUG gսZ '4HDTȌt6M4PιK@~ '5"=DBI~4^rKu@}PEUXѮmP-QnW}.J~h_wж8U:+t~y R ˓JD%U1 D0pm4.vl" )1ubBz\Q@2_ؖڕ^y5SH28VF R4sm̰dp@J4-==D%I8i%]1pLO˷`~?_?ɥa~pVw3ݯ뇟3z񬢉9<=}2n,[jW趙] D6Og̑L$hf'T cQ"8L>ԏ&(d]|\D_hA& Jۅv myrצ&T/,UkDEY9lةA"VbmPØ2Ke GQȝAK0>QHU8)ZTxtzb''9N9{rs=:Ԅ[½A"WG­4JV>J?w#k-6D1oVWzP"360wZ!O{.q5#0&[E|E=<[Q6eOZ !Qe:MKsx$l= XmE}_q&ΑPnw%°0kс{ Vpdmǰ8`!u$Ph3'KK0=k'L[v# \ahl?7_gB.,]-}E{-Z}|4Yi+cbRR&Pa(D<6dcoCm[KMs]K]b$[bâ}N\Jܮ﩯968HTmpOwNn>s=<W.&N"n,ڈȲH#}? f6A|*h$l3 ݞwnm0EIfjy9Ԁk0É2(>|;!s7 ̎q#Jet(#y`{1|Njf89be`E&fEfq\U8@txfJh:*ǡr"6777/}[7'$wTö?uꕏͿC2AdL3גvHQ]'r*I^=/gE  U([/MR:lp5"*O׼>4 6r0JZ{U$xJym۫[i_^MKTFwM}}/%]:I4\HӹidlM#g~:R*7ᣞ隆„ qҙgPv]\ iN8_ &F'W>ge{{8H9SJ{4d=Se{zӇH(NΨDkKٱ  DtJѠC[Z@<Ʋ~)ѭv5N052 j [mӧN w=8}9KȾJ1D QSJ QI~ՒJ/sJ %oZnJ^1(-FhpfNXjs%9[6NLM\_TsatɅe0j=9a2xmE=t>܃ANCqnIl!lmdn.=|&Q+X ,D/tIs < y,^nt&icbҤ5[_= F2Bnfol%5CXKPc8a"\W:}ЫcSMPD0{rF2m-8y\z1j9FNG~#ר>D Gj}gRIVYR2Go23#86vfض{; \a!M~aI]u*DLzN8Mr 4c戆Z?Mc+w{aiN5U VO/?'U_ ޣI=U~Ϩy&Yi[ ¹bj Ð|֕ՏykQR{Pa1}(5jKQfZDM:I4)Ij iN9x˱H8rtR|^q%cTHÅp8 4mVi7ACSXT&'IiUqe|Y8c7d,qxT[ɪ^e_d?H'0OA"C@?qrG͛J#a BrzuiX nN?P(=E"2c)SrЪ9voRA_?2=@hMo'mU}(τ{'T>-o>K3KZ< HM{0QP씁1/IzuMuסp|[؞&D"oaC MSkАT>XVdUl uhTz v΅E7A*mX 0 ( x# hq-jGHHRRSaVx 7lwUǖ M;ܖzVYQﳙUD̢}+TsoƷ HdMa.l{}'SgfF'SbҸ~C<1ʚNҸqJ~Op16EؕV$z;NWM5*}綺.>&`a' vFV FΧVcYBo(B7j@@y$d J9nO:|LkX'_:;$Pak2/O5{fh^a0ziQ7,9;HϿu(nҿEBR=DGϲ9RTMFy-DYFO \"u.z^׹D5BVVd#j3 HQW_ƚ<-`ꅰQpP)D B!f?^*,9Ȕ;6W)U;Oy##$x Sz]5[ʅAbD$AI财P @QNVXDzwhk6nHj0ʨ23o#H~OxUH|1i`!e< S4ШCPa֧Ahd}j-%3 1/jXG6)I !2 >-wڅبd+DZ]Z 6Nbq^sT5{^ռ1sy1k8lߠޡST,ބPsT*;[5 @xD0)_1D>LtIc/n8iw>11: hG"~Gp29B=ѯ֖!`GA:/MȲj>sC<|h\ʟW/5GRDGQZ=ȿ#D"&;?Ki׍'  Su$9סj=8% 9fLxha}}-_)|>̗o6}^)M82sh"ʇgR8  !>]^j4>wbm_o&Gkz#t00Y~ڰ93))Wa`dHTkDvt\o(vכ~eHgwn=I" 1Y9>CRa=/_Y߷v?S+^,Gv,xpkQQAL"Q0]1A? h(*`o`0^R)eֆqPȔAG9oنP~ja׋4#QuxĤѥDJt8%DDP7\ejwIwl"2=Y"UcݧtEx._W? [Xow<<ړ7KiRJʟD )zQ݀0%ݥ'Z2riߜuڷfmR'N+(mErvBبڨP=>3uY_SRq‡{%.3(iťҺww֯kR⩌Nnׯ#`ů%W=|9"lnfnNT3ȻwY "*R'P3&/+)E(#NrÝhci4;V](AZ:uU~>6*7e2L̾M7??T9~dWm[Oqr|el=mqWuM5/xGp }z!^ 퐀 -!x&鬠3CWF#Sr 1*)$I`SYfwWv~ oDW|/yV GI ޚ[y,~9w)$ſg/MO:C?'HN<ݰ;HYF2i`A+lH./u4tl+.nX.ˊ1klУg2,5dDhpF2pt8$i2 $"*f"f""b`""f"_+ay!Nk%ȱU7`S؄ @2l}3'zTo;v"Mtp`0^SVB>u .vzS QwWyQ[ٳ:窘<ՓJuC0FY ?<%ײ[i5jٚڵr!rīXڴHם~*DϵU ]sh^<5Y5OM^0f}1&nߧ,>d[f;+N7p@bd8X\1F3C'`G'/ROȭsVOJ?Oɯ5Gt=FtWգ>1" *;UCbv5( Tsd Zc_n}zn o*vN8%\JCHGȨX uG.S:Ʌ~㱷'DzȵFlֹɂm^vdI͜s&>W3 E(EMx[n[`Fyz0u cD6& 80{Cfpe#8Xi}*jO8qQ]LjF}o6 ۥGI.:}87 |Dy #s)^>wiUrmՏTR"gb>_Ng"5Iy$\ba0)B@Å!Asq^9BbD~}bzR,2LDMacaDLcg9B *-9;Uk{63]M@Wt@tH̦b}e7!7Dpz51lХVnWy=WejeБA(0(1MJ8(9Ku ;u _-63D[X# Ue:cDe#']*fU[9nVTDEѬcxn4URHLNK%$v7(sq܃(Q4"I&9gH:g?ݗ[k8ђ"<41i1hU% * ۹4: \51M6pŁđN@IN#߯pc?~ej7NucB )U5h춠,C8},8]ov5g2QZW]R:,"t7luF 4AL s+ȼ|a 5ElyHI%UURxP*/%?xL=&9hR1B閎io#d(.}*V)},f48{ql^E%J`W\o߂zMP8;~Oا~0Uʨ8DSV7{~MehᓳRvHHe-/::5s4 Q _\K)G'$z0U~O2Gs:ǥuP[- 9"-v](v6o r`4ʋὫR\_'_3AЂPcPhҷv<\Owm-Ztjnw7'it儹9&S}0{0@YI!֨-EVxs̖#/G>ih:.vQ߹|-.1[>Tv=ӑ4U}$ B/ҭڛ6+d1םH R֝[*TЏ s~鮚s̢>:)nFYQ1,KE&T8pdF8$2"㐘8EUEkA% ^4y@dюA1TJ tb*Qxڣʼ]t0V#&f*fxk)c܌]U n=L>GB}jdZg5)Au'Ex:">Ц||UQӭ)sһ!srxntH{z2g]0N#Oc" (WV4 )ʜx!_bA~`T9gE M@V+7疅+uCד7?I <2|2IKgFA쨍<y-ugrka.wmޫODۚjQN͠:$=u$-秳~l]Pl(C?" d#uDqʂUxRGa&I$2er+.C!>$+MPQCyz4M \kx꙳FKTJQ(Q\[,E$m%nZFu/LxDںϠ GKYT=\wy_NBK***^>mN:/%4 Hu~4 ! hn 9‰ |z%{^z)x5*MBFaa kNrc4nUը@LkI\sMqߜ&rʼn |Lۼ5-]ZVG~e; 6Ƶko-F\Ca>7߾ʖF&Kl?F5T2P좵aÝnTWK*;\,GqRĪ3Ä _s{oq(ʪ&*H$itx4x9B[:8{4X1/gbN^Tv:`R,ӧ>䛷.wÆw\lT]wwe}"u\&9v=+̥5AS%cNl4eBetΜ[|xAobٜhVg(tV ׮K̚\OHᔬs++a|J"+ )EďAg7~lfEER:ǴwqJZߠD,Ї^f}. B=USoFP^sYD;%q+QuV1]cxQhSzstw3-T?7"ZjI[_oP3 JQ-Q #y~X|[.^S0Ϊ0T!#&kIsT5 t' P A k(cU<޵C[%~.m'UWeZ;^]z 2{9yDCـ'Me< Z&Fa >LMbf crdWN{_Tq%Q~˩#)vįoイGꍯ;HjEV=Q[Oe:(Yfj: )*PO45oUpo:: E$_?%YGp|S @) T'5UHM``3Rхk9|Wy=Tv?bqDQ{I4Te'>ӻ2E(9.0=Dm6u'86GwL4~1 BFA`H !bT WXieTLHmz/꣤e[L ?þ9 t$DYQ_J/U[a.7k$N[U .sMcY|N _UۭvPEQ5Dqs tQNIDU pQ69|\dXc*T[t>PuveĢ =$Dz/Ы){0_)md`FTʘey"}C(\e(I'2zA~>?48?Z4ckrBQW1VT0PAd#fߋx*FkKUN ۷ݮĩ0njZ?ebiuÆ(Bj簝V/w 'M,aAnS*Y~N8ʊ#;m)79 rOMer!!Fa/: >J[;gSkҁ7tqt o3*t#bDWdaBUDd%Ndv𗶡)As6%C\4rZT@1JXg Ua]!6D$^! 7у`w ?)p QDxX%үayG\OYͲ4K*x*|+|tyba "Q^S Liru1S3a%_9>*soB6T$+#:,Z!:gTƛYm$\rvvB[Ԕm!J~1%F,0,-ٱeii=ǟh usY"mbO ϵق#=(vu6X̴.QеÅ2at9';{O&{uңJަ}zejvW"F}z,c_ow{{H+J AEOLam^A$h/GE^4Hn=k:Oa>{zs=oxێ|BާT,8ܪ_B;tRe $ң 3+bC`J`S_C%' np-iSgvw}&בsZ߈@Û^Jb1R`7$᛫1HpBG24"?k *Al@U)Rr0J4U~;~c9U~mZ˃{K3܄"rBhUr=N^*y+EM)Em1Jh.1CC),#;i̾=FUrZ|t/=IVcTk!Sr9鈓 5 jaY\M 11~H5 Sq, <ۿ'?> ey#Y3:}kmr?jeUU<+o8{.gfg97n Gg W6B!IvRB76sfݛ*[ڿ9HJTh'ˌ4?d <%IlkQW  Sv׀y89UX?Hգ w_s;WHT6D3kZ\_:$=^Ln}*{JG Wt}H{eSsˡZ|XMU+crF`r+ 4 'i5@^-KNG3=@]ƦEu\F%Ѻ}K 53BH6"4[oZ]h‴t.wgͱb,Oq@ܘ'[vpamS{q%).TR@/5l+7!oA ҟihfl62aUd/>FwQˮ&l)f?>/R딶Ud|f(Ɣ(PΙE\PD0_qO] GVV[WM1X3JB#`L¤ VX3|U*@| 7%@͆6JsNr7JO%ܸQl5=25>Dne}[ujQUv] u!f!> GO'EDI郾NwH#FϥM%{&bH&vQl(vJy7m>;⺣K_v~v|bZZ̤;-;ߠ!r V}n|4dzi):O!cǽ}U@*qnZi1$I:z1eǏGqS?QD7o-?EFzxF3'}T"+Uw8N|Z\~"hf`ewOJUB # ^c'wOgNI$dEUUUUUbfU*Roew"Onjt&|%&&N"R=srdnX}11] &ݯ|VOJ G] ,wVbDaF4ȴrC|kOZ%;3 ?[TrM`sg(B9bR#g!{>U ԰O5KHS,04= IEݯ2&Яb_Zs$wؓkM F>% 弓puY{<7VK'l97zƼkz:h7 @nQ.4轵z4Q^c9tū7'첈JKh4:'alݥȁ{gK9?lkrtCF:qBa= k2SXNG4aCK9o!]Lt*LtX?9( HA>Bs *4"xc4 / ?w- C;XmGDrhOrHOW/c|yMlγ>z|KBv =2Nt!ղ!?UUUU^GDGVb^Uχ.'9y6iʫHx7˛V}*QG&ȚF h@H B,u?a|bA2ytt{%`J O\V59ӂA[6"UKҵ,+VpuC HϷ)|1+o=Yj`\\cъ ǭdY I\Č&qTEf5t:4-W-ܼLp؄g+b@Юu|qZD^CROh_Y2,ĴFg^/9eTU Z ,HDybT%N^y_Aj)GJ(?A70I#(smy9VңšazWV2uU#}VX`!"*0\hk)R)oyL|fkRu~sI=R.GRn%$UR)Uh"r'ۼH`άed\$؃,|- $RP j(pECc#a7'@ODo g9ۡ#1R"~d"iDJ!Ye}S_]/j0u̲ ZE/"oKTĒ6Ĝvrа>ݦtovf?mJW*9C,3M ĻY^ UdHyTRU%fhIp *31a;{;"p{\D*F |HF柎YηtwGwɹ|{'HLn)K7вIt!H{; X┚v0)uƳc|IG D#bs*Gt]ҫ?>d%'%VFAaO9JVtONBa.C 'WS 60YSAJ]cC{C ]IGzrypԺH3X^qZ hp{oFDrVmC3;nODz\x8H) €Y95;'%rҨЩQD euuPԨjO9 ?onl#t&~_9?G9_ xk}95EyeuX]uPe;V9TA>b46j}U4GDՉ-SPiHp 8HbIx:fV]S#Cm!rQR&QP PDz&Cuq?sOVgUtD~&yֱ4Y+VDLpAj~lֵk+c-C8!X|a}DTBtkmp4@bwKZC/Vl I]x)EcziT$ݘmnTțѮR25G6KeVq6[mU?u#cG1Ⱥyզ?uW\1[vt|x4CN}s8[;6:eF׾˦vnv0q5%roplwtzqs mn-ʊ-^^|ygǹ suͼ&a:U"'?=2kB޹߮8=r;q=^ss61;+ז50D>< #&tsR.;ܝ}7$r=ݣ؞VPIatMc%9,ggfr{h FL<%cFW.9|ǫ###\akCsUڈtv`:9.:sJ6cwPDX.v8(9©3F%wIvo^#F:^U^*\L0{TŶ?U#/ssrcsDўJm\~m8(i`qZrS[3wV+ianeSZL`FF ۢ-R?)9 Z2pQg29@8(ѻ=[dŝ.;6GF2t077$HX/-^UGn3λ2^߮MR!n{W% EAfZLOмh}6m7~hS&[k[-9F$ټZsDt 5-x qJyw N 0]^YoaJ;M;!0REdzX(6ۼ6roNHPw?6ؐK\7aQ0Q3i ~4I~h"FQA#smM߂tPUVkW!ʶdYc]BrsVEq=vȕ,F~ ? ba:·WcnYϗvҦeZgy8+' | Q%DT+9C@=uy04MP2fWO秶 (av8i qE ,x}JT`޿T ~}0$[4/(5X5~܆DoA>.Eǚn;UQ ~ 2B38'b#}w|Jj#4e9k!@8zNZG(H )GG-y:N~s#aC0⢈iKZšc|i])Q9~mӠ[[oz޻!ƲYfqV穔ƀ;Xcqt! 7ߣӔ#z@!WNhΓW>3;lWA7Й|r gܻ "\Wc!}cF~e cŘti0Dl)*!shx)4Cߍ# .}J˟\0N|ʺڤcDPu:o|tuGJ`4'8$h0PXjmr؉ :JlL]Z'bq7@Qw㻪Bo/ɸӁ:pn <ڳG).tTi"%5T=%5w),y`>q@t|QBH6ℱY\gJ+;m q(ti")kçk oHT\y7h艹AV=nu1h=,x,bj+aK}3~+3Š($ 5hR-F p69_JFWvgK)T*_,bbC4grgڏ=P+OxЭ-Gs~1H6fït+ңt?+t|)ɽl'`)D7,c7l5x* !{/+f`> JF݅$Xf{ś*|L=6dQCREJoqF2"LPJ D)ɵMyTal"~t0mP8r"Q㠝AyD̟Un}'Nyk t-HUAO1SUN+^fخOfSEv聣{e߼}g~?)@t: QG28hBaGRu"{\"8Rq0V P94nؐTNJ3&@s]2!ETsNS_ 3׊|iDzd5%K=5WF@~n==J, *JN7L 0w\M5$ypػ4(1S!%@Em6H}<^]dHo~ kB1K:w<@C-0|LkOZ\4>{hI"(f((=@*0 pmբ#ev|4cO1Q9KU#죹ծc? /iRY"b,bn<(_!P^wRE?k q߅\a5CLJVRԨY51~5'̥75Xۣ:ݦS\tCi>=?Tt^z+yb8P[iy5?s@ݪѻ*!]by_K]6}݅;Z9pIe;hӲpܼxoZ[ t'g}{o<y ^m巎luX^2kRBt񱜴ٱXm>H+oYce粇OOD2\煜7镚,xE|}v_M?7Cl)z˪ݽTϟ;ܯ솣=ѦygcF@@ڛ4dȏDxXޟo^1 ?;A\Y9t.7ERDI?嶕C47?V[ĭ Nʆ#Liͣ@OXH*y+ٷGMcʴj7+}\w+5NCC6Ώi3{Q("mX*m@W76ƾ o #],#WR.^,} $vBgm\& d{qcL{UkF\Ld'T|Yh-@J],<>+PYUDw*9^Wk+h*˘e{ ɕ0ig_ep_QÍγtsn~]zQrK?D쿗UTZImƩYݷ?ǞkÇoqpǗy ӌ!SNό9{.9V:E/NE+Y1ڡ6\Rէ+~:Ͻ|޴7(ػ׳N]IQU\o\6{mlBS';,/K]hpOVUmY vf'Rj'mBӯ!A<0:}:UN١0exw'XxUAqs}Go}piꂯ0S; >T< Q͞V٦=&(5Ƶ} : ZWD}=+~{{-sgyv;Qj}?>M? GW UwſHg$C1O[Nw*Ćgcm OJj8?Xȿ&g*݇Z4s󨺻‚ gSSs6~pEÆ!I'e$pȴh`JHT!B!Bt% ?.!BIAA3C2蒏g0Bc%\aH!93R*?i Hڟ %xqw R"$G%.A;EWhp\JG"S(s:#:#ө;J"t!ޞ;b?G̟r?3uqw'D!*i ؀JW? SfžBl(~saߊ96%I0B|$$R5zqS MO K E!5|ĆF㾎/fk1$=~Y~ߨ]C8`徜j~7a #sq5'wqӚ>r=Ol))+rft%U&~l0+M YTQz@aD T҅+2'd㼣>pb Bqt ¦41aF0A2E$H6Vd HP<cȀu&$$2 syV !XЃd& HW>=iPm 76ðF!E0`QQS /N`@ 3e5 &1aXA~b ,0XTeujJ p%˴@8bbIs0 ,K 1JU+]3;l80%TH`!#VDፙ0'f%]WFA!#R` , 0tFy{myJD\s7m @̧ n>!b~1^2J*22CP!H<Ϗx0T&6TJ?|$Q^ԟsa!`胺AaSGr)B$pE1bkVP52kSz5Qy]|}H$Ah5݉Z5U+O7籭VaI&{0,IǛ܎y/)HG`h E!*yHb.4b 4µu94n!Kg&H" EaZm*l PQQD'?ipjqS-M(ͷ21.qEȀfw_b`0hL)= 9 âM70 ~Eɘ+x(ba%haZԨmlihh$07XIsyAF$""`HYfY0(:VBƛDCK-|M.]}_9oՉ^KANC}5DL u;7432 ZxeB7ځwಀYn" &B_P; ƶ3DQ??@ݚ 9@[q"&n`/8S9C= C8}a7@pE!!!):wE:76!J5{=E9x5SHs:QEb#a=˳,($ g`iVFWkθĭ1/#Cr>V1eO%f~KqYRUUUAQ}f_NbD4`Z8 ]y wB qA.`!/qKPY4BnBxtDF 4`șHF[Q H1(:r`<|0^;ҏ]x29pCu0LMM4z| b[敽i5zSaUUUUUUUUUUDUUVvXmu4z ` XtKOqLas-XLLLLLLLIm^rSp1NN\0Xcģ2US%b(H{cR$ 8aiNU h!֝INuhcDPDDQsac h! 28HF@cPa9:b:)lG8ǫrۄ(st@:" &4ɬ2$YIBLҿ@gI6anĕ,qcN+L, #i!~g?ѕ{uy؞625c"7 UW U?ɓ]z񨇦b\7ȗ+} U\_Vo9< ڢՂ c3*^)N]ge2NW(UDEOx3*!TeR9.pA{ʟOt4,4GWɣY]G*8XAUR%S[/[#:WkQ_#Dyw9}Iۭ?]4n ]Sf~~NIxJF;^Ή?e?|HE(eא(+C&rhƛmN?a"@ƲhMND=sl<ռ=?hyT :;L(7R~7(D)TCQq{Pbn_B !?5O@ٛ\[BAPz$f@n7aZxsY FRq/wq4aҷ[(QM*Pb*rkL8lh!6dA&, &ԙfјsj ƫ:Z;iKtj7m:j ,<c4K"0nƚl<˿]{a07 0Bd}(=CV{x0,C|Du+f!".ƮN}%aK2NNK)=?vI[yq8X\l (Cr]^Ad6m3|t(25 gy! WkMyxE9)c]!< ϰ,2$X<`!s s><Fy55j%YE + ;G>gvVj#ErGbqO%7[F&sZ/zf}d?%Huz!4h5Bڠ=H{ / H.=JO}IdP4+{0ųP耽-:`L'XzoPn[2[alzp>5Q y=B,Hn'<->\{g90CqZ9cA&l`s!SdXBmZf8x,"j5F/G@ IGd LI}A}D4n%0P/`ԏ97&/esdAT1&#hG䎯#6۸54(˥Y.zfՃVC3ٰ $27mLYmϠ78lY9QsgcYۤ$Ϊs(8eg6 %uB>|`2I>펀 -U{B 7>JiM`Na6 8Rҁ3]%P;4 ܍u\IglްԄ_?J.xcGȃn6 fزZl_=P6췽>%r[! N܇;7->d }~~jE2͓ǧz{jߍQߏL냟ཱུߓhW^S>ΥGGL~ǏJsƽE{dEiӎj٬)uz,dU-vlFDOШF~$#e:ݰr8E ʪmn!u×0=8;Wevo*tZҨ{{z ú!`nr;gu?ښN l<7E"W`rBR6UuS2\92wav/FL/U Py5pf,')rܡKBQWfo+WK|7t9((`=OS#73϶‡7b+-ȱ$ʂ&ձOz.NDe|ۈ{'YĴ IVl럦 I{{6ru^5t9fhm_S{<6V'|~{4~X9)A̝ L]Ҡ$/tv-bHU\ݗy;w߸봝fkLdB-+b8/~~u-=wobON8_'N eu2?p雙PjVeW?~_)C'[S;+(=~ىM"W{sS6'bIs;~wO6{k9=_}s Uϰz' ρyMcrhȝsc/?ӤDC#ԡi9㘎`W^jth+O:[D!o"PV4;|q&81wO3ᶁΉx:4j73T[|X}wDOƊ=W_PN/N]F,@PGur|k-z !OpI]b\G_xO\kW*uG7o"6FG(: 0c5<)*}Ib7_Ù|:Rz4~숞O]ğӴN3CTއJ>Ϊq񻟢G>sT ^U-o$ ,^JO哦y=>1^wm0K |F6%OgXf $ ZA6{;^ GzE5? GuRgUZ:'QT9lvuqA5 0+C_&6 *]pG'6%Χ Ş-ܗJp={SSu)q -ADS4V=TlmgOxZ6ifji7"M^0O bu^ 5ZjSFOHU,MCfpXrj/xDCZǫgc \V׫wi2)+ޓ3{(Z> 9ЮQO}od.'ӺxO("1'A9[ B7ADHDl8l<'z 9$";=:/ݡPWGh%dU>2ؤ~ZY0-Ȱ)8|֖jE&vFNd+ٿ(-w[."SKdQBo37?zS>HuYjoc1h_:e_?VZmgKSFUmMd第;ؚtѮ xp՝=οl]"mE*/]XC{dozTh+/W{9H9\U>UWZۋ4D}&s^_ZXG#p}E/Ng :{7ëy\n4;_ FbGRs_K*shuW]Z7i2\q먠so2B67VWï|>[,?rJbe7E,h?u_<(]u,.;ΕQl`Z Ew]l)W#jib{XUt)&_" miQ_2b"0%Y@H= P@+p>[A*|VV(P #$(sk1dعeCfD$0 8ABJ4RMdUM*Q Z@ 9 #P$X" (Ο 2 ͈A4(=%GX~~яE<j)`zN':Ib ` Fey·>86P7`PJ:0 f(#x8ub~`h ^<&E*8J~_x\ H΂N߇vWL) ?׀ pޯ3>Y_MhU$ QK_ԏh6ɻ %B$Qoct+%ʗ:~fpEi/ ,2Z_wcnnt[a._z;ׯ#-v.i߿GlJr' =Mhӝ[1heK ׋]v<޷gOM]ŠjTS`"&cBFҶ\KW3GIuugn}8\9}J# 7\SI:ma`:JL c \G#D5()GriE2xQ l#$OOS %Rh}x;m2fFUEQ9{-9=.$< %ZmQR=%O14O""g9xIoyP`cYO .m eI!26!yO.GMJykh^>}۰}k'7Gv H]{z­U*q #CPE,׬z Np`fHUق\%NnXZgrjRgm &#ڇ5^Ӟ}+@yR_6Z\O1~"foq#L)X97QJ$g rVa$.=rq}A\1.S!9`C6$ɩR6pZ,([h0~<~m[;VrTh'G†X9 K /:сMGĺGf P_ec=TeDO!G6x˂ *|#%"/?;hQEU4ҒQΰQƵQSDR;$#uU`͆el5.rbه`} Q oNAXn֞IpNu*d."+l-M餫ƯU>Nƣt}\;CA"ˍ'K.\-9v)/ո\ovfhz<ɶcx;iI!O%'1:JhjhG頖7֟ךܷ4t=5^f;Ai],Jc<'}E !$Gׅ%ofdȸE5@*}kgjN> ~p,CpUoiĒȸpv ?Q*'Uq]JQVo.yq oU L&_u|pG?S>Iwٙcmgp4EIQrlK$U0i9<_ j+n@,TT*M{ Zv]})'v)bN@EY "9 J'SRdi;i>{\6薢H,,>⭩a +ַDaRG֣&-*+!:OVT֛м+^xJEQK"oshF.R (sPu!I͵f3A7jډrݵܞtJ!Ѱj*Ns}|‹;8՘$^rd,./!HJ}RbC Nz84«d;B ]sBf<$uſM}j' vj)p^YԜv_J&AXXR 1R:'0 6:vfL X J0+GSO]֗BR"Z]f=SGYZ`dZ8\X(rRs9 Ge# ț୔9By(KtbR) &"TU$Zx`Nbzb1n_'V%Fk6gOCcY)k9jY'#JX|sݵ6ةio7 Xw{_PxgYsY%bUQ J#;jֈFn11&^̺x]IP汘/cufbDoNψZgLے>8['ڠ*&oWzy&‘z[>1;<*L,UίZ.JoJ8y jezs+42|CFG.,NCc =fnp˗c+B>3<ݫcU">smqT:|`ҒI1tb+F3uV\Mc7yƪL)ik*fSw4(}H^k2օk78XO/4wƞgf ZV5Xί+BF#Q)N Wz'46V5*!5265VȻ;YΕ5uoV*l^V Rx/3z}gZ)!̡!b*z֢T4ʬfnj,LխB,Z+/hďF{;O sA5~T<3^LmZw|NʺB|7濱9$Gmv}1}K1?s|1r?h2#&FVu!rK@H)(ObF5H;dIB(Za%D_U1XFB2rmMG,wwͺ\$7M^*QsRZ'p 0qLiJC0ǁ zTAdDH;@HlA?kZs:pb:{AbQ&^x c jJ7h~"~^}mh MCO)W dE.eB87!wOcʹuA:4< ɴYQI@UB?.?MKҬo~$)OȞ( ,!.1.D8v'`ќlZQDsTreSɒ%4 Wj!`BmBE3_6 sMN&rT'Nq^{lvͦ52mf=]8Mř4,|dH>î1B'd ?;p^G'6 qUt "8!*H?*ޢshE nFylj GDkv"A6^LP[V @`;ǦK={ Hsa*^]Z@ao@rJQډT&L6uVGȇs^jl6嚂ׯ/$!kG@, 1v! Bi$!ukm ĎŻHGrPi 1r2ՑCq!IΎDQ?JƏw_Id"`v~ێE,P1("dw6RRs(9_B?sީcξR! >S8x]9~`ϧF/{ s= a֎'Mڋ#C@FݹGm pm#BQ@$r_jtxÖBeeǘuϻʮb!0"˽}*|NLK #zebn r5{~ǾY:CW`Z"dSϘSr,e8 z`rZWy/GzQz"88'Aq.s֪1U~lz>= !5l:M;@L+k 蒏!Ѽ}U]0g>+ƎcH'1! T`aFk=tXZzr>k=shr:ڭ:U[*kanS=^W^M@4H.S/e15HdU$O"E<78A$ yhPm^ulz) 읡 m:7sTt97F]K7Nl#PFB f )8uH}C'x:FG0EvX K8PTq9^_FJ DP"au75Þɨ5t`,! hIoWKCn >5lMR}FBkZh Xidvi*J+㫡*dr*9y"^ha3JJ0=X-dx'!t}>9D5goݠon?VG/ysAh~Nc3{ɸ%oZ͗Xt6u܄+bhG#|p#0P{6u{r1-ئԧfm'-'?)ˁVmܲHâ:wg?9N_\ kqeFqt6s~w6C'hS޺^Յ·O6ޡۥ`,nr%Fz`P4)>] ى0aq0}D,ij5D{-M!ܜ^o::vLFOW. YÚT=%@ i{H'\ 7ғZ Uq:@;\8ԃ7:yPm֨Q*@[J@{"P?C!UEUf#K~'0)x(P^ya>o)3cTo^6}9+_B6$;jRq(D*>ctn ~ ږ b>$)L|J&FƴEߋFzC5޷-\͐}sT35?{&IlV6SV?9.u1u .\&TU5 /cK-KA'[L[e5_bNSC`eϫT-}#phۜɺƈw7MK~FΈ޿~=lJjBړR^xF&cV{t^wODm0R_c'TiǵMT<-ܯ1F lAB$ z}G$Gp {rnI$AA>0OB%cͷ<_FR?5k||$6l)u(I4ħ-$:4aM+z L[! 9.}03q?pQq?t茴pܸ*z_C%q{_̨u05y3Q=/xVNE׆=6B^<>ק۷W^="aG\eiEbZ'df}55-sj5{ yQp?%AJDzk$j3"!^|*MH/G /%$-ʰLbۦJyEUטR?džEP͛U_3r@1߃&ӤǬw%.d-[FGy҃9' ?gEK5?~2TidsѦ^=g;񦾸@}$|l>On_{fbLVѲEjo}T釫>dPcQ:g,;40B׺\HSUϑoBA)1{0Y6;$ȘXtaӎ!6 &XYUXYBaG:fYưc9g6L]qxCn75D;f*I9]j\nrF-;X9!"M\e=.EQ^.@81f DbVӴE{gU>l7=4݋@&l!*U~ֵdld!D"zy=azkk:(/ d8H=(NN*̃CCx!+&)(YK7R/G_Đ2id>l#   -3 ׊6gq|5!ke90hʆFИVʂPl&aM }Xl+Pt i`8z!&yA/A+suT%6U1d!ʥZ?(uḐ>e u<V0@x@3 %2'䈡#3}~X<=|%]IӍBaYp:~?~ꦊznEM6nٰUUQU}-@DD.Cxö10 cGqc=.!֛^ Úҿ9'CJ!vAdy+>4GQ}.{y{Y{(NM=]SB,f]nYVqp 4ϐ؜4>7w/Q([4>s3'yUƿbQiom4~նN9Sm~uˎlfv^2׍ꖉ5l8Opխ })^50 lM6[Ӈ"ڏ`Ud}76*3y/U$pd'q{8_ 8N:9 l& !eui\Mr>Z8n {$Eבp1!g ƭ&#\c$C"HID{]>0T.$INC@'&K܈Ɨx:l m8+DJ3 0=Uooz{SP*Q(MqԕkU0 "& u% Hvn=ܷ\z(;3Dx99O j5vK1jP͇Z*=TQ{gw3wuqMUqz&M!qEj^h[h wN&!wѕ(~ ?DKH<7; eRat7+&U뿜d"L&>6/R#~[*^mFUzQ3fkę4mĸ^Xto,y| 8i[:}JrGkR*N*j"\ooM0ѥʥa~qXAcDn< Mӿ'N Ǻ+F9S8h&tE屓u8h>ie5qBݥ8卙Jx.B˯,Q),b~=1Ì (TJV=>4`AV9,;>ͽU0Ӣt>*'(zRnϥp#p;~22PN{ ::͙ 6eo?0ƽ9 O !(Dt6sW9z2N"LrS'%En\nԫ*(?>Z ܶ2_l98 "baxſ+2Nezɼ.cFľ D ^Ȇ&2ՃK~CBzA?MxzfEڪMа왺:өT0V9!==G dk(\h|/:Ϥ􏭨7Te\MhMTs<Ú?Ħq3E|&\}dhӏˮD|aCsP}޼DOdX_}CTi]sMVěgW^mRJ )ʬoVXUQ1'WMy7@V&>cChr{c/}˫jQ z{>{e߮ ibTIܿdư|ѷ5/铥SvO^ oLĠ?zR 8 { #Yn79?t8WZiD8#˜ -EtBQ@i RCC%+mޑHvS袆RHVj&1)s0*[ 3< ֧`0E*^83D3j E-}}={SQAPy镭V)J/&PqG?S˾Ҟ\7ΝWw^k7_UQ5E1Q>4 Q@9t]@PucCBӜT}ꔉY\Acܩf>GjƧ]$?K74Sy'GꕋoQD%C2P?T$tZMomMjQGW2Z5'ɳ=Dl廉߄O`lƍ#;m}_˾:~*#U;mjkXXΨUcWg~%o:~ؾ޸f[%ɘLz ttPi7={lzO$N8bNRJ!mt ?q`BBc%v[kh*7+I 'N (dHgG!ӷ! 9АxhV9cթyӟJS@^i>dФ@"/;^2eܞ?5ӛ,‹,((߳x&ɉ<`Y}t߫ k&* ="__?DC2I?tE=Pj1{BI .[B*Vs {o(~JN 5-#S\N:QJ&*;zoBWd0>L/__u!H."4'oRNߊz<x8[9HȚFҥkZ {E7TIyIaTJb>S̩gTOad :]*,L&TٲJxk_ovd1 ąv'o[.8.Dlm4e.N~݁b]{Cg!PPY\  qN\hڼ]5? =dD^pKwqmi)e}a{:2(̒ @cfD.+2ݳ]ϯgۓa EElRJs7z *h 25* !w&3f6*xBJ !_r"9ۨp.3GK:k0tG+.!AWkTUUUEUuF_PrILCB/ۨyN8*ׇH_2p2xѽe E/D!eVij[Ac,#G6 7b4 &EyQ_'?v{«E}slC>{w뢳&MLMEstvI]xa""""ΜkeLcnOt@6?ax!F2=k<3zytj!%sB 4u6|ReVM%Zx=j[hV(*́`/WSw{]z뻠@&{7=4 T9Aw"q:MݳTy_11]}k!KG\w(_$fP@uɳ61cLGPvGNX GKm='@e_~Kx.80b`D_:JX6;`C: |yu"?,C~jwKdn<}\@zBB6~B@*jWo󚵈Uc_[X0neOH#qYX"["`jlcW:Y @Puȕ=ȈJ" ]| ?*JXdxzC0|K{HyD'Y#/]e JYgA=1b$:B'50H7uERڵIBœw+^u0[AiA ;rtiĹ_К&$HR7Ou2bU)hw֡޴SL@.OrWWuI `%:>5xёAўAq5 LelyCD|P;t6薞3qIi̺RJNju!"g؆3F{THI 8<v> q' |1BP wF IkRc Տl2$pܕB4sI12sADB*Փ`Rt:$! 8$z" :a(w]s?0?n0:nh~9 ?oXv.M~aqIO Im\G3v0{Ow kDW|:s妍 Svq([ͳf淆XtT.wZΉǏ' _$<ڎmoWG=ǖO:`=QGIr `j NzU9@>=*>j"(XU $[O/DoؿUw_S:T0᡿s0Kf(PM `\Em0+o3~{*$1[x*д?0B%B`C*I5VEiti9v tM׃CGD8=Sc1L2@3.$OFidVEA:Zi%0ZKZa1(n8Is I]t2W ⁴7C mЂ 5TRDAS,1Lf1k`Ҽ=15\*Iu0T]䓴ҹ\vzMewZ1 6U>фy+1͠nin+PPKґ$4!ߐ E7Cv< n!`}ۃa(}b4Ǖt{I{eO}08?NK nf "ę "IOJcӊ!3ֳK=I>1WS6ٸ<όu[sf v53f<d@&GYhc,q~U2G9j ZY2I2TBmUw)u$뵭dԦdld#mϾˍshϴaupaəZVpЀykZt> Ō3CN o\z+&q4y3p1a0AF0<i1o=iˬ_)LvBtx{ zw KoӼNppQl>h\DvBvq+ɢd]ͧ{ZLo׶NZ]vk71}1]bʫ_Q[[|;Wr0 AhH)pay3бzZ= 2UHWTsr57-M!' @9Cž&n@gvAIBnjh`fcV?{YF}Zq(r*]n" *JP1f@s"my5C#2Wp9X,:j@$x]U}NJHDd9' ]\zN?_9o:m4<~CXJIwR (T(4ՔTGf3ѥԽ ۳E%?!*39uS;R'~ \abAX2!cf3FpĢrl6d7HX@ G@;m G;&-&䖑W59wgGOsK*38ƶ-i)%:Qm"ƯNqm5wڔjV m:m2{]2BK=ZvAúz{~ޅ ҳ{v3CzWd|2$ȧIQX´ع_mLW GQZqY""Ylf&dІ9رlVٜ-Nt 3u̸d㮷\9fn^TCHi %")9̀+%"*<?]KM+d!mtг*#93 YҲ6s}NK=̃W9yߧK@_G«V D{wamu^rTv5=PA׹9Gm W@/|q+M|4:ƴt6\m 51k"fVYU_l\vEXY*Y}B&OlO'%F j>3`ͯj0/=# cX;UZnO;B^ ѥωĥE]0wNa7HW-z|(Z`4?5^2~>(7G5$HLWDkyC啠P@HER"^JtAj9S6ÇUǶ,DUUSivD'OxF NcD_EƸiE#=Y!$xߖ)ږ=yTFNvv &(=rqy * O;#~+v4 ;G!bя BL( *i+{iy^ݥ܄Tc뎋clT>lTe5{4׷J(W8hj)aRsܕ2j|#Y Df3Q}j1ڋ+㫫A}`@ o($C PTV(,4n[# D >.1Y|+_2$_a8<*⺃1h2M]Ud 9"0ohESHX@<D\S&3(<?F] yCT g-'t }c;Θ\X־*TH@TLIWe7W ۟(1ZXd.|DlچtyM7[7EBBi;}&p@&Q~_t Y]Dmk9+BĮ.6O'S:UpD[S?]Zgy,ߠ~pHQt|̜}z!XC/Թ)7]Cbas'*TV  j63ZJth"oN){};dPYbz6MՅah / LdW@u΋W\!V]Cw†5Cx fwc-꠳xR]ljtَ3Vv tQ8QK.ݏn]r\' EQTC܂V e0bb(ȝP| =w쫑w[ up]2\޷)w*?q*3d\.m)G r0݂v'):F:TZ>¾Tc_ *Ss(DՄKSX⫍py8i3~H M|y;'Avke[HFRhg>=\zeNςhI7nُZ8._Vc)GyѝV4T{;|otDs:'QPd B5)Zpg_ltgU-7S(JzdMd[^FG{Y4҇*uYSZ}lxJПUT_iy_?{_¶y.ac}9-@<_}AkQty@LT˓Je)^ 1&QT1ާюykoe<#Y^稍ÉIubBYSߵ;kmUWdAK, Ey`IJV>-J׽e# "aM9הhҷ06[KڒƪWyeY):(9`=/-\"c{^ge/dAjB:OHgbj$jE,Dv7waEwOa>ND w7wܚT]_s8.IbNa(!&wOJӛo曕UUe]!ԟd:a!`}{槂01Pڊ/?NWX%gɗ֑$b`fz0B:# bEs)["Ijw5 ˛MBeF}.nɎ>~팥ga9N0!euTY"諁9^??Fi i4ebFQJޭQ>Xo@댜6׽z9yhd~we/.s)gnE^O JqF1=Ihy]ypȧ/ vlk5`w~c{CbK*yGbuuAѳ- !.X_QqR?gʎ~Kk^9#xWI! Y-{ʵś t%k6?v=_ K4*[$zci[i5hetkKMujub3sx1WD!V=.T4h<==iVUQ~5$ 0-l&g7. S 6FiU>yc6bU]-WqCG6!⺜8c?'Ʃ߄cz_JcMTnj~/f'~N-w2s=.ENr)~qYjczZ_$pjH2N3-2Ou(:-WtXzǓ 3.QRMǾ "Kj1}l3\Hs{xhXn.\rDK_GtݮLaJ\ZW d25uX15 1PiJ_4Ӛw"߫tMd]("G%a&i sҜtf>X3:x2Vji=GtpAT [@PBYN:+w39k >Ro/xZ&5eI"sCR7#d#]_cw7?b 8 9vC3nl`ZcI1ѥ\ocG\v\kJl1Iں z55̀Ȃ$)ζro+(L4},IĸW>-ѹ]&Q+.Gq *?DxX(!tNuu׏,C4?|緿}RSxv'͛[lnlj*x6Fc`-fi'o{eZ0j02xTfyqL@XHXA#KܜZ^G~,#m']G?,cxk{MX jI\!:P<gTshgzW~<7Og]DP!H= jձXlO,hqMZi&NZ>˾q1Dڤ]PQgv )%̝O҂X^YԷ& atcc]~%ndC-ԧ9k:ب׮^ em=YdÖPft—ƜXIE9{U4ND[Fӛj2! |i0-P6ݻD|rr`.̫KcU\ Mͽ\}8'y<]Ǩ&`g50|Ȕd!ez>u<[g&;ckQTDgAzq0cYU҉ǂ-AɮEzoܨ<1}mg-ySJw=Ssf%V!QvJt=?DY DD0ŴE]fsV(ϯ"ti MpIГ`̞$efUJFU|nB3)Ka WJĹ _vzA\D\\5}ʋ*M4V@xlEz+|pJ{TJuBwۋT^ܫWC EDد2Ud}.faH͕ilg:] u [d5/pוf}.Ǡ{k >G;^43Jw; yM<޵:exkħ%EVQjt*'Y}[JeJRT'# k- εwjU%au•fV==JHhEuM8wN[A]ξ[Fܡ=6}vdKPB]!TbDPJ?kES& +Šp#~"bΆG`}9j 5:㰻N+7+MT!RyvH#P:B:2G <rcX')݂V6rQ? fδ:m&ړ="*`DCt2Êֵ/}QKX1х+|:fN5n-ZF C> (X|6` ߜac0Ԧ'id]Ę>Nl84,(m#˧H.{"%jAVH}ŔLiyg2Evxcce1e%0sY+HiWMQxH=xS3 5I9za(߯LtmM)\Y[B5 %XsovPP1ҍd[8H&@ipo<9fѳ*'A,5<`ӳͶ_EEU[IHF-/v]`:u FW%UѤaue5c7Lk]6ɚܪ4gmK;10cu[Y=s^}gX¼4o8)\;v7]| md~jXtEoA&:l&Y}]I{>,hh2m:ouFWfQ KR*h)+dGK|4$zߗvzݶ `ɢp{U fio.ӛ 3`!C '={!xyncZvjq޷믆58mC:hο)AY]ݦo-e;)+#tR1Fryxmy&(iԀF@Oz6ؾ%; k|sb@qMd1  *+5*,0 ;3ӧSy~\ dܬXm]\ڈ!Mmdyş.sG|'m~ w-');h 8g6]s]Ec)5qdIY;mykxn;'ΡhUpb37ҎKQ8=*꙯nYHAۉۺ3n:@n47鄋$T;, g/dno{G8}2wn^eyAuyOy3eyueHR9ENEyޖ^v֥f 61 "|)~UU0הY)W}JHWeV 1x:Y6z%+֤oei #_G|QdӍ#;7|k-1y5v?GfIJՕ*B '-itlΙjţn:1(%M΍y+2fU:0"n7ޓƬk%54LV R""ThL.l]FQs[>nW\\ӣ*KȠt*;[̔_ܵ@TߖO330鳟XY:&OFo+i7:97Y߶{-ߺ3g&Oaky75Zn:om‰BVآc W8(0g _bF-_ly'b3čX@˾sqLQNAP Vf\-vrǺgyuxΛ“~C_tY9ƥlDY2Z¹ߍAs5}bQ+2IU%ˮyCv̸ٌhV@ym8] crVoH*з ߋ”u.!VG';7 ~LCV?d88$<㲰c!-T_3Yd^1W bOc(]p? 1~nn| wڭLʆl٣Wuy%)ͅ&ө`Ai~yy5)ڭBpLIxHYE͸aFs}h>!cؽ!H? kJ(<_ RPJOȭeq~<  P;UW=q,eigWf$oeW)1޶0)9r49(×e_NֿXntTtQDnۂ6F]*|1*(S(h#šKG]oȪ®NQVx$CY7#m(M-O`o-uNo@gNU"-I,2KJM(!vSzGgc‚LϤwT`)_Ew9K/Sb  OFGS~~#{ϛGpI!G{X?D"2G`g$p"H&)Z)"f:A0WAP)CrJ$dCj)sJ+j .8RSU#4&7k|R,e U7& 5K6ΦRu/ƉJy^ b0lK=kxٚ`ѶOPLR RT0{j$ T7)C #Η)ӷXeq%@I&F3Y#YLBs1FRAŸ<5wa0d>~O!6(ࠟ'GNG.<~~$>%B*k"<qAg9_?Hh;w er}S0SRofΉ 2MA$)BiW**6W#.^19#PlxQB6JOq~LKa9(/?&=w)=zE?ʠ L:STM 5r W =_UB7dKU&=GmPئZ3*'3<A'г艞]SUheZhװ%2NEWb5}2"cimWl]zOjC,%rPƄ~MjTGwtU_J-Bs7Szkй?3 u)㥙V1jg7(cSHieN+N=lo]0Aɗ jE0Qask@2)!1#IYc|''j%^]7㹧\{Nhaiř`':ԤٓG/%=?ǩJ1DG/j":fvB| hc*aO76g_LaU rlXQԹXEc%W;` \e5hJֳT)vOr~t'˚5@iq8.k>uw3Toˣ9J 3Nn{:YߗSsbʷu_D6T0hlr}<{ 3Ɨ {k_J}ETWN.z[ >_Vxc2=w|8OlŤlأ;}^svr'5R1qSXݢ<)Y{ݡ\P OQyt# B0lVŠz,$qn6wa{z1;$5 jY;"Ꙓ:6ls>wiQ-{|Eӿϙq{N&n5j6zî $kT<,H9A(vkx>xs+/}/e[jw!y 3tu?[2T\tNxN{'se)uRWʯߝwH6TN`jq8I,k?(Xk`GfvJ[-:~J=ٺ tS}c9k-% WBعU<0}zuK/SpBϻTKxxP攥A2vF945Us_-BV~}._MR0E(Fc[st^>6HگVs+qW.l@L]#>N&ڋKSڊ;sw%ʴC|]\mk{}<(O\Em EF[s)6U˂׺R:}xIoE+J49*u+UeMX-O i$]}.L#jҮ.:'^~56+33;W.ł@jkiߏWڤhSn/s(E}>\Ua\~4VvCͩ댮%~kzfn>n B^wQ|sS\7QSz־;#*=9r;|7\]?k+`^- Qu _ nH>AV ^qҙ[5}vke Y-RQGcO&ˮdvOYɤR{$ؤq?rIgFϟ|r4JigP=synn}xQv]s 6l;TvWv=nZve|s|<{ur9K鏆GVnS[\R7bCYU e~ڈU>phm v[f2ڷ95N.9ZtEG?Sc>wFE 9((e̯W3V㱩Q;RC* nkb˓{w3?J#o9ylόr:`F U3m=:<<+yWv\O=rj!Z*|Sڦ]:J׽eصd@ڵb&~J\CtPt._\UWU LʞA 1t,TX6Wn_l*g)M Bğ ]*>ʍGYzוc+<.ꮫ MիuTv]OU{}/z˜4 l՗NX벨KbGƉDOq{3;o|yaF_&mLe ;E|^%V-qfʰ^--uVqku$\(cXTm<试~;0]:|e=M͓~mdlaTs:|}g'=wk:BqeuңrULIN.p/W[:*{5eQѳ iiu-VΩvmUQ9-zS^Xz<Ɗ{z_.$Vb]5uWD4/Xh}K]-ۣݫNqLO<,)|2li>*#mmÖ3UiρsCW8r5K9ާV.yzϟrg{~M>5PEz+{6^ y1W|ӽZ7{9ᢋx*r†h[**^4I"pЬԞ@ls㗎ʾ"f Ši*HE{xjwJXGm^pִ^bKo;<\,, Mf7-J-O:dPX\RQ@]4L,{wN'i_RNOb4dֶ[r_0 H۸zAv~+OFtK9hG(BHnu+ʒlumiIyTסPeN sMr˙Ū{9O#NѐlvJErq%2+*ub"*y-EC(+6IЀtGGώ8KN?:ʔ+[؈ G}qf(>+8A%@WR\zR9PS;==WpmóT#_}}\{rMos'#& *Kc5F M\hjoqnV^$ C-oݍjN ;L^W rp0bۊt> Na2XJu)VFnʈJ9pt# !v<1w$;B7I8~Y`yOrOEBR%d$JJUqQ:71riGO'P|nmfR; ]uLR^ӀS}쉪Mk5d)̡c5V]y-_G"^'qT߾YPѦn9R}T6ˏGlG9"N;5"uc oOg+Ͷ3uQaE\SoȉS71ٶ:[.i~-̱2SnlCAcy#-œ%U^6(X{6 !q (+aϳ?<^_\N2l<6QPSd_ccMAr~ub53W`FEe7=j&8|?Fn/ǖV=Pj8Tk*o xXE9׵r<=e(FG" 9z5ۧY YYGY҅bM[|r5{KzvGL='yQ dIE2},G~_ws+GZP^8H{Lhoݱ~=!iѿʬګ|Qw##2ٝ&<=?APT%Ta>e' }_]Ngઆןב<3`P8AAw!?A r$B(Gi}sWZ938K+?&P̟Weg v?nu&ͭ2ޗs`yShC#+/(DfCh;2:++ARޒeGP,p8Ge fo EA_GHnn])э>`5RY:ʢb~E}UOQ馯 kk:|S ostyQ^.h>Nf%:狏k9 /Rwj!z ?՛h[>/Zӟ-ivwV<:G{av^|F|1wd= WG9tG:^Jzw_%JcN{kZ8fɥMwǁU.qzC{"Rb#E|R|.w|gL"}ܿ+fnFD4??M˒抆oy0OچfILulwX0%23^ rs_ "jа_ܜsľ9ؒTmQ|[CwGvZCҤ3*:b@ {C~!~Hԓ_Hs@h pU o< }Lu W.Ԛ潿[IEvӊ|A.z_I+~!d#H? U?ꏊ?>tfVc7 0+D@5Bw>nA8@GC&kg>Y =,I/ |b9QSPĎMycZQa?-jM*OZ M~>k`|=,c,ZxqFO>,Bb0ynhG ?g+3aD3_5 z1&`87;xdK(OzxByEEϞ'fLީHd}b8q\թΙb3~q%Vr?.LC"~X$E~ND 'x}&M v 4cPO_JE4.gf}y ~(tzn_nAn>{O8@ 'Rr80@ ؅mS }ȗЭV̱Of*L[2Azi܀[ jB9A= VIc8wPr=e)@>m'rQ%$$ ]ҔZȀ=bm& H.8t /oa$ HgxhT C88x"&ݣ019 H8w=Q ܊&X玟)B1P sqFʢ("x"{zt <6`'1a)KS$4?ESU>C|3%ܣswm('R0x8AЊ0D1tܼ;ԃ=!#`จPf}Jai1"uC ۖ{sLrȵ{b\H-,_ދk .C2=YI$=WtWG',1 NRuUPJ8?d߃!ΐ9H" ]zzf lrkgv nx-,CWFx;"D+ S֊{pJN:tU<9'ojJ?td޻pD.Ƙ=`Am':+5bvOi#g4GWSd(!|@rE^ȣg154~Xf`.YF]#R 0H:ݰ4TG ns  `(ۭ7LJ҉O'E2djٚh8Jq""&"G;sꍏqe MQ Euh64ؕ P&g ޅkwx!~c?lI'ȔwkP5?˟iq?ۀ%nak`<@Ey1}vj/i:AJ"Txp(ꐱC(&.Y7Ͽ}~$ssR):Vr=y%YMd̖d,CX:90窮*w~B聃=ฌՐԳD)D.>' g XEn>tJI F;#b=pM"=Z$`%MT*z>or&Oh76*ouK+tjEw!izL;/ l/O(O4˘ƒRAOG2l~Ê%rD@"JsT8/7,\ V%9H(%H|Qla^ԈE9'Iz!DD9'H%;δn_vL8CEUc'\-(_ڔ5ky?= "'y$~8! L4˘tt) u!z $+LRn:rqLUggP0}4U4U\d3z }9ʼK~v(n$D㽷XK¡H*!70:фsc0vgCo0i (l`>݃!Pٳu?RF1(ER/SC`|Yyw@HEv/D}+qp ! ܶzyN^GmaE/P~nm"hJ Q7'];C"/.6nrr/X"nVUA`r.ك b3„B'>ˎ#"yvvor z! QRQE%5Sf?A@Laû#=9M W!noi%ge;ߙ},k,J"ogX?ٚXRhjC7v5M,t06p >86Kx&Cp\`br^,퓂o% s͗v%seq(a. 01)&l29 $#y-!tU`!R>D~D( ("0v"dI<ĶOg1C~TG*(vQ|vY#y?>& MIQQkxBIxR[lQEM*ƆF؊MSM S-XvD7b󜜒pl`I(A0@r_I]ebS5QOx˞ĥhޟ}n<"o\Lw߄-oۣ6 1Q.jG83 O2(l&}a.FFt;R"`Qohwa\"#@ALXNv [p86'tI-ԪaN/3"j65fhE>vۈvsp۫&BL 7u+szEw%ˆj/à qSlk-#7 ^n\CƭEFzWNy1A`ƛ^sVp1h2ś/@L8!! }q(T$|$ Hdf[J3(Ec GOoEY¦̳זxG IF—!`gp TK3GAb[B[IqoYKI$87pD HE[GМchzD}3 *̐+֮wMpؐ7GIê]l_9x6j5Y55ttpؤ[Lm>θCqAU]B74Z$ )CF @-;PŠj ieABD H!8r ЏDJ@jE ~GQ~Eٝ WؘI8Oy!ٰ;=VfF͡JZ0IRE .#y+caN$}ntmP#]X`D>ۆ JrQH.TPQ2WķN;"4p"XT{Zu< 1r񩔑 adJhpd|G7­* -TXx(&&˖BV7pkhD'Hm!;*GSTFt . r@׍gF6C |gh(MyM골 CiXx 3cHQ4&WP66ת]]4Fm&Ɉqx 25ƣ x\RJ `H%dl+ c<`aF.P5lGIS3 9 6}SAm.ۇ^jsEL3NaC4zhMԆ. ,x*iD/@zOwA4)[r{{Ή$gS ˰gkHi oAN:Q GAt.pTch%h79~'㠰s ١>vDֿj@Ʀ]vq00 )x9vp?o&*q@}ܹj*yn8EPUrU}D&h1`},_D}ۙM uiHH$QqPmXe9.PCDNCz|kAU4hz'zΙfI9mvX5Em_`/@ȌDބ9ڣbHP9#Lđt]vApE@l׷:MCM7?'s.ҧ*"xT`vD po/ B"ÈAEVv\,hhёT49yz[0bT!/tzv zOTdUaN J)Xx_<ԯM&r}=>PCxBeb*GÂ`ji#cjB/@Ɯr1BJk:r=081?Npdex{@ΘPN? MENN$>Iw ؆YE d&I9d)ӧF=d/>Jy҃HKG A/lM4$3_ )Kt@Pʰ 3|A0 |OMFAi#Nd44~(]pNqfA\(Gv.Rԇt1 0h  @s:wb _;|GDT2D8K1 |yvztnRps C1 }_쁂nP "CBb @ (:S8Z|^wXN.< BKAP-DDZ٤~ދ`fv| 9mC䆣].<@p=!+bK%^ﰝ("hT,D<{auֿQ_\s78 ?@'I@U H}E^Љ(wʀuKĂՅ.5#~weK19CCwpBm @:MBASiO7G:1*ӱdwIIV9 T)c.-0{^4Gc3Yrfgfgfy{4E:gQ>OmgW%Y>MiV$@(0 [@}\MGSѳhyI𵮇y^җ'( %fjnXw`w‡EF}ʼn  aUV} rW=@|b 3 #֮s0cA: !>/5!&#ǧ!wUT>҄L C2a *!J164czT=hkg)Qb Ur/4&T"Xܭ30R&UEިLWm*1rVB:Wyr=^ Dlԋ]},tKpC3W3"^f:Rn9d`0h r2 {<ށc]{d SĆ+!jc^"bwU{Ū@zգ9i~~35/ÀR:`0 p:ton~9@$b"s> U@0 R1r񻍐?SA_‹`bd,s97ćI; ]:Vng5 QǠ\0Lap> p4GBKmIV Hb`Ѝ{8ln4)f3A`x x~XGurs98AADAkg>@9Dw7M?F=6p~xE ,SLJHA.WDJBG}<ςdQSU[ގaĴPPD8=]p 97c 8 i D' Q˾/SF892[IZo1\7dz2εA|s#-Dڈ;w a@G,H-H "wAKeCr `*%׈YYU)CY|o]tʭt^Q>QӨL0y2Qԟ\L:C Na>R~CؕiO%P<494f(#P" (0B)P<z~.5eRKAHaZލyx~9 riꢈy 18\oL<Tt~.CA9ҖQ b]HCmĈb'xS>A{$ i 4DZ@)ar*,tFZto ]300 y=9 2[x4iAf8\icbT-l[n•XEz̾5 J5b yw+A`d ܎Žj K[?C&B̔Q ;hL SNvK뽀z>gܔPs,xo;^'z~)L)n"V܏@) `ƓtlqM^쇜b @(#Q)'#%t:1b%(H`BJ$<է*za Jw͡u3< M7@2\&`p&&)2SlY ,U> c 2\좚Hpor1A5Xj`R#y8$(n^}Xw䐸` u*kn`}pv"}g=mߔ[Tż,@}'Yj40aG ྨȒdɮϝ2ᵩ_0K@upg9(d-DN&%֠nǽFp0HH5~?.#>(/՘Aa;8c'*8h&cуJSuWu' f!(S;!uEƒs|.r|Ps(_? 4ЬJe% (v"<6ZcW5gi0I0$iڼ327l'Xގ83 -5 FWpMLRLC1x8]x#LdB֭a 1j KjADABj23ħwOo{rF+Fh/ry ]^UPOi0"R s=vW)Ah8:b4 BA&^H@O vNɈ(z@B! H R J@PND֤"tdB2E% (ti b/=ӗ I$#ā͆). ɍ(I@C}ǯ5~WfS}1 J8ـg5bu `MFlqd fo(b&a`b.VȆXQwrN8xhjrB$SK@HDA#1Bu3P*;q!"@6`ma1)94.X<?ܨGWBUu3I9R-(;7!N7 t; Ѐ84,#"kHH t5n0rR#MF 38JTabӡً/NW4lt#Q%HCEKi:f jR6 zc,nd.Că_1ddPnwSYA ݺkՔuIQ ^[CDW\/uJD1BN&0p~-! zຊ:fƂ|jCCR $L}v'!$: @NLͲ `xtz hBKq8BK26 e^R pq>(Dς̀&ߧQя5j[,`` Q0q!ba($BЁ nQp `/shaʗB҈G}Fk=PjM3-(m'&gXzV})_& `^8&0Ά!L(-Q_.8#w}~({xj d AIa2`+S1U. W}K`? 6Q}""pp3ghI&Dc ɞ(nqq34QI[:IB\()#o[L3g]\Z- i (znVi6DDY)֘$@0ND r nk `5շC.%]:yt "T "$ bX*H0TDFEk 9f[NÎCXE{N>d=D A4R8Z2E"`;F0a RYb8"P&̾հ@< GК9[2S#/xd0'/-1 H.KKp5r-`kʽ@dS潷:&wM`,/ =^ƹŕKުLd_ (밸՚yOd7ݒ$ll6ۣ"x`Āo& m6} .t$D|=H}uA!"T[!{=)ޏvbGӻVT+@9b7N DQR(6͓a3_UBV6lbL8L=̒%[8s@fJM,X-8%0W ͌c`R"wM:A 6ɚ Ff1^9+IZ1.g o>D|ڈh5 ./4$*oĆCMsA>-1Ŀr-XEEMO5滥ނyNOiy+x6$fA:؂)I\ ;4f .;S K*2b< ܾ(>!fPgKk؉Q6G BscM Y Fyĸq(G>84Th(]PM^u@’!*CQ @DPGAM|jTLSĤ'C8FB[C!o7(s5]4b:vKBwiB|@s crFwpVpiV"xFƔ& ~%ptmbaXd.8Ӡg88; VI vDN;*. a :E/j@$,Ő DY#9&A)|'5KDqGLRqa vLʘa63mHىR0TZ:MGc,T V^G (24N$ bR()g{gZpg A`~ b_g\S' gdh {6<_ q&[qӜ}Zs]Qvhlt֡O,i|½%6A!l GzMX@ґE)ȚSE02+@!}z"^o9g-y;%1 a zQS›^/4a8?$ji`s;g;"7;zn|ӣ}߾v\vl.[;Š6ގ\۷GOrwK~FWRm]Z(qf>#9'ms[o$6{yNCx˔FkQmep7T>HHAC^gK$5"Y&#'@/qmV8:)* Du0+ v{^ -+T,E/rp " T4IIblH sr #̝ D cTȃ*`>p1:lF#"-% (&g}Y'sz+ܱmqU|pɼ>qFx/AZ?IUQ DPym?[3"g6Sq! G0'1ϙA: rxD\HꚐ NZP$9'~(" 43,P$LT BJ zZ@wAb] ]i8$9*Q}cݙAMoa =XaZ` C2*%Mf#Vq=bhC "_^{sL+SU ġ17qV&UWxO8cXc1rxdz>Ը}[ P1g,Paywǐ_NZc;lyrGA|8;=AWcѪRy:^}Ac U ⌜]$hN:&88faz&HFZϧ Gʽ^߼()4@Dd@duHDw(P6*Clٽe P1Ԥ_v/Dy<ީ6婍-Yw+(nz䭷ИL3y DpPevσx#KӷyL7پ)RE䠎] jM7JGqJ|Cz x]/:W=3E'pN1tfd5"Ta+JZ8H'DB`E_~:ݺk7 Co ? /1ڮ^e) T򗭻DSOƠ DJU-s@M Mv`-AG'.i %Du=]r742|"!ؾň pdviӴ 0p38H`E!͊4jIspc}/6Xu3KEdFP njwn351 L`T ^0 F!EuJwfv<!̦90ё#Q[BkiM{]vn]ĆA]kI3 o/{#mٙZwrP_\FSN]s33 θգsbV󮏨W,o͌ǯQ7ӆ%`Hq]QI ie n}1$z y&C;`^";4vf<.aE4Pj< LkQlO.%ЏD^$Q$`2 * r*y=!6#.F?.%֎h,7E9fsyf{n]<PჷJd:9ȡhO-9 :4dN۝8Ѳ\IG.:@a6J&(X\! (QߥM,0P-A0 )) QI$PaCsR_M mr7$I!Wu;#y8txf<7h]Kcid@8`o<5I@ 4 "z]OImX;M5U[*Uȭp+#HQaBNAE Xܔ** bH*y@R.)VN&=\Pz#04 + >cî7%NqmB͌%D*4TB妼]*J3iF!̔ !t5 `0!)sH 8\Q}ǫ;s 9 Y 0@۴pw*uN H絰@E$H)M-#A p0:JY9iih@hmU<,Uˏ4AgnCBCYGa %0\$2ؘc rY pj.Al̢G!rB(@?>bXl.ݳ1{6@ s$cm$${j H^§Ds,l"3$(sL0GL˕{[ [A830`JbgAZf Pd-rѭFj[[9-KYBH@ɐ# b Dn4^3 {A\ 2@qa[IOJ -"rc71J1[{-Hm<"L>p$֍ N fJӒЌxˢ `>c0D#_rI GE T9 ?n&tHG:2fZE9)9=᮵=/D}ܶ48hrӨÙbNVСwnPRq2u6{Tޏa=\3B10 (vЄv0Ӯt C,m%ǜt&'8n_0P 1r@)E: }pиb(t:LWcܪG!j R#h/,Њf;{W[ϻqR3 I$Z~;*>xA䉨G;[bx)4*M}3&$A=5uM'v5/x;EsNb`8IU^GiJa>=&_~SR;NLJ6r>#q IZ#n[ljI=obK$'ujz1D:$$>#P?ᔪz'U~fYt+)&Pk1 >NhZN˨~;OǏ'%8Rza=*?U|t=e}D8>$Sqw|8SNφ:eDE1xAc!TO5 [a奃 I6g!2A4CH ̦M cbj#43d ˨uY!YG)T%ֹy[L~sgj' zA5_lbyc5oSNHHݍQdq (e!~)C @t Dj sARUEN =ǑEp(v7v)fe;Jzr.6=|Fi-L/ 0@5`BkgG!hT=I(ܒ >A>h O7;߰4;F: Zq=!IJ. V 17Y U4a ?C-(DD{R62hP#sϒ˗k2v0Dml3SR^_wfB;|Y{<>VnM#\9޴.X37\W+>uֱhSP^̫C(NG;ZYDK[ø?JB@e>)sXM>o.Z2-o#y!t'2i(~c:JhC{NJb.lR9DԈRvlIcMM`kC'SoZpH+{]ce,HS: QOO2E8q8(E)xukey Ōcm%?:iUR^"HDhU_\s>UA)&[4Av:( >x!,ϣY¯4FH&HEסGKz2HH@J 9w$ޛto}-,gt1_Yl#T$!?w M*hGxu𔖋 5<.lUf%;8a?uYZF] P=5gk?CَgǁϾjjf5RͿ%A[JJNeSCo~QD?¯moda [%o{kx-xhWԯCpvޜ_ 8"S'!q;L}'F$ǖL<^%ǧ[?!Ύg%BT:Ү* b&jQo5 =AW|wQ}^VvhY^]#&P"iNTi=%wz`?ʟ{ЫXUDGb47˱m[LpoTGݜ7uQO+OC͏ssKXzX<7'?0 'xyASS%D, Rǥ%pt9׉Euj]=꯫x0o_P= +̫F/_'%-GHp1 눡uÍ4O7'zN_ρ;Vӱ?Nc_9 2~$FC̃~ddUs1zGkxjN'+X7cAN (Ԋ#.s7ή>Oe%Ҽ})Qso!nxSw1TUQl!$ =zH$7&:gաo"HJ~/8`d<uY@YJ,PPE ;WAfV~/8v[!> @SkoK/-< 0Y)=˵z{E4DؾUmg1ޮ3۹uoZ~/ u"*""**"".r̢*٭a"WxٰճT! KZ)U^{<)MV,؁$˯LcJHWT5΢\ Cj+k濷y2K6j:d `q f"ysv55٭VFUQ[h܉~$ I)IYVN%Ojɫ0"ɮo?@|qJ04 qb@#::S\/tgyaΫ4*iDO&Fx Yg7dju&RnS,S]|G^ʬ`5xNO^f }ɺ!yn9GM~wc\r_07 a$d˄}&&27S7c@BnЯ̲[b1$ڷ0l\(NBBqZIֱb k%YxL>Heq֚s/N3m-]Lc İ$`\ӿ4ŔuChht-m:0CUAN3jf@D{gblB<59$'z3N sRNYLl}[LEF-:1&C D .73_?VleZZVr)K鸐ݮ m:OݍW()zs++~ i*9p=^`|lIDUE1|#. \4$$[.N¢sBkr%r+O]:]caNlP! gFM] (NKbŕ$ԝ:țI<\r-F-xDL 3G=[ !d&ƕrGy 5?1T)A,G9UFp0ԮIWwѩü@8حQ\0՘ԶNWE*nA NĊ!d l??tףe@C='Ad}Zlׇ*!Vt\:` tlcI]l%Fx f#cޕ#j<3I PZ]uvN19Lv:*RJhfO.RC\:]BƄn0*/ $;%gBLd$S1'1ܕƙvAo[;l>ӸuzwsU T{S a>"dĩ0ETJ )̊kT#KM+-Pτv*! )vx7Y$$TDTDW*> Rysq~[Slu[M05@g 76vA1Qf9MOQO/n_N\hyXsraqi$]_`1Бr&kd8% o~k(!C%3Ucϓ$8tAH:R!54URwVaGOW}y|uUUTpfVeLomZr#clx|@K J"wEyH`BA4̓y5w6׍zm5q|P !հHj (YR=d_ܖKʔQ6lU4.#}x|J|NQajp"i^)4 UNҾxk4Ȩw,~1@c! 6iwtRuahTF>WGx:`UTE ETxtvubP 6'2Q gMC%ꀌAe]tOx̛ЫyNg1$$)mqd{~fHې >?|ӼM|N{HAaR3-n>F>#!ϑ$%d&Ke676w) 'wiMb>/錯<VuZdi넔M;3j̈́g&iI%:+40]&$OP%`*kv4'~esٵQ2 z Z0@ƒMBP]$t}Z]Zq*(! "(󢕸5 )д&L3ws=}`3[qʅy/᣿\ӊחzy&gȘQU&Wi$É*y-HP1hǁa3>'p`Og=6f3~xމI=8n܎ZcCPv4i5{GQSGJ!['<`yD|_UQegToMki8v/`uijjP!RJ *HAğqN-!GCAL=}+K%+ckP= ުmb Z XGB I*L"ɋ@ocnm0X*(eZ"!aCF^bޏ@=KZB R<3#:Yf:%Hj><1c43>>'Қ0v䄯1m#NRF3Lmm+7YUUf 7#B( Cョ|H|E=jdVP HI/O F?j?6NjD?&Q,_Oqك/3ߵOy"'j'跴Tf3J ޽4O馚UQKwc콾.Ldc\V(zgEYm$^CGYU"fs^N3B ubnԼ(+<[b(f c[y!bdDM>尕f$jE;ޗ=MOϠ7WfߓV 'Oߢmv~}ݣ_ItL̓>*4xX1"<:{bbmF35NE9>tw[LG503e}rzw.B'$aE{`RD O HlA؇n! ϧR$ttcte7KMSA΄"4ۑ;OT웡*!"]R*̪.~n9[wzJiZ~_5:z<ƛhs nЬ82yoѵ'{]x^=w1Ԉ'Eqy!bXcD>I*Up0Υx[>C)L1ˌZ{o@>o.`FMù$a~Jceܨ{ׅzAi|8tى1bJ?U$)goF7z A=>^ˆwpz_3ŋ[_-:p .bWfn݃ܟ!5Gi]mVZCfaW D.7WtAVZKaKyRԢP&W_ݚ,UA< Z0No_Htګ1A0"ひ'?WqA֚RCyJqr ]d3oWx0gtNMZZiGl[ϜínpzDqAzp0\>wՇ>*(}q9њGt8O<7-YJq5y֊;KXw{zBG" }YQЌ(a)=jVu=q=؆Ǟ|@~^fU!l ; f}VS)WnںSP5;_n|CbxwF>ʶ8ݯ"2aUEA(*sɱW5QP-dݝ>OTQʥW-V.Ct:m|,||cVT;t$*Tܝ'%{2(QE2JjJ$G#I'8;_8`~=A>ѯ^wr„fq6*)baCPmrLs9ݶm(TxJd)/~|ȿO[}DoHoꡟ$3 t`.Ve㝺z퍮qd>ܧmW٦:Y_^q1=1SZCanO҆0!'N8I$GQkԵ|gz J #+rIAQMugrŽΈOve]|c(5EF6HHUܕfQAԔ`(6fI|FQ=%Qw8ot`T S0Nm9K_:"  bLxԏ)4򛸇 @ǹ ׀U/-Nu4/]2+a5D;K^74]sW6JǙ8&UD>=]у=uRY>.Kٶw+/:ʻ(:y0l n{Uώwnߎ[]4XwT5+csi5ӯdm_ʈ=gפ0Si5? urտcCú<1q)!_d^kPw4uj%RFܚGvJ`\ܜ:oFqzr9IcL7 W>u15ݦQrnq*!@ Y"Ж`Fu_u\j.5V6[1S܌6ƜڅuwlF9c`ҫ~ UU)Իu, 9C  hŻ+v34#o˰Ǫa^-XmQP9l"nLC=ظ^:zczRfhٔ>i[vuB%Plpqpʰ(PT#K+T|CӺG}8|l~`ޘ[j"}ˤꉰ7KS̲HX *l`jFI$:׼KjP|Gh4<笝: GwL\(袮BF=*}iҪ)b=t܌ownZ%ѓw:*UG{Z-?9ڸ)<;aa=b"t5J#[UOG5U]BFF7NDUktۃxFk^<qxӕpkjX8]uY?k{u۹$. ,qc{/ZA Ӹ-b}赁b39iÉ/]xw>NcWr=i$U_?(lAPHI|&CSvT [v D8F+1V=S سxd$B| Efm^ m2sl,R͙#2PP+9sE0S_\ X-pYizs >Ͷt8@@Og@WoU|wsR܊Q)&Ħ҄uhfNcXVZ +3CiݶK{P, @˯<}] 5)J^ 6rjo}mWX9Cw>0o0oF#3WRtd~8M>oj lF'#3yez=}dT -nNrik ʙƃQ⮏* !WCGϓ͓EJlq҈s"4s 01Y4zH +9UT^1~Fѕ˖Cu&@*A'L^-f-:tw/+sTʳjԯw˦3mU ALt2sy]ew{FkFL[ݷߠ&EѪ6WQ(.BvVVLe}v{j.%Bk׸0E(K+D#͛qw@\Щ۰MLBPS\Gs_3cr&[DuW39 Yݳnqnyg9 B /I01G* 08%5wymOvÄPZRݻѾPt,-aLaaPǵ6@C՞D%*嘪y"_sU!P7BXO+_e^' >Fww SغWYc AP{k7T8J.^ol φ&_sU|TYgluT&*ġEQTQK(k5RSW(x3նiRbMSjB0'OI*XY.԰*%rzlr,1%VkpoN|v@WIs/:wC-ŽHhiz Bf`(D0&Ɨiӂȇ>!M/DXD)H5H<[唺4rkK=4x^0**[a:48t20ϩm52919>8q t&T<'lÕ+%Kt]8 aN!Ҝt쌣a 7X [fl8,s/'>0&߭&tzS#D2u0p>kܧ6ÎN9H]W#ӯQUw7)HJCS9kE:g|t>w-^n37r5b޴MJBb86Sz.K4\+%TNVIe5Ut5]9Q[PUv:-J`SMN(kXe~ ;& ^.{n BZ]eJ,T躅~n.dnl6t?WUh`mz;|8Qʃ6ryB]j4 5JyrßD9mTM;}?599SNfQvS"G J}geTFʆPt>jcLX ΅=*6UWs Z+ RʫkػCxDҵwwT S#bM=\MQlu5{FlV\*֝.t&oQyhUpuM6oUM$z'Pۗ\46@ьM÷jW)AΑ͍T[攄P}wX*(pid᪍j]SBo#KGT"[62D!%|$‡(k9=<+1) , [!2GnT$!jDtc+ y3ffƲ5O`B|bS))짹9!!5| 4=rjRa|*-RlTz~;^Hyu =;et{uiE& qB)9ȧzG0D_(J%h>#5'X㦣'xEbd#Csx2?Oѧ@qvwIQxp`?kxRa\H16:61TN@oϙ. 7M0]yxwmdJ;أoY\+= W%"$h!U |4ku9 ӎb^RL#.2}nz%%wb (3۹ ?;Ztidjëk`i0ߵC}Xq"xh$ްW:ޛ=2-QJu!w /z[꡺}o6E]wl8>-kC>ޟæٜ6쭘J)V\v$LBHǮ:;'5Z+z4L/LiNg1Pz9Nj|ёAP>QB$9]tP=#goז>ϯ[+%m7<8cؓjQ!G/F"a$ǭNb+i5p~?cjBl2p7v2}#K: S!:< `IɨD-BN@gSݔML߭~?ȽU;bCOMБc],s{zJ>Nc*#cWVNh:G|.rfadBD툎q}tAhP0 6_~NH;H!.~XÁ㥈\5Ӈ-Zt>yl܂{0sBǦ<E=.Ÿ,䧚6|< srmvBЂsrlĄ;(߀%8@;ỗn[ԕׅ"!&)S  Pp X7i~?FzPYԴIG݆d-V[jSsjʙ0_5 bsV&Vn篗:(%M4.\I\WBwJ31h~v#qt+&өImX]%i w0Z֯AD49uihh};=jLcM eYjTKEB,#SWu9]ek}1piƬ5#zƄ7wQ*dXo/b!Qo\Oe#C4xqC78{^\4<\zjq{R'4ۧQof#IN D2H# _hA)PDq Q%KHz*kG3ޝl~RnxJej7}BU+7SMܚ c旤*1蔄1g$ |??:1,D~?o0_H[@顠τb(Py=ICtD>N^e88RCAh!=~ĴXhw!ds'MAzbUsI1WBmRV% ZeXMxͲ5UIm}WєEUDYt%5rsBYrK50gƝTg: [ q_Q'&!)w,͆JH~Yof91&"C ` Qk ! \%vAky $&e"*H$M(yxXL@J*90w(h`v(`!-9'wL<^ FK8G)33#|!BKHŮS3aj1ᡨFt9fٸPک=j V8Cv$m _UD!  MHȸ"ۭ,#C`U mSc6 B2[8vڅoxm"c17)f!%)4Go"Yda!,3#72-/M|vɡ~JK$ bw65847VWA $EA4; i-e&lC$B ~5bDusQvcc,~再gVA#hDb/^ huKp(z`{ sD(oj@OpbHH8_GPHf1HPjR   3BP2@&d1w`y=*h# cJOuȪkMOc &Ah@R@XDC f8?QkD#|Ϝ> :Ebpa=zyѼ$;S3'0ηum#׉JL`WI4 IA3I$AɠSQ0 &޳̡B@ک #t3PB"ho0 /2RYݼ0i1ҞlP\%) ))`/<Ī d!=v{M̻O Gt ~pCrw`90crLD'.dw!L3 ``KFx@'|:j0Os!GEK:DW0$S3g9a'؉ +h(Λ Ep|^q+f$I&p WDn X03j q 9W=\Cyh  0hMB|e5'UղtE)d &'CK% h|Nˊd!)iX>ŶQ=E6wCfe112(. }\s sEkiF֣c`@i\Wˌ {yCD-4y0M1y&ɬ1q98+q:O*lbCA1рV Ivft g:GS BnMAOfMA6dd=9z!H &^b Bb8BaHQCQ d[AՄb):ב~cS6H5"NѢJ"j&-E  J2,`Ma[ ҿ`! 4D!!V `Jͼэ!)jWȘU.y}DŽOȥ DE+FPlr!Z$1(AcU c h# R$k.`ҁDJhtcz RN8o6d ̱#N1%1I%HZ m&S@:42U, `J,ZôK `"XS+/jme~K$iBA}_=BRbz1Zih?9䇈N4$~$RH\LA@$nV C4߮xCC'L 7"Θ5v潾/G(I&ܱzqe?Іø ȭa4X1Dmd)n&F$bdkcsAn,hR:`4gE2D ix?/A >.Z òZ$Mbr0G-OP?7HzP'8^Z| j (-kmi#D>NBq99||IIple*pG,K aŹVٶCyEœf4-ݻ+hFAQ j $pPf=M n .F" K@ R$.#d١0fiƐ&dެ V8nBk 5; ] cBXqx7!GFM3V`r:fZ &gU@X?Zd9[|G!)(yY!"5J K4{4t9i mp%tm>5rdjDzD;͘yoMaZ8lTc1-iAofee{)K_SL30N*+g#cVjyNM!gv(R~qh``jQܷBEҴdTC:Fxid 4\N_:վ @܁3\K;h6-1_FS'ql"rʎNτȴ y~x 7cGI_;mziD3Rc֌f<+KAv>IrL0H?Bv\D~{,OHC~fl/G B&HUl(;aفc8uA-pf3se7'lkkG<L9>G2A?:9.Y(bb!O i3uoը?wɁ4vHL뮝yxI+,}|`#!jkF""2g Ӫ0I_:-({lj$MPfƻ\tX ,*nRgSͲԛN cqFǓUnفӑ5"ŠĜa5 u2Up#B$A78/Cy>XMh%`XWx`D0vAOQg;qAs%TQϠFbeTad]EL͵k`=tNx%\o1۳2+BCK1` v ]Yq\-!ASUt1In1wFqྸ &nyOKffw]gJ8IrIvƊD㕞tm͔OSSө߆ݱ5;>:nkno4x5Fřtt>f\s.nt^;Mu~|Bcsº9Zߴ,iĻqj`BTTN$H vns}ۋ!dlQp9d$ U1}8Ui)Y!$:52%WJQ`nCOW\:^** ?:wυƏW}ЧB|}!g `tHc=j?׀YO ;'F,BxN qvgo.97Y-dzi,*wvt<Tq֕ 6s貔%mqJKrMPsDX3D!"xSZkXtͺO^ΞxBǕBX47{:z7a)sʍ])A+DdC pl5߆2t([n+!M8)I*PД|,ē y{#} C E2M|yo3#t\ʹ~e*ur^Q>?T`ב qߣu_ {!Z4>דX <>Ot a(K 0s}nB>g99aS[PІx`*}ME5`d ش3kP[ ~O`1ۭwQ vx0d@I' N@dԀ_9& AUbNٍZܩ ~pRax"YX|gƍa 履szk34{_NH5+;GH n.M hLV]p=6EQ1"(YQP'_kyу B}RW}gKS`j{qa2m"F"K^\o5aEMi^\M]-aHQ(.P@ٮ $$7ol/k}4f]oPdf 0[Oؙ167K)i'47A:2K3^?钚z|0A:8Zh,C;02jg1HǑ{PIzNv5Vq,VṶ0P3Dži r^LvIʁ%8233s`Xosu9c|ٛ%E2PٰQJ QW^SLkcp,d,wvh?;V,l8\JyQ]ADډ}MVC1Jȅ2xuUTg)*ԗ`&ZyaV,.1*08Y &8U_&%y1a n_A:ǥeUu+iH̄tF,].-eruR>F2vV*F}.lƺ)"Sm/ Cϡ:g| |C^v?v5\]4ҦU6qM6m>P^5us@%uzu_QΎPuC 9Hez`\c`틴4 >4i?v4#:%4 J,cVvT,,rwr8BOY:296=[TAP;pD2ԐWCơ"R#jF:UC 6 2a&hshXF3Q^L* Ui3)BcB ^_͡:+e9GQr #F}x1VGYd6!2^phO,VS0KwԵNL2"#go6LQƁSaROWR!zb7,!t;d1VQ-#p1ȑ 7H4@\I/ !ҷB 06n!|Mϗ"04gOWq-P.Vvtlvr߈ݩ(ER%=G6??yB(_+.uD(;nzouNwm[3v]z#3 <|"n4 'O:89>YJ)J f`(H>:C12~'T{9i;*pOn^d!!5Nr[U%?=@$f6}q"0$ϩͰCb:;31>ahp=Ggںh8Bfk$1D&nBsE_R]4h͝@HD 2~68ۡ` 67]'W c nR?sD0 @A{0(.xm5|RR~4/#%ivi$߷wl:A8FHK/LOwe,f{R.<šh );ױӾ*,'\z$#!"HR"7.$:±'L[iRs;$p2 < 8tհ'VDos!X[S@u :B\B4'40 gaHܹPDhELpNY3Maf:|] zC0y8ۻ)Ȇ!d]n1^DNvB'ņP>y{펔:a"k!M-)iZmaBdERfXTDְ" Ѿ1^1EhFPׇpLoG[-Ő?h[NUP pI#"Fk0 Jf") RZVf4DN J h]k2EYj=A )ac0Y B `^HH葈n"P/ hIY a@AJJ AƊH0< USBY(b sZXf)"< Fs_52 pHkncd67?\.x윓iv`Ym+g?fM(+TA25>R&/ gb>9n"Ȧ &bZ1eV!&nT?M>`9yHQE~fȭ,nP]FlUA.rGhe*>VO#A2^;?糋5'j?~Rw4SV|rfx,F 'yq%m.B0f&<3 " Y vg,l7ltu֑Gdm vo/=O/o}<̳403NsҪ* ½pgs (pL6 hb ժfwӺlCemL&u7M" Ń d RN6U PUV#m";Ip)GeuKMT1i ziW!bSbG= [x("%:{|2ZL.DIf>e چ.o3GP1F p9L">lsdT0IMlӏvsDQHμlU2:AQ8$ T)'ȉr‘Fr$ڑ s1Vc&m0)hH~“mf5;\G6wCM!g{XMvzQEђw%5PLN8B03;M7F4ҮG1LL F1B|,mj6Gq [PCJ݌ :=wxC\#nɈړs(nm;㛥yJdTR7{:3s'\Npʻ*B 1=jM' I)7xu'4M$e, ,J#Sui\Ҽ Q cchnēĺ  km- \QR&ND+ξpdh09LV^ܱ wD3DLXugY9'CxSTl z\P&GM6CNvq5#<&'a FnQ5_˃@F /P"; ANAOς' bt$^LE'V8N`HǤ(K#GKR‚^f t ,a v4inNsJ2;hm'(,J LɿFeי w\$YL!#Njr+&DRhMf54MXdSX0WW&%Nl$60ty(6a"HV aGbyei{D21ZxgcYB>4yң"fu8{ƈ!QՑ~9HGJ_^_*c1mߍwZ~"¦s1oŚ~d! Jb4@C~7ۅ eMeb5)iW'D"" ֍c^e2/x_+bs?y'k7a:AuzVuDe8^꯺1z\9cI.-9qu*8X4h:?z +S{ULtk <?SDkQ ˊ-<+cf9M|4;kxՠ$ui<<@q3y!rc42S01o٠w fXDakڵ򅢩 MѠ=1ILQUQ5GBLm*hnB0X("i(ջ" *35 eE`#T5EȪż虮V̄F}G( 4alc-B:&r @{I lV^Ĺj05!2*UTT4:CU$xX'qEUg8IplیpyW."RCI qJb#d,#і0,!&D+ 4bt?'ӡ)NJl6"7Qx!dM#EU%E"4]۬D @jįkZ&D,n}a,%EOcM G-Y*)* eBPQѴMeCkg䏱D &j 1LL62㦞/ADDEkwؾK 5$ZO8E/> c'Iw2~ꋦ4 J$"Kn:T̏՜̲l OjvS"9DGfTuB!C8D=pB)ƾA( K_37xKN9l#ڈ Um D^b #8Q]\mQwuD_3nëNq %J()% TɅt,ZLr4D1IL#BDzcX RƌEXB#VFA:Q Dc ,RQF #J V^M d!0<`P\$`Drjyw@S<;8"{o&W?EoGO@=Ky)\l`ΚA(21kSQFf%2 Z6٭UgMoSH@I15tE+=CB h ^le3?!rd|iD# qI% 8ۿ,>\ox` #n eGrcnF Wus"/LX$y~?G"qJy:K҇pI ϿΎ+%&\hW\=8J3lSOɋ$2uTM1$gAđB1<ٟ~MwIvgD#u2f&wCc2` QTڣ b3(BZx3n5CPd8~ŃY4qH65`8G54`lp"oEs!:cyWT ϳsU_F~Uh+Oю)}ЛEdw )%mx9;γI(Pxk^C') %ރ,~$>D:tQA'v4Dj=gb߽ <-F⬽,d`DCI Ak?o) sChsg!YutC$z C 7%!#_zaNZIɰ,ydL} qbܕwvDgƨ0t5>Bkfb5xsgk :I4N4DkZ&0Cv"=329ZaHvp'L5Ql]@$Zc;*K5қ7f6eLpN,"I 1Z87c5 Øe1kIq)8A8dj!((u-?)eWe~G /˫O#5b=̅#AC=FaB} "ZZ ]HCN#XcF7 WpwKp,)`ڀ ^+̄B3hfғ]M}]RG; {XboD+e|USٸrc 7ٌkoG=oqʲ9ꊉ },}~xWS,FE^g idPm] NI_$EA=c!TJ,G RnbPSLO5Dyz/܃i1Mkx蠴C{Zmjfi߻D59Z`t!+^ IWx;N>2A4M7&$#R{״W&f X ]"7h+H]ICC'$٣#݊#sw = sqXě:%k2Y1OY%qUH(0mG4K}c h(w5;HOx -A I$FP|Ra#daVr30PF]هLݨ2v"d3A',w;.q·h*Yn_!J::"m:ѻ8[3xa6T7o։L&JyIFs.~Н8$u1CR ڇ:eͫ;Lj4s} GMvF!;p:! aWΎyS^ntX80[硄ħ-!.4pЉH"( s `.{ a @X̶W^j>"M~`}p63*;m $o?;ylvd[Siչފv:)B.׃3P JsVYݩgGNa IzkchĐ 3n]Vl,hJ fi}ɖq("Ig9g)l&LH4`pfl!XlTmjq!zC]g?Η/e; ۺ9:0 Z¼E6na@tffSMh誅IB ^~ӤFw^: GCvZ:[9pkwG:kEh phARMarFkՄηpֺqgbKC$owsC2D9 )c\æ[9LG:?h %M@u%ȑA)9KvKoWpI q|sYuJzT\L9Ea7C"8[39N2fa-U@oԧWmY qL?D `E)pc2E! gƋDqbc`r#%ӌ]cs}4:K#CI,!cAٱ>d4 hS.ԧMg w069`xa &1ys[= 8;dX ,Ҥ>hj)Qhx:@)M샤'!H:Mc 2'm~0˸NOBm0$hL3ѯ' BEYF8AqB$fI.Pn@[ͨv7^\`Xuxӡ HsG˰-ff91ۑ6k.IuKcHn99w%vo!M#vM}MF 2!|ɸ.sE4i 2k7QpX 5͜U84A9!Q4mCdt8Y%Sz1vP+Ȟv Т'똸\p0&߇o&;b\o8).؍xsKÙWhRd`&hwX3Cb L mtIk#/K<x(&rUwXˈ[$F5nltm[k;p@BLz C(h.pceoضyI5/#= R4LMGbCٜ$wMuG9~:[ԤVyc+0ȇ.3+rr0cYFh: Om'Bؑ:ւrL ap#sS*vdd<hFBfB w]1^̓ڽMt\b|ݞ2P`MkIj}@2[$O~Gv\(o1LNS?lB$>x-* dh\PMk@L4fX!Pd. 8[v ;cWĕlohY1t`Ĭs;Fx09 -|Ȟ,3uܾd»1Kyg&(ePoY>u-[ -09H@Tޓan|w8jlK:R*Q5-"6/&_"3"B C{32LyEg&P!ew"vAqzcf1hR463t.2;C|urd5ʽl1 ̖5s,b#&AF [\Ym3FU!CKa= rˡqJ7B2I\'%%pɡ4H0r(̫5(04lI&7V3-0#*&$L0?Vg FyV./m!@*b, d7Fwduv61ͶјkT;޸+T[$Y*r"%#w3cln`O8)prI2"fS6ppou1x.-@gO0gr`M۲Mma(hx+I"h`W+k!պ8F;?<>2䦤:7''+Ej8?1}Lˇ%T l)h!G@:{juz'R?D QyJ y JG!Wgh!u"&uP=E=;zCӸiu5VUQI"g; zF45E!'A~'Vo!0Q㉟D_ꧏX] Ȇs3jG/f='$B@dC<>'! hܿ%zi~rFfso:z˹9F3Vsu#&D872T zV~h$V<9ElCti+U2Se" Ci=ph(wg=('8P4 ({c( "(82pc:}F4;,a'*(aIK:CIbG9-L9;/~LVh *Ng6!""D!d)x:IވTsu6QO5$w+Q_tl&E۬?o7 $anXk'f\:E$TtAJ>AH%yล d300}mx.pHEWLV$ЉWl76e(B)Bqi]HCM00 JCT -qC|r Io S,v9LツߝC =IAII(p |$ !kWbz+f{V UV= І_Iðy sݩnT.b2=_ ƪdJwoC O~ FN+S)Lw~x-$XJ*뿁f[H+8!1a1P:z (>v]#h*_e{Cj6] 2QtX(zHsirC6D Cѷ~٘dx~ƨSr D4 Gc[dIUm{rQHY%Z*({Y \a0!꫌L=Dʀ<?nG!0F /9{3C 2Ex`äM@ֈA?JA82XH"s'Y7i[]!c0p7@P(0M\ Lz:ȁ@uP֏]q#6F+MG1Ȅ=q.Wy{{PzkLd0 DVU<"d`zNu'P@s~^$*UhB;,\NԾg[AqYvgF nمRa WDq4ޅ31qq R'>J=c ?1r,$ܟTH?@^cV/E㲽?b#;fBP9ĝ&iG z !H#HR!JB?^|ޯ`+n:N4p,]]FOwoP6+?ڜ= '$1ktƷlYO rBc `Д(*bx-) cA7rĢw.CC:cIt w@D,ԡeC(H EOE$ ` &HYB 񔝨VqHuu=5^/o:̘Tԟwb25l*0~:O@,FWfla&HDbm?&NKg6A$~sMwt`֑2YM٬rRê:tf1Ih2pD!vpd-Js/hʈC(z#:Y{'%&dYvP$Q1ТEB:dw9,V"tNѲ іVN ɣjB7r[+~X7'x$,T:mlC<uxEγ!](1m H42$"^9PJ4Di5$ď,YGRnq]vX3 ,Pp8hhCMDhJc`St!&  !gaI CV=$ !r0]Rmo!0A&sӇPCUeEPp/WJu Vլ6d 3v;woqpNY4!s s[B1cx`ach[]_tXTv $u4Q)peO9:&ԮLr!ހ4obit > !*R0A|$ɓ/!݂Ceۿ]rwN JUf wo V鵃 OtΘ6sr!u7a yzͤj)Su:$-!o&t0s:5_8ˇ2e6wm2#DLn/tTU,@nuZkp a(!O%Yl>Zu11 +#La=7cOg~qI`!5N`E䓷Qv[OcZ&6qAtnvclTcyu^I#%yoj9ּsӫ 63̜ӣy[M.2"n'yvbe$&uu u*lh1kIo=uM!mPBCdR/,FL(ۙ6 Yc{Ą@8@>%DA=·CB &; ,զ2((Ă2)(2)'bH0umnv#C`CI:cZ:DNGo><2^r;"ܧKY;$-69Gtmޔ4 x+y ) k@ӳ"HY&a  yYVPEĄ񋨐A~߳^!WDf4RFKT9~M&-KYD}v`iYM?Wlg[~pU@|-knqO=Hdm4]K q8CO""BaT)0xwu<ѯtyR8H4"4!JJB!0(Ri`^"}6I#swc| @brŊ0YJ"!j b"RbJ` `"$$,Z{=f˔;Nu m;kXhFD ۄd)j"i?4Qs"v2Ȥ3rH6QR$X0 B B4 '8fՊ7l 4|'i1S_>h}rIRHBI]rP4 !HPj}$ИɒmO'.!9$D&\0=X'3hM5(< j4a)l x\d:7#q"= 4V h0bhǴ|"ICX0#Ā "$-e5JaA4 `S@Rd%aNKj02A3,Bxlc8q155$QTAD36k圍DECW_WEy[({P#9P* ,Qzm3 dhOUh~)شcRJC`P,_4VNCê0}3KwXi6Oʹ!_׻tDe4 HK:ۖҋpuNǀ`ABSr>M/U-Muu)ڎOZ.1JkQshyt,I2`,qU5E>0)j˦* XTf5 `}MMTQ4_}֧Ӎ-%5&@[Q'N3}V%srG -qqcTD%;%~4C XlJ#ázEesSQesOӘkIt&ahxkwe9Pyy>2cl G 9 >1EqLn/.a`sY t?r/ ꊂoç./IPXn\L@"(c-?kA7cNkdVqAQ@WSt=U{8= wװTEs߿>B#DH*]8%wDNxsΥ.IJaSrnyA[Bp{M"ʋDO)m>bFCn@\pNM =?IMbAMXXO%Z}# Nϥc`Qfb{ h-k)|Q>.OUQdU^nZ'z}C=cHI(Qa$ 8l䜞$|T PUQ\. 0Qo1֔(qb_mɊ`a5F_z]ӫSO>ȡ ! beɗI2BPz0^ 5|>#2S1w7"uLTG5:o_Y|vb̘`(\L0Jh33>/B?,($A+? Q f 4q8(bA5jCIacUWz>EŠ:NPAAQI;P*Y~_Fũ-R L]ExLQ&( J5`%+WώɆp\(+|5U^Eh^;;8w'3F2)%N(rB[ =4$15 'wޡ핋^~awsS>a^fڂOQ"O1/)d䉄%CȡZuEя$ā8~4  a/$Su5 vv`BL!15J\sn{4Y[I$J #yV|M&n[Rz{c;%yY21v{QJE?ûr@᱈^9wk;ȆS? KDAES AbȢIB~g7p ?IOMhت]UFψXF(!P2 |C_ԛwOQFB%.OݱrbA &AhQ?Z(~U*+ʚp\P"N)BdegU| VB s!=_P?ߛtƭdܖ. vH9MO`smDVA`)@)e6e4/S6ayE1]QO@ l:r>$pd$"͘l#4¢/3 TlECc-q^+(j`tm102L` ) }߉p),IRnr$z:5w" Z22w/0:*Cla)+MB.Jkyx7w!Y4RKu㌊SH\;^^hZu_?T.-?)\j ZT 縯y ,%IY!Z~FGʱh%`؀q^v^Dp9:{CѪbi>WE-΂0^AN-#GRX9Gl*Lî G:o0z f0T,`*h[,Y* Vÿ:ƭw砮H|je-&N1na5W'K7ގP_݆9q e?=؄B:Ŏ9ȑbZll}LS(*6 {![c~MV)G9D wؐ;S3#!RshL{Ep €41[Yo)Bd䣣.$N_8x^?V|H}d0U&A!1iAM'!7B`f'7X|&0F4D@D5!j 4APCI`L `90=&V%B/< Ąp~KaՑCDᆏߐ )A$S?\ITq({m)i* !z(D.NY ɢj&%{b9&E2Yx< :OzR>;a!07h N% aˏw%o>3ܟd5gI!U4ao h*ސ})҆{E7AaryL*;`dVDGHa|7Grs P *RD.SveU,UIGѡgg@1ͣVtUjlb8M~TP|6pԝ/馢AJ*bk蝽s4{1r[ig6M!Zm+.M>SGc!X1AGݷC_CQUL6fETPAe4!{BbP~Sgڻ\)a4TZ$Qb&AAa% BrlG_.K8 H3lHb>lRSO,hAztJ(J³됏Rʐֈ<wCWBn>d*>cx%ZUsoF%qy!}!zP)#kL?P:@5:k)o& jSϽxF?C+JR=2RV48Q1`&h4T`%̐4FlDc ZrBSGυ;f 9`T&$nzO&fL EGlTvO@!HYWc-bBKVe@6 B4!'&:#fNaTɢ8ު0Șrr4F<' (kql0"[ Dl֞AeN4MKGנYh`ރ 1Ѭ,Kx`P`0Y$,i8xaAf6cB0ˤoB B0K+e-,~*C %%*ʨ'TCDD‚b>ǽ!?r:%BtB,L> I#nA @7p9SY3 I3*E DO:<`S@!'{$_p( 8CxB]&xk2jNO%44H "B<(!)I&DR|@bpTO)!%*0`y=kHmI/G09 DQ/ЄsJ&ȐZFJ Fad)Q)ViP(N `H"L C!0(ie;rR!( iiiY4 -,@E T % Y&D٬OѤ`ŤnaFB@ 4#Q3hr[SICooSA}AݥD|* H# 3( *&p̠ $ hO`yDYJEhL+&\ѤXdl3`@?㻼.倠";)_08H)0Α")dj5=M+lf@rؐ@tTMHPQ2EDĄA)B!2PA-)PS4D,,A0A#DRėωaChMƁWy ƚ< D7)}W* q f 1cMcI""~f@C/[b/<5\Ll(ƐV?wiKg خ|&$>Ri 89?A۵kBu֟Q{4`i[MFHhRwD s>b9@& ::v}cl(UtKmz!h]\߿{#!KÙ7?#+B:e@*7Fo.wIx{߇yEL˃hvUGOxw Z׭>[IQGWu gVFsTX"0XIq4!v){CQ ?)2ԁMRB BR!K@D ˄J"1 ( C!LI7kb/B(a&)PT"!kF)O#F{Jɂlz`b8#dB|L05T`ra1vC14gYERM4ԁmgAQDc!4w;eU#(:c hK$I?KDDđ$J~lA]0XBj DH` H9$b"FNfU qC[h:[2c{_Gq V_{ i'Ṅ7U!E W`_J]kK`])BjݸYߟWG5{KkNyIyqvnyG-g@Z o@舛| k7ތ&?{ȪT[`qcM~?Cԉ$@C_d2n15YJB9:D"DD~hm#nבͳ,AJ4H!.2 -sWԅ1:cD.=@ OSj ∥lJ2 o)AI$T7 D%s0 s2*J d4E,)5=rpE1F22j(|bxYv@!>8D P0??g !dV 6~teROwk"iY9VM5X6Op| !(%wj2 $gqٲ"cZRUT3':e3 D5Mݩ`p5Aڣ#QeQf6daH,cdAIM&H A:y1k#`㜚~rkP]b,H};3F~+3^^`&h1ǯ/cP'rI/\> v](# sɏe < A1z,W(cyCzz P}BޡhBb+`B}oUDb = : v:EQTJ&ǯi'̺ J(h|CtzUwafЮB$A'X&)dh@"ۀ4A@IZwdG"6bd!8$ {$3CD $JZP#shV u$*ӆd?лG#$S@P4ȹFУDSB!)(tjr lFWxqD_1l۞=Q$u b80ⱨA$IAQ(4'~~` =ܮL=w篃v76DD}Ώ'Џ ݆(DȦ16fSԠOkZ]g@ͥccJ eaIPbס{ ă{lGWwBa-AGq Ql m`m"\<7bz'^vDN4T(%N&Q"ME  +CwHŔJ3+"EVeHU!hPg:v y' !1Mn"Lh Tx_`YBHfSvT 9݀e-_AH Ao#e( [I|wzTmsCr8v*R H~"aϝ  ) F&bJ @l>E:=$HU=auvcO.ʽP|JY^#6o(1fI;y"nú[yVp.xPoC{'Ci>G0E z$S)Hv:,:?q{ap$Mmj3"S T%ԉM@&Z(1LFӤ5KF  Pi=4mpVT$øcgIqS뫃))GqNzd+B !ʨ\#h[$Hr:4qf܌B9'zVb1]NZ5A䪦nhǦr0zWP,˕}yqp1sϫ)ORoMm;ӽt:EC"PgAwFٿ= 4hmM7ļ)ޗ=}@+S^ط]ltr2h] v#ux%B'VRcb1=)&,X%\Vq=Cv lz_GOoFr7thr5mKDu՝y6࡝ !y6$]v,lӚƈQ &sMq\,.wt:80Hy7d؄C҇ `y#aA|[ Օla҅H"QxC}lR{'}=C;K!Pt<;Xg#(~,# _W>O7'LQD!!D"{_g\C:^UN2Ț_SlҥSe<,z cL 2G:FC%">d^3ou|=c𙁬jSHXtRn7Ӣ*0l?Gq{HE/߇m7s?=P}x>m(uykzB T`|ُ(\}7kDGa2N{( l\Ė~8c]Z?a%vEPHn:p#c"X=p0}Z2NRo -#8n"YBı 0X=lA "pw! Rw~ab!r>%>+r#FHIg&kQ w'8oszҖ_u8K! ,5ǾXY Ô]bN"#|hy-)AK,Q*H J#>Aazwt!`w Pt`yw) ?1( &T,R!!J"Ab`IHP H\$ U I `("F0aJ)e!b(ZJ"$&Hj# Z"R!ih F*X~U;Ȣ) >8N?SoŢZckP}?>DZ> Ļ J}_FID4%K-"B:(;M;rCLiP5|AJs@M10ԡ&~ܱ" CS/ITB0yv#yGSuC|Li HE,ZChAp0Eltvg#\LKSWBHĞ "`ĮGTp`ɪH&IY"d"bb0,PD!$5$D44LRDMA8DL:#3!`*" a0BPAVBD|A (a!v9aN^eQYh 둤h$DdYZ% Y?-i=6Q4$Y&QNP\LJ^B(:\KȎ@pIqևB~f 4-c gp$ޛdo`)](:A#)u$  To3"NA.47bg7ẹ@;]hMm(1gSW*CDοX|ܠjP< . &B@or,sLhJ&IYPEA1!ā2QA%&fԭP4KY!!B !P='a5,l.isGAy~pS{$',4!@7( 59w`Դ:/6qx?}8ۀeAYDdC|M A|.$fX&*!h"d$b bT?Z9 U!)txWwޙF.pl 2!y[{{:_G}As -0[ QLw{次. -?/I4ƛlp H*]:;"H` p=# 49 D/O& ą},$hL۪ZڍO=$@ +@r:>VuٱC!p#٣6Ba!ĔE5l{&XPPD%EKé SX'\Q ҟQԘ & ) GF*2Ji"2bYt:=~ RX!RGYH=Y9oRe[7v3CO& U(6ݕ2cH[QFq ,|0aiAnӣZc`R%M:2k[iQk'-8FB!k\Q UNAj+R C!Bqeӣ)[hmV _+dI L.R®jىO9]GGw"=Н一s-%P, 4oXXsCwJtAi%kn@YRw+ndz-pq:);zhCFI(hX7d0rd jsTUYH̋*Zb9}YOl@z邏p:&$~ z h> ?٧D O5 9?s"2&"\ Eb 2'?j(Rtz7Zzn'|ɴI LHdF+(Y#z-t`IpNi*O4arSNץ{u'Tk4j+䆕S1j 8A@Ƌdr N"Zh@_):vQ  DJф\dIP`%|8AhPb$EfMEt%^x9Ȣ!#5"]5e͐6u7>1E8zp@IhgJ19'RrZw`e9gVG'X޵3Pd㽑d5!$Y F \bWϲڂ"R)ą@8!JjD5qVM"f h54CS*g,Mʛ)+ C]0kF ]n΋ɸF %.@9MhƛT%6:ܪfL2#lmꨨR)8$*x(۶R\+]i'xޖ[LuNcm3mH#WF(Nz,e;,,媖*9FB1{\"ta\$T5[ϤsSePlI7w_E`q3t$EtLH)k`gcND^8#p|Uڂ$у#g^a8C=#v1~~8 2R; ln](s0蠄@=!FҎ)X74aaBi]E+i6h9TaԖ]˭XUkʗ|(2vWl~;y?!&.qp]`nfd9F 7ߖeyNIq`F%4' BK@Fs.Uvk­4j-x2bj0{3X[vj 0ujvCWpȨ 4S#`<٣&/MĐFA,{\ZdT8M \!;z{bN"p j`X-E W B B%TC0*Д&S+ z=D |ta<Yc=(QW1Kf= I4 QXOSf&FI@1"7` ywl@+Gٻ_lBDKX؊@cgN94"Ҫdhm,$^f[bJZ 04 /@0fR(H 2ԢUR#c(G&5; GՃGRTaaC0AZRY.ԅac*_`fzZ]Lq8#JDhS vqhpx#pC険XC5~<.R8 UY U7&i&wtjLS$Uc21F@DU+03bf0T 64Dj)ĈiHÒdlhMH&86 b3 WN*1 j#z50^!PPcB V3M6 h!!`C &ȁL܆%%h8Θ(&<hdPŠHHNC ]`0xG!ѽ ,Ja:'í Ю##DFzYEXO}6!,FDIt)Pp7RՕGִBfw)p- R ꄌFݱh+5=1FF@̜94!N0s1f ^^^Oâ`=+hX:dyE쭆I\}R冯\ ~L0>Pa;t$sM? QyF!! LJ~~tlFpwݍg<+{unmtFё2Cp҆ԁx1hrK}"V+V"8)cH.N<;:FSm;lHtO!Ś5U4Z6S!YP"( ӧ2wha7&H4HEHio|!aD' 9URP]ы25ƐMsPٙkrB1`XTxz4k[PB=n0BJ""""ULg8)3sА6unP2 ~`XR;ނ~,/nI4jpJF.Jֱ_/#H+qDU&rW:NŌ&x:﹃1"@lǡzuI!$K?,/ }8>BhXcMq]Yșp4e YLQD#%=3a<80'Jbo)a$!F0]h5UÙUUjNXhFX~7r@_ r [ւ446D3s늟~ÙJr~>ӽ~)ЃsEѽ2[][N a v@D'B)cΩq蟾Tsϐ*/Ěq1#O$a-A*X $S;<"O UaeM1kA_1_,n;YĚo6Epus q}{r_FoKe怖3H9}OfIsJn  |j$1sPoFA7X8)J›H 1FOgIXTQDJQi򙟄D:J8HmS RU5DAA.E`j4DS\?o{aIY4V:"e#CnF&1"\xpA @o'2w!V F%QEE 4F1aEI*JB$F*ba ?Z/W.{x;)leL$&Lϗ~ayzOXa֢*@3JF"~`6!:vo Ɛ.%Ԕ"L׎!G19O J(9 DLu%#{pP(h&-^0 9d4Km&|k_o@0?gלMhu"q@۲R4ߕ q 4 -vãy>xy#2'L(T]`ȕ8`(WI^SoUQ#H^w9OYJZg0=MBJ< )w-JT1=@vpWӆae1r$$D% 4wz|x:/ԃ( `,Pz|   8BU@aS3J$1DU5 *䪍h=Gn.% ! L`DPD vvyR]d`8w*TX6HR5G"ƃ `dD( c̈lfa MȆ0hDANCQT4:(b)b)8 hGQVUHOm-pɝw4z*{)\QDPqpJǢ^ FO^c T ozw-ӉޔY1n v4"Alia h?ֶ9`@?@%i>Y>#0U% ",?/w?)GOhX!舝qUiH")0sj?xOd5֗&]w`j{bH!jF(" !FBr79\с! D0ڱ# ceKXr׼סÐA(Mun 5! 80,A8%PQ<4N"Uˆ o*)L Ԩҩ!Bȣ6GCO4єQM: FrYCl \R j )`aI&10 6l;bX Bñ{ }_fQ UL1ZC)` e!C:9`nDc9"-jAH/Cp!`=AT=wDf# T 'N{C˻V uFFoCKujȀf't_Su+YRIW(gMrQMsZS!Ftqr 1ᰛ!Q<'x|kifc FeE1$?]k|3tf i,w ظ6]ަ4lp$6X+ZGf{̎MKkt6fmV1hZ[ \vQXZB F0ٲmV'dEW(B M0")e2" q( $,tƸbs6qct)lEbkiF\%DW^jB/(>Xm6*l4kXKCA54XG5j^:sX;l)J* qN\:m҇ [2!58#i4]CuZѩفĦ9/Tq,E u=c[N^ YT4ԇ5YD5v%;Ob1 Q)‚:GB{qs%XlQIc6i @KޚpхwEN&`c.bgq ҆(>)A*M6FLj4CQi$`85⪞VZLN1놖Ծ9{,HSѪY[ 0Ȃ37@ETF%q*SKhHL]ȟ$($30L W*DRSk`8sƍG$,W0N;;$*/ڒB5/M>Xid:샲 qrkN1'n{fhTSa=zj:HAyZqg1̌3D ecR`1s5C2]$a'I9nĞr!\8G (B*I#Z:xWJOֆ!rMxl/uQ ڞ2@"!`ŞEfAJ 5% d!P(d;l N}AC@A){l;6bwPS3Q RB;>[Hm +p fT$iѷRݸ92"U6ݒԇ R*Q ?8EL`u)ﻻ>c!FdztmM,\ҿl- S(!`ęsmvyTXJԐ6܈?_{}GC-?7۰7C&$ ~='9dJ$:啪9O&`8m`wOp<`cv.Ӯ6IHPZK cP RfzZet˞d mTɋ"HxQѲ8f)Ţ4$2Xr`JQS}x~:t:8lMB`Z-пޭ(l;Fcut w A0BG4T%@AW$NAnQ,h!Q#&d 1LZ,ȤD&+"R ]kbiv3`um@: 0MY*UT$2*+mQzHh7`ZDdҏ 6Q"J(D.1 C k( g4>W0 .LqNىQ @ETԺdDҤ,,(J FYGXAA\1ci &Ƃ3R0bo &/3-O T M)ALH6BCXdCF`%PPAIM,HRQ2B"`(}@f'!((NsPV=} =}, B2o (w~h×;򚤈"&S:yhcF%p FG((#Sa@QP(2Z5d)/ CPL6@&WS$1oE0taZ(8~ 9!(&X1hZ!pU€ !bB9?#gC0(.Z{/ژeMN<~.vty,ш?^ݔ|$a AIERD5DU48&!&$.DM~`޸q]+%'<X d a0K(JK˥9;#Xc3}M9C~5 ^>ah$!WD?4!A^sjr*m}QHD8(n E@ސ/HAfaQUEQwFp00yܘEu&#8FÍ>GQPD@hʹ`F @7p}"~Yٹ1O_O?#]n6ϳ: b<@}UwA_*1Xa4;r:LRCD)os\<(xh @SG*@Љd" a Of` qcbxx)1;;s]WO2(z#ޫ{@!%q`r1b pFJ1 -"5;in~(A- D#@V/PdDvxE!#kQo$U{ r':x[9y%@Y@cw6YQj H)p@z`9{DIa .:)zgcY5&fm7rvr;TCcgY7:88 _nnd<8 0w0tУ\#M`O~U;i%0<$^-Cz"hh9;1]$ Cmj"Z@ MH}H3qD#$ަ3iZؐx`) Wz^WmcAbriIbh(i&KbΔA<(,I__;SF@b+NZ==0Ҁ btP.GvC>L(S(a$pS&|}NԭBh)4!hB$J% ) EɒI21 b-U14/]['rsCq9.k>VK,Mf AqI$Vw^l2Oz`Af$`2 )0$("ZԸHabK"+%v!|4R*"!ru|AQGo>cxj@<H{y%SHQ!W ,"h#7T7(`If$~V}Y:1SI ?[ ) /(@_8ZF!Lªo=n?8a>*㹄< Ayx{a'2dQu#raH﬛ < .y"yK4rtT*gFFZ.'!(Mz}α^Hlq#PKQ5) K@hفI,4vwl8r!f(݄FU e@EKĀxN(J"%@N #X3fgo4J0w!o5cf!XfL'at51%9dAC0cԐg70Ži(!f,5X#`+l#Mˢe`f$ `4"`(=2 0 B2sH!18Qlb,KVu:2(Nf(#g4h H8_arG#1^31ReZ uQA~`sݶJu$9=*$ CB̡@P4"H#Q4HOiBD SCNE08`ra;HQ#"@G̕ P, (,·XDdNh^("ei@(:h$C\B6;1@p!U;.@Rx\"p9aJ{fHb2a#@B&A( }vlpS@d*٘PL8LP V5#0(,@|ԉg2E|ZqDӼC7Q>sW\Knw~& j4_Om~kOw/4雟Լx!P?݀"B=8c? v dՃ{POb'H?mKN|?ai>ƐiO2/').ҏ񣐉j_"3%Mڶ.p?.*~Ư,?nޫLLIMBrD+-?t,Nk'=&SEq7,0cxP@x G'ܗA C^UEL8qE92-l- R5MqVȬF&da0۰Q>4I-Rn6Fqi4VVBc]LO$D 1ݒu3h%рe$cr)][YGFA[DRIFO|1sF:%Xr:`8@j)+ Lwv]&19剢3Bd,`?*d`"D.K1 !K{c$bgo:vI4L نbѧ | \X"$ @]3G(LAv? S qmc4X K& -MEtJ*d 9@2bs4*Y_Eu/|GeB3\0V B8$rJ@"%2JPB"Q@ DB{`Cf7L0i{>@&1y .&ILUm^x㝾sjVF)L|$$BE*!z(8Հ&Ӡ)G йLQǐPLy ';WdwO$M DDD+@RKᖅ`H$ ,52)"XCOØY1*#AEB6z1DwIP9 `EdRO" &P~ƃiZC#Fic{11}8l48,Q0V?N`}>%i(4BXr6{ ,a@:S_f3bxgI~~ҵMU ء[xD$@QȐEJ[D>< ۅ'H'*|R1?cHӅQO;ҌNnԴ1FPAXH]8f!Fr&SK2\jB 6s =M;T쐛eOt1/J&.tiYi3CjDhR 9r$̛v8Dq3iu`$ &1PU##*Pf[sؔpT"ޜBuTC!#t<,k͕|zsؓw.Ȗ57ysy 2? 9djG+(Y8lL4o`m9rkr8 lso˦%B!fp/qfu _V=-aFUP`0"X,2ߞ{u-a=V:N vb`Rϭ9:+r3F('4: :06kgt6lVR  tN|{c6fC6ki 2G8&$M@h#=@2M:}:\ .d׻@lwDX# $*Są+-<Hz 69U2 9E vX㻅c*J(n0՞F ̬Ӊ8r|D6nno:ZB)uq;$Q>9o2H!6 zC$FePt TdGRXL4DA׫^>7崅VfhzˈG8y%rZ)e"Ӝ7` mAJx@۱3e5#!a'){5/;!O@#L =3~$'o^@=s !v0Lb}w<-'AGB :bnq`4~_媪*/zM!%(w!ȠJH1%QKHZ].n !nBQ)߉9MuR# ~ }RUTz@t P$@?֡4P9teO. w EY˼8!YYq|7lԇjSxvӭ74oV DBu.]D ^[Gc@M#$@RǢh6N_\hЂz{/Žo> "U>= jLeFp*0 `@~ƅ8I~X\$Ȍ$'H՝l(b>ӥ02NĨ> >Á'0Ǭ o0["Qx]Ô:*Aªwjރ*+}-cHt>Mr@z6'or/9BU8{A5҃qy^.$jC :?=F17wa7y /iH > qy` )܇lSQ:xX`IUR3 ,,)8~<2:6 8kV #GݪydiGT>uBBL# ,[ C t]T2xX @ģiɴ Em&3F'A숀@0jB(Ԁ!-'6Cff7h}l  b)8A; l4M&"&@U2HBX8d5xPA SE~=NaR F}ۺMt.wlpJ2`ْt&rf@rmɚ S ~CRQ>9!Dqq #2StHd ni@dhbA%4SzPԔpqDPLוR=2î z " L *!eВB?G)ۨ 4z}irfP"B)#rXYIP@R  YC1nb@ST ki*RK4 10H!@0$H\5+0-o ZI-ɪABʉ Yc,iB`=$U3(%Kp衅dc!z@mlĭ$L+ m$M;4A9'# fE4&:!Hq)FLPi 0V.@4#7 dPi4ĉ )&YI&$`%0yXK* b$hi#4q!11A&oSTK#`\ބbxI^Qr  ƿgY"%ا"**!j5x=PSeXHEYfME::F1%#ؘ :L9D!Vt'GԄqUɪreGbOA:T:epC$$daDQ88 \O>P߁2==G&͓{-AqcI?f䄅b@rctj!ǭ;=?LddB 0Qj/>&&~#Hy5wr,{Kn(>+RD$u_&Tb{y}OLљSPgo.I 4mUC\>r8H)*NAbxT`4WAՁǓG !yaAX4°c;!:؍ot\#[hq<}X3<İ T#ֈĬxhzBDl8 (a2IbN.bGiCB2 "+01p*;1m=BOܩUPEh]Cl=go 3ccI *yipj-cBNR C!b&Ht(/p\W,`S!(7#x's'1Jgz$"%S'2/=\Y{8F"Š E/`XP, 2-!\3&EwAHUdp@㞦zvw5>zd V[+)aDj5E lolE]dd Ҍ C)2dtf1XA9Le hY P%T}H=R DDH=I4t1MGH"bbbebI@KDJi)(@ K n~i?F vk'U1"Y QGwR{pG)2p(N8$DʻakPHD>o #$QI_sI#;01 *@͛`k*dI МMzsԛ E^~;=wrew< ysGOl(tRSB? ĄE2uP- ],h24B (Tuw#8f)iȭfl ͹TRi#b\ka2CY:P kSIʐiMiS PKHDl|5 VPL:Ġi155:Z1Ĥ&R16Xp81^aNDV"b\y30mhAp^1@ņx"{I \, ¼hF_>Q:3s'8uLg:=a^%(4D= 8V00H3?~vSfD`aVLSs'zBElqD1ƨlv2!B:9."80H/yuNz*$RDAw(݆.dCŁxn08&;B'4BP>c|?xF5ZDQ·eD#VH<Ĭ V]*R-f>|6: pȍN+ GT j&F 4VEE6 vި(OP1!TD٣6tcm63 ڨo"O|6syq&Zǩ!'hiAۮqw_KkT~{=%,gW{;FuPA WyFucԉiZ:/Aqm:i9g3Zz6 r=s/1ў栐}v)VFדD; SϠXG}<̷O>Ŀ#ݗO*+OCJofCߏՉŹnǿۃ$ uUB: J}6coy1~'f8!*sJx[L]OuV  *Ko0 5$Svpsd8LgBnb Wa?(}LZSdsNvF32PIڦ8S:\&.Rn?!sWT k[Cnu&)G+PoNt -dVƔ\ WFz&h$mu 8㒝(c.'7x9`׬%9;AB%:K]ߝ?ZGIϑ3xei:d6C> y"b)炋qB<b05rc[[YH>dz/syuO7#k/œyy4W;>I<.7ClɃϗmO 7S<z2 l SmY"|.Dtsc4FK :k)~Sz=]5dæ.;-ͭ8<3> !m@Q$㐷n;Q\f*a#ۚ]Er<Cj߅p. `ħ.К@Y>ta kQ+kC GcS<وE%W(OFm0n}{1-ˎalnӕ͹|f١ 솈#9>QSu~$RwwQ${Uט1ԈwtvH]KT(UE3oDprvvǤD=:_\zg%O]L5)l&I?C!nMV1&Ŏs,v R:N)de6X>6_L0ZxRlnvb<< I>;MJGwCH㊢SA+fP8z3b9+[$\%G׃n-;(k"[TŢs[Kg;7V7{BsmǠͺtΊtGh5M39D5!{f Q,̉N!=3eڶ.S\1"v &8itFT5IL^ARVy-j_A2 q? (Ur** )Dѳ5aH]‘:wr66 $F5~OBM9ۦуBhfM=cXމHk:OY 6fלH2|ŏ%y8 }XH֟Eڧ"3#sye% dE=˩tNf#>Qb-l:i&W4vV;wRuP۳iCq .A^?<"(%"Òbw‰Ń<#" uXI 7;.K;;<7NI< s&-hA1| [/iNNd3̨Cw{=CRC⾾CbhDŽRj&anl 0kNl(ed!RiG2 ` ܿj  q=r _P"v;u>kG=2cR 6Z  ;\&.D {_4+o(g9\ +`qLI"!Jp`mR%43n1Swla{ZPh@дpɢ2DMѥf92leR:Qf CR(EUЇkĘPYÝb,Hm-3c-A ܣha kC 9Ms987%Q0cfRKP9`&@WHpT)ZAT0%=&M/ۯDYQ 2"7.%[XE6 ZGѥ6'DQݖ ГV[ o @0#@h1"22sJ |H8ߤD.gP>|{ ,KrC*T"&{=Ot.tM|7뢵nlrQC }dٶ܃0g'x"f6/kJN6CF?cH0;R O7BJ5z$F!3=|@6dFŧNM6bz8P[htK@W /~ +PG"|9v]ܱMeSWu 7xCg+{|Ԉo1oADycܬ(9@}h3D yVE!=qzGy CJx0 M$UMR:G KX,q>QSƒ)`Bo ( O[LƠ`brÀUB+Q7ڄSnuEu ˣ 2"8D \E'1޳R ~oׅ:2~x"#+z#dPrswYϷ<ahe:]A{G]·9 كP6e'iAj{ 4:  ZJdDIZ@DKƞksKi>snaEw=>W=| {gJ ) j`hh))@)O yF$>`>_$ _O & *]KANF@ԘS[2pVIJ~a84 ~0Z^VGDt0 @EO5dRD#NvuMbJ\ R&Qrqk&cא.dUD~bCLu7Qz+U+HQ!VL1f*f@|YPU ]K ]%C!6/۱]Ci1۳=ГA "]mLto4!Dh3$H6?l·BH|n]ݲBps:HM+0I-F]AF6hH6G%fѳMpp+8p P3Ő$c4q ch"cAk ȸcRI.!5Bmc F\B _\!p3DJ,dHk_C@FܭsPUXe" E,֓#2:Eָˌ69&pdp2!%M:;Ѵi:1!\ SzJzN<3!LBE=^p Y:dl+/sreaZ#Gdbg(f-%)R0kؼ "ez^R} M 3*oop,=qHyN6o*~-$LLI10fK Nj49pMixC A6BQKpgS~ $8=gTv' #iMFk ͙aƝEFIXJNXCTLfXd@fefue*zȯ_mrO- $͐ K>0(#_ש Ī jۯCY\ndOp K%~ڈPޡҨ%b70on~͉p-7V3禱\B'0>hz0:81 p1#1}pjz_.c腍 !Y7KRV F_쿋rZta4d@l1E|C`7T6gaɉJ4TRpP7원WoO3=Ԉ"e15q}fx*b`yUU jY@ O]zu']w5SEǹqEᄸbNx!é+ 5cY|(nj6df5LS Ł )Xf@=e} %cͣFJA -ɍ#˧LH168ܖ$|Q~79i-2Rv%~(Na{G? QU$$U4E EQEOd?4|4iJ|5hpӓ c*'34Hõ]32uT9|Y8A1BUp#Z0#.t9ZU_PE#<{!iYT4 5Geh] F0!JWhG=E<T{&GVK\IZ\"j:)@Gb,Lr rMā`m?o=Kh`)}.u+$^̀h7yyz 5 l5&wI,ɍܵ>3"$y퍏[{[{b033fqi̓gXwNw;ۄF/,87n2]T<4 J#_AEC预giʖ`l~7oT`[1hL&I,_Xs)c ۑ(i޸jai1|]T--6fml6,:Rh$5⧝y0&`1b%,J(aLTB gR0NKJfy1!igyL1H9滤 47IFG92ὯB]67޲K<3HgBD ިjhDm F0^JlC.{J>eVX~K u c[^LM.!SŴC?蔔8C/tHB|(KNmp _8ˌb;7iF!qdMλEyUה9q4Y@D $u2}.f*ncLW;92T8s\,_9Vzl'g|F廙Hk5i'N6օtD֋s;6ʆ& cc}҂GZvP&iyhcif6:]1 66{Hapi29A0\ F ;:{few8|N;cfvIIddgv1%lxV=1wEseWht HkdVT.Li?n8wM'Ad0 (Ak"SzH٭TãgT;х뾧%xĽ[7wYd3m$$4Iiח"`y'C!FX O^Y.hqi( Y3B|J6 scC(ظgmu, EcedpmvE9St)5`ksaLpseϻmzVM6VYɖXuL7dAMNIJ鍆mq{ ,ԸefXQCsc0B0L]ȢNdN P;Nt鸝s.9)t5[#;_:zE1Xr4K'](0]tS.qnm9Vn5햲O$ϫpDޝDDUآp0OɫʃxG yei{NfWT8(tqih 3`@8*xǎTΎ6>p-smn*ۅ&R8&BIe&rVm1$cHCgCo(Jpݰra8Mmx-Qֳl5Τ}4=`TžLV3o;4-Kb Kdu8j-n`LhhCiHfU3G;8ݻ#ùPrwN!^m͕VoQ2j%$@Χj 26n^G=bgm'hB-&y"oK ,@ߣcz#׌^3pkWa Pm3Z8$ie[5ci # xB!X\+$&0VId R&U¨1 G8q(hKXv[e:h}W BVZqI>q>,a7x\5:刕q R4{PHqҜR]s*CN@8^R- 5Fq&f'8uXAkMED)XY͛{R0Kb06O3;6,ŲH?$"h<(t4{ 1Z/QXS Ȇ<7,9mБ単OB8(zC8փiB< U@z%SmT$ m\ ơF?0h f[ {VbmȒ(. ó3(AN+vg-p$ఈ ZU6d޾e=H!bm)C3 `y"1a3 dusb,͈!H&7g^IX6E c f(:8V!Bt^@à2 .Ѳ(br7@Z.ɡi@cN 9.6@: ЄZ31e!=uF&,'<;Z`TP̧:t Np ȗC큆Ptl`HaV6aP۫u $A]w)lj3&4pu4u` vEP4𙄄fVF=AV nЖk#A\F) s0a&#L9xL1-lL6øWx`cV TrE% AJw 32LqpF T38 ,E2 %79Ԝ :EӿZBM0*Nܜ,~6B,,F4FŠx1+iVtH,:Q&:qx}r"r'>4&F(:B*6 @ L:G[ltYTb`D"hS0IJ/R /2&ٷO=R1$@ɤ\@@TԈ{kh@~[ Y4|c#΍0-q"tpQ̏C$3ƜeYQ,Ǖz,q9pyޡșMCKn%F5809ջ tr{!=o!4b>Blh_+]btcgr@"_WQ}9"& HPSwo +y( M`!uނĐ !"x}G:RD(HJ i =eL=+y4LBCR(R:CW:@$`}#\ijSN#Бr$ XA㎽.1ǭS2|\eix(«]*Hv+ q'|..D"EDqN)m46.Fx:#|dĩN0+6iEaq@š 30pv;sZL)0Xcm0aͅltG#SXHՉAA4N5h-PzҖ@ma *q5ia jtQƒjӼsH8*Ru&NA7dVfRd9QJA4c9:DZH4!w AF8HmgQOh2Z WyJg{B]߻%e-]Ts#ʉc8{r_zˌo7 l/Xbl S: PJmԈ,Y7@QMD' 1nx:Rmؠ@ .Lh&j az@9s~0,M`/y{wq7/! @9()@0Ԇ)ьڞ!bAES;z‹vlv4a!2nT%r]driU]<0-2I&tH7QP|r^aX`J-\8kM /)!ebsԽLɰ7zV#i`nk@oqIpo 0E1HPz1%j;T#e ةDD/Q4sE[0ŇBL$ >6={IF{$ C݆!1W~hP.װ=_]&,?_Eyx%POS fM5ͅ0-ܿ2y|ފx>N_<~9P99S1} ?L'|K'FizMJƾMfs2wXrpb8cYDi%DWh+jCoiEX=(ZFdZ' CPH9Lq`_# Ht,hCpl(bL&ܩ7'Mc*Di(b-p,F`j6ؤIfPbFT&s#h9aBwoC6 mE2J+I@d&9"]lJCt`oوb&IJ G %A"_BSt@B. =wv((J!DD?1P܊w]C@fjy!H87ٲU֍cD8T0D WAX`C4pDx!긏C !HPT_A̚(?#t@x+"( uT'' =sz=n4>>7b[zJ@EB;Δ:aIS{LQt=huTJ{ssk-V)C2gCq5[1.C!cENJUPWsL#68VMRWCT̄E`DK3%6a1 'њbdncqF7q(0a-T0lihhsTDSE*&A*@a[>5V`K(1hh6l(rC"2ȈqH #!-0 J+0"(  a&R5ak2&X`CN e 'YdBP 0:B "KJp8i6F4Q!hЛ" >v _w1=ALD ʓ0`k3@JUMFB$X0$T0RR^w7}>HlMtHABi:r@@6!hy/i7=[PV$LYi7_A`f4x6A" {]`4 *"KY; ֥ pvML,5 a}N®IEq5 \“C4Ҁ1QFT #[ ʘވ(\ XSݝ F)IMJ0ǔU$צpy M8-jL lcW6? %ڡ=P7M熯SO7pdC8j ^(^4~t3>|RD Ps?AmkzO.2jTc`uJ~~dC#\g« "daFAAj93z+2´%>i h!L?ײ^s=W)#gˌ:.H|M(d'VJ2⣈Bܐ=`&jS@`X9!d(tn9qOLI钆 )y_>('PHӨU04>VOxh= @~\`$Q0DrEH2hẈBui /{0(F%h ~b 8΄]04gYa8iie ~?K'd"#xpGiĹƮqQ`/`d0 "R@M>FnGϲk,JwfU@"t0@53/Gԩ 6+.Z._^.#)G^FG2,K4Ywo&!djΚ*0#O}]egj(`k c.j! =!j Tg5W7˜`'K҆Y(rMe4d]O2לb(L`ӎMUC:suEi=O^<i32UEY$?NH5Hn)QPF5\m =z?sXH%th'>~h ^ ,~VM NgRXeFbp`Hѣ Z( y30RdQlщ  vVDVZK !kX'ډ:3kYV,>#R?7N,4Ĕ EH@" e0K^j{a@~Z'|E"FE@pn,te?$8.|(BBTtD՗=FI`RՈC!8I}i'VÎ#\AY? "H@"Mξo{c"A%Ht_1ˮP$))P نX9& 4R p#d FVFp(h$ JtXPւ)Lr\("V@ q~B"R99ҐHE0` ip㔘j ha (8F#nZ!ƨ|6D@̍k@4x!C) 9A1 HPI^5^ &FBn: \0 h8Q'̻ޣ>)R12&R@9$n!lpfw42k|%5[I`Ep4ct]Sa)9|t| u]'/݇ "2 (keRScʨ OgL㾈;Ԁd=mT1(0iD h$GG,쇘dfnC+J.qH{ z@Wo 58(?H?9=M֠hiRe;>`NlH P8sS_Mi58{1)K@~I-qHblXƄT# 7&FjX-EI48Ag;60셐HJ &6504 Dz 2fHgHlLt|r!:"/hAMyRv: w=(`al RZ+nҕ9`TB,h^\1%jfs0U =nJנMFj+>rlZe"&kCmGC D'8?7! 9 *HVDH)JTHjn! MHBSAx|Qw |ϋh"l 6*i)e"L61A74P {yb|&ז/?t~K9fӑjEQ-K&zJ*I@ӆ9sXdBVW.ZKxv>}#4 "ԣOdmӑ0n.S0@@(G% њgM\p $l0= Eyl~0\{F|9Ǘ(&K#HbbAAZ]#T]{HPڧ=*iW_G0 ՏEw.!؂1ДD3DJ)᷶v rP!ҦnG˛Z y""S 7!uW~5>[ i\!@қZaMx=`}B%%&H~'RGI@3xӑ!1boJGu ?Eݶ)s r0 P8{``CPC2$w~ju>7m %WZ " "΃ݗ)!?y?OC^-UCRb!,dqoTD,h"iH?@<Mj$9G>|'vl h1={l(ZRI s |!֦'Ɠ'wGN"֓ YTRn|1XaLPɅ&DGPݡ]HA&Ӌ>^@G1YwTp4_x+:i9SOL CX;bC0VHkB!P<('>J:l\/T 4z(B.E`]/RNYހPjχۑ F̍ ĈkRwf̎ {\/fS) d;18%nY,t"<:CDp( 6q1'PGisLls@KUb05G]&,; FTabM)rԹ<^q Y>`z\>{g1csl)wV?-E;+lКKq˙rcPd )S039-²/9[wl8u Ìٲ:ܽ1dTʉAC-*38udg68!8[X|FĢ _grX{V@ݫ:56(ÓBD;ϠG, 2LXݑ3ì@ 03#M<*g$Ii5&?AQȀرؐ$&L`qjv/7E';R8wӏ*!:gB pvDN9QxLOIa-# YZF1Oh#ىStIX&ƱjCn6ؒKI&Z} s8asNYd$`q-JUQ  @zƺT9QFe[.qaA?ᕬx̌2F]k:,e#q $fUէJJ1Cߢ6I۝2=_y Ьo'4dɛAs67:D%6ie7Qcd4$fuPw\`ٴ3 ](bҖk\hCdh&̚١Ó) S-6pbF|($@t]l%7<>ƆmD&niY}bqP0D! Z AH@]ߡ=\Qa#8i?&MuY$I i|-Y$YJIM$+Ft,HmF d=J#-uUgEDgL0aΛP>E38BAeʮV6􂷥 Y3hjˣHMz;nY &Bsc3A48Z3a5Xvm, 4^lL /t˨JI;G!zD0x(VYǧKg4' nQ D2`pżShrDCK~ӵQ%4WX7 a6tc s `Dwh9P;vίApB"04Q,Lͼ+AH- B|%O񯇯è:ëS'$Iݣ1COJ@$Mij - ~ Z@)rQ9 &A-i38;Ȓ*4eGVf3״xil.w@` Fx14TQAfF68;)i2r'%],(  DSdwP :b< 4K`#<=~Smg54A͹߈,8gL#8&@D `PD"soJ{Opăhx?Hw4Nu?yN)K'ӵyxy;= 2d"%|y $ >:MD>薕>qw_δ Jۗ \6Gנ<ıMCpkHߪdK1 iwCt߈:/g! &ѭ? m߯ +tŁk .i>m HEO<-#6Ņ@:a.!t*YW`d6!m 6bٱȔ ]<[rQyA1T78U?s+j+bH Lc~Q#3?;)^}ηc2Fܾӭ6<jfT:x$a{`G_qrOuIN,fv2.o$b1R͐QgG^z6췪h5._x_)Rٞ~1 w R  G5R+*vQmsc>0H$"H$"H$PzMo37n`N&-{5^-.:O3ŨX&# 0(ddevC H)@z&;s,h%j1܏L*4Ѩ\jQq1نL<Rħ^CObk@sH$ket}J3z0#$H|xҕPyyo ޏA4T~>d@?@1*QId?~Q 1AY&SY/AsVp HB*DBI wǽ3޾x_3%ztV `)xuldpwtT9KSݯlh<={wW`=h`##|P==n/Rx-۬Rw;ãuVY),D[GCQs@[ۜ4M{ RRf툡2([lB*G@ `tVtZ,0Bb)D4t :4S@]`qm!B+DD(P;`/v  w ؃|G҅x>qtQ({XPQlaI ѯ/OooڵuUa2'wj4@A"|^z&X{Ntz:鶷{iٗ޻GϾ/={uow .oܫH<|.y֦-Xh{Ȼr O>=uew2bkwپcs)ٗ;=<>7}۝oUݵ^vYyͷkUۭuݺǡ7>=]e7w _:nO}zzcwCF|o8|Gk(:K@4Ϭ糒H!D+6!\Ta BPHy4ipEW|:R}bh wc\hC@2ΕwsNfPYKo@_|ML/[#<;*{۴˯;0tU{ع 2^wm1Cj6 ݏSwݽa%[(z׹AQmzh+MVZ`g[W_\y\ -]6k#+{}ܯv lۊzz޶27t]3s_mRU"]緮@;ҹN6j#GT;g^vƁ{=saӡРj  H= q-EܷaAݛ9빑GrmڜU^ZEܖ Kw7;5@o wUiޝM؀5w;7'_=`yw\ZwHlʩebG^7ϗRlTց2b=5-wm}j4{u&VE(]=7^O\ɽ=.)yzӰu|'suM{qgoyEJJ6}|[KRCn7,h+EY׹骹wCyVvIW`a5S2mS>k TJyf/xCJ=c0Ѯ`P%L]3ݻUf6Z( `;䵢!ET+ScǞxضʵj Y2Ԁ*^s O}LhBmiqdmRͳpH*l|^ѪR((4UZesr>MC,mdeI)JuS˽8 - B^G| ;4Nop=k3 mM֓F w*=6txSksk32m2vSơ5-ۡӬ*mnޮOZTk=<=j@+Q}9ꁋ}7q, *&0&LLa0`) L LF  #M4I & h2`iaO?$&`HA0@LL)M ?O z4'66O?D4~? zH=M4=CA7h i=M$  @hM45='zG4mM=M5G6Tjd#&jOP cSS=4<DɄfHd&F L LLM 2M4L 4d ! 4&L2diSSTOڨh*~R~MO56h)'ze ړdєe?FSymLQMO0M2LM))S@`!$D$(UDHՇtU8YWH\=b8=ico bcNFS_T+ }kO 8. TS`myC?gYQup#Qu,na$#򱻌 %zw'gѾM|X&?:H:E.<=v_Qaf`֚lĖ5?<ݖ󿗱Cc6r=/a2<*<|vmB8*(>V1P0Q @D~Sfz8,|#P\4f4aK?M~2t\gZ|.0Zk 9V}OB>/v]mu5Nk7$yF3:̀XeuL @|}t ZVVX!fxhH2'g5O+ 䎩-fIÉά:dVx8;n/O*Q }9m;. k9jNm^ܼl !͊hL8^M d3LSo$ym91ݙ !%e6c:`XvF?67x?> ?rKAbI]$~'f`B51F@Ųhﰒ[1ύ\ &17/9Qr,ݱd,"1g#إ=|/ը#E7գaJOo_,+, =K-B= ,ERg'%5r/ߣ90cv6D+K@CL6^:`:BIZzѴ>gHAu;{PaA&4iL"T4X` rm9wW2: R:voMHA1`K#~+p,k-@@):NU"ܢtaC4s|wD2H8(4Vy}U/QlD搐3%7Zcw0qDG5ꇅ1`+3}U5x5A_-/x5!C)ZHWI[}۞SSIG7\dFBl\{FB[G*{Q}-ϏJKf/jb=WSLvxB^i 4Xa Z,! B ֭DazKsw?;?ĜCf!bVWm?j<_uoNϕQY"RcV'jŢ|VrT"8SZt~\e3|O2rrT\dQgp=P dy.S޼a (Snqq3G+52{9g55~rkσ鼎}rؙy\Φ@r1!6KX.10_{1 7yr_oH>wɔ92ɕKkbFb^)=A~fWe[Tlz *L5>)J(<=Ts$iyV^CH  AWIXoCjؘu6>Kk~rQT0@oyS+'2|a!?yB.>E=sm6,!r E2;?wn\G$]/g|Eڃ}8a8P5vl63EME}uyPnI({UUUG+ 998m:5h#pnZ 3U*1<[p㲮1^z'ҘDq7}3ߒp>sS4? wk}=m\gu{u?3С o {a̴lYH*=nq"?R% ƙcQƚ'ye.P%$Òrm>uT^Dθ4HT%̽{o\Rb#wxrؘ%zR8@e+I9rfYA} {y˫M$!+ 0iưHl*5l3D6IQEhnusW]c;IzeD6v7^κpƒAӾ˭%LWKsEL/@po{}{Ƚs}mwƘ+>&~6!C۱: ]YP>q!N(B1yF& QՠF֦2*_3G:1%Dp58(.IS̄Cte>c@S<ŭtS ֒gn,̾/3. X1誾6cI F@z+ΫE9_wǨc c]]e^*ũokC>># eЇ:3|} ⠲R+HSTgPdƿi1;.dT_֓,([z%|c6FFz9|||t(NS7韇)B1xeTu\]kWRюM2,UD"EUP**$6٭aۚJfohd>lKs|vtEJy9JLLUS;Q4rѯ{ahR\M\I`AS)꼶[XoP AKM9!HiWoN[PQE<9m*1aAL qCGF`miP4 DĆI t :sJe~oçp21Կ.}E,CPC6!( xe~߼;^a~nχ)BXۅo a;Qw_zFB4BFY3hn3ghﶏxPC&&?סm0gǂrkT-!!;jh$=fK>zJAd_"% -t~KUjr 2?EWMƶY:ORNe7QӀr?@p4~RF}M+gIdBM|0'v՝bۧa7"lܐ7~jɭd^qt/=fvEo̢A<ZezzOٮxn63ɶ\OIxl)bgxܬMQ;7%IL7C}?CC=W{-98^<;>A(* PUQD"_N(a_CF}kě-wQD6Ê \SsW^p| %k14xt-gC #':`)1a^a_}5h`y#ŠcK;Gɰy+,/xö߮[.o]iut" Buڙ,qlC6f%!; Nxco!Mލ bɚNٿpkd1lkQ9%,wki`yeyg,mnV`O oiaVsTA+bV(jqwOg$ FUk.X :(o>#2WwTdUX$B/RNꌹn0Sv8F+9Ǧ񠡍M8ԽN8k\Qq6wvá?g\R9y\2P#JnkuL9j'F7;gH&&#;[epA<&a^{~U mAx3oˮ7V|!mGW)àفA9n-jc}(O@×;m>ѽ}t7qe_aގ.ۥXSj܎d^&d|o?ɼ4=<̑SLRsԊLE5vȢW[Lo= He]\S9DKSVU‹lٗL4DZT0=8 *u=|d7|e$9!Cąҝab{OC|i8"tBTui mK!ק 4-6s":kUS;'GS> |hҹ!˴%WH5g<*v2p egw~[9bxlÒєS̢5vnSE~z.g^̈́52$l w6mҐ~}b=6SBȠL{(U(Äz[w>RZiG;M}.J8)|TIW]w$j=SJGdS$)G*)u~\q>Bzl_,vdz+̟e𘛋=!JIĶYHfxV!VQYs[>[4oԶ.E9m!ܻ-jI7];t\xU-jN=Mv"V4|wTMlrbX/zh^F&rdu$D8X#e _?!̢CW_sHT#|p%u2HxlIOlm 575SHS],|:\I'Y~6!5ggWQk|8$9DȂ#reH35xrrs3By~cvokG5 jQbv8,5džO?UdGZM` 'Hq5(Q&4> x))ȟކ|bkA}+Yذd^a! ] I@qYl) "!\GRY>LjD2N}J-"cU_J=p&& 9Ö/x/\opK[gS;S"2'MQ7Z1;G]UT Wiu/x=屵% #sР8 $Rᴹ$rhR=Ux^d%Gb1^L!d]%T"c__zОN/g *p`(6.1i=YniTQUUSQTs]Ǿ3 -Z3cD(Ae!vâjmɰSIn~JvEP³u~٫Ǐn"ߵ(CA)L}ژe*'ԑxɠ:m1 /硂 |=>JSm> Q5ٚfܟpxa=;lbKXGk>+>4JN3|<,.NqF*3| .\~({y=*6^ [oyE55_us=iuaR䵬`颞LO)gaF⤵=@SjqH> 6W _mMOW/6#iI$Jju&_辍ZuЅ6πbR/hy1vG>ёQxhajI!~l2ٿ[0?/f%m2*ud1I1~qDtA{= }dT}dtr1CCnT\O]cop=fdKT<+Tڇ^а[h K4U.}|O ѐARTt +\:BH769zni؎GFє5Yn}W~^co:MX %Q1QސHhL b W}@:>!"6Cs?z`~ïG&w`9ab)RUUa%S\T>Jv{I*꛾ ?;\ؾS*j`n1Mgb<n}QVYQ~Rn&P9hi8h?5P\݈Aj%| W^]˻a>#['8cz1 }QWCPշUw=6<>kk# |jDLlPqN,$,Z"#7#5j C%a*Vi?+֢"i j/OW{{qrClW6ݜSu @hDaQz#aF[}JNy֧4:90ejRC.8Z~.ʣ\S׺X!dM )T)T_FOF}X+}5Nk]mnck׶܄(I]/ Ye;qh1~HP0ޛuq(ʂ_ lwvS^osG16sװPc uE*5j6(P>G+`.g%OR/gHC & B؛>ޚ00"f`GS3u0@,T$@,@; \,q)U .ԋWR9 Dd 4V \gUNx6#g9`Iꐡ#}.(y9_Hdl(ܚ6LRI/…1rl#Huw=r]mȪN|n0u8LU<Ÿk]ރ +:PiȲ2ۓIxzo8D$U٨Y'WI p[J>k..~sg~Ė%bv_STiK5\K鰕tyK2^F^oZ,ld= ;*fHMٳ 1N5jNF-4Q!U1LL)iaRcU?ga*qާ_Au`^j0E{FY]`%NiSV[K}<g qePD{;Y}VRL -PRR0A*lD8q"^SӉy8.%KK5ѣː0s#Z9vnrھ-C ֠dta1!`%RMjh9,0b)`t8iCe(,ćΖdV($(>p#W.}zyb*^54|zhWs>;N. %nuh."\ L{(!xB=wIgӚ7!h0ZҲ!"nSCBꠤ~-AAH 7@9g|wKU>dy/A'9^%q'h_5ҒA}/Yj8\JMԗGQM  Zkb*v6qo%_{LdzzH{+Ne5'>YQ5Ms_벢:0H}_S*[JfU*n%l {~әy9_e ߸]gÿN9\|pauaM 9=k胸#Q>˅9HwB*PeR>vhm__Hë|*׵&Q}wTtٽ>/fx{9 ~{ݣg?rH2Kw>/tME1g)rCb9iy/eC%ERL-ͪ. pV/4T*G'* (hϏT>Zu;a7ѪILJgr~ 6/35Leնi;WsiU&\w:˴9:Q&(oE{g Xu%)Gf;ckjAF& * A" aN|ǜC<zFQ"mEG,0P}s/E@$l=3ipN]DF UN=0c]2P!؏lt8 E..G*:)uG߮xyo\ RݾǶ{ƋޟDVj/|!8tOI~ ,LK(AA>ࠡF;B-FBӖbION-:OMjm6)$ڻޟ6}tyx뿞IA;NC.yƧ.'`yѬ-ٶ~A 8z]y|5.tUj2ky1Uv-UNqIbwC1\Xbi=Z[m9Yhʚ]m+Ei[m%`6lּ\|fTj6QEOa`jԚ޴ 6X2/H <}#M{Mb&ɡEg*EYA>nF$R$*/[(נX*/ɯ3>S2F%9Y97&#ۄ)719 í[\aûDUOj_Sr U>ZZ=$$DR,C!y4OH|l;>}}~T$ d~W%/6` EPb(Q+A&:aXr "(wwg\TH ]S>D] EP~d )EFORT';2KEE^@c:Qry\ߡ Ѷ!Reer@aXHD%>[5"FHR;#]cN?koy)Z& d8"0H`<߭Ay- '0 ȋ\,Q' kO_ȹ:ǜWA6#'+5wnrhW͊"H)/|O3iɤCO8ʼw 3_#OK t]؝="AgCUuzqF~_jqLYT=QFRXAU졿mdAgZ-rUsDM3&5 `z6A lkfEp9;D5JRCVmNz UQ ϩE_|iĵOi65==O:&ˡX}iqmsκ/>6}] * $MMq0 ؄P8U 1ꗖ6&HPy.bG({HaF*wy0)R!qEaD6hGB$B$b(F q#.kaؘM8̓;%&i0KF;2?G*Pլň9w 2qGZ8c1i2(Wn9= ǜ/4cLya&GaH0Z/bɎya}1ӈ# @ bdZ)9,9t/"vFAǯy"dM<`q!PQ04(1815(d{Sн}9{U3)c @ΞbbsHqal`( 0@ psK@wh y^B-zLW )6: (pб(t5 1bb5 8$+#1k63/} &"CMn|~.K.2g7>JNBȚ I^`hQĂ-xzk( "dߨ<i;Vv ^j51:c!B鞑Tzbghp@\q/fʸ/Aij-٪\芸Rcp^CHV~ Za9,y,k:1]caXť1=-˲yM-Ll'zK['v<*j;xW%Dz @"PUHL}h)|SkG?W'"rG3ҙFUopX;ٷ&9Vc@mݥ~uق2FfO=}_ v%?9'q/d;F<i8BC4 &tEc-MJrPAbCx1$@v@nJ8+w ^}Z`^pFWe.łH >`@< P:r P.?nW A$ݛ*$ cm./U˿a4M$(;S 9N. H60Tv7#fT]BQkR0җ+2-#s.-vz57' 4n" *"p-חȚyfB2͈ g~ΰprapPEih}ԓ(Nw` Q _ͮwbj[:6/B66Ƙ 5Xr )?KW' ^c+Ğ5e8t {o QƵ(RN1VkĄ>oގ_i#O }#R^^"8y8 O5c<\I5^VNq>j"!C5V*SBӟ.2\U4h0d̐7(8},`(,0*s3 uj)Xo~?:ҖSe"I[ЊQlpm2 Wndc`n(%aáNQkB ]@!l@d(hP:.B\ i@kB+0B # b $GHdB=rXo^-溥- 5YBL;2玵ڨܨa̱,KYIk)[gYf,ϑ?(ij<%ϗ=t=VT"F?|%/h~Lyڪ9b+H&2'W|[`UHrڝ@JٿB{·'/w}WSJДMCwb&ylЉC5!4dC~„ Ou=NBǟVDr7F>NY~?&2a}&9`1>sJx:JM(pSSWG.Y} zxVw ;Bcle%.Gp] `bj9|Mx9 CA٘L K!.2 \ay@MRl2ҬiWʪ5q(8'{w<W)-11' <\[Fc$UB/T>ܿnm2 =Vs0HuewBxV|k`4蝖qi1֡6? }()`Pfɾ(l@ w;;fCxڳCX?ȵ=;fc&4S  \Њ]ցtGS2ݢj8X\q@:e5abECU^'rPy@K 5(PkѰs5iac#C2r,T7 {eAI|Sjz=Aܹt J$"gfp^:A,LʤreԱg\y~Cz55GL_U{X/D%780oò'Dv ra5<0owaSTе$Iu{++_ۿy\MPىdv8&D>WW* '{V8<aBX ,J%dzZ9jpQclسO<)\se{D|@];c:*%n*R:2x_:TjNa6F$hDtG]KOޚO ;ƖzY\k=*B2VG}3]BIPYj g,e b6k ݀ 4Jeˡmv¬)!oN.ndBp?V ]KUy \5Zȣ7i I6]i#񷯳#RkBz GfvЬ\QWgtygu=d &F ԁ0G<پ2奙StfJQ9 Q zo_5[[KbOm̬ Y }$.+D!eZZeYgu_1go%B{n=嵚ϑK=X&x(J?p?!􁥊 ׾`D/zĝpK#سݩ#5oO2HeoUȩr"٬pgznc(+"Zj:+3w),4eaw0I69R _["!U_V g~X~fb) y ~R4ɔęLx[ZԢ![s~.޸hA,-n[\LꝊ"zvxma'hU" ~::]8suNɢ #Vf?<)R]:lha0pϮur&wOVS <0nh0 .ZMhvF(5qH$aK b,xtn MOGoh%ȫJK-Oq{NZnίQ~QDF!@S`0nf; }[Vi{%qzVԔFo<_Un9ranS%V:ġ->vV5"{؝ RQ`&mR^Y2/˲K?ІU>Fs%;.pHcWxyLj;Cа9zcњ*Ւi (JOOp},eFzyU] C`h.E5 {p?c^ B83uc'n^Vp{L>*rot@)bє%tN!synol+_QClR$rfa6*8L}.ˉ|wxYxH`q mhp I^l9BvS.".VJG>I ^fYF쀭4^cU;*a‡ ^t#ܓ-ubMCd%_bW6dXhkѶHAU+$Yf`ŧx1V&Mԑ;6Iy}-x{ KUXoF2^wR߯-0?P1i7븁)|c?kb~0ZD<&T33K+'Ғ]OMNGr!r+Wkn4{tC\x({{큠cd BMC$Y|>A{/y_ĺ8 kZK7uO.a2]N?@rLs6jWdER7"Z;; f&YWJDǔ41>hr3K79u [kA씾5J ě,u=IwaFdO$ߙǢ쩭&߾LX d D-꼞~H>:t.?MyRqbH&(UbeFz?={M@eHz(mb}$-}2]]_gԨՕ-Zjmָwm8PM7crAKv鲪ZZlŞ2nڠ2tߟd?h.l]9!r)hC! }+- 6c78(mJ/@ݩzlDp}QoKb5^5sbŞtͰ)] O7yhdq}yĊROQާ*`&$,ȴ Ѕfg}!̺÷hD{r63QtY%C1?ڕ;s!V$KXп7]U&Q !]Izpt}"ۄ_YFoIS6*O-K}3QSH{U.z2k>CS{ /2ez,Wq]_J)nFCDlbVȘ"n"ϊ0A!|Ey:ěiwnoLf^xn` og\X#'ЏĞr ? ~k"7v3v++<@[WPH`x{L=ei-F}0) :@qHy}cȷŋq[}:R~r䨇g$5w %V/C}тЂimb 7AZ+6dtݙecBJ b$-HqwMO2]D2*j?xTL\b(BX,sgj]Yw:KKM7o >BV;}1_Lj#O6'|u*U!$$?C#`昒]`H$r $g 4&MMb"  X$Y 66`i4ĹV{& 9HD{1y#^06kNLlt#ڐ=yO+~C-?Lkve}S>5vЁ- (A|-`I6o5D5'_EfS-ظ)sP}K RbH߰>&`j^~pp# >3A#@CDPn 0 Z! =@ .loN{jO E2JM :XE67='=LSqtXDfN¶izeC>x쩔q5 9Q)5TI+i d)N@jHhId1 *.HP&[*"A UIbF& ZAe1l#Bh(T !6_)֠,Z{?8JJwݴkv@( IX6߂"IɠQ*2 աD&oj0UXmwoTBi@Db ӧC8E$脅cmLDIVXȨAima7ѓry $A}0 `"a(00;чx}c"@ (D %B@*,'F0c"dN}HXc"AAIrh"R mXYH 82Y3&d("!*BDJ¢'٧9 R:Ҿ$N}O*lb e dQP?zQT ƨCIIAu }(ChekSł c0PVO?p:qd by_HEttU" `P;YR61C@dӈPB2!lMJ -@eݬ,%=l 0d,"Fk >y #$`vҚ:)aWH=Hdf3Lv[q P648lF*D)"D`T9"$Y6H9*Ȉha6'Kv AVMҢ$`Cv]n2FTP0*q;avt{+x("6ER 9S^pADC}prg:G:QMOYKJZS$ 0Dda(ˤp$1NntM?I) 7d"hmb[dgqaLcP0Rd+` ,==XQ6B )ۉ@Qj=ףwVͤ e7fJ@-v*(d`,iBنtG T ˾|a!4kN,ҪZSC SIІϐ!3rC*@,Y&L&(VEIOX PRn@&lEH 6s2 4DҢѢMm,[KueͰY(ʏ6`kidYeM Q!Fb?K`vżĚND`cR@2\jL2E57C#& f\j|)f`hXӠI.48,1#%\nĶJR52@[sPmAcͼ$Cp KŗY,($ME4\`lЩb 7|>ȿL@usqugd[BRa j Etғr+@:$'EX ٱ}Cq4Z٦-ByhNC  α 1 X 髚f1X/PE -"D,*8g qmHrP~Q+l,uG xf]QX&Tm7v5#S)q/zfYG/^ML]=7G 1p3',b.@@ 2ԊE/&df-8V@Q RRe:FR|T %""52pf.ZcZ`R8@T=jMRl#'9AP%{#w\=*78L _MDHp@y+ݬa,CTf6 V(H4u]3\Qx~CRfjk1˶IȺxڃ;0j 8uI|4#෰kڜqToMI4uY ӈwhG-0`d+w&@<EXE!S*fd|0Pa6E~,PȡQA5yDjMpֆ``uyz_C,6Wv5wڤ^Ϋ"u(wה:3~j+ HmDUEg 9XOqov6tzZ" 9/10b  uҚPuZې77n '"]CN Jل)e텲O =;˒ܬ4sX>kYJ!P:C|!9π"C#*A-"gSgby9Cy:ngn-:c8e{؏Byxiи+m.Щݾ3NH Wɢ=&ͥ+fE|ej<Ŵ[ ˹mlSbHE$jC4`Y?'E`YwXjRf,#qY:RFLZ\BJh(S.ZÜ%$į{QOupuť[۴;ӥ3.ˈUUUz2M,Kc6h笻Ms`v63^\.肭j% tg7bC X`}AD AAox@+ӤG^m{iWss&qۣ:wOOsҨܝ=ylRQ"h&9mw55S_?F ;a]z c$ "OUV-MA@`pOK(`S+~ZH(^c}EQQ |cxR* Nrb|ރOo#툢) Q8k\;ْ ?9ćI *Qti6ˣJoFuok9U(ʪ+3][K]؆2[>|6T #;+dM,Gou=29Y@ {Vjw.L=V Ci垼0n` h2@!=q4&6Dz[a 3/ ~;}'~`AZf݈na uUg[K oף|F$ֵ ??Îaor'Q>8vh3"C薮>Χ۰RK%U^̢* Md( {}.=_~M'I_"?W2x7 1TNlZBU \u\6|@ Xhc<#P 0/SÞa^x$xI}lamyF@5r|3˞MBg{I%D6u5.|5}!i9m7< F02Ui2 aLU4rafDp|/CdSpU|9}J#JHQذOd灤Y Qd B($Rv'-)㹬7<5#֯X9Έ9őt2+ e64Z-Gg(UpnkcLc{v;xlWUjI'i}=BP\'$!Bk$)Wvl88{jVJ_SZNb*)x ;͒LmbKG<4t沐aKapư+Ad9rG?||ڗo{ep#ȏ|!^1g)Wgu)5CϷyCSMɼ؀-QP<6Mq83c:ټU&@Gkn(GN.1gE^`jroܸ|4qzɹDD^sOP#bArMεKT7i.0edS [g{7;(Me(y.qxx'7K Uq*pX7(,ɑ"ҔYXH+6+{ yz`g&r_ISR$b"suO]rBKDKdV!z g}r!Aݺ9k#VWoLIm$kV^qnR|43o'V>漾Nyge ]hqX^z@YGbnvcHl"2Qy? <tGh|՞ۣ J~:Fm5pq Üiz32E! )( ӊʏU`=:"!2tD9DjZWI<^Z2qZ}b߱qC.[SŶ}h<<'|l0i^j <uR3 bW tA(6!j~x WXs 'xPdI aF\I 73^fl̆ڿqd~kASv̂ZgwZ9m!%8qts=:MPD$/!È>01l 'Y}S v2e>&H"@E'|^`+@'O9|y9VI60U^dzuU< Ԣxֆ`ǧ'%a/b19Ԗ]f (SE>ƪ *dd(z+ŊDBj1y 4@;(&7@LOUEpB*c voS}Jؾ;Gr˩Ee.s @@ש/~/!KgXӣ(Ws2 u\隕H- y4jd.ua F)2/蓼x7?69 [Uϵb ɦO}Rv.ʫr*K\ԕlǤK^Υ^z6*A1W{ :y>0?C˹F1*}Nj*5t6'Yk郖U~}c>BIg\7B ;*(((VY&>4 J>_T rOjrNl4!pdQBD0R) 9)cG]u )9KUC ٗ BDvr+1`%bӢYxHϼaY'd#gYEu2FR X)(2,2 dT2Lm]4JTѰKT:e<@t:e85NC mNf#cFtܼqOgy8}3:t'ەUYF-*oh|)`jo;gЁUQU"G?|Z[]]WkDFU%d7&T =xzMҴ@U}1!Y]s>S*c.ȍfJ؈ lX˯bhu֝8/֩Ac1?Svr "02ji<;xgL+ #AہFmRt^ǴDn!qO޾x lB:_ʉ0 =Ip'<|Fz*p^3^}/~^I'0ACyxk,dj[]' 3E#Ouq=XpG;BTO;ΎuN~ia/|bNY-[șyʝxwG='9\]>&|XⲊA첒}O_ÐsQN e=qhA{|SrP7XB2;ֲ9=9,Xڽ+ 2]p_f0CD3 [.EYŦgft{ e>g$[gdZJ};sh2/q( % sX 4䈔!mcq.+=@N袀V#.\)uV!bĥEVUQ] +)SӬFK ]}1V&v FI]<[~s8C~^]sQ Q^) HmB£׫:EC1Q*UԄ'Wu[^~h{1r׫[ /gq#n۶x<.׵q,>u7Lxo[U)>AJfMVn|t')(=k2@'+c4E\469UnШۀ}i)cq<ô \:NPM87Cۿ;&WԮ y&7}`YUm"L˳AGR_`:7Blp<:Bю2!-ې ,FSuKO1\]ZKd b;FUI @.,N/| 7]t*$N~%6֛v ~_{lKdɽB)+*ϊQÚIh7`q(SfbРrXZFq  "d?V0M#; [3-Ħ8cina[93B%K3GnSX = ]K%/LF:fҜcϴMRY !x T^Z(܂&bIoUU 9^W<#@ujKTPQTEq .4e&ɣnC[ IičfcީpQrYn>*k4m$hHmn͞lsvEx/FL=-\7`h/IWA(@a %;' CM7>˨nx 4ty^E=_|{tK+oc731Ax+zoɉۛN UWޕLwB[@"%285\%87(j6SXclK-gе{LlmUzrԳhXkI00cŭB@ؙ|cvoKiEGתD%#a!)I-ϟ >xq8Y1iDUG֚ shq("u_8*?3N`:+ZςÆLϯNUBABqpG[l' ܬ֘?q7H%6J+ۛhf~6J0 2-6+0CD*2=A~G۽ RƣD%>DywgCV^Pq)zj$zc 6[[d|vdqdtp-@(UZ{*!f-y/#=;(.L9@G݋Q${#؄ܾɵosя Zyqum`3C~1}&JR#1bE}&V&+I(=~9urb &H wJN&K̥xkq-UXlYXNLcdk3kep5gTrPA $C0ؙ畛X 곌TT*Ca6_-η$wG_c(3҆MNM?^nI"Պ87 Q0QOG|dNNmGgƊun.Q]FvNNې؝(?trt.)ؙӝ/ ;!Cߌ(3ꩽ΍uc*l*]pϩEi:u$rq7Ǡ(y9Es1vJ9M=$R=X>h|L1&E)!RDéo,)}͛S %}ib r<6^*lf1t\=7Rò܎GaJK>%,R+g::*Nbg:^t K \Kv6m ^8v &V)nk&Q0~=3,Yb*]At܎9x3HW /.9C T -D`*;?:qR 2s[5T79VM8*/YڸKD^%y_:ְrwх7{n};pĿ.䗋7Xj{+"Oߏ~kf1ɭկKH9qflMPqchvv3xޒ\Te'vx)ֱx篟>=k%I*,G>:ۻUrF%ô]y.P "Q}CwƂrNUYs6[{Pq:N{֯rβÓgpu$^aD^QgK]A|Z烠u^q\i:3IKDZk^s쇸 +uU]z -XZ}nD[8] g$;zBc$ו b5LhzW䁪#F .};Y FUkJ9*˨Xwk~I:ρNu;bQ{$*MQ z=~o+l:U>;@3SQ9{&sy:EPWyg7,Rl(D&QWkM{ A&&W}._xhPg%s01W I/8WrCp>,z}%k=w~J1nH)gtrMke։T)3ES(LЊw#nVQ`j@ ߖ )PD6YE6bz@:gQ{B)N"Iobf\I=gɽ'0!**mx*6x%ȫScJgu>*2w硓}]-na0QS^c)9Vz)’7,|NQ8Mϋ=+:.3E2ISs4^s;]tCo>6P+CTs x…ϭq 9_Im'uܣI]+л={5p]j.r8ZTu;ueuUQɅgA0CEguE O^|5COӢF\~H}>g$xu}w_X?F<\4rhyshzn[*jmZjɵ&X/>պ*2'y}Ekm'8 cƦ JL}Ȧ;R,r fT0{w[E&:qK1vUV#vNm5>_m{XM0F z]jP$'  ws5:=G>H^Nӫ; |zF>bW-{#R`ğoa{R{6Ge [dLi ig wfy*,kG_?\vVͲ dx}%wc''U#rt%|ҁ~ƅ'zlzj-yǫ,ᚺ9ex6N;v{Ȩ,3f]epu6u|r%Jɳ5t*QW2kLsX/VsTva~0 32u*<+{z{r*Y=y,9ҫsQnC̰RV(>*ęx?5y|T7^Jdj:iGœŠՉ"ާ_@pAJMEH8ێp7~o=lwVCy]1Cyr09zTĚx3>ffإ̜)V}<k|1Kh^3]jIz$T8n2 >޳<}s3xYwC$QR(E޷l{cgⷫjҳ⼟5XE-3+]XIJMNjNbQcֳG^يQ;ƭx~+v`ڪZ`@cU^-G>ӥ<2Ϣ#P+ͯY8/V$0cwk;C&Qo$b"DZT {~ A@HyypҿF>˙4Y fz*5Bd냤=C|QK/ l= qR*TާjR8Bp(ǻK^r1VΟ5m:>ŻuKl9}Z"~ݬ, RUCHQ ׆!puh J TiPSztҫOUyx*rjtݩIiIV\Z8V޶Kn)J{71s L;wQTWwmJpҰzM %Rhm_wg^_Ug=sjJ.Ŏ:OE>uBsY'7?q,՞gؖCɦeM*l & ,:C\/.z2P@|qk"nz1xo=--1]Dɐi}>qłW koLL[',;`Sd6aCc=p{OZOz]g2ϡa1m^xI*JMQ{K'$ rPn|Mou*_!Դq>a`o}~>ݽ:j5"mtCȈNsA>+{Ӆ;)4Rfwo:f¾D}QW6l_ɞfrg73&jia+=;{DZj9UP!2ط*^ڴE Ee7 7)*F2)BÔ=+<7ʗ)̨iļ>e%| ɽG4s7XhGWkTZTD CFrd MI H{_mVR  :q/^,L}BTo'=jn+X) Ov+i>fxZO!ma9R=Uxܼѧ-J^Vb-;K{"aF,s=-IoK JSjIl5*2AU@ ," ꐀRR (xsk~ ѦNm[3ГS=SQ'l3[nT{ Fz^zx8B T[0&+AR,!p֧(Va.`Wc.] yy$unMoSرLD)30 rDuOP\l184ABQ-]3#''P[sjLug|yOT[!WhήK*)S{_ÄNr.qM9͜5ukb^=cbj9>Gy#6CgM'9y$h0$D! |zf|xOhigIAB`NMis(, <^[vol<,9g1^BWjKmL+!zXzWv^K nxÅ$2bqv#k}ymOVe֎8p=~wLHvC\{zVhv[Ɯ"FT:/9.Nd {2)l4&:J (|~bvt }}Aw8(%u op*h<_E8eВ ƶKqq(s !9:n8y_WwGqD _r.!KPMIbr^Yb&Urf]kqDSzoW&z[].$cBﱢd*`j\f!2T;j i["%+:L#/>y\kEayԴ㷶 ֈ.dnAra eV4 ,M鑌 2oWa.[XyɌ`QWOLok9Wѻ]6e P~QȨYL<<~~h[]\O#M>^@pk1 Mskκ={(Ia$Įk/ḠgvJaOw']u"j]\e$bN#W^ tdž] Ct19;In7ZhWK2n舐c:TA_QTU&ˆl>b =~Dֹ a314S6ѷfMt61"ҭkQHЏx CT'^]|iFR %ylHOvAY*-=`A%S5R1^ܺW /C 8p H^SFǴ{rG~E^ "OBsMC5 R*n}d|%4^zAE,]IG_!S5UŔ+R>O@$F>6=RkGYǨ>Nq:ۈl:o]!$*AƤF(Fo7 wOWO ьو,{fU!k(z^9q]H͠Zm9AY>L|Qq%[UȜ?. 3Cf=b;!$HsSz8jº^: L]ia=$x7d5_uF1[Іߓp5(,F9-4i,~zz$^qZү=1 s7r{|wG'ZEc\NŶÓ[׺w9磯c[,5xB#whoѺoX:^*MYL;"XPt]ϬQ⏅Td_NY0_ue$DUU%UUUUUUUUr _=yUUUUUUUo??}Nh(9ʪΞlY+62rK0$uEf|. oS*lПOnh_vf BVðykr֮@kj[dxC!W$M:J 19[9.B)YTg w6+d[?rf B Z"`)_^%g ܑry=:Y\=Ebx:̫E4G*K;5aWDMҖI: .\tanF;ݺU]9"᨟sc[P,WMo?_& qT]$)Gۋ/CiөR.z\c^i*_8p&4G^Ѷۥե64cu4dx=8M$wQsuêLR/`Cb3H5hk i* 47^#Y@N4i@ T-5EQTUɿ*k?_!b 9I"k^Fk5kiz<r{ID$T ꅌAHX($!ʂ 8Wach EË^2ަSv+<>ijm[^bu{r?k-&ʓՔ'_f[#I"(wޞYy;L )u$z6we΅nEc,^6rvXV*F7:ct1hTcyhe^65Gtz9]c@$ms ='ŔW+/4Jɟ79m?{Nn^2\-哛.*hA妘8РOn8i֎A˳o\bʖf|y'lVxwhKuZx#.ݢhANU%~+'FyڌE,e_+`5?[>Kv\H)im|f1Kr FE$'0sdL@#*+'V8)ds(}h 1_4J?C)Rm\4^R}SKhtRL1@qbqtAL4#MgbYq,|ښ,f; fVLV.l#}ۥ  hèm$:xQ5Юt/HNWg |TĤ4Ygky[dK;(+)G-U{uqQt"NVg[Y(qQwv1Ï"֚5]Hpjcj[*kI+K^Y ߇gȖ, cmaE˾ Mq|ff (\qᮎt T򬣘dfFEX.1MCK+q;SQ}vY AÜċ?FTufYhO >XYJ>{n[yNSun/Bxx.RsR% s/u'V񵰡AA@x$0kZD'v#kE Bn/G}q̺zL7jmGq=j+Kmmf;˻nq ;U#0. #v)+dVe.(Wy #]MlEzλoaBRU܌]&N&)XLD*7$^x85|; [o!Tܷɞ#rjwgUn n818ָ(޷3׊= *oV(\דP-mm{To׶~_KalvP@ZٻHuX^,f hLϓ米.7-T\ `Un15;<2G_ M}Q %_*9ZKeYqb|jʶ+*,=̢z}1nUqwl-p-f1';,\kv=4oKRRĝk!?Ld7/{~}/}4j8g6QG |aj?>gA"@pGb0%ETepm^?Z FS U|ˈ[3ܲ@v~??ոq(rޱ{gڡErs4S+ް*5Ӝկs4ƚS;6"GΩ+h2a^\2}׫1OtK7nkl"ڂ}饓TQ..5E'7f{ku`Uh=zy`-pߙF־ ;5 >.RzKaU[Z0UULfwjS:RM[wurj0t:\ͼ^A+0 izl-7TLfvT3o>(w"8!ENd5`)m݈yOw n_iᅅ*`%("Xsg=LSBx9x ~lN# ;]xiⲵ#~s4]팍; [{ݛY DzҠ4Ia %8zq+wHT|u3jUHbf_91Qkr0PId(ͮya"x$7 Rq#6͙0zy0>zS3Zt` P &o@*F**uMdk94g OtGk9.|trҜWW)ܜ^u}o 3DxU'J*&&AW+/mQRפbl4S=8="ESɻn묇Nמ|:|_7oo9gܞDqm |/ih)l6=G!뭺vA' r͍/YˎA^V<.}U|zG(|S6Zb6=A0#-T Ԯ6 Qn=e(ob0{ V -:ZjLe[HBÃD*ǽl sS .OE+ 0gEp]ZV[m$ѝYZUAjtE]t2{" еxʠ[F 6/a;1hB0rw{{/QƘQ\c%,fnu#ƟB9Po_u!Bwmz-l h:SS+Jv\QʘqOS;xfג*+5M88t=uxGSOmU|#KZAWN\YDUۢ2"=/ 4˲I{uΗZTyYجʼn89 <-,ФmϹJ:\HEcg&qEgO"JwG<޻n'{l[f@3NǼVx=^EvR Dz]tmhLJXk8;3c y5IʧyƴVdd1UYwq lb1#r'w;!2 OtqJiQޠA,VBi˝yE[S^s;D )Nqͣx5gKHRm0O`UO< mϲMè|mj]pzI6EYmqE[2[5X *,ٺ2Ŗ缤~1~OA*y蹞]X?rjq+X%vxY'p'[US0( {h=sҘtdtFS) jD:@+舑̊q"ːd²VQ{ (rܩam6*ujoO~1}ԙ?t~U,R$ԥ87z*'Pيe~F 9hCr j1f_;UvP~t ]c궓ЇoX ZS=MFc4 [c܊> {Mf/@4]VR'ur.)֝nt]nX6ş5#ޛH [!\UD%_GhZKXWh'ڤ$vOIS>ԋ,K(w*PMQsBWj4s{1;FʟmB 5[&y%yG6gU9RWΣ*Cbi1oQ̗fN2):hTyCbYi[%zXd[ XWĤ6+fnJMI[>*ۀ޳gl,{'<)su,hѭK3@Ʒs-{Yv7ҎorlJRVK+[ ӣVfo^ *q&9ꁴqHjٳ=Mm@-67!BV5O;8]3L$.7Ps(%{5K^u:'7*<"f<ɪyp*Y,&.8~7hڶ'tq)ZFrN-$Η#7Dx72X,-$2DqҰUglR'{}eM̞yu'--6uK s\sKR$K5YtjQY;å{#^y{goZ;S L hbSY`%z:yN|#;c<-\U"%6O#t m'RT„JA,aߗRvU/=8Rt1QWafc$h˗ayNJj 6`^]aM5G<ɛ B[c|lz#5Q*_|1U! | m W< ߣx]iq=8+'g|jI,QﻵVC%jR{?Ѫ:"XӬ~/G|~Dv̡Caƨᔡr|vRDU.X@2G>Yq6d=X=j7 C^ݶj=1Q6ٺI6c65x9z䠊RX~=U&rO )펌%ݢm}aw^=α_2YJ2;WCURf0b:0qJf JZ&2DBm *KFvu՝ =”}91s, un)[!]5s3]/&q1I:֎^sAy7U=L$V J s;pH{Uq?;^{E:d(0É\ꋶXtIst>,,M*!\ɤA4t/M;gkʁr#.\R1ŁRElm|AjQAڌ.H(oKi!~5D42`&֮1 Nl4TI;i&N.AcYݳ7r˩~I㎍[>+YY&"j\X&noD8˓eq'a3g@Lep/1Oj9ڨI!Gnԭ, & Mi:jhrQs3{|KYCvlʻw@)*{JPp2Oyli8_nTw!tݵ}uXiH>|˒CWhWХ(~SAG.>u*%`V_]K Qnr^1iCr=.~&$9#;AX@73)n9]+mm0kwYdOTϏdɂvoț Ov~iQ1bt/5*r-Z^ޏzר O|9q`GVJJ]8u-V_&4bfF\343 Zo?Yڞ>嵅U,V1&V@Y"b}QOKFdvJҔr"<鹩Z>Cn~6tϑ䔫U}/],uc;%pM+YiéS׼چ|oAMleþgfEU,}x-w*hc,̯9UtCul{pr.MbIa^r[EDJ=bHhd4+'$ 7D{OV{]&ByXj?)CXR%!ۍۄGrhia) )#X>.0r? "oż?3pR~u¤`5r\K=QbsB沐_kwUU>9SHa : {"9W?8Cyz\^@5y X˝L juvqH?}h 8ކ(D &zಯ9B< K;;}fok58 f@*t ycf-{\zS}d .m|׳JccHRCTBωmӶn9 `6jt#@FDG(ΰ)JB RٛvOR*UXrAR06b ej0ÔuT)"&)}3!UǡG*saw11>qO"o6&'̒2nl~jCV|a{YWI(jFTpFAkΣ,艉Jd5^ u7W-X!ӫ;4C8Pqe 76Ƥ]?\gz_p\9tD4eHSc` 0>?w^]iѓ7q/;8_gsb54_ߩ#b]DZi_ӧWz'gԶ Z(Nk!@g cA FQ(P 5+aYJ`u UdTY0z2z{bAac[R"LTGWA~0nC0t1Xڥ,iۤRiRш~S[??aџ?OssMB.Jn~/ӾKN/l>]U& Z÷]/2E9_DɐzWFҵhZY6Qo '`ሕy]5Ԗ7 /gVlô u\;[ZmR~%xtw N()gjmQ< pw2wLKd-9>n,[%٫CW+ 7>%s"l^.<ˣ[m[o&\Ֆ\"NDK{Թ֩SYLwwwqz`nrS.)W \>/_MM]F GІ|rk/d ?^Q6q/֯ww!d{ߝrTh+tL!0vFZW$u݈LSуjJ+;,9 |~s)wݖI9N!^\^Ae5|9Od2? ׉??Ӹvo'QQH9Q 9JA`XARm.Ue9y $쳮4-ʬbFc 0M0B0Ooi!҃!K,)b̈́PE ("H; JTTDEH"""""""B{HhBhMPl")F@KXYE|L`YcS`1%<4L4M7_ޏy{C>.]lKDOxOnOb.7a?p?3r;|Wb2x?z~SNEO6[4¿ ?L6/'_+Yxj1YѻkxDTBDw+TD4e[mfRSÄ -. 5.' 4,_zD$ba>1LLhMy%5b؍́Hi:aHرgX_;D fO,YKFEEPlIjd1Җ}4lE =0e@5 \c9"f !6<bMH 1C( li$ mP$A$Sgx)$HB1&GD*I?OdwV@CL(SUZHUL2fMQ $6m[f"f)l<16{+4kBنU8ֵ4LSDp_c&tAIn8W?!(bA;1ɦlH^1|8_0 F [g=ɗϙʬoL~7DVu#ꛩ0mOkS i㚖̶6[2 64n-9K8q > ׾9d˰k8Cܷ)ܛ=V(!̾ƷڛZWnǫFirryjwkY~)[ף.% t5L^_亶V!xVWwyqi;;ɑN߆]cHM5yQvnfCeq8JY}`Ғ_]R&e_SgN6$A! Wr qGmſXYC@Ђm_;oߓ5kwm4Ɓ6& >>gd|T EYnz*qyL7PNODI>xy<}j:IJ<4_7|jG>lӗl/_FSMe~5#ĸkdۍ~m#8u@6V(幆}i ,(Pqh4ז>çüԕҜ7?{JB?=]::<<1U!fH zesz>ޔ°ƲGk[GrÞ@_ |-ț\a> ?9>@A 2HZK*$Z!CD ETٿgGۗզlDَhCF{[FJN\Ʌhmԉz%o׻:dgZEP +Wܸ1wjI>CI|?+}}Tb "`#)c sIo!{OLSgmB[4-O~Pͦ""Riimh#iii罣"(b+2L9v!ΨtO?dn['hNHE!ʰUH+ذ]&س5Ko^2-yvE̍ JpyY k6giB5!{]OT&m7NAQJ^mN)\iZ޼ 2?E78ȅey~\&ITvL#`P" cbp*U=8|i FK{S8X56)pP:!Cd:!-0N\H8 V]0X‰ &d/~"I'Pε}*ds3} &O`Ƭb1EY?eˆx?[P ]GKBGAp:SQR&u$$nW*k6b@>owY}͜L,`` Ƅv?k9 1I;-%Ŋ ِ{`t'y$0AH(EQ.Gf1"oPPҽ,$D9DljRFqdEJ5?/H#؇XBbci bR$ FZ4+y+}uc`0n8[GB\#`D*"쾢Cplm6l+fs F }(B?89  :ORh>`3k˜@}?Lѩ42!LHѰHOBئ 48l)EC"5٤lHm0m1)+S0!թKFVynP%O}\h Xj8z?dcԛ^Xd;yRmOaLR`<u r*ުEcܸǪ%D6kch"m):KK%0UqMh`,!k*<"W64wH.Fj6I oT$_0G`t Gb,r yñ0Ą{Cy3~< \7SSi?kj}>вvL'`7=(<'pau0vsO dvYK%} 側G:b~ F~4%Ȅ~K$׉~hd+hc.X묦&NXsRf*΃f͌䌁sUr_Մc{ 0:@ 'Tg$/X^!voULo )/)s6*7.w`/ wwk%\c|~BON-x4Ù[2%`:9ގzJGh$Y ?s߆}]&3 K!~LJ%@ֶsD8=*2A@80Hd]jJasBSM>9m[s_╊u&qg<>f*KCb2bh龭3$- tY c {\"{̊; qXp[F%ibYkD‡və_=o;DUwbu8g{vnOJ0ᆘ'Wi(#xxEp0Լ7Iп=$QI~*RzZԩc N"vldֱ(_bq?٧Lj+K˩~?7L=VE ?NxfZs QEGvcܜNGOE}f6=Lv@cxuN?[WεD;d%qXO7:*/+{Z]h#:Hײ}PP=x.9.wqVQGCxiWY;;U bwm%{d Z4[o/Z ѭ`yޜAиiJ8r"+ufrXBx YGJǑ`rIrݠ7Ӝ wfCc^Dؓ;w?C67J2˵\8<*|{׹wVJmm֦.2Y7X=dNXa4i!U T!Ю<6KUdvWaTnjXw:)CyNCw]&-3#~p;BJ=ܼv?EE jBZ%pB؜ysq<5wa4~p[Bx LeTfrbnSNK,"*1XnwF}Z2Hьˌvؿaӹ҅,}^_5P0!cm Y3l4 2(9ܾ2ݣkzp\OUƶt(?7R b =w>CMbv%ߘ+|ːOZ|q;<5HI~J^?y[KpYsyij[HԼnWA܅Q;8vesFs.E6qcwn~fx:3]㬫a4,,{Z{#v)|5Ik.m : o;"`1|&A G@&:680|l(HDtf*[͹6r )&t}6Nى󡓫 -T>OE5`YDE}mj;gM&0")L*L(\1P"^A1*4C ob+o+}=lo#6KլSULJ>-qKfA@X(@|d- gox8nьT\< RUǿ䳍nQ3G>A ?<Jn`{oBr{|:IFa8.-u ]cř]t:S~{_8Am$6W˄ոU:[usr(`7L6F ,E&B $"EV P1a@PY VAIEpmBv*$VTg[$(gE |CO'.uP gdhX0Q@ëz@[ebXrs)g=kx;EڦIT2ͻs&nTREv(7/B=b^=t E䮠4K֘`TǖJ7}== ly5ٺ gxmY#7~.4hHOu ?B3/l3.<&-Dp%ZwyKUI׍R0NC­BxNB];h5T(!@#Ho%H@h!/:^Cm4BmCb@ZXi%2\f/5z;$BjJ0Veik" Uc 2!HI%QZ!@+Q$",PR4O#4Gڤ 5 W`!SUކ$kp`$nr_QMh$Dw2Sm!91Y]spr#)D})fA,ͳo 3~SxU{2`s&#sd H`4v@E y KUㆭ)"ЂC/*BDlBP{ߟWsT:ZplfHSIp7]Gz]6kL66Klo_g+lwhu3Kુ70dwp76$ !UK$x-VHt}/e#]449gf>10:I-3[<t$F`l`,Ēƕ72fыqTm;V >Fh }]4=V{$Xfzd,X4M5hqv2FbsEl@cIhӵb/` W#~\@p£$~(ԟܨ72VY/z;%%eQ?jB׈ōDE-lsqOލIw_G] eNR.˲6-R)3UG2l {Jh4TͶv"%hT7T2l*\Ҳ0qnO枝zi@;Or_mݿG.?0f9v+" Y6g F2snYzD+ΈۀU(鬓=nuPqv* Ը\vK:Rgϯ9čGHן8WY& D۶9P}{珼 5ܕxZC5(bmy Ä$5]f@Ȫy,/Rpz{W+qy2g&~U=_[}ݚU2Ī?g5&;kĊP9)]SJblꗧ[£u8NR.'v3ɯI"h`54= ̇zhdi=cޖ/t)[ndx^?Mneǰ qC0Xz7hV784;/c<9S0OJt n[lI_R^nΈ<؝PQjf,*/Nni0o/~?UAE^<'cpC SEBNzA;viШ/:}R%q5NAξL%X@`q,]9]g\pe΁d B,=ۓZtx0\4ɝvF8F_fN 6RS`l_+TLjbZ`a#]um=jS2z8G%.D'aCCp"KcYEB%I#zΛԃ%o,jlE,8"9Kl]kxLټ9X濦 Zjaۈ m/Y#wGk^7[VeLAzb'-<\{8sI8P#mݩ,,Zp^~cy8!-ga(պ=䱲u|{6G«x *c5CD.UgתYùHW/ ͹n֜hqd~ Т"Ooes(8ɰr3t{J Zࢡgd*(QvtiѺ4i/_jD #ضk(P~𹯱YKIlR8Mh9~Ô4"0+*+"۬,ww{r\m ٣N@Lq $b`ۣ1&$~5ҳ؜h_N+0t0GQ 7prBÏIN3 B 8PVCdЧW:wdJmaܒ3'Q[fvƕ/9pa0Ӡj5X!)ةGTzU5# l)$s|LwTV^uAXe4wB6e*z1xFkvW1Ha:Y}%s|d\D/[5rtoXfM_ɉg =%ioDuơ|W3^B.?cľ p]dcf+4fKɏ ̼]I|n%$Cz[8d#\^lD]5|mR6*iQ&!:f\uqsmx[a(h.A_(T3czj+*:8.wS1͛{gYZ3k -VIM֘/83R§{oN-KѾ+552)|F \ow4n,xܥwZtq37.p#xqZ5Ug8)h +i#Pa ظq.1 hE=5Cpx(zl/2?_>K1ZV`j sn\DQ^n;`Hl)` 3v 4䐷cn-mD׈lD=_fsyojj bYޝ8 "D!j$BS76ȈWd1!MH 9J/[T~<ѷw ǣwvo[FI' < x4NdDX\m303&(d(2 B$U@m&ȉH!Om/#B3O]ܮ% @nLԨTEJ/JbCL<*Ř8Ѝ81 [g~c?snڜ#_tX:&)p䪗=V7zTJ)ؑ! B23* iUb)!Rh944r@~?q%aZu1vTiQLs C}M#{2,O̿fU^=TW+~z: GBIP+q.{Tg BtI$e&h\t ;qiF`;K }h`t. Ea@X]!i(6< {ρ 0MJR$>L'IH CEOY$aW&"A* a@9NPm64iv-mw1෫~Y@KOi=]z`M}E5 VPJdkiYA1!$Ę2_cj]X՗i`@1֬#U A ns 7b3r9;;4JXSw & Io NHnWPtL˟7Ji!a!QZX?$_Wb~`Ly*CHqnj^AȪ(;WۡAfIgXD QQ9+J|ڊf{cԍ̌D4 K31<.aY"F;F{l_0< G"ZN:M<&~@F.gNT/=MDŽUV;y%ds=6OiC!`_S4p4Ȃ%x:)7 .l+# tlvjuNyT9|}IR)qI MJ$]cL1&a5dlLѽWJll~)82@VMC"X\(* hM̄e2|/ot Dm%..uoq|ez`P9#GP  o,1]Bge PQJ[&wm7+H@i}y9xDŽPʪwMsݫ-9Ɋג޽˭WdozYnln[ C@9V(?dapFW*i4XCjȁtU`nczqlZ i)=kƓ4DOM^czdU r=GzYR '.\z8KwDP>z/] ޹3Q ]^L]MvP ,i)!Fp|}sn;Mw_ -je -GެS..=zt۱OaD(֘rlǽ^ {9I >ξ;+Qڪ yVxu? o잏6q#q’|GD\7WG.)L7?Dٜ~Y+CDE?/ a~%0k?Pѕue;Bxat?Rⓛ@~EG {>!:C_dgk-[HjcOgnY zVlAA-ZύD_`dzY4~ D h:,c}XAUQ\o{q%;{U}$o{ϺҰ^t_>71*j{+=sYGtöl-4S?ԆMђtz{#dxCwb?_nZe}T޶s-UmwsrÞY%i݅`$06X B(V4G7l/hӵr::^pBNXJ2Pn]|jEARl?[5)bx;s 3o ]uּ{EД#6ߙlJAҲ$ZxUΈ]P*g4}\O*>_wJ)_\8]te|LFlVjӑg8Գ_w~}1gI[pޝ#`m@U#8&t۹+e$2贜QkCi=ͮcf%}j+yFTYyvdK)z+nLhj=ZHj*GUBh4Ǫj4X #&0kwAEܫG+sFQ^pxtC%p'C\\ikM] ?T7}~v;~W~Jxl]{̊lwkN|v#ޔ4VR0 3ʨ%JMvS=$,kNO38%%i?C ێY{ێ ]>{",(R8t=ؕ+{rG/eҭJ;Oޔ:>kqO'7ƍ5[wsNBj(]I⟭[%JWzRM0 `'IZ-nޫ;@r dT$N\_5HM!˩+Q2c>̿#Q?P?⾎\y~Hڈ_@i ݋Ccg*52Y 02aN& ]D "dTLYHS|UeGG3QcjW} )o|g`B*(H `z8ŭo_;|̓C"BNq! `~'S|!Tz|,GT''Mce"bI1ަHFV괍DƹӮTh9prs\<{{Ԙۇ{`t;. |<[==Qw |xqah!ۆLR1)Ķ$"JRA ,@2M7ŋ&QlXRi)E-vhiHAoxʰ{mX#Ja D8"%=F.OW78\U>vC0(#aBEQzlQuŽ"eNGq ; 73AzRG')RY /_̀#0}B Hz~õCɕKe޸nmMkvߞs)8J*mj>xۥdh s L5f}@^O:4=`b'~Ϣ׏q{Lq^lmr}`4.?[c?z>O^iynqw6mt4qǽa%JD|'DD4,':uY b} M(0;eUT0-.8+98 )}TY{Ԯ3~ӗS%^,.([.ʏѓƎ4 (WM䔜V^MՄ,0l.KZ'mZZ;4mac4m|\]X3*k0¯u1Z#(h:v.#Q. (~ky~1:g9t'ԵQ1x=s<H3Q=s}gdjMQΧ4/UN @UĒn(o rnu[H>6pRuی ޗ+t73LKDay9RQ)忆4}#QNr|.Xz"ޥ/) (6` &0\Pm hL> 04L'8nq˵+p1x]έ5j5o)x(ۿ7W#lՌfYHSm"_k7\=\mfv~}{zk!aKC;-=ê& /#p|t[aG,oGl>M'POui#d=\~N58:@3<{!3=p6"?elJ$>OkzQ6/. K=ݟxQ%' xQ'"/S)x!- H%dC|!0lNWD ym݆ӠT=\k"=Xš߸ mWB;#Il{i˽|'=&uraER,~ į?Ϋ?o"KƅDb?l&j#j-Q+U5;<xOyͤSF͓%@f md:=;~,5-IAt24m5x=}&C:@JF(LpJT#ňN\51IL"e&aLk>򞐶KW0~{DŬz?sbrхJ `rC#AUL#5O΍U/=BVA"egg))mbn@Y ]I N$ٞpvt0,EXϩP| >)ړ&P boȇiȡ{q`KXO >fhz=_ş٣jDdTd&H '@LU;꛷EO5LlLH\2`Cm:٬8>3X]YGcmǞN̥U`НJ.zYXDH[1!^B?G?#_#h}7 Dv fCw.(^$4eobJ4 8'#ޢG|Eeg s;Cw;JvxYwWEpȂɌ 5[PR8*1WҒPD (q`pkSA>B-dỂ"|JqO}OS>?]=w/CL?=XC٧:Fft2/+E2Q /拯̙H̟U[jUZmC |^ZV{ C@-gviF~}=&ɾdAt $1 nՈA"Td²7Z1HA!dU!tcp̶?Ymm-S;n}fDz>41zDAt DL ki0TS*(쪮eTf-RAЙ<Fo m6lx& 2Qf8Ќ)U73f-)>0wܛT~7T*4Ïcd;<2,ﳾC6nRB0FպLj( @WCԲp&@9`d=ybnkapة!Eccy8*zM o |Gu7)1E՘svHSGH& gm @ 2 0o QY `lᦻw|:{aǜa`P⡹NIgLŪM)442OŖJTwk* ˛V&. zRe&8U)4 hɣ=mVyt_r2*(Il9)@lpNYm|ȐzM3DNMnr[@%&5  q7B\ s4s]nQ@x Ƞ8(ZpwQp_GoQ#DD8 @BExblM`&% D D!MyxX7܁qE0,`` &$DI>qbpwbB{݀fKч͚qCdQ+N^܆`Z;7z8zk- kɛͲTV jQ۞fAI;owP3dI7חx# f'M~qCURs=p2݊d{鐽+ql@$$ٴ[womy ;ocv<@,; 'yQ>S @6o K" IESw;SV[Ǥ4hq(,&UM ~n;ɝo809htD-%?^yS@ Io ՜m|~;'sIqr&MtT=Czr'Wz :Atϴ9] ":B,{Yށxm`P1H%!dȈA@@s00 ZmAm|ؓT5{]]n0N $q:2`bG1W^@1B͈*gFTٲM[q kLd @ `@M02SYrH:=3Osȧǯо+j Ao2kspʿWEiE{D GFwXqi>SvO}}1~OꉽgD z1 ,0s4u~Py+6o`lga  KMa틩?Sz~Oږ]Ҍ:x߇ӤJ(D뢖jPz>!JN^ vƦ)(}n.s%|L>8e 8z2!OT($( p†. ])}㯺ޟm*&aʩвZ`W& pKVNG|FC *={yEJ!IEQcƙ̗Q!J~^ )֕ ,<DJ:`3ZAvAGWoߺ`\L,V"]t+5MkA̱M*B9n^^XkwO'.Av@I$8r!K@myOB`W4CSHDCT` R}amUxduД?f_x> 㡆e, w~ ņ*kvyvݣ[_d3sW=KsO_kܑL/{K7uM|˥]>Z졖# igGWN'Ѕ~[̑f2L@Y^.|~s|@~pt>?[mUIKi!I 0ab-} $Kv]~:i *(SQ] i-3(~pF\(N]߾5_E2 wKTB"$RI-cyb>{nJ.7 <0k!k$p\Ƴy ]5MGA6bXLFI4,o D֨-p|QV*1ٳv9ܷ` rkΗL$B~}U1WO i ,*=e,tx 1'we "7LFAtԜ`!E=_k]9 6r+9BdP #PJEK#BM۔WEbI+F6SUhIQUEA$ f8w[n<-K,0 ›qy/gOefqfs! " 3#$KƎEAA\ͯ)N}R;6Ao~lsRt@ D$A 6 610I<y5;TեbAPÒQV>0I]Pj+3#uF݃4+ A"+"C`ծNnybAΓ2ux #((D;*lHv.DORY6[:\l m:#P ; E@>p2j:jp%`TBQY(Q2ӓt0[ޫWg+Y.LH8hb&4+;䥭G-oKKZ_&wl;ںE&Yw>IcB?Gz1'rCH Y1+ZҚ ?龝35gvv)xP@q:~lπb"@ zD,TR b)UUYAeW=_Sqœ%x{qtfi^M=8/PuҘXQvPA#x KXqu%xփ&֮ Two Y]e7E۬ǡB8kUU"U(1|(}eKA99(s X虆D *dDC8˕[GTRvhGw]1~z)cd137SlTFQ-Fy}l)lg\C3mKDPRlGvyC~` 1QܔlgCrFKl1]GMਢr<(*ʕRXӗo?Hyz^/5 Q'F83p*%6qGHozmRNMwR bW |^-62 "^E5K.YwF{SʑTT4#prwnץgQtr0Z**^Ko@D;@ܺ\:ugY.O!tBHAdP }2603Cyăi.)2`]ewB/4 $bf*t]OW&>""IC4q:z҈Lh)7춴<}=#C* BQT## 3g,7OE.Nn =yPŜ Os0yv\dΓvl-{# t.h#jCFt9i#niK_67+p4!;ދ[t@ F'DI;rm8m(USQƩ{@`U*~(?t3EE k'C}]e,Lύa8]4f"  \RK^KAʨZ d䘄 Ɂ :Yq6.Y+\|VbrHq K݁Td7t!@ڂ DVq'&"j)AE5Z?'+dhS7&7N]ȧwKO8h]̕\2$**ڈJws"\@-o @KALAj*D28nه +E6;Bb\ࣔL@-}4 2n&%95Ig3t `!RCI)T़$}8nkʊwXgÀK_y8¯4*>ߊ_b;>:kI Kؒhtfݲѱ߃k ?I)Y8d=A 'lz u—U{_Ų-= 奕?y-#?jcunR =TVDBRF$^ь{|X*sHrCx|^>bٵ#e#.6_9JYӻt%?ϲ:Ypp$0 ?Ap;jQ]spR9 DFPa2'nDgn▞D.$[{Wf.ίkH{$ԌEhul}%,cf W¹2qD*2B KhXǑegƎV <{UH kki]߹S Eí#4ω$WAKCIb`vIʽɳѱGazY~j`52?/xoؘJS@!)^v%#~? +wkxj?o DBp$sBU6,rQ=\6 #` ԃ*A(Y2yCFa5L3>R XXΏ3rd8vNyU-R'  #¤cX't\\lzIz' &zв (tt09)&FMDANQs5ƑF0JXIؐj!r.Qt7kHV6X7?2N֋=x+oUًؒQyzm…SRٿ;; Q@)<BtfyȍhRNMVI  U@" Ѩ-zZ-߿^x$z=숊԰Xd-,J}xx×Y{Nˀl/#T^;](*8x%]ݬ9֖E;}T`W;q[s7aTn&r't8ʲQmŎǛ;? +lRQLeaQ}iSn q9!QglG56n͢ut/DՃ4Rqk9/!zQMDDoKک[߿m=q嫩&%ӭwOw=R/~GAP4K_'=oϜc g_(\{R7m^Š;|ʠ^kaL_;kX9s,|r*gTw0\ S*[2iRXrvޛ̜SAH(8Bi ٺBfr+!qnŇ&]앋@HcQhn,ERUAHH#!;wb1am"c 79&hDosb1^ֵ]3ȣV#uja(R"[YUY[e;ʙyC1ZD#QNb@q 8v1. 1݃\ES Es!4V4HFB76&)16 M ӛyN-Zӊ8!=W@~G?eW]orPpOAFvNx~ s4̘ir;\e]mn#TeXў\ͯJ]مp#$ SelS,I%eb18b7b %2)MgjjA \L{yی2.˦єAe!Bk:Y L '.HIN2]wa 0 X*?j) "u &czÒK1O{ues6p1EO4)wds:Ŏ+5tg,?eGb sɒ!;eK]EMOYJT6 C<ޤ05fmH Qp@ p')HCz̎98$N=3<@TwIw@]F(O+{PeCe_/Mnj_8>qZyx }g~aE-P]QOiC]F(r_¼5mes>Fj>B|뛮k!IgP?H: ?PB{t+_Of$LNL\rc-=&w)oDVD|pMGޡI ԕ2 _+:r6A@MPZ982wħ"%U꼋B{\ b!e xUCmA`{بa"Y8A !(OCFRICeBm( H߂urdHi3%_-l RCׅd`M!.A)vgA 肂}0[HɊWa` ԔXc)}b2̡8HË[b#QgHf3WC?NFPg+y7n!\jrY-74(&,ߚhK }j~4C2\ bZCf,ߝmc((VK=Gv 8Sfk%(dGֿ5 "Y_<-Ur |Vv-I?C\`@]v7?/?z<躘B™@ S@Ok9"aex[u 8;J:Mf4!A / >O[yȿvh=s bCB?mغp`C9 J.{wqvK|a\@(Д)Frxnt E p<ģ qcT;-D&A`*5gtcCB~|4}\,BD;Q$PX UI+jƍsXCe/Q@ 2Ad"#,2zv#ぢE=?Lm Bf6l&=A:mse6-V^cRQH@UEBwB:vg mO0>k|BW"$*-#&xoos!E^b:DK{W xW*Rl$;d* v;gEkQ[˫~0O?;Ah6ˎdvo[iƞNSh"'PU2coezM:°%IUV0x7 B- qO7D2'՛Uz6&Zʛ,H,-5T4eI<+&V";A;D krV06]UrQEDo{U͐AU b-VoZ$Ӛrb^ Tj&"T\B &SD6R! 6(E"D !BHBR @ H2E@s7A%rDa97k' V. /kvV y 6G hծ[~iM+b&8@#^4)j7*֕aY=ɬ% =O-,? TM[ |K65 (BdSUsRo ZoŖثA^Yϳ]|B] x,`4p98~=Qt6r$_VAF4)l)IfOq+ TM#ܙUծ.G,/u@I7id~f#R㞽Z7R*ɒmq$υˤ$h8N ~2yJN')J@ R֧FY5s8cW19Z~?qW6ۗ K)Ѡ (I_ 0$ r"@qca$X9FJl^.Cdc1_FnB>c2NqR U$󂣍}"\{bƚwkf_vKA:NRh"G@E2'LJ*cӺP#Ʈ8 Oec[98\9Eakd=ڴCA/_LP4UPo١qb,_Q/ʄbÈ8{s_z^_?K4obQld?i edo◂Zr*}퐵oJsw{o77 un86H"E I$B$ߥ囡?I9C՞~>'-`{bOl Ys7W7fthE6&1 㿗3;lQ IcVA/:;2*w ݷw0eʺ I!F*ߠ1ÖoΔjYJu([}!|Ǿg  Ǘ{vv+:=7#G~U 'gnj<52[A_76W \3X~Il6IPkKZAfn.H{x\.T_l H& wvG_V:K_#כg1B]wIo|\EZE' {ET\""a2;ղS80j()5D&ڇTfj)(4jbj@ėzM$L)D[&\⫕cBJ@NB E,ҤjkKlw5Hi-Ӄ zk5jkRnIAL-e;yoifb"v:ґ kHZ,4qVAsP~ۜ+Hs8zs͖*V,#F0,Sk f+C?.Piśoۗ *o FjhFs|9?KA]ERW\fq/r }}{RH;$1>>MDp:|A8D~ `7%[,݉8.Io(09{kuDL49݂iI ;sqv(Ƹw5TᓔCOQjo6G/јς7 \,F$(s P]MHXT^Ls@YA$@g4ף?0o?nuTK}Ju3ܙgTz ەF; /J&OlχbRM%aV@7[iI}, .X ]Ct1i9zޯEf|/9߁!X#"CrR~=0¬)HEӬHUBjV X[=Rbn7id uϺ_lۢrDh7ȡ0; 7B p\gZe2>BHc )*WlmQG2W<@/○6H.£H*1͐Oq "fMrN}z, @B Br+hIh-w^ꋞ֕р)Mm$im&2#H&yȉ MnR HMFq6M|MIU(m#3n.|ͺqYݧtѳQFڡݗ:9T+v|:*DV ͂Ik^^ދrHsTi8{qYHt'B:ydBFDo;yp wS龶.EiKV~}ƨ4 &ߒv[k8)UTc2bgQ ZZ/)|y:YO6_ Wzc`r1%.slzIɵ !IB̫IS72ۚw]Ybڛ/(dF)5uvFHASb9;8͍+ړ#JMDyvXSqU19pZ,Q#Q ~*zX +Zdvie\hR{bUQ"H" k*dNMY°Y U9fHڌt#o??@B`O9m]'=w=>r[!=gr[lhB\@%_~ùgVY_ Oii,^Wj)з%́C1iͺuLq@ޕ(d !w)ۋLN)!d4b.sd(wdQ_"?+y~Nj{FB5xt#+ljy:^$ciUy{#K$qņPߠIܜLm;bb1K,OWXګۙi֦ve)F|[=;؋p^\  PWnd=1;~Bav0rMoO⮱ "QpW(,h;̅5&DqfaGԗj&Ҋ~mYC }B70kJ^T9qj ܂ܣNcW ר6?wG񖭨mDՄ[IN0tlI>3Wtგ1%F5bDS*HY]m8Za2ۑf1nr*Ȣ!E<~5s+>{:abE7 jkKh09 {38<<„ NX«%P2rї" CQhsP) d"B$;gϕn\bmj5n4UY6/ DLAUo0‚\5bDY++'%wx kO/n7PM(^wԶK` !FP^T *MŢ N]n^^'dޔ-wR !o{ǃR+#&I]37Ro % ER dCH2Ű*fW] +f$PLD U 7/pI /WŗzCgY #ͮ%i""J:*GҎo\)IWt萲V3&CC@`2vE;TLmr$fXl%x2ȩ⟬^725]4=OߡlDh$YN+ǚ%m3|MY?<[,le+AN #˴\T08UE&B<;~ &-+Ȱz Ƃ*öXKr(U-FV:NO݈SobCP[?]ˬu\?)`kETYY3S=d\Uy1<;w`^C/"cg|C{.zJ#'s@7 FhRj~1@ EE\%FsLĚ=Z?*w)sˎހbk -D8:uCUؿ#a~3Œ<ץ~ř1E\BwT ]k,zWL䶟zW:<݂(r*%.ֶ6@Z2 X(T򕚂>q4nA zꭺRM"[s9,JNDtB2ϧ^g_>:x XOɡz4䵾j[a6j+^J6bʂ3!~,OG6o|{-j" l|Ww=rHS)k# CnvM405IZ^{WfmW߰ /|p4" xcz0ep,IBKBADH <*Bޛkk͍M~g oܜ@G;޿WXR+6J15ut{#PHX "++?Ab"4'I S Upݢ\c+|- ڸM$[4'ժe9Hd[n-)H!۹ɿB`̺jtzr,C~?5l13͋ǖD͡(*IDnaS1rjOwB\55nU q*ơB\Te<ہ4fR0  VMdB'ZWq1"cZ//I+ZY ^yݳqFѭ֫U=DTbQYmJdH"j6n\I"*5R5*9)}3ϼx ̈j (VHL A('c|X)R4`B(Tp=( xAhل7|tLDPhmDbMEF%4(V/euG_˥kK#,~[!'33Us1(  ̰`T{}O񾣹O(x7؈֧rlc__.k?ϱb/cjV (T+ZUc; ˙ WQv6OPX-DCOq vD[Z ]0KG6j"ZFCRU  :tCϠYّkMtNmrlukX YGz-i?uD$L6hUyfʯ3Vǖ&H ;XVr9ɹL.(S~%=γwY%9 lW[!S*A ] 7l[:yy*N}$@;Bw]W`Yz'pTBEˏ 3o|W@פQ\K 3խ;KǬ~$sUC&=:B,Tv']Vq@ڡ8m1jjXߗhqj]u4z>)QJ><]Q) 4Xf7vETʶm75+kjO- >`:S47I{$sefй}й,*9˂' 9<.q(+w20bɧ&ywFzmԨ9NŲE z4@|Ctu?44 Ce49]kJsYjmݥr92*U}q A q Űar;1ɕ?\5(SN*Ԉ>:vnꋕ^åd T:ǺJ)>.[Wv\cǙ`vJ㹂PMnIyUTިʇ7]s#JYKO&1m(Ej Wr??nycvÇ2^ܺwvSwc9^7{U5]yyc_[Ձ 7ҺV1RnsA|E4CԁBF|B6{Vͳ5ʷN%7ƈoĞoNd45C.FGk)#B,!fcZJTC%6BMY; @\96lxԠL=XSmc7rb K9fRi !Ι FMhǶcT0@t倛52Λէ$ }/S'şڀA`(}<ڢ wbcȦH  D/>d:j=T4 '49sO/F N~4"P%K@h{!ʢ)6ŸPZmA(wވh^'ib"}tB889@1`xp`)Pb z'*٪PҀi~rOvR`( -"ͩoۼ2&ARfr cne6ɻcISD;ᥲ<,S&fBC12U~>l$ʝ&'mKVB-N/\^+L$fD ?yn%^_$>2 ?^V*c+MO`>^{_%3`/p0P4ۜ<6͹Jgz~Sz7=6_㧴$^;'^KP1S,XZВJ$~ $Q`#~KJR]=@ "gꥪ_b뗘~B_n 98N{!OWp@ߊ{=~샊)(Гg45ĪL@g;ROÂW#4wٷnU:jksFcOCV\|&5weOZrH~ŮK,w,P,|u$jl[L4Hn\:)켃&ݰi\SR4%yM4ZpV'[;wWuQshsc5c^`yxWѸ݁a#`?WO0F}oї{lJpL偄H86ᙆ]2'Jai311S8:‘]b;m3@&# !BN)`0# ֲ!2"tWfa*:zX! -BDZ$#h0!%40 Aɴr32@_cv7X͇Y̶mU xM]yqмr'MU Buu%U K|* y3cǂF#~( 0)e4`Ҽx.xDHI mk\_>a/q}`#"=m %5"'eI`vtcGrʮ#X"}U%ӑ ,^^U*vŠdIg/ad맀-1y?[Wm:ƶѨޚt;Js^Px/md( BR&aCNzJD{y7wgX&t">0gsWMKq:'y}ϳee~g?z=~^ٿ=CHHra{'(ڴd @>,HYlL%bpz?bNjsJHF:n{~4wxg#pBvәLFQIa`|J_J IBS;cm߫BNhs1 dh?-+Ț!ٯ2Eb!᢫UԵ>=i޿g"Ɣy_4i$f,J>񙅈ln00/4$,OJ'%)>=TE}`{$iIUW^} -ޝ/ϛױ7-UnVB{ spcvn4Eq`o3!I$m"u3cLi*! X$q9|\!VB PbGZl6630aUE&~VUI`3@0 !UYQZGY"QqA% ۷+]fB DD"P`XdXJ)0)&`6ƛ6%.+EA犸D`3M5pH/L,aZ xy j*PI"ڰT (M Y+jB**t3;1``^PRs_Ñw$d3x[ rNlglGށiNcBx`?軽{ XຯaMW8) ];J%BWULD8sLWUI` J(T1BWbh0K&A *nT'x j>~YQx" <k2w@LO½i-$4TTL: w7 _ĽPoVa]q7ZT,sԗ!l UOp鰽3'i,7høE~sKLe]tmGį$uMf{LD#ڐZ 5]L43]ڹG1k-j;Hޮ [~"76 PvĊdBdI-^Yfci 2_^``!@I \]tܻs_ cj#=W{/u8ПӡYH`%HhPiEw:oE-{x$/muY] B(].&0 RLx& >@1,V"Ek)>?M̀8#mvE+;F@I4> *;_] 솑K7-LkJ/eFk3or 튲 d o``؋:$3Z։,!N!*}\6!1Q]d]#:{wUC9Է>V*zj}Gż mY<#P ṭd +vIrZS]4;!7 #|mKptfTow͵\x~PN|.RI3J0ΌqDJAGcbF#*Wwn m_ȏC|X`pᵏ#h#m @#\ -x̍]''8nU&F/IDeӨti($j#/ 1=5x*pCI%JR֐j9qiuL0x͋)]AQ%I4kUYU?^LzU à-|sRlOx<@7AyO Э@f@-P`pN| \)FJH@BL$I%]m6 GKҁd{HӑCc̰p濁g,H$32P6"'Vvht1SJ VNhjd fs4Hő=1mM6G? } SRR  P|fT%20L#(VꅁP KH"Kl)"fQ"%Bj*5%Øula@l o?tCOakeʠgެ'ބ ;hc_!m)3J$VS-r! @hxS_w!@3 @Zc9:s*_α-xޖr }S j'wil2Y vVאbK~Do+yRɊW07N>ie2;e:j7× 5X47xdi|(Ɲp ([ƻnK(Ǖ7k65n gkx( MpIs D@|YTe A n2O FwTA9 (o xع*6F"l6Ml~a=3y8uk<]l2N(J@Q4?~l R&~+ ̢?-DGLS.1>~01k>Q.}nR!ƿzd ,Ķ}Y&bvhur$ĩIMaCELB2(,J"m$,>(EM ?^HM@Ypjoi_r؅롈d<#d|t&"~9f]!-nZ~G x|^: UH)3DKOPx O[PZEh%߇3׍LrjX [s2fIVʌQ{`(?ڑ9 rKWقlZ!+*KHt! 4""W5Lݾsr怆oBPP&c8/VE|}&^? "iwc0[=D!Q-ECOJM~0 qS"Ry"Ԭ`/S'HUjDJvvmA:uQ}vɡaS0kq r4@ @;   P L*W_?f8i:di6-6XHI@6fIi $0Cj/;2. 6,Tck&2ן qp8/AM *=Lݳkh v} ?29BfqZ6IuD=Fm3;3_2}ݦI=3NgSq{ E]R=7,((w֒;R#~<|EQ=oă$DWr xc8Y )! $@TcicN3^߹L_S;3x/v<=LHL:l5:a\2QH\a6k _?ƀ\dk #U_/}Fa(Iiyjna`1fd_pNkg_x玧TtFqsSEBq!F~?Vz ^!:wkx\ ӄ-Ȕ3<,+P |/_@u)r05i:D>Z Φe;P dUߚ" 0T\$4]%Κ@A>I#$Dy :ϧr"hz눙YRMZiIy?cv߿6Q 8p`yy̙@Q^YDC36ViDCSrO$ty<<g3hw!"e jP2=as_x[PPHATI]Z*THga#aU ;D0R'NA K2cQqLT ǥT $bĕACbi~cpA[QE%J$4=PgcW19_wP4携"IZRS$&J?b҇PGq  r0~ph<2B z Iy,b[% @}'NTa7aS x w1t$9h0d@gs(m%F8'Ca(,BK)(BP /YvvAC\gp&s,MaH uAQb`YeQbIQ1Sz9jfZ ڶgs0L=\V"6K4ƌvI*M4ǴYOrϷ&e Hef )X$!92IvNYmgŗr\t|/SQ=?S`p=' >r!m :-7wht@v)h#*4ّ%>EȂ#1.PomBq\[ hFw_RkD ҺBF;X`ႄPf2 )7!|ex:]LXm!fIY IC#E';0_?Е$$p~0GSiygJ]{?bqm$RE`0l06M$Ёk`F q { "&PR  {HK@ @VtiKWc&| Hkp7V*;w7%'ɽiIA%<[$Tͫ!6A"2fE<XjktN`Ubra 秤 n۪ug;-{B;&pJ! N!*lbs^+ӭe6 ;βr`hg}~,R@2?yk߬ 6.ef ?sMdɑȑ@)QnZO yS)UC#DT7O \1LٶP0W ") $xT.*)SSu+`'XhH)=s\+qHy(*? PZuR F(q,, 1(LaKkN i$zpT¨yx]1eaG|ԝ($>1he,+ +R}tC_\h!wygO@4ܦ+꿇C~e NSwZ':k3d8%q7ϯt:l{{/^^@.uȑ~%m-h&5uL-nO?K]1E9IdНOENǞfyI]Y%hd a9ٲ  #8@^2?mI]sc("\\Xx1]DUh Xģoon$HrI9uJ]TkEEcAU\@]P"| $q{6PK8A5̐MQsl 6ܹA"2Nv1WD4'|bطQ~9-hj!o}:2yG 87  H2kV MRh\o~:KrȵWx:̱9Lw ns>go]W/.+nꀼ$S)NXNh %`o)QR&$_>$/a=_˅TńB SˁH?9=M ]HHpKR͙d /x(& ӛ"DN]" rS.(9DSD@ʒ~;wUru_YE`I&!` ܔ)K4 \Ě#O)M)(tA-O9|Q9L9jfy7XPpgtJsD$T tdtHId!F?GY#OsL `TD.H!{`\D? ^*E+*A7%C 'ksr=ޡ)m9 g#"E';Rc!$dI1(D"F@c̝Òm?|P#  4BD𒀤B x1ՓyDh sNđ톟cP--Ao~=$< (z tà 4A u }aMƊBDe{Q DBdHpH S dBM 9d( GЌ?͛T+!y^J{`k b 3Uz| CRBJL (=mCJmn~acd I@-#&lh*en7.WeZd1#!Lx]}}[4w7W+*]:xvUxxs[{c t/K ł} ~P{N|JN~85G'va2^6M9_C VB#9`sLpO;e'8g Q&.1Eo؄e4_pj WDB8( RYeO2l@}]_[?Un{GWp  xJ鬈!'(OX=f/Ga,Z CVDn%%L(PUz  ( >,+yjnIA@ZEq1AFJ̅nxq:6cJ\97B$XwHZnF~mq/gP,h s}2h *s;-,PDM;5QD$/uRc }ȋbۣ>G.XjҺI Y%4WN!QJi4y{}o-8I<V j7) !6Ћ 1 s1/-y5Fօ>Gv̏NT PNk֬G9bs$n>Xշ >"kP,Rmڥ:Z Qz0'DÔ7SqIObs5{E,t43d ZlϒW͚mM97 -YixzB8(QO'lu\~}-8%`, (xEc@_jg?×;':£3L<ٔlE ڒD!v0k[aSQs%!.__3q}pNÜ>S\+w Fd܉&f뼨 vMuC9Tdz0'^[xE )⼹Z*(:BS`7ݱqf 赚vlc.f"CY `eB&hZ6$4&`CX` P=/==c|_sd=qr_էm/+W}Q L (H!HQh Y!"1F[K ɰ"{Dy9Պhb\0X{wgw²PG qMc^R@3 c{4 & S@c  {[sip qhetZ!Nf] Fus /(F !)d=c.ۢ&$qvd2z:KRt .\I& Ac ̟%kчsH; q%T`^M%|D "bnIB٬F,%4&LP bz:Y*WKzߦ(@vʖHk ZCihD 6,ئ8]9]H40As(C` qOOU*[pK(иMchX YM$DR/JCYGwϠ/cl]_lN\ߔ AhX䚙o.1꥖76'f2>zLu >i˒da&_%`I ۪#UM 3sa V/tX@|-H@M>v (A2U1zp_lFVڵ_n~E;߿W}.'s& ޷}ݠT5.XՆ7{͠ \61$cHS(de W%ۄI:S PA!"?XJM X1YZHH)<Vy bd0%Dd(dP;QrZ!!"+JB H "P6!a'IwبAl \ ad@bQ9v+a p~$1tsš)op8NXTȧ&q:wFi6$b0Y|x\8:y 6x;{ֳ)<]WG3WAhA `sN (X_g u ciCm1 4hM 9@`wU@x̸t֗NjcUQa($; #&Od@#1?儮MSgv8S=Ŧ%c3SΧD5M!=I3u6ψk)KO.P܎i)xo{ILMcݻǙJSA9n5!fj;G]|YbtPsOj>q+W4 Xh\ >Q$[YtLm0G%b. 4`vAz{2f!/&@exl?, g:We?El8:Cc{u.մ(X G^u5 &JnN)26WյU-z @y!6i{.DuC taZ?!'1iij-}{Cr35F*i ,})2$#+;a5 ## (S"p^6(mQhЃZLCN06F .X$Ga(i _!!u +a%& y&HfEeˆBA@숴7)F>o߀DC?7M!jżG6v;}} _~r\@vN' ( 3I$\x@rsJ ,"a.&,O`΂%Zet.Bt ,)l*F)3&A "ÇI$\B1# }QB"!"CuTE4 +(?A#=n$QmĆ1Cp2@~DC81OkЬrN녀JHFևS䬁fי8/2eCi(I5KzM'KD:Zm{S^WyH)o Ii6GhީMjSt7ou6_}ZSB՟65fkG d*UG5O:E{ԙ`}w `ۢB1gw>ΜUBQ/hͷM+ /|OĨ bj2)tPL€=g ݊ҜFwܤd G5r{b윇$#NϣUR򟩐ϼjSvmjBБYfN@1w09JQ2&Ai4a蓺z Kb3F(٫ C",%; %i +K 4""T }cMtBGSdhrHP xPDT .z\݃#(mTƀ F*XpF0 R&A1%̰lL,Sj 0$?2<PXvُUq ~O* ͐ޛmr#$KXOIT EB~fw@A;2"qp V@́rnN!c" !v?Ǒ.lBCe.  a28CH`J!py2PH&BXXa*'qVyK AZBDHFοm7Jf{0Q id $LvK@ i}S|L9_*pԍa4 ˳$2CSn$Pa\9,(PV?5Ր[ I_7=x%ڜUoP&p1$X>1&_G ^)Gx%^5KiV(GHkeɪy*>[. -txEF E@*hproBμVmѐ#F_T](? lSz\GoN?Ou?x^\ƕ?'#-PY5JW ﹋+1(Ws=s4/y;AIw$sƁ*R (PR&%f)3a]Ijơb}'A13Ke] )>T PBHD+d}P~4LvB$VJ!;EzPw,/Uqdm yRs9@zJZ7i9!g2߲G1Ep4*o\b!XAzA0Ux5}r@M6 m 4bb`14iiC&5UTp@U] wD`e2XՊAZELj[t-E/ًs,Ifg$m6-%&lRiB2wX-V̺pȣew4{=tMD @-b$n2C 5L J e?'S( Ft i#)u@$1e2B㔆( 0!hJKp g"ʚgFC0RF1ĔǛC,Ϗ3 *˩HHپk \ACYA!Bs+Q@; X^4XSKO٣ovwNUVæ:>~_fuu\B%h޹~z|#A߳{CMEBQ oGdlUzۯ'x)\'mZaňl}= AѱB„&fRnJ̬Q }Q~+E*M_Ю-9rnN}9xHZ@)Ww̹Zf\V_!wZ.[}co$1D7#>v , Ji%$4Ⱦk*ˀBD}mDGᤌ%@  LIVL%y;2a eI"dPv; ҮaƲgÕTcW "'!0'5g&/Fx}aDtÆj fm n"?{[' 8lGyt.y!yNVIK+T`(b+z_~9T DʺC\ f_2UE+5'WB@uءǸ _4Z;QDɼ S$s?&>K(Цd}\"nEc,A $qLIeN%*BmT2HtL>D߇H@K>ж`b(%E75&F1tn8I@Ni9pn2`6.jZQvF r[emz m I&[Gb5X%BQ+I$" 0bmA+pBt |ϖ2'[L i$Ф/R -/-#H=-lOj7o5Vqokp˝ KψTk4K3g\rus5zjk0!!?G|=G^Nad a$A.X+ _)I*fFP"BLB (mxż.8h&.c:"bŔr'!~굂5xPڣf 6B(2:j(?t<_p '5 (ǪFwmtA4 %p0BhiD  lS_`>SL!¢A.)=Y`=Ɂ,C@nA,Ny~}|v$a%OIDsa,zFSAUng٭| Mi>-Pg4'zAHpv;O$0bTxXDIQr@;@w=>0m43X6mq6,K%^4ɴ00 g`NL3F˚J+$Zk""tIErKTrMםdf.& Ry lS k té wN9ofku}Q`2mXF,>ԄYaJLp,1؎NB"'?-NR6*8KByd DG湸/#H"A $A+K0At/mxq>evט!ϕ3ʌ`BfHiɄ~fJ[w}A2f[#8kauwNXgQ( @@]e:RlyG~=7Ύ#CG/vƈ Q^Y{^۳!'Ĉ”@&0:zsf29CIJ$9?1yDHlPV>uHQm,i Ú'¾ NS+]Ke0>$^g̀O<>毲 5$!ؔ =?0.) Rݍ OcQ XX $ZVs*'G%M.cFaD6&*ꌂ -3t^Z3}F/:l_D=׃j}\5OÌL4f-ѳkX[5N7x3Ȯ<NTqYPE@Fҍ.3&hM:TXcL$uAp{3pTP\ a˓6I^ иv_rAZ,1`hDÔ7!ZָC̡qNW9!Lܗ_nvc&f:` yoIX膼dUv!#Y)C~c1]lߐ"f#RXw`2PttB;I4s "'v;pZpqFɄ`@-.gyuy0Nu4;PYⰮQ-ș;*UrR b0 Jܞ>3q9C?,!"z>w>_ 1 w&r53yF<fB'=p}vW [4lڞBY["kbA*r6ґUY8'L$yB9KʕifL&Uy0\-N{UTJJ  1-'ǫ QrdDd*˘a3$SMTu_ " b^ \ 2,x\0]p69AHڂrլ4 P3t{웨5DcgM/ށP+Ugajn|t Py amҁ!4i!iIu&LdFHEbn'Aء3 8](n%C!8Ir)A`@ᤆ=t?uM+;I 6#h69"8h&Dg4c5<a/vBY,#5 W$erC^Qe-{$2efȖ^E,MN)p$s5 tUmQ` ײcBa ( `4谾CdtIguX+ɸ\6Î@$6sؕ:~j-}MbwЈj$1rʀem- @ Pi@`\)a%h()Dv tǃ'pMmfD HW|_Wz$I#hv@o H|+tI!Q7 "n` ,6zI (BQZaP {+&EC]c~t 0/I ӈZA~|\{ltuG{6.d;_;ؑݿ ZG?^D d?(=MQP \"=ȏ50lVDžEqiθC?eoX|8gh$_Pz8"dqPm5JPF;&sM8I _V&wӻy~axd`Fr)~@ 6'DInunfThv (QD * AؗvL1;#<5|#HT$k+-CS0& [ȼM-t/ aN8;WkG\F]}NqnZI0~\3Oܖ[ε꽢u۾|vYc~t~KPX36ۑg>dH{_2cI PUL:eKB_{sqWHE?7'_*ג[\nsavmfdHRNE"1%TEGy XQȫ; ] m^S_xlnzKoO/g8t:x{FNAP 3c lb7B:2=%*^zctdaBQD; BO;6MNr/ L$9PNj7;E'cw I4δ% k1h&wq?;z6C.. /y$nerQIol곞 \ o}~d*HMϣ)\傤$IC/~r п 'tK55r] z[8"|M-.զ +2f%KjvT˟vGAd (P P;:rZUD.#m.՞yN7_ Sݪup_ٲe]RVJHW1Q:%l,?qC6V C~!$O`Zl(`TRZ+lǍgupnMm/C) !@֑QDƌ<Cv>?& ېuhM  0*PR #N:{N/hT}45+'q/ܧ{~tG^}@5!v3c45)<恹oT+I &.! 9pZ66E}2G"}oީiwsA5D5R9Fք"vuj'*eڰZ$GvlB%|Id0# J ߛnvj/n҅˕[;lH+#N/:+f^h_uAuj`kQP=9<9ME* k]=c+}QF|=VBK\-a|NzӞ,zGpZ9_R)w_?=r}4dFj@ [HS JQ)nFOgxvӄܯpX?13qƀ0XEa`zXGNj[*f1Q+yf9 ~ ̨iD}bWS"vR_ J'D )Ç( _vg3 鸀rK K02Wq=gPͧQU,0860kїJ&ˢ%Q!1nmՌ3 ?Ɇ=FbbVLga g+Ci(E$P%2@1PH)^zG:mwfIooka:ʲFǮ^=0?Ưh]6x`>Rj!H.om! k=Ҩ-͙.0cn(#N? LP` US m%7ڤ˶T*M$6ٷjU< EeQ 7s'I#(uoyrmD> ƒ1.3mo z?`%iӒ?f }`Xgv]>;fD8Xil?9l %Cbb^M, ?~<&RByNݶQo5Qɘ,|gt[l;$4c`0)6-Y0X<f~>D ZS3K_{Koχ0V})\/U[lո5ڜ0zF˱7"< 7Aa+ PHR (XH,AUDQV# YI(1UPIYDQEQUdxci$!.= T @c+C2P'tHB^ aH> ?~0$%]5\@&I41"" QQzI#J7OjH6Ez_F@D͠, &+4z3I4*E"A)lPu<{'0AA?y<3hNxZ}a1T ]Z 䲱>}eoj&9td\}m?)P9,a*~U"V8ZDH~,_Ѻ d9d /_yB^^8 SXڝcohYɇ )#ޜN6,dڷeU*1 %J:-A[~Кx+϶()(_0rz./s(I/_uQE$*H)hfOãMS<<cU2.ҊPOM돬~`XB1?\>u$CP nwʅqP{_:'I'?ia'~^mNzld9/UkzDĔDiZ-> ?juOĩ1yz4[<(3Ƨ f$˰t-0gpkUZ$Cd11cj\kO)2=)SPZ({1Ǧowfhʤ =bqQEUnvi2̒hIcDҕVתoԪ1]0ʂDUl+(" !}%B $%Y$K,bL@DEbY϶؉Z:KF#U62D)mEAVFBڨ T`2*$U]ZI1PXR3d4mj̵Fc(Ŋ@@weCtb" RQc*$QUb,Qd*BRbZQ[AV12R[#h"*Ĉ5 UEV 1r`ϷEO\DNtMkp1LB`=C{iGҜ"ˢ("_~")vo-C ;ѲoѧY<%1'H%0=C'ӳȊD6sRRIM3g}PqtgS5RD-Ы3`0>mr*X>k> ˯ľEL+%IpEk=Hy zG{wu~/a(i1WxɅZ*&AiEӔO qپ`nUmڃ DYb܂6~V3'BW(AC|v,fi}(F~w;glnK E Xj8^qtO2cqgذߪlwO9YAP b 9RZ8vyB$6j,^ fdr*Xj\QGk"v QQTYYW("t4:Ntb*+=8^sYC$e[aZݱnGs7|ee96.:ιN!Ow>\>Im?c7]I>4zkCtrb35L~&*hq d9>]w; )}|GTW}{-K_DO:*Ye~^:=+lT>-ghMw3ʝ զ-Zc8wxkݳgK=f>u,T~@ V;l XUȽ\`Wo/8k]qZG#cΡ>MgaH"aOSkotgyba:I~IAP"5ʂqҳ_biN`( j((}Oa&6BDPxp𞵶V6_fEE _ ɾ+ƲJQ(Fڋ**Xۧu&BȹF,Cu/]]kv_wʞ?_Cg 7S\]Ʈ.ߒ]/v&Ӆ]Hn<ѱw~?Wϡ&>~'\Yc[lHda'?mnUTOWY1S};[SK]>7ۭ(*%Z9mUH=~yţ{ڟ{vq;i`^L^0{i1Wbv%Te#.A?NMY*uf{khZ%ܠUTqx`c'Js0Us:3 94X"(*wϫa9cEP/N]v W \ l?-pm_ϳAə ;>f] 4ɬ(_ǝVj R`&#h&2.YN(>FI 5&jL-D)[%XR[X,ӱ/%"]UN因a8q&rDDƃb̠MDj  Mf@,&iA\m̓FʘIPɅB"̘ɌWJƯL%2hd,$* YcAEQI"$22V@`VA`AH%jHY`@YH AdYR EP ABEY ,bY m\6AЖi(3 aAX7x2h,5 ^ohKd Ep3],`ȷ d)auh98IJOϻH%r-Cpa9(vqX*ѝgWvl块/ʯ/^-] ^R(H$4XZ$FDX$$U PaQ FVBEAa$XLdP`f!Y%PP*XB,RJC$ dAH$ J"C: ,#]f~O"oR9tXl6}Y+6k}\x6a_aY$4̨-hYEWVӺQ"i9ٗY8a6HQeO՗d3[T !H|uܧ(hC Oڟ z&^p6>iGQ {W1osj DLDAS#bÚ3Vŏ,\|Tb"Pp+N4D~Ɠ\O3 Ǭ_n^n(:_(`Ui%P/1p?N?-{ OSw~TؾUA6MֽlE~ωɝxɒ?o>Urs>Q{yG;Ec/t=b2 FJ?7Fg~A~qBח%qI[Vd ڵ;e沣%3l֕%MrJXTa:NcA4R5J&`R6Mlna[ӹcTkD:;Ԏ7$ :n]֯ZZmu:ǒmT)N3TNzEhHTƪ^;'5y,Su6>OUi2m4<޴Er@w_95Sc6^vrT 'jD3Ep}Gpyͷ?i2H 7$d]QDh!jVRE2I\{t7<”Wx/#Y7~'S66i0VSоR‚haQ  3gp@n@8߻Io)Dom1<ʴIt88 pp` 1Opxz$Mj⌹ULȘHȈJ.Dƀl <]xW[Hz8B鶂 l9 )W.1?[:JaL9#" *mN\.R#Tras#f86xFeAS c#MH慒`hA'HU*gh~*;/+&VSGyEz)Wy-ÞiG9?r$-K33Z{so}Qc?C8o<]Zâ-h~`9hN8 @1vJv~0Q;*J%=6wPqe\g ,3ЎV(@*K/w [BX!\f6nv1= 2*vr"I~/XIuDk2լ~czTD~_}F͍ wpDLbޓg?Tw$,cR>D<c#'*5.IOrsw-R? skҦ ʟg,H;Q+U$8WǬ\>d*JKUODzTxR __dACj_<7$. Òui"ڈjyre~)çqW)G=0*)RtmިLδq?%~!Q{7wӛKИm9kbEقK׎c*a;ic,hPG`m| u!r9Pp;pDѧT.#:B`h!=y Hܽfr>S̱d4tb7EGwusBjӮU74T SSH'؞4<@ASkƀ;hqʱхvmԋl蘟#|C91rcv?7.iq&H6N*4Ҕ(!bnYLF-nKvn5o8B@ `n)P2?E(`>t,\BYp޻ĤLL(~9/;"c[mTF? { R XY;dNUfZhMn^VF(Y~1:]悘0F}3 N O5i =,dUv+Y?f)Us* 5b|[gxb#lcᄖ\8H3:<+A~ }F`%X(t7&Ik&#̄'頷4,VIs'KmH$Qtt1oUuE[w,ЕT@Z#. JhhC,$˳`"x˲*u.c'!JvnTXZTx} ,yݸsز?I! A, ?KY8.$G0@!7*V!H=(a8d`\67ѣAX;eyO#|¤WlL<] B[ cl!lQ6M6ʿ~r?TuZ\% s$6qJrC"G**:Ph"##jTm p'-S9^5nOM`&صxq|lA6=GSakrucdBðzAӀ6@ 6t59D2ˤ;RrD 1@~sO"$F `a8Wr&OOXBYt0-.EdW^R !jJFb^DKlɶӦmB"wOOeX 홁&R# 46P^Qi J WmcDYh~MҚ9M*pk (؏ uz0/[d 4 ?v aC0 @A:_L@r1IQfa @̓ +9M4e Wϣ83(iZ11 O}䁏TB@b,J?-T/B*xLzڕdQ޴lr<IX7P"5;f{J*U~4VژwYe?lAi x~ $ |hQ(mIpAniva ޾)mo6_9ɪ"2x M[zeDb !A : ynE6i j&&B[T^c38r[?Pr9a8;vc -':.dA(R%   $T+'sƅ^I`ƃ3Cmѷs$EO*M9MT6`bGJPȟK w"{CB{ Ec2t"ƪy߁dܱ~0D(mjC dM% WURq)fQ(5xo<h@fjD( b\$ E M|1^q}ds|Hzy!s>a`q"u r#uLrr# Imo `obBvD+EǮ`F\/ L9aN$3 |(=D&bA9LN]}\dSo!4[I!Řl nUl9Av:LI{xQ63Nd'p!Gqfu#pMC!BxQGE%HHJ]5^ːs)[M"DG:%!h'Pb#ӟOXQD^p_85T'64Bȶx~Q舒f{UI3Q0 b')GB!iD@eä CClD9 k&嶅M@1qBf1{xҸ{fo K ,zˇފfA߼ö C;:f;6E*[mBIT0z,!д!Fޑ;("^:(Pb7!a[&-2Dy(V de;>q*8?\<_00|]P1 6a%n$#wl{8k%Dj3yu8muv;TK'u*Ŵ  !U 8C7oT 0Pab>lP@KXCyTYBI;H98o6{gmUS;Ǹ`w"o1WNjn9dGYd6Eb2PHˍNWP)[\$m}{'-lvE?ZfRkxkMw"}+(,|tc'$HYPkA^덱M6+e^I"Is]Sxj0Ca5+QՎc!K񛮞nZPdnMՄ 8p ! A[Y~H ~&v*~Đmmw7!:ҋ .dvA KHDS)Yv6蠽UmT8T#3ޝT*h֝`h8P Oi~?ciK| ^/%hSXVs=v$>h/ߦ>uھ׊3p`J"t' `ڔD6 $1P%^ /o_/Jg`]h[|hEtaJ:9>8ZiIK-Y{ծOR3tqe,~6[e$8 fDD p"JY4A V",<2voݡa]B~w_ە`""-u5żq[&x?;1cfmvÍ6Xq73So^n5"5BzYoP>P!A\/U@Ň<Ǒ)"|`9"ȏM$mִzcui椤d-mTj|Ǩ>xOHWᤡ>׎?o![E }WE\HIC^Vmj!vyceqBh`0Ĭ904ʃ t6bl,Xd݊tߌ lOwsUUWR*0@OL=p3Mz_{B2Jrl T XV0!L de1$0˘XyC}& E=#( PT7ʆ0 NHe # ȂH ợx{=@SLc4b&:=Bҏ2*E矧H0}ex=}tgyT @$`)rvI9C)dC9$gI`~% $$"sPU$LCCKLW(4Tge8\r@ԌK6•"'e}0UXaV& >[.M Y0 1H*$ء1h AXA`RwL^09S|.V}`{z0TL dG>o}\Ob"wp~*zH9QΩ:NvPC'|BԍHb @SRHsH g]| IYJ]P,)h%+#v2`ɀ0 8ԚYG@ j",uX)7ppfPRKTay)lt!\&$"'~z\9Ff^dV#pB 1@&M$4`e껩!H*8MMXTLĐ@dZ%AL * mA 2$c/Q{T]@jf\ $4oĈXag+.4 * LIKݳƏ#[@պ"$18w.$#Ht*rr%gV)r$ ngIn5M@Es ٢Ǎ舚.EF\C( gJ`,4cl<%(J [-Kb $+c#IEq11f>E 8IHdBlyg]JPd*! e.G(GIn_v08>9=ftvKʙH8*C}|71 1ctU$T 7=2ӖljhR`1q)(6wh.~ FmhM"BrϹrMHyl ?ZSlK2"{GU:]H%݀rqҬsF'GDN2嚸T'g4J\rҖP$XyOt}"s45 3<]+ajgGyd#W|NP}b e7zL< 'cn)H% 2d 3̢¤ ,&%PQ<2RSi* I"Q Ă!"8².ـ2La)=ӄЄXX$@!L H&AH0O׌Ӗ$ A"U'u+TPGP)p͈`!D|*'c_ox M2zD25Y2 "M|gJ- @0Q>Q{~Ez&'鉁=O->~G>1߰EeaBs|faIĄf2qOZ"YPܩą4ːڵkx @i'8 kBb(J@c7&N V̢*@'Q.;kmrCd$ABb5S94*&PfqgRFDM!b3)Qd,9 مd N/;Cdy,h@/`Si f"X1n.}& Հ,F>p`}3xjPCUKṪ{a0'17G9ۋq#@6<, (P~_ Rtxn3`~YC;0c0u옊DDH I>l;!oY-^ºe IHd )壥Y :MviXM:{vЄMY*Xw^> _K7ګ =%) r7^`/4{H@)򐮝WkW&y[)!$ A!FSԭj/Gl)(i-yCGf*j֢ +qKn @B I/E* XSBE`H(>Tv&C2tDA:;w֠vXϳ2$( ; &@안kAwI038LEd IKsa> cmI3%`#8 % Rڻ=ns6] TR\Aw2dI5[oW(ayLٞtIc!iCH qjI7mZў&[,if6֭2b8&khl&ʼnn,mHj pl2Ѽ$$dB"$ؗcFHD?׶"QEUUQH )UUU _HmsJF(*oeb$"i`Oޝ8H)a])BtBfj I2QO !$#< |iM76ۀ=RRu2ƈèV EXlmI (1R|$"*CpFH` 6?2fˤ2jc"1k6MPF @@H(JKf!R@2C缇y U"H0UXD!(`ВL $ƄI2F 0pj'.\⇇i/,?1JTvD# [Y  f6,HXKHx}%a zv Lpx@C3m2N4A'iz4P&eBh DBz&qy m_pSTm@a- &27d5ą },IJP@^%w$ʒã!|gi~"LA2i [m9"pR!5(($"C&41DE4=!ۓ9;Ĺehkcq!7 /spL5}˪0(ҫdRLQIm0d2eP IC&2d4ĆNLHЬTh6339Ld:2 @j!" TO_x3 zДwlsy{[Jl!>T_ f.s PtU] H;Ҋ{1yNߴk7r ~$1C}0Ltf<40bd BFCDM $W)`RBfu&b".X-ˤHyB M0-K*(1"kؓ2"윅8M牋}fZ+xs,D1/M"|v )n#蚾}Yncٱtt MQN V Mu&c8~B7ZI11>rI$3u#k?SZ翟WUMxH (t ).Sap ƙYq! Ԃ)NIa)D*[)39:u RIT**+.`\<9gjy_~ (zƚ1`T"3)mdȎsln.c 0BBRjPɤ4TI,V4j h#CwzvyHg_h?k'&5 c|tV*B\-+ܱK/CU~5[-@JQ"^[l3Fz8un# [g &oAd-cj7q Yto;f܈!?a<*{ av7?H pL+ z߿x֏lUױ@"Lx|=v|kB Lwj}S ^ `HbKE-l[}-tI9uUUn/ȁfr7~UQqyS(g@0):(_?E(p\nyvP527d{d,Gؚ3=Y̎7 lccdJQm4)%ʒY2Ndزұ2f ̅-eQNRK&I`S(ƙLc97LLK.HI;'3&R1),3L:P[s%u4)߷q?^($Pz;_{'s0!l坉^oz&FS|?A͋ C>IYaCp ~MOw:t){t'2("JdL{_Ȁ1DV@Su( SO1M; C"مv60o"9H=Wpp>%< xpAƧthӰ՜pKG薬Rt*Xo6PIIN x7g=73AS!pP("R|:& tbQf(pD; e TtTY,"9g)[q)G)% ~DH (X(z-9 QTz?Tr_EHX]ٵσAp!+5 -eMDoXq~dFDo8EtaS'xRаD% iY,܌FP;Q(\AN&KvI$`E@TRߟHHIQI0=ktGhX"?ĉ\AX6,E3BZj&Y `ƂʵBiC BM` %jP wh `OGW\{}?2iGo;te 6c#;qp_c n6e;'-T e\]U虉vj,¶VgY DTPGRID!A!$흾=L &P9()re?jT9A;:QC*`聙s44 6 $u4s;6prO_< Φ !@ur q{ /Qِ֛M3!o"C0wn[),P%1( Pd*ja2$Si2 `FBla@HȆA (*0 2bZdFDDL D='j"vͺ N~YɹxV]Uf&Bf c@-XN:0%V =0 ǿ3:?%L"*OҀPJ {cp**[cd2rI2 &HRB,cb'@qD`<@([Y v#}"kW5A(KVp5h~c#ӌQ&L q,E}NoX#VJ,t@C-];Ͳ<=Լ#5II w Rvc8bL ̬ZMY0 ؖ7}Z "~|K1Yd Hk^ζr9Y71=C&%b>fx]Pڻv_oVn詟 c(ss.a\H?N" W i 27%9cr6~hNJ6Ȗym <$dzђ CPEq~d2&&g<}o UWŌ8`ga AM[ccY֛6F Zǎ,!8NyliA]L6Z~@he(|wk.ܧ#"{)Gy:)b{V6?O#cqqWq2(XHzQ6 g[.oef0gQ E`hr aJH(T ː ʨ(L2Ef)X3VCL d0ɑ$)*R.%e"`ưRQ#JDV DedvuV1 5 +.)p<^db PEL$˜= PAXr'~k ٽF9X@!OUf3޸G,|DLE#  Co-k圤"8WNOt ÈnILdLم,p0-_- d @]&m.%[,|6_`)@aƓM pqpejRᙱfbQj'Z񾩻vgMNuM8b4ۑ s?M&A z:(2I:kt3ZdY!D=hѻSbdr9SQ$E4D)(Tr55jˈޣp-%uRn?ӚbDCҷE۪(>_4DtN=#@@ 8"c 7{ IACX.t]L!b_9zn*}kLyc!`X/˅n$4 RH!\ɗ P "nY?& )7^O8!S{cXpc&2P~.ܣyDש8(>s: 751&Fe-%z^XX`YeAC.=0Dȓ$dreiuz]G t@KH\3  66& :U٢XJPYm4eIfZ I v.FTPF( _* Tj֊F- ֘UT-̦yxWr7ã"h972m ]&!FKPF8$ʗtYPh "I"iLPɱCw)D`Rv@-QD@;a Ae6 U Z[67&e#6I6ŐtzH!05`QPB6KXB5%bj,NJDҦ[M2)4[f1CaMi03FT)`,"K_\Qal3|'۠QL;bmBYcnb)Wc t}1k0)5.0YTt8;KCd'H 0E 6dY"n& (<솣ˌxxsPfD4& `1LDVo M:XUe='ܵ^od*YRIUG _+,UWQL DF cW͘Vƻ۲5X bPX_ǒUV_` zFLh#)"{ @ g R@yLU(]?]8&Ux'|31!bd*M3d &6a1O6ug.,M=Q\@ eLܑm/{N`.0=͊K&z6(XlZqz E1FN!7@Cdno id nuP! !>\{V_b1h 3z8e_$e["ɯݳ+ 5l3e)Թ&Bl_ӗ獼F/=3CZN#k'>>~n`>д_x7~2Ka?>2W4fgVLP`RPHʸ* $5l`L2UJP0bC`3ؚGcYD-Tsϵ3Ē}n֜Z=9g$:Ey`661W7M[BH00DGfg `7k$6!DE@y -R4bB.WRi.T)}lyXjC)0P\O`?WO?7(g ~O_srHBUIPDHQ,(QE 6a"~0^xC Ht$;ӽ6~?SEGÛBF(yέC"ͣC 1goOKl7f\Әۘh U "I_X E $I B $0c` 5a^X'HBJZBK! ̫d\3\ȋ"Q0XKtPc+&3J%>C17sf{&A"(D?jό{{s.cJ$!xt"',Jt3"lƪm7̣F$1t`UX-Iӂ" GYLBnBC=dX# %`YRF0ab'wˊ=X-ތdCe=Gp  a:LBd )4&58 [n"hAy㩘CBMH4(mhi4 0Tl)# b'` ЭBTe(TDNz>q);DHJTPDRiD.P| ZՂnˆЍ d)pct̚P"W UTkwHږ*B\1 *wYH8RHiq.UIQEBBU(XL_+$ل&}#UQiHw!<Բ&S')A9RHޖ̘~Z,f\3%Hr@[q.rd5ybYxA=TQTPw xBaٜ=p)s(Lv i˝x|h4ARߞYzpA6`JIyIp{^Sd#2*ZP62tzfOaטjD=G a?㳞!#ӊ|&M1$ a)K6-R S%bt Ok }G gSȯN@s[N`(B&'ofgp}T JQ:85K)v/o]m N;1@b_q_b8DUUUQϳ\PDe0(nXwh%)U 6,AMG85 <"?.%oayְ@of_ ^b$k,&!\,8T:(P`aE\s2TgHB `啕h¡M6a$ ;l6(iXPZM&ɺGSd$ІbZ$!J6 *m]ݷʈ!Y5GS'X@ Cknu_Ǔ%/T.TIJ Ry :a.G>! e0ȡ(H֝FݧW~C!m #z Kh˩)H3&ʣt$FH$ l(`؀Lso")PBJK.eiMVHf0KA.EI-b-I)!-D`V҈1ݕ^5v@VY 8OW= 9&*=>Y='$}̎~  v@fS8?ӡ֓jE6D pm(ʟw{ aQBc?D`6- E *K8<8}eW+ O' URrPo/8{(?[kOᙘ4ѥF4`y1(˄vAw"HH6=h3#=& 92&n42澣{E>3-:m]9öYr! & xEᔩ=r12p,GR_=įAI.pw,Q#G`2'm/-[|l_z lKK?J~b0ŒG8~VR*41HfaȒVHBE%$L 'aH(;r}`%޻2bW)UI1gAu 7_S|H( k1ƥgC3(9RB4 V lAm. w-~b@".q2jMM'e4D )ˑX- L&)$@SBf\ypmV=%iDr1pVC9Z7^~10nv,7[}Ժ3xvx&:I^U38˩jw>>zx@Հ!NH?(4*I٣bZGvfm PC*g:urZs#?|rg7(7Α[o(q;{0&Ux3Vj8!0u #_3ߜo0ޏ05xߣԛ}qPקd W˸}6>J;P Gz͎p?e sE J+s2oVT.XV/(֔زoKȎ\)QST'HMcAW[/^l(h8ة;Qb .a @a;;z|vQexPlpkRh (J>R!@k Pliĸ\{LL)sFPu~ <k(o=j%)K[;PֻknF,Q !A ߰ǺZ8n`AN ZtZuJ2@.e[\U]Vֈtp=n/=|9G/ӑ7Uc9qs"D` ibp0I<ɥJwq `9+RI>c=/g&OzO>|ucϦ3+'LIA=Lb PВWr:jo% 6D{]tF( 9@#߳]y'oF׏>\k4d-u =x4(9{T3{YkARmqL{=`\zg-,rUb#Em΅3%U^vm8քiy Y7=˲4\>y޵-ɒV.vX䨍f#vX{=krK&F^JF"V`Ȗ'PO1z]ezS^^E|v}ƻg@&kUF PGJ묊CD^hucJ^#!UGss灞;x(Pthr Gؼ+؁#\.}"<"LD!㝢I؇Z欢xPĎrc/Gxp1޼N+aRj`K rKLEW}]>\#ʴA^iq|<9pK 0DY֜9ui,g=9n`_e-^TD7kdH8d{ =Y>r]޷deXձuAsD 8 NSuA<wjc8uŵ!-TˆnV(wZ G2پLqge6qȣQ=b" Cq2G)/UQ+rBHeO40ݓrVK|˚:sӋ ߧs7ZJ[*㺿10b֣W>(gyrZ~n#}3WͪиpZ^>UWEMy[\)j6OMPv5"ߣF;%9mB7JQ(tTz;E( ifܝGk 8t"DJ igz}DMΡnh8׋c4O;ҎN Y(1$ lhaBDgʶ^hRA:k'o ״v\.45{xxag*c/@s0 7QjLÊ5r뗚;q6;Qqy[IhQ>%fb<ϴG|9OzgPJi_21l@/mr޷[t~'R o7(MV5L:<˴^3aJиŦ93}0O}{7Qˀ˱oF"g_GEs^dpU6W(o7ǎ㑯6e@SҪt^e-pDq/r@irP_/ qa(:ńz2 Qr渓D\HQ?#kH%r@;^L'p%y]Y L%8@VXhf $lRQZJ2,7yMrCGYDg!F1dc4G"Va,(<0E 2](=ye$j paKr9(,XLR͑\9{T>^Cq7tv-,mwJ- 30JrC0P4Zb cI1Q`@TA@ 393.VG 2cF#HPb#m`E> $-Ht*>Hm z87'62˘K`z@ "T4tC\PdARK,pB(DHZ,`&¥ ^͝,ѠNUTUQc .ei~k4k@KZ.=>׌~exh T]ʢ6?lS0v9 *Ao@ߺZ+_ i5b+sUrۮKxUc)>L!{mKJx!uȝ6;MC:||XKM@+eʿ ɂ ?g'.D"WuȒӪEo\ؘp2& Q&F{ @id0²/g7RK Ze $d@ L BB =dQ| ~Df1"dbyRkOU9tXS5{n;lU$>" ?~~3H䀂FP"(B<|z[An{&X5]23ȑ+n 2* y4!:rȣn Fۚh#D.< rC t:@;7%$(^'J2My-G"#|"< ޢ\M ,mX[c3~Fj@"H!0S!lU!2+k zƟWms@Cs!=~ BB&`h 3lk IC =I}n["a?ą"\njvѠڛdI R0smTɉߧe7ef()Ec"K!bBjpmrDBdАdh}Xk齱lsL2~R\E6Bdž P QPT;֍"Q`$pffcLQ&VUIAꫯ;aK2G|Eg=G;jqjsÔ>i)ad)4^|IY]+I=R ǝ׌bdȫ|{*Bq*"S. sZ]?^|c#'ktBص1KƮCMnngn9֊`s|W -RLс˟3ʎn}D79ȍƯx&$PW}V<0:(wE쏎,38pUB@sgMEy~+;8©߻Rpa}gƖne-){3HMpQ4XSѸ.߭+ u2`>Pv&c[F89Ήw[_:(V \g[<HT8ێِ`1c`U M)˟0(őpT{z󘹒^sc^o眛*G\yGJ),Bp!(yކ _~U34nFXߖjlYQq0v=އO7)i@gmȢH(P55 G@O 6q¤RjHMPi%T&H-'4D+uO[ E:@Lя)m2"M{z*I4h ~7 >!{2R\)[Ed0`@ |2^dCyp*(a nSz=<l5DygoG9,{C "mX$ CLKL7PBT el$jqZcZĤd|wn`wHwQMH 1!<^"Fg50L=3iP Hr )l>Z gڶZ2'١ҋ:^0&  @SdxS?*e뫕ݸ#OF d Q_J8L #"RwD&9sS՞ ? HET+E3"Cb|B9}-[/5$wHYܿ1'vl`F*$8"]t)s_Tq^G;X dUXORY'(ogIxPT̘hBLP=M"1X&қ6ܑd:[ T!cN˕/"죹F*73%@ Lŀip15wQuI[$)}MهvdU;x7UNDXr !@I4*M;NЊt/\#=oCaݩϪa3U5H`Jmn$lx`%#w2&U.oCcn@($2Xŏ]kQELB<<I{4!O}5"C@Jf` H"FTPN?L:@ǐ[;Fa(\Z0}$Ֆ$KX6ÖGQ8j@ssDPiMhvZ #0bIFEA MO$;$4 N AgD\=zӔI9,v̊jDr(]^ӁbslyW̜r \"y<h랯>[E/KMZ8 Z*C4`T I ˰$¦QCH#s^s֒AJ' qc֨ޠyLJQMZ,#s$[hxl9ME>[K}R43v㓶O6Cu*Wˉ7Nf:)Ȑ#{y0f/<ѳNaՓB/”+LA3$8{-+F,Y(@0dic/Uǚ׬G*fꍏ=Hd8#H殈5 Bn"s/emJPދ}n <ҨKwrs6N"^s@7hР3l#t۽S·) A i  1(Fh @kE0;l-AF6b:bLd?T0d+$̪,$p[|GA6 } ! 8{Y9E mhMMQ932oLjzEBK°AcvBs{  z ~ϧ79 Ov/k(oC?&*T*VPXp(K19ƈnq{hiIhugf֮ʯ)Jړn#btc4J v,&Ic3lL`HА LK)$ FNu.wJ%)ID$TD<nHe@^fQ:,/U>Tek(1(re;&aD`#5]%S퓇 O!yʨ/\}_}Kٔ W/yzϞj"i#zPDΏKwPIFetжkE s,ւ_#W^\To*UF1YEGF4;դ~ȘffOuNy(kB(!G62H{,;p\ +A;BF|g,fq9Pvώb?~z+_j5(cz|KG1WHafrP Yزb okhpBپR\uҝB}Bn6Jq:EI#2pMsqQwibǫښwS'C>t{~|ƊQh0(!1-lwS!9`C )OjBb;0e~7|P ŲPS*R;uGo8|l$h'ң{IU`SI^h̀fOGWjb) g}]dujFŸ)"[;Irө܍S[۰1vX@|[/ # 9GR-ӥ=&(- ?q l] 6[Ap)d2Ytvmv@ӓd.`-j3B/zE<H RC[I$5{"I2 $ JÄ,&5 cG3 G$! &W$H\0rַm}򞧷|_?]OD"H!$Фu" |VL>Sm{AV$T I@ bƀFb .؎lB 0e*P  ԇ*Ḃ lF#6 aHX*'/x$ W\?G\ +55auVDdRBRur^VK+tKvN1;ypw߀ s‹ [RlƷ%2c30mel.LURDnZoa2k))hfp0zKw78q;y@Ȳv% ̼8t,ILpw'-4,"F+ΣUO%8*7T)PF1.1XYPX,HX%lE(-KJʀ*`%XKD (4u4Uu EfևsJY\4)<S;K#uy_W@jtȝJQd!ʇo\7>cW$A?֯ ИϺ ̓RImzf~a*n4D#uq8iQ%';_"g"Q4T,ssr&޾٧c=' v `B;ql\m5 ,ԾϪ* t0f*a;Z] t'!~ԻL92z[{?/00/Bǽv2mߝsa91؂]Zl]޽XLP#[ϏLutBw`mI\`Ewu4)iLoB`),!cPbcoBc/k57 CcM "HVY mHSlډ;b5uYR-$$ I\o}茇oU{N?/'=-"-jЭĘl|Ӝvx&;*$Eݗ,f_j~Q#X14 c& ?moӭݚqPOȘ;]b, Mf%9^8bbuP|^b m+\ ^qzZ ,{),6pa~λ@51AvM,7 ?e.!}gGCiƀ^@/qN`ȹ:*/8Oͣ65ܿԊpLik2 NUem(8-,L?R}'ݦCbv+Ge#}*U 'IUJk I]QH_[uf],tXST ˺:Q-XXmꔿgP,X} )^ `0[c/eVEbHUae}p; ` "((|a6QL5T4i!Ӓ 2\ "QOs;*(aT8ْz@qZJ蠐aADVR4@ ,IL@$^&ԇE?Ѝ,ciRYDLcKPv{d 'WTPb+Lj6BWP'IPO%7dP:%1SBHM+7Dv!# W%SJkQ,:a& Yܹ<@yx54(0Q2?/~GCAyOY%j{Bn{"l3Zͼd̎ͷGqEm%4!!j}\ŕ.\`9v#(Õ0ڏC}T~.oӉ7,,.<ٹc֦k{-|3W{j-D XYIg ˝Sib$bOq"T6"333,N' ,mP S3G%@c4d~m#o4kRr/Q:ޅc&Gx,^㙽T) ,h:Wm ّՙTT8:Oy|1a,ѐ %T0ąQcAj x/ONb?4E8( M)fHKLC#؇R7zI :~G\Z{:Hi! 9y{ {oڿQ&GyL~7g_0e~-m~(Q "b4 ̲/ejwnX~' l;“p7\cЀ  E'q0?"_^كV8Pd") ƒA G}/}w_G{KX)^ވaѷJN[`C~3\3H%ycdw?6)mJ8š ~_v;+'[0C=h֌8qbv@"Ru&0\ " oaakfF5$w1\FM J@4BD/7@6d MnPF_%ܔ;>Ŋa%2O:d8W'(R9~TB.kڱ+ fM ΉƆR?}0|>I![>:&ӌ@cm31EB%]!mĚ)l"Um0݁7nӈAd_$$M *0Q .!̸Ga5%QbOhJ;advzDs]Pn8Y:J @6&9 MA Ĉ4 )2A]jɾA& ؐfud9/ 7p!(;mRNP°J ??wOR7g=t ͌q1$&9*1p.؉, m+lppKP$>޼GgJ|қ\NT}Ogf]Z&3H6jh7ѷH: 9@"@} lAqhŏ{^Z`'VA$Q+R VF6U󑵘%Dˈc"# MM#a3͕!He]ȵx{X8rA6YL}Ӝ`LBF9LjLL(ߜ3pȬE&ݔHr:(ٸܽZ)“])= !_0ظ`JkIfi&ƈ`9)AFIBr@: :.'@ˤޔ^KblX߀ "DYuqH@:'i4mdB )P$^@qO>dRe/2dɖnFSa"A,TJt tLuXa"0$H*f كC\2R`A!l@IDJ0$`2D@; Pd TQn]Ohb'4鱑/d@ jxݙ $ ] fP4;&) G*A2@/]x}ܒsXOWn>RHTvX `IO`h6@FM+ hR~$& *aY >=:S:Hi-k #( p97^Myf2R)m5-C <ꇯc6"A辱5 ,+X0U)$ iEE3\/DChӃǯoϐc?G%8Ĩ>8AMsK}'CfHxL5tyĉ!щ/݌TW{0 i{yɷXCOzord"@--̡\yig, b* ۋMX?cc2qMCw+UB*RLTI5$)Xڒrdc37s -(,,#ok ?Q5 =C埒Enwm_KTW.ӽL $ΞmB9Ϫn%C$[#>72vrvw`Q™dad{h:IzaAwQz?kd/7G?ia{Fb~YV>Y2BIM#)O|._đµ41if?9 7͂dzHV6S%2z0GYkW2II֍*((Lm!%pa - R>B $40A$a4j38s]YvaidOuejPXhʉ-(Ln@YDۋ &&Q5S ԋl+"Q""(eaXT,2ˆ#1(hV!Zjm)4&eJ3&1ƛhYh+1 bLe堌PEbĪIDas+5RʡZZP`lXbܹV`DT&TFLjfQ)R"V#D@sWP AFFE;7ѭ`-w~)Lz 6޵o"hM!Z˱@8 `Dq|EV!d #%HPeAB[J2.7E16+cd54J@D)xsM(6_52A)'|A0^eeu) BI(s9^?>-J^xh̀w,(yD2d Q&"A&Pq~8I$э*㐦ITI&f & z᳀k: dF+[[,` RPz&ZU,arLHPTUZ\;C(4Ep0Sg>LEvv<B,V'EPlO<(d;śv666j 1ܫ$a51d=|l,"I BTQb#D$)V@Kmj'!2LwH5ȼ$y<\fӝbދW BwET`E lF{!Q *"R $D2ID#H,1ؔB,PAbYaYRdU(AAbȈDJ(EeI VH((J2TPY'ZaH AdR ( Ad1H*d %CV $@X#)I  E#dED" I6$,1A0_nܦYƘ# x:}ͦ,8FDqD'jpHMQ!@ I" "QXX(YH,GL4{pJ$J*i|-Zʚ ?DUBh P$Ia8բQilEQV*r$Ƴ͆B,shnDŽX2b.j94T&edQcRd-5J{:@!gbE`+Uxj (";b7U@8$f9䣠Vwg5~_Oq??Q9Z~siq!I/ι lok>աPt@g]oc&6CEF?}ր BШA*M1Mt4/;Tz:R Ix 9Uhb`J˃K 4~ڦ -AtliVFkA]Ш 0Tʚ ŪF PV*Y5SrjBt@ ȏ2qL"`Bz2QEFMI@BIi6$![b@M&^1eK]i!*m 1$ , DUMR!a'. YږDTY)@FE0s2zK`CRf"PVE^&gEkDHiI#֎g6qhEn\F,_"gzJ"T!Dt&U )1QF@Y(L+1T؄qHҖ SDx B,-S:2pnanCxv chYP=Y5DS4`M沓3ĵȱiD1m{9 a|h R=Ry3E.#! )ne2-%-x0Iq΅sjفP:p_Շ=N[8!d!{P*kCg÷qziY:Jhň#۵jk/*(BZl_24%H3nw׈88wwP͂ܖ3IæM߭u;!6xV`j@,KN+I[$e :k&hiVA2HAp;9-9U* O v24ȫ2MDFu{ʣz{lCwwa \bDI kBY$r-1(@ |P.1N^> 0` bRוּ@ ޥqF)1H! 1'4  MS/z8Y:WjubWJdI!i`Ҩ,$kDW0*$H,~X؁"HQ @d,H !R6C\>, Y4і"0cYER 0 A$$ l'*(ORxd>5Eڱ DX "/܁`6@6>""xAdwɾ tQVIRxrRC" !E8;;ƁwA/>§PDeT11 n" M3Ap{2ኴ6"oLΕ'qh-Z> "RRR*0SXT $$FD$%AXSl%$ ZX7Z(̥03`Jd;7H8, \b쁰R1&vlBz !!2R)wZI @D}aD*͐"tLO\[@yDM,xFH1vѼ3& 6K0H+ބŠ P"$++!ǐ (L$vng#Vkn{煕00uB2N 'WC=`~'$=g:7,A(,)"$"&a?vL:!!d" 'y?t'k]LM8< C'[@ _rG!CFߙX.+D089{ d;'hO&0@g?OrÐN@D,%d$ |XDIlB:E L̊b8a@dBL# A%HRD#vB) PM,rRlDir9/Fp@گ$q< BwcE4zF-&Tx7,hL| ;P|}{f]׹;3~k!${><ǀᨯ)'l(Z6߁E}=M萛W#׆ &:ޟ힂0nE_ H$鄥'HYa`]WNJ#;p~y+R۞]lRhpݏ>!2 Io4({A/l>A;yj )A.u۞H|7) leYB2: _=ZUCA"L Nnm:)괅Կ}>m6kzaa1gU?fkڡD*"wOYs5[Բx"\)ol㯭}#xWl[= Ȗa!R4]@d"JAxU'*cEx9l&ϧ+-o^sd J{BYkx䕔d=Qo-ր!ְTI÷A)zѦd;y]ޖNfӸ͙3v~&Mp0hXD*lspDҚNdڊTÕ26~ΜS;/VGb# p)f @fAa/@X(!g~b < I(s^HJU d QB Y1b*F@")HdR , H""" ,PY,10X$Y" +,a"`Q2 TL TF ! $DOg 1O7g;oK@PuÍܩ䧢TКHb$`WlyK+-&#SCOpFHvnQS! V6HȄ|R Z'.t`<鰸rNNln9` M a=-"J2(j#O$AdBAp\'YQPӒBF20b_ˤ,Wڰ% A 1 b'BFF2@R (HH"XHAUDE|4>Ru$B #$"a2,ETU(I M5"e%R t>CcIԥ?r$>5=(;DtB 3G Fzx #(H' i{9 1(X=;Q̼3B b20=BV)1 F+@hQbxZ̛NPˁD"*tt`PbC.= s<<Քf`i|0(b a )UX0e b.!\ap;n=W>[D$#+T(P !%XI vs.L-BҐBGx!7ʓBos5*9 `Hpz( @}.y % aZԺfZLcfNH1'$Ec0HA&t#5؋Oj t D2 @cF}AI7~ c.$&RE%[2BR(""y51ъ9XC@zkV$3 AMbq ?94$.ȯZdC,]ze/G3?#!US[q@I7)&c(&lws/KmEVkZ1Hu_|;} \\JJUvnh m AX `!C"xp d͐ E7p<,"# 8lձzX;okV-%ȗRD?Hf[WdZE\MBC@Ю-8b|^c\.x5a0 1 )v $!87dU% ͶPR/i)PγyvL)G֛͈"fc@J ok߃hI6se(~ EFѳZmp SHBbBi!f`LP4tJ'A6,QXtTiE MHx{U0ze6?M B oxi}KgdöEݿ,I=!hl>@X 4%L`si4TNe!+Zu倏H1PDE""E" , JI$QJB8k9I?xp!P1RT҂y5l| vM2,#"$KgB|FnؼڐЖ9NM%%PLi)٥ z8nTr!Zi6z\zI#_=?G/ \]Lɬ yPEP>9`,M$*`fo;IQe!N_sp WP‘v[}Vwmɨ!a3%aքkQM1푧xRM>_]jI\gkhx8+`c8s4mllon(!`mI',6L\$?  LɓE;`so_'{u[KgG`aY,id*mSPF :P 2Vwa)c $&rd91@c !v˅t(JQD6Lzo3a$rULnx֢\xɶ{U?l|qA1C6{ m2Y UO ^H)A]0ש8F 4θui]T1oc!;@!t(^@T1ˈ62D@9>nmIOV5$X`jE9: gP'ӲUI^:&Ĩ9h 95Y ߭ lj.h3 Q3 /nF!u9BOE4H"SvFIo`hI 4 RAryZF`r ^5 .m4@UF(!ػX @0}>_ NmgHChzNHY< 4ˍu&=5z:ywY DWD Sۡ Yʗ'|48;plZyR@X3&PF@Ɋ12B4%m>l]H$"`ȆI*m)!AxEʈ?(0QC T^"J$@\H jez?L;\-[6r$Ժ6sǁ j[:=y|͚9ڢ " aKQ0raF@(܏8{."LEldj-Сe=S>㹵@7̅6IR,X:lRj̬ce[9)ːtT1ڒD-0:jWkWTĵsFMKEihxDS؆%DR`rZBq0@QvHf֌Ѷ*iSV " [dĦ4sF+-*Pv2R9փJm%43*$)(F%JIlK(*Dwd$HbB 'ZP4yB)ˆU{Vi3BŤ.ۡ9D$Ub0dPPHl !Ԓdrジ,rʆXQ l %A ONym ҠĦ} AK[> 4~x8f+Nyeȑ.ф$@/B@@.R ;Ni2귢D<.O!(䰩쐄Ȋ@ x~!HBsm\ DaP P$0zltz##% W_jĈ,@Hb]$d%_ef0vr Gana2. ɅS4iY6m(YQMdGQe-c,c7o`͞;Y@BCvD% 8!f$1,dID1Y) U`0VrgvB0Tg2@щ#Bن7 7JYbaO]kCcAϘ @` fݖdfvK_rE?g1]QV s!??cmI{% A.bCŹ5Ӥuћn9kb05":1 PlU+&aa488~A1)iO/qGex4L'P($8p f8%s[iĠ.=_^.Q"e@мMi@5?7?t*_3X2G城e>"RURd'Ԃm.x`g̨Jc3"Q, w%"ixMCy 3Α}L59tOY=z!yma@"dE0P{)\9NRLNO"@m:{Nl,U8PK8AuuIѹça|b,4`h R\X"y%C$`2e~Ha($/zS1 ߆eZ@ҁ?ͮB FnHB))ԶMq}O >[[Z4 k*)5wY3[t 'ٿvzKZ3]qr14 >XReHB8ly EV Ѥ2 ҔPAZbs4)!؉ T>cw@ٜFv0b[d׏Vv`9c^cGٶ`&BF3)pd*t sX)g.Z@@8JOk $0ԣ}AtPED2Y<`XG?K^x=>T,%EKI4Fː<[Jg1S諔ҁ%9 S2n]Ҏ.zjxv42M'SmRsJmڊ5*.&&[m-Z]("`d "[mՖm-W.8qBƏ\#IJSw3dڋzC+(\{2-;n4ˇo:@9ۃRA9A4!2~ӈmac9dU`$!,,!1:.Zo?8TacSr=D8<΢m1_CJ6?kǖ٢B[SwQSB(B$"EFmQ "2% #"EQTlYDu۪RKTeqm,Q!] iAIbHPM.e1"$DFA ` $@)8D $6'q:( ̋we_+m8lxFaQc_f&)ڈ)я\]E(}@٪Oɬ7CͱnXlIk!݉!zrj4E"L,F )e 8a`4=jhNAt:v猳YFPT[ @5I kq0BIaI 14uleyB(7!T<{?nO~ ȁn|O{` 9>jܡisܼw2k65zXL@IZ)s` hn!:H#=Rgp>۲Ddy\>yA#!ɏ`G|V!덽܏qцB[C<I=EuEKrtțS]\ X7Kim->!ׂ<.k>h 2Z|ҽ>tF Q&'+O)'!Qp(XLa*·͑LJf7T(&Ϲ7HtPLA 8.G2~t#E-+Hx\RX$HE"A!BL(!7 %ˣb\l Z OG&fȹ\ilΆP¨-Ae +7c993;WIp`;J( .ƙ%$w`)f4{c?7ӳ0ҹA6P"᫃a,Y,6&r=azOʉ䌉Pv-(u= {Kp D caMa(i^?@QE + "U Q.d?Y"m EDdPR 2ںH &m2 ˔r%2QHTmrր~RhV̢2,RL 1`ja3,B{csW{rփ9w>[G1pXaG6M2a$b&4{&&&Jq BsbL d|చdG9`Y(J-Z(â"Snp0] lL@FX]n. ڭ s7)M3Gw _,."\0eLmuMj-Cr4BJA12km8jRFM%B%"VEר  LUlCU؊:¬0AM*զKE%nF+DIP`(IBJ2/q2b &Dʋm%Lnӆdp$&!ESPUM T`AQLs hYQjES7Bd5*TT†LiCP H[4%z,BUhݸ0q5NS.$(f(\"h2fEe,یntf (Ӧ)RT4qe% 'eš&ÔiF1L&'c(m]AuF4VM`Ӆ2ov:Qw[SPXrH%XJUaFd 0\c8iW j؍r2neԺ239CxTQ"RB*UUCP*zXihˍ--6J5%Aj D 0Ed2f;8jX,- kuuE"kQQc$(A0_ خ^%{ p*0UqVaj%֬1f6.F3Q=Vɖ`ʉ߻I4` 'p3u*d`11V]cZ kɭ`E2up23UFqT ]acMaqVf-VNu1{R : 3P2 >*Nܐ(-_0qց C eN 41BF@s3k( X(y%mF h2';$ FV|r9}0Dn_JaXT 2aoEC6v$ 4O +"$^x`l=N @}%LD;ivDQC0,@zk}Ųq,}QB fFNj)p/ſti& @ΰ8#1')41!$ H`!o0/#>kz<,T9:eXE4QW3NPXU0I{K^z*i(#T˙ @?7YK1ЉڜP2LnRirs~fKo2:{/1Bbru}s1J3`bd,QtF_Jht 6a3s 2Fe'1C)@&mn|ǔVs1+ Ws0adC-FdeXd!ahuB}ٕ/I.HDÆ.->Iyq300,`kq\c>($#ȢH_M6~ }}kIMAү0=՞OSZihc!"4f2=QhGf :;%x.ޔ =4 |@;t-|#ܭ 'C!݅)h >#R)E@Km"B ₡B !uxN ȥ!YX-02({) ;xLMRnLNభ$Zl^4Q$t[#`٘BQddI$$20 @XAPaŃADBa\v,l)l2aW(I$ J@)^2B *BR 'dCJ$DXQe JsLknr66BV847HiP=) a@# HEU]aP2%@+ D@X(9`('_1X"1AXbIARUeA;I3O' Uik]Bume!6,ĂPr0%t <6>&UqU{jbPxCf󜤩Deܰ DZ O B:APpr*D3!1vFO.ک{gg)Pg *@݀}Q!>{hb0f0NQcjJ1X}:"|{6}| ɢrw/+!iF@@ @ i! 4 BiNz;Sxj:g*Lt!`47 lIB8bJi CЁAAd $=  b0$ DH (*Ca%PXR***,С1I ,jB*I`+" @ 4 0:$h6&O;n /Y:6Xnz`vb&uLQa$h2L4@@pD H0 11k#$q wGI <V-'&H2 TEZ.  0$S]PQUϥw S5P5v{/,:(/YBj<[z1:ȄC`.DRa2BBDb@>NpnpweЀ41dx~"N57?@be! >8lM~\vg1 OcnaZKhCzLm}Oe$j"d̐bRՒV ch )'wp$< N Z=|YNhy:AZ B xbVdByC2F\P?(iWxUăbm1)7C vZPu;[mYf6b -h '~_ rXAjsh16l*IiC Fa 2i# 2Гfo\[Gea6@?l]3_T4 %DhF֩ӧ!5ɠv&hP0SFGX7W.Yg}; v."0"X` R Hv1@XjX\H~R*Rm i,J*0*@YEհ $d9mA%A *K+" aC-5II#)iH#e!Eb)#=Z QcƶVYa0LdAE*EıQJ+$E2+faJ-jQ`7t%ڙ]m LJl+@+% %C(LG*9e Q1IM&BBdF,)PX K%kEEY M 2+-SrQe+$9Đ4$hBTI(QGbbDp& ΂1b$&6"0A(MjIo)So "9M ( P@Y/U r\YY% YRiPH5Qi%LZ0^D$QT NUF"z:pI\>*'4ràSBB(5C}"zXqF9@P Ȅ+#dH2(D*"@ 1INЙ|gFbI6 @›P1 u\ϑ ~l$0)(X&3eA:)}F çm3䈉6%YA{+am[`^خRp|5}:.&ͯX\0XZ=R+H$35L*.oir8vUD~T H r A5 9F)ĥ4Y7O8DRJ˖:8Iѷ~xQ&sk|K87Ÿ\~ڿYzJ10QPjR# hQT/݇Wk :[k*KR&N/$%aI.wpzY?lV͓|pGHq[̮^w?ۙZDvE`-@m!6x8N6ڝ*r#"@Cfp5pR22  \CljL0Z+Ĉ^#?>NhӍ-$&A QD9FYϮFJ=@@5"q+;]0"Abj0R0$.s-$jxZ o؛gd wI)~{t4"=(0΁Νd&ChRIwJP&1 /ol. Qj$4v=C|BR q*W ?1yKWP)7RȄ*(ʑ?tW >:0+ Σg!hKX3=ej:B=$'"DmʗN8k_Gr]HX6 BQInag}Ci9 3O$V=x)ajWHinHLCa3dH,^egv;z/Wc}]Z #cK 칌m &H,!2*X9#`> QƂS :2q B:C2Ux@}Cr*ivջ4j!M6bUvd{&)fCFQ-Rڋ, ¬" !H$|Hcb+a@SHb$| vj7LP!6D0,AӠA 64v0SB*Ȥ6F/ bcIG 1\1<: >Ӄ`?D PPEPX u2!: %'=E4z}>g$x6HZ$mފ9p*!eb1~1ܦhI !4A$ %$ Hnڀ)"y!J$d }6,$? ;!BҞf$ G`P,LL? "PRÑ)I=^D B(tEj XB+X@ətXYY3 ) I4_vuU$O!Y;J`$INU }tdODFJ0!r&["k inb0JM[2d*0a7 CS1_nS t0&)U`,7)+E H\:{|ѝΠ) iI_#b  *+Q$QTN݅7(xĬF%d3 $qH [%td*iHi+cb @QP((H1@Em&  oW]B$X^ƭDP!j[ɉ'D96.KpW(.ul>^xj6 d NԹb/)j 6thd! eFc0aPyVr )ItdH dHdʉHưUb$-j(87+`Rx2!P7Ivlʒ"5.͉,,hx4Y 9! Hl $LfRxHlИ #C ($bZ˲a2XYTa/Y5 τ`]D-XT@&jMs?Jf?bLM=LǼGtE{xIc+0} 9\0gK I8 x1?鳎;RO2NWgAAG6iX!(Is3NDd(DBig&i b$čنRiL;HX%2Hm&CPE'`:)akǨ3;37<T_TT)`# Vc@( @sFE=CDP50usɉ[(-zQdD%(b E AԈQ RŠ %zӭIW .FWH{T1~KȾ !Xzqvh6|ev^P]2lދ3#=2`@#"֟XColF8C@ "/hƋ?xvqƚ"FAD*.)ITtn -E$,JJh87:3`j*@L/ӱ!aBjt"$cP@PK#&N^~]$X"BmhtN|xN<<,J l`4댾-DqnZ=9ϸA8BXY 5-.TRel=NT"D`MadѸ8O\;+ު!*Ҧ*/jGdH兩B[RHc $}OӶЭC]}k0HB {Cf _OI@LܔEgr)n8d}a jO7FCzk{> #HtRnM0 I_.lP.4YR ~X^p, IF\@BL$dc6 BM% !&BВl&ІM 6@E @PR"2\)JDL@5;JA!Bi(g୾p'ݬǑZv.Ox`{PJcgݒ~n峉a~󣏥(ջZR,$iZy%0u蕶U}S>GT.MYҐH M&1)"M1E`9lr&֊"a_~wy~w"9 TLkc8ώ+AIc_ª^Ű^10W-Lַ渒fs25ô`VrKC龊-\ K[}#qc?j} IM9F$9u\L#SFCJt/^djVmQp%pι/N5c>M/b c?p Acr{ĹMwE(xuzKW>338]GG.9EeA8.RP%Ky&-fjc/.?7Ï\iznһ=G)_gɱNcL*gB7G` {{J S,< "7ESD Z壝UZr;ޓ7G33烙3HIB /F~wn9CTd~?3"( Uy%  &"h!@ຬ*0_xKxeyDwfy5&XgUz Gq0N)Jf-@a:a>> & tP.HV=a\^,-D\P2A(Jn)u˳ܻ\Yy$JP^߂I'mH%n@UU)y#ەמ~آ P%4:O $WOm܇ϲMx6v^M]$Ts`DPы003`%Dm+ +JX\,@R7E04P\(#FB 3nS+Tq41- Bdhƒ\>NeU– ; ?lc*8Qba'zv F @ 3)+EkXD+݇aEmBr i 0Ы4I)VS* -6!JLXsު$G+28&G*NPGpH"!!Q,0^XӶ&pHA^3Jaqh,l9F0~3oY!:KPoY4j†\*VIa*4Zc˔}okPŃoh2$9 !B ӤPbJ Eee|0whX`8j$YaU A2k7Cq @'V *ȨxHI <0$NtgEQBI1Ie[) TP B(T0'%bӆ+HdƊWQfQTb~џƙ8X@@|aeU#jX^;h$Huya~HSAQiJc @"m03L&F(e|$m9Dd- E9<a{;KgC`晪hR "}5sc;Sdb|B?y $X`L+V/"I62QN~b&" "ONFoW&!42j\}KQDR XB[@ J*DeI+! BԝQ'!t7YdQ w Hb-A" @  ^69y c(B|D7  *=)RAIԘI,$ChXP9q$ (.G' B| l̃~a6,TVF2 d8fgE8 )dGG҂{i}͝Dz&N&I"Ȱ$|] IX )\1WcL$sv000Lp(Uh!$Ƚ3RRˤI >MP%˝E$RhA+C e $Qg/8fPTEJ頒-t{ n㽏w>/\ݵ =۴vz=]Oxqxw ^EB|n?(mQ .,R"YjGotq+tiGWu{_eY,r9$2y 観q!zF7'B @@` >S^&p퐀(B9dL[{ Cz?,d Cygv@F~8-掎cnQA :9FUSv7 UI$On{ef1  ż,pXuM@I T"'u`s޶T4u2SH ϣ 4u~vHuujsQrcS FF@ ~'![d7`o{*bF k%a0{!s֪~CM쫤~tuEtBjפP( @vN4[Y) 4&[ZDt+5HZ Fȷ  ,`pC! E,dA`0_?vz{r `+KB S5')R42ajw 0 Q_Yp( d"1A({DBJY9U ! 0@INrUdPH2PCQw3V Lʝ6bAfDq+d`ټ 'ovL/T z:Q{R"B"%,eaQNCKkt|.$ F). dRj2Тh2tCXYFLdQ ETlV zfab12m` U&jF!iDUes$TP0U(:*JȂZQjHȇ@V2蚴 a]ۦi%hD-]2J. V %`(IvVvYDS`p"ESzLjTT[Z(-f%,PcʪQ 151fv22,KvARJ`ąTJ%XDl*$)dl遯"M8`4 C JI ,2*fY6Zc݃LĦc42){n7ja2Hbc 0֊&l;w2h؆hH ț_boȒa[,nj&fj@ع<B'c$> 謆6Aeҧ 6ǵ&bCk?ai& eɢ'!h<&\ c%h9nA!n^- &Ɗ""#4L TPZP?! 00`  Ȭ}z$lCcIbroԩE8a0"[2ØcaNwdR=C]>6(#5B3|>@5y A$AaT0@ Fz,!R(ɜ8OK{Vx|Qm#E>Sy< ;W}]Mf׼ -/ f t2..$\G!Med?ۭ v_x l,gV>#}i>@m (~E"I F$4M2AHm6 AV@R@M,/s$>6$qzRkC('qZ \~ߥF2E&7*Ǚ7m{-59RVI$QAW ,3 *aZ kJ7IBMw&2j,"l0ux;|(H(E$$@EgA`Nv7@!)8:$" 7 |3P Y!SՍeu4mAV% Y)rZ,F 8FIђNJt//\U堯$LvdhHOh-+*9[@BEɃ[$D!xnGH:vϸ%`0!]F!55|{_ɄӏahGܒ{#r'"q,EYuw5 z`9=*)բEU3[DbF܊#B )!&a5X`(*.ၼ}6DqJ)ZiL9 w 8A҈:r+˞l(t[*R+A*Bf(HVZJaFB2D$P 1JLJBDk#Ƅ"-&7}z6ff/1I*Ep6D'f_ŻTY: )ZDZaJHNG XΨU20aDMDHP|sm@,wfgL0v`RRF*@4D<81EYA&( a,Մޚ?"؉Su]ϰM& ɔC˜ ai  PXDedX4gr CaӄO?? ENisWt HAe*UFCc3Y9>O p?A{I+$(;0WMH .1BY܅U]D"06&xe8 GMJh(9 'c4@;ijo% A2B$Y0RP1"spE[Fd0 L1Im\$جT̀ۻTA/tzLϏڈB+,lm$%j )895\C~4#BYeX*|t$A \L̛hnpJ+rf}X_'wzg'oA@,A~Ϟ) VFB@(DD0:~|T܇se% MŕaF؊^ grbq?H,H0|o>Y1:IÄ[Wdy Dm; ~n)hgEC@p`rnݳ bbu CcI) aOJ[M%I[@BAKF,ZR`u7fQ ɩLIX1b0 8h6HipaC! # ۟mFZ@r@H* ]~ǿw3I⷟6ID3k=lv?__,wq3Z>"6op9$<d {qrƓ?Ǫ{FN[+խf͆g4TO4$jDM3EʄIFXNztzY\J+ՖߏxI4f&IMB)2,ZH=/;,t!c׶Ƚo[lbAD+ΘHH=Wq37&);{/;^Uv ##=}L:yy+,Vf-ۥi1#nd:` a Ah-]F,PDK~2#'-' poPYe?Mۡiϵk쨗$ NLarz0Ud@Y.eWen[1;rXEaYKE|[<}UuCٿEQp  *HBw@MY!}eFٰ!PNa"9X$Y׻ dp7󉤸59`εg*%1mbF;cp-!A"*IW-=w(ތq`)p3lj;q[G$\ٓ3& (n&H5¤#8ޙJQUoSMAV~Y">DL5S|SGS\'v2KF_("8D{_=E;K ׉MV3*314mRf$p|{ʙCckT~O,E^&xG"W:{u'[ǓݵW>oX(r=a2I'Iy8z-It|tM9X4zU?I+܌pStmrzFC5PLf{LZUQJŶ)JqwD%"X16Rn7jj}%^lA]?tV?}diq3Sxz'e72Q)j48*c*ze$a'RB%#iEu$沢KuJu,~]N򶅰ti,kBmje Lʗ7ra.K2fAS-K$龮`r(TJGv|O~דD0 \ϕypi|$jE:|u^ψO6pds>Q:mqFڙE"%9W}5ZkyVyZMz?Y7*/O5TaH a#yѯfǒ#h l1#GfpCZa;WDT@zA3rJBts!QH{V·_&holHqN,fo]LG:5 HoUKogϣ-GݨK7|[KwOff>)CQ%'VW*zY\'(klBwόs-LHmh7LxHQ"\rJy8Uy <tG_w&L^{}ee 0q#e 1$6&{kI#!AgC 5*4FN-lO 86x> \4}Q!!(\~jUbU 9>/ߒ`Ƃ UEwvS貰؜*=񆈘^\XɅ8) 20M 0BQ i<FwD  l-TrP4 ) $acC 0@9Na $ @b$T/5c'e/p;TV+a(F lzELjkI f{a qP {:W#0m1' CFLw|1Q(-gL_`ű~5\ND%cca3Ĺ̹Nz{"*B˚U[-|5cx c(-@q{z'U}TW;ub[Mf &e1fĜ%kѧZSs˛~{O7sqe@B R@Hk*o3 r5feX[GDNOzOT6'}S w;ak( 0Ao|)0h]=H\5 ,@\X4) 8^pj\СQ7fxi43 Z\i= 2wfPϫR{R.IH0 "sfP ytRFHLCHlId14%*z!Zre@U E*OyK^^;>H+! >@$"9\׽aA;V DwDŽo3]|CP CCX Kz؟EA" yLbaןe9xL!^"3RwchPa#:E/t3)zVc[Ro%l`#{H~3}LI20l0aTi{ -֪5/`*<&r͗d6@T#eC ˻.6(8HT̩ XMB/YDҋQQv&aFY6[FS,FZ-MA{f`\)Qi0fAH$`HіjؖTEE5iA21IP*5q6)W+R*lf`rn'Y΃eгuu[虑 :*U}xK^$@TX N|J,6F c2JU0!Sz͙o62xrQ |ahfƘD$`yΒfaR@P `` g z{đPMJx^8sH `PjxyWfEs6.TR{$$mDlX $X(( 2B١iW75,n7 ȝr!ӗUS S k*󟵠:h{Lyov{4v;Z6MVzy&nI YnBe T)a@37#7hnoxf̆w>Ef b$$ m8O8p#P>B/kJUa1rj_|  .ȀsG'X7Ah Y"C &$AeLd!}hF"76=p ;O z.e|슐"b \NLi<=Fos 3gfH8{$݁S4m54颫Zxxd4ͯ+rR $+Ŗ6mT )#2`B6!O3ӗY'aObOųqJO#6nyO%ٚVCU4sTނbg|HauTAH#Mh<&;k}7?Q쭢"dD R/ˇt 7䪘4H=/hE *Yhk*:@峐OZul#u$&F0,AG _@!ȨP8u^!W"w!&>)b pOpG~W]@#8`7-îR)1E)Ίr'TCTMv 9Q l!!ɱMC a, "pl7甬蠰2R@(+?:7TC䡩 dpzr@Ln{%\3ID6VVXO"E<!vD4n X#P(@Y: WEPx 2- ,X "gYgwDFRq̋(¤mƌ6F2iх CD iQ(ћ2alP+ ;L{ą Y}f"$`Ca\d/Bagu,?//cۡ%QHБ$)5@Ԇ{ ,T4M4kr8Z%Ygԙ qu*mIf3*W!ngI`ƙ*4PґDBǀ5E$NTj'!IHlF71(4͢ՒU *J"" Uك\*KPII $K]W-~wȜfba,۴yE tm2ru`hħ% !=U^aj Y׽y;4d(Ϣ3 Bjq"bpD 113>!J( 4ԙ9ءl{b N Aj◗涓Vʼn$ppņ( 홗3+!ӿ;-"H@H [4B:9M(ZvUQM&_kh9gN#}4AcѯO0,jqe ήr0DĒ8R ]9(D$ɍ"M`=O8'Z()L/-XY-eGyZ$Cd*,DPq+.#A`10]][˞ɸT9G(J{dNȾmsE Ğ\xQ2\ݱho}o< iCt9t-(<33? F eH,U/Y g@sb!fMPcx Ԝ2u 53;3 > 0z)&yd,;%;`\Tt@/|z*g< C퟽??~לqUE1U9SpoNLv3dM4ID*,!߲y4|7`yol$_^ T.93+&𠻆=r8 '}g0 Q W* % dJYHDaO0)JL (́i1#C DJS@H B RgfYMQXu|08=D.d֔M,b,b"! hw}??&,@x(ċ9ߪVHHXm͏d&o6PCL3ē0A`6,<,6Q"%7u4d@hFnϹTyhč)SA!O3;[XL/=0L;0Ls?TCP_y-x9Cw&3q}n~#ߟq/6S= "b$|?-Q{߂sx@̋,Gb8d,(7pem_vNk" 7G/HV~a#vYjOΦ@VwԤXoí*yGb#~q!@.p2uLI^ogTLέI42;==@Y%xHs$je1Vpq8~؍v_N5M&5GzyF?2wR&6 \ Gxvy2n\{L/CN+^={g1q 3O y=9r99Z.8M㘃(= в[㙏ٳB^'ώ8k.| YL RDTo7ӌmC'x\k$ަ;+5eӤ5ָ(j^SQ E. tN^z⶷thstOkٵȎ_&&I)k;zg=ҎW;xgj Xdjŭ횲x5qRZ(^ҀeB{W}]fdжv9ٙnjNbԛ~<\ -Th:^hg ,z_pP$3\ԲAz҉zJ~([w]aެyn2;7l6o5LSPfsڊ/{{[Bʔ?ɫ%^2~]f n~y@K&80ͱ DM +0QqbQ?Wi$o]v# 'jzT{ k gt3'QKk ̢#|qWN.C&4}27)랂"1Ez"ڳT<GpyS \*y\3!HƤqm`UnK-m/Ta(<νbP.񖷺jR#0*60PD(EsD@E8_/Rzrq5!*A#f3dyGN Ohp3(٠*+pD4jFǞj5ף +W,yLj[w7YZrnNdn/6>_S2W8$oe~>ūL$a*P9%)bA2 (zvIC,ecFRIEFв*7.idyE s =TI(^K$ Ł/ȨL/aձFn0iC0qܙW{)7k_zmR`X]3I8Xs)Y,FkIGB[Kl &K\gq+\*JBPC \*,D{kđ: Tg#BB""AF@WS"bY |׵Ko(X)lqDas{_c+#BI9*6^ӧ̃10jxE] o6!,*b l(jXHcUj ) 2J(ȺD.йsD:K"GE 3>-%&!N6a)&G94`F"B4BRp`nf:&u oɪҮLI1 BBN[؂?\A /ɅҦ` U!j B  p3 AvS#r?22N$ `I5ZhSV*:M ^/Ib*H2 :C?XyszXT6mZ$WέdB&{C0Bb\ @X"T)4Oj1Q?&KVJ[m3)m-Ym-jګ[m$-DNZ,[%T*O}U_m{o9} Ζ(ghD&@,zhYw 1ВH%QiX|)$T"EO= "̦T 4b27'/lV  $4+ J2Q QO{AM! n50^SeP>yW*Cb-0mFۡpj[Vj^7؜HYE`'x&al!I`2 J $ 2M/"᭰6jO.uwU`g}AQUPb6d ,٨I #L0 fԧi'ZD]z;0)0|SJV (NL-D ևWx;n<Wo@wܵ*Nbc )ӂ &LvYPjb-a!'=GuA)\q4 &"q.Tc^l˴~7r]M0IWB#h5l OR )rڧ2Y&%arf\0``'PɷQ5tY5&4LP l *I4" X`&ăb`z` hb+P(LI1 !%@ĀOq '󢃤'Dm 5-[AjZ (XBBM0c B(, PE($T0m![YiĀ'i|;mPo2\ebRaL@iAF4`ͩ(nIy$E d83x ph2L20;h1B$4;VIP`j@CL"g0\+x0>[yCV(ޛ.Nkh< E`H^(A@nhQDRX9]Ni'pbA3n'BHv!E5s|:X9PFqYdj,&3 iHd=pЋ iQIoDz.oG) M'VbOxڌ79G`kCcL-MQ3E(5w\,q %ܺgEYM3`W0K ` 0-u8m 3)!L2&ciR4#JpƉMMY̩CkF,|)[e N0cA,Ffj'4(ZxXEXMY m2s t^6eHP퇥nz<$@P Ez #/q.K)3< !)a,0iQ! zR3Jd6-Z@4T9QNW"F$aI2؂0jP ǜFJPHP@e*I{"9UZD F!.ЊhO,<ߞ\D6Ag!ܜ B"UB//@Z* N>C_dtlT ,`nȄk%&qmQq_Z-%jʑ丐uRTc7=fS猚J0HG8(Xfb!  |68vTDF F2C ]/ XX  4 Ql!XdM butΚnZ^){0ny K&Т8'%7= S 9Ci@PZD#  Ӑ'Z+P8K?}jRϒp="%kBXPeѻk9y; JFVT((>ȒPb:)"BI1ސ+&0`%H( GI)*.҂ Zc7ڙQ2Cʂl!vձl|IIpԞ!i`ӶTf7/gG[H}zqe4$pr{bo~Ij9*?j^ D]\9qc@`\\ \J[.;a7}vNf2eQ#d)r_}-Uau{Lf gƾgRρO%cKD `bbB7E_Hr}3_a"): ,> dĬ0.ZmHi ;*2ā9C'PJ }҆* MmP_ifKK?>"\p"L$@[OD4y IsE"}Ҁ* :8@C D~zI&ICSI 6& B` U$1#ʍ!uY& gC`Xa'Q6h;,\4(|aHU4 fm\XY(Pt$m VW!m1C1aA)+Q1^Ek>AIBC"+R'PLt(O46>h'l lZBbH) EvHni+j/P13;1l}w3l녬CaJ RAxҴ0(IblMݓPxCH0 QKWB}O9b p߻&G֏Sr2,r)GQ`AL@ֲ, $%XJ1 zzOh45@GAPp֦PT Aa S䟃åRx b:陻0ALT%KDpbHxI&4DAz TZ"TB82uK;DѠ3 6>Q8Y/$ȮSgaRY!%` ȡ3QEb[D@Z>V$mz4m10IL, dBn hc(x "Wڍbh2=.P$DI| sy̻~-6px8 $Żx{I]W!G3av@ R@uK=#YqE^gT# 0q2e =[Qb4SPF.G=P*^/[CȝTM=a>Y.hR$EGEb3iPi C:UpMD)mPDTL$PTxX3#QI PꇬN ݯ˳\?6ǔ|SбLޡ_Y@6lH! $ &0M!@Ј0&! $h\l6}Nkk\U8hPC3רTe7?ңaim%]CmQHZ#m<8 PdG*g &`E)mP{w kQnur-mǭQYjk+PblqA ҲBkе)j2 T3k $YA[` [u\Q,8b\$Lq)+YU+q2(Bf0gfBZx@ f L8kp_~w7 ms#I_3B9!ݷ(rtˑpj\;ǂIhO  c׆jw?tv \\k)3卶A;$ 6 c(0cj1H4Іi'vt3w_̟kN!`;ڡ|&ʈZk@rU+.N%$Yg'~w }0"D=̚joSn\h w8Dfe"Hj4GUCmBsl.L=rH) 2B'mG-4wCLJw6F,U^bHJ=(x5#j7::1 w` `&:٣ ɵquBu$m OW)jY ^2|qj#E,>&*jɘ˶4Z0IG }1" NJ%u'to4m x?$sN!jzYzٓs `L4lW;9֔5dYYԁ2Dz!SYFI(x幐dnZ-R``"HccHIAH0!GiT R~e)Nn ,L`Ia u( u@)m٦MZ$p ]/rKEQ,PYߵW ]Fa6/Փ"@U2c +x@(&MƓ8wk06oc"YNJ@x`.b B T') _f_322c"d1-?@uyށpQj}p+Q[3NR,& jf6a!`Da;oz)C`!$_-`vË?uETVX8T((р! !$@ہ$QA C f 0Qؠ\XA`&>;\אEO۸[& {vպcK}K=rHLoG. 0.ۿ?ҕjҲv">`tg^ӃYSdu!% .ê7C VRU bbZn{MI9ٙm"0X+þS-ȹžqp $T3N֌ՅjCqDV"H/B70L˄I]SutN ,CAN/,9Is 7q񘜬Fqy'\gxD8#Z;gg ڼ|QҫHL灲"(Rh&4A1$~6$IN4;RH)K`D/BF6y$S 0 +Ɛ=7@#hH;(=ܗѯ@=i`bCp;ْh"&jiDi®0o` f!&!^"Dum *!(CI$ IĒm &Ҁ€P` B Pρ/ 9?;:"ָljD_*fRAǤy\e䞎`O?sU;i >˱*y7[NELnd'w#Z(p ([S̪w-Ky)/A :۵ԂPf3$Jg͍A0Ƅas3l$d`4lIl֛I43ol-HD"{0]^6,;߅|YB?6KYg`-(իKos[AeϬ^0;F|rv ȵ˳/9ܻX4v5> |_e};B[p3lBJr}!@ mS|y v67/J%T,sF_ή}+= N'BCsʺakN{柛'lKPJV Яq2{HC4a *'{OoPsB +†4lo<9/׳4d(D~u`^y")DC MvA6A`e}6q-ͩfMȕdu͟jm wj ÔW'T89" E~a N4MJ$HpL kS_]~(L ۗ߷N炽^aXћ \)RAtgiLK{PTh%I<^} +Z>Rd)JE66lI6~节z]EĖqG$GT36 0ۜxr0UQ9z8Ъx>-~'Ð8Anp:G/7rT|ƽw)ȷ%2dGЊ(Z1Pt] 1q|` H疎 *%Ǫk8X/5UOe8(1fܰy^a}17r$B(THDXOvNZ@v*=Qw`W!8p\E SUarDAL%RV0)P_V??zJ-L%%A3b~e;,5i$H }n O"nxe"3C ~)Y dV"hR52j0aF@J22au%AR!I6gAF$%L+7! "]Qɓ0 `$"0fyE[A818 b'j3 Ʊ)yoZ8nYyoW݌ _aSȬt61.%<V˛pg^t<¾I? |+PRS*kKPdQf'f+|}>xRLr0|,eg@~[2ցՒ&q:z͌!:y^xN\Bpr6c'3b\J_ͩT`jGpi8/DSz9bq6?Pu!s*>I5sj'tn{IV63VyXQg7<hs@1jA;9ᅢCDh [wxĭECp\R9dVĽVK R?yWXZǰ֐*Fگ%o#E JRӢ᧒z(z/ro>a߱DƦXV9Ȗ(I}uDxX Wi1#tK#sm7չsm2 F~0thÊ濃i}SᙜK"{Fgu mo(F/ vDf/J14KlDΚHuLI^PpOz6Ų4_PYP+6C@=[g7a4k+S[oCh|Gkz2A=!, VXQ`~U\I|}XK q t"BӺsn?g'<#LC4̞XHЧkTSOZhVOuQQ'4V|/Jlrli!8$Jbs_o;㿘vGfAu렏>~>SaR׳18?˳ |RhuiSg&V CsC:#|D9.'Is<=sUPK)4-| *%lrsvD}!ܴ#wR=K|mjf]j >øq"J m+_^P~81u1 z>U\AW%E¯~iަfuN5 ^DJPb۱00Le_qa 맸*U~M@9t,mWX 5R嗪7뾣+ :zל&qoRfF9<~ 4Ӓ)sVAr* 9cܛӾ*Z)[ !L5\]e(o쾼rVb+ktMĔD}&f:sRm]78d,ՋMQP9yolڋqmV;IWa.2"(E0hSJ tV>tVR#{Om\5RdQ?&_| uvTzkWh̕8yz(p+-;H}ԳtºERyhԘTmYq]>lT CS{:ޕXy>Ȅ-M8'kEm_x8e?FR73!% x,O$6q7DX ?xir GTu[Ce*Qn6j^ze!I4c#2ҕuDM[+=iaЭ6mP99#F>aS~GQe_s4@J3l9#6DI@J ibUS͚8{C5=D"^/[H"v<;$)NV5~Q$NȲ~V q| 7LZ"HĴzLK#ȪȾE ? b߆{s'̜>E#׿$Q"«3yC&q6TgԪr~^st`pRdϻ!YMhc=曶dF ct-{U T:m鞣]VP9b)Q4C#uuׄToUl4 Ww²꯻@2hXaD@6Mo;S9k\s#9·|TIS7 |%Ԭz$ZdžͿ^YhDa#|~j㈝g,|ZWG=L],lo"ARQlLz~v#fZ(V쇎LKE.!;3p1.5N .r˄]&t[\4|ƙKX>LVHoR ^i|sw%H3;pnh"-+s޲d8s={9 mU04qV?0[?6῎Om^.ZlGb#]1GBM>Yyܒiͩ -O/1abՋqih.ZI_A8gL3:GEA{dg*Zɛ_v8ıx/O KjEc"64OI4x,KZw:^-l"A\yO`;Y&.v26ԞVGfqAœAvyOG8L:$SN;%ࠆ':_a&6=cرBmpqm`aPVZT?2?vxl*I9;YKO[vQ"I/C0{=%^f.:V-=SUN_:U+fwTKK霻AQ]}#66)VFFn*;}ɸGCNխ{=R{LJws}M z>1%s_(y[F=̙ [5; ɏ@C x}So4a>?xI$0 YLKDػn.KJ$qB6tvο;>J-- |UWX/IHMv2&iyΈz8vGWb,<]xN,l>oI4XY;%=r܌YDM|t~/ Psˑ,򔒼 |:k-78y&OyP&vOUz/h82`[0{q=؝gGi$arK~(jR$J)[_-;LWuǩ{yCsjH_([#0qnDTbCdZWZW}?-- ןv;+O#[#zI=pM໵&#F[٦9 F>Q=>NZ`į K;KveطS3?U7}Hc$:BuHs6,p=RB5HEG3#9W9 NMkW-2Y9jwNF55Ki9c2WR׋7.OZ)$) ﺀMԔ.edS' sHmKF1xWfſwKdte9!eR( bir+A#\k <xBv?&vE&"Jy/yD;! {$}-xz"*j.t?j1Ur !n K&7/>N][}'e;==U߈ ӈUQPwO&P&Fnkb[Qz{"hqurۈWw'vi|7hL`e5Gees G(Gx S\MґD  nR/=C),9*XfMHn1pf{cVJե-Y-xXLrD91҃GyD @k{|2Oƫ_g=:t)Jɥ?d엧>FwDǽDEQ1P-@lϔZJ7nI+42JnǧQE)7h'᫱zMZWD &YҨ  (|fc8I q~sRQwkm/Д=^c45|Oz}F0%&-wS ý1:Mdi7=Um7Uoq?A>'i*3#_B,xq#+߬y?3/#?%q00}ҾCCGj=ucil -M>t{(T `4ϲb店/tImF5UEcuQ&%&2#+D@n8i_\BZ嵛4.TWQ*1 RǼҙ[Xe:/g oˇVsX5SH*6m>Z]9 2W,_v 7g-F" 4|8~ؽu0Tϔi+Cb,hFwdw_MHT8]K="BrO孿̷遹ъ؛0i%--ӒSޘL`gtlOoNӕhqr}W_Ο. ,6BT+_eiR!.r$ IG}FW+vo4i54Sh',~ta.`}Ld=h8$v, EOW"KFi\9f{]$xdz+/x<坎]EpNwQ]ٍ.vأu?&oCu>1U>ώ\t*V`Io ~ЩTr=Sզ:%>|l8/Im8a uX׿w&'[/suUTj1Uh* B} V㧿ѭWǮ=s·'ck_e;(Zga&+4h0,]8~[?S|ZdkI ƅ,nɅS8<A iDnßwuEkz.̮)IOAGh,tӻ=ٌƴΫ,S*-QnERHf.KoDhuLol}z9*dzr-2p 6tI@!fH&4nphod)N- "qxO׿ZY@1?T'߬Eq**?~A=dYe۰0})q-H_jӊ9zdvv k8:ŭdD ecж{25 pc/纄z#ϓKz8}(Sw^…7e0TnS~q[Ilw{ iqct@їbNd̪wK&%{rk!7rhj5nAݠ"E=5lNZz#rʛfm~#Hkz8c'^M*%_#~^zQ>ŞG>Sh߈Us~q~玕T:UQ$M!=VJ3l$qܕjmSY3mrij;:zYq 3S7;eųy$T;im39>-$xpWHƿ!zwuNX/q"ŤǏO:Bɤ^$֋TS84gˌў)ܑYGX1:}~t?CҳDrMu!L)M5Wi}%T74!,ggFwsM:[D5DmW$Fr.Hͼxom7v,8h~>d;o| ۂє_[?פoRz߉5_^8&@wGfVSMI5<^6:KKw0>Wyx'5ġ}zMnxIMo0O,m+^cos;q>\E>//?Q7.U䒆Y|hf.ӝ$W9(ES\-_\w]x늰"&=tފf#+Wߧ[;W o)8IRլ.2 %ag]BI񡊯!'ȵ" &yWu\ 9~b~b\E{#B˗'nch2eg QR(MH:R*>X2|T6╤{,dpA'zF%=+o~wHp9)~XUc~tdPگy~L-D ѐ#ġFnb tgQd|=݈cflig:^(J ª8yiU1m),Dӱ##+XĠC(KͯZ9Ȗ ,JhP!iˠf *%(!Dmdž%#0 gFgd@?0_ax|VrfSR2Vh2r{f _omW  ,O9 7 %#kuK$f.Kɴtl ?LL/ K.26',ۮzZ{uD?ܺu"%rFw(#D@(~lб};b=meQ fnI]gxS咼_ezDi@ص;U^X~2% gyuRD;f&5,sױ "VHnM7?vfδk.CYW'^S '5~&i=~22! XCӅhUVcGGhUK*d+I"SlxHXRo47q',X;szVCI@0]mk8@nI!fo Ge)q|Pm?)$R<9Gp1b_*83ƥ&Ayށ1 O[4zp=B+KeoZaU!fN?d48jF,th;13Bw]fzN;XYӡ:dP_1l,ٿ`K׳@'$PR]}F{@zP2$QIGbu L}ê&KG^>ҔFZ.3o"C )E|]oe6H(qc, Szdp; =f9@'|0 טfZox jo|/Sz~CKiwluHy&8Uw}~r~ޒ]fg(Ϙ!X mݙ?}#dX!,H##{x$?Q,30BC@; >iK~H"uf+'p- S Flaۦ,i]r Ѫ bd/KMV4?YR\- fz`ʥp(Em|_jbi`oO5%B^ɛ:q/Jšz^.҈8q~TLZx~rIᜤҤ( pyș2ĩzV}X?)AHo0LmDQybX Di>IkG6èElΫ<&7ϼyRAГd1K:p=%|s/3`+`|XrSG1⼿Ѱ3O|ZñIgIWx*eufu>]1T`cثd6̶R܇s=R smӺºخJ=zwRUӾ(a/ eŀkUؙ~>++YըO^'5S=cbVI qĴވaf*O)^?3q!~j5ӽ(ch>E|oXDPLGzݾѣ?<&BW 웮Ĕ`UIJnVC**vm-w9Os[1# S죗곖̹Oɗ@)[TwIkmf3ǤO䪌POs->)†{# T▍:mGT\[ޜE <7HY|=iAjE-ji_*`V';̒q{ O4gpڢg+4?E$ex&ϡJ34Gz;KqRY}.ahSSa5Kt9yu/h]}B>*>Qۂ>g%?_2R6_ҁ-E(p"p?(\"'?7iQh=]frgt)㧯R/쾯}[؟,C5R:dJ=:ߍͬ;+?ͤJ*ϙxJa[h( "8"bhϊpu*,I U~/LW],l8NguSZ* 5Bov=JR.nA~aXM;H''w}8M?/10r󞷿K2Q֡ X%b]sJlLNB<ֵSZ򓀂W4~G7=wZ]9g'X72e6V5ěIef2Ew%y&_JkrY∧#r>k G3R';V -\͸^W.#<Cd8 .yLcK 43X朔 6çc9q.9/Ks;kM)Wbtq\K0NgE /FzX9XBAڪ1OBbE?KԜ믕rK39%wp,e D=lMt1T܋|(-3. 4#/vG&-SnjL#: B\72s~"7XRFT&&_6w()QJ^<N.nPuP~yy9g+M>tkOM"7 >Xo_m8GZSƛi!f)ï.廓?M[N##P(BRCOk)}8p*wZLJE|xnh$ 8 ,ч CȠL˗!β{R ցP~K[\ij6??V|AU xEFP 5/8o}k8Cb,O^ {,|r"")7N7:\ǑU‹5c6G^lV?ƌWӛFdj,z:j+>ɀkB)OOb|<=AײB0%A̎[Dْ='IͺzK.7%ٛ0gP7sSi,DdAX(;LԟA0ˈwOF5mOԂxޠ2*fl-Sid=,$GS.1B&|I^Cut/򿵌)c0ɥzTPyHNdӮ$}^z3(wzq{ =eŎ~F1LMl?Q6OA騉,4tv1.D|·uKvu]Ҁ7wg-Ji@ E>|Ujޓ4ƗއjL|WQWO9b n-([5]ϑWLΰ|F0_ęRCU ,RD֊gq<LQk^T\1xv Hlmaߐ祭ikUƊ=v.<6]8r7Ga3W)M2=i}jG,G,˭3XkۚﬢujByN$JHvyp4h;S'oOxl4$Vʟ04`B,< `]̊8.5)^AD>^` ͋!u0O I<'Y&L+-,ՕտjS4rv\T_Iʪwr6@W. 8huc"@ӑ6[-d.3h|/awV F y$rs@x|AI5gTÕPM1KEXAV?㬬8Gr'59'/v1L6*rTףY+ \ kJϮ+uBnhyk/q9hT)=t=*rˤkr$ I7ВUK?˶ITAin0iRD-r@,qcfm~f=Ww[vro:^*zDSp= 'SX P'XAfS0Xj{}FHgӶc:W-pQMD(Esǀ}ÓkۃV)55"fk -UVKʜ'ݷ?!^%Gԭb̦irJTGGL0Cb~ȶXj 9 dy:VֶE$)p5oU]y?I8!]ÿafhRՂOzY{By?0fz֎*}de}D~L?u2Vo [/y!~%K*bve&-)jz+I,Js_|Tާ>r*OeЪEU*7Kdzq]Cuqo(|xoCC[S@çz 3÷ŷ-laIVsPT>^z\&4QWER/>LKx,<)^Ʋ&޷6Mxob)Ou>pzI:NߍϷ5lLW|FRN4w&zEh bF{= /݃Ӊ4/^tǥBK%|ܭ f4,4y~jPvL-B# &ϝr'Ȟ 9GA;TA~W'`㢺a1#w) 4沰1^^UTs#3h{9nͬ^S'؏Y-k^.Edq8IYg#JVJ)&ߗy})cnVUl©,~8DW=O~ͳaxLFp怲0&Cm_ғ7CfuMxǝ(,@?Nlzik Ts%ЍƏ&׵+3,,j%v3K=eE19 T t,PJܜF2J?/:%4jI Qa}w:a9s|e#a^@fZ}&yLqyXl]Ar]8Ba՘;Yg 0VL>d_chciV& $C ν0 q>i6 FS`Ͼ{|( fq5xλ zY- B[%@N\O%{?wrl(yĴʖ"PdȈ۟0xi_{{QD8qjLf<6_ m*VK;4/S~{XxŪuyf?*?<"oZg?LI Tr虇.ms>͛<5/$NTs0wkxWRyc_ø?5̞z\‰&ؽg^#3*Ğ3I'f9:nky5PL-ui:LhvI Ò2)m^_rV?]* #~/qYDoP""pȂsʴa,-9^ p`e3N> 0fV./!wm> ڼ׾p15iG|e->ajJmr8r扏쐯D n!tA1a ۤD0e`Պ2CQ "cE*i`:#-GEie1#?YPSNV\8od?TQ6=BS[-9/_r.D>R ]F6wif_;rEO 7XIiG z6@*!BQ)ahiJwT+e<4U{hW"aWZJZɮ\Z4 >zdf&5rWhLYN;@mnr+G6;ߩh֞rKg}̄'g[kgEJ}e}Jc§ʶIkBivi!=rFe>:m-ϲAyYHa/CƗ{F݉ uľBV]SM>d3w_O{Z?\ɴS5E5@Yo{qfM67:+c/ہTk+y)vZ&Jҋ։tZ!(lvW18t]|ۥ>uKP5>^DC"1|֩g4_T "-f M)Z'IA@m&wNvZwe̘ NIu~IPؔjOR"% )hCf485tJAC-3SAk6ӓ #$6q͕B{Ig(fM1|@ ōF"^v}NnQb6Y 9)v%}m8}ǝwJϔ|rϏ%_LEns|>Kd~0])/HYY7 Fn~QoDq̽0 4`ct^ċ`pa3`B 1'ABz\J4}&&)-EL̦AQ{)=B3pD#A8ѡ"I iIFkMl|{+yfmƚ*xm (0?@ ۩ȳ_?x/*"ΑLYh]/,0[ekP jtzTd%Ȥe:ev49مP!n7v6;ZsioZ JumfE|T7e^q;%byq MU0-?M%. 竬,[h4p-8F iO^ƣ< &r6 5g"_#~~ݲþW뽍bhKX7X u~kyfkdQkۥkn*{Չ'r}7y_XL+tvr*e?m$! czPT|:ʡSD +0\=ՊWS\[ {fÐ﮽R?/aT]-_>V|/U BlkPҪtR7~E3_J9g\w҇te^ɜk;aG"Y6r -$#B>';G&$5~I"?U%eP^B&?v<bYP4 =d)י4#}w/؞zv32O`#4-빮1,<*Ֆ fڿ͖K̙Uٿ3$XF/w,'p,ZOhFghy)=88RN<]U^:iC )4֜1WJ|^ .6ɛ 1Nl_|NQ_fY"{OJ%?C.lDV;EBC1: MA4S_Ro&|[xK7ԛ[TPų:4|y#(Ig#$(;')SJ^׭p ̱N741=9=j$O=~X m.Q}sXă|o O=_׸s-VoPH rOwyKOKa^Oސ^k'晴vL@nIZHX75naQ)D$p 'oC|ޠ4 -dteM!^&:LJ!&AYjlHxj8RP*e:|b5R\""]| n ߼/EAB_&<)ы7dĒ%`7Ŧ̠T}쀓\8"k7.Xznos7oݷ9ZWƹ- Cd22qZK?2?"8HDfC:_sw&sXn*)8K#"gȊaw wTcu5<}K kp 8^LGh-=H"<5cMcA l.W Z |W)~:>lnoEU*~x")7s:e]*XxECo2ơw(v&2D#" ž$4t] Pvq G#eI>wUG{ 5roړ'BeEX#_{#UN{\7(F!a!B)?π7#Z&`mP*஧_] 2؈OЈG0nJgjXǝȀ%.EcK8Kž#^Gl!^@N&FaP&I3X_aN:wlbwS~;i}:>6WC g|xT=Otr_'j1FX4oJёuT|1}_;zc4v5_>V7Sd?>o*Nn6CvbRKaD{|3K=~Át/sq۪DިB2#cj׼-귋S~/[Wq|Te˄(̞ mj3֍Fɐ~ hU5d ~6Gzcm ǫ7"H}5MuH!SH;bi*s=3/GQտ{EZ?ͪ$^ݼ9W_ f0Ɨ^mtzG%ӛ9 u'*[MlS&_f[]_)oZjv04&$J)bBSkuvmYm%lh:|YKXȭa^o}ik>_Lq6<:@NXj&=oך2,A>FYj`2/ 徊5xz\ >>PD2U&;;Ʌ%F!m)+a OA'gҭ{jFҾU :ScҦ!qɊKɻ!T?% Ë PȐO 3tկ9D~u3cyydfBu`iT٩/֐CPKķq %vI} ϷzfbNM0waETpS|!~ e#*yHT}KÒ$ʻ|^ivZ%ӊRYdz"bv߂aR:d9SpvP{*)ԫspw&m7:xPY^ Rq铄<#0kejss{2"xJv!08HEŜ!(ξ^S^$fQD7Nx\[f:>lHyNѧ9PGs˨ɻ<Ꟍc_\[>I^ߙŀRS_e(b+D׺XZzhY7k(;0,ǶdJob?t $o+?鹫~JS9Wa(>gR ˻M_QwMR,QnU?VkڑD+fB\NnlL!-2`3mnE9aBsND @Oˢ|;~1ܶ|ꗝmGZ?Pb3CAK>e'eBb=Y-{ą/kr~<$D'"8GMR_@e"L &^_)YHWT=,K067>#¦ qr|530Qʵ%%3{m1lZnl`#'UѮ$4ƜZ/QGijIm&󫷩(NˢHrERoZIk)t]'5x VK:XYEƜRP^{KY@#swgUg˥s3k./ ϿT]f9Q@>3)G2D:޴]r*|nכUZydQw{WT$1caxX4y;d/$1y W%2Z^eRAH|V0:lXF:v+xS pC<TbP eJ2ѥQ)d8'-ۢEkoLrHFүJ{9 F_|VE8}i%}碨% Nyp=5 vq۔ m{TQ_%yeVҡf[;]bu~F$Zqft'Qs!qTv'ֈ1{؂}aզbnb`S6xmTy#2QOrp}+HW Lcz3ih/ -Im+3 x57_fG¿'e˨vA,Rڥ<3NZj+"C&U=U‹mv:RW\RK!~ *:pVc|Vw?Rۛq9IW K 7O]|݅n%>!bRoR"^ZtUy 胵Trd^pʕ`gke66s.Gȟ{e8eFߜRɧw\؍LP,o,E}O;4%%+7WÆxFOpQ8A ւqj}"h&sm룳ꨲZJb{.JHxzM[o_M WKi+긚{ۘ79 x<~ S;>BxiZL~4[I%1ě#+ ׾sxhn/)HcsK}M^5IʛddxX^cj9qBțeǚ ѯL!uAI}/9?^_`e6rRܞ v)OW% hǡW(-+|~xAm}sxH;:y Pk"Ds" &#|B:kHյl> p/h;u *`aD^? <ԑduۨCN$emp*B˟_j2*mqV)[=9DK*ߜ#w($4Eiz氓xbwS[N$5(_:ZvdUu9_ǜd[&Rӥ:bxkŶDy}e:;GMuO %^Mxܪ W9?pt ֚p+(?چ7K'LIJ`k:kz3_eR+W;<"{Uڿ_I;/a"?CK=d<{ -J'듿@[ 蒴/ ꓨh[}X;L$z΅Ǔ%wi{)*kCT "⮓˜Q̹T5X콓ixBZ.ptz-r=*}oarY `8yW3+PØ/$Yպ0q$Օ.2,_=YQŹtL-Llcy]HLc@N;:g+}8H~ ȵ.SS?bEݜ"oq&|-mk]eݬdrDQ/Ell%g^9*l:cI~IHG%ĻWo"R٤qeeu|O]hy48rP[*X{NlnjvR%ϙ]KϱTٍ_ABCaī(۟L<*?M(0^u I` 8;”t'\Ah"Mk.b]?Dhzou/qBC"VoQۺ}*U44]Y=[]DHR[͑&m+^?t 3+mUn`W +FC霌j&S 8vY^ctekfEc&}I? &`hZC6*c 3n|)=kg]V{,rk*kЩoP-K4|bD]s{ɵ]>cg Iչ.ov :˧Isrpa8Fm]%XשcU[OLB 3ԱAPPq2w1ъ"ӍzČfc>qve{́۲hlQ{.Q%Z@T0Q'St+e=嚋{ry!|2e.Z$vs3Mdi5e,ii,Rlٝr(=z`tYho+䝨ryW$F^Ku#uuagEXl?Z0w+]vY5]njW7ъ!4p;k~%ت'Idmk'ډa@iomRl(<|1Acw3qr5EhoE7"6+=%m\Rf 9e׼~+_käМOZbqνJ$ױޜ+n^˰e VGt bQzIx,#X r;֞ W$e%adݕ2\k9{!>:mz0f^̊Dr"$ rPsE䋸<Vm<0KޠyrUZ.Redd^̇\" <ܸM}`4ԩ:s(:o K[J)lFBpíKݾAr5i.rE71hH4_\S W42r@2=S٥I{YcVᑆɉ2MmJutz}z٤[lm\/MUCOw_cdE6i\Of;j`ϏoooB& i HGE)r`eSi'j -v7_'ѾnɂܽYf9/D߸%2o:jO2{[+,LP<뗪؟CoLXޥONیQg9/gk?|N#-J')^4("(%[9%d_&!(sd~#F-!R367Zq,;Ѭb}%ctabOûtwsbBE6Lb03HOxt@#"LG5ۑʤH"3m Co|D9 \ss-d4>|p~L/,?ak00{KI X}HS&+Gr״\N/nFd_g^q1gّDOU C!}RךH)3b)~?Da/q.6HMVHO>s%N`\五QJ hmmhZ#o^H{g`iD(O)GyeC~4a3zC9g4S\œЄ ~WdCht@N,EŞS&ԢBUЅ!{.;->ޡe'^YUI]xE{G=20Ԕ*qE* hO~}w7%h[9Ji3ZӐ}Ã!3<1*,:唊KE3J-{sh$)#Ff]>l]FB\b) rvo4I/`F?MvwHaΓ)lfg@nx# @dclZ:[4W0)P~\Fǎxɢb:o&?)\uyIۖѠdEHHkc,}FPm_/$I4^oU)_B<3W뒮T)EJA>" ?&]>m($6(PQ9_aڢe/Yk Ũ%9z5_]?=s'0 _SĂfM0E(cD*W*뙝6xa޼k2Bq_Y_ETwg% cZԢـdw %E6/2 F#Ź$l4d28jFY˖7U-ݜDcBat.o$Gg-W$m szKIw`i5zâ? oAgW\@#ah#u:Č50;W Ԅ/hdé)/ oIg֏rq[ ]LR``8l=F@n.[nJ_"IiSI -G*/3_wb{!t/׍,R\Dk',;;CPQS.ulEBwr!g6vܕ dzR~;#O?&n!mcqXz6rW{Nн dhvdm.i0&j(k?gE _0XSW 쉰ך YAz64b~ WB8cGn$7,=wtvr ܆{GEerv}pa4E<@0LhL/+TIZQYB~;7NܣޅWZՅkG'l+4_s^)/<?ξN?]6MIҒ*\v4z`fԧ˹SQc9 {9Un+/_y7~ZM@#KVM(r X'8KlFzk6<" E%_tmjY9r>LfݔSU_g%lSM#7[rv%;{Ip^>k38hTBf6+S6 T} ۬EGyA[c3>OY qoTߩ#ArJqܦeKƴMHT?X18zZn(ӽzs\BټzFc2J.\}}g{^y)ݺsAխ]*\( zS= *o}uWϵ@Q vZm{:"Ѷ(wwGϾMݮsLm}.ު{[݂eε(3KkowC苊T/FZzp^7e;=o {{-mlPa})b_vnFs>qMUB}>]Q]Su,}htutb{/o@d =*R 7ǻOu{E۠PPI5HCRiT"v_Gvљz)gy lDB`UI#E}:`x!RO`|Z秮o{}=smo+ϝ[땨ΘmnndܭΆu}z˰ ZrwVxizӏh9 hJo7c7srWGv'z (z@i@x{z۾ϯG}=yhgsB J⦆zmo}w#Gy}w;cw^WקCt\VcTt]aUBR}':TT{8vaJ մ((*TZ];@@O'}Wlݮ uf{W7e'<}K}Ss}'vvު=ۗc]7{hv|swn6׹om^ByHm\.iu{iwow˼X9ko ]TG}kkm{mr|'*e Xx{={gn[}k>zzw[5A1ö\vԵPs}T›qwۗ/>21}}\}]u6nsyuۧ<5gwS>y}lf]>] z{mxmN}}۸v#owYh^s}t}{s{wzMgs{}o]5.;7نyl2y&vgvG@W}nw>ϲs;wlX]ε<{v7{{w]jC{jd@>|:-{s3lm[>}DWmfϾ1޻/t_<{ӝ^nRhm#=6^jv޷wv9թY{ǑKG{3[^dCwwkھglV!-4cvvh6(v>=k/^xCA{Qvݰk:x ӭݹݷ-PtɵnǗ=v{Ǽ׺ݩzuo']\iP;={owkU{{%x§oJn:*m^},Cً;[{t<];m;ol^^wGMa΀->o-tp [gv|{Ku@mMܭL'XS_n{vn>=sz^y3c٫";:lmRrwi}5MfwXURMwVݻfz@r7]Vlݤel; ɱÞ74{`r{7u}5x9/h]]/;wNyu]{ݺu뎳x{N_^R\6\m{l :>^C@ BFTpٚucCvy2nzqeoQϒ/u{vw}p^(]ZC6+= e7q׳h;s*W=Zu֔- ֩o5^D4dhh@CLL(d~2Ph%4! LM iLOP=OSz<lVpƓ4f%ACC&6)CnA+ t S%zo}PA;GraE'bbrxO<;;əLL-8DAI5P`E(26%5U F8h DKRa@.SDd.HN[EX!k hK7m`ɶ\&-`3%`&&`2R[ EDU`[J4),##A\X3:b2IQdչvRќ1T8 `1RAJ19*)0hR.6݃uNF!Ha Z6a*,bR3A(7jLj2Ub **a1D4R\6d ImhP"R RTQй RQ+m[d.lRK!V4\ "V \)a[sUmŌ$vɣi11$hKk*)([)k5,‰!R6kn ,KIB&0@:4r""uZrB,:ZƜv,Ķm>k޺zM`jTAG2JгRZ| Gɛ?|3h|ʃ>(hv JMij,Ԇ:D~Bx!+_;OmJ&Rv@}ydm*zu҄AFvd/P4ވ32*j`ܼl[E. O?E3W5F /+'a Ѻ&QC@ylfdcm#$ޗJر]/ )}i ӼSPm]6$EUtՋNlӨOp{:Ai,h1 OӬCC a'H`5JQ#Hca1"L #RpNSS"56km^naL40sBS84,KrȚI![3H88B8ؙ"lfJ68&-ٽx rHm $eGWhsK 38C]| FcDRPﮏqЈW4\xcR€9R E$ 7 8l'Q:H0mAfqF2d(0E(!R#?%l5:)Șɯ444,ӒÇr-vJLR,pXA@찱b` Cowj}Ҫr9Fy fQ ܳ*(} We5Q5C2u'oܾ+pUwlɃh٥>0 (]7o]s(oS';V2WKŀC1R|[9;[liOyU#3#}2nawׯ eG\xAu Yń9H vs-Uڝm7O'0qY<>L“TT(DAƫq2ϺBYfp'} WvsHfS^Lh Ƌy)<$#`!狝Hojf}YPhh-`{`VNR_T;4p pA'_#MA٠|"Y .c^Ȉ2jHKoAOG@[YF*rlSy eeHW+XڋS3Ϗ]a<NHX: ':`lה,zpzQ-n(v~. 1T/NtjORu+O>gWv9݈|Oj7z\e.?ŤiՁb~؞N%F,WUf&L į9$\{S6+B*5vbvD' 9j5£feX>"k="D\:2k@yIJT-GocQJ4ϛN^G6ɷF%{ d7mVlc#-UȬ& Z!*"p%-'S #K k-!ɇѼeW6NJi Dg6CKݻ!FY{o|}uGshۋ&55!gIt'jg>:5yk&R-ypv*)#JˬU|~R+*=?UwO]]K* m%uZ3u|\rtl0]wZ]7A}u'׶{LstYӏDqg-܆HGL(r Jp脈 wb얬m>DmA&>ou8q`Ђ?6ȼta\u%ٟvJfX0>/<ݽSU`gyzLrQW PL 2蚺^ߞV&Z%&FVh.3FepDYcWĤHnM~9BYwkn{HF| +!=jhN\O3I>0[쮲(;4Xqks?ŇÇ.E- PO_o`Y̽I X㒱ѧuw Wwngvd5ι+SD2h5Ó7'rpc,> JRicO9QE7BR]TvN/l]Rտ"-Kiʌ߳V CG$LኀGrm7zBQ"A*1i.ʭ6sF>*ʼA#@ֵ Rƒ46 \'d[ppBs]<[2m% &ǏGfx$-LcZsZ gyOɮ9vP_?!QP0{FjqtKI^|YS]>?_\5C Q`ͥdqu"XS 'Ĭ$qٳ2LM PkFP3yZheoooj,E;= k wBl446w}]]K`y :}G /{ſD?#P,99#wp̓[ڝdj:[E~l W~^]5y1" Ҩu\W!\PȒ=7Fѵ8Sq !YwTA4هa3 t5KH" EvիVαfo5~_a8h\;/ݬr՛FN׻@ow7/4^R7(ql²p%aWNMD31oNgd|n'η=QJjWmN{ujһQ~k&A:PZ\ 6?u?Mv-GFkOϛBZ%ф42-h^vi޲{ Dy0B_@q2]_,y*52u@vqճ-׼`C5hI΁ZMsNmÐjnރ]~6!w6܄O;4p~#GЕmi{B[%VKvqGco2huSa|QAXMשal6;*2s[xoW0ÕYK7?qZW䟯3_Mi# ϸq:9l8ȌDaβ=X{(yp paL߉K`=tZfrOxzDY@︀Gw>t]y+#(y%P#_V?:Ld8.3,Mp<]1(_VX0u$t˱\z*hWZ8\kbug3S)k*K wIޖkUG^H2Qa8@.eQ`$צZ11'"GOTZv#GGd یkcLN16T!^~j c>]hFMw:H@a^[rVfUPӒNDZbB5CDͩeLv%b3T)(/+Uzg]q߲ZLE-a+^o=aR:ۋn"b'U:.'q* K4流|d&Hy!rdCM=Ũwc &5.Q%Bq=o9|}Jx1'M*ps[cJZdX/8<#Oˆ={Į8HJ)(D ?%k t"DfJS =)~À^L0sA6R =˝ZWM@NAyû:zȖ T3ۏ5g7WFoĘSͰ›q;aU@X fڌ +xպw:/=[Iθ@ۻf'ښQx픛G.ct@4Rx(@gaLoVN&njȇ8]$$a8۵2ݫDZYlF`T5YO)r M»[4zU9Aqf4K32AcJpخP35@iH0[U]0+JDE$ܾx"A;!7! =95dh+"}Gv^QAB*|7G$YY8$ UoC(ˊ-nL|-Q*zs^ҕ)U 2>hMO"hÒ86ʪ|^1, 2EGn FizfULk63ɦp1~\l,E4~</+Vyhb,ΰ䝅{~sׯ(M>On%.yqd;{IN5VLYRc0hw:!ƒno1Ab+!xۄ w\7섮8E2#]vx^3ץUx[v)F[\m0q|8Ǐ뎺ňG}9"srY9믜ݶX$!=&)G4 6ɽ"W%qjtVΈX3N|bO=~ }NRw;|iYfOX1 E5<CTnӬţä3+mW34R;Vei{SEg 9_͙vcF^sX3RiĬQtF/9EۯP#HZ}fZU9PbA6@}iӥhû'w8 8\CYOXL;Yz­L T8i%`Fbq19 $wV ֟`.7!l[-M,zÐr!-^892#X()Gȁic&.%!qk؟(>w&Fx׎~ ̏0`2j/& '.8ya*,be1@LIkcyNt-LYYdmb3Ui/2]FӚCWъC-,9 P`]&vc 7S=Bsq`R|BusDMgY!x_m8[Tw7 ek'fi85=.~9dM]n;Y#lF*KA&'5Fl_$G\u^GoOqV?M c*َ z{'"l(sk{rJT$AQD>-ON1^q#QH,chҲR})+LaTd Dт)*Rڳcz-;1M|~^VYVLZ̷1Yl,á?sTY\A糳>yy渾&lniXUVEK@e6Iqf;ͻFEL?.xLJ1c ɑXb*.&rt7vlUT4HHn1,wϳ|BU Fsi[2 U1X`>ߡlgp;|iTL&q[) g~nhS,왺Kr>WχvCR4W<WOalChJID#OP ȑJ4:GoqvΛGp6GkcTi'|Ћ01L u g1 `s6,?j:I jg6)>l Ydp2|W$dD!?)68,2 foZ{lVɉk<[G($pWʽ6qh7zcڟ1LK^O=F>v|Isye܁K'<滏Y&))_/.ì¬)gr6Gw8l@5 iO?R50ϖj6QpnN@}ō]Ds'+$Y.޲btxUi2PqbHQ<EQ5~2g9x}Ton.i ӃIeQyK/BB(`3a!PIcY\\6#0׆FY`\i`rz޲VgT P{Ia$y18j\giPQ@/4[*B4u jTɝ 8t$߰'.1 T OϤ P<;1%DULʔ"[x^1i~{-޶=`vzayW=+Є}>~sp%bo)#]CoZ)ht9hSz}\yaP 556> =j Z0EX&JKLUUH(R@,FFPBEd]p٨/`/4Ņ%e\ֺ}P9Xn`L!uq(G YW *=@PD'"4H}2aʃ(v~6qNGTaY N|%qLwӺpwk;[~*񱃬B#=?rf?Pq2Yb&eUv~ldυhc#II{{Lt,HvBI{|o]6|Dч';gH/B6q޵!Jܯ*hG&$][V STSO#YL"t˼o_Y' s&g=NalgﯾAkX]ߞgHKn.o v(ז_:^l$!K9 y_Oa x[e&hBpxPɃa{lȧl2 G; z^PM&mnIxF/WF &ݒ R42<>68mP@b<ڪNY%Zj[ dw핅iVM'C FeGeM ?z-{=$wOL}uWT5뒽saan$H/=vVGӱ< nlUsjz%W]*' iœU>[))aA-'y"V*?c+lr+ w6~o cmoUF>ͤ36:W9A5M/ XPl!$#ymaT[h^论؋]`x6ж}T)EŸ["+$gvgSO@o)cVt\wV1zJWrU×o?ʍ=̳/>fD'-矏{|M/r"12f<QThɎ]`i'19cvԾ3VOQ` ރ H73(cX @]/2a-_ )JR$iD4GϢs]_d5Hꌧx ^pC";hLsqu 0 Y ٕC!!مq$qIT9)]!'EAqb70 L0@x X7|/joEܯɪ4Vwmm#vprn!u!Vu)g[{6 ^_fӻF]Ha@ "+)糋Ƭy/T+!˜)e3ɨI,a>fӢ;. E۷~VUjmu;/\CXگ[3LߍpկRaT`' "8CӘ][x@i6k?fֈfh!8mU|zƯЛ1}N4Hok| }2K-ȵ]1bknhD[{Q>z!anb*:{tGg%]x/=B#up|9!27wRdtIJ'DcP0F`! &c8D>k+r}>'_:STD?̽SA߶S|?f217SS {j~R'{_v:DQ@D?~xr$X;ezuScJLRRWXĭ)RV*=l0i>~U"BIrZKU~xx=:hMT.VP$ g!CT.7] (AA1?9 !0PAAQKuZV3ɀ |Qbnj%EUUV" 5%i(Қc IK hdJ@ֱ sd$AȗdU Tʊ"**T/=?_,xnl>2..8\ZJhU\h$,9 1ƔBa8&)R703KhR*% S֖a@U1pr1' 1,&BIe"9ɣ*P$Y VUՔ("* -J `+c7Pi 2l2E2I &ōKh$cjVb.aRTSXVIUK)/터܍Vo1 I>z @22dqOռN9-dDP#M:ppnq f KP‚ # JhXd"&`8 AIDM#7xDQ˜c4h3Hu|NK%J SY)Rmh$\y)`&?S $1c?Cd8AQ_F7aC4$D9ӒXsXʌVR &T,(@,.\ED<uL鷊FB(l1,<.Htt{v's fIPFrO: z50RH~X>JA]A=x8r~~}ćSW%EQ {Aa"7wf!@4uԹU%B[?[Ht>xcvz=\xD4Aw2x>xtSہ5}M!;k#0ݨQV:z+ze\.L;u=v"O=ri3bsGgL CYvZe DI}˥B\NP5q#djM KCPt3/IL!DdN_h)=N62jĊjh$Ifd|L$ÇB;$^I2 *F52u̱TҤ7Y4{0=88aCGH,uSetARFƱ'ubh34āI0c|8&LfAbKCPȥzc W ,nƘd¢%@`$ӣ &CDEDàz PDZDNME kudPL Uf`\ ,Upl݄&d+sobD"RYQ #k{: ]3ǩKZN{u)sX&R礑5a$7ϡg\fO?jhяىp(pCyE&-O dLA H@PˀjQ8hsvibϸq4( |e͗Lifa}6bʑ/M,)'{pT}umYLPt>=ұNYO'GcFS3g,2*љm#fJGKQhmbXbexs`v HSpV#+upd=F$ OO^z'bp'PIhY0ILLa "1""g)  J>Se$j͂(W 6Z !Z `pJxq8P"NF|tFAQTa9M I#mHC:oO$(˹48&HO`9=lIaQ&ґ$0lAbb8سQ(^&3% A!nsIh̖'b0Eh1 lt9 xp4F0:HX)(2)DP##iӜ$A -  0 l :LpmLii q!5 $0# іP,nHĄR)V-IDM:,! dc;`vx$/b iCx4$QlJM⬤nիMABv0ap'u JHOO$(ʏw(ZWBNdҬMD 1C4+_q% fg)/" ISgˎn&;g>zcU;ܱy>VcYc?Ha-{ONC\#pIUvzBm(%̲X*T89Lwz]e_( v ^1k++=@^0E+oE5 +`DLx(^_Caf!3yď޲t*OF̪IhʕF.& F\2EQTx&OpPh ؎of>9 9:" ޛQ]3Jklv p]M6_ey!H6r*4=8=v/}+RoVӴca- &HWdbD8CqIOۏ^N}&vݤn9-,F8`1(Yffc| 0 `,dUd"nc̼TJȸW*250cUE2Ci;ԼPytmzhCNSfkFR-C%UJAݖaVN;<ƣEڪ#@p0D|wwwz/zPm8QG5w!FML qcyɜt[|Ծ;֟ge2  ^gs}U-zTyc.ӿszӞ>3ҟFNxhNnrPwF[,mj..=D5GnFvl'|2%> e?WN0&B C&j*ޒ喇yXR JhV@DJ5MX%k{!Qڒ 0>i@\J?iT;Ӵ C=ۑ-}[S-K9FCSNe Q4u[ "+NJ(vUY*9X$0 8ߠ/>ŲI7:;<c0#ܼ``EQX<O~ApGG& f"vdL3aM$34#I"dAɎ4e>#"& bRzN4EAa6 8Vc\y2©A@"Núy*Yl.ǐSRNs o +pnѣ5x# BU*J'oYLK鶸jL~/sw mJLSW#CyoIT*3ΣW7 7Ϧ&Fg#z !4O]O =]ESi]d=Ch@:ODP9X+ɑv@!f+VUv^?g^f|Ah 7\ }`<ؕUVY^O 'i}oǭaP,e{n%xt1?lvH=oKLL*j  { &M<(D/( ;52fGiUl֪՞i7 ZA.龅ܑ1$&lLW^8G6odH~J98Zi!u~)Jcَ<,儤i2U^iC9vYnf3κ}'$ 0dt#cm6fBmvrJJۃ@rfxIz~eA-$BQLQw9,@bItR*pS6Y>V9;.,1lfL$PBrȇ1(kAQȫ Lx=ad7Xevtf0 5Glҽ0PR>cIo6 тH8Jo&j a 5K->A52<|8y$D&!$y%<\nUGA ̤dl2<45Av=D%X6{May\DSZ$&:a5ec\z#x?mc[IXXmDϧZ0@3 XȻF؈mU)KFog:ZB0-r" ̨C<t@?$w(B~P1-]0rfIX;‡G >")qw! Pi͚'k zĿ[{Wf??n͎+)`Ŏ ca$U<>i#E:+`@؋M3qӯYȟum{F5i-` AqiKpMn RdɂDVdYKh>j|Ñ[4Pun&\q+ 2"5q4gr)ǍDpf r~ʟ1Q]~Csgl-^Lɓ ׍QrWyKJe8qUE-Jk&4óOLS^м><}"̰5TH5WZdȞ 匶 ZmV,Z9a4>)q7|hd̓ ){aA=;!,{ݼ]BH:hE ~"q7Fpƭu8-Cy8IJaÃv2j+ }&͌ Q 0pcly)-ƘP:TrH`gak$:h?h>$UIn\8ǘ)  sS =ÈXCYM4OYȢ't&8} ݉m_ (8 ֪|X;Jq*pH*kwM`AG#yr1?]_ I"NydaD6 I{fD;9ob]i;SW 89'5yMVjE2rj^i3.dP:`VDnRT8ž'|8:j ;UWpdS3X'u 'k#BG|t d,Ҳ&Aiɞpfs nz9Pǀ =[])Ȯc*њ4#t=!x\a&5M,yA'Fp TcxR&x T368:.% AGTCcWܱTgiޝhŘD+ۏv w&!. xJxaH|zE\kGGyǓ eΘi^M 2Mi>TPe!xk46s&1kkWrWb{ӽa!4O_f+vu\I@b`]uG*|1$֭D︽{P,GV c0Zà$,> 6fqbS9mEievtA!Zz(7i~}QbƫPx"m[79脈ccGL~]8FÒ|n7'OBFQ1PbUO7VhqreG(D!a:l=Ck I!fctML#ȗQ E8rrlv?aaғjcj#f^p+QPXtp5Q8iDd+"p*.|bsLe xTu CEbBhzEIT&Ҋb&lMOޒV EQ2g !_`RU/{~Σc$cxql tr-pp,,6K+XnƣRM7UޱGMS[XF JKHy(|S60R<4ğo?s;Ȋ g_}'Ga찳(S|A$;}~Y)'d_R{:Oz7'Fyq ($H hW*BKͨ,2Ϥяh<Iٌ3Gk!:5ݤ(]yC~8# 2^aAlJ箖I4a޳^>o˒~ET'sу-}dOXJl 0PZ+3 `,\mr1RM4Y ~tr$^ǃAw)#8ElSov768cg٠#I1^uLr!`E+L"٫f+:áP0И`4;&lƓ.nf7pf!XS!ɀj+6Iv󨉨5$wdƱdc2:y)=RXbҗx7mT|:έ-B5G r7t}+y*=[m^^k_n;oO-7|<>PUwZ^NMw] Z4Hty];]*CAj* |OId/V=Ɠ1PLs¢C\}:Lk@48j4lZwF&/ip9c,[}Ԯ6ձc]tr3*|sHz?)i>M-`|=*]wA{ *nƤU>Tv:""x#rs=_FK/dvcٌVrogyK5ŁVtd0 Z-F)%9EY>u.oU.r %}Ӥ> OCI@F<&YT%pm2fiMq3+Kar3i,YD6{9GSNޕz"~ă" J+9kņbX+Wx·̘'g}(ASUwfB_׭s]-m[Zam.!S [iP;=@OPY_2#ںHmc*C@t$#|9P>ޣ4 $C0U]^^!pfmn3+w0\L4fe‹|HGRy_UM!|JHP*{mOa}fw>#Y886,/*ș1Y(`2!/I?Y.B(] r0Q)O>"Aߨkw>jx#]* a8Y 5ZvaUp~_<\f51yNLwM_;~16=7G0d,.3N~3&C鯘 !!I(1V.c#cz$JIjtK )jbab5no)U:yA?9V }:O]c=.,O*%YG!2s =&s&22өx1 fcPKdTʩ)Y~, O 4G6kcC9~?h|Z]#}EiI=w?wa/J8ϼXPVyshV(AZTE_㟍ïdžbv>\Ⱦ"Tt#& aY}!cyE8进F/I6PEi? d|F : 1YwEGLzlel;Cȷ 2"YoB(^fs˭}ܫUZaNnӛ P#1Ӭ]"NdŌHGn %4G*XA$;VЇj5`tyc͆\M%;}. $<6K=o\[T2 jYtSX6OJ A DTp<$5v9g*21/w5QC "bVo3iSGa/r ;zrlnv axK`'9k0_oّ79!`x' Ry]Eݞ޶qO%r:S-QQQY!t~L4˹KгB,< h-ʪHL[-(0Pȶ:Ga`1*Hщ.ѝ2p e#YkXGte hѮʋ /M"F& 핍.>0 dXvdC"+TCճfi26F`h|nqfO(20QEظNy!ܰY3H0H#@h7d*I5ġ2篭@iwq`H%i?}[F5iq'A +Kn}&L5a n2DGٵ&m6ɍ.^0xX:Y\x(266ˈ&`c|KOA@q KDU~4*4~|,"`a?ԡ@Qﻪr'߲PqA3[|2Y+oȦa_y'D)?9?F-BU.VǨJ~S33uE|bd] LECsgoQB.WzjsbJa~6CF8S4&4@4#R7]8l=;:X*6pu<,D8/Vl:?eE#a/2#(΢1O㨦eT6}0 w-Go 2Q8jtC|~~v)x& ) ˓³*S-ը9$>n!}CLxXש~1)R٨¢o߼?3۲p֫OZUkobТ3&6/yo@nTSkS:Y^6`vM2GI~:+\쁑J=u4? GiX8^rIo>j;4&VDN׉#7U}1H5"4ChatzѷZ^:Y؈h@uq+$1 M/^Y'n8`qt9.@u tѠ Efk{B >/PϚwnrwl\!f/0DUE<(/'¿a:]ڞd}|OޭR}'"Bƺb|!IK``6l"U4 &(Ho UE=ޒ{Iu+ 5Ds&xҰzwc#(*r8$4(d!Bo{|\>tO 83Naed>M/"-lR4SsW#|}|fœ7P@aWT64* !JZ7\ -ǥ`,aGp~޽LIVsuQ6(a ﴁ"$d.-2lits_ ~N9@Ա9{}Aݙh%c!ƷqE TԐ46!}ϩ<Pjx.:gs6Vbsh'>S@e+x2.-QF+lld<++ò [@~xy\mr u;w6lf10tTxŴI VsJjnn0=c) c-bDLNBr400a lr&7-PK{Isy*.*G>~^T<MC ugHz )^& lA E(N4x&DC!p+iK k1-5 n\~M1}d~~\a HzciЭ.]z9>Ǧ-maj_N7޾Y$g?dO? 307~ח<JǑhÙd%F"Lw&ӎAMڒ8?n֔|};^o"\\zaqj& i\00L}g}iʠE\aӰZ^Ϊ8ň "x M.bDec< tI ~iě1lU:3CZPO]0rN&9*9mF"v]+CeA  YW"(P&I"=P^HR;(JII'"^q:%(:&;$62:i H:xpØ1?Kougf?7N d& usI m0oDpjf,?r "Xnޕ#zAYx;4me>BeC.sƒ+DҲLȡ+&L#-]DUn]Tdڈ1"µxQ ;k0Tye UV"Y&iCF8hvb\8ίd"`vOɻ# ٘7kCI#9 S:ˡ\GBehdLg.Cb070sNK3wT&aG(|O~e{;Kp5v!fY`cWux81q}q091rf)X,>|6VG>>neUq'gU**WܳLMJw{LC$M%ٓL1~Uw Yj) h& #:AMDjۋ-MIsu,Ns?lv$K(Y ͂?_jU|;/4$l{rsRۡ_[Eqi: k M)pS2M H4=gm*+OnQ\P竮_9 M?Y y:dIk l0ʫgYEG8%uo~WUQ&l=1rS}[s4x xb7lj=j0PӪ gV)1".{=)ٜ뜚f^cDF?&,kW.gKOE>{vP>JwC- ;˛^w㏠f=v1AY\58㙼L0xMy1C *)$RZ~t&L`MjZ(ּ5r1Q8M@] ' "*R-e w1R2?(-s*NX1גPb Da{GwD3*?lufY#yݘ Cdu@\rv+,''<]:JCGcn,?QdvG!SN>t*S-שּׁ̔^FPtrx0hY!v$ooͶmmǰX8%vNn"MO)nʌ3LrY]xPO?ph K\-Y(7l2_nuno7ug:|xw=DL/ <|s삐y0l9ڃX~EЂBt#0 B1m_Y2Ҳ\b .QXBMA +8qJFyϤcg.̫PcF<_4CtWݱ?>[¸K3C!.I) |dje=i!*9A|NQ;Hj|[T "&%7q8dFu*:ukVvp29?`F(f]dAU(uidM(MWmV7?OT;vk=ꪄ$q%t I$;;=8=\o! 0%)J;W->-:1f 8 AFv:L}hY\cl< 1V37_AE}_R. U缪ie'JeC-1s FDQL@4.wܢjÁl)'{˼K 3%ງCMJmMn*1XA+EO㳇g",Jf$G>ysIm&e]gK! Jz慅5^ e$ۋQ$BŞ)|fʙe>)FLd _SlhjRfl%*JsE!MC;C|}3N\tg]:[UTE>+UUUUZ"</ckg?ܢIq4\[N+Z%#O5cF7$4kIX}PqKx´ܺ1<'3-R"fcDvoC#r6Ǹ>֓2d/Efe95T >.E y)VJ=wcl:!;ivҗWAi$2A]׮fMBA鷱@v ]WƾANegl*k.vi}T0̊/2aω1dVPc"*Ķw\`%Fj`eZX`YU,3yub101 ]K;cMd'*Ŭj[f4J0brP) YuF~ߒr!I=2FLaRk4}ި4tDf&h2.[ל2oR-Tw𻍾clhheSsN80>C@R6Z|U<"g1^ 3L7^SyQ"rq2< M u5'֞ؗ@+gQ&UbLF8DtfAPΩ\ʶsh6PՊGPӠ!˓k 6 i &x)]k,0ǀhu !ԝ;+ 1Kt#QN% qE l*QD 8>U`$0q2,5cKu4~u05 4bs 65(|/"I+> 9cVSH;yWϡ v$&x({K|-6 T d[}%t2hF"s2/`-mB6H.tDa%sdiorĖ_zF>yh,'ʶc%nAEnQ;giɈG~F:lX16+L ~H<>  4S k#0HDvд4y_J&{~f0Jj6K#U~PYX#θ& adY-DF3Gey1'Z`#4 /ؑc&#' 9טA&q;-86Y 豤4Y4z_7Bc*/MtdKj;5l#=#N9:}F@n"uShdxɞ0dR rW8DP`仝p2Slz+;'$Q(& ^H^!u9XJAǵhLlbq'j >p;"<9DN|z?wq*Qa 5dl>ӘJս[Zf*-,~VM\! #' O;Yu4X8]"o ~@2a+ª`Bs%sB&@dsLN+mHi NCluCXj2sy4 *O&(L|JTFuX(WZ>C⫉+qI"<~` *1X[sG݂ZN XLU0;(^[0'MYfecd1JD[XXd4T a!|uЇ}=2!58| i㝧~XZjF;eo;"+ƨ2*O{j"^PƧޑԚRw*O5DsC͗d°){&@rշa?Uf-'Qc jxAd >lvGHz- ,a>"2פ뮳yPOM1k iyyy{`I2[kd J'G1;zi R2\O?-VȿAPR #A{1¢Ӫʆ 8ؼȱqᑓSxlg-A(7Ă d\,y,R/U&怃 $Ĉ{#dbz#v&j'DHm5A*Ė踩"Zک!xqG6PՄp mE!l|Yh}vG\މ'Bb??z#~mm \!#,?!0︚Ϛo $'Ǽ|_GEۖ١`){^\lC7_a )3(+Mz3\,h²7 BD!l xI~WwAqO##s:"iE##Bچ0:q}X\m}`¬!7Q6MGN7]*BtM*hʸap<@`7cAp ԃY={IACgRDx0)AxVU +p.`s/(0*'0v?sȟ^s ?w?5ۜ&nf$A_>sy/Gs\wsyc=E}A@zF 2[s|CHC bPgo#h> 6h 5 hP;30-'czj%*܌qjVq Ibͨ`r llsa~DhkyssFܲ|&ר{ -F^_7ݸȁr`gkM61tg`q ~9Ҫ[,&(*eX$4d> Ju+aL)2_57gݧGc5qb{nxJp0F15y3, 4If\ٙ7u[syjiM!6g\Y"d[B̉VIمSD]r|ekGG# .P3jXlL\Q5oD(#zE8ԭSURib թk+[ƆnAn*y:ۛg A8${\ '}BcQ-6W9r?=ONb  A@!7;Y0&8 !_sW3O?T>R1b(e. VNxit<cg2C4t[ ^2T&+=o5/>Qk ؝2RKArU >TAmAUFdIÞk8넧f$ߡ`c${(YlWRH 4 ^1=gzYfI)qXY_mv7N9NٺO#EX!d [lY-= 0v̈́XP۶uDuSt C.20SzhT~l^6e`G9nWӠ.f066]/[g/{d˺ayPC6+nʿc3W=R5?'!kFr=S{2ioUh7ial8ީ^2ԟٕMr CRavp:ZXaÜ0d[| uN#Yg"nx)2|IU l4([YD(7=b?QPCG13x1uЪR) .NLpga6L5Bx^nf{qVeeXG!AWPѽT}%;,|yr8L~\q!g5hW: %LNT n :É2/ 3|ygBy8FHDY]EBnJfs;!(L9q?1yiiih HardBn~-[! ʮ2d Z"{"P]gw 7a[k$A2nTfkNZͰৈl ,l Edg|c Ɇ/9Nmd5!xKtB_ѕ2zVj mSkMna['+ΆrHmoVuz|R%vf>hX)`$}kNł$p)#[mQ 可 7&&LW91qӡ0r2)ˏȮ9E&>%q8UvZ&.?dnɢЬckUҮ}wL2fsHrc^'VC5[YcivǪU QXu"D娻M**͔(QoS:)q D] q* } +?='Ov K/5vLn)gJ\^ryd@w.w$p˼$}ez)χoq3>]C4vKe"~uX F!MV#uMZ%7cr~}+Yo7JMי- i)[t)G7 shGC٪ 1 ތã:\ 7ƽ8){a+gaXBT0k Q;/zҚoi~s@5bSn( ċZ$1d΂g!r&B%S.GZ|d0֌;0-,;J4>N䵾  QV".\҃B^Qקk֕B OQ|1[X4 yXyeheQdsChhwh YJ2v.@G}+DSƓ҂*>18pEA^ kJ$'o-ƄӲq(pуM7ZZIg8p0F?lЙeY{ 'EQ_ .qsRHXֵ滫YE[g :gWJjoc^Γ^e6 X7?hޮ&-` Vϋ{@e[^Y޽Ezx9Q` fCF)wJv{+w]+䏳Z5q70 N@su<~ i?/4ImyhspxiU7YD;R7o -i;[Nd24Ǖ^-z8^hۅ~p9ϞBoneQQ9rJ4zt42͝BFxdb! q2#GoГB Fď /MB)nnI=w.;e1BeϏѣ:Y{@6iaDVu 3ΘʡT ,Lm25cfkjtFfl%jTv2d?5l?Ŝ&O[@cXd%F9Ԭ9..Yl5ZʍDyqrA̕RSfe:iӐ28q*cVKktAo=adZy4ZNŹ2k #i>%`\C;=rgƑBmgg)& 'y[+0Zn6J!Z2T@Q$TFYu7y}Y1]=ɐ7D2Zp[{\Uf3Z#N$Di;-_mqHc{2ٌ!:CWG6o!6am2 Gi"곢uG τdh}{MdLqCy*E6Q+LYpy%x^DUf\ñLnĪZ*%A0A5¢+>BICy c <.RاO0ju΂ V i[CA@8+\i|3Fߟe8T¤>:e{COc=2KH$<3Y"ȸ#g^U٩8*1QQ"l s0l5O TG  +s"ILe&ǕD(6 `,:{R=̲(\x7Q8~ Uqvl5}zGE69/`5/ʓ= kWg(z ު8\U-qwH!ቇ d_ >B  t*@GΊ'|Ih1,<{sorg1ԛbڛ >8(cO}dph Ѧf $Bݥ{z6?y=L4ns10s1z!Sº3ߛJVO' ;u}vucnHWQaUZ#yPd=t0%1y+g B#Î$73*Vƒco LG&|[QX1 l\QwBB MȎsN{T12I!i*UL+ŤLh,;C2a5uIWKasnrvՕDeq!QAY󍿺X֚͘ds{`[F%RBɅ*6o rR[3qQp;uXp&/4Fɵ53k=Z8#Eb^ޛ*CFQA} o|C 1Ę aZV04 lJLc'NssSbq89 dm$)`mJ%:yr$+*Wm79r$$oq 1~*9Tlu 8)?KCa;wrΏb Ig(] 4uP9LD$I}Z3ز0.ߙ-IP3rd=dW]m%Oxx-6XpZxRt;h5Y]M`AEs>M Spj5U|q&; X#Y t:LAp5 81״F;fv &RLŎ7pWqAƳyӑhXk.+Txlj ՟MW*́.IjtVxTAcO![* Eۍ[1v7+nI8#dc: EPMPs7j4:͔u cʣ^= cUki>H'ڷ;O %)lIHu&Rh5aziܹŸP!, Apƹ̓CFt_sv\I#p㮲&FMkl),)(pR 2YcjZw^V?,MPj>tx3"{/Wv ((54`u.+pc;w,19u6]@zm+GzE+ ~r۔f*崉Ӷ$I%kLLa}WTGo#F`QM%SmvαZUj(P(pߦLoxƆsGʇmNtuU^l5+13!M˼v -*(NU Dj[FJ>&W]!9z9l.cª-B+ k}1fdA]rB\h{k,{Bk*կBn>"LXcȂ5r5 D2=<7x_ƺ?zKe|b K,ḩx'$:GAXZ5WHQvv"Ƽm(jҐdáӵl7^caXuhyץ1Ch^Fv] D=UDuY҄Y0eU?*W5ig8m 6<`ZTx`WM<a@m'P5A4>!f'vf4a3&dsQt3ϣΉRH.]-!4P8F+xL{n k'Zhi?9`ZD ![-QYYF 2H9 vǙ.ɼ8pvh A[q#TgN>m՞Zj79C9R#%t9%Ptu.lnN!@ 7[14󈽒dFx-S$1om CC>PLFEΣׁZTw1}T-~? HI/Ta}խlP9'sKJdOfY%o|3IdlIL}؆Z=I zd<"|64x=;%A2N5xs_Ą\j>=I(a?1r[v+u!dA6ͪ&0y)J]owwMۣEfp"&dķ( sd/s-YЯ~9O"\~kFyhi+[ =@e -Hfk=e#)o(æ-7)ǟs4Xz'e>=Q][;7aז'3yq:VDs Y霍YmwZd8qgt9 mH5R>x7j{X@K)"i@sNoQQXVOz7p~?4o;O q׬ Hot`GBcn rk_ᵬ99D(9F8$21 ;lD P" trѤ³9'`vdB;#D4p~EdW)ۡwӑ6$,*z&IڍoTf}z"3";n̿D!2BHEZ쾳qe[tQ"uC9XPToߔ,VK!Y =A`O,4ҪS963qC-氨FP] 028] ^sTy%ls\wBgoa,2 WyM5ZsK&YkyZF(KG]Ѯ1>RaS"9,Ax`C<"I5v:f?=Sˊ9 X2At; ל;i%XhH>GT_o9 Ј\~g&w|UBL?;Qۗ{vyϷiyT6mvb$/?akgEB 429Κ}N8`:hF;@iD12ɜkCfy}1[xyZSdALqACaIJ=<z'8JǾ$}ٛH]v8 NȔ+$*pAlV"hx !2DU V_sQ19cfZN gNjN,aqג 7`; ۴Ǣ᧐tPL*A]NLE@ OJŎ&dßBG[aNqS,kTi<%DXXZLb,3j5FeN7qˇjM(L-9#V3c^ۏӏ:$ek/35,5b R6kjm0g~~EG}#ųX&7;{cF5/rx=G>A?qbFA} -A7DX'dq 8Y;N:d LWsrurh.Ç*LGݜ{xtO5^=ԖE^Ju\e4,}ȉET .>|L=jR>N b ,eXj0,Iߗ_N9^|82}0i~9_`cfhy>7؅ uO4{?U1$e&s=x?`w߁A9vl/bWMql TfBwȨ!ҜV KGk8E޽i$_9Ď`߼xiع ODZ>(EUI2|+b<M=︺; 6;@-`+ 6uFWFk8B)hS٧7v^hz!~>Ӓ_nNȋv j9aF m"f—uȶA.mZSr,x>fPV6A`Z8e_9jF{,dmyf,Raq,uWpDs{QjOTmFo6ڷd[=JhMwd3 @h.=k5T&m<(im=UmMF&,ekp~9 4,IуNW,#] ĜL#eat^LE+놢N[kMqR[ED\E0vw/$ H Ih)VZam8vQf d󳅜'\K>>pӚp5 !FO4E;ȠNA6> Nm ; /&퇇ZZR pW]OIiJTO`u)ѣS1A@t&t@ru1; T' I]C4\:B>@}Q5&m/npN3;}FѕB2ܑ}R6LhqNXY]? Íʇ"C' %**+]} k9P`XD^]}F|/Xe]94Gy7>sd}' eБe_" ($D.UŚ ^B,*N/ZMF*'SSq[lдɎ$^nPJ 4oH?MvWW{]wzxl#CC'B=poיq-C%Yu08cQĮ<9\~G{$ {iD2:f5P4iG dѫ<|%Um#*|e9~dg'\X$9= zGc$y:?r&]/ACgmߔ^G=88(uЩ6F|zh}3((ZlD&-Xc C =, `_`oCVWKȋ􅤚T]vJ*$40#a]~ {Do3Y4eۤYHSa1EPOVTyMؑˑ31ؙr9[m2}f7AwűBQ;Ò\?C1C9zmЬx`MFoYpǦP m㨭:FRld/zRC/5vzu0n>`_UkHdl"RŢ9>yZyr ϦtȮ G'XWQ[0it$p rUiL ޹o6fJ o2R nN3NRPkhDYI=.!>rnTg|<z8T5{ZZ' JlÚK^{nwj3Ȁ 'c#YpȀ̌\&)Ǧ} À>~6%'Zѣg :edeLjSz:i>n'jvE:C)mfʮ`XadN# ('w j{lNtZ":'/~-RI?_ۍemMnՌ @A{GDu.Q3npbKLCxdMExALٛ?BЍaw"-PzOYA;5!\}bd|6a#8NL&o=z3vd8$2GVm$llٺ@yS GA+-*dӸO&w,>>Cjuc"XixvWTxAG%IㄠDuP>`|}N }}Ǎbo~G~&|{zui}WΛX?RObx;Eל[]ю+{evZ'⏆vR㾏y^;Q1q_r?x|1sݨxX%.>ciE|H _q-9oIGeqpt$hwdf^{jQ|W/lEu\)ˬO3gO_  ]~uEL&ke"p<}EyѣAwvV21̭3WHRTKɘRI;Q מL?NRxؚuϫ(. gȷn"'iybeǁU;q_6vͲmяlP$D."?s:mQ/Et_8ce<0G ͢vGvF{zye UL L#KNu(g$dYUb(ƗY͏k#DweF=Ǖhi7p׶׺Nt7);1.0kif5b5%AN#mWjsĻNϯnճ~S^ j?wr1A{.!( ɪ3Yw3{tx ۴!eG"^?ƜMKʦ'N?>(pPah /! U-|ӓL `u4"l<~)Q ˂eǡN`b jP5s:s3] &J #36D Su#pa"k-B~P2{q ۻ| ˴ҟWD!ffߪZS bwJ1 vAY.J#{mZZ;hU/lNlIH"֭ *`։V ΩNG$ΐ֧\j3D {'ptԱ}5TT3[ms-a8\=>:XT¸`NR Hб9u䓑ߣ6Ab'zfo7=+Q=ގdEX- CӘܦ"!elUwWlr|ѽk|($od0b'9mqڛeFt\v*NIZJwу-x*1p/.趾(G}|P@d{[PuoSI.h2{}Ar,$LϜJ |Yxp_^ 720 g 0m?|u%.m T0I# EQJ@0XbV%" c00DOUJUUTrc$*YkE<TKD,IK@,4R1QQ JR*B'$ 0PV"(Ba tx ,BQWnJL4RDME+Cp1Ip$a ),z.a2rQ\$%L U)VKte2F )ϳ$B*hd¤`U4JAT[I{eʓlG*;d%4wP{DDD!l'H0%FHD.xzE3P7Ch/fZª~oo:] vOrrR?>b ;,T$z*׃jdCg|f 0,ӦlPx#^&vnZ\ØײX `03 2g,~wLQ?sm]QÿOI l[L,s̆N_:,Iʶ ʞKk 0HYگC ͭܔȍ>r~!YT 1K7(2rq¸l- 4zczuAa71Yb'0< SL^&eƳQ~KbXTTTTT^:; pV3RI }HJ(=Gl6C7g'hUCL굓va;*5Ƃ %=/ت3&@=v]]kg1]n#37 1,|LG]ˎ=aPB^jIcy=@{Y#03^ -B_o/PeTGy Q'߆zC4J`)$>`b# 0Ą0ˊ_śjnJγsyP"[ߠʯBFoy9u^JvONKbbza  ofX{i? *'xulמǼ֣U+X+*g( {Ks@fdssIF%L)JG5 ֡@K ?|4B_Tb3?̈́6i6k4f%s='6Jsc XUy]O\*: EO &I͙#",l?G-jkQ薠 PKY2 }Q?"D+RJMcSp V clXwHcL6A'44U8VbcH1 v= Bk&9. pĬ2r =ulNx];=;:oe21Zp!kaFQV[9b;D]◢2r@gNLǔgz ?ܗWz|;<Y2khl"lbQ\m('n:ӺX1$-e&AӍ(S':).A dռ!J\"̽ 31$S[;wD=Mp>^؁)L]::󣵢QZ[WF{7xLϣ}_"vkUM<>tj`\R;EK:_WwM[Abij:y;$p0p"Nba3.7CC*Pr/ZeATSNSt)h[P%hX+(!eXi ANxda I zl5ցݺϒ fG~fʈt,)3viμ]1qRnS?{Fd<;` AW=LѶB^[$ZlCLbJF+B'cfcA$aR041/ a-dD2ka) `TPD(n=ҒG٦Vڹ, & y=Kڡ_--x=$H*EK9/r}*c!2jJ /=Dm/٦GAAzɤ c8;:̲\ rBL*tAGj2#t Ǧ QtOb~Ь,A&D ^Ge+"l:_'עp`U?A&p{/|RUSc?  $ MiY8?u™HƊVMk m*;8hb1ք`D8\O{ti=wF($x}Iǎ\;&ʛ60)(8띛, gs{'i]#qacUZaZ4(!G8]1g-qe?2dA9믌֫גV[B\F[rT H sG{&|pp7C73]Ro޻po 'h@\5a֬`D?#O,>l|=ap*`LC?H)“ RdACD?@7-fSL]˄0>v} G$j;`q:y=S"b|CV(GEJ%%'ԓ$G|C"US ,c W.Ob`h[g1Uyr:Sq( DW B2yV&GLQf)!a&< Y!AGdqO=z2`V&(`H3@h&Q((&BXUqi~(y,y6E=;y,ϑhLF,ak< (`t }RF6U)# :1 'O'* ߫wWE ķMU SU:EejWmtJ'AE N&ʲ)3p0p0?wj?>LEAVh*Jyj|Xd YE}M&t֖U_;Qd,*#5G Z`*WYIU,rE  5s,ٮ4te}#du0LjӄJbYDSB(!z`P34,JP4rb>Z}iF2)JF!eY DBפ aˌ]ט]c/zUE,yd\%?%8 KpD~rՌU`c"Rӿȅn޹$c֖3l#CJKTyn|皴רdL|%ۧ9 R sePDLF5CYWBCS+v a9$;m-8ˆPX(G\he~7Z2ul槃mUUU_|b-=CzP(3 UK:=Ѧ=5<(__v.5s=ThݰŘ7ݾn%&鶙@n;T ,c :S06(,Z>"?$ߗ)lxr} hMtm+~a;ZтldR(Ĕ MDzqS_rkJ}umMCxտ+Lnle.@4|.%Zl9M(p*P~6bIaTӸ U- .w؁AS/u,Kg#%@T6-$ (c""ȴ*Ȯ192H ڙ,}vþJ!ҲXsek5LdWwԂb:08c)hnG?u1¾WkϺСGQUѨQ!3En]c O* 7kFLe{>W3OMgdŮ8/S+SEN?ay̆dC@_z>uBٙ0H(5/H՟?A72Hע㋀Ν;0Xx/GKF6r=ajDk΁rd  kITL&@-[6.<f9{"?:"Pnr\Vj9RS߹dC|UGNL0cDj2qxѼ{4'dl'9rhXwuXϹDlWr~ds mo]5Kc2msB:ag5]W&Mv8*N osbD¿2~#ʫXaկxq wƻcSq939 Š7PK~Æk8!Eios/ .籵+E YNi 9驣ss%AUb (ZIUYVBB_1 *Hrqh59%yx WA@*K ,/Q#Ia&5J-=c)W;mɛȠWk 8]q{[r{ه3 7?_񿽿'|1I^>Q7Ax"k!@d``!e~_dfgH}_wT?[@ȞTP{q{A*=d<  H΃.]G@2BŜibD;4?Av6q⍮ LBA,TVI|nT;ʭ؟ݚ5,d\)rZs~Ǚ/i5I|Je]KWBV7r;urv ?PӐ{'*6y1 ."%16X~>}3 >dZ'eKh~ۮfqrGG]BJ[-|;K:u}zP/:l^a AP!oߍ%I4]p,ֲ A}i"`KD@.r |ЁVX',bxTk}tP>3W~mbq?(5 DӳczK*z\p?[1CB_y̮vr^Of 3t9Nٹb?ZF'5+F˴5툯$cQ$6CЖId WShA$_ɠ$/GO>5 * ϱ(ȏ2VC~N:LR΂oi|)Bs~•|M|(n]H'ճh/ R996,C*Շ c+d}9~^ýE>:HHMbz^IhńVRXŃ,O}>9bTGOCm*+uzx3<NzB'u~U?]! /6m,BISB|8i_q~6`ׯdr+922G0-~hxM?ptLv/_ )/q)AD-cq"Ɂ<Ǽlr&|}9[벅+t18|3,Ο/ x x$'_)B&pCG ;21$/ȹլK:'Q:9)hsI|Z9k-YpD\%E[Fꪚ 'C1ˆ|SKHR: !q:8;o߶N94m6hJ<~zEWDДiA{JHZ#q5 eXgxj._v#,n:>rAc JmIi4FX,j,oP=#kʅL>D'v%)TzHj?[IC~ ԢJԁN۽=E-!/Ȕm73``1qoS/ ^:[|Ѱ.+ OIVq}O3(P\CwEt`p൜}Tw"^ndS+:Cs$.zC ߉{ ŤH.-afd%B!2#pv#.Qv es cϏ?\NwAx6oIWYZڻF`jzÌX ޾n16{]uں^\XAAinuK.8Xqq-<`d|#2`0̆CnA] r|겂_ OǎH6|^|Ӱ;Aq%4T0vjMEGTw+. HF6CEq!D F?{VG Iw#OK)Ycg[X0/h2_;RE6؆ QzpOmn $Ww%%loOw:{A3 >5YnYWcuO-|1a>]T>!v6NͦeJK1g|}#>(=|^C^\aP'mKv m0L\Dp G@¡&]9q~uw3#Nd‹*-S4I @Yq#-Z{\x:E03j*XxraWfIK%qJl蘴7'{;_'i6QYB#y9:*Ӌ4܃eG}?? C]~6_$G++ټvĴNSfQVîu')oC3W?Yz*SRڠC؋nPoIOѡuL{uF31s6 wÖp4Ov:Mw׼v)=pnW4VB-4l5٢Ƴ eţz"X.L`xWD2ͤXĴ6s+< 8=h><QF >bxĎcgֽr$KËLRMp(RDžu^J)+*Lq*4GLODQS6D#%",W<Q0+'%v]zJE$_D!k|俍3s1XcM\-p,dZVvω?Yvˣ#vx4tmR$X`"QaTᐙ"R!W H*(=ݠ;6@$w]IuY[I@dLK$!˃9 ,凓˭^hYn!aK!s??a'IǶIHDYf{ZԎo?;JR\TJj]=S|GؕD.2*lJQFWCdKN!1W1e*06_,o m' 0e'|46;dG*c2y..nQՆPO/"0~H/Zug>>>~PN&^Es<,Ew)cFVzg1L[vYO\Ѓ6P]Wg7R7иV5nba 8$]vXL;Kn6`sy?X;mcM-I$FMx cS߰dxK^wpgٲV5nj.fiUgg'jZdā#_@q?c)r8@ VUa*~ dJ"䩞gNf{pďQ0 xoFLYҀ1TڋԄ Yg!I 8@_`'y&P A JKPR2)#¿4|JgPoQ}HX*e ꠸]hي Xj߽f2KDpbc#w)N)7#׎OB)"}qQx{~o9w!̶M@`wsyQBFIIeI!B(* :UAG~[!nDFI!atJ0*,ɕ֝L D@^BMJN{ܵ7nC( 8 fә9/+"b^梢 ɦH?`p1?8}⎠MHH1GlCِWxS ,Q@rE-dx%Oq|AO|1!^`G^EN20*C02% ;-$AKlG!`!$1*af"v~Ts?{Sn> g'[##)j ؙr` rg[/#C#-uj&>e_8Ԝ z uő ;14rtYfdyء33)پl;bQqhibHF}|m$lr f"ڒz s0؛yԿw'4y$(׆꜏K_7bŜ"L$gf لi?-brW͓KŧU_LgƵ6Z;;Xͣ]Lb$WSK{9#@pȐ߀/9~(62#{Z||ۃ|Fwm/XP1 hcrAzknۍșN#Y:If-btmK1$L㊼'2Ds)C?ϞMc͛gݩu1cw V@̓ ^,|'/HOE=#0XA^0 Kx4b6hQ^p~W\j! D9cYx$:c"&rɁOG[ĹQqAg**c5wb!.eh¸\+*A0(&DV./$m׬>38j.D[($M}{r4/b[%DjBYe +(L |(;a2<A/"Al*GcsS)9'~r,a^6y3 |$td0*o;"X1')I'7= oÚ@6MO,H%7$ei c.j*W&M b[IlZ*?N6C*Go aU[ _`1:wX[a3iGYel2n5gCiA| ~Z=bkQ]dl_k+J׃ <'1WMz HT"2щ+太?YD&'{go(rau]fӨpg)bۓB$x, f%rr4\+J$/[ n2]F&]IǍS f /!Qhⰽo!-j9mCi[%JTHȅ5{)"L5Vo!ΧtAj.DWKgg(d1:Q<긟xe`H]#"~:)w> Ԯ4A}{P%AqeUa7Rl DrE]켿$yv738VR#)=u$H)˜DZM箿nƊ1HC"dTZC΅HWuXìQV8ÌD/:R9ugu&^P5In%abt*N2jHڎo5E=l- h ZQYa0A)Pr >AX-,(OϿ~& YUjE *lIˆ%F"E`ua̻7ƸQT6wX#lzزlt`QF4s\Ȇ<"˴T2[FczUt(?srBBCƨ7 K]NEgl1v!D &kQ2>t|\qRsai8L(1痗lLBd(jA[ؼyedKRP;}Uh2EHIv$ ci~R?A iF0OvSfp5V/Z*505)48ֱ݆D Cij18(ʜ"2A&5McA(f1i V)«ֱEE"eQ([aޥTZXεZPcNq3UjnFig7Vqo[{a6^H ʌj5\kBj]iF%'EZɴɑWE|^ D>/$s?L`d` 8 "DރRYRIaB"ɉ$1%FI!_5WC3o=8I wϪ/a L/Q1?X\yf]O#3mh37Gq] oK:TVb=3 SJ0H(0LWޞ;}'As;{)! `w&cȧXJS:5|$ePP_?>Uhv gкP=2A q _ U(pGi]Rq}H juLfk:!4Ek NI (m-4xUƒ`wd[A JRFR!G,?D(ճc42Ej\;RBύj5(?ɝi6ಹ@4W-^Kؘ }9Nl`X~ӞZ~oȿ#C 0}S6=5:sa:`)K6!;5aF!c >}]Qt9Х0V)qK1؉0B^ߜk Of!B*1dfʟlэӽY#O^aUQ ;'Xi;312r'Vs@ 2]3H#"!%+Xךeה"Iݧ!C'x&dhxx;GG-[q 9 ycUvphkP6"l0 f.367Ą⤍5QJQ)'b Va2Nl7"~i&46ɗ{O3#1qqp ^XPə$N>Sq m'kF(,04c̊X 02dIr ͔U*tP=p,0lϙ ;!nF8A4,w[Q@mrJ0_Dn+4_19 $ ?0@ PShGOG~4AP|5;siPaA'zoBWF @)!w5qq8"oҒskԍ*8TQFiL![!NgRJؤx p ^u IZ29+1נ\3WԘCR+ '{|wdx3F1i@:ˑ^1&5ߚ$iC bF;$max}erjѣw-c8G1T4'З%3ӿC1AO}*T!X ܨjxN DSȞD4IJ*xhQm5A/P8H#a,ktkY| 0`R]JH[rh.$I?268n:q=W pN-ͧz:M$m{=8uQPOW8ȹ 2 8 X9N^)qJMjᅱ3DЄTb֟>8E =CDj9&Ed05#yZZ@k62{lkIܵ EP14݃@ 3822T FF`l*@ہ! TL>Vk!оwEi N8  sX##>SBA1f)( Z|X H@YulTXc;H~Ao5%,Y15To}!*$=] qO>nUC?xw4],TOS;d>dF'n'"n$񣜘0OW_&.nfD&;%JJVChwYqMET:y'ݔ4kʷ4I}5K_T=ύ9}xE9}~p",?nZ2XOO>t5E3iLr=6Y!#-^CWoF?o tC fb4Ov *L%?n# 8=zn!#0#a1!xgW{^}U1\[ѭlq߅Uu"+:e*q3~VD&k˦9zvnO;&ŤEđ=h*:'C<0mk*vV2lxUy1eA&}v96a9 (hcmn0~-_q_/?6j):9W۝x_JM0}6#^2P;2mj s%%'H~rrQ^{p{#V29DlHo"?v:0n#~ޘ,9F *|iE`~ܗz>,YfpQ j7d1QÊlQ !fpP yN$CCEasS%=&hv5i2hsɅ]'w.~GA|WA~eA;|t=iDL,񜷟N } 4H Y~Gś<9W.r;k~n H@,>+7 [Ex EANqCo'.o_Qufvɰ`wMr^/pd͟͝a#`.$OO4{ACŵC$~Bc,уgiǻghňq?7 } | 7A}Ws%JH G{XB81l+[!'SU)gFaX0eg6};4oty}:w߳gdm.}Gّe30}|yz*?(sisDgN+7%جI7NlwOolN!+30_;@1ژ2E'M{aS>>wm[RyX&Mjv[ߍk3 FӴn!]v>?G??]2ϋC~ӏLXrq 8:/1nR_Grh˂ضňgpM,SIUy{/{ǵO u((}^0=G=>}L͛4wbj[ 705;F_ 7XϿ?ys\ C *ϔ__0;a/?!Woڞ'd9zb35??#0: eZERt&ÍND8BrNS`emr {9{yA c̙c.Wy-iXuslۀ@!_Ѝ!Ap^ Y!՝z~/n_ܸJ1Y8# O3QdTrE'Gԝ1}T8 -(?:U k ))pE)|Ą8P\^^Ss˺sN^e)tH?fzF0}>1d~؞mvdOd%aC: -}*89@isM'5DM$bfxCrԽT=Ԋd̸G{ARo1Z.sqJm)d/m~9kMdahi8"@ f(#"Pٜ v IVLjD/1;O8J6d;{.v`3pɜӛr&e%.NaiꮧhUm8819lD!^ q,AHϒlg8/"d3c5ߚ1Ciȇ]2 X<_usgY׏ƒ(hL0[s޼:fpBIY8-;\ts%Z LTp"yEÐ$;N.aՎYA5s#V~\ Q V#f&혉GqgOxOF~'F5+foqsʉ]ʑ>` 's%ɀov">2TU.KA(F%hD,$39ߜny^z+@~G9h|^,pªoT#UU^0N ָw*yA""do9"CDŽ78*?b8YV x؞i]>5ծd|AxK=Nhi'˒?m|zg«QT5>lĎ]g Oک hX 9";Cg?'/2 ,Lşw4~J ݞfAˏ1Q7 =vW3L..v΃' ^`^*9X0 {HfvXyl ffWX uHi9>gw[pl!gN䝴qM#fz/S"?I)"xCdITpN =#;t*K3b!A h~\n8A#!֍(}K340>fo`¸5TuғxB4%&U"h}M;8le`>7, n/[DH|\6|M)μB,f9l'JS2X>韃Dִm3d$ˉ} l;#m;|M\{]2B# u{?4˻kiu$čUuX; ? '[C jLmݻO$y*ERu6!D٘axT0) H[di/i oP(DZ`^qS (Qao' h?i줕Pey_ ~/]GjGg=]͘ٱ$ 8/1)EEV#6C1E2TB dGvEQTN;Pw }kų :g7[9Rxx:ӰѣnQ珈w]?-zf gҽP]RbtဒB5䁃QrV*B.k^fx? d bW4׏HXx(PIC@.B ! )pbS2@f ˍHR!)oo/WA'P!$_}I; VխSRMIyJut :\q (QE~aEAɠCaTX ^ 09h.6)OU0p"$ sPT=yM΄n W_fxhKDADRTięV^L+G  ((b5Uu5Uq;Ǿ{aa-gL,J0+TsA- N,5*+E{WM蒾LB4!h 6zn4~}tzA!&5{[dS8U ӦFZR%kHnl̶|> Բ8d-fH ੢]'~]$2A^k2SWX4ahLN4 n ]"ӛU)Ud\;Y",bE ^K:jybYCx I;cW 8-xPeQ Ë@0 &{8jjGx2 G}A !8x~ơUv(Yŗp<`^Qz}{0WW*^QfeMH jDZhC"z4"A̳ W%6GG&J$ي(92hVu%ټ0"^xV;ω^D]Kз.|,Fd:81̚HBQUSd$h8% J }vq1=z"S @čH-c r?fT ШA _́'%;ðUN9K?;<Z(6-cw EϺg k\Hz2ECa ݁ɹnO<ͽNu$-M>RTV64)=U\e e\ Wwm3EH71C A$SZ: !(G\Ȁkt3&jg'@AEHYtr)St~:ѓ5 <^m~ה Lrl@ f_iߊ-f+z )7湁vZSmr6k81}_}#ƅٜ7çt][U YHWs/A_y>[C/hn ,㣣ljmP⹯\ $T q2C).xOWǎQZnjVUw^V^j=aoq ׃iC[1Dc-HF{:2W=Ub Hצ ώ'>\Wi?iMx##~3xϫ{feI'{`~z6Zqfӷ6{q;𰥭31(iz=Qbb3_6Twٓkzc&쬻̗Q.1~z'^7\t ;v|G[Vra_ni{ؔhJ4xOڪ|۩çųv,6r՞k܅-AAWDx$+[ ;3$ UV;Viyф ͇=)6ʥ(ۨ-Z.6`b{$F _19G9%68 :dQcA3hmb֘.2P: xSPNhʇpxŋLٗ̃P%b5 ר9ѳ+._Mvnɻ!e-)$ǶLdY|SU rJу1pو12ҩf&$V*rdL~_zy#p%Vv~VfLN($HN )dYS0D|X ukP7FYРWSy}IJIx]Ŗb(0$u_#&-58˜|@L# ?RX1q2t jPxNk?*Ǧ4eTۜӺ)^ʯ_+D\@$8MLt|L٫j@vo6FXMYR.ߍ^/M ўV87%BwkU_iF6h)Fcp2<ܿ;%qƧ5EqATct0qQ07^Y,g= DTNw<ZOKɏ(Q:RH)ZOҲ9(kAYK 6c>~kJrwxDsUݸ(5/k85:+T7X|#9ˈֲɚ ߰ohδ/OzLI(!8Yn=p{h4ʞ͵6B?w0I8[:t{%]AJ9kjDkޣDvv7;0_N!qYQ8@Jm7qn=}*PSؿ'M>*|ێ$_i=;=vGNNT=k3dOqx<.gՃ_d>g<#3ڱNP a7?n9/\ Pb^ߛ1^[G;p-1烙;ΧfU"]<7j$ 4#{'=}xP:?M0:>ԬWi`:7Rk6=1@8ˤ7_UaNq]%վsVT @;SJGӝI Of|5oZ KnV)3ɟz=mb[hOwq o,0]] 8 &CgmQ q*.k(#*gfGP΢x;r> m\sdd beh9'yTr0z]7e鳌xU{k7D(՟~yH9x+émP<XR,^nzfiU~[0?"bXa|6<t>V gjHôx9ӖNjjE)DI Y^㔮ާ({ʓ QnIz ^.9vXK]{<X1~]w^/2+҇g_ߞ(ω#3bV'=YkɾϕߡƟәe%(X[ϗ qY9l_wz۩g}DTF0}ɸ–JBΧ51Ü?Qϖ[ԋQo]@0*滅u)%Va13)uVFZ~] M·OkJWNFua@92%Z?QY\-) 1W @&?9׹N̋>+B<ljy:" 3#!g&fcwQЊmE~WRd+٥IǨ@sh;IG0qz =#|GM)[J/s7Gӧ/_\~~|vhf{rF?BbCG`asrۻ2ZGZm~5?qəK^ 3XDha#][Vjyg|U 1R#)99mqx,ܷUzze|pO~{xH`Tܗ|nOLlzz:#gvּk 0yu=jw?f>BB ]`t_d,Y` Ef[υLT$f>;|lxv vrPp!˜ 4UCe~ڮl IPV^2-Wl$WTq$k}B-VZ}RG=U$fHJXaYie3:V[_' Eޯ5{{]q4J F̢N( ¸smȗO3qaU\T,~ 9X5uB}D;3ycw:*gw-\V>^wUKv 0{7ACM$tunO<ſg9DFAE}v[2 YgV֮1G?'3FV c6>zr 0=4t#3}EO] 3P7pU/v%G`97[3s0/YQn6f$#lw{y&AJ`!/kg2 WL ׵#ȗz~O2gگW(\~ ()(똀Pt|]u;)-*IL\D7F) SRx+RhGq l0bGmR[볏L935y3ר[wlwQD~7.2XڌB0@nZ#}{sYEmƍG^3p@][gȁ ^GŰ&Q :H&uS2fxje%5{أ;Z~QQW>]a)>x;qp:i5fF_bƱ$cC^j "0wIXO-eKuw3Jt||0ۓdݚ[ʁn+6&oo0गRz0ֆDk`n5'U5UR`C<ˤ%mU~%Qj|`<u jx=< yWk<_95qz|/tpOCxdv۠#"<1Z_\@[J8K:tC3w8231xܥ>)z񣡃@;1O"cX'zF~qn}1 A>rS&W}->6_z^>?2 0_/hkhO 9 }<915FiI2q8hG *cq"#mf;s0Jɨ9,|/ cK*Q3tgL&pUc+dԺM@jfIl훓”™wuoNpaJ3z> Ζ]э@ ]ЀjE{'/U.g(Vч\櫇ª{w+4hUnW8 J&⺽Aú^7Um+/9w6DZK^"K{{GbwK]gpqtoPt7Cٓ<ޓ_q}4W5EN>CF7  ٵoӬtFxg-hݼcHep$G1;᲎ьAw!XxAsqʙE^D`l`֕if=:!>m~*6i` iE=ɣW" ×R< &zaBJ2f:"EV@9*+hgr,1\EK$Ero>,0i``Nd@^]lSZ3= lk/S74!'6(1:}kgճJV7x2f~sy᎛4w ׸ pv9M?+/ a ?'sK%NtO_h۳ bENN3L'Q;,pR+ tAͭA,~׎=d>X,6Cѣ|Qy3qr\ ©Y0/ "*q6 V\.!N痓r%gc#8JI11%,s(s X"0h$NJt1nW ^[~$|Upԇ%?};7sf*ȑ3M/9'v 0$l1)>/<{uof2m|Wrsh=qL: D`2˔H+#9{wt}Zܓr=/жq煖E* nʲukȄE '|`$N51:lٶBn޺Ͼ[>i@XHc\8U 7AT@,2+43I] 2v*L2!9F-2% %t כ"@~8t ~Ӕc`qS,X9a:IW BfbUBqXJ"*k4T;I5LLʈƅoyA|XX}5#uCҩY<=%>>)DJ_߳$&\wQSW+ě>aHJGGĩ@cc8 , c$Ǹ+>]u㰁`ah\F~³X17IXO˺FW "_EcvTSF$7ÿmylKǀnZ1 l2SS1YM^qҳMX7<=-ۖ4h-1!Eߤ41;a3Uiw,39^@ c UMSU"!lY-Lr vnQAFAc `ߕ61Q@H ߕSL\ˢPpaq(-ap06rvFGH"C~q70X)W[! r*Ɓp]M`R>wO&׾r}OIn AL؈?\DNS0 87 8/~h58۴t'n mJ‚C>{9鳕+ž#sFؠ|;I<^C/m%cPCMYw0 ;PTuFj0Q;Z?WiɧRņ\ u|Kp)Xvgorh~hIIJ?S* B?@>9Pg|^RrR5AK}/eA 2ӊ(2a IAFܦXLy#z?dOjXf1$ȟD2(2DJK(5De UFMR 99D1TseK7fZ?vĞ(#TF zFOPJN6̅RVWD!?xdUdz6z^sUJmM"X 0~l$0E Y4hq%BVouI&&@Y0 ONc`#%inj*Bra@h:I̡fCXeM,O*բ Jd#z.(եMBJlv1hJFdXZI JQ;I9x?@*<ow$2񇄸(5^1H?c >Us00Yt@[:CEaSC`z"&m vB_lMy(ADSGZMF˘Cgp0_к~ /+У!i~\\NĭZU}\'jԇ?NXAba 43|$IuqnZHB:V grG*ߋd6bd 9XURPZ\uK_q=!gtv|Jx}<&4z Hadp6#Hŭ'MߴBjqKYQTV(ېӕUXֺ.2 ިRMQ &>n{lN2"QH- ^8)'3Ap:S؞sl+ Orq Q ;{DDL3,MQ QE$QTQDUQED\ZA-t xSWŘfi H# C ERڕ7PP`r0Z̖MsMU?A'a$$uG婢 <.}ȝ"D駤AJpF.d4Z?Nwsm/߽rjFY/e6fJ!;QCȣEy!S5|E@M < b :&E3#]|ݜ厳tOysTgHYaGo|@'I͒wpٲs|(R? Cog>̹Ξ #x_(:H~-IfOtD2o5@|gH1@pGayVsa9iyQ3OYYBCZ1H $$Y&(p塑Ar1[ꕰ8qr7ۧC ֡r$ ,6bu078G/y؜di<,+(teE}^*}Q{RJF8( mOXG bPgɃ-SR"cVoE+Xv}~w dOԒaH`DE!$y:q϶}qmv, hď^@]f_Sƌz]dyY"_Z6Q7jUDG&Л&EOFg/$ÚTVO!H&Bw'ݗ Т/ &!DEP D~::ƒOٻd0܊TPKP*>!FÀ ؝xGiSJMU2~3`O^g${\6I$[tO׀@o J>'#Fhq!P 8gNb'K#׃nRL>j_mQ?!(alѤy݌4qRy 3G+}~6튧sPgQMDwD·j`l;pv\S>E:09M(BQc`mF,K b|y*,0:ʼnEejKvzȇQYUW+$X,W?v ;;EQ) V>͗n9|;Ӵ;NeN'HU.G{ɯ|O(K{zKE,HKciq.bNdZl9œ@w} DLwA(nL! Os.:8Y9`0QA`.r/Cgb'CbO.B A'f{QioR[Rܠ}聒';mP*&}W( NH$1!#c ^0(>g0BJG(Ey Dwu cq .!Y."s R0Gy1UE Si#UxVHz^߾&XF{IBKHkEb)' ʔ99>]Zʀ32t ԄEeCLXk"?ӊwF׫Z?/G'sl OMM_?$DG1h#fH3HP1{bȇ?DӊR>y&NHj8a$' m6k!n!LDȐ%AE F" ALpIhRn0>S R;eaNAG1i0NFi.-TKXƙr F~#S sm/0v E?Zy X03leT57:4coCei0P=(5`L<&, 3Ctoˍ~U0ĝ3ۣRcc!F'ӍOOz<&F=W-xl.L0>jӇ|c o>E^~g5Eݔd'7:y)B%8SP6&"BKGj<;$E]b1HSڝ$^l4FǩbOur)ϩy"(Kq÷mp5=\J]`_gP⒛,136$?WwF[(Ň9Dpaf+<$8 vFIX_][ uyt xj_lb|hjT`?Q?{I9Bܔ[KӬɿSv~9$Cd8Y6/3 7"lN} rrfdTFa,!PA;4@*<O?m=jO_G]}7//:p9H܁S+˂CDL-S >g&p7`|J$6U3aX&!籩rC3}p|"^lgdZ0dח2 LԘRNZ&A"3)Y^.D`x'!rbb "$OhLK=({7ظ #zSH;qGHnev"ι5XAWVAԖ S4$q5ZB_- ol @bC1 /U\RōG0~2An.'[n"A( W G]+;8o߷=m(d}ӜyTs*7Ze3ZiV"""ކ"'EK|49ԭ÷liJhb;!!jI~,,v0V.jbi)‰v%P5s$/}Mwy93ekB!&/IkF fM< QNq{v^RW쏗x7 { _a!_.D8X|87/ FT ZcLJ 1e($qXNr,(myM̜=e~EIoI2^]8uSG!Pp R*8p`@9ȉ$ȯKB{KO>;#I'q72E>bF(9Q<\>j>R $2da9ML!g$u=ګBn8H~c'y6U;ex +T$Fr,@ւt.jĄ"V,^4l @W u]uu& " "֔6US]`$X;!tr2Lg&Z5p{_XvKVX*U)((D44F` ʔ|NCc)ʴ+5aG5.ٷ=ǿۓ g ̗evHG욻|lH9偷MyliBt |!"{ [D,3y4ݢmT$s ԁg^z y  c6H5h>9`jzR+ ͷy#@r #x2!qHhp(-q7A 42r,١f&WSH0y4ӓeH!r_>hGTXb&X``@z۱""v}%)e:1/<8 (4 3u6ȏd糩Sy 6rQj;|ƇE eZZ qɊSӆ^՝lN"X$C,y)ؼd'`,;c*0r`yǨQSy+8oe*jDN*EY%FH'c&'Q [Arjޢ:2`m#ոhuv͇畘F3΍K4%cH Q ->W*eLy:?fpTRT0VI}B!A>`{@6}(,}^ݺn\I(f~6dvU8u8۲R!zdg5/&ّOQ4/mzp@iXA rF/8c*tuaɠI2Ʌ􋦂;Jr `GƜtA[#o٥ X|q{uKAB4]?G&r gd S XbD\,("ƫ9&**)qm772}zZ>|+]mL@[NHTH. ~ҩ=V1i$9<6&eP]N~Oc:m+R;>iH"{e;':Yz~)a4oQq<ҖX)UWywd_ HZZ )%XPmq\>b-CtXO/ɽ @Fh'0wHCGHkc|ۓcp6d6PoMC=cfgft~'tlt#/9Y-H[hREA@QJ44>,=r>tphTET*UUe%$pp Nl}N 2#`ߌ ZAǓNGHM[pǯ`Z`O{6XaWiB a3R7fCWMN: 頦b& M{I@pWRqH ]fŐi%B!J>ϡ;x"HVPy22i 6&(t^| :|J l$X_``JCHBO v}ɖy3;/ !snS ԟF"[@q~;^J,2vl6nݳM jS=nٷ,A$C;%HoK-=<rt_H6˜==| R*%s/IU9Ktl^_W˹~J)9?.vv֨fh[ 9y7₌(VK!TDAYʙ+V^OEΥ*7b5qZ2!(dYJjݰ͌4 Dc D)_o:SQz0۠?T,T p') id2Qcc!Q|Zuv=KtJ}>&CibE3Q'ՀAt!!i4(XUE { {1iyk Ά0}i)"OD 0FfZ&ZN9bH"܍qՕ6 kf3!&Kr:Q9!!GD)|QP~]z8?Zv k>@r F5Qiۚ-'O-$]jrC2JB+\[@J_L*T>Æ+outxeT*UTޝ)[H ׊UA;~"wwa8apxAxmнʵH*|-,!ڝx`se2YNYTy. {yW0_z1yWyG9onN^ט'@{ʧ4g=cg^ 9:ZXSܼlFxrC90n_aݱ1OiSlif2Nm珥?Ō~ۊ?+Ҋk>oy%db$ fNh %[$iQ&}pka ath5zGeJ rf !_tL#p 1H#4d2j߲rw<0,",Oqc>+V2Tz]IGx'#7øg;'QzHh/;&GP5V_AEA`+,)CRtH\XwHAC &'oه|&<(2LIZD#Pu(:$!NDD¢NbyЩtC86OInjӿ}j=.np&4"+=Ker43,! Zk 0y{Α׵;5G"Tq\pɐ"pj0.c>_UoRЖ(!EhqBDaM<^ 2 Dܛ@Mh†Yfx2%R HДL'371`` pK;A6I*AYғr::苀 `L!|nH&8>n5'j0,4 ❕g`nJ7ZsQzKC)v9#%"КaƦ6pB֞@&cHB5>{&COی?jT@?K_ ㅇgQ:<1a$y{(ߖB>dP~p?Z?IeWE\zɈrSQbyT9*űh9Mhp8#OJJ _|}D)W\_ [T7J#@ њ#<n!޾0=ߚ3N-c$ S4^ `&_o&͝&{!#rmաȥ!``"nqa iMYM\C'Oc0P1>Z0P1\ GmDXE7v Cd{=ADG-I7"Iw^B7ܐ ܭ1M XUVj̚4Kл|BWoXՆl(ogOEO A-K"9κ38asCB'3o7ưhuZoDG& 5m󑝃xAG[plVcNg8XOu;5ÀPv9-EpSuHL;w4-PVCCM>b p4{HêC_IF Q Jo)2([ cL)zwlL,C0J;cR j8`4b!tK |ǯ͈lNnIR=+HFI\0C6eHb#Is FŨ,А2! U4SVxH~^Lĕ T9k\rxYKK_T=3;ɶ+Z,Hn:d!ͩ$z<5Ӛpx'ЮɇL3m):FЉ < J #^ xIa[$;#!"r 9ŊV5y!ނ?@@_|31 _t@7WSσHpq"'IB$(ky,^\`)L#d;2cazo)G `P Z$,\J+7ge1@.x +eӴg0 i #:u'Jc?'MUI[ H05oJ4@4S膦d=~?>u S8*i cܓ$> or@H4u@z/ݩ#X!g0 +! j{pVC0CKwWa(>2hA\Nl3En8͢ eYl9Lw[ltMxЋt=^ݳ#d)~D4oYS-!dupUCr =#m5ܖ1-! 7Mu _!dzuݩw|Ew|~.2 YM}1xD~y9=7ĊD`&r:C*gln ]$ߩv^w?rAՃ gaS$|hh kţ~?8Z$=v ^V0{G\ٵ! Ev? *PaտlNoQQ_\oG'7ꎵ49}h2D'L5 o>ZIB%jIGH_R&V 'q ~z A>nPⴴ <10&#oYl5qf;YvC['>U!r!i8"G}=6y!N5h D3$ٻ=1'^ݘ3t(}WtM㩑=$^p\<^X"Qݪ釉/ .qW&6pV9L`V pDG1wB=&^%^zl{֨[Y]ø?:JB[Hn6kBL`~kJ(r['_q_3{G/{>!=)&ЗU[($qeFO亅w^a{)mfr^ɯH"r8焉Bgm0e]AYZ(:Q*aTH)qi_ B09* >4 gS e08Cp!i3ꏤx%Zr#C5;s {Ԉp8GST=Ώm58aNfVeg_٦1fAAK"%z:9n{Q72{9?y%%:7ḩ{Q U`x5wD أa!zP>@HCsn\C!^ZX Uy=>.|oj[ mc'!I$A jLYpP""(}G~?0)ʹ}_)fQ|*`Y0Qxn×--]k8U9wgXt%#H~!: ̄LȕHO*{`Q?L+-GTb@!2b ~aL2Л~~[l e"܉faf*33"!_?t_b{'j)RZZ O ժ p \܂&j3x$8,QN6Рl .>/V5{[ VVؐo 2CR7Jnۋϕ*xv;j[d0Jɠ!մ?x{;iٗFL1-L_m)})Ot %ݹ}?B`J:Mnp6P@$#5yAIB›p54xÎfH'y"`4^E=Oay+h. )xOg"Y ëdIݜNCPq8㛫f4 Au!ЋgNӆN-~QAoγ_=BH/'-$Ȭ ̙NQcdlo?nv'7KG;}ysa\\8vx!7>peEycgGX]cߑnͷ7X'dM<_[40Gdi sFE/Ǿ;QR6&.#OKx9øXUwv]qK)({# ~E?+ YڜmעI=Oq?o?ۧJVsUUq2<Oh?%MI9_?5> c}?_fGk?\oֻIF!BQlHE;|}ϟwWsa^ t灰b CgU֕h*D湧ï_X/?-B7$1τOm'q9~F\s$a6O{[0p| I7)zp~~Xbǫ3jG!a iŷ+ |Aq'Y[paj15 ' /[jΏHFDC)f8ce2>RPIjmHԇAG,a ̑Ƿy_AJ e}(t?(\1. ɖu],@&ͥ!u]2ƭ??!aJ58&:3T g}=!y:_yTN(¶{ꞗl/Gra@?{Rs%aE#O/8Խ>|^W?.76VT)N7*~5$}xyq *B cmr"wvv?z&8sy'2mW7Tukcv;@wB4<p(/P. [ (0jVSKPXNlf*:M`^}ߞ3 ;AFEV?p@WP61qiA/%2;r$m}T0Lq?nHA|*a7#{0""!M%ɑS/#t}c'}!{.6;2B(BS75 68?3׶ c;#eĉnCF!NQO"cXé/_n>3Wbb]Q.k!>yˮLJLUJ~Cw%6H^x@tǚDzUe_7lNgzrc1) 13@# AMk MXUaJNyLdvyƝN8!ba!`@[Ҩb|e-EfN:1Gr&UUqr-[nwɛ9c+Ȱ}pWzę7y$ %[U܎ãwYMۗ<0q@ꇍEP((8U%1 =BD/eP"ۜNPiSi]*V0´ui5IP@",< 1My3Q]@ `AT2MB_fgɲ d Z Q+zXS`tZZ5%֡ꂠ⑮Hb f1y=mʎ{a=q6tnat$QTP㐇8z7uIXTS?cLm,G`%ic0xMy$2KFͰ6(K61r*&00]*Fj٘(EssH0@+I1  P9u*W2xGZO AYKږǙ"zBbD&fVDiG]X.$Pd4TJ3 "#iL\P6sGiej\O-1;VA%A!QeQ1Q8J>7֩1gRy'i8',l9NmMB*jӡkrw ca115t?9IT8h`+#`jcOp@O8*+;iZ1. #$ 'g U,GS+@7Z)×yB}iTl BůyI<8Nr FSd?{ՆȚbiɊ1fJcZ%we-K`M"u'*VNv;K:'wC_CAճ-Dԭ%^֍pdc)Z9įZ :- $kVM<&]ǡON08E!X^`)qMZzDNVhz2߀ljB!v y `pC3b;35QOZ0I BUyB Y#˹|*empt=wF#UT1+,Å*DU-c8a :|2xQTֱUJS55ҕ:`7x7eD-YJJR{ܪ[q3"a)_*txO>P2 qSיUxm6ɕ^Da/qFl$rny؝);|Ch\Z >F#W{ឫpBf6hh9 Z|)`wJ(#Zb"fh O(fǡ`OHLdz$,DQn3k$YB\,. !EmtaZ$p+v"G_R$e]s3,u 0c~*iZ&c mעɺN+dpuN.gTyi[njJfmV07 )|< Y|Sä clެ "N Dm(+K6%җSCO :MFKQD1,M76jlhI` ,fjXia,b{=36Dkxp\Fa:'|Lud'p<ھMGb;'{,e1f‘UJTlX mi+݋ Up*"%)nUC,UJ<:*$9w%SɨuCrPQB ~\Q䎏QoAܢALD5N|J mZaUhQwNIHeb ؒ~!@I4;y!oȈ#)a\:hC)wbA9>yVL='w}jZMLUUL8L"'̞>+nƌцUUR63Fj" DHQFӭ'&,/O]g:c>i7N*<΃SDeSe _Ys_}l-mi?X y/9&i򑻠j/`!wasM:mq !' ~`˚;4zHF{К#g33s1%AUTrSRP7Wp(gaT:L6(z*n⮓[:g36DV8<Ѡt"%c٥f?vm8h3'@RA PDQޜ/t Kb4'DKw% 0mД#GGb)*+"i8ҋSꩃ5LWo.RIseUn/VhiQU,(FXf%D1а?E ySұBW~Kي:MŖs9'MX =2ACV(M`H/py{4-D^Ҟ*=AT:T܌IgeFP:YQÒq<0Y6*>`y*֞ݪdAF"|Jt !(H}DF࿠ !/"^@"&7k9"q֚ q4%a7ڵ Wh!n̗I:y'7J\zr鷖NTf@ٸ 2ɰB(Fo8E(q>(:C׳>mju9){') lz _hB|FM>HҕS?nQ,Wm7i\riyleSy6Q^CZGo0$1 ~D2?}0ZlHi~}A LS &""^<aCA a0HOf/ 0%̃3PQ%%@\ _''2c}RECӘ"j=z_OH hM&}2TX퇽 }~&H`t {5/~;dY=|Sۇj{A)BHa z;9fj4HRszKxx ),D0 ivЙ1Ɇr Sk_{mĚ`Xs *) >s>}23V$F a'G[T-6cI+Wb'vՠ͸Kl)Xhǝ)΁'V +ؑ)?CC~$X &|f4%f4͖ut]MX[;;5b4-563\&e-сMJe)&@錦iy;qN8!"& QH2<$Br`la%s㞜lU6%B`y\N 9v:fy_>UGtiڏ2w'§,#5yyδ&duǤGRdut䲧It;Iy.v>=D.®n$(􋞑7[ka+"<- q>tDfB(d=Pލ7`~8}A (K6Q!va.[1VEcr$- rgՇ} DPO ](/d&@M]4 | B >IՏ畻- 8}fj@8U|icTC쳩Q=#8U]1UL*nqbC/'CCU=6Q[x/E!N6,>3yYnLΓǽAsitApq4J!̡x8qsrLk>L:ᓆ!by:b.hBm ziT?r//1a8([Tq D`<[xS%Lc225XpΆ,j`CsEs$.GzZs>;m$ s+{6>m ]QSɁM`F(<xG6vQ0  0QȋꃢfI A4LM۹G #g)b΁(r@J! t1J" [cQQ)}}d1 sZ``. || #)R %--DRùRQ(DD=a҈Oq${'E]O)ExX^]L´,4)"hjjjΨI,Aɨ &L!]xbr2d@dIIV {OT] 8 ~}_ӫ*}2 $!&  E>H{LQ$@E08 3_lp3WmāXKHw:&Ӆ"*֠ |eՆVOy} "K9aDa'$ӬC`(bXQЂ5t$[(*S"@J&6# }>|r `p?JJd b ~݀. ~Ȫ"4M,׬R&vK$tǀqs8_T/MBP*<[GYL N`Y?żC{I85iHKN'=ڢ-]A!ehk,.:i=*}62[m-F eJEL㉌AS,ax`,%`TNQX?d g?˿g_zd CҼ8s}bAj~` C bdbE",T(4hѡ h F@BaeN0TҒ  q* ӆ֥Ά4o%]WJDCEm*QÄwt1U@nLF(b.yxp"458 `;UDnW "jBώa]쒸, UA12a> UрX_w?% ?1bY4}EQ8{($9#]R,'ҾhCϚ\lHңտA Z8+sÉ'7 6*T R)TbsP83 sHTĤ"VH(DFMeEbTH\o1fPHPX!yBv|$%#`ha0BH}b"nNwʕTRܱ *:yr0ʎ M^5zv!^+8|㪿%{Q#89H;x\m3.\U-g2Lw:Htiґ& ܀pesJ(QY.%y' ('i0t'aZ8p911%%J^f(X.<|:8pLCdeR,*$D uR# ?8`*b4_x`Wd~S ZT2S(ȈCFRE;b:4,>%6/,ӈP>yt?4wU=5>% R*`Wܴڣ<6aR穕YɑoURRO2V+UXFVv^Ǽ0DP H&ɝ!iF&=!EeD:3 ` Xlԣ`4JIL0"SB8p($u(X$`@Q&!1e`T/a&&*Ɓ 7W5I3'PwoI[|n^UfLjC#cٕ|EpPMC:'Hef[JIdCQ`(]94a}f`fb+/lS-( ؐYM r!= $CBĚGd PP 2C%M~z )V* Bay{WdpcQ_<&"6Jd"rzu'Fkxy/&G6 O?jڰ;qe!BP "6lHh1с>mD骪Pt,)t @p㜵Rm#Dyy|l0CXP{ibj4!_kW[%_'&kJN|+Z1-IZr6tWҽ_Ooo%~Xdxdpy'x{ggq  ڇY~- *1=E!~|kP?y}}RO$w!:z"c ‘"('SRc?H#XFdǴdenA 70#zzdd6ʽ{>ڕ=} 1# d5?;x>x6x^(A3A ^쟟ph  z`=x=🐺CF?jxO9{B=o Hoہi k04F  -ZA5\ #@b'4X-@@ GRfb9dxpgA4T IiDTEA%"Y Y1KeIC?o#xR*N$-C9%ݠ")銨!.r1Z R:ǧqְs< ~:p=Q~_+w;яK~lǔCO_wCGHuwOϵɑﻟ[e;g ]̉w9F*1V3΋g;:XxdEø3ŸnyA4dEYtjt+AI c/7LI:yVU~50 "0v[ n)" Gz 9 oB+z0 H!ZH%Hi̜M)m1 (ODŽTp@qH]uoMU3Kq(lHz r`c xm;-AđI=sjř Ȇ1e 3$RD'h s# tN Mj BC 6upIIN+f?w^)D&k)>8Mp?B$aJd|$]pSJfK8*]|{_$ݟW)΂-oM 9r*lBMaPpnd%S:셍̉ēFj% uQKS&\69)KFVBB0e \RRhtA.G W>i$$z~u̿mu{y䟡YJ;v8M"f~:\KRHƴ@euߏ'g_WV : {Nw+1{R1E5!~{'eCOO q-$+i] $2Iqufh!5aQ"h #&abHqk ,,!xє(ibSwS`d @ɫ1-}wKƫ!ƲY {4Fީʪ5ޖireqRmSͪ yՠ/{y9χ!!LMɢBs<12x fj%d(k i0_*yC2K3T?>F6}z&ǴH/hDH B T&db#?~2BD%z&*kDwsb_P9}GU|-/GeK-ԏP:7ا[R֐xr02gܞy.|N!'-l T-dU?<+|x5HiuC`$'+J:l%Q 9apc :Thu %<'@NT.Q {CS{9&JJ}F vWt7CȈO X} fmñQ1*uʂ0H9?i 4 >A~ǒNͭg-h _՗2mj G-.UFk&9j90S1R!Vx9B(ǗJF $O]H 4(u":T=+#ڤpp̫5^eA}wA]Yx*ٱ1x(j|~Ƚ"0vfvm""{{; rIe̤ٻOmdT办(x=Le9s@B:cbt\q'etL9,LBj f&d15wrY1-/ w` I%!w+#u]G0kSnhF#3H "CQb` ^b ] t>,wyIzP 08,Od9 oDfm&,,Ќ̐NN8+lc9cQe7B/.^MT;oxT*+;T|\^/[n{BGaDa;Os0HR,>U~[Xn~Λ{S|?F-E ꐚ Iކsceӹ_Xg[I D:2`7þ2XReOOqte/6Z3\51N&\o]3Qݧ5yܳbv4锎ϙta&foI*N ֌"@y6lО[آ1#5xSL"FãbYD}Y4)۳+.[$v<]4lK'w;0&`(F+py:gk#⟍lt2ä; 3S;<Իќy\T'Pw\Oƞ{}NCWGϊ_.fG$7'{(<v(Xq98=Y\*bnkڲ`:ܐ:{b4BhBOôvh8&ÆsbDCD bԄd1t@9VtQX!d*QPg+n:Lr9We DCtLk3IE3,&їi$  a٘Qf(񣪰rwۍi ;r+,QuM4'ȈI$dř 7mg[Nh,H$jsg$7xsd=8r^XtIt< d8zS3qdAƒ)ՈX" Ys'V9`G2g=7,svmag:Qǂ|o(bX o*E>1mi4Q3D4 fI03wC 6P&cu )XM8{b\hi2K`C4puѸf\>; vw'0KxOBGI &B A6 ;!6ɣTMr(fGuE&` Yo"SZi#:s1"Ws`:)a[A FDV<}9st4 ,)jʶ1ėLmzcc ΘpDMlH g7r7 ~4VȻo!Nve fȆMp9L\'6})b:nE(fV-t&bd衙Q!Me9~l'c̀BIe32nY}wEk38Gi1@l i"Pp4i9Ci*GI1O! =*\pUiF@:wS,HLj]elF9L*&*1bS;O.;:lǡ}^y؛=m"]dOmd*tT!0o3@4go5-&\d<9nb/c$G:y b3zib)Z). ^B 8=.Qck"[M#WRli2 UȎM.z31bCJ x9¼*]cƵ cҰefs|$3 ͣ KXTR>٩b X#a 9n4e9g4hO@e1`SaNJZ9_Ӛ;MU.O/ׇZ'09t9yb<93z,ÛCɛ'TH!\`=i8:Htl`DnBi_LPXYga2fzNTc j.09]+@#^.\z>գ-$y63' "_" @[0"pVj0ו j ֱ*r*U [ו`-T GIB:]& :olݎȈM=AΔⲎa- 9q䓵7Gc#΁ q0C`RL.d=i$ƺmboQ؆\c=q[F@݂o81{PskiylYϡ'lfTÔPA-DDddtŷxIι20pD8m4FMA]eie)'Yْ -S6sarYh5 80 N[@oӆCo`@7)#7e/e&L(Rfk5`M:+·0gHε!{\I9&,A 'K;k15<Qnxw3ggNFNpcXB{ bc,LnL*qs8fd!PcD+4P][伖5ěQts5y8n91&Bz~ٟz 07 ӳJc̘Ѧ8ViGP͍Iy8f=Oa P"lc™&@`ŕ3(DLc紜udM=b0ဗS&ud`%j"!FV'%a~MUQQx-4=z +qqf1̚HF]vf=x`(S#-2P_.*ꮏB&@f̛U)t@5&}Bw6bΏɶE K!ۭI DS3 :F 3{sNJ*yosL]HsaÎf4{a;M)}3S|2^qϓ\"Onٌ&::IxsRe!0\(&" US1,tN<dLNp4 eHX* u{\4T򆅎gctD0<ʽ:&9@ں.uVCCСԄ*B<@.NTf-:`܋򆩔& R&HXe B!Xg BxMovQ3'sTI8ae4֑jesw&pUSA8*Qbc& =szN.OMWq*P |, nbƕZ ECvΔfC6qjh(1OΧ"Wy~N/z;)hx3 m<'V,`0DbՏ}$iM@`,X/6\>q7ZETݤL6 SG)q{yi 1<&koKehiAQ٧Dö4X-qL ٦;sF%C)gs6@: q0a :W+1ن(TO#l%crcq{&v!vA#ԸX|koB2Z i_m9XQ`Ge` b AO˵]|A$`(HIR55CHyP `7!\'YTI s3xⲆxn~w#mT}&~1`! bnaʆ !t-Zvy7ݹ?R.WoO$qJ6oyn ASv;z_wH M$M7?JBqx0TmdSu2eQ{X(uy6},֢8д9 u2v\Ȱ1ybS1_dv5 !sa8KzM8:I]Srj sWpv+"FLyM;i[6;89sx6O8.J^D:w|N&,nbYr-)|tȵhBgkDئA$q7f0ceM&('Iiۊ",`1It1یlL@r!9ed!Ja4'DY- rkճ3b #sf\4};puPBVYlx򂙱`A0OQ+ޱkD!H^]w752 )TB9utŌ*y!H"yF H(MÆUIU_ȝl??r8ߌ%ߧ:?sįgO-߾hЇvʔLG4nhMGEN&yƱ26Yk=U}}OdU4?4@E9BBl"j[QVt diъ(Hgٙ *% ̍(OWH! '4\P# |ۍD!Н C B+?Ysv3C'!yҸe;Mq[*via(^`ea1tx;,<[ ):ɼ  40 9Β`9,Prt(({r.7d1E=1P9[;aCRΏsj@H)EM=`c-<6}i,2K%)K?q~rS4O۹{*A>fNJ:q,-x=/6`CÆ,*"UD1S# wv>+ UKnX~H1ҨxS `L,:8n &bXIl7LJ&Op& 9:HO ̤&Ԥy6jja?YV6Dd 1 ,Œ@!D$`䃊xyCm)`#8)їB7fJ* ށB8Ye[5gLS0,hZ&o=C43"x sCM۲stiiEv*{ڝ]^Ұ`מ1+{\ul) Q8>KŠ]ߠ<LfF Q*9)B缱(ecE#i8,a(v}Q4(,5,M&{+v!02Ky!dM;ịLZ1-h( K?v,_O ~g=հ؅FH"j#N3aӾ6~q^cfI 8~2A4(j0@l\CuEF-(Wۃ&A%IGP]=*I't7YB=0XHT9QL{QޣJMQ7t]" $h&JP1 vxgx{p|d*j,?ya}S!ﶬɎv5'`!\a1hf}6Q!6 R4Kݛ *@2Vt̅&C\8qзP^j2f > #޲C5Bؒb>$Q{B~R2iJΠD9-4ϊ~(yᱷ|L'mѩ*L4]{7= ݁Da QA.ihy9:Uj]"7nSa~xU UgQ.ŢUAB{rBAF:~vMy5,(X,SZ꩗ה54g(KV,ƒyʥL\xo+FoTUQKѣ% *jer[">NE ˌ3G>e^ J5[^.l|M$w?M)6XXv=kRŅ>ȯR [fAUP=iݡOvV:i$N_#Sxw$?mH<QD)ɨG,D瞧l=Evoa覐!Q h1; vz,J&HdŔBK41@(pjJnv JM#@jֱ+.n_ L&-N*lMְ ##H<((x'BYLQ1x'D\B_#~X½mɤJaߒTbOsn2*iٗ,)NjCvp ;)+(^#iiAN7,yfr[O[-|*AyD}cx1Y.Ӯ2agr@ =_c ςn8pD: 4B@$9:J8@i NЖTCs.)/sŨ^ JXJU ]Q듦Qc}2a#[E Vo4 Bx'557E *MQ fYǨC 04`CI#3bT0)iJ jc(ym۠<)UVzTV*[d(4QQ 0[JkgEO>Jʅ c/3r=ǚ"F=/P;ZaPJ!F_ 0 fbT5n! >H*9QG opzo& 7zd%&&ټ[<(h4ORB#ZB͏~HEo6=BkJPDUT U%Mm8E yXs{0,"2#FX0!qB4SHhče(b , ,SAT9= &<`p1mGUS)V _zjb(EE9='!LZ̆ qA(Gd^Omn;A 5Z-Y_LeF&,S׭OUAlC򈈧?tC U+@!z|v.p`.l7,Wr5ZJ68;;؜YZ9)Qa4lLL{'66x!F(ZдBYJ+b^b# 0P̥ HrS\#B# ZSp`)Z,h A#ަ%iR5Kd61i񚟉BD'9/צSQx"mU^E-LZQg"^R@= %SUk>pӐy2UwD30RJ089{MTS"Xb q(AO5(΍ xA 6IpY, _4Y&8R|7l[=|j"Ҝ%WcR@d0LN+5h9HL$ eŜGD Sh` T!.j DA!Y14!R02 E,0Mh"((+c"3P֌QKluYz\c ci6C,54J7v12fJH#g,d6k3vyߚʩ'4a#IB`BK'4h}j:16,7ƄQBͳB:06c?]ʃ20+*VZU d-"$JD @L!T 8=ܖŒ>ZqZul %7$Y~Ifmx-YQ~٦ٺ u.)~_^q}h(д 4dS JaEU"թ>#>zk<\o L@fU* jTf0HiT!THH(&@" )G!Xi Db$JBR "*Bd'!BXPޔԄJ4.f 14RMBD%0DPTL Hڌ%-PPJ-PHBP4 .'% P JF# %tCB OVf` ?ݎ~F<)"@ >U:")Ԉ|eMZV UUa䜓8хa>c5-ҹB?2SBHPԾ 1,g!WHTELQhdhHy 0 7M)J " a(Onx aJ C2L)$<@PEITDpZ*B3J77տړQ"$59^+@b+ Wa!9!@psG *`%(f""%!& H"be(&jb$B(I *HFMEE4MP bPQPޭ--ZbH^\|)JEE9BH XxJ4uTiX( D8Ѻ1>蜲 #H~zAOG#E5ވRű MM2iU+%c x ϫ?A{GKPi TiIaa?p. ;yK`Tt/rc8~WhVx ruTZBxԨF!I[ғ"w}e°>bl'`U<ݬ`_ʖ4EPÏsi Ó}4헨=#yz]!Mj.ǩ搬ٽѐtY3$8vtb Le_m,9tF?fKVTȖ$ ؃ّ)DPئ}J' (UIIfD\#H`S *HU R!HR bQETRAyD pyrdXo%=;@a'deVl5.4N5dWlu%B] 6O{i)V!(^I6Q}7g.xCѺH X$E"^ˎYC?CЊ γG-q@GIEЄM!pxPe Ax|Pyb lKUp0gUF)7D4IlD,Ji1֚k/ؓu5X0HiИmmJEt$y^Alٷ!i:u$ #ӑPu B]HX197ױKǻΝu򞾡+i;!ȜqK~`05u1dD$UaĨӛP*YtcEٷSf)hW%9>לP ČLJ#E?Kl" I:k4 pY/eljqp["O0$nIk\T5=J*.ѐqN^pK,`a h;W͟ dRgF4QYyhPfNPAbtRzFqC181qن aY4.n+L9Dq@Y$oIu a o 򙻌pjMWXCI,`wTb}2}/;@Pжr1[ `qSFyn8uYwW2S.ӯxAXPD#Gm0cS3p5 0&D8$%83.Ax_IaN8dhd{}y*swE=P>~zTsv;u{.v7bjUW*OǪ#uU, k]P}]1 ~2I( YU&&UO k>W'e\iwx&A"c> nݲaZ/ҰHO(,*@ZA@(Id$%#ƜxK(~`!C􄆟pQgI Gω6l~n#Ɂ=$=>n'Щd3X#1 ` (}@Rijb& 2nH@BS"ƍG2+tM z2Lω;~ @Gm )B$`B3\mt1! ! /Pcq=zGvF'({(!#XS Vl}~Cԛ2E%ealSw:芚|$COQ oPS l0ArN 8x8x0 syBl&BrYa,!F@8;dO,x7FZҪVGǔx:rRw0z茶Q]6g{1X8gLujf>AC4bc;Ò@A[$j ,.pe!ϰl+ lʒMY!Yq(w;g{F"9 ɃY8v6ʍf-ةmPx: Ya'vE $){PS\[F*f*Ŵ̆.CLq  @ ~/]nH:k4efq')(r!Ϲ_w#~kً5*55a?)%TlG2zwdكQ+kPC DRr9ƩMkz!X(;^~0}PtX%^^>1'l>]R%d#pn?z'bs"AϦ ԜBd[0q]^W2MѸIӳd'IMp6D ײ0!يdߥ_T:J[z~p^/ffaxЧ $ߞyE`M&Qvʝ=nг6| 6GȟQWHb XhRΩ)yݧa }a& Fi\h*VUBda!!(h(  ai%%0Ld0 "PXD*ZjY"X!VOY)f*B `IV" RB &D P(J*R%BJP"#@{gOs2R@#zؠ_? rh%L'q|_nOUy@"C֜<(*О&)׹=Q`@ PQ3H$ω"F'z ÖDL2PRMDU}P%*CD„)@,2T)53$S3L$M`0 Y FJ0Lү89P0 DBdPR8> RC@p)^CQu2n?"HnNF2Z ~x͐C>!C;< Qs||j?%?zL 0Ué2|'~hsLH0 l\bI9děN6AN4D en I;:} d1x]2@Nm |$MI94v?Du$$ Opݠ).`0LL5ft(B憈걄^q';Ti[CXeKRm8IGE8sx98l%wFDm#F7D6>Uu/ǰ]RE(V*PDƱp':r/v'Xςd2B" ,2ZPz!,t|^k`0KD,dzOL&RX8x:cH5|tLD詠Gg!n luMoar\3*хHhYn ¡2i 9(9`áGA1"l9Xn6, 8d AۚozZU[Jk  ``hI; 6raP zL`xOf#& E,9G5 JZ D%TBd]cu-EY;]=[Ꝩ| MQN0?AODd? ̏>Wfx'aHL6ȥ8^֧Y]" KTq|+1I&GWji쇑K߿Ñ"!D8`raKlesId*r)g^e:Z9jkCKQ1@uƱYhϴqΨ!Ka y P$VD0u^dbĘg pDۛp"W|1dYe "iB|. !c&DyڀDJ<4!0bg G%+ RA6`Zk-N֯7HB!2P5CBy  #IIF17=HON9Tr"[UGdEra|>c AةBu }F3Aljdh0A A!neFoYҏI]-U 䇧s?#)ڰá[+C(H}Yd]Z̉?`H16ϭ4- (ޔ[Qŷrb2fTesE0==C88;͡aĞ N<L8s!L%w:p &t\e1 d]Q7gņ v"6h { 5hm %/8(YnE@T!sv|2 JQq6aȋC{ԧJi B7Ӄ4!9lFt>hBQNs \ڛ5* JB&}Y^;9nؚaQ%C ",L([ݙtu#eŇ(Rd}' a $eT O-grfˡ]ng$;HYh)D߁p ZRN bq 0jfKIe嚴1"X=-I*_h"ŲZNdE5; N.Kǯ(kl%-bO|dv]SR̍Í!s25&&1>c-[48wJ-8Hfp!fɳh4wK :痮 Ç ΃JI:,]šoɩ DK1S_Q0ٰf.M0jFRcQ'0N{35J;yx|]7HjTzWnSsd *1ÊR-)c.W8KTER o'b] gs]Yq 'lVAiWi[)$*&tY \E@\)ځ19ٌI*&1!/dRS֔ar @et'„@ Ri)w a7 RTTNػiP)!DP6y _Q!UHɄIP I#>*ԉp!J{[ްJ=-Z,ǣ''_מx#o}yjbw[+Xf M;Yf=qQF[wF0; _(#= JB^T=o10'bɣE ԴDmTL co1k9N?|1bGZq/uPs*vg cs[!at3"{{( dD?D(&!& X='xiN>3 LVH]Iinb~nϐXGWdNf$[$8dRoLub"/1tj!VRﲘ >ufPAg$#-ANq4滳*7UM1,#qxK׫CN-P"{;3w~NCC02<RL&w$lUE5\J;h/CADJ""""$DADӞJ*"xSralٕ ϟ71ϡ1ewot' /6]θaI ߑLO'70AaZIYr CdrDDdleʇr& QB ECt@""!08PL, + ԥnHku1eRC㎧5z=q HU%\Asy~uz}u_¸/`lND:C[U-T&x7wnL3Xj`Z4und؋A5!z| sf4YMA|(~SO+rNߏ~DcEl;my5ES_K%j2Ɇ3OGupS$HBcNh<.~wa?6}4,'%u*J};9Is@, l\ 7a~A.RZ)&7QRpcЫaЈڙ")Jv l0YwLk 5gͳc4ҮKv:HY.)c2;d8"m#Q!zxxv"fXZiJ(@;B=Χ&LۭY_ߣޒB|u!!2#j?IF0 VPir})[mѧD8o1XviLk.~N:lD8a~XC%Npr&e1 NNPy RnIHY$8#ÔrO aӒ+8,$ŎGdTO9!iHb1dA(QSLbD}@ҘJv%(Nv 2o jrb,pyrJBCEaBL2b"*eqA{jnv:E3)L8Hv2 ;SH+9H2*̤e[Ǿ8ޱ(7 BB qtƞ y h* I #fmU$)oNsc|sBpΜdZ6"TzeC.&z'GѕTa3iGpҜIt0s|l;&ԝ-BOL}D8X)Ǒ(*A,#4=̉=,) @4/G$궲Tc1>L ̕/'|^qMpǡhe-WfTmbPB*ߦ0Du&C$Lm9DSP܆pCaAdZ-T]H 46C@B,TJ} C;I>XrCG\|;6f=liE*EfLԝVg-\AacC@aIŬ, ;gCQtc%Jn'?蕰$( ugáiSGşQv@|=;9NGzz"P|!qM_-3 K'wa3#*2+mQPArdKV&0h9mmQlumcpD~y CDv  {14cl!D=#_(aC2$Xr8Ӱ!Ƃ"  'b;9)SPaNRDD:2[e03)H6c 2RY)itB`MI*AQ&`k 54BB@@(7:Ԅ(3 mH 7SD԰c*1g**نI6.; 8>v*n z,%'Q~۔Sd!X|lq |n3lfn FfV"l"lTcȺ $ [cϩk%_A'٤+,Tl )1$ 2eD`t>&itFePHbJ>I0# X6`dhFΉi#rq&1ϽftiQ4褑90RQ T[c *vTD>e!}!p%~8DZ (‚Ťq,a)"D64">8v"1wnc|l?3 oML~{aAEJCt`2k{rV46 5RSļ:[e<vlTByCްig,k ɬ?Dk T0^RPb'ӔMUǎE,LF $a1v D !)*)Id ,J,Jq,s b͋8&ͽ$ NQ:^>("^! y0*d"BiaM`#1%nu ):%uoZ 7 "af$6pƂvRX"Evc&9PB$+T,TZ ep%?) , *$(chU8RW#P,00` hs9-VH + (,?H ({b@b+8nUR:f4jiAh GDA\gNY$a,\@20L(%HE )؋L&&=m:-Nx)# AH)PH B)%:{4&$JDz@ 0bB *d!ۃ0r &$""b#јD11LLEML1iʈdSYmV&ј=jg`x60K6BjBq"FE: #=뺸g\B; x,O!o?^>sZ۴7Yϒ#<ˊBi5' di>Z&V؝ st95ɼ@s?s:bwJ~}f,n_'y@gd}8GOTMԝUCƃyl#žA#!ן[\jCPmuHu}S?{Wr!s =HHeM9 * E$:bȎk |6,?!>l#=k`yCqPW? Xqb*~oam_\ :%Cόa n3X*jNeJ$ʤ9Hذ2lT9ЬI8P:0b셠9# D \#j'$IΑe9EA%XT?dӁ87;Q_hʓA:@D3(+,QHL0I3J $()eІGg- d#Kl*D`bKA`Ko&BA@iKee@V B`"(& ¥ZƲB SYNB*1(X`CA1,&rq (.D ,hY` oS-HƆDDYFHJP-N D1E!Dp+4Mi0Zn64&hs&(LH^ $1-Iz*RAꓱAHZNThTr (:W) X&B P.LbebZvb [eQ $$,Kb#H!-;z$LeGЋyL(!<[He?dbŦd®pȇߡxBhrUYVa*E6B#Cz~XJD '2G9i8͔oOi,O^ɔSBNdˆ-gzL0C﾿̼'Td)0', <唅cv,;g|'C,nORN fMX. qf9e k%4ap2_B4`<6(; 'È!M% DvAfs=j$\@݌^_#&:ŁdOFλ)k@5ovzms|NIJ&]@@//)l`wlLY*#tpM2fnI$(G-b$4u`k`POѠvB+HR!+̂oa`pGvڲ&6zM㌜=myXǯD^{uIV芮}nuW.#3G ]Pގ  CLhRAt.Wx>D ?ȅ9N\IT,-iNHVlLp@|T@/C+p**mN+`%6=!!\ A$s:H#9,$9sF !V|}>/x809*/,/Em1qRڨ(Q"nNke˞IMVidVՂK*?w>Ea$LՆkYLJ /[fIt tGUHiP%rXHIb$gACP+ B>@&?9 @{ϦC鑙7]@KAI#$1Af!!W *)iH%@!13eB+H*gݲ :|poEC />#LcW wv#ΆC+!W>"~POHx3Ɏ$a*0b{jh?t $pzDT*"*X<ĩ8ȉENH]*/@?R ($]v6/Xx1CʼquT0#[8 nPFCDNڴaXiiEB D$qM:ƘXFYF#hw>*lhzf,}'Z6YB( zIĬ&?^1ȵؽsۛƖ%P 14ǩSvk瀲h>w0$GR&lEKDwx! ̯iJQMrBLpE\4"ȁ)L?8A>kW3QA; 'd$ ;vԆlV$C ;L[$0N[ NdpDzFYEOCzRw~?q1Lb.VUE0kԦLPNŎֲd#$S,nI!N#B~ 0{&0ɂH' :tHx;b]~5 4X a*9#`vԝ9$ texj-VbasXa;;5HPA)@4H%(MUddgc"F,"8Wa9N]}oI9(TxZiK ȦやT:*!ASȄr92duMLbMC@D "T$PRb^|A,>1I ChҬ/2JQ% <; w9C4TE ҂R;$(59#!pةiRxbqZ}a?n |_ջEudo_Zut'G}+'9\?F?U;9)M]^f?ͤ8 'p=M?$Gs1p,81L(#dR턲11u:8wqQ V)Jp1c1R=6Ys |?o+a4 Q]A?Ai0{P(&b^0{MMt2…7S& 84)ae0'"w@% fF(аӄEb{L0ߗDܖ4K'N9/T"V@B`Ns<&AQ8%0,f)dq^d2NV1x[0eBj]cvep9jrp[C[duTxΞE@2{d'_%g{kHy6t&X@(TGXs#m%hHq9Vx٬2ZcLIBxc @hӃPNN%$Q7:]MwmH v'jajq+M:Ƅ`, d '"rT j0B=aبz#2[ 8aV(W,q2/pA-6q YsجQnBtJ_)iσDINE"2`ɂ /Y`12bk\Ha ja0M9ә*n]2C…#1Y;!'Ba` NÌ4 tÈfUEkG̡2.ҹ `vGnqghL!$py32:1Sp ?SQUUaz! J`Kt-`ږ%[~xvuTu0v-m 'T`=}.4RW&$CLUJ,bbL]voxNcoEc Yilnko"vۥC5+#;p J*DgW4A (zE@qgxB6!ѡH2Œi*lCglDA39sU!l9OQd6t:-|wVAvl f%0'LHL }F|' b:&awbc1Q_Tbō ~gsH K60J<ZTiS/ zW77t$bN1*+M+vzleW tR9=y<=j*zܴj j!>+.աpD=R4" xwela`2^/að5yssN U~^_ܫbV)Q~|Շ'_gct,QM,loӆ7֩pDQK<\k*JMe4 dBk~aҷ ;?1 8= :bK=0F "<7tOZmr2j{4),P[3P۔(Œ=yQMպ5;6\Zd&o m 6lCmIPp+QTTTD ALNxx4t&E>Àwhr 9EE0Bz_CMAj=(fHbw.~Oz͕=(` h)ס*&uЎ%)!SyD H*&[gq&Gpt&2\_ T&(PZylC3`N `7^ 8h=,>=F h |-ՏJFR!Mu~l\̂ڊ ָڮs_״^ԪXƒypr3sh*PpZUAp$$7^:w4)$CToЇLBzq:Gg}gmYd `O xiꜾ֓|9D L{_ ~SpQn!Q/3+2X|&1إl!KL#!%,$$ bb0Rc>rD/UNWĩ7aczBzܧ̨V& D^Ϝxhh221))[gmo)/1e}DzweY'PzA"`aSM~d5zru v$j;F7f*N{%l."ƭGwBC`L#9MM!kMz|xR {L{ǟA V%aO^DУԞ:binB /+.p DF0q{5-z >;{LXb'Ȓ@Va1C "': )x3C"l>dS/JZ;=@>~qBhj/+,b13jnytGˆ d8'ƴ>._j+:ނ{#HkoI\1@+a#_/aהdv# o`LN߆wXm 7ŝx>]=po!g EyAcXCz|OXE* -K*Q 9/i'^opI3Oy:a'1¤>c߻`K>rKJÐ<ҹ ~aE L`LCaL"C (p~~ɼO?)(U %NXH%JSQd,+ʴ;I6rgģ.d}-)( df8@u*Py /F@ QAH؉cSF=uW̮̉?TZ{5 C ,;M`F$PJ!  Pn kKX GW >S]zı8xS^5T$G%b ! b0\i H$jEGoI'~"~ͧ806+ՐXKam& /T,Ӹi6E#,aC-L',ӼXe|#'_D>X?2鉟Olo5;(,"d}5VhE|<HOR+mFB%S`xcGCyLG/k*#A]AB:h,-,Y$)Fm4MfXSA;> M('Q JtByrS`"DF+>4|7vmIZ*edY[89R^%$c(00)$! f16hn.3F˳$7#oi1Pg xaBf BddR x#AV_DҎ0d 1#JIR&4҅ uˠ(R",Ӄ *rA`F@;Ӊ,Q VF@Q %KV REXp R,*U)\ Ȥe6A4eb( 8&#Mj؊1A8Yd$W5j}&c)$)!ڑ Sq $*EKPƀ\H!)O] R--"ǃ%)D+af1A0BZsr[F PbE`Db*&X$a"Z"LFi)Q3*5mQD`*v_{sNMV$+E-jf-2ᅦxPl+)Y*C4\ 0{ۈm:biSrϢw]{v,2*f:Ž|8:ƴnrn - dRZf$:cO BdiCZgSM6do1rƒ4E fA'&W%)A&HFʚa(M`F39$(ֈNOPbSpޱָr$ "8ߍ#Rrar(ؽ7仪uAlV|=~ N^E^P5 4E0fZb!$)]6M>h?ܺ‚Rh(R1\FP`Q{Rbnq&7CiF)`PBp7 e|[f›]N p0 O`D&8-!h@.WB|U)PB@2‡t )JBaS 1`$eNyGwNu %*l9D2CEOQ]܈TOP55V&Yy*a%Ց3 %%+#ay4۪4lDB~@1G0@K!-%ʇJ !@q$1Y!K@,hB @t*,j|$g @F4]{quraPɮڕ06!! \ Buct t0sQޝ9P񊔄& QyTJ d!N4, e3̔ Uu⍆x9( (QiRu\Rs(Q Y[)2<(t3]:r"sl8pʕmFaBfdز!Jؔ.EL%+FI!P"i5 $f h}A#c'uv~hoD~~#D7.ƙ3=ߜO ~ u. 4QTS><0r;JQBA>1xNoX%:,0)g"vKl([aCDR LM3e)RzG m>Q÷eQ@r$"~p_Q!KM <[,!{wRhaSV<℣wXRY$UUa)B0@Ba`JJPBD$$U=)p`>:Kn0z@$)xP;4tLU0F X%tR%;UW}[9Rtu򍦧i看-7 RnLމh* ,HV7DBCEBlXH*I$tSt{l~<JBHR "Ɯ\ QԖ 2E B-X ͯ6ٻ91cyaeQG-Y =w݁b""fB m!⊈<'v,'c,Fw֕G~ts0pʉ$ SpT9iJɚD9N98|b-ˬgAٕ=K h:\Dfc(dqaXH?5J_unnJ(s 3!D4A21*+ލ[TAf (Fc @TB%&*P2@Ҩȡܤ ::!^4 $A<Н̧?)H#jJTX^)C0)DK42 MBAJPDC@F'As11JH4X.0^:CGE4N_pD?`"菞w/$ xR`_oE9';7QPv ="=P;뇴p!X$b ". ; Nt-8&OU D^5ٯåQY~dEQ?G6JÑi܈z "Ap . f o AABr@ M!NYIb(C9ac <C2.PN^!A,V)Q4hU\L0D,I3x8"E TUD"%}HPBC  (zY4Oc HThQ"-4f.DAԦ(hH*0@C"{|^`Le!:)%HkJ&#& L,f0X(1xC*b*Z! Nam )oIG(y^ t)2|7L~Hؤo4K!>:'F@deAa:,[aw +X q-A N; (}~+8 fA.m1@DRAUL0ɘTJ33 x H&%C)+hE6N&}m.UCAw@hbyXp49#Snw>|#SUiZY,SSE;!nɰ2FD{#bn3jؔ l7z"+?8!{Scz0HtrK$0X97LG!Gت?)1o|t9y=z7{86j'].L̥)Kd7TN5jFځv'` խd,[pjj&deNNj`x'5:z|yY_!ޝt/T[{$t5Bq좄) B"i q!hGx찁HH!q0O1FtRhU^-qz h)GfL 뾏9b = y#-{CC- ++Yk%Chxvr6Dpڋ/P1RI(1t@y;Y,dF‚>cKL@v-m6 e( .I609{[ch/gODaǻv5KzHN9ӝ"qdRkcNC xh67cgq@w鷷Cq̞Dt)4JM9!07ȇ]Ie{cLm'Knq16V SmQ:fBÎQ\e%b3mMs8ČF9Oy*bG%1\DăIb8x|3{& {}}ȲvpL1fbh@haT4(XN<+ ^NّG ~ī_; .IpȒɚdKm2NsAf\F>.g@AG0|-a8B^}s; Jvov pq d'ACƙ- \ric>13kڭKbs!2m$2{xuqh5ZDIEqq9e ՙ0y@8qhwv7zgsAS t1kMNx|F;6r2.0" PO #TDpBjΚ*Mˢqׇ8ՎȠjjq]*EbL] z:s1".A„;&(هsOrH D3F<-D@ޛ^呥pS&ȴ\P DҦK*D$C@C1e<G=ߔ<=r$H)5f&J2Yp*g4Yh7 -oC=aǩjsj塐nQ/)Z7xb/5T<:n0!3Me:Z.9Hϧl53^[2N&Z[; L &29@ : e!!<[؁lCu쾱N-3ΫyxLtt:nqr?E/Q͈㴴^T:>2&XZ.GoTV|fQӛIyp9M ʥ('ӽmyVR{I9}u:U9G!,t=Zٍ(&KܿzSm!>r 93XOȨ8H0M7< No_`@6Vc69$ buLǑ4,D0K?wf!pITSw*CБ׌ _zK9C!d`|/GH:6TAU1$N1Qc-;ñ QFX`8;D)͏GҗCуC{p-&-=Yۥ'1;v%3v~&8dl ?0(:C)HYχ(c$icP,=,GS}a(kװ')em1;I@y`8$ ƃ[>D0bsG(Po[ ')E83d2ݤg6H%AG_n:&Oo$yEWzztcŁ{Cǵ)E3@-] Aqq9''V2c4cg7wNBvâ4HQ# S`q'XQ5ӹd9~߿@_8IzIP;3xaKN(>$$?9xPFbC8i6Is='>+bjY3=*1NB82wYf31s[S" ^o$46Flu 7hJ{`Iۑ*rjF jqt6c0aeŚf\v+P@h@5inl0mQaɐ@ZFӯDF ZIM1ï[deL>gU WYç s~v"tuό0S#:ewH^nu!DO G #bc8bM5):BqdpĠN" O\pt:HQ01HdIl[l?F ?cg UOa|!\0"|9rlP9Z*i(hnt4/q _AN?6Hwv&^$b.Yh@7$4E:Ķ-*cΏVOl/ r0TrP)JDp J  DLm N:mt8!i3.2[ÎZQd1Ғ0u/&\lL 4Ҍ8]ʩjsNEkC'Iҝ#:'m^rEJ&I;ZBZA$SN1$@8Y"-f*38.B!THQ,MoM31  q)G X"ŲIN:38ފj֙)S]^lX"ME]R@O:닢yЮhȸ(H;&!E{ < x;;Ǻ(={T NQ0)>yG$MsӜ1e|-ޗv\FIӑ.:JxPu 8S /dV`9a] ̘:zg&T'5+G|DCp<,ugcIAX"(ifR bbiB"B: 5\PQSFd߮1k ܰETT0I2RrB'pf:TGXۜ,Fqֺ4h 01Rj92)=t}ݿF#t%*{»'"nA Pd;VyBV;q Q9,5T&}ö2^|]ZL<)9h:1D6f`ba2ܟ>8_PK kӇ,=U*rU= !ИJH8i<^Ke#RF5 |2z`^V0h) ?[G:CIei=un~gia#쀾NmO5I rvn=hk'li{ `aۀ,#Դ&ė "D(,Ʋ  $IKB/zlf!pB1 VQ'&ŚSdf,nTȵt02+Xyg˵3$j{0aRkb0Czǀt5=4`1cϫ}[5<9?,E=" @Xx,I>rFlOx "E2 A 4z )]q=J7VㄿR~(' PqP8^_7}iԠ*n,*j C~ կg;pNiHR tJT Q*KUXCX546[m$i4faTZ1Yb*L`Q1 6f@c&NY9B”aQt P< <KMQiB*pS*zOn *~!]B"IuȤ꟞j}+V\?*짰"x̉$?y?"`ydHF쬌Ǜ<mJ K\yi>Zi`pHIn-[<;)6e!? (g%)aLqk5 z&pz 7A')\uEL+KM2WDH0)9 B⦛"kMaTӢ4%BQua -ϵIH8 dGpds#>[~{6U*#|& }L|n득m)xL-Khl}E8D"98m8 61m5hNM=M}nxK#I*+iFۦb70Cr #O#8y'z&_8o)l3Cୣ$2h|'&.G͜Ef--l`9L$2>?ZpDTP@y=NrI0rQ n戕XL އnBé&DF tDuUInneX$SE킦iS6p7V@% udDأ:hqM0dh!8̈=$p`LĴ2A1e57 (I`2pɃfFm3xjChl5@Ir@$)̀F,;@KC #ɻb DS03 (1)]M`36 u 1d6K b ÓBZGr(Xђ[H@!횡V̒F-lP9gat -&i l)f$þ+B!Ϊz}a#O-n=i"nIdr W]V 1Ц.wL/)%X RPt3 :X͝r۫$PP>L+aHə&l#eH0d1a2_-{ f[=o<sR$aL9zdң|fj"Oab P#ˢ7r4] s |#"H&F66Š+iv&y3uƚ]3clqeyAZpa`[,lcfq#0Nx0HlH?)>G{cM#px4:ИyrLMBbGZ:t8qY!c; r6 l^ nbEU0Q jBGi0LYŶnI5d ƪDGdun,R"Ih`ؘ ɲ(Vg.AGa y鴥"~r"G\s bvLcW#-@pf42!k5 M7>v&hqޒ GTY|>0CHn\(ׇ $ע[u*iRi֓;$CL:wwnGh0ŴX6T`3h'1ml8/=rdѣwad92Q"0ƛ!۳ѐ!cR+v8ÝV:d\x7jc DBس읎4 yhYYvrPt"X*`T3(xvf̼8M#J:!DstNp+w/1|c"x.E3 OA{]c`p ͔d186pj$2_Ex8: 7s$:}bgj!]F)de&Z!BSrM٫fQxF&F,6HHe4#L'/#CaV9b-Lt;\ f;0.+̐f8X ( RgLОɈ uUPS#7ĺrɅђjk$-:dꂎCJkv:fuUyR&#HIAöy!Xj~9絙؁- |Y1< o1㒎FE8$'Nyb%}q* -0 cɣ"430.iG3|4o)RԐ=gNGc38ۮdN|@3@v2 nZvs:^Dag< 8ZX(xJ< @% L&q(56<1N9' װlD8AgAL*$MkfD0q'Vl8pao!d2.Ein.ŽItN^ME{9eznk LpHgd+22k`hȌB0잛'C㻣LL+kBanT1 FLqۑƓ|잖(r=a߰'Jrd IOь@L S3`b۪nB #lpFq-`npL ۊrZI3mx-YSvzxpL1rLMpUQ#KFӁTRnnw (P7p.SFIKF"TB7Q!- R8- ړU,g3ѡنK,QuUe=nО@i7&$ 財5͓1Xr@B4քzbQV)!WVۦobha6>`f> JL$$N8G{Nrq#EH?I683$2b$|8Y$mr& `CQԛ˸+H܁37Г `ٴlRPqˀI A,/yϛt989J3ʷmVQ+j6ܝ3КS4ȌrQM1r&ޒJdrAM!=ǂPC.!A:B88Aǐs`*hisfol. qIMmɵ0 iHb.Gq.B, С ZA<6clެf~q;U0n"Xp9߼Z|yb|cKߢ0F2FCx eQ6VdRVvJ݊2ߏjGdpJ fܐ-U-evč)@tb(cPB#ba0ǀ!̧ȑSy`#o9kMw݊btDHS2Ф8]E `]6!$FOHvxL"SPIyH2tz;S ka R# H0xҧ;Ea6F"Ĕ7k1dtNQLJ-Yf8M"̈ 7F!MgNf;K{bB({aM"׳ί[XoCf +yL!PdsemECT+L< +HlU) *S' a".It0uRN3}&g`":YB9J85Ee1\}ϒ(ûz0ZT ۇ"=B}8(pO\4PV ZTBSpi9=v#vF,,oȨA*xbSqxP"ےI6䧬"Ⱝˁp囬K$cVT(Q2C! qA@ l%^&gC$'vݩ: H'I!&dY,1hf&QBa8XI:MSV#*!yw+d A *蒩VE$ ˉ!U0]C,,i816Â/*,0 KU~ޙrZS26ۙ|U!0I*D&%}v3+L@NTp52yff" !0Ӧș DUIa)D38)O8h'Ri!%Dϟ^W^F䟛OQ{Q}̑'xAI##cfb\ Fzߌ8#sht0^ 4DH4͎aP,Y.+7t%&{LX5PV ) #Ca( LI ~*pDIl$ӨhDwI5ͦm'( sa5I >"/LGNB`}0Q= [~K.) '0I$R3SLC@2w ;@\C-#Gu:UUV;Bb,{cm;Yh%ˆ΢ dhi:YFb@C@jyA>5>zUeZI()KEjoܐiBb޲%R(dR($FB01 ̒ J)qD)JHy9!7 ("BB($cY$ZO[ [!&AeG|^П!UP(dDBnܠ+ G GTL)x!C /Iȼj* X7~A=_،kRi˃#!RcIYddaHAQZCj灤p6fl0^T+Z弞`QhB /DХ BQ]sIRCʮ,ym5OS_v¼"q&ئJLK!sf Ql 5JM(}j@7#I-Fg;vRyaZO" lre$E+ C&y}5tuνd!(0Sʑr<{A~|C:CȋD)-(Ɋ jɖ #E }z;I%m ;6A33 xPFUDu*>hapN,$Aa R PKJ]qE $`g CV*Lje.cQF8M1W5͇QXΌL29̑DPs hbDH☵*" -,P @8bcd, 䰪*Dg+olhFHb"mnd%`!ERER:ك%u 1ŠX i)Ik&aDSJ\Ç< 2hU)Y%H +01f jsg:S4ZujU_\&BЊjY'Jw5GQ~Z5NAO%; %E`UkX=]5qI送 H=b4: X aJaYẻ G/Cnܩ#-UJr.onÈu|XPIȖ}l9#%ySع0jz)6yDmS˗KaS1!NhAsΊE/œ pSZo,I%^iU"I0#č(ڴcNK&S8-G]^9B%WSR &p+,N8+9:Ɛj ĔLoOɠg봀pYp`Q ¬@a ST5QGiUy D OH[<]v4y4[e2iX <6U͚i9sh6:ؑM#cp2i'E* NJwGNjFGI4w.,j_tL}&ٙBRϭh)g0=beQip )9{i0SglDP$ <1q(G^QH#Aəo %L%:E4uW;EO ܭ><@7d4?#* 0I>dg$|=\UUUUWD7.Bp?x&eM N4IIkk!}PPMiLSHM?>:(#!c +6Bh)!m-#QNqw`ưa!rJ<#t'yAWE!E-(a*i@~*AfPHw E0ɓ? Ǽc[bvuZ*`GJ !m?^)1VCwD)D0J), C BC*TD"D$B ba!=?F'2(PWCI'j*t> "DUBJDl@uw"Fi YP1}>~kc&c7*(=' D<=pE7 At ]jC ?y, ޏ#K`~O 1[x@)wBc@$?]# Ojap3Ts{ e^h$sl~H}|{a 4*m$V64?M:҇eHjO`A T7iKsF ǃMT2`".B'?`WѴqis%:BH) 0"O=25  $ DsE7Yhfu%RiTF !f@ء'ȍ% B@' |B%p@َBʿ-_YFa1pI`b&L,[ WWf-͔򞺆frܕc]G4 DIEW&HitG$B!"8--oRw|D(Adr!@JNHTT{JW;\FQ'r9BTJraY6~pVFD3aw:RIM %;`RJpHp$3lYb[%(PB2J VQťaXjKK R@ 2LM$AR0#%*{[phhPzfm61HtN(҄HЏ1:w @ 3ע{qH?,ܙE5U*+->hnݱw.u 4|l?=auA05:S`VJ}j 0ثD0 P@ @DՋ$K,!E+S]=quaa/cFy2fHp8oX8`䜅oLm! ozG7~ܧ)2 d!  %Ep?uc<I]ѳﴵ7B|ͽ)z!kPRAB@O$[_/}GFkm6kf|?76谫YVp&?#s ~31jI(=?]#?> '6ŝʑœk?,˥_oe4[-㋁~bG6]mA!o@XQmh E!!u=)f|KnF)r4hdQZ)`FYcVڔޭyJaTaBf(PB-_e ΍M#pƒMŔC@;*6R#;R?g+1DTGKGl7ppXҿAQBTU4?(hW8#9z:<뼃 8qCMCk8ƿB t ;0u)<.Y8fKH˨ԩ47QQCoyҙPR>/Vܟ)ҰvT1Ji(6F~{9D`o!*[eo1 ׷.?@tw@;u%-MOIҤR @bTMKo^!7!LI|: :v/X `k?3gz A *I~82{򀞞Č ;h֢!TOsDxGlB)"?YGI%wc=?Y,{g vNg&C?$vApE (:ZSL@5L{?T& ?$gXR^ r0%F! r~ӂ0X>w`Dy"#C:=; wA+}P҄E DK5'O9Z|0q-IbYI*TCHwԠzlHڡ=Tz+ċ<_+OCi #_kj)N4N=GTQY&eTxhC AM@^f~rH%(4>|5Nvo C ݳ@6=s >xL0B@ 9Jop;k'NsSO9`^I6١)a{!N~F"1@4`ztS5e7L7Ԗʈg\b>Q'CbY 1H2u>˺9Q7Q172P-$Z #{uHpiP2zi\%R `39Cd>Pö0`?ルw*pਛa D\0cv7hA\U#bE0$q!OdHR )BWtF6U1ᕜV׆ȥ.)|)A^ ȡ'")is1k Ѥ(7@=4L(b|~ȝ>,H2#RaV H:by=C?$D?/S~YPyqP֙ ;D> =PuXn>V'!0ͻtt9!y/'=| J1RtF>e%MgkWw22¬OC#72@=jz464 ry8=꺞X:Є{=Y(Œ*Dl*ZCLMrr$"nY%Y,[!>9>Jt(8T 3΢@@!GrUA69JJC5z=fHHNvT$<ӭBV;I؜c>+Aj4 (Zq>JR8+xyU۩#,X/PqPw@ *Ĕy;{svMu GǣdL ۸ A.RZ KTQdiY'Za%'(7b("Tluڏ$L5Җ$~<-b?]"B>"+XDFS@MO!?d&AJɔ***zm j1qk*Nχ 0#%Mbw Q7"xݰ ,0a!  I}'׀pLUR=fu\ ̞RIX Xb@9 1 C!}o?9)q2% E% ? ﴀ>8P)4Cٸч]<)HҘGbQP_hWm XyxLB= 1i (q})c|c8p+e91=o"|:hE +C!LnbBrgX\