From 7dc3c064aefb56e3a01c782c2921462c14bc6742 Mon Sep 17 00:00:00 2001 From: waltje Date: Mon, 15 May 2023 04:12:37 -0400 Subject: [PATCH] More updates, see end of CHANGELOG for a list. The SCN2650 backend is now done, final testing follows. Commandline option -T to show all supported target devices. Target device macros (P6502 etc) now start with underscore!! --- CHANGELOG | 13 +++++ README.md | 2 +- src/error.c | 1 + src/error.h | 1 + src/list.c | 19 ++++--- src/main.c | 39 +++++++++++++-- src/parse.c | 7 ++- src/pseudo.c | 114 ++++++++++++++++++++++++++++++++++++------ src/target.c | 21 ++++++-- src/target.h | 5 +- src/targets/mos6502.c | 32 ++++++++---- src/version.h | 4 +- src/win/varcem.ico | Bin 64638 -> 43630 bytes 13 files changed, 210 insertions(+), 48 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 52ba966..72dccf6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -101,3 +101,16 @@ + implement the 'stitle' and 'subttl' directives. + imported the REPEAT and ENDREP directives from upstream. / implement the 'width' directive and, maybe, line folding? ++ fixed some if..else..endif issues. ++ finalized (I hope..) the SCN2650 backend so it can be committed soon. ++ reworked the way we handle pseudo's and directives. ++ added commandline 'T' option, to show all supported devices. ++ added builtin macros __VASM__ (set to 1) and __VASM_VER__ (set to the + binary version number, so 0x01000E00 for this commit.) ++ target-device macros (P6502 etc) now start with a _ (underscore), so + be sure to update your files! ++ reworked some small issues in the listing output ++ added option that page-length of 255 lines *disables* paging. ++ added the DS directive (alias for FILL, really.) +- make option to allow for case-insensitivity of symbol names +- add symbol-table listing in numeric order diff --git a/README.md b/README.md index 91f53ed..496ba43 100644 --- a/README.md +++ b/README.md @@ -57,4 +57,4 @@ can work on it, and/or talk to us on the IRC channel. We cannot promise a fix, but will try the best we can ! -Last Updated: 2023/04/11 +Last Updated: 2023/05/14 diff --git a/src/error.c b/src/error.c index 9435c41..5d3176a 100644 --- a/src/error.c +++ b/src/error.c @@ -74,6 +74,7 @@ const char *err_msgs[ERR_MAXERR] = { "assert failed", "unknown directive", "unknown instruction", + "comma expected", "value expected", "invalid format specifier", "error in expression", diff --git a/src/error.h b/src/error.h index 056a2c1..8ae8deb 100644 --- a/src/error.h +++ b/src/error.h @@ -57,6 +57,7 @@ typedef enum errors_e { ERR_ASSERT, // "assert failed" ERR_NODIRECTIVE, // "unknown directive" ERR_INSTR, // "unknown instruction" + ERR_COMMA, // "comma expected" ERR_NUM, // "value expected" ERR_FMT, // "invalid format specifier" ERR_EXPR, // "error in expression" diff --git a/src/list.c b/src/list.c index 55e8bc9..c11fd0d 100644 --- a/src/list.c +++ b/src/list.c @@ -8,7 +8,7 @@ * * Handle the listfile output. * - * Version: @(#)list.c 1.0.5 2023/05/13 + * Version: @(#)list.c 1.0.6 2023/05/14 * * Author: Fred N. van Kempen, * @@ -242,7 +242,8 @@ list_line(const char *p) } fputs("\n", list_file); - list_pln--; + if (list_plength != 255) + list_pln--; if (list_oc < oc) list_line(NULL); @@ -277,32 +278,34 @@ list_symbols(void) fprintf(fp, "%-32s %c ", sym->name, sym_type(sym)); if (DEFINED(sym->value)) { - fprintf(fp, "%5s ", value_print(sym->value)); + fprintf(fp, "%9s ", value_print(sym->value)); if (IS_VAR(sym)) fprintf(fp, "%c", value_type(sym->value)); else fprintf(fp, " "); fprintf(fp, " "); - if (sym->filenr != -1) + if (sym->linenr < 0) + fprintf(fp, "-builtin-"); + else if (sym->filenr != -1 && sym->linenr != 0) fprintf(fp, "%s:%i", filenames[sym->filenr], sym->linenr); else fprintf(fp, "-command line-"); } else - fprintf(fp, "%5s", "??"); + fprintf(fp, "%9s", "??"); fprintf(fp, "\n"); - if (list_file != NULL) + if (list_file != NULL && list_plength != 255) list_pln--; if ((list_syms == 2) && IS_LBL(sym)) { for (loc = sym->locals; loc; loc = loc->next) { - if ((list_file != NULL) && (--list_pln == 0)) + if ((list_file != NULL && (list_plength != 255)) && (--list_pln == 0)) list_page("** SYMBOL TABLE **", NULL); fprintf(fp, " %c%-29s %c ", ALPHA_CHAR, loc->name, sym_type(sym)); - fprintf(fp, "%5s %s:%i\n", + fprintf(fp, "%9s %s:%i\n", value_print(loc->value), filenames[loc->filenr], loc->linenr); } diff --git a/src/main.c b/src/main.c index b4359e9..ac4e6c0 100644 --- a/src/main.c +++ b/src/main.c @@ -8,9 +8,9 @@ * * A simple but reasonably useful assembler for the 6502. * - * Usage: vasm [-dCFqsvPV] [-p processor] [-l fn] [-o fn] [-Dsym[=val]] file ... + * Usage: vasm [-dCFqsTvPV] [-p processor] [-l fn] [-o fn] [-Dsym[=val]] file ... * - * Version: @(#)main.c 1.0.8 2023/05/12 + * Version: @(#)main.c 1.0.9 2023/05/14 * * Authors: Fred N. van Kempen, * Bernd B”ckmann, @@ -58,6 +58,7 @@ # include #endif #include "global.h" +#include "target.h" #include "version.h" @@ -108,10 +109,30 @@ nodata: } +static void +init_symbols(void) +{ + char temp[128]; + uint32_t i; + + /* Indicate "builtin" symbol. */ + line = -1; + + do_define("__VASM__"); + i = ((APP_VER_MAJOR << 24) | (APP_VER_MINOR << 16) | \ + (APP_VER_REV << 8) | APP_VER_PATCH); + sprintf(temp, "__VASM_VER__=%i", i); + do_define(temp); + + /* Set for "commandline" symbols. */ + line = 0; +} + + static void usage(const char *prog) { - printf("Usage: %s [-dCFPqsvV] [-p processor] [-l fn] [-o fn] [-Dsym[=val]] file ...\n", prog); + printf("Usage: %s [-dCFPqsTvV] [-p processor] [-l fn] [-o fn] [-Dsym[=val]] file ...\n", prog); exit(1); /*NOTREACHED*/ @@ -152,6 +173,9 @@ main(int argc, char *argv[]) filenames_idx = -1; // this indicates "command line" radix = RADIX_DEFAULT; + /* Create any pre-defined symbols. */ + init_symbols(); + /* Create a version string. */ sprintf(myname, "%s", APP_NAME); sprintf(version, "version %s (%s, %s)", @@ -164,7 +188,7 @@ main(int argc, char *argv[]) STR(ARCH)); opterr = 0; - while ((c = getopt(argc, argv, "dCD:Fl:o:Pp:qsvV")) != EOF) switch(c) { + while ((c = getopt(argc, argv, "dCD:Fl:o:Pp:qsTvV")) != EOF) switch(c) { case 'C': // toggle list-offset display (disabled) opt_C ^= 1; break; @@ -209,6 +233,13 @@ main(int argc, char *argv[]) list_set_syms(opt_s << 1); // FULL or OFF break; + case 'T': // list all supported targets + banner(); + printf("These are the supported target devices:\n\n"); + trg_list(); + exit(EXIT_SUCCESS); + /*NOTREACHED*/ + case 'v': // level of verbosity (lowest) opt_v++; break; diff --git a/src/parse.c b/src/parse.c index f17f37b..1d833dd 100644 --- a/src/parse.c +++ b/src/parse.c @@ -8,7 +8,7 @@ * * Parse the source input, process it, and generate output. * - * Version: @(#)parse.c 1.0.8 2023/05/13 + * Version: @(#)parse.c 1.0.8 2023/05/14 * * Authors: Fred N. van Kempen, * Bernd B”ckmann, @@ -371,6 +371,11 @@ again: if (isalpha(**p)) { /* Execute instruction and update program counter. */ pc += trg_instr(p, pass); + + /* We should have nothing left now.. */ + skip_white_and_comment(p); + if (! IS_EOL(**p)) + error(ERR_EOL, NULL); } else error(ERR_STMT, NULL); } else { diff --git a/src/pseudo.c b/src/pseudo.c index 24c0bdf..4742eac 100644 --- a/src/pseudo.c +++ b/src/pseudo.c @@ -8,7 +8,7 @@ * * Handle directives and pseudo-ops. * - * Version: @(#)pseudo.c 1.0.5 2023/05/12 + * Version: @(#)pseudo.c 1.0.6 2023/05/14 * * Authors: Fred N. van Kempen, * Bernd B”ckmann, @@ -391,7 +391,7 @@ do_echo(char **p, int pass) int fmt, next; value_t v; - if (pass == 1) { + if (pass == 2) { while (! IS_END(**p)) (*p)++; return NULL; @@ -439,12 +439,15 @@ do_else(char **p, int pass) if (! IS_END(**p)) error(ERR_EOL, NULL); - if (iflevel > 0) { + if (iflevel > 0) newifstate = !ifstate; - ifstate = ifstack[iflevel - 1]; - } else + else error(ERR_ELSE, NULL); + /* If we are skipping, keep skipping! */ +// if (! ifstate) +// newifstate = ifstate; + return NULL; } @@ -526,10 +529,42 @@ do_endrep(char **p, int pass) static char * do_error(char **p, int pass) { - char buff[STR_LEN * 4]; + char buff[4*STR_LEN], *s; + char temp[STR_LEN]; + int fmt, next; + value_t v; - skip_white(p); - string_lit(p, buff, STR_LEN * 4, 0); + s = buff; + + do { + next = 0; + + skip_white(p); + if (**p == '"') { + string_lit(p, temp, STR_LEN, 1); + sprintf(s, "%s", temp); + s += strlen(s); + } else { + fmt = value_format(p); + if (fmt == 0) + fmt = FMT_DEC_CHAR; + else if (fmt < 0) + error(-fmt, NULL); + + v = expr(p); + if (DEFINED(v)) + sprintf(s, "%s", value_print_format(v, fmt)); + else + sprintf(s, "??"); + s += strlen(s); + } + + skip_white(p); + if (**p == ',') { + skip_curr_and_white(p); + next = 1; + } + } while (next); error(ERR_USER, buff); /*NOTREACHED*/ @@ -624,6 +659,10 @@ do_if(char **p, int pass) } else error(ERR_IF, NULL); + /* If we are skipping, keep skipping! */ + if (! ifstate) + newifstate = ifstate; + return NULL; } @@ -648,6 +687,10 @@ do_ifdef(char **p, int pass) } else error(ERR_IF, NULL); + /* If we are skipping, keep skipping! */ + if (! ifstate) + newifstate = ifstate; + return NULL; } @@ -681,6 +724,10 @@ do_ifn(char **p, int pass) } else error(ERR_IF, NULL); + /* If we are skipping, keep skipping! */ + if (! ifstate) + newifstate = ifstate; + return NULL; } @@ -748,6 +795,10 @@ do_ifndef(char **p, int pass) } else error(ERR_IF, NULL); + /* If we are skipping, keep skipping! */ + if (! ifstate) + newifstate = ifstate; + return NULL; } @@ -1058,17 +1109,46 @@ do_title(char **p, int pass) static char * do_warn(char **p, int pass) { - char buff[STR_LEN * 4]; - char *str = *p; + char buff[4*STR_LEN], *s; + char temp[STR_LEN]; + int fmt, next; + value_t v; - skip_white(p); - string_lit(p, buff, STR_LEN * 4, 0); + s = buff; + sprintf(s, "*** WARNING: "); + s += strlen(s); - if (pass == 2) - printf("*** WARNING: "); + do { + next = 0; - *p = str; - do_echo(p, pass); + skip_white(p); + if (**p == '"') { + string_lit(p, temp, STR_LEN, 1); + sprintf(s, "%s", temp); + s += strlen(s); + } else { + fmt = value_format(p); + if (fmt == 0) + fmt = FMT_DEC_CHAR; + else if (fmt < 0) + error(-fmt, NULL); + + v = expr(p); + if (DEFINED(v)) + sprintf(s, "%s", value_print_format(v, fmt)); + else + sprintf(s, "??"); + s += strlen(s); + } + + skip_white(p); + if (**p == ',') { + skip_curr_and_white(p); + next = 1; + } + } while (next); + + printf("%s\n", buff); return NULL; } @@ -1138,6 +1218,7 @@ static const pseudo_t pseudos[] = { { "DB", 0, 0, do_byte, NULL }, { "DEFINE", 0, 0, do_define, NULL }, { "DL", 0, 0, do_dword, NULL }, + { "DS", 0, 0, do_fill, NULL }, { "DW", 0, 0, do_word, NULL }, { "DWORD", 0, 0, do_dword, NULL }, { "ECHO", 0, 1, do_echo, NULL }, @@ -1168,6 +1249,7 @@ static const pseudo_t pseudos[] = { { "SYMS", 0, 0, do_syms, NULL }, { "TITLE", 0, 0, do_title, NULL }, { "WARN", 0, 1, do_warn, NULL }, + { "WARNING", 0, 1, do_warn, NULL }, { "WIDTH", 0, 0, do_width, NULL }, { "WORD", 0, 0, do_word, NULL }, { NULL } diff --git a/src/target.c b/src/target.c index 254b0a5..847aeb6 100644 --- a/src/target.c +++ b/src/target.c @@ -8,7 +8,7 @@ * * Handle selection of a target device. * - * Version: @(#)target.c 1.0.3 2023/05/13 + * Version: @(#)target.c 1.0.4 2023/05/14 * * Author: Fred N. van Kempen, * @@ -57,7 +57,8 @@ extern const target_t t_6502_old, t_6502_nmos, t_csg6510, t_csg8500, - t_65c02; + t_r65c02, + t_w65c02; extern const target_t t_6800; extern const target_t t_6805; @@ -77,7 +78,9 @@ static const target_t *targets[] = { &t_csg6510, // CSG 6510 (NMOS) &t_csg8500, // CSG 8500 (NMOS) - &t_65c02, // standard MOS65C02 (CMOS) +// &t_65c02, // MOS 65C02 (CMOS) + &t_r65c02, // Rockwell 65C02 (CMOS) + &t_w65c02, // WDC 65C02 (CMOS) #ifdef USE_MC6800 &t_6800, // MC6800/01/02 @@ -142,6 +145,17 @@ set_cpu(const char *p, int pass) } +/* List all supported targets. */ +void +trg_list(void) +{ + const target_t **t; + + for (t = targets; *t != NULL; t++) + printf("%-10s %s\n", (*t)->name, (*t)->descr); +} + + /* Create a target-specific symbol. */ void trg_symbol(const char *name) @@ -150,6 +164,7 @@ trg_symbol(const char *name) value_t v = { 0 }; int i = 0; + id[i++] = '_'; id[i++] = 'P'; do { id[i++] = (char)toupper(*name++); diff --git a/src/target.h b/src/target.h index 7a7901c..ce6e156 100644 --- a/src/target.h +++ b/src/target.h @@ -8,7 +8,7 @@ * * Definitions for the target backends. * - * Version: @(#)target.h 1.0.1 2023/04/20 + * Version: @(#)target.h 1.0.2 2023/05/14 * * Author: Fred N. van Kempen, * @@ -50,8 +50,8 @@ typedef struct target { const char *name; - uint32_t flags; + const char *descr; const void *priv; int priv2; @@ -64,6 +64,7 @@ typedef struct target { extern int trg_set_cpu(const char *); +extern void trg_list(void); extern void trg_symbol(const char *); extern const char *trg_error(int); extern int trg_instr(char **, int); diff --git a/src/targets/mos6502.c b/src/targets/mos6502.c index 40ac9ae..42ba81a 100644 --- a/src/targets/mos6502.c +++ b/src/targets/mos6502.c @@ -14,7 +14,7 @@ * version produced later. The CMOS version also has variants * from Rockwell and WDC, with even more changes. * - * Version: @(#)mos6502.c 1.0.5 2023/04/26 + * Version: @(#)mos6502.c 1.0.7 2023/05/14 * * Authors: Fred N. van Kempen, * Bernd B”ckmann, @@ -98,8 +98,8 @@ typedef enum { #define CPU_NMOS_0 0x00 // first NMOS processor, ROR bug #define CPU_NMOS_1 0x01 // regular NMOS core #define CPU_CMOS 0x02 // standard CMOS core -#define CPU_CMOS_1 0x04 // Rockwell CMOS -#define CPU_CMOS_2 0x08 // WDC CMOS +#define CPU_RW 0x04 // Rockwell CMOS +#define CPU_WDC 0x08 // WDC CMOS typedef struct opcode { @@ -339,7 +339,7 @@ static const opcode_t opc_cmos[] = { {INV ,INV ,INV ,INV ,INV ,INV ,0x87,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV }}, { "STA", CPU_CMOS, {INV ,INV ,INV ,INV ,0x85,0x92,INV ,0x95,INV ,0x8d,0x9d,0x99,INV ,0x81,0x91}}, - { "STP", CPU_CMOS|CPU_CMOS_2, + { "STP", CPU_CMOS|CPU_WDC, {INV ,0xdb,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV }}, { "STX", CPU_CMOS, {INV ,INV ,INV ,INV ,0x86,INV ,INV ,INV ,0x96,0x8e,INV ,INV ,INV ,INV ,INV }}, @@ -363,7 +363,7 @@ static const opcode_t opc_cmos[] = { {INV ,0x9a,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV }}, { "TYA", CPU_CMOS, {INV ,0x98,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV }}, - { "WAI", CPU_CMOS|CPU_CMOS_2, + { "WAI", CPU_CMOS|CPU_WDC, {INV ,0xcb,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV ,INV }} }; @@ -371,7 +371,7 @@ static const opcode_t opc_cmos[] = { static const uint16_t am_size[AM_NUM] = { 1,1,2,2,2,2,2,2,2,3,3,3,3,2,2 }; -static const char *err_msg[] = { +static const char *err_msg[ERR_MAXTRG - ERR_MAXERR] = { "invalid addressing mode", "invalid register", "malformed indirect X addressing", @@ -719,7 +719,7 @@ t_instr_ok(const target_t *trg, const char *p) *ptr++ = (char)toupper(*p++); *ptr = '\0'; - /* First get instruction for given mnemonic. */ + /* Get instruction for given mnemonic. */ op = get_mnemonic((const opcode_t *)trg->priv, trg->priv2, id); if (op != NULL) return 1; @@ -728,9 +728,7 @@ t_instr_ok(const target_t *trg, const char *p) } -/* - * Return a local error message. - */ +/* Return a local error message. */ static const char * t_error(int err) { @@ -743,30 +741,42 @@ t_error(int err) const target_t t_6502_old = { "6502_old", CPU_CMOS, + "MOS6502 (old)", opc_nmos, (sizeof(opc_nmos) / sizeof(opcode_t)), t_error, t_instr, t_instr_ok }; const target_t t_6502_nmos = { "6502", CPU_NMOS_1, + "MOS6502", opc_nmos, (sizeof(opc_nmos) / sizeof(opcode_t)), t_error, t_instr, t_instr_ok }; const target_t t_csg6510 = { "6510", CPU_NMOS_1, + "CSG6510", opc_nmos, (sizeof(opc_nmos) / sizeof(opcode_t)), t_error, t_instr, t_instr_ok }; const target_t t_csg8500 = { "8500", CPU_NMOS_1, + "CSG8500", opc_nmos, (sizeof(opc_nmos) / sizeof(opcode_t)), t_error, t_instr, t_instr_ok }; -const target_t t_65c02 = { +const target_t t_r65c02 = { "65c02", CPU_CMOS, + "Rockwell 65C02", + opc_cmos, (sizeof(opc_cmos) / sizeof(opcode_t)), + t_error, t_instr, t_instr_ok +}; + +const target_t t_w65c02 = { + "w65c02", CPU_CMOS | CPU_WDC, + "WDC 65C02", opc_cmos, (sizeof(opc_cmos) / sizeof(opcode_t)), t_error, t_instr, t_instr_ok }; diff --git a/src/version.h b/src/version.h index 19a4175..8365753 100644 --- a/src/version.h +++ b/src/version.h @@ -8,7 +8,7 @@ * * Define application version and build info. * - * Version: @(#)version.h 1.0.5 2023/05/13 + * Version: @(#)version.h 1.0.5 2023/05/14 * * Author: Fred N. van Kempen, * @@ -55,7 +55,7 @@ /* Version info. */ #define APP_VER_MAJOR 1 #define APP_VER_MINOR 0 -#define APP_VER_REV 13 +#define APP_VER_REV 14 #define APP_VER_PATCH 0 diff --git a/src/win/varcem.ico b/src/win/varcem.ico index 97f7f1710777ee465f2250cb355ba36e90533d50..db2916e3df839670832fbd1facbce0498dde2bd4 100644 GIT binary patch delta 1272 zcmezOgZbSRrg{bjMg~p>0|OAv!LWjlfngd01A~GBl+VGyV8_qEARqwYXRtCbJQHVN zaBu+e6&N&}7#RFy8KC+V7*?n1_lNL1_p)%29QFI$%c%wo0(Xdc1_r|% z4h~q5N5Bls5Y}K|;9*c;U|?`Sij`Hu6F4TDF-mL>lCfds2gMsm78K}=3<{eQSF5sY zo>a_Xx4A7phH3M+&HEH5_pBGnghbN+{~&b?j0hSObPNpt!7ic-Jvm{6_~iJF9QBY` z`Tze9$O?P9)9z$j40AYyp3GP-1rB9IJSa?NmrD+7a?3kJGM5)cg?oD2-to-;6rh(P!|*cce%KEf&Xgb9OCd;$A^FsNv+=-qoxe}6{-LwR|50aI8|aCjk0d3ia=$Aty##pUJY2JGe_ z9s~Q2{*E909sT_v)eH;_?BCVJ3yXsb3kvEDKnj?@SCqH6x3^dP$S(l#*}oQmgO;O1 zK7gT~fq{YfdqF|6Q(`hlg+4^V_X0C^c6Jqx3VAS}@q2@FLb9_HM+ZNc&;Gq2**P)E znd65&n9uyZP{l-5RUJt_F`*zafujQ=&-lGCsi>%^i2Vm#Kgb;n9Od-|_8=Df2dMYk zAr`WK2l=nO+)S(#*I68c+_4IHF0+n_k z%)!RMzz|ckB8`E;ceyxv zDk>NvaHsZN7k`L=>m9+sz%W;qlv3x^K$b5n_wQS7SEJOisVx4I%Gsj#_UV(RsQ6x5 z;ye3xec8V6TDeBw@9i`$-e>vz%uHh;78aH$oh23F4h{|qbpk933KyCbIUF1ousRDg zG&pd#DKIcLit#uyFfr*$G%>KSL>aI!a&T-(;9wFE$T&!%hWd_}t4|dWxCJGgrO4`Sqw+`kvRKU#pMoX1cf_{~bfE)P=K*$3t!|)B6lNPj*(dNz-si6oQ4L-Up2F6yyfR#|aZ;qz)n= zxUW7flIl5Gt+GQ-dt>s|KK)s2oF<%1FDB1k?jO2(#s}~79!6G2cH1#A9bB+VONEtv zLGXKH<-)7ya&MV)&SGKYd3nFwLik^J>j!QV&J&m3g}Bzg{C#`do4)eUtmbF+oC!X8 zac&E<;*V%q8HGqD#eF)x>X5L;1&#?ju6Vq;|KQQ$N%0QT!k&0^Zr{5*^!93&S?Udq ze}DHiDe0zcuIFu+H{Kl(nd!Ln=9#*3$3T&NHjisHMdy8$Vr-OXY>Ate`l7^Y$qXM4 zPtUad*Gt@2a(OAP7Phy~eRAF1EX^w410|Aro>8{#J?WS#lvw_NzBt82#9 zRi^89eBvsx-Y8wdCYxO;>DMmHrJd|!&@!d|SKKE7w$h9bMqJqnGi~-Jp8k37{Lz2D z2~S^rzT@%!_~{SvTmH*!)DVAJ{bQTA&aLy?>$sE|ruOc&-T(IBsqbNnHW7WiT+}>bMpJ=OFoH7BThgf0rfm z*Jmfmf3N>8dH4MJ^T$`s?;T+M%l6^CNE+V?xq0?!OcnoxU)Ad}FK_iY)tbF=*B$*? z)mdxnct7sD_vvfyLo_KkesW~?j*YsIFk;2z%HaKoh zYgopaaO8vHW!TleR;d|x~*@o855{ass& zPkfrV&;88(>-+2Oeg9UQzN=kjC+oiFmg!0-Gg=NNScI`p_2D{@;#L3VZ?C*hyW2$- z&IPMhafymP{qZdR_QK@Y;JC=bH{SO?gxtG6FZs}_74Nq5{;IV-wQ$;|J9#0=@%4IY z?*(7}RazS_dwc!GUu*f^iZ82E3+9sX6R(LHFztlLr4~&Wke+ zu>>@(-(M!|kjlW=!enTnds9W_#ocdG``3#c$rM<$@=>f_&P|PX%jIV4-pvg-|J(Fy z(Hh$m>z@=@te!qunNgSVQdY?Mc`ghqn;4RMBZM5BoS1snO!jEqEF!-6Qr1_U-zzrU zeA6S4@=v+`^e%z&fW+-;hK-T%8IH_tz8 z9{<0)bXT`YbP`9Qth*W~sy=#a;XB z%fUI8#y2BQHf&w9Buq$v<-&muQN|_9mMvPdhbQ@%&w+b;t0&H#deXEhVBs7lU2c^X zWxJV|E?xTK-d~kHU$51qq@^udv`Fbq=^>Vkgd?%Z zu#ox45q$w3mDlWiG6zJ%WBQKIui~1j>VDXYg_Y67AjzHKt-;rS)f@BfR&B|?u6J*} z>ViZWyBY~)_r3!?H;W}0WyDwn{9CwLy80MyJ-*2P?&z(pE)2QZwd=ILiPoEYyFB`A zS@VO#tyij1eO{fLfWw|ZX~s8qc22$dd7|I}UJ9^6q=_UWEb?_RhEE`ClgQm@tXi;>x-G8JrE%B&xrQv0PB-n9F%VjQ?)2xmn(y z8G;V8rBY+`Sj}eho?PSXZ}-z>%ej+{^?HuW_cqF@Tf}mSv)E>PN2*`{-^R;u^rcux zr2L{fABldkCy)2r|7Yty%Cq>QM9SyB3k)W$H-rwv$}xSo&ah&#j+k~)RBG}KRq@5O zzs=^E7AgLX(|C9G!vxh_u6mUTwogi*6fj=fx1aAPE31c}-?~IG4yFqNN$w0!n18Te zTUUQKqM1SC%jLAyhn_BWUzmN}Z$re|cfAU7ObcGW{F(H0!Ni9f4}{!mU7@wL<+mGy z=Og2~tW})9>;5yp*NN|3vSe12!x~Np7N)Dr8&w+~_&G%VUMg_$yVkIQcJ* zU<@u2QVFWes@#Ln)-O<{uyhYKS@cx@W4hb<@upgzfNUsUTC+VH{s;Tl{+49 zt6#8S#f-o6o_ybHz*uk6a!i52Sol}i%*cp6PfX2D&)9it=ERA8Pv5US^m@JCqfC2` z&@Wr-o!`t|%^0}u-P093objPkr)DN{?)d!eq=f0Gq$yLT6mDL-PJzi_rq7PLJ7+a? zG}|;)kG`*VWRP-NEYPr1C~~G`#Fh-Z{pz}cQ>RT&estva&o;$ZH*~^#<+ttM@m@KojwX_WL?zp^*_DM)?-1c86<8(=2A!pv)BH`cv zq(nB~=WJs5qsXDqz+iOqeH>H9Wh-}q1~vzlfQX0|N#kV;{nvjEc%jHJ>#wFz{+FrA z^%KwdFwc5fTlnIF;GMG9Dr#@87adgNVEWL$j8j2Q%|Y!lgWca8?X+_^XBUp%>I6`xxL`@ zlujS!9kV7LO#C-ffuTO5O5}Jm!wHrjIxLJkf*tEmZ_wadVdG|ZXV#YbvgklPn-iYP zr+@WGdiy%)&uvo~#v3|jJv+atEm@|<&9s76;YrrL_bVE%K5fto`RuB|-RK^8 z(SiG>Uj}%=MmBmV_>T z#w*(-Jy@9PuQEreFhmLcIULugW$|++%U9Tk%_ds0g z@fq1_R}2_Eet5iiyq1xJX$AWh4+bkYhTjs5H*8rP=Dzv6a;@WH!S5aZEZiCqw_k=& zwA=ph^iJ*9_tF&$7oJaGxnRe|v_N%V7Z(_t!%w722c6;KbBho*f z$u}7=W_@WYTUg1oz@qe*Vuz)i-}r_FbPFQj$Jnw^yLe z_Kl}bu8Gf`Y8JOZkHvw>|I^OAyKLWfFFbZ^UQsdYIqTm(bFMuOaT7^9Z`#Db^xJ*& z1uMoAtB%ZVnz`2a?!Ii(J@pPQN>}!r>*&#_nLA%Ps$8aXEIFc<4qD>c~i0=^nE1%{S#3l*CM8Oa}=sI6h2n_Xe-~uV8U}& zsA01VpIO3JxxZ$rx7RYVOzx`SUfp!ddZ*jD{Z%&RK@)!QIWiQ2lCa*yhBx2)?S6^) z+y9j*ieisv`*S(5t$8Mc3TMfs5-sC;#wiLc0{&lT3%tCvx93ES_*Pr8a(uCiSv7q@}?l{<9r83F&2RfydT#&SeS@1 zo%q1QbhT_&giWix(ANEd4^@obWkJurHwT}7Rba5Xpcid6I_n$92UznP3>O~7ZVPWs;K6AtDyG@Mo zgUBuK=kP>Nt?ub?SkREyQOC}#bgz=@KQJMIMMiT1?-OQ?!7(Vwq;vJ@ML0{clN~KmPs=wAf#NIQB)6msQT1{d<~p zI20C0KZ0yAfI)jw73)4ESvblHrjItSn zCJ9fRa)GN;jeV7js1lz-jQNq>Ob;(i;aIRxiE;MbGx4#C^-K$d_g?Bbwt{oPuedMv zp6BbXeiTXOntPWaymV8Temx5#i%IMrZ2>;tR)!>5P6=O)yd{oy6K%E!J{0Ek@O`s} zpV5WUk>Q^J%Yuy_4sq!&ViT{6$kZv`Uu-2bVH#uVjo5Q(JEa2z9BeOyFg0FE65*8K z-Jn*ePa(tC4wg0CEQ~*#FW0kN5b8aBF37O#t2k!r!n3KDE&$U4m_k!`~L@Hy*jcE*l54ZI!85|~=L zS$a%ob$|HmaV*V=!HGG;A>$&agm2IV55be~_CHhlb9MHNBp(K$^G0Xt-<`}mHFqP| z&y=idE&>i8{#{UsVq$bDQgAO8u8Y%aV{vfGHJZ8LvS*BHx&D8z4H0WsYzqCU$|~6C zu<*A_@dYKuBbQh*_;&w#HHX>IjU~Zgg2VEM_y7Oo%)TGrf4}~I{}mJAPoI7ze|a%+ zPyO1kXj4uOCXT!Mvz&vK86tb%Wz?^IwqdpYq+hNwoDxqTE-=wMk@@>>xqZ^DFOe&@ z%$S&Ba_C{f2K`i@os~>(eS2mII*4B8dGkjqk*VdK^x1`)f(%JA93t<1>{=ow1cyv) z2oz%YTAP)n^={wmx<7kP_0~ zmpL(P>|^QqenwvVtjZ;i1G{E1ur)W{ulyqVI3dN@p7Y7ZY!Mlo3XbyomaO41m6BXs zTtA;TF*tpn`0RqnG{$6EPKo@7{h@ysb+WACXAJlcYW%#ovHuCjm%Yy(96Y?^{XT2M ztRn^@Vxk|<_X{2n5t%-%WAVX9v5f^6N)#r%s*hvsP*G1&OY7HVi(&ns7pQbi3fDO`Nv^f2< zVXCd(pDR&ejI(lHy|cQa|0rRBL<-BI!in?dwK@A-tuMLd^XBH}etAj1SM@@|=S~VA zPyX^EuwFw~_i>X~fw04@=Oqb_471c2&dy@s`#$rV$sy0T{9Aced=0Krc6F917h63g z;mUuNnxF2UH~w9n|Kaz&y&m4?51a1oE&TOz`Jzintyj~Sn{=7GE;q6=UOCD6;v&O= zG^waOE;oiK`=#bVCRZZcH=g12Sk`cz(?hVKA*L0+E(!q-vybj(dbl8yDPzgy#>cH}qILfq-*7biI+5Yy zQdG2Q_x>3VZr+es$l;Ja$CSa5;j2Tiazn&?J{f(J9UngPzn154QTRH4<;^wnx<9gh z`~BIMZ~vX~%d4xx>h)!BS-6!MrN1-oIL$4rP;x(m&$p8ysn)8%Sz+34zO4eB9*>)> z89sM^IMTEH<7NN-6=~I?D__2xVU%g(*0X~pHFYWDYKA6;rmy|aE`)F>TwBh3oV!=; z&!5vbjxeUAElWOjCVfNZ<+LYHwmf3;bMmhBOn!W|^8DuWo0%UmurRXJzg9l$xcPJg zZ;e%f&4m?*&T}785;ADaKQC8&miN#5D_4>yHmJ-H;rwx-`Tv0r51m)97d+jt@V962 zg&c(m=d~PEEEyNaDLI$y<~n>=e^RySt`DD`Hs0c9=-KyZ*Mw@ucROmij`ghEDSkkf zBSeow;hrc5`&pp|bD;_TKOYt|ncb+jvXV+X?8iK<+f_y3>t4;HEw|tA;otx7z4?a zzxDigIJ=KZ*~m8-FtRXSF;|_jCRvJMw_U-$&ua@c5<9lU>}lP)@Sbz3S;Ni+JyXLU zrZ~kV(%1G&SGX>(**B{r}1(RL*r$ zAr-8QEL);MwOEu2!>ZHwRvCqazGoHaU_HS;;pm%>kEf)3chi>dC}x!6nE?NO+Eh4z@Bb4PW}{duH->+|niLw^niU!}I2!Kv zo6c16mU|k1`Rw&23#zV^egFSQkz>Kb1uq5HY)y4&{ITF5hl37t)@+7HLL5gp9!&O~ zZTR`5Wri|`gYW~EfCC%}X>T|jSeSNRe8bsb)}xXxz<5Vmkg-0%z3$gfF`I)X4Q08v zKD=gq#4WU`sflSBqmTRfxaSL7R=z8BUBl@xhwn~9M=R$8wT2v@z5f;0L~mah#~$G_eS_pU!%FZed{|4eP|*ERZyOg|Ri6lP#;QCXT^ z#qppyinC$f)D)j1%Khh#)SsKXd&1PIC)s)#-(4szw@oVh(f)kv6^=5&Yv0bScz509 z)WqNkP8HqV-UbB;^**&<7(>EBcJ=>TrQ9NXLH_JKhC5OYe8!A&4;C)kD#%c(v2>Q6 zp3cG3pW~8MKJdomD7@0h=v{wuVtnJeHT=9D?+PN%>)u(vyiF(kxAEfL@xdDP$BVUB z=t=NY#S}Qk`|M0rx)kiYr~gV7OKj!kCjSRg4xGYCf*eaCkK~CisP&L{SbDT+&YB#Z zm@iuQ4c)%0UGi8OoTeh_&L^K_9H1$3($*%^;lw68w*2KEB>Pwt|NIq^V-MJEY&7e) zX>XC0XaAcyIa_kCvvnOl8d7h3|5>zr{e`rJCT=R%d*&WFF@I)_r)S-LZl((YQpu7V zR-HPR#%lX)?fplHIzctJ?`<_vLO*%o%W9kc((Mn=AznYm@gZg+($ zk3aQC6oS5c?w)P?o3-Z4$@Dv4xUZ~XVa(v@b!1>UCFQMt;tB7I{)>yAD5J&C*c=iohSFLjHZQ|8D>1op)pa9n6%5Wv{N$#@R$G=!)x7*I`3f5pa%bN4! zMXGJgs>$lS3-2^e@$=!@G~HRCq3wdi#D;wf`0AB~8?5#=mVM_s!fDcyp)-L~q4nkw zRSpN|j2tEb0Rff;ibu||WOTc~E7oV0E06hIv42`ao8!!uPKGo)<95LVf{qLyU354a z)|sYmJvc{w{*gaF^A`j!7e2x!-?%^_@&Ds~d&AUEzB`^jbWhN;6DoTdDB!@XEXLyC zarWGy`hE4k?PH41vb_7b^qkP_8kQQzeezPlQ+z8PK4P`lU+y0wBHFswjfKh7Ajy^C ziXmIDme}5X4Cn3b`={zZzL*gdYy6ADM0><GRl5N4DRylN4U=({woJnL1BuLcO*`Ntx+|27}7NYuPMOLT}FSZ8(^>)Y(NwuvM0uDI?*? zBnB21C#6fa*BL>>#T>p2Wf3}4e_Y>w`=-l0j_IKS4GuXE&7U~Q{9fmsbZg0CuIKa1 z8I28te`vby6JQCb_is^RxTWYOnRKr%U66;9ZN}MW72%-^W;RaRZy~~7vT2=_ppSx& znlQiO{%^NF) zk9m`xE;rK(bv;?LijbW*_XM=fdHCDXR44b2<=ZWj4Idtp-ckQ5b>)^Fo(@MoaGR)P z_&55wO)}&REt9?%wSi@K`TJ+L93HqVb;Ve(t~ zmmxddAC%`AA80c^_o6XzdQ8u@+*=29|L)@v_))bmIIFX0QB2CyiYyHon*s^>+7E{R zK3_g>Q<$^hmw$ohDSywd`iG17_uZ&skZN7Vxgh*M<1ZhJ`9)59)jwEAEiJT?-4LO3 z;kEFD44;zs5Bc91ug?sK{;^&|{gi7^-`P)HmyZ^EOwgP)XU>u1@x2p-Sp7VwrG+`z zCqLh&JBwH8q6wow+qd`Dcb0mrcXDe_xc@u%;nMjP;SmcWo8<*gZx;=2hix}lJ?-wtb;Y^w7iWGsclPq~Ro7OoQnD3VoHK`siI>|oar1tw%}z$=ZtM)* zz1iOJGmC@7yxG?eF1q#ng~-z)M<%9OY{7p+C07fp9^NaTb9YVT?fczojtnh{JDIIQ zR`yv=Qeb3U+jRENDjnm8{t1WnyM8|8pJ7zb;vjL%gmHJ)Ue8IT=BvC4<~KArEN%{| z+q=g-G)9{z=u*=%gU{6$mvA&(*j+!*jycph)?wWukHab&cU#;PF1!c`Q5T-4JmKnl zk%ZlH$9k6re1CIk!*P3wSu%_jj^_@RESSx_?V**&vKuNNzua>5*9j8?*WWJG zxP7C3n_2zCWqraG@lQ7GdlCOWT2mvncIS-0k1WG>?5kbqbWQr~s^GsjcwQdp%boqY zE~apfqFbr}&)KuDQ_4egFP;oq{_9TrOwFa6dN^lq%e|hXGGm(Ij{mHSMOe9)RtXvI zKJM>nb=XyU_Jpi^5dtg%EaA`jPFO6u_579S*Hu=t#k)?gJW>CtOGfkKw({*}cO{kP zNlczSJ@CLU$FM0?Uz#7KWc~8lJjEpW`L(mYUbgu>984UI-M^ogu4wwJ8F_HS3SY*V zE9Z3mYi2pYU$?{ejMZ1hug$TW?y`vIrKns`e8hN~C4S-)+f7T>c(fEAbi2s!C@9SI z;;ub-rrUXv4_A(Ja(eybAE#@`=&4aP2j3&-c?D@78Z#EO)W3 zH0%7nzw9r9ce39zj1_CNWMb;&=dxllE=;-3B|GV!Zo12dP+60v6`Y_c^}U{3`@>Rw zg6FP^XciafP`7dPn6$_)Z5q$&eO*D)9bF8135Vt%YPrAEJP1bPKd zhTLgYUK1LuC!Q%ZYnP4rq)ihSEWD+9?Y(q&S>B0%84rpk>3n>$W${%As>A9#`?eETCRNLAQ#vF`nC0* zk+YmFJ*Pehx$}1Y;-i9*Yp?(9n;NXJ`M+Y*rioKJQ+EdhiFvJ9JUx45yv(hg4}UFw zczWfVdeNs-HyHj@lJqv5nc(Hw=qG>ZuiEL|#v*r@YHz76cjzzvKW|{uit$+HU4nOf2qy(b1wu(1T^evtgQHT^ZCR%lf>Se2?=C;)6msA za;07Vz_jz`i$neVdWAbV&WPMtdtFlRZ^i3p8=@T6vKUx=KU5t$Jv;0{(frd(7c5Ya zul*I*@H1bp-sW3^se$qOh6V?n2j}c7d{Wf!TQFMhzje-If$90c7wpSeUzF@>x4ZZ2 z>6{JUdA>irT4U^XRf+S`i39In*w{@!-B|ki`a<9Ka|M=b3U0o=3rkynLxaPS z1eFEXUoP)qO+TT-=Y!z3#W^Y!hIHr1=J>--IrdiUp#)1Gg)PQRFJE%5BoVL{pDIu~|) z;N$pi-!x?_-+CTbCGRWSm#wKUyRolQIB#Z=by3vzb%iF9#+UyaoM>Z|uiyB!f5Lap z?-LaN{=Rd1%MYn<_G`aRpBnmL^LaBR?d76cUPsHy*EX;1uyFB&iPOR!mngBWyR_xa9M0@}@$yEBz7_St z3hxiS^jj|Ur6O-px@ zHEzWdyO`@2q{?%j%RRUy#O|cMRjF0j`ndD_t9^V;uWsOE-NMt!x#kf69$igM$M5gd zAO3tk-|hKi|JJ2jI)2|}a-3JM)G*Js_~*wb2RRgG3Lf~?rqnRkdi$XS4kw1351t}o zr{X-kjDCin%4%yAY%vUMT6=_PvEy1n=e*6{Z$68pv9Bx;s1H=Q`d-d2WJBZn#}DUr z<)o@Cd7L;grDli3PK(Ioopbccv^xtYhTN6-^7yyjonuM$lNSg~d>OI#$Mt!i*;W>I z&fLlLHrlW0dG$9L)qN~3bMp+AKE4_0|8b_hwe{rNO(xj^S38(Rj+&b}7q!pvde`3< znbVloq;WmsX-Md&FTxS^_h0@@cXd75!{T>jl4`!f%_&^Q#_UYBOuT*!(+!z4)_1c_ zxGQ$*@Z|?{Ou2)a>aA?A26jzxmuoV4Y$y@0UADb_{p|yryH>=_?EP;kf9!i-dcu@H zhh=kD@h*S)&iQ*wq=(05hn1TgOjVqxFKFI8N6<+sd&Z}r9W&UJcCOJ_9a29r(dfX! zS2O13v>ZNm%HYwa8M+g0mU^m%&D+~-ca&r4rJhZnj3VY#$y{Hk8xpO$YK~UV%1DLW zBT+xp&%CL!G~~T$`LZBnit(W?|8<_*)h(p=|M|dttZ(l@U$!OOf|e15Ze z!o;*Bmzd8lqCyMv#U@nTZvS+Hk_EZjChySzVkMz8W#U@?r=obKkMdn5p7Tp-1HLpW&;1C|r{Nul}XqjxF-iy&aqm@`z><$qt~ludQ6P^d3SM;t_%O)kU6tHusk^TUZ~i~&eA~|)%AGY5mu@e9 zG&_9awa;SbzpDAnGZI_s&cEocWwXKSgPI;GE{o)DHEIUGJCH3ef8>dDThe`b_QI3C z{Ex0ptWVZIYNdAYb?J7-GB>YPXFQrrrYB@s+${NWE^c{!Z*QjC(-m7nT%WE}?p3i| zZ2Ir#1LlaGpK7<{-k$cgS9EXHy#B`K|L0CmFpuPX#_0zvzXp29?)n-2>VRCznJT7T?8}|1 z{;r5-t4VF~ICt(;?DcxK-@5&VOf&c!MrLFMI4&7dEq=ic1n{;&7GhpSZI=bO^EKRIh^D>(G# zZtaY}o&CuB#?N1G-)t{hGw-WP-~N|{b9TI!opUpr>0ioRqX+j=Z~Qs4)uI01_8E5N zvT_w~I8}D?CB4k%-tc>U(TSc9a{Io^dnBd&|9I$S#Limz*GK$jlzeu`iP$EyU)JRe&`i5G>rQAk?Aga==D_xpH}P*`+r=42>Uefk zUh182lgG*W_?~6`4Q+}$_r|2`ny9coy8b)kzW?vo@9kGrO}()pk=5_TEm2X`f2ZFz zF?_k);3NKIlm5gxmJDI%zfZsO-|X7GtAgJ4|GB64%kfQ~c=m|veZ}`{?%gOluy$R2 z;faG=SgO`@_1Gv1zy4nmZ=L@;e#Ry9_P@)HUtAxaynR;ZZFat6^;$2ZCFj4_cfI$~ zs65Rnt^UQS-Zl^J{tUpONjpyhP;Bq4&4s^4HbM<@@d6 zvi5pWyF20GYyQV~m#aUV{C{Fsg%Drp--fVjNjK(9{4FwR^5mI66W!;>G5=stSpUCM zz3kwO)$1K1BQ3)vQ{P<|Sj{kt?X|qPaLTKtUwU}{{P}#oqQ3qs+q*M=U$1YTVfxyz zXWz4^5E0q0yL|*0lp9tZ2~t_A^6=K>o{Hz<{*1BJdp3Phjj8?Ukh1J`;FsV274O$p z?s$4q_3HN-`<|uyNSA7T_|4^U_t*}5AG_&$PjB~NtCp|kEUWveT=yqIZkf%0#{X6? z^B*VvtWwNwa5DRAboKDhdh1_L=Jd?%nW0}@qdSe~7w@ur-x;6#wETJ*agFa?@Y;Vn zKl;DB}P3tAg)MDtn+PE8`3wO@r_mg^Bwe zJ^cNjzpCq(TmI{Dy0-tMMa74DgS2yV z`cALk*C%+uaep=oqXE+fkM_hKEF!cXk_Fs=z-HiWmz9_$%H#%+}OT_o2i<7p#xL7Y@H^)lk za@hZ4`{$dK8^`S~Wq7@|NJQ>d`kGkrs#Xr2yoBz>dm-+^?pV$9CTx6ZD@bR*{ zq-IXa{gT$;yUoh)?{x89KleDb{8q>ps~>7h)|r3YzkKaK#>@KFtkWJX?l{EsfW@IK z@%}#Mp9dB)td+C%JGgXu{{yu~spq0xjkg?~y!Oc)y&NubXLI@eIGyJ#6Pldc`I3+I z9G7715v^x=(5lZEvWk7ethI`Sa|aUN`}*x=dv!j4v42y`TsifB9fjo!CpTt_%#^)QeZ!;YO}*STKiMYl^hxy! zlE1Hbl{iUm(~ECduND0`=k#-lvgb)E&+m4hIzK;g>Oa};`nb66?BzX2AFSDSBa3a* z=XWj-pX(=_+9~v`{(Ro$k3uWz*BxIZeg0U>_Bw`{?A1B!7enJax`MP9G4iu)+{}1k zx&5V};B0}0Lp}^r5nDnu|1jKYo%bm9ff|!igYEwJN4uW-&Sj8F7IpZ~^82s8gm2`9 z=k>j-FT_L zCob~u`tM`Q|NHy81Gg{B9s8cTa>vho)dnBVylZ$|Zc}j5;LN`i`@EgmTs+sfWXjXx z@0eBE^ju=>vHfYXC%#hXoz!i4KX;*Zd!CAw*zJ&6`|JMU{OYrpr9Xa?oq3^N{p-^^ zW-sP#-;jBZ^@Yyd7W*6bbBmTgI5DlVV5)r6(Lm!H$}&F~9Rh*d|UlQz$%dwohR!9)-IheiKoEu(Z!2ijLQA{>;Cc{dt-JY zY5wb=760^Rbbr42H}`_-a%JVqELX!=PtG`}71cFKd1=9hs^?qsPg@x_)`oFLx5{!> z&77+KY186OTO>L;t6l_a%yVenx`csEdAI%RnisJ?fA#yl{;ro}NaR>>D(mP;^)lD# zda(hi>+8FIJ`i1DuW@tv+EZ<^yZ1e1aWMS5(S%XTM94se(IiP_f$+Otk4C||N#-n( zU;pWT-W6oTTGSPIcaN{bbS*#eIbEkeZx4~>^;joa&a$A--L!f!kLTKF->wORN?u_Zx~|kn^Z}!)LAB z@Lsxw;n5>zfee`|&scg?89nADh`Q`pBH>%a?R(&Jo#1hw74I@v?0c`y;jrMGg7ie0 z+AZ=nH;fW=I2z8VCf84zI5Vg7U2j0u_es5{%6IPAs;?PvI@#!PUG;y%1-H;1|0s z?Ei1)??1XtzpOyscf)~|2fl|!>=X$$(vvb`iM5*Fut{O}SEWV;hDIx8O-s(Ds;Lq- z6&9Bnq#76^_NS+&J=pvG-tl1n{S7@mCim`dZG3XzAlufXNr%_W{C}ijPo0LYZg+Vx zYwN*;2Py?$P0bf=*l=NPs3wzfgGoKZq{h$ZZKd`1{ov8ko$C1g&2=_M2By-saAt`Q z-@A8O3S=;agc&itxFs2DRr+XE#g+wi`FD4T&Z|z83tJ!6{q5~-*Bs^GqHg>DRvowV zcS>IG-Oc6R_vHBQolQzJGcA_pe3LWJ3kp!=V)tsDJ|W@2?$h@lu}Etb`&+Q6HY}5? z=hV1hvEb&Zyz)i)_Ze*(R3nW@|hRfaPMF^V+X^ovX?!RXGl8Kiq*ee=b&|en{W1+x^Jm#qIR<7-gtlU z!G(p&JN{ntl(2soC1Y2kGE4pQ|4R&I*0-m;iujpOsvQ#yl+=?d z#lRU;!jjP3*!w?p_4LA~QWsB#RjAk zDort-!pfObzpcy7$zx7Ng6;Q1+7X-6n2n4sEnXGx>8Y7FuSR*@{&!jPp6f|XI1rs1 zYBQ(hO3tiA(dqV_7j`Vs-JEiK@-N@_;mNLx#3o#ju`H69oVV}v-cy3Ea;~#JUiMMb ziTh*K@7tNB>QK60+0t9{M$YGLZ)@JWeePfp$q>2X#!yqODP8Y!diwff@8bW9|GlX2 zrfJHPly^s$pYUF6SoC{_!|7zJxku7>t(Y@mUe_e|e^(~^A6ndRcOqPw>92&!8j}zA ztFk4pt+{((Zo$PYOOv|Ey>IU2h^bB1nziNI7n`c%D%aemrWJeWs+x$XEMJoJX$hyz z#_UR0*4O&M#xOV3KY4KL=T*Hm(f=7YZQ8V>OY$wJ$WeR66Ss)u=?)T>mQZ|Rkf$>|I>X==FN-lBl1n zg5PEH))-vcYIA<>`K>A210|~xrA$JOSwHBr4S&}2wp#aoXX=Nz*LEK}=DprKElr|I z@93}H>q|rQzh2mS@3~M@{Okj-mOs9J;rqVRE+w+D{=VMVEoIKFXkD_+<3P_Blbm~d zcxT(+Z+r7*%?kF6J&v#6we!m!w0~E>k9m5$-5m9kUsy9)OAL<9Se^gikVAB)=4w4o zv8}AK8B149xfyviCrss%g3+bRhMAvO)~Q~!HnnDYu=BOgOp87L%SFVeKiYD6*XNq6 z&o&j^Gt^x3X`7dJ-QTa_Tk`I*z4fzTEGxFG@B4i#r0i{7ox)4a<#TwLvzK^%tEqAn zmac!&b-4BJ?s~_xDzRIoc8q*!`az3$gzg==V)8`(2e*6wlf~A%%?@UyT;J7f=HrvG zg0=4F&;1_0evZe5cOT3&{M@&oF~!H*J+sd4+nbxG=g*!rks3d#{ZSYCkT+OMVt-bl9TWOC&ZOM-lfp?0(zuoa>llP3Z@8%12 zo5%!sVTy`lkKFqb`OxPZW+e6%vTsuT{0x(XKVK(rOg$}bbK}X?@cGX3?=TvOiyuD1 z_U>Hn?ZVGz%RktZS2F)je%MsG!Fo>2j7c{R?Eidi_lB~!>~}Jas=oHq ze|An;{r<(p#S+%v-2QyKEjOnwieIPtx$iyCBR`g{3H$Nuw7x;!9hWeEcDafNc0Rk_ zrj_M-hOAOKTOn4g`s#)faAlvkiSO@^ z$@Qfc4}U!VdHVACpU>k@#P91ldrmyoL_&Z6FD0EdbtffrKb-np{NYM)@r8A{(IQi) zB^};1)#B@x;2rIAUj5s?|LbF?^t7fav#S;FMeJ!fdqwrlEg7BK&%8E&K9p?9zTS3q zBggwanhdoOyrbrSw6o`>R$A3z4|q&qB-BrAG!5C?9n;v_s+A; zEdQuHWz9c(_`t&EonjN_Ozgd#Kd-6Z{@)b-OY35-6A!m%Cz{S){7FTa@q%RUm9k7n zj)pT$=k3**ZZyeUD~k$kc5dYOcc9U^;=#Y&23c1ML_|b>)%yE+vKybiBjsQu?JxO8 z%I(}qHM1YFcm8~;pEV_AU*_Ado|+32lqPjb=kGdayK%$G#gak});@dx$C-Jrf3EMn zvd{i^j%`%+wW-|PT?PdYj(VhL8FSt`F;Usz^UU-a22YI>vw9`}*R*inuRddwadvaAr${k|wkTj=&$hZGg-ALw4c@7OxsgzMW5-+4YSZFBt>n=SeG=gk&4 zJzf8Z3W~b-3norkDyDs)ITYSIabkl#AU)*5hxKnSuL>2j`|-s&By@_qs83L|pTj4|fTokJ`MRyA zR~E>78wh=v_Cfj>pyaO7B(X3@}mgJg;!P zUiK^FNtayB8_f5ozw)x{QFLZYI&s1A49fAEdVmk3q>X4OLcloPpt%41Q z&$FrVD(L4k%$sf9A6q>o{x_Gjjs9Mfe$J$7v-)O{gp-@L7kvBq+?dHgxsi9q=W~B% zw=-z%oV7pUq*7U~;{LLeP2mxb&%3qr9WR_($7pO@!de|dL#_CycW`A3DpmKYk+Z#s|gv9+o?QkCl6~J#0vL z?_J1yCI9d5?+4fK|9ft_rRh|mHHw@M7WZFUe7A5RM}mcN!*d&!3u2qoeU2}3^{!Nz zrO&t`r|sj`#+UmlD|c4>6V+$j@?E{*PmNC0FST=Tf11D3_@d6hea`YZPa2cX+G}!I z$_@Ya7O$S`w^itXcMn6`(OLBjhxC~zIe(fm+5gZ>TfepQ7@5^Alv-ZB@hF)!agE&M z`l1VIsSkImKTo*%X=;Y(Q!l2>nEyYH%Sx1Au9(ryrBt_0{K~d3e(yA_-7nmnxJiqUO zA!7%_GDD^au_+8Sxe4`5C%$JeY@YdH?<2K_Lr!}(*BJVxuc|X(vUt5l?hH#rR4&tz zNes`7gde;=>}H^-zs`~2=1s{nEI(Rm!=-}jnKoQXTc9`h;>zL~XB{T(_dCG8zG}_; z6aPP+c_Y3d?Qgq{j)hdkccz&7zgKPc*Dg7q>oZ}()M-w4$Ijzg?}t{QjKwxW7uq zjQ8UAvG5x*y|}Q>md}u>Vy57M0}3n-zTR@b`0ehV*k^ov8pErdvNL|ooipS7nL5GO z=5-=h(-fp?RK9HY+1V+~@Y8V%htXm$Z!d#9Cgp}JChyEU>qVYy^}nF{;I3$Xq0xeG z{bIa(Wi8%KY)A=KP2Y0V`TL#TUTOPh$HUvz8guHhzglzz^h3HOq$|qW zxh*XtD}J4PY0)RBp}W~kEMw24Tz|&;s4Y&;%irC)5wXyWL&b{ghnJ7fp)beh9qE(Z zT`?hS#aE~M-$ON3*IsTl4DUPUD|~$OH@(%t76sgj44)YPG;_W?HjCxJyV@TQ1Y=4r za_sA??qQhs@ysJr&V;kGp1yEnN%*eLAg3|q`uWXV0ReBBADnIw6kyP0){EF=VZx}B zz*0X!dJe-b1Ez?LRa2{H>N7FzsCW<{C+fMvnDL4br$i6K3jNZVk~hA8u76nb%`~7a z^{?&r1)npQA2^!xa2C^~1Glanx&FXA^7k*R8zJw_Vjr=jafjD0-jy3;lxuWzbH*Bz zX9rbOIHo+$fB2~U!{6`rpnY0}cejRrh_u>JyVCYYy^xl$laN{G-d34O3^n(r|5a~| zy}qqf``){QCsc*DC@_5}W%?z2KyaBBpRAN5$=bvfU;7lm5)!(x(qCb7>yF4A(F@6G>xU+V7J%KZ7$VbvzJ zU4ZFBJR6S*V@74(g9Cy&+dR0P7~X!k^0+_gbhNY z{lSn#PA>*uUKO6%+w+be=J$PkvB}D_U48z%zRwaLvvZ$kb*nT?np7mmIpgxIX;Yn8 znJPIK@TU2Fc4J}_YS=G4fuml*e7k(yjOW=*KaMeqB;EYfYVr9_@hcaGhfIxG#*7+5 z1p#L`6>3xz&U4<_X}qh%avRTya>KOrNA0rzou2kQzr&pQD%N7PzrIDp?d;OaJ|+*G z)?a>nR6PFZ{(Zmg=S}TUWBcTMMKw3vdC|@1EIB7U9HQ8^T<>5xbF{cPo>!2wen!9Q zX|YFdKA-1yWcW9+p*yZ#(%;T<`AIjXwo{xQ7xRT?$9mbuz2>>)6dic--BR6$D~x~m z`3tKva7+F*so{4jMEOE1Z?f)joSaU^w z6Mz1rzGp1&jg~*3;eK}C{AHXAGF_NvN!By+bZH1ps9`v5D#3YU0!u+q?!<;dCeD;t zqYozL9Ucx_-gr1TISV#e$b|eBnAnif;c+0D<${P3<7;1ry?2=vCNSij`Dgp{$>a-L zi`C~GjT@nzrK|Bp1^&sr(G!BCk|nVYpNN^7Aylf`27eyQxPi486>Q~qyA zKhItN^T0yW%v(R*Ssc=)HE;DVdmWZBb!zPL;A|EtITiUWz7_Z9*MF>Fnbc^z|9_w8 z>HFpHLu@KKgb%#P?qJ~i8GE~h!$EmsLo4e$3kE-icXw)^&$~Un`ts}~6@}d9r4Ocl zK7YRT;DX1wcNaRd_ej^9o)Mk8XTAp8yhop$j~?PaB3`c&wI#}Nvwg3-SGJqt$=P;4 z=e+m*@p^r8#kZTw4L^0AmSFsmzcMe0WkI8dgB!#9wK09c=M|VVo|fAGezVWR*Ee(0 z#0HUN-ksj-_to%}z5gd~zvJ-Bf`_+WuY00-S<6QA*p_WyR3Graf9YoO_;S+GO-oN# zvS|tV-#Wda_IJ96LA}bNMSJeN-=*flAl1pDqjA8?jbZtmLN=MHPdyTNs^87r8|kcO zTA`BQJcHrgw%p#M`FoB%7QMAC_w4tj>1o>!eModJIK+9}`S>Y~CI%B;uSB=ii7AKj z{?%yz`}_X?hbNm|RgYS%{jC|XuSjy0&NQjy#V3Uv_9!uGT0Z~uH2>k3`eIv4MrlK# z4T{qkIaf{zx|?-0H2GNafBD~cqZ%%sWDos5+0SM6HcLn2D;yc@D)A*Hx8MDLmzca` z%6pGBn?e^J3Oae_db(l4g@ll4B3C<7Gn`m1i1pto*B8FSYonQwnaRn|lJ%aGMN6YV zn1MG=sbQkB{=qZp&qA^p{C%n=PS;Og`@qwsUzN4=Ig85q^7(cmoHL$vvb;Gzw_)0) z#UAG}&QE8&%km)X@$`Lr1)l$TYvUgjkX#xRz$I+^e9nO-3-qfw7BDL}D9>Tgh_##> znP8y0IDWm&e2a#272B;eGqTrIrEB_gd7bolnc(AIjdWHoFsedZ)|1Wey`5_J-1TOE2C2ZkEkmJwryE_^z9t6FYo@A z$MNqv|8#o)q0RdH53JKoxxVdSw*LMW^?5Un{$+O&$iBYDq2IWA!Kqhv7A=>Wf^`@( z8JgMo5B=HxY;$&ZrPk-C-Qth$Rm(qH#-6FW`d)NTarM_H&m}Kxt^fbq_0JY5p-uY@ zgDR_^-tMXJ`dL4dQGQLO{PsIV{MRcqwk1A1RCz+$YQ{uwOZ)zWBd*gQU623%VQz|e ztOF-2h>iOC}R1 z#Hgw+O?Y(V|kQS7-N+4p(MNV>6Qa2la6yF)X#2bIHX?fk?Qne z{ra*;*P{O)WUaZf!rP$woQ_(HnB1~VAK!z@-|bJm`TSkdamnMO;?Ea^@8?d?(`)R^ zWVQeMLH>@-)3PV>nnx}ytUrFbc>ZH8A=9X!Rh<2HCbI9>#vJwkKJ)XT%O_-KJl|)g z%e(*YH~TvkkJnn%d=U8ceLutJ`se#YYI!6$U+ocp_GoJOGh^KY9XB_pCmxv4_^#P; z27|0^R7a=z{jT`BTW3wWxg&RqS9Aw9dF?8DD4m~l?#=U^#(B@qyqw4E>9xbS{oA?w zC69G~JZzW0xIAC~O#NF`30^lpGtHTiKF$&6Iy?7#E`Db4_Q9lwZ+5blmffiIZ0M+e z|2FmX#*d4Ae`NokA8_;UVq3%T1s@-l1pRB_`SR|z@Z)2#y}{=#+E*5Y=|wLz*-^l9 zpnc-13n`y(wDFty@_)UvLHTjlL~(z8UETR&GlJ&M=+fGjd|b@#hc?rvt?Y+tU8Zxo z`iO3e$azt5=;MMVXPy;(Fa6V@x3{Os*?mHek7K=88C&pF?H|P+x=OQW^1U{gt($Q+ zCu)_?*NX{n_FYh2ux7=C^JUA{my}WJ~TW@%-vS3mslZ{u` z%6~?d(S0(hz3$ha8C+h_^t`HE{{2)oapjednuMNg$@i_!yt(!1pEs6P9ZqTXOV6xX z@O)X?_D3s^dDb7;8Ra*z(r2lDO3I~uwbmYQc8Y!T`(vVfDq;4SSD_IMiwzmuM1*C0 z-Y(95%^a6*r7*dVvD`>{(ln;XYHp?su7FA%cc$4#Jha}X6|bE=J!8@*A%@(x$2WWS zlz%>v}ED|;1z{h7yYNJxh6a8>FzV_R>@N~)t>BclwudGv>E2Hz+5cX#Hz_Q}npl-ne&9ep~W}MJ=CW_Es>a@Gb9|b+$U!X0ftJ3I1_e zyk*;&DKQ-{FQ+f?oxRPJ&ooi^l04f@g9nrKxBnGxmf`x{um0^3|=WEfTV4dD?aQc+&lS zwRd*Pt$3li=~wWiq#YTLx9PGw-P69)T=o6@<=FvWMYPNOAC%|WH%LCtm*_7(XEk|! za#*IpL#N>O-OVRTCa^Mc?C`&ACQ-5In(zGD`nJ&bYoDGw{D6Jdiu1E3{&;XMceZm{ z%G#?IGI#dB*KnOEW)ytwJikMeU!TLI?}pc78t?6``ea(k}fr7)YZ!5AJ zxpLP1{i?U;_c^Tq0mWLe9U<$rG^VDO9$J5pwbL)6x+v;Apm?K4)jaXEan+h#VYBiwSW^Xs?jr;cutv7B^rp?6<$ zSK8m2&tf$jOQrSQwIdJunWTlU%T|>YUxsaWOa;<wVU4?bZ-KUZfR&$+qN$ zz`wtb_Xh?A9ZU9gl1=y9Y=7g;|47}<`=1wXZQjzrv^8tpnib)Owkj_^uGE`uJ*o5B zrdS{53ywKXf&v|^8vYI4XL+XFo3pK<-S${a;G8a z!$0h_nRX0?r%nR#`*f*YWJ>gNzNNe zDvXSbjczUOKYD$B*!Kkd;0$c<;1m)NxFGRL<4=p#(GI@zXJ03TuQk`~dgtcp)?TrH ze}h9ei*SwTC%MS7wFVxZ+-7-qWu|@*ekG%F&)VF7{=!@ByB6GGVf|Yl8hLKT>%A;2 zEQ=b#Ka{Q$wNlv|%~g8-+}h|@C4Y+cmUkK`o$zS44G)~Unc=I>bfx*4bLyFxHo7;- zrMXVDyXd)2+2PW$O;sHG#0~GNxus0tG<6neXmH4JG+G+|P^YCNC49z(dl`z~I=MKu zBw!wqRu5K9R69H0XLLB=AVCZBHAzo`D7i!yFEy(GUKE@iiD2gpm#a1P3fbgTUm#$hn&@wsHzEC2&p- zj4a(8IBfyP