From 48bf4fb114bc8e6d6338e4f34ad84c4a3d4aedaf Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 1 Mar 2016 06:55:40 -0800 Subject: [PATCH] PDP18B: Add RB disk to PDP7 and DRM drum to PDP9 and -u, -p examine/deposit switches in PDP7, PDP9 and PDP15 --- PDP18B/pdp18b_cpu.c | 2 +- PDP18B/pdp18b_defs.h | 23 ++++- PDP18B/pdp18b_drm.c | 11 ++- PDP18B/pdp18b_dt.c | 5 ++ PDP18B/pdp18b_lp.c | 8 +- PDP18B/pdp18b_mt.c | 5 +- PDP18B/pdp18b_rf.c | 5 +- PDP18B/pdp18b_rp.c | 5 +- PDP18B/pdp18b_stddev.c | 4 + PDP18B/pdp18b_sys.c | 130 +++++++++++++++++++++++------ PDP18B/pdp18b_tt1.c | 10 ++- Visual Studio Projects/PDP7.vcproj | 4 + doc/pdp18b_doc.doc | Bin 118784 -> 104448 bytes 13 files changed, 176 insertions(+), 36 deletions(-) diff --git a/PDP18B/pdp18b_cpu.c b/PDP18B/pdp18b_cpu.c index ba9ca582..a4507974 100644 --- a/PDP18B/pdp18b_cpu.c +++ b/PDP18B/pdp18b_cpu.c @@ -434,7 +434,7 @@ static const int32 api_ffo[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static const int32 api_vec[API_HLVL][32] = { +int32 api_vec[API_HLVL][32] = { { ACH_PWRFL }, /* API 0 */ { ACH_DTA, ACH_MTA, ACH_DRM, ACH_RF, ACH_RP, ACH_RB }, /* API 1 */ { ACH_PTR, ACH_LPT, ACH_LPT }, /* API 2 */ diff --git a/PDP18B/pdp18b_defs.h b/PDP18B/pdp18b_defs.h index 61f4faeb..5fc878ae 100644 --- a/PDP18B/pdp18b_defs.h +++ b/PDP18B/pdp18b_defs.h @@ -1,6 +1,6 @@ /* pdp18b_defs.h: 18b PDP simulator definitions - Copyright (c) 1993-2012, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,6 +23,8 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 26-Feb-16 RMS Added RB09 to PDP-7 for Unix "v0" and RM09 to PDP-9 + 13-Sep-15 RMS Added DR15C 18-Apr-12 RMS Added clk_cosched prototype 22-May-10 RMS Added check for 64b definitions 30-Oct-06 RMS Added infinite loop stop @@ -78,6 +80,7 @@ Type 647B line printer (sixbit) Type 550/555 DECtape Type 24 serial drum + RB09 fixed head disk (Unix V0 only) PDP9 32K KE09A EAE KSR-33 Teletype KF09A auto pri intr PC09A paper tape reader and punch @@ -86,6 +89,7 @@ KX09A mem protection LP09 line printer (ASCII) RF09/RS09 fixed head disk RB09 fixed head disk + RM09 drum TC59 magnetic tape TC02/TU55 DECtape LT09A additional Teletypes @@ -135,12 +139,14 @@ #define TYPE647 0 /* sixbit printer */ #define TYPE550 0 /* DECtape */ #define DRM 0 /* drum */ +#define RB 0 /* fixed head disk */ #elif defined (PDP9) #define ADDRSIZE 15 #define TYPE647 0 /* sixbit printer */ #define LP09 0 /* ASCII printer */ #define RB 0 /* fixed head disk */ #define RF 0 /* fixed head disk */ +#define DRM 0 /* drum */ #define MTA 0 /* magtape */ #define TC02 0 /* DECtape */ #define TTY1 4 /* second Teletype(s) */ @@ -154,6 +160,7 @@ #define MTA 0 /* magtape */ #define TC02 0 /* DECtape */ #define TTY1 16 /* second Teletype(s) */ +#define DR 0 /* DR15C */ #define BRMASK 0377400 /* bounds mask */ #define BRMASK_XVM 0777400 /* bounds mask, XVM */ #endif @@ -271,6 +278,7 @@ typedef struct { #define DEV_TTI1 041 /* extra terminals */ #define DEV_TTO1 040 #define DEV_DRM 060 /* drum */ +#define DEV_DR 060 /* DR15 */ #define DEV_RP 063 /* RP15 */ #define DEV_LPT 065 /* line printer */ #define DEV_RF 070 /* RF09 */ @@ -320,6 +328,8 @@ typedef struct { 36 - 37 - + The DR15C uses four API channels that are assigned by software. + On the PDP-9, any API level active masks PI, and PI does not mask API. On the PDP-15, only the hardware API levels active mask PI, and PI masks the API software levels. */ @@ -437,6 +447,17 @@ typedef struct { #define CLR_INT(dv) int_hwre[API_##dv] = int_hwre[API_##dv] & ~INT_##dv #define TST_INT(dv) (int_hwre[API_##dv] & INT_##dv) +/* The DR15C uses the same relative bit position in all four interrupt levels. + This allows software to have a single definition for the interrupt bit position, + regardless of level. The standard macros cannot be used. */ + +#define INT_V_DR 7 /* to left of all */ +#define INT_DR (1 << INT_V_DR) +#define API_DR0 0 +#define API_DR1 1 +#define API_DR2 2 +#define API_DR3 3 + /* I/O status flags for the IORS instruction bit PDP-4 PDP-7 PDP-9 PDP-15 diff --git a/PDP18B/pdp18b_drm.c b/PDP18B/pdp18b_drm.c index d0448003..f65a053a 100644 --- a/PDP18B/pdp18b_drm.c +++ b/PDP18B/pdp18b_drm.c @@ -1,6 +1,6 @@ -/* pdp18b_drm.c: drum/fixed head disk simulator +/* pdp18b_drm.c: drum head disk simulator - Copyright (c) 1993-2013, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,8 +23,9 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. - drm (PDP-4,PDP-7) Type 24 serial drum + drm (PDP-4,PDP-7) Type 24 serial drum; (PDP-9) RM09 drum + 26-Feb-16 RMS Added PDP-9 support; set default state to disabled 03-Sep-13 RMS Added explicit void * cast 14-Jan-04 RMS Revised IO device call interface 26-Oct-03 RMS Cleaned up buffer copy code @@ -37,6 +38,8 @@ 10-Jun-01 RMS Cleaned up IOT decoding to reflect hardware 26-Apr-01 RMS Added device enable/disable support 14-Apr-99 RMS Changed t_addr to unsigned + + Variable drum sizes are not supported. */ #include "pdp18b_defs.h" @@ -118,7 +121,7 @@ DEVICE drm_dev = { 1, 8, 20, 1, 8, 18, NULL, NULL, &drm_reset, &drm_boot, NULL, NULL, - &drm_dib, DEV_DISABLE + &drm_dib, DEV_DISABLE + DEV_DIS }; /* IOT routines */ diff --git a/PDP18B/pdp18b_dt.c b/PDP18B/pdp18b_dt.c index 821b7fa1..54c23a0a 100644 --- a/PDP18B/pdp18b_dt.c +++ b/PDP18B/pdp18b_dt.c @@ -27,6 +27,7 @@ (PDP-9) TC02/TU55 DECtape (PDP-15) TC15/TU56 DECtape + 13-Mar-15 RMS Added APIVEC register 28-Mar-15 RMS Revised to use sim_printf 23-Jun-06 RMS Fixed switch conflict in ATTACH Revised Type 550 header based on DECTOG formatter @@ -327,6 +328,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 dtsa = 0; /* status A */ @@ -418,6 +420,9 @@ REG dt_reg[] = { DT_NUMDR, REG_HRO) }, { ORDATA (DEVNO, dt_dib.dev, 6), REG_HRO }, { FLDATA (STOP_OFFR, dt_stopoffr, 0) }, +#if defined (TC02) + { ORDATA (APIVEC, api_vec[API_DTA][INT_V_DTA], 6), REG_HRO }, +#endif { NULL } }; diff --git a/PDP18B/pdp18b_lp.c b/PDP18B/pdp18b_lp.c index 801f05f1..dae5ee1a 100644 --- a/PDP18B/pdp18b_lp.c +++ b/PDP18B/pdp18b_lp.c @@ -1,6 +1,6 @@ /* pdp18b_lp.c: 18b PDP's line printer simulator - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2015, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -28,6 +28,7 @@ lp09 (PDP-9,15) LP09 line printer lp15 (PDP-15) LP15 line printer + 13-Sep-15 RMS Added APIVEC register 19-Jan-07 RMS Added UNIT_TEXT flag 11-Jun-06 RMS Made character translation table global scope 14-Jan-04 RMS Revised IO device call interface @@ -47,7 +48,10 @@ */ #include "pdp18b_defs.h" + extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; + const char fio_to_asc[64] = { ' ','1','2','3','4','5','6','7','8','9','\'','~','#','V','^','<', '0','/','S','T','U','V','W','X','Y','Z','"',',','>','^','-','?', @@ -534,6 +538,7 @@ REG lp09_reg[] = { { DRDATA (TIME, lp09_unit.wait, 24), PV_LEFT }, { FLDATA (STOP_IOE, lp09_stopioe, 0) }, { ORDATA (DEVNO, lp09_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_LPT][INT_V_LPT], 6), REG_HRO }, { NULL } }; @@ -720,6 +725,7 @@ REG lp15_reg[] = { { FLDATA (STOP_IOE, lp15_stopioe, 0) }, { BRDATA (LBUF, lp15_buf, 8, 8, LP15_BSIZE) }, { ORDATA (DEVNO, lp15_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_LPT][INT_V_LPT], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_mt.c b/PDP18B/pdp18b_mt.c index 7f552741..ed7eb53f 100644 --- a/PDP18B/pdp18b_mt.c +++ b/PDP18B/pdp18b_mt.c @@ -1,6 +1,6 @@ /* pdp18b_mt.c: 18b PDP magnetic tape simulator - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2015, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,7 @@ mt (PDP-9) TC59 magtape (PDP-15) TC59D magtape + 13-Sep-15 RMS Added APIVEC register 14-Nov-08 RMS Replaced mt_log with standard debug facility 16-Feb-06 RMS Added tape capacity checking 16-Aug-05 RMS Fixed C++ declaration and cast problems @@ -126,6 +127,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 mt_cu = 0; /* command/unit */ @@ -178,6 +180,7 @@ REG mt_reg[] = { { URDATA (POS, mt_unit[0].pos, 10, T_ADDR_W, 0, MT_NUMDR, PV_LEFT | REG_RO) }, { ORDATA (DEVNO, mt_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_MTA][INT_V_MTA], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_rf.c b/PDP18B/pdp18b_rf.c index 9f78c285..583942e0 100644 --- a/PDP18B/pdp18b_rf.c +++ b/PDP18B/pdp18b_rf.c @@ -1,6 +1,6 @@ /* pdp18b_rf.c: fixed head disk simulator - Copyright (c) 1993-2013, Robert M Supnik + Copyright (c) 1993-2015, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,7 @@ rf (PDP-9) RF09/RF09 (PDP-15) RF15/RS09 + 13-Sep-15 RMS Added APIVEC register 03-Sep-13 RMS Added explicit void * cast 04-Oct-06 RMS Fixed bug, DSCD does not clear function register 15-May-06 RMS Fixed bug in autosize attach (David Gesswein) @@ -110,6 +111,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 rf_sta = 0; /* status register */ @@ -157,6 +159,7 @@ REG rf_reg[] = { { FLDATA (STOP_IOE, rf_stopioe, 0) }, { DRDATA (CAPAC, rf_unit.capac, 31), PV_LEFT + REG_HRO }, { ORDATA (DEVNO, rf_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_RF][INT_V_RF], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_rp.c b/PDP18B/pdp18b_rp.c index e1a0755d..ebf889cc 100644 --- a/PDP18B/pdp18b_rp.c +++ b/PDP18B/pdp18b_rp.c @@ -1,6 +1,6 @@ /* pdp18b_rp.c: RP15/RP02 disk pack simulator - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2015, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ rp RP15/RP02 disk pack + 13-Sep-15 RMS Added APIVEC register 14-Jan-04 RMS Revised IO device call interface 06-Feb-03 RMS Revised IOT decoding, fixed bug in initiation 05-Oct-02 RMS Added DIB, device number support @@ -133,6 +134,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1], nexm; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 rp_sta = 0; /* status A */ @@ -188,6 +190,7 @@ REG rp_reg[] = { { DRDATA (STIME, rp_swait, 24), PV_LEFT }, { DRDATA (RTIME, rp_rwait, 24), PV_LEFT }, { ORDATA (DEVNO, rp_dib.dev, 6), REG_HRO }, + { ORDATA (APIVEC, api_vec[API_RP][INT_V_RP], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_stddev.c b/PDP18B/pdp18b_stddev.c index da709b85..a983f713 100644 --- a/PDP18B/pdp18b_stddev.c +++ b/PDP18B/pdp18b_stddev.c @@ -29,6 +29,7 @@ tto teleprinter clk clock + 13-Sep-15 RMS Added APIVEC register to PTR, CLK only 28-Mar-15 RMS Revised to use sim_printf 18-Apr-12 RMS Added clk_cosched routine Revised clk and tti scheduling @@ -86,6 +87,7 @@ extern int32 M[]; extern int32 int_hwre[API_HLVL+1], PC, ASW; +extern int32 api_vec[API_HLVL][32]; extern UNIT cpu_unit; int32 clk_state = 0; @@ -181,6 +183,7 @@ REG clk_reg[] = { #endif { DRDATA (TIME, clk_unit.wait, 24), REG_NZ + PV_LEFT }, { DRDATA (TPS, clk_tps, 8), PV_LEFT + REG_HRO }, + { ORDATA (APIVEC, api_vec[API_CLK][INT_V_CLK], 6), REG_HRO }, { NULL } }; @@ -228,6 +231,7 @@ REG ptr_reg[] = { { DRDATA (POS, ptr_unit.pos, T_ADDR_W), PV_LEFT }, { DRDATA (TIME, ptr_unit.wait, 24), PV_LEFT }, { FLDATA (STOP_IOE, ptr_stopioe, 0) }, + { ORDATA (APIVEC, api_vec[API_PTR][INT_V_PTR], 6), REG_HRO }, { NULL } }; diff --git a/PDP18B/pdp18b_sys.c b/PDP18B/pdp18b_sys.c index 239af0a0..50ac3afa 100644 --- a/PDP18B/pdp18b_sys.c +++ b/PDP18B/pdp18b_sys.c @@ -1,6 +1,6 @@ /* pdp18b_sys.c: 18b PDP's simulator interface - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2016, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,6 +23,8 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 26-Feb-15 RMS Added support for -u modifier (UC15 and Unix v0) + 13-Sep-15 RMS Added DR15C instructions 30-Oct-06 RMS Added infinite loop stop 18-Oct-06 RMS Re-ordered device list 02-Oct-06 RMS Added RDCLK instruction @@ -103,6 +105,8 @@ extern int32 PC; extern const char asc_to_baud[128]; extern const char baud_to_asc[64]; extern const char fio_to_asc[64]; +extern t_stat fprint_sym_cm_w (FILE *of, t_addr addr, t_value *val, int32 sw); +extern t_stat parse_sym_cm_w (char *cptr, t_addr addr, t_value *val, int32 sw); /* SCP data structures and interface routines @@ -126,7 +130,7 @@ char sim_name[] = "PDP-15"; REG *sim_PC = &cpu_reg[0]; -int32 sim_emax = 2; +int32 sim_emax = 3; DEVICE *sim_devices[] = { &cpu_dev, @@ -501,6 +505,12 @@ static const char *opcode[] = { "DTCA", "DTRA", "DTXA", "DTLA", "DTEF", "DTRB", "DTDF", #endif +#if defined (DR) /* DR15C */ + "SIOA", "CIOD", "LIOR", + "RDRS", "LDRS", + "SAPI0", "SAPI1", "SAPI2", "SAPI3", + "CAPI0", "CAPI1", "CAPI2", "CAPI3", +#endif #if defined (TTY1) "KSF1", "KRB1", "TSF1", "TCF1", "TLS1", "TCF1!TLS1", @@ -738,6 +748,12 @@ static const int32 opc_val[] = { 0704101+I_NPI, 0704112+I_NPN, 0704001+I_NPI, 0704002+I_NPI, 0704004+I_NPI, 0704006+I_NPI, #endif +#if defined (DR) + 0706001+I_NPI, 0706002+I_NPI, 0706006+I_NPI, + 0706112+I_NPI, 0706122+I_NPI, + 0706101+I_NPI, 0706121+I_NPI, 0706141+I_NPI, 0706161+I_NPI, + 0706104+I_NPI, 0706124+I_NPI, 0706144+I_NPI, 0706164+I_NPI, +#endif #if defined (PDP7) 0703201+I_NPI, 0703301+I_NPI, 0703341+I_NPI, 0703302+I_NPI, 0707701+I_NPI, 0707702+I_NPI, 0707742+I_NPI, 0707704+I_NPI, @@ -880,13 +896,13 @@ static const int32 opc_val[] = { status = space needed? */ -int32 fprint_opr (FILE *of, int32 inst, int32 class, int32 sp) +int32 fprint_opr (FILE *of, int32 inst, int32 clss, int32 sp) { int32 i, j; for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */ j = (opc_val[i] >> I_V_FL) & I_M_FL; /* get class */ - if ((j == class) && (opc_val[i] & inst)) { /* same class? */ + if ((j == clss) && (opc_val[i] & inst)) { /* same class? */ inst = inst & ~opc_val[i]; /* mask bit set? */ fprintf (of, (sp? " %s": "%s"), opcode[i]); sp = 1; @@ -919,52 +935,78 @@ return (c >> 1) | (c << 5); t_stat fprint_sym (FILE *of, t_addr addr, t_value *val, UNIT *uptr, int32 sw) { -int32 cflag, i, j, k, sp, inst, disp, ma; +int32 i, j, k, sp, inst, disp, ma; +t_bool cflag; +DEVICE *dptr; + +if (uptr == NULL) + uptr = &cpu_unit; +dptr = find_dev_from_unit (uptr); +if (dptr == NULL) + return SCPE_IERR; inst = val[0]; -cflag = (uptr == NULL) || (uptr == &cpu_unit); -if (sw & SWMASK ('A')) { /* ASCII? */ +if ((sw & SWMASK ('A')) != 0) { /* ASCII? */ if (inst > 0377) return SCPE_ARG; fprintf (of, FMTASC (inst & 0177)); return SCPE_OK; } -if (sw & SWMASK ('C')) { /* character? */ +#if defined (UC15) +if (dptr->dwidth == 16) /* 16b device? */ + return fprint_sym_cm_w (of, addr, val, sw); +#endif + +if (dptr->dwidth < 18) /* 18b device? */ + return SCPE_ARG; + +if ((sw & SWMASK ('C')) != 0) { /* character? */ fprintf (of, "%c", SIXTOASC ((inst >> 12) & 077)); fprintf (of, "%c", SIXTOASC ((inst >> 6) & 077)); fprintf (of, "%c", SIXTOASC (inst & 077)); return SCPE_OK; } -#if defined (PDP4) || defined (PDP7) -if (sw & SWMASK ('F')) { /* FIODEC? */ +if ((sw & SWMASK ('F')) != 0) { /* FIODEC? */ fprintf (of, "%c", fio_to_asc[(inst >> 12) & 077]); fprintf (of, "%c", fio_to_asc[(inst >> 6) & 077]); fprintf (of, "%c", fio_to_asc[inst & 077]); return SCPE_OK; } -if (sw & SWMASK ('B')) { /* Baudot? */ +if ((sw & SWMASK ('B')) != 0) { /* Baudot? */ fprintf (of, "%c", baud_to_asc[rar (inst >> 12) & 077]); fprintf (of, "%c", baud_to_asc[rar (inst >> 6) & 077]); fprintf (of, "%c", baud_to_asc[rar (inst) & 077]); return SCPE_OK; } -#endif -#if defined (PDP15) -if (sw & SWMASK ('P')) { /* packed ASCII? */ - i = val[1]; +#if defined (PDP7) || defined (PDP9) +if ((sw & SWMASK ('U')) != 0) { /* Unix v0 ASCII? */ + fprintf (of, FMTASC ((inst >> 9) & 0177)); + fprintf (of, FMTASC (inst & 0177)); + return SCPE_OK; + } +#elif defined (PDP15) +if ((sw & SWMASK ('P')) != 0) { /* packed ASCII? */ + int32 t = val[1]; fprintf (of, FMTASC ((inst >> 11) & 0177)); fprintf (of, FMTASC ((inst >> 4) & 0177)); - fprintf (of, FMTASC (((inst << 3) | (i >> 15)) & 0177)); - fprintf (of, FMTASC ((i >> 8) & 0177)); - fprintf (of, FMTASC ((i >> 1) & 0177)); + fprintf (of, FMTASC (((inst << 3) | (t >> 15)) & 0177)); + fprintf (of, FMTASC ((t >> 8) & 0177)); + fprintf (of, FMTASC ((t >> 1) & 0177)); return -1; } +if ((sw & SWMASK ('U')) != 0) { /* Unibus ASCII? */ + fprintf (of, FMTASC (inst & 0177)); + fprintf (of, FMTASC ((inst >> 8) & 0177)); + return SCPE_OK; + } #endif -if (!(sw & SWMASK ('M'))) +if ((sw & SWMASK ('M')) == 0) /* symbolic? */ return SCPE_ARG; /* Instruction decode */ +cflag = (uptr == &cpu_unit); +inst = val[0]; for (i = 0; opc_val[i] >= 0; i++) { /* loop thru ops */ j = (opc_val[i] >> I_V_FL) & I_M_FL; /* get class */ if ((opc_val[i] & DMASK) == (inst & masks[j])) { /* match? */ @@ -1094,15 +1136,22 @@ return get_uint (cptr, 8, 0777777, status); Outputs: status = error status */ - t_stat parse_sym (char *cptr, t_addr addr, UNIT *uptr, t_value *val, int32 sw) { -int32 cflag, d, i, j, k, sign, damask, epcmask; +int32 d, i, j, k, sign, damask, epcmask; t_stat r, sta = SCPE_OK; char gbuf[CBUFSIZE]; +t_bool cflag; +DEVICE *dptr; -cflag = (uptr == NULL) || (uptr == &cpu_unit); -while (isspace (*cptr)) cptr++; +if (uptr == NULL) + uptr = &cpu_unit; +dptr = find_dev_from_unit (uptr); +if (dptr == NULL) + return SCPE_IERR; + +while (isspace (*cptr)) + cptr++; for (i = 1; (i < 5) && (cptr[i] != 0); i++) { if (cptr[i] == 0) { for (j = i + 1; j <= 5; j++) @@ -1115,6 +1164,21 @@ if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) { /* ASCII char? */ val[0] = (t_value) cptr[0] | 0200; return SCPE_OK; } +#if defined (UC15) +if (dptr->dwidth == 16) { /* 16b decode? */ + if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* char string? */ + if (cptr[0] == 0) /* must have 1 char */ + return SCPE_ARG; + val[0] = (((t_value) cptr[1] & 0377) << 8) | + ((t_value) cptr[0] & 0377); + return SCPE_OK; + } + return fparse_sym_cm_w (of, addr, val, uptr, sw); + } +#endif +if (dptr->dwidth < 18) /* 18b decode? */ + return SCPE_ARG; /* no, fail */ + if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* sixbit string? */ if (cptr[0] == 0) /* must have 1 char */ return SCPE_ARG; @@ -1123,8 +1187,16 @@ if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* sixbit string? */ ((t_value) cptr[2] & 077); return SCPE_OK; } -#if defined (PDP15) -if ((sw & SWMASK ('P')) || ((*cptr == '#') && cptr++)) { /* packed string? */ +#if defined (PDP7) || defined (PDP9) +if (sw & SWMASK ('U')) { /* Unix v0 ASCII? */ + if (cptr[0] == 0) /* must have 1 char */ + return SCPE_ARG; + val[0] = (((t_value) cptr[0] & 0177) << 9) | + ((t_value) cptr[1] & 0177); + return SCPE_OK; + } +#elif defined (PDP15) +if (sw & SWMASK ('P')) { /* packed string? */ if (cptr[0] == 0) /* must have 1 char */ return SCPE_ARG; val[0] = (((t_value) cptr[0] & 0177) << 11) | @@ -1135,6 +1207,13 @@ if ((sw & SWMASK ('P')) || ((*cptr == '#') && cptr++)) { /* packed string? */ (((t_value) cptr[4] & 0177) << 1); return -1; } +if (sw & SWMASK ('U')) { /* Unibus ASCII? */ + if (cptr[0] == 0) /* must have 1 char */ + return SCPE_ARG; + val[0] = (((t_value) cptr[1] & 0377) << 8) | + ((t_value) cptr[0] & 0377); + return SCPE_OK; + } #endif cptr = get_glyph (cptr, gbuf, 0); /* get opcode */ @@ -1144,6 +1223,7 @@ if (opcode[i] == NULL) val[0] = opc_val[i] & DMASK; /* get value */ j = (opc_val[i] >> I_V_FL) & I_M_FL; /* get class */ +cflag = (uptr == &cpu_unit); switch (j) { /* case on class */ case I_V_XR: /* index */ diff --git a/PDP18B/pdp18b_tt1.c b/PDP18B/pdp18b_tt1.c index 5340ceef..029f8c66 100644 --- a/PDP18B/pdp18b_tt1.c +++ b/PDP18B/pdp18b_tt1.c @@ -1,6 +1,6 @@ /* pdp18b_ttx.c: PDP-9/15 additional terminals simulator - Copyright (c) 1993-2013, Robert M Supnik + Copyright (c) 1993-2015, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ ttix,ttox LT15/LT19 terminal input/output + 13-Sep-15 RMS Added APIVEC register 11-Oct-13 RMS Poll TTIX immediately to pick up initial connect 18-Apr-12 RMS Revised to use clock coscheduling 19-Nov-08 RMS Revised for common TMXR show routines @@ -63,6 +64,7 @@ TMXR ttx_desc = { 1, 0, 0, ttx_ldsc }; /* mux descriptor */ #define ttx_lines ttx_desc.lines /* current number of lines */ extern int32 int_hwre[API_HLVL+1]; +extern int32 api_vec[API_HLVL][32]; extern int32 tmxr_poll; extern int32 stop_inst; @@ -105,6 +107,9 @@ REG ttix_reg[] = { { FLDATA (INT, int_hwre[API_TTI1], INT_V_TTI1) }, { DRDATA (TIME, ttix_unit.wait, 24), REG_NZ + PV_LEFT }, { ORDATA (DEVNUM, ttix_dib.dev, 6), REG_HRO }, +#if defined (PDP15) + { ORDATA (APIVEC, api_vec[API_TTI1][INT_V_TTI1], 6), REG_HRO }, +#endif { NULL } }; @@ -164,6 +169,9 @@ REG ttox_reg[] = { { FLDATA (INT, int_hwre[API_TTO1], INT_V_TTO1) }, { URDATA (TIME, ttox_unit[0].wait, 10, 24, 0, TTX_MAXL, PV_LEFT) }, +#if defined (PDP15) + { ORDATA (APIVEC, api_vec[API_TTO1][INT_V_TTO1], 6), REG_HRO }, +#endif { NULL } }; diff --git a/Visual Studio Projects/PDP7.vcproj b/Visual Studio Projects/PDP7.vcproj index 0364ef2e..5db5c960 100644 --- a/Visual Studio Projects/PDP7.vcproj +++ b/Visual Studio Projects/PDP7.vcproj @@ -209,6 +209,10 @@ RelativePath="..\PDP18B\pdp18b_mt.c" > + + diff --git a/doc/pdp18b_doc.doc b/doc/pdp18b_doc.doc index 1fb4b54c0953cd3e5e1a6c496fc57be924086273..b3fd495641d5e84be69ba5ade9e70fc6d9b6e68e 100644 GIT binary patch delta 24241 zcmciK2SCmHIvkM-UKWy+$*hd8 zd3kwa>0xASYMUneo9{E$lce{>_lm`m#J0SQBPE7ZRYg*Jn52^R%c!Dssw&gf8_qS!-(E~#mdv03pQct?!4pe$G!1O>7k+Pgf>mc( zZ^dzG);lzjq+LoD{AmjvNjhPlAHcs&SC^KgXtpb%kfbean#r^~(bnrz{>iBDn2_&lCIRNG4W{CNV7hFt8ax;#IGs~HAkkIYEn+~ znT(V5E0+8AF+U*9XHAA>G!~obsFSOrQnR-3R1^8a%L{+jL{^hHg{S{vy;3T?!+-0u zCN&F3`0t-hwUd=xXyE$y_1{*DWzgT;Q0eG`IX!w4*LP*}VoI4(>P zJ+OaBSR65Mtya6bLbHXcSA;?}wWm|smYA}pZEGunqeB&K{MuBjqlgRZ9TOfMIV?;O z6CI`q4h@Y=h>VFQg7JeR6M9F~H8V4=Hjub;EU{6+LlwdCiVo3{LllEt6+Z2Kn>SZD zB@B*HDMpk~vXOCQw4zRkB4lVnSbSAQNMv}mu;|dp;Am$vvp^0r+9|v zC{k3CO!552$s4;;m!{566931h#;3;jXyMg@`d->PqDqa$s)mbg3?0<7lFECfooQv= zzM?V6Um3Jm(YvhH0;#pXj?~6qS8B_&gOMD>#3X-bu~f3Qj_B%G?QdI&O~mq@jjH~0 zxqZPGFJ4@-EZY#De{Q2F*d}waof-2Y9CxG9zWz?C(~C=pCE^>uEm0P1pTFd9!F4wp zEn-trj7vnCi*&9GO~ufi-`z*poUl{RG)Tg{L@Yhk-yn*O<{Ko{{xubQ78el?MhJQ%6bTrJ zK}g07%!CTFFdK7_g1Oj&t@zOcA58nNiPq0K@Q?pIa1r5cNXHKB#2)O$K3u_7T*GzT zz)j@f7H;D!^6;YvK7fk%a}WHrR?-&axQMVs(U+kIeUyhID!>~J;e$r-g&#z9X@aKc zjZpmPf%l^&`nd=GOe<*%4qQYy41ExZzDUGqjKMpm}jg`VA(QlGG0u(U!B0tte4~5`uo%ft@&x6DY&5wF#P{ zJ$j;_wQ9x^U)7Q&rBt7OFQt0+dnK5uO00hzB+{%L%EJlH@J2)Upc}fQ2ZGQOy&$3- zg5FRf5kH#tT?~G9+F#Sk-GV|VB0L&nFaZ;>5Wiv({=jzZz)tMKZisx^i+#9;>-fE#9iFOM|{F(SX1~)!Um;a2YZOZSq5cM5B2e*2i}q~(a&vW zvb2)6;J`(Mz0d%@@I!a>KoEvtD28DKMq(61jZDO7{E9{R(F1R4{Id`Im{!sj9Jq+^ zVl2T*tin$0!fsr`Wn|+juHiav;3jhL8DH?D2kyh@_vhyLA+4k>IB*f+ugHTQZK*yg zq7t0Y2)^(`6EsCLh_=@s0SHF~e)PcWG2H*T2fjxuX$uZqL^u+C(I3(H1rsn4%di|P zunMcO2BO1Ri*-1HqxjJScjw&Z=N|YUT1i`Q;3C4AIEIrrh5LAbhtQ=L)q_3^VFY7{ zUbYBK;RI*==z+U%BKLC-e6v>4796;UaAj0Mb-17zn!_KV2tyx4AQF8ch89uik0eaO zj~=))Bln+s;J<4nZNY(y2v5coOh+=(umxLj8d*4lb2yI+5aX#!xQy3$gC9Nc@{Hqt z?t!n;O4@=07ZHAocld};sLtTf1+MT%09v3GTB8lbAhI3WBL=bf(E~5dc;V+BxH!qt zd_%#3iwF-u90p<#W;uT(_D8qkqSfDs8VFhuzV2zTfiCXy4120A+`g0F_mR8cL4_sMXMA#i3 zs0~jvK~pqC2znzFeGrZah;yXA(3~HMbE2X6+rbC=dAfPJ6}||mbs@2_`dX#>D&&8< zl36VO8dv{jl3p|h8p+?ik|uhZpPPu&w6ZBb5iR=_9Q-h*8{|_h*X@zW8}e_Tb@aQhn`S%!_O0>MQpD%d7WV6-rWyi~piR1&RWq$@}Nbw;}&U z85n>#EW`M5sg{cg`2RT zFjt13LKS!DCKY4hw~FD%@-QS~DRv+mS71e<7nQ&nq9S-Q%Uvv;Zmxc!wRL?EC#VyjukkB z9DKk>l%yVty4V)|u?Tlig1RW`XDh75I%w+XIp*h5Peonbgw4o8E(nZphPPwF=*`q07n%3?VYoEc$l?Da% z&=G?%ADPI7c?~Yc!3VuC3BThgo};)M--?ci!+adV6ByJa!_fw#unb?MvLNB2e&1h>_({hRy)C-~&4M!VV&bIgyq7^l- z!-xZ+_-!qbfHtwB8bh_A>NCY961mz|0jHgTLbz%jKDTz zqqui|&rqM~NQ^=)9|kZ8hv+GkNW^j+LJmwCk%6wfg*5t3@d;st=wHTSDMUYW6q(3{ zt}g`_RnP$5=mXIgjY1PYhD-3FKWc<{h`wnu#Pcj0k%cF)ZbFVC245uAg*~fDpDfw{ z+DhGmlo9Jhzm|**5dGT)T*MbxH0AjtctZ4ht#AaQ|9gp7aBar*WvGyWT$F20{Natx z=z<4$h-Ut(GkeAnmv?`UOEdrc?z9)vV2s0hoWdhm1aR!obhR^>e+ALy7HL6Yf(v?J z6y{?;UO{xpX1I)OJa0ujQKfZ$TrL-iOO@97UAQk(KZIiYximS3ekO z5MBN;9LF=5x8-}#0evwEn{WrZ?ed2Q4othW`%Z!B!U{2V7=SoT#ReS1eSAjw_W5Ir zj!dUvI#xl9H4fk=q(H_Ta7PD>zy_Rx7>_)GeTV#Ui7(UdR&lYy5B)F!6R{CuAd>+D z1~FnlQw?HJ6NpIkMKZ)7XAOSCG5m=<_n>Z~G*29 za1Gb-`q}^d?}29hwL;rvz0N9DXwkFRJcMYc{I|zD{_Sy)LW5B;xYRs8qCL>mj5Aw` z!cZAAFcY=NXicW~?kaVXCbM7)u0WIm{ce;>_#zsskPTf*ggZnjX@^tLE+suEB|(@= z$(R@Poq9Qs6`Kl*&K;%>6rE1!j42RBX$4jy2j&zhSBT=(2~!}7*$S-09avJ_Y9R*W zA&TH)JcTHVUnKETW$&?4mA+GnLESs~jq28(nhZIMC`D(-kjZ>pmQD~Pac*WW_OhYC zibC8R2^fg^Sb)t)!x3D?OIT8-ozNV8Fd4r=l=owJ08#GEDeD%fjh3ON^bO1m$B5AH zq}K>mEQhEi2k{1?wwQ%+!2`9>0fR6TtC4}{5H-pI)gfwD2Xw?ph*~xanwnOW8a55n zu?37@I()YHewup#UdPqXftji z2QN{qKTQBSArVV)0iR(>+alVRTDXPVkYY3u(mJV^Xmms)R0&RK4bdR=fu>Q)V?LP1 zNHk8~v^@ zqOnx>gF3P*=tYDo=Y>Kkmi-P*BU)z|<9H0kDy+s?oP+6b$~PQQ0iI}$1kA=ZT*PzO zj9|b7Z}dPA5-<=ekzeU_xA=e}O2UB!njip!mAnnX0hCUpoy2^cN72z#TQo)!1VD-Ln1sbR zj+3}IhOz8evTYn=D;STb5aUmLL4{vvt6?{RCIIvB8`>!+QUGxuAFw=$6}XSLC_RN5 z@#y7^%Ub_VWbDgGKXF6+WA21lbs~fLO_wt^@lR_@?Y-!yc#1B+Z?Y(%zG%Xw6Q$O* zlkZ+r`5(Hy|J2nH}*g~pN+}q!3Fs} zk7*XfPYGP0$^RtgHDy4P_vU1)Cci~Crxs-OL8e~_f+p~{d(9Y>O;-hFnyF^KsKvCB z{DdCKR$K&8-FaiB)H9dDL&Y^FNppF|PV8@=m|tXSGwp>jm5uZMX|jgbXP{b?br3UE>BBzqVaCX_G~nUyEuK_3CJgb`Vt{1T&$+pU_l^kIV;B6*^!U zG*x6R^M689Ro*dgPjwMh#trSz9{nJiz`Jyzi?iq;v@f)Ym5G>(->@HN@d!FoxyXfz z@Pt3Qp+A&J#!_s;ew@V}yoUZXPF_(7o@kD)=!X&0zLPQ|STPlguo3%l4tMYhy3>ga zs>2H{&<%Yt6cdqxRoIF{IEUMK0V$c*3}sLa^$~zVCrRzq*Tcn%u871COu!th#1Y^fiOOZw5$5bErCBtLcOzXO>Ts1}3 zksVA+re^8bz%)5ahmFq4tMp_mWsqJeskkIdMF_=^W6FQ&iD#gtx&I3u2K1)?!5|$* zaNno=YsJ3>(tsWRZQcL><+M7516jjSYnEAS&1;qwp8oN_*rxD45i(;Fcqsov(iPtE zzx`SH-wyEq7@ks{)Tz4pN$y5!(5XrL_?(3t%}7hES4IQTQBl-n3`IM&*EhuwMwaABUiBuk>rN5q$7oVTba_$Ms8~v zD(R?Kglerww~^ah21&Z=6+v1nO4!ORE!#J{y@R`j=(eJledef5e!trgpCWnary zl7V_fE3FlVrDQM5hBSyGR$5U`XOJ@mf}17Bp=1g zyrq(#WJ5haC53aJ$*U2#%>mPE0E zLaN)bh*a_|m7>-~14-7`%$Vp#Nx@>Vj#Py0oTPq=*LnNJFBAU?*H9gnLTbTx#!Cro zrBg~WRe!6W)Rl<8{9F8b5WjjAB}?@YRg}y$5tsCdUu(&ixYQ6~NFqP0OIGUbs(;%q zWv887+PAt?qVNi>0BW+U3H^`xxEwhMA|Pu?B)WD$MeNl9l`OnMDY%Gd<9E$IkG)sTf8pkaMim~8IWq0YvJv}^&U3WRyu5jJhfnWXoDFQW zMqwRQHM{1!MfL8)?JjG$_2ArvtNk~=Y*fYZv0c+1D{t0rovmEoF==!uoBF{k&F8+} zv1gZ4?Fos^ljgTuIsDJq@D`iBrX|OfOYs_dyjCza$ntIk4?Do5x8rJnv-s zUb?5dEwyxKuV?o@%yqn-yk&>CN2}lceT~MZ?VEZ2$(j#MGOZg`KeoNno9Zj7BrQGJ zB-fLU7~hfpSF402#=r> zt@h_x^?Kv|!1CM)Wj7^hl9#6|{XNB2UR-^DA1UQQ`4NS`XIxlRyi0ZQK5qKyz6V`R zCp;g&d+eE!ZOqiX*H|yQ_AF(K$h#p+*SOqizdLzN*xK`DvbO&5;o=t#=AVb!Z|EHBu^i$g z*n?k;_78K>dT$vV9ULAOCrXLwiIye@6&4L|ja)i7IlFf6olcEIHXq-x^R48&u$0e{ zC1)33y>#!+*xJfdH?1x#2r%nXb)lizq_C6KC#L6)sJhy2&6Q^MhpR^2I#S}#heK>K zw@kIX+5BjH+mYojB#&Re^}6EX)+!eqo>#pdwB50<*W{+19-MpUe7o`EDiuw1Jii}% z*XzE{Yv_wt*fEsneQ#GUkYd@;14N}2lfdYQK_>xVY0yijlM zi*Z|aJI}bWb?UpDJ11T0;1@Ec*T{0023(yy%l}f!oE7E=I|u#g+`L!xiN;e(?3xto zZ1LXcK}J;M_Kw|pOsdhc{;V9Eqc=)T|E+aa8`W!%xZ7R^8Nv;kWE1838<~-F8onK{ zXi)ma-`%^9Ncwtg;feLFR-cOs+uV7XL1d&&+jd%rw6eWdJi??t0t zy*yL$!jLW*c^?l}+WYzQPd_q;sEngYE0oJ+w8aw0v*5 z$&it8r;81-NJ?5(V&ULrm*r=1%2Rc_2X+l^`l|B0p`OhT^!+oWUB=ViBRU`6Ioa~a z-rdbj2G%qWX!;`B&%VYxn^smun>VsL8~-^m+2rZ7c8@L(O!+t_ph3q6)f<;?QKhBZ zit?4__nEvc(sb0kjt@=04vI<}ZaC0$-PvK2?RPXgYI36TxU$9nocp5gA}9M!Gwg5A zoozNssk?5C|Iz({@58#cuAH0D%%y2IuOwvflBjXoYDzTW>T- zk9;t(RuK!Yn#D@&+12U~%e`Zr?Rtm!n^_H9-SJ4R4?7Q>bP7~PAHQ|mr1q?1C3|{r zNdDBnTK0m};T`Usc$?H{x6$Cu^#^Y^dT_Ppuj#pt+2xZhUUfUa^Y-Trp2PD#+}`E1 z*kzC7>9wv_5!WYQZgO?Y^%n;=3~ym;x5l}A?G=%`Dm?M>DQobiZv1V>!_HNw=CloW zbB&E%y04E}@$Mu2I@FpNYtnM~b>%s~M)PJAt>C|X+`(nG8&<4;k@ddH@bgiRd?&8A zFTSovnaj6Icr9G)ZsOKtZI*pRe3L5k_jQ@KzI*1xG0__j{=Q*+-J0n;ik-A-JfYjt z%^sWT%o>|np!S8xkbQ^RxD>5Zvm2!($^}s_*O;#3r^GT0-xXI@I~2EiTfT&Gqqj?{&U;XAd}pt#JF7OIQ_QVchvJ=9b$n8+ zj$_oCemQGzT=lZ@S+k(;%-QnTdbY}E!{_)cZ&SO@y%F)1yKH)Q#s2;3dSw@!STd{I zgqFT4<<-3wn|EO;X3qWLF@+_gqo=Q{JSEx66@9D@V%j(1{v+HahG9%+u)hCy) zOsiJQeaPF;Ne8k#y^q=)nR`0)o=cYz3Fh{@^>3P1Y|-4ZMeeWuy&fzztZ1(IP_1cN z!W|d-v48f{W@nNYZ)1%ey?CX+db<3ME`NBUo>%wQ%KYxSV7$`O(A?syX$V|;qBP=$y2ipRgJ1o2;MUJ?i~{v86ECb zu0vpxYM$j3@d^ClkKic&(uY^Mp<(gmyc?LA)DN!PJ1VYaaIAs=qLuM=gT2Z{BqYSv zb#aOB&4@BMzIse-STrm9#KiRvPT*r)xJzhU@L)pjALZia>gwUrKR7bFoFXK=hF7_$ zgc{`(2}76*?Z;e5xSLq!CYCW5+K;*5-n}`8VT*zp%@Wot^B4WKQBBQ8H8mU6(k!W^ zS>mo);;vcZp;_WlP7x6m8QqUV5|eU@J~2_v@)v04%DFTU>GzP!+nix3jY!e_zhJ`| znD}E1;_niOpXiHUtA}!Rbw3<9%@sc@6~C~oUyQ5D5I;eSD9%kah~MalpR0&pZipW- zi0ApmqwV5BXz?_PxFM&xNZXw63qT9B6sIh$m}!kRDL#kgddgsC2Y`EYk{IoaGeZVk z{M46Qj9efS&$9X{2*Z)~@l;z#qx|Q)#IsZ4nI-YKka$W*JSZU^ zQ4kLRh+FUCPPe$ZEbi-y+o<9;CO3^LO5$#exWyrEE{N;-;!?V}f-SBv6QXbGM%(Lt~E6=h*VBYL~vrqg#oLBz8 z{Ib7&*X$`|TW*9WX~FfbTyb$zM^9Wd;ntTH@wuT?<^^Sog2|R2&kdBLRr99q^Bt2akC&^n^R)1NsT(N^#otGz0+sve%QZp_`CGhvX zJor~jsx7%mb$G8W*4g~aO3#!T@v?1tT)b?f)769vPr^|YEa~BamxyQ z>T#FHo5%Wmxmn}K4V;$TkDw@zrwA|a&N7Pe;1C`=pa>gNSDq$t+iEmVttF-09VmBI z79nim7~wx9{4<1aWg#8;v5Pl27pHBEi8gp}p@V68GuY|v!@J)N>KM(VT@GB6$ zA=TrJI(!m<7dfN8-zoko$3wh<_=_ASz zni$$K|53XNG(eT{ilcjr(p@D<0i)jJJYqw+D}@&v?Rz*z&~U&glG1}t=!rNC!wHmO0t)k!?=NaaPLp+iF(o8l0~-|9?*byEKdZWD}oVAl8Z;% zCSVdaVGG0)C5<4SbQ^}*or@} z9lKycGiHYScm(TF+?Yj0IHNMEp*m_{J_q?L7GWutVI>|U64|G`t)S4XL4z^0*{~f; z(m>oXK8U(WRDJlMDK=mW9w$jDqle1JQ<8_ui75|;$);vyC|{1q#8h-&bJA6laeLeU>XApTIoRLsFjq+%D2;ylFP3$R05bix^2C`Jhr zzrfZhPI0AJSA`oqAbyG}euA28MVEumkV;UO;Ed*Ih0|1n%Md?A`W5?e829i9UCK}( zFkc}_OOS?bID_*F68a@GZ&1vEiU&8iBNl_O085dEZ75cb?cj-e2u3I-VJgzF4cBlJ z`sJwx*hD={$7zTkA3euQC2z)5OjDFXY1D@|I-x6uU^o_F5su*`9Gy8eKqE9pFha2b zn{W&#@dB@5RhdeS1PsPAC|~eqRD~uCRZt!6Ab#GEh_P6KRoILDh@k};fVo(Jqd1NS zc#KM-WkGASLn6jvEB=6{^{M1S{#SEhLv+LmH*VX(z9uOFuUZsqgd!5R-T4xH1>J^J z3m!;^Fugcmq9u${D($CsMEk$_KnXhWL@$ zEIh}o-Ta2n@PrX^JrjnND? ztFX2c`ET2qt_#yJ6RWTmrMu8(!X0%n5W}#rD=~*#H>w}fu@jH*9L2g*(or9c&>G@V z+;{kdl07IF=!u9PH}L`veQ4#N6V9js&Zvq&bVZ;3{3sveFafLZ z8;;^Q?&3a7qUniH9W@Y&aE!ueY=&|xZ#lRFy%@d_wNV%1$;=4M!$KT^cuKQqJR<}w z#u^;LQRLz^Y!k>n^h78IVJKE(Efx%7Ut|m-|Bo``KbWx;Qn49jhEOKpiTVgeKa9mB zT)_>9PP!ySA6*l^Xa-H+T(~dR^uhLIy94HnXAMQ?8d;5)})x%uO zholUA(xb=7Mlvy_K{KGdVIXEc>g>zE~eBfsE~$Nury<5ghR)QQ4fxmAQBKimDmWf zTRKvZ+X3YAgCuc$DY+Bm2-z@w_GG!LrBa_b>*dE=y2n(!#AoqW8O8H{;!!&BjH7ri zQoO`@Ap;%tOXfYVp>Coq9Uyc;yu=xZW?nPZVL+mOiQVUt`cgx2Y9dQ>7R!xFi*##R zCYj)LbPRO$_4IXg_3|q7E36^XKI4?0i)B~2OiJ=%+1;kPdZQu+dOG5z-pE(I(e=f$ zy}~P5PBbA1V?7;xBZAP8az1@IBL3)#`n5R4c8Tm{!&ZEep{}uxj=qkbRv2AaD;G@} zvqY}z?UNrJJ$<5MpvyNAR-U6ohfxrgICfsX+~x1jo&Pu~k~sy}27)=sib&bMM7FE9 z;A*2IVk29L_F0-u4h0SrL#ifx(vx&8KK^5=SR!5y>E=siFIiDZe~JDUX^S*^w3}=G z8qK>Xx670GOOXvy)-IEam7v$a*(+FX8JT3PGWlg}rzJMDwCKkOa+Zi6~0ED6s0+wUq2-au0n&QYSveXSrOq zk`v3t{vy9=nkgryk`8pC2YnbwrX19XIV)s6T?1Js<@rImM2h_ixtFmGNiMR|F=hM; zd6V2f<OvN;a?NaJz$g^6Cxos>-#~;{^ z9oUIo5bO6a-HUzLj{`V}LlEn~6gZkP^@tolBQ|!P9IaGv#6O)|7$A2xNE4 zn_~o`UN5#0F9LCr_rxCuy!g}GhQ4IP{7o~u8~gUVj9!l8-T3}j`*(lCc$M!duy6nV{c>0$ zc^UYb{QHVX;LRI;Wn`GH9)|J3zz3xe4TF;9k0ZBUWEh7TRcBP4@$cXN`}gW-)IY8s zgN+f?fKAsJid#2Coo@GI|NegAV~M`o0qWHkv#0(opU&@cG~Vw)I=K2b)4KMGdHP_y z&$Bo+c)no_q8i)bbIHXTeve;Z7=NS64?9g?-_d6y;VwMgFzzJiv?YeIn9pB*+c2cX z{Dx2Y>&)i~gxmfd^2UX`FEotx{C#irK|XMak(^0&K5f7n5F zMC84|FfQTKPKW*3nR~#{dCmHjS7>Qn8hhGEyczgHPX`XST{ z(&4P9c02>AcOI^n`X_%+6Yfnum(dF4Z)l@o{F;2(zwPVneA@Nb{5Px!>*arseyq)6zYj32wJLue5AodC`oSm1aq4 zWl>&%+g(}bH*16S^}$tv#^q*pu&J#%u)MCtYz(#ps{N*~si{8T51B1NvxSfqMa47C zP_VVR+CRpu3N-qf+s2r_#u~FGSl!y-Z*1|k1cHr|-0o6h;dDJQ*7(h))~fnIsLo$w z1{zK8#EBUyJ!8yO&4HE{f1_E|W|jx5{LL+9v02gD)EHRd&I_j`wR)8En%IEuGJkVJ zAQa-hW*}tN`J4Sjx4hZc*y67lW7anN{bsP%tgiDlFDKDt#MjtnHu;-FTo9~k@dX+s z=RTEp3E5IdG@)Q^%PL&-K54(=E<#+ znjP7yKucY)wZ&}qhgzBg)gr4g1gfrYt&ud?r|Sa^0WC>&xhfD<1g#-*AZ0YhYzWo_ zYUR_fvSmqlj9C+qsH<9A2pJNwSNj{~D)KRoN)htcOPMrDnX0@}rdH~7K_VYy!~HE0 zsr#;~3pPaO1QFG?HaF@*<(irxB2#xf!(ZKER~Ki+YOD!JenV6asdK)n;7Y&BOLToh z+^PUnB6O)*RWVfOBkfgwOJKS($ss#CfZWa}n%_%D2SW!vdoVoc$B{R%iuA_CCbBc2_rnK^UjnB}Fp1?82}kmi<^6wNks3rI;$?wkT0HJQkplT%bY z#>~$t&Y2;pDK|?=V7UrrrDp!j0(FS!bND~6vZ%B~lATvtQd!Q=G31Jy*q6>Pswfy^ z=9CvzhyV)9ONm~@#}y)@67)_2{h`epsJ0oE3`nWSfj5&HT@WkVd{!RNU2OTDW#QsH7n6SfsnLA z+DVWInpXuveyPe$&B2CX3tx#eUE!bR`OkwiS~^GI^-`aAcfkE)JR_ylELD%*A!);x*==!_Aos%L>X7&TMmWy*XlO zWw6?tl|A0;@up80VWtf7x*}abq39>q;Z&y?1?2^WW>jE_F=bH35l3*R#BolPIMZF; z2~{Tjj9KXSwX~wX5=1(&Q;}wPRHS3QuDr6j@ng#H=$NuPPF{vr$CU0WtPdhj3a=~} zXlyadnuFDT)ONF(T3A*#D#1;>`X<>2xJkOcNrsD9=~x;Xs4_+4O3i%#O4MrtS!AT^ z$R`{ia*7rKkIg_DWj?f?S;@aj1S@*)0WzQ)C(&oSa%yz{iumnvARiRL0(5m{>4HSJvRbS+z2jSDT1__7RbJ-J z8dqNCNjLKYp%rGCPx4Zps2XKj?bv$&J(FoQI z$UvsmhP{~w$bi*|DTrLpM6)oknnpa6R;II&TArKe239*h;0>&Xob4(v^h_LAUMOO! zhrYnyjfv=hdPhD$Cpv5!omM(hm2=}3tGB{}P zHv}19)KD|+aSvuP#sPAcUNS9njQYsd9}{(P$O#5$A$x!pqL+{9sxeK27&Q$|^xKR` zntWI!)ePsF#oYIY#}m>S*ZLX)_1OPy!B(@OHPm8T#VQ?)+M0tH9Sm9AAx0IbdTS`6 zBiEJ(-y5W!V7&OT%JneP#Yd+4o;^;!XRGfM)%S_&JC#aKc(dH@qFTm@cG?&;HTkOp zwE-D+i8N~bwZ7JRQl^C?@q4q#w2MDe{mG$BzR72{^*Pb{Bz{CS&gJ6Yr9>4PTjz4E z*8dTO9BuZmY=4lU+KTo^rTWWJ6@_(qOT+5sn2^;?W2ZaD{d)pT@H(19>qRPB(S6>F$16gRmoE#64n z?pV814<2jrK$zC4k#uva9>umfUEfBTGK$BxZW5_CN-<&XezKl4PifBXLX$Ver zY2FE@e>KjI8o3>QkGck>GyU~`@tc^b1vv$y2#>)x2CK~F5>o_YlYy+V3Z-U^QxRon z;ZMPOBQV|j7&>>CYj#C>`UJ^PD2V1jrD;PfHP_c#!#GErFcLXtjh&qF>8jl`wox{Z znK~0E5M6FdT{tub3ZcX4XchyeMGTl~F<^);KOCFY1=$^qoGUN3Z$)Pw(w%t?ow*iY zwo`oB5%FcDCzM}ycBcfGX5ZGEIl(FheVurSNLX0FN|>3MnGONtm=UwPLphrn8SMm3 zv`*2|X^2j>Wy{$wQj`;&qMUdDQO+*#Ow8%D9A{(6=~Ykx$$JKPL@erO~F<4w>AD2yhOS@)VT$6PPZ8uZAZ?AORFqT zT^?==c2UJ^3JHox8N*@=yIfwH?3_xKxrp6tH=7XI!S*LZb4YV+QAQVZLG0-RmUMY8 z5i1+CR&3C;IfFPaGSE~4O2;BKvf@Pej9u#vbUNum6sf?U#_M?Kd6(ia_s>(>%1@nsS zcsdG-YkpZ+9xEu(hm=>@>ZFMf$8c~Jrh4SQ zW@Bpua}3I%&E1(0Xk0F)YV;jrZdfpH>J)w5G`D*u$_q;ZC%bn1sEh;~>)RwZRYBBN zjWzig?g- z8s(fFp4$c*ar?I_ohtTrjbFNaGAFI0*}t4g0U730mX<9oDygWHAR&K?yEup$)Pf+) z1$mWAi*pv3jm%6Coqx5znkj^kvXiv7=4eeT#=`Qbd+C6p$w`uGNQqJ+BLW?OOjR#XDq`=^T{1u7r!4i{1dSaZYRDfNrDA6C&Kwb<$jA=!7t8%4;za7JrwALh zk260fPZWm4;Vcb`ix}kYI$kv)sAuU+m6GPDgzAbYC!E=}TW5GMCk;doBK;zYAC^xt zJCK3`|uN-9z{CyvvD9cMm76sTqXOw&cJ!j(YV z^)YXvD~{WxBdt)85-c2Briv}QePrqaiC0Te$K!G_J&GuG+K>;j6b)$=j@csqJXJs< zB>S$p?d}@RLoQQ3y5*@b))nfuoFbty_lpuh~u!6Wq%p)~u z#&{4t#RZ}{qkjaRM-pTWR0Eow(dC=dH>M=9K2egpJ53 zIxNx(Crc#f3>TY1l>|G95wmoRuOY#j1*6s+l=EMt&3G2AdEY z%$puJ9EW4#^Nx=naC~gQbWhxX9FB=GJ$_C&92+oxUeeoThQUcZ*>E_zj56a#$l>U4 z3#0w~*aTkl@SsYnwFwK@@fQVJ6 z?6(QCRmY-?4&O>2el9F)+ICn!#PdZ@cGkF<2-T=ilvUy=aptlB!S;1&&4CuI@=Hg9 zSFN?$wm?O(SPfF2#a3-({6_yv-zro1qC6YZ*7%!QNd*IDPJPmf@}uH?i&;%kr>TFeq@->(v9?qE*~y*7+RHdnXX4niX_<>7I3F z4ks|n0*x!I1I4H6pag3P$hy4dv@=^-rzbtJ)e#ffcv4aqs1>iT^FH*wOLOv;Rus)B zk!bnJx*i(sa-5>N6ED}XW2-R$YVtKQ;bhzWR*;;E`F3V(v&s&kYONSmVoh1Wi%Kd_ z^GwP--IbB9{m9y7D0P=%W@wByPhBq0qzrSaNr!IMGw`hsnI5Uu8TRQ+PTJ?}m`lqm zbZU$E7A~ytSz6<`>M#S?G#NmSwjv&*sB%FUA6ko)|9AjE*YMSQn@Y zAaLFFlj?$!TnQrSx9<}^S6*TEiqU`dr7j2TJH)R-W-R@t<(YH&Ny z-tkyUdKXxs0!%Wjb_hkz&9Tm@wS|szI;EY9zdT_ooFO>P`4|5ib_*dDfe@nHdp%U zapm}GrOOuEpBf~R%FQX6t>dclHLkE?3ZDqa6h0X*9wt**l~<;tX=(N~MG_?TwVcD_ zM|#w`COtm2(_365?m$i!@XhH>U;(HaHrv8x$)n6m5i&owTzqyM=qP;I{PIGr!nD)B z7OMm|t8cm049oIPMLUeoINef@WqEpjLE3)34|n0L;<7RPQ!&QO%b7EVJGvSC$zQl# zW59@iui4KcSJr&xSx!C1jm@F3O0=C`l5*uqqm!b|_-n0&gJH*+l`hK_Chf7ox7zX= zO22`}P+dX*CLNW7(Qm7|`Q>w6az!|4YQeEuUEp?)5M?<+=~|f{*By=AEP^r0ww#G4&`(wjBP8ly_T=wp#}Lz8&9u&&h9i@BX{i8THsK{zDI4(IIU7eJN)jwiv5r=h08kksN zR_hn9ujO|Y?`~24oC0M7$&Zp!^)uE3EE$m#l)t5^C54gLwNF?==?DmCkHcaDy4xqq z3aJuhxoyRIp&L}g^cF1$iCpI)6kwW=JgAtlOjs_>3CkHOZWeQPMd3IqusJ%-OP7fM zRu*^DTxk9>Zx-=^vM8q@uVP`vC}~nYsr2S(eMKq;7fXm1jMBCnwmA1-y@k4|ic=RR z*GXLw6N`1k<8q~`h!N$e0pf9&5xtn&+=N9en1uMIv>VmYi11}wzTYUHa!4hC+w1I$ zg%neSBAb~-c$mu<>XMvUI$zB(*$3m5r*)2^s;>7lGjFHM*78yv91&0TI11GY8!2`x zvZ;-c8e)YRLvPx+9Pv*zF?K3qQbuq!39jxGi8UsaM5}`-_5@ye6x&LzRi?l z^oD$$;+^Epo~A<538`q*(Fv0>vN&8&CeyGw@?0}DH#+j%aOAn+$a5o+=SCvWjYQ5- zEAqk_b92hIRkOTRMl{M^EG#}X62+;JC{B$;!BH!USp|0H{c5$ls874ch=@o{=%`6d zyKh4mwVQ>pCWEZrb5)&8ZN$#RxXa=$ZFVPElB_FayQxsUUYUB}W3(&dcB zyt!8W@yUr@^@REIce74q*dr|%703OiyAFvj-lqNTQT8mTK;%@M1|2P4OF?PrMF?s zFOMzZMhst-R%mjebzLpzNrsxhQbV$s2&6JFFTg+HnC!c!&D8Pedxd91?36gB5VS)* z5*13ruA|{$VJc%r8mu+U5J9d@n|Zd}!J3tbOeV#-LnLnPyH9)vrFKO_X0j&JvQp}N z45aAoVrT4RF{Kg;IHbad1*Pi->t|i zDpD4=Dxx21rw}W$)G_KyQKOj?4#U)lw2Njxk5R~jE0z@`)e)1jsm@oWmW5fhjkIG{ z$gBlxK_!(qap*j($?Zld-g=gM(MDu`L>YLr4{E|}pI>CR5rfWwpHpQ>|`@usrl)c{15l+rtvyGYD^oEp+|I8A+P zpkxhh@=Hs^NF{_d@n3@^taAl2gqBlSfnv5X8qyOn_!O<~UCqb1U8pibisPgy7*bEp zVLYmW)TOGY_bQ8uRu<7KHNHIm#S|zM|HK{KdREhi)m(r_*v%-qg1b21xX^zKW+I4AaWtsG7 zWuw%iThwM%A&}?6?$E3!!#;1HrcxZM$Rab8;Z90MYmEGqB8#KO5~wVyg1P}sTa9Hz zsnqeTFg>e0s)UWh!ceSu?aeKj%d?2mW#MUyjD@L93}d8oWn6`pQaO$&G%a$fgFNAb zoY7^GdZljaRC#_`4?`VoZ4nKQDc)Wg=m@{Qy1)|E*H;;Iu0>bc3!WWMp79L2)|aAJ zwtdZLO@51y@hQJBAg)flbJBGt6AWM?(&DHvw))J<5^$^2tDMxD}_ z7}evFtc$H@{zFu&o!S-twyK~EBE^ZIs+8zw{7s)}^xX*qhal-Cj9zh0>jx{S_AC+M z$>)`*{%|e%oR(0;zKIO@!g1qglD6Y^IqVzVnnXUzE)ho>E_E}N5wAx#Wm{6ptiV2_ zztV21P#cd+Fsl`84dLGkcV24Qta_GVl)KU{UgzVbG38__TMDW)Y!T2NrLZDiRJ+*N zPNOEc>I*KaikU@)VvWWYRlOgNZ*ypze!K^L6F)dty@-X7E0LjUm4fSA%!RYq8fW<=DoZPmJc;z*oiss~eeK1Uk7 zT%ks_^hdIgZamMHIFCoo0*JY#7KA%Ps1*b}&S2la-7^iMX|zLE`;qNiPSlmRfd?&~|O(BW9LtTj8gRw+AE^M$Fn z&(#tt%9vzVqbIT{y2vrU%T*p2nSxi@v8F50L(017XjJ#bT5_&AXmw`WyxxhY>+!8L zJIl?kTqoh$^|{JH+!lCfWdzuXp5}8EgI@Qq3L-qbwVc`3kXrX!_CnS3TDtR)7PQ?wHj?NDlS@|5d|2@!3%*vosq^i?^-8%OCBibEcY*(wx_ zaP1T8GS`#L5GW@p%Byq3&hmI$dT7H1f3EXkS-sl_(*o)lkm@#jT!T^pK%;WGjyl}@o2@lucaa4oC!a@X}La< zF0ruV`>W&Nt) zac`-xGC=gH*djI4x@4+&sr9N50-M%7aHlG3M$J>%A#^p3+_0q7c}r_78M&v7dr{&j zD5cMF>orPx)ST!T69*AX)u_>>GWV|;M#9L`#k;?XW*Zm6`78h|rs z7A1(b53hZ*^&8Klhjkz`;`-^haBsuX^dMb>?6n$+L1slPHS0KR3Epu8LsLDNrLxHC zZdOzx4J!Z&*^lp1=3?|i)OL)l6mMh+o6n3$lqadJJsItiRIA2(OxLIha3vvsT`heJ{{u*07mY0b>&6{0- z$6XovaxJS1ondtsFCpibv!$%H<3XI@)>=Ndd#*}=EP(RWW9njKNq22sC`PcolY-Sa zRL(wIYiKtX&XGk1_Ubxoe4IY$D|MuTWP07}@aHtZt(^FrDpou>o&*Z3R2h zsI?U6KI`$2FXJ)_C0Ma;RfEDXj9N*-atNy{Lhx!hqQcYJ$y0Zo9`hf#ddi^$5d zR&j}-uNkk`;I*l5n=ID8eW6#I@0KIQzFgNnnPKMEvfZ~lL?TNvRSKvCU9kc#w&f|| ze1R?Rz&q4p?bv}1Wb!Ca03{l6IIvr*nt;|0BGqiI=hmVfGZWOHL%c{h^3My0bwDJ{coilTSnUkL10jwe zth?b)c7kH@uPx71Z}voInkT40e)YzVNT75N`yNDYmNU1qw4!K{EEEmPnK6d;wrO4K z@CezVZFLx~1)bN4GCri$$@EgJb!e+ZmV|bs5~IvL)_B-`4VlWb?Z{~L7#&DYKFZ@A zx@oJYM$Ock0Q=(cgc@5JTFY!Zqf;4NWHW)`6+Nv?dgWoZ*MTd&D(%;LY&rYCqC6v| zA{tcfUX@ne#u6-tE=y`t%MjLkaU(J<98n#*6FG>+jIxVA-A>%P>8aHn%2twZ+3L|s z(R6l%_ReSGzhN<~^Zf(X(1vYWEl-j5RO8mxeh}FYT(8EJ2rb97<7{|y2??l@AX|p3 z?p0uwZl)iSs}&`v2g9Xz9=?a8;IlLf){ zSF?tvxvgT?9So*}H*EqIgI*>Y_W$w3g9J4vh@GfL;~w&7r_kPg;&TrFNtx=I@+&(% zs1Jufpu6Bx5C84D#!OVW%BZSfd4yHnnIM{u(y^XY@P>a%Nyv7FR^i!_Vm?MM0YZA# z%#I#_>dL83i-?hbu-a?KE;w z7KiGCUOTBA^{Jz(8)QC>Hx*T}=vFOj60LwexQ6XgE2(RCE+UOU(yEQsH0eAd4r85W zW(vitE5c~-HRDqdQ(L#b#PwDzSs4+@YI*`~aG zhX;(#z zbz2LkDJo_*!Ecg8G^VMZ)^4xZbgIST%c^R{-_>H76Y<2_p%d16V6LMbR`M$=unFXe z(wNm4Cax%yf^1Y>fkP@@2pm&ZhDS-gC4UEQ8yt^_;f-uAHW}?0B&guCj0#%AV<1 znwQMVTSEX@8!ekJSeI1H%@y~5f$YE{o%A?uSXmPbjNs)xUc9_OCxVqh+6Hqz4#mU{ zvph1h$?KSuyHokuF~3y8C3@L?2Fp!ytMs^vGeKy)F|t*t$l2Z`f?Y<_WLr`D(J1XX zsKx}e`@aU6=;3{1+VM-t%PL5FHKe5w*cwHZ0ekY$P<#zRl!P=5yAJS#9J>d}a$P+b za-0fxN$5P}r#8?)xYn|D`e&wBs$1%1ZcCMueh~!DUb;}8#9=r--kq-sM=jr^-78mc z_^g-B4W(2=>_bcmy4^X|RB^6pS^|o1Jx{tYHY3tQ};myQ4ROuxFWbE9wIc zB|Gw-$2idK9<-Pq^ng90>N_Q5XC3I#sn+$&dSKp?2hIcix{GSmDwRYYC9T$bqnpM0 zSrEkC+Nd_%p^LH4+k;j~Of(_EPbLLw+t&3>92MDu=P(^T}3^<8563LZl;bOtdu7vl>wjz zI?DNFXODL=in@)N1gPREW9uj0?*pWbDuPQo#-rO05i!otZuf&ig z>e4F1PiJvib-c?eiWcM+RkAX$efZjV;R}mOxl_CFL@({!PPTK)i-tzFb!=qTJ2D`Y zQJ75JIUd=RxxC2wGHw4VX*4;aW!z*XR6lW^szzXJ4y1oNa*K8lXPA_mve`zlU#@yy zjjEttg4nJ+q|?&Fx^OgVb6+(TfO5u@p0LP9%ABJZ-!bWMyGE!pNM09`m3m9);Tthg z7I$kyIM%QUu+iow6i2M!gPRP4U+b|zi(;zC<(l!|xXuqB_v(+p$V01sp zURlhvi|kh}Z{uY{KQW19=eL-xeTzyfF)eWJV^Q%|yPWy#5+pO(mXR2aBlbFJr79o~ z+^Ng?9ThcQaIxNzG!lm+wY-d1HegWoMvWYis`7SNZ|a#OGaOuLt}Qy-p5xOYCQeeb zADmk|I_8u&E8e-aV-}okFA6NuiOjU_GRhn`S|15NW6!f}YtssG%ae^Em3Esw1=@)<$rl$4oOl-faG&6RXoq zLL~{7!-kuMcYjlxM5&7-*HV(s^vK3vlsL!2HBf0*dl9NN{xwMwndY`N_9CMB$h|t%T$h*e49v9Jus@O zhjZ^s9kJJ=8*an|4)5y0#1C^=QmfdTkHx>djt09_QjPkNz0}pBES(V&gbTrX7*o=1 z@1YfJQZJ^qvKCn|gaVbA8sz~_39U9QL-ih@D5W$Ifo!T7CHM9X!0+>$Yfm1R##?B^ zdvsED+g+JJ=yJJ*5_%}Na?63G1=`(HKjOOL#ws5 z0eSPPywnbXNyfv!^&&snqe7M(sn_8#3KFdxZgEtRG*6}sc!K819@0W_m1>=Mpd#Z< zdgwpJr`h-(F#{9Wy_&~wuqx(?TNyua#qSwRW&K$*zW6d zr(H~Hk-ha&2<1e2KlLPwa9Ql|>8@x_#aOj~A}_3OQ5&e!a#>oyePp|B9w!k~OLjQdPZz`(vszlxp6mi} z+>aX+X?p2~h=J2kS)gLLSa_&QSgqTiR9=~lPrfEA%j_6(D; zl2zhvw+D5Ha6C+0;-F2ArB9FS!{h(E(EC92|(pdL@ATP~FY9(_rc zTN0=)(UFdK%kAYrhFt6MWV`X0>NwN^j4^o|o{B?mMDKCndz2=5L#UP%yQ#g=cg5TynBZHR5gXO*>2gg z(W7b`CFXG#sk0&#etO-r=5 z%}*6FabG*Aue#$=35;)s^s(h+SKuz+v%hg$(qb#qxLVl{IEctX-%1>3= z{LFCARoCh?r)Rq7scUsI(zD$2)mf<;A_eyX^=X~WcFQ7KPr6PWBYM(x;0&+( zG=ADmLY4Sp$APt_^9su4kt9kiYrLBk6wzUqI1a3xTW02zmzT~bY(|!QspHh#ypyHC zJzh)GXOp(5d&(4VjAKX7aH)a2dO9cE!AYkPnGx5@cAT|ahMIDbA+)0hiGD6q`jjbb zXivShyh!ZH9O>^QayMb7WD!7owpPUK-OLY5v%B3!@-HcYqy&-@NJ=0nfusbI5=crQ zDS@N}k`hQtASr>Q1dK4sh)Nu-r?|y~^7|`du(plY% zQ(Xp+a698jJ48%eN89(3WX7C3LEpp~qJ2h;qjV@|daY1BB>l$VEG-8+GmHD2 zC-*V>JFiejh7vMwmKl|GJG4HR8t>d-gYq5@QvRdCt^-r~z7aOT)36Wr!`5DgaT|Dg z8-^FI>qDJ@ci<`NhSVLYH#wC558*{9IK(ing}u(AkNWX}^UUY|@wPLzuK$rZKd(6x z8ujBv=b6Mm45Rk|!~IAfquWE>SD$F~?cHDhdNDApLbA%z$dB0YB720M3AQa2|XMehgQ^ z)$kLz27U_C=U)fc!$a^Z_%-|neha^Y7vUv%89s)$UU=)#haSECq1!h<`kjZq^TJy% zw1kf=vW^%!pD)vMb-wg<3H$Xm9hC5aNx|Bo?CzeQ zrdEA>-#Wiqf*vVPQQfVOfjDe&qL8+hH(@0#bjIo&%mku>BHfO0q6o) z0o&ky_yar&#|%V&zznE>rLY1L8^WLa%)h9);lI!Q z*QH9ge`VW_mn^Wa;s0lou2hO6LexEJn&ZE!zqhX+9F z%7gF_?1tyyd3XU{fmdNKd;}lEVCvJ6(3$?fxX*#wvev>+F#ha(571Ft)vcvM$CtRZ zd?ot-XS62lT;FuGl*ten3P-~*5FKy~91D|S3QUD*kO%p&7*2;Juo~K64V(pM!#N;& zWF4FbSHacr6SxL$fE(d{*bWcCpCR1aAF%&_7%xNTOJA4p41G-pCEU4Q;`h3Sc234$ z>i%D3{ug)_cEN6V4xWb>;6?ZtK7oC(A9~Oy^n{aOB&0$vs9qE)rwtnYq`Hn^rof(Db`YxmR4y7_o$|C@0Km#rVi(*DKZpN=-@@WuCc@6|1#bGqqhT!BVU=nZ`Um!Y!v4&n1q zNQF@_8cv3>Fb-xy5zK-b@Ix)sK>*GGu^H>30lo_t!bR{s_&!_$cfg%+7yJ=Aum7bs zcE0p=36Ij(bWp+vDhVy)TXYTWoQ%KJ`d?)J1pEnhz*F!vh^_x;_zS!T@58_0Kd=`* zg0YMP#(@WB!EBfVB~S`wAmfE{sDL0e!55+bhZAqdI-_$Xdky*Oe69Mj>;L0*ZW7n` zVNxDvLNm0&O85b6giY`ZxD~d-?QjR&2{Hz}8}5M}@Dw}^&%mGIFYqqxf%o7r#)bW$ zGxq-g#)=)6rEZ0ri0|N(mDUbN>i7~%>nmaZUxBncEtR9CO!~t>I2;CnjO_=5$Rh(X zAq&PsHcWs*m;p1P3aX(7YGFClf%pf`0NXbp{(v^vJqSGyWk+CJ48zWZ_jX7RI@s#B`(%A^sBG`j}yO)l*t;n6}G~&um}1etz#e^ zX2K!}!Ub?S+zMM^2fP9MVKC)-GUUR1I0Mdwjj#p&7k0rXPS-{9$A3>C5xL7u@Ng*$ zyFI?m_fp!Vw96(q6Rw0mzz2{z*f8e7D%c3O!dBP?haPDdV_+Ga4?l%p!}G8gK7x~m z7)B+W4^c(_Q6y0@XQF~7e;fqqXi;09LSwj;#Wk=Uc0%`~C?_a~dbkK~f#1SEpxaR9 z0$>D`z*@Ko9)_2|eKh?8EP-#sO|TQ*gTv7C<6ssf%d(4P5NT?v{YzP_fb}4K@%8XL zNT0k1dJSi62&GU4br689a2vb}dtlNrls7yJqmE^~2vtxG55N(oVN8Tc@JS>MU%ww8 zI5XGDADtA)9%s~ve?-NmFJXk=_ax(x!d`~`P0thA*a%zA_p;whzXgS*P`QNj05W&8`n%bCZ7SD~tcHUYn_ zq<+Kxx%6-I$O|0302>!t;BwdjPr++2dJ$=aVpsrY!Lg@d3xTKI zKy<~AU^CncPePXnBY9J2bx{4kl*M16=NR-8BY9KG+RC z#&Ru8ff~3N?uI8|4-6g0_z~)11KbPAqUa(SL~4L4e<_PUf#E@)LpCgfOW-zm9fr`) z7r{9oeg02j2>tv~@FGZ`-YFpqLco%wQvrYgqpcJa14K9HjVLR-A4j_~oh`rYe zQ?d0Dm;XnR6m}FWaRlF-Gf|@Yuyb;wYwr%-bpJnG%3>Pa3}S=-FFXPtL)Ikxys!?g zgWVuDdM}s(GhyEpY-8|F)i!$(pR=F=E{2=oDcB2Ru;s<3FNRM#m)c~ogDt9v+?D>9 zvRDB!&iVmtgl+H`JPz+eAI4uU@PLfPWY3|%OL7ZO!-S$ zoD3zf3O2)?uoDK%i1<@Zw|29Lm7Aih!) z7QjMi0`Z-G4{n0r!)ve~jxEDpgw?Pa#J_qs{0+p<>OPga23e3S@-C7=O!-S$oC@X8 z2I3391fBr#iT?-0FMbSUKqf2#@sl@02sXi1_#KGv{BL0U&o8LJo~VrY(ck0yX>&WB z_byS9U0*l9z-;UC58HoI7K>pY*mE3d^RVM#9$XJH=kZ5)0^IYN--RZ)4jzO3Aaf$a zU^6)9L`E*e2LM%z@DspVkU5dAm+?0=1u^Yk%3=$=0mq$&%?|TG=BpYZ2sgvCuoq+w z>o}MPGMCi|LD&M%!9JLHI({LLd9DE512W(BGRU0QhmkaN^y5FyVBee{?;q4`J0i1v zK1>12ju2`$h+$G5hr={D1!}+#XTjNUDck_t;W>C04qu8d0OmpnHo_*j9qxcv4-~V=QpI+q7&d_m{!N!IlLX9-kgEXSizb>xDW1WU|iWqp8(?^117_D za1-o@vLL?3Cg#{f_#Rt$b__m*idM!Ja2pI?iA@5TFd0sP8L%GiTE!R@s#jB=;avD9 z{Jsq_!;CeIP2rfe)M3~NKR*k<#o5elox?g7_#^xoZaJ6vaCiegf|u4I3s`y{dJl$t zi!m^4fd?UQKF47TY=^&Iz&g2$xbLT!S%)b|AkV<-+^s#KRgLL;6oTnnNNoKP!AWuognq$Y1ji&FNRjp|3fZF9a#u=J=wwc zqH27?5Co|=8z9-_JCZ?Ei#@oaGSpwV{YzPV2d;qo;Bj~j`p~u~LItdWOF`QE?NCB{ zFNFq>_P+@(gY6)?U6r2jq@ z{)ayNXRr&TKmQQ+!mu+BLivAzP2?+6mY*e|y8OfXU&>+{EP`|4dUz0a!X6mej9mw7 zU<>Sme%NJGLF}_S=#FjH1BOEp%mUkPyPEGGfY@)xW4DP7_gRwt)x73|NNbDP{v>gJ z{_VUbaj;IFaYp7`|JPl&|6#UGz16a--*MR1McC4_;Cv9f`bzjQ+zOAt8*nIgb{Z5z zEqouu{=OTY0m4{4n2N2YU?tG2c5W+GMbUEviUeRqbEO;uq`C>F^@F z1nfO)VSR>217WNN=MeLyGk)Ahl0@rR%Pl(N_iH^Dae1MG&kU?24R4&y@bLM~K5 z4Ya}rxEyYR``~x56W)XF-=)8R-FTnLxL&)^<- z1fGUhU=MV=5E}qY7zfj!7#70{SOXWqjc^Y<39rI_FfKy(Lje9C`~tqA((n3g$CSU6 zg_@s;98Z4xW=KH#{}j{kUQ(BG?A9m7nOk3+dfe8LJx9Rtmt52H1UPZ)H$xQP++3bb z*7HAS_WL~XyVu)3-1hi@?|sX-*_eIPA>D|u4;%(djY=bER2yC+%g8py^XY+fV*=;C znKz%CL;)hRf(m12V(tQZuRxZ=TteHe46qybH~!OomKdW;$mwTKlHn zybH~!OruM0-i2mVrqQK0??N*w6DLU*HnlD^qcU*~bz#oC(2UB&E!K5^gLnmOUn9i` z7`ziUoD2-R>Hpf_4IArFqnA;F1FzX=FnmTmA;h^i#K_}OgQYW5ddR~C4KrOmLeK(> zjFjmqgjvLuE@P(Q=c*cFZ#0%0_?o%)Nbc6_gcP+OWe?-<>)$a3T|dQ`eiCbi4C^Jv zvuB#>WySJdW$PuzzFDTR*yyI>UK}@W>7Iqz_(&wAV(%6mdpBgLQa;ofwSM$ss4>gvL5{oe8BZdj>5e3Xinn`o zyxno2s(6Qq6eNvvjGij4IdS6>-7$y|eNXBU9Z`=#;oJ|EsK~W%)=;C6vXzt-#*Izd z;~+xxJ*j7OY`pqMrE0KF)nIB#ZxxT!miA>XwR;dD`kvG)I-Xw4BH|{N6ikbIr3^0y z5u)!&y`!(}-OHdT$;BM*C)dZ9huF!32+{YXKGE0r8ASaZ94;(fQiF{tM$Yti_y3g7 zLyf_B#r;MtwYQa8-$MN<<9jnKSN}E{bsQ_CWi)cu`8UN_G(E+5SH;qotLnK%>c5F2 z+;6N_p}W!ABn^W|Ll0h4-haRlME_E-WE?x;B7q^|TOMg7)a({l+(xS?^v zNzLd>iu$d;q}LLVa7V`pCpDliDeAX=UGF8p9(2as>DL;Uri`^}T$|BEsWekcQbsEX zf2g6i_1Euz=YVl5>mW!n@iU*zpBx(wqhK_g3{zk#Y=lklH0%QjycLys8+ee97p^0+ zf5JQP6nT6a{tP+f|oK-Lez zD%c42dkS{({m{eNR}7ZH`S4TtH9QY{;UhR{5bICje7FX-!%paa1m~a}>fs`|1%3acphGWJ<#hY z*2zLCltCQ?U@P1P@4_CKG?aV5voPvt>K#-;H9P=E3}dYxOo9ezgp1*3_zgS^FHvb< zhNF*RpGT;JE${*yc`Us;v_LCth9ARKP-Su-SPN&t6|fDSg}pHHIO-Ctg}Y!Uq>Lbq zPyuJb4e&Vp2aY|S`UgSy5j+I{fY;%BC$dHadW>YRIcS45Ap6X2hI`>j_$%~GH4GDS zpawR=Hh31^fY&Zut!DVnSJPYr`u|+() z0hO>8w!mZXI=lhL&tiWkm<&^3KCFgKa2q@VZ^5y%X?w5$7D5x83EzX8;P>zv?1y9L zQ0HJZY=*nwZulF#2JT|=2U&0`ltUYQA1;9>;7{-$7+ykO1{shEi{Lb9h7ic!M_b`{ z@GATbs!Gw_Z~^>Z8GQrnf%o9FQ)xS}5B9^Da-M~OxiAl|ha2FJ@C3Lk=r5oNu7k&5 zKO9|2n}yAAIqZO^VB}odC{)d(9m85U3%0-;aNKl`U@jmW%!B#R z2tn8a&%r*JxDZ_dbr67i;9htc1}>uRg6wI33eu@EzC&_rsI013rYIr&GURKGefSa3?$kPs1K~ z4~8y5u8<20U?JQKPr?o;T8dtRAT+@S_zqkF_rc@v8uVF)e4ql>z@=~-+zur^U6{f*H*bjqNpwplXPKE!eXZ;-v-bQ&yzbK!b;5O%^I7}iq+grCB-upM57-m6GE91E2&7dFBsSi73G2sgve;W79-^l76nf&ptN zJ7|TK@NL)tkHa6~&+r%c?ppc<_&MAHzk!G0b$A0lf{)=BXCW(i5nh7#;C+~IHthtK zz)}c86YPQa;K*~R+b|MRVF4_JTVM-32oJ%~b7{9w2LT8|6UehfTVOjp056|MJ%$fJ z_TV@Qyif>BAP5^^Gi-(5!cKS-_Cf#isr!%t1uzem!z$PSo8czd27iFv@D}WYe(PyF z;DubMfEs9p4RAT!1oy%3U?;o>-7lal;5hKWDNq8ZLp`j83*mD38QcSpz|-&w?166I zrcA+vaWD;vVKJ6RkIn~d@Kk~OuNFEVU@V8F* zVx`f)o#fje8PG0FXO0YPch!IMNM}-bu)?&LSo+07>8oCvT){5T>JdhR!WvbgwpM-5k zo~4U!JIN!?+LDyUe@`0vSq6J0Dpht}bj_6KE0af%i~OxiO2b(*lhQ~^BiSy#KCM9a z1@_YxqVJ+LfAWa4y(guSl!n%R$(oR?3197+U@+w{xi34f!1P1deFWAW%1$CYb^m9m zJB%G+`mu`%H1(&n2e6afFm}ho<1KHrDIcOnQv6L4FD zjce3Cq}<+MgBgR3WZ0RMowI<=U<{IDoCR#$Vw?jcP02*$TEKa1hTv3-S8mng6H6QcoB@=>>dWwAs6yMcER++d2ki{1g-(u8S~fh z5_|&tLEbnfyJe1m>981%%^4sCE2 zoDH)3=1*Wd`~`NwZjc>0_rXZ&Y918A43J$q1F!+EgB#(0Kz8o@9sC`7P|tcpACTQV zM?(?#p$-BdJA7UQcfu2}1D*oe_4D5_j&?B{N}v>EC(tutBistN!yO>IgFX#=pdW2$ zARG>|V`vu4fNH3PF!yDRq}zF^b-!%wW-f7!#AJ^D@fe%bf-?;lLHa?|Q& zsy%?CUtyQYzQ>8rO;qO+z4}hBi+?Whb@B$YMAv1oLvZ4A=^dQQ=-^yt2j{XnI5)n7 zbJ-o7)AEcb7kS}IqWsBQK@y)!EEjpLMdIrc%SGN!koda9a*-YG6JM8Y_-Si`?4u$x zc=AM@JYgj3pylZeS+_4Mq-DLctbvqOVzQD&=J92YS!Ob24of`3;;oc1pzN3>J3R3> z9gp#J@u_u(9)RjLEVV1DlYO#fuVi-91k?j*)h}@D$0x~QcWLwm91e7e?B=ZXgy@Rj z!908{i`=Lr0UL!PRgb?1q-S94a z0Mju-a$z~FfK{*t*1|b(E_@4QC%f;#6R-n@V7Ls2Oqc{)U@Po~7vW9#C%glD;63;c zOu^X6fd#MxmSOl*Lk%p4I#>a}IETEz8Pw56=&_Ev2;<=tcmZAo*?I1}AUm%0g5KbU z7FYw)CVLyhzGfU9CqF&n9P5gFQx?XHsJ*v9_FdnB`jfrTPk?7Zw2Ww%4?whw8$`Pt z529VN!Kq!A@>{e^3y5~P5JbCN4YD8l9q=^lg12A~q@Zc%z*F!Eq@cZyL~|VnUdRGJ1RyjBO$IN(U!l(tXnGg} zUbuWPnhL6qq}Ibl@O`)y?gZIed<7hj#yc5ewP1}&%Yd_C9b5@l!{hK2ybbTeVaK7p z;ZoQPyWn}~HiBLWPKL2i3G?A>SO+)4P4Gu}5@f&dwI{$xWCfSQkKsPp4m;o(cm-aA zUT9_)90w;rE);+t>R=Q62;PQ&!J(tDlHp_+3+~bMW-toUp#fIGX1Eq^N8{fG|AM`6 z6dHdR%z|P#7rq5{Z*av}_IHFH>1b^DAzT5yGwFq4EM&kfS;P&~#*<$7E?fk!!t0PR zk@^X%U>$UuL>-0(XogMjBlsgc38zeDlmh3&_n_Z2>I|%bbK$3OJ#0LM>);dE4i4uf*3%WxiC2uIS(9|aG>Z@`;Roq>&TCH$w5o);$1pw7dy@DiLb6Pd!fa6bGR z{vh9r$R|7wJK)4wgaaR(0q?^nuxK_~8}5MZP%?*h0hhzo@OO9%`V}K*SX_dJhqK|^ z@F&;_(lfh2_ICadZY*bCRp?*AbubC0!A)=rESOJR&;%{;S9lW^EZ{gaK?}SF@4$ZO zu@Lz~KGZHEAMi2sJdHL6_rWfB9*$Z}{ekW95S(y2Is-Ps9q>Nvg<(tB8y5O6rPqfu zp%wlGd*QTYSSEsx^uQ0{a=4&|x&#G&WCo{$4>rRs@IWnP0k6Pokg|fh1%u&87z1hW zTs?V*k6<4RZ$Nj#DUb`N!4kLueg?bXd6?fw*}+;k2Yvy!!ESf~`UkN#VH)JX1<4j= z$lko!a0C1gJP5ynzrj1uXBBk|7QiA9Yvwr+Yvx0ceRvN8+lsNR727(ot&*3|Le5}Y zAF@ww8rW8c?2r4uU|S!u-)$Diez(iOwmM|L+q+=U`Ls`v{cUH%3J?#|S~wT3T2EVt zEpQt=0KbCg;boA$WWNR9hmCME`~vQW2jLmm2}3qe-XQzRHh}CcdkJVOCj$#0Nm2&i zlsX_5@7E!(=sxw9qf|ccfqUT%coW3`dxjeewA`;2;*F{gxSd(~P`j#(vX` zylrM3+ybFvHBS=xU*M>*_+33{kZcq#d>5{Q>;m-!fIFpo8cyq-ux`M z5^e$M%@2iaD1i&>KFsVcK9Vc1y93EAmj3D&LC}I_o#MHD&z1{aM9bjAsZ%x z>}D^!*MFDZ?Ek^7AYzdKljXdh@QX zLDbdWMiuiNt;~HiGB>hWnE99L|9lCkLW{&LBsB&DkRGatWx zpS(*?T5C^ywY~Avx~S1N%)R}Phuf-7+}|(uzy8LWUN?_^ad>@E?3w-j`Wx5fFGw4D zRsYB0ooi`(Z%(3f7q5KfH1ina?ReK2P1$EpTlKIz-nkUgijGtNI{)cD1dX+RYs!H2 zW&4hJgg07lP2nwmTT_GW>P_|2sf zek>Q;m(xu}{dFJ0n-_Vf;ehoXefbk|`4e33k;^5xTs{_|hok5n6$2^gP87?!4_JTA z$0`NOx)a5+?#uX16cXBwVl3&2L?a~^`RhKU2hqGkH2rln??^Q75KVuHMglvd8A}y# zM0H3cB9Tc?qFUEu!1{F`sT8g2K~(E{EaNv(N!Zw^#*$TMbadt6zwSeN5ncbD1J=K@ zS4G#qC(-rqxs2aLCqd&yHro%XF02NR-zQOe;RZ2a*h}P3<8NZ2E0(KPbSeldk9jX3}{^xL2MJFKB&AN(C z5SdOurknSb@>bfiS>1VUXSe^~-nj=yb=7hF?k1aTLI`UpNr*VEpny{dt=7_7A1Fms{$LztM2B(s zr!(02`JS`)?rxGBcC#~`cD!fibI*N#&*PqR_MG22yUX8phGp~*Ide@ctNJr#bTq+8 zMT3;{nJP!E+TQf#FIE)g2eF>D-j_k5gUt#&MB|_W3jKylh{{=#J(~s z5kewlC7!s5MBgM&qHhuseUoxd$f^oYVpRnat15C%Nc9v?qIwDv)l+g#$eAin;!G71 zXR2~e$e|if;!q6|hid#15=)hfbwzf+c#I;Ze}pw<;t^XWc8`4A7OQDAWyumcO-re5_4im%!yfv91?ONRk$yxa9>Ck?i}98(Ny6+s=|FVS-3~O zkyxr+Y_+XqvbphVxyDRLrbPBFR$6vuN@U++`ATHpV);sB-(vYnWZz=>N@U++`ATHp zV);sptHp9(>Ns00_wigm2z?U~6f0GGo1L$rVx>q|#k94~Ef?eMYmFim6ftHpGd>9Z zzgjL8EdL^=abL2trM$7sMf+WuZ>B5iNpwZ|l<$gW(Ot=usGHzP z)J;I5ZbBB_l}w3PxhD}TMBlm@q#w(OlYTrjrWVFW@j+J1#|awvA)Xjjsos9+>A z`t#}Mv(gv$^Pmok%1U4iy)LBkr4ZBhMX9zc!7m)Zd0Z zIKjGP)_=@2p-(6(49oe3zMSti$lk4IR=#d`sK1mLmlTF0(EDsrB*caotT6vo$D!I&6F~x@{AikH!%8qO!DT}l=m{N8qLj!IIBjSy7k`w zymZah*u%F+ol9pu{vt2c*~JAJR&{+h=*hc5pKnK?5RQUO=_f(0;~7v>b{_Q3qC6}E z_cVOHq1pJQ`1SZ@_zn0nGdJOvZ6eoAAuXBy6XJY5|tZ{G+e z(B!^sC8PhY#3F27nR=bcV?3jqtKO1fdV23}y2lg0#l!SA<*B!5m|jz!dJBi?y+2Pq zOhhKX-1pm%r{4Twdhg9s?=nxX%EYriFFpN!hnrrj_pUtkRHszVme88WcaPaM$GMf~ zg=zJ}>bdV{yn3nnVfE%D<27ErRQ<4eGxO9-)eox|&r>f|KdfF&o_cQnyYKgsJoQrb z!^Tf-<@nnx{T7c~{wj@*?8xKSTaZ>ite!q2^3hX$2wac@K@J2t5ad9R13?Z1IWSrd zxZ_dvH5h)HaixZ}ny*)%Msw7fo7Y%fV^)pH)pybupONsWzY3@EyTU(Rvt3Hs%9dCoT!#m)eps~lhp$?YA6|e#{#(5812`gb0tOkvxu7ay!4XlN0paHIh z_dz49gY}@X;Rg5sd=NeaS}&+E=!fAt*a+7{Gi-tu*bJ?(1=?UMw8KZ>2Izoo&UD7LLMm@I3q$UI69G@A3Zte}rT3C-^fQ2VFmb{}(t3e}%un-{BPK`hSz0 zP9E!=cqN=xA0{X{aY}wCezz$xL?laB$?73Do&`KpR1!8%9dmSv)q?T4QYY+%uXtpmvXh&3O}2N=r`9%813SF6UfC$5?kUG|7vj*(gVYuO zz0Y&$dTnqU%!;$k$zK8JrGB@X_h7GHd|N~Mi?}TU*`{Br)039N2rZXF)e2O-`_+WL z#l%TxdT4(VroGWKqq*7R$p7C-C}!0nBT}AQe3lY^AyT>I|BGqihiLh={&212=Vp{N^RL4-gZ}0HioTVtWUJ`ZfouAF@3@{jat*lDN~uXU+Z44UFw`)_Lw>+ KfqPZw!2bZi-g1xt