From 3a2ef5efddff703cb7cbe36a7c08f9289ee60be5 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 2 Feb 2020 20:18:21 +0800 Subject: [PATCH 01/36] Update RTC.asm Add basic command line support. Commands T)ime, C)harge, N)ocharge , T)ime can now be invoked from the command line and exit. i.e. RTC /T displays time RTC /C turns charge on etc --- Source/Apps/RTC.asm | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/Source/Apps/RTC.asm b/Source/Apps/RTC.asm index ae6b78e0..e3ee710e 100644 --- a/Source/Apps/RTC.asm +++ b/Source/Apps/RTC.asm @@ -23,6 +23,7 @@ ; ;[2019/08/11] v1.4 Support SCZ180 platform. ; +;[2020/02/02] v1.5 PMS Basic command line support ; ; Constants ; @@ -40,6 +41,7 @@ PORT_SCZ180 .EQU $0C ; RTC port for SBCZ180 PORT_EZZ80 .EQU $C0 ; RTC port for EZZ80 (actually does not have one!!!) BDOS .EQU 5 ; BDOS invocation vector +FCB .EQU 05CH ; Start of command line BID_BOOT .EQU $00 HB_BNKCALL .EQU $FFF9 @@ -1220,18 +1222,22 @@ IDBIO2: ; Note:above code is not fully in sync with current menu code RTC_TOP_LOOP: + CALL RTC_RESET_ON + CALL RTC_BIT_DELAY + CALL RTC_BIT_DELAY + CALL RTC_BIT_DELAY + + LD A,(FCB+1) ; If there a command line tail + CP '/' ; get the command and feed it + LD A,(FCB+2) ; into the input stream + JR Z,RTC_UCL + LD DE,CRLF_MSG LD C,09H ; CP/M write string to console call CALL 0005H CALL RTC_HELP - CALL RTC_RESET_ON - - CALL RTC_BIT_DELAY - CALL RTC_BIT_DELAY - CALL RTC_BIT_DELAY - RTC_TOP_LOOP_1: LD DE,RTC_TOP_LOOP1_PROMPT LD C,09H ; CP/M write string to console call @@ -1239,7 +1245,7 @@ RTC_TOP_LOOP_1: LD C,01H ; CP/M console input call CALL 0005H - +RTC_UCL: AND %01011111 ; handle lower case responses to menu CP 'L' @@ -1312,6 +1318,9 @@ RTC_TOP_LOOP_CHARGE: LD C,09H ; CP/M write string to console call CALL 0005H CALL RTC_CHARGE_ENABLE + LD A,(FCB+1) ; If we came from the + CP '/' ; command line + RET Z ; exit back to CP/M JP RTC_TOP_LOOP_1 RTC_TOP_LOOP_NOCHARGE: @@ -1319,6 +1328,9 @@ RTC_TOP_LOOP_NOCHARGE: LD C,09H ; CP/M write string to console call CALL 0005H CALL RTC_CHARGE_DISABLE + LD A,(FCB+1) ; If we came from the + CP '/' ; command line + RET Z ; exit back to CP/M JP RTC_TOP_LOOP_1 RTC_TOP_LOOP_START: @@ -1350,6 +1362,9 @@ RTC_TOP_LOOP_TIME: LD DE,RTC_PRINT_BUFFER LD C,09H ; CP/M write string to console call CALL 0005H + LD A,(FCB+1) ; If we came from the + CP '/' ; command line + RET Z ; exit back to CP/M JP RTC_TOP_LOOP_1 RTC_TOP_LOOP_RAW: @@ -1552,7 +1567,7 @@ TESTING_BIT_DELAY_OVER: RTC_HELP_MSG: .DB 0Ah, 0Dh ; line feed and carriage return - .TEXT "RTC: Version 1.4" + .TEXT "RTC: Version 1.5" .DB 0Ah, 0Dh ; line feed and carriage return .TEXT "Commands: E)xit T)ime st(A)rt S)et R)aw L)oop C)harge N)ocharge D)elay I)nit G)et P)ut B)oot H)elp" .DB 0Ah, 0Dh ; line feed and carriage return From 32bdd461f6ae0860c138172eef65e673e18fbb39 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 3 Feb 2020 13:46:48 +0800 Subject: [PATCH 02/36] Update rf.asm Standardize init message. Allow for up to 4 devices and at non-consecutive addresses. Limit maximum number devices and with warning. --- Source/HBIOS/rf.asm | 89 ++++++++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 33 deletions(-) diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index a259a58a..f5fa1f55 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -7,6 +7,8 @@ ; RF_U0IO .EQU $A0 RF_U1IO .EQU $A4 +RF_U2IO .EQU $A8 +RF_U3IO .EQU $AC ; ; IO PORT OFFSETS ; @@ -18,24 +20,51 @@ RF_ST .EQU 3 ; MD DEVICE CONFIGURATION ; RF_DEVCNT .EQU RFCNT ; NUMBER OF RF DEVICES SUPPORTED -RF_CFGSIZ .EQU 6 ; SIZE OF CFG TBL ENTRIES +RF_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES +RF_MAXRF .EQU 4 ; MAXIMUM NUMBERS OF DEVICES SUPPORTED ; RF_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) RF_STAT .EQU 1 ; OFFSET OF STATUS (BYTE) RF_LBA .EQU 2 ; OFFSET OF LBA (DWORD) +RF_IOAD .EQU 7 ; OFFSET OF DEVICE IO ADDRESS + +#IF ($RF_DEVCNT > RF_MAXRF) + .ECHO "*** ONLY 4 RAM FLOPPY DEVICES SUPPORTED ***\n" +RF_DEVCNT .SET RF_MAXRF +#ENDIF ; ; DEVICE CONFIG TABLE (RAM DEVICE FIRST TO MAKE IT ALWAYS FIRST DRIVE) ; RF_CFGTBL: - ; DEVICE 0 ($A0) + ; DEVICE 0 .DB 0 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS .DW 0,0 ; CURRENT LBA -#IF (RF_DEVCNT >= 2) - ; DEVICE 1 ($A4) + .DB 0 ; UNUSED + .DB RF_U0IO ; DEVICE BASE ADDR +#IF (RF_DEVCNT > 1) + ; DEVICE 1 .DB 1 ; DEVICE NUMBER .DB 0 ; DEVICE STATUS .DW 0,0 ; CURRENT LBA + .DB 0 ; UNUSED + .DB RF_U1IO ; DEVICE BASE ADDR +#ENDIF +#IF (RF_DEVCNT > 2) + ; DEVICE 2 + .DB 2 ; DRIVER DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DW 0,0 ; CURRENT LBA + .DB 0 ; UNUSED + .DB RF_U2IO ; DEVICE BASE ADDR +#ENDIF +; ; DEVICE 3 +#IF (RF_DEVCNT > 3) + .DB 3 ; DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DW 0,0 ; CURRENT LBA + .DB 0 ; UNUSED + .DB RF_U3IO ; DEVICE BASE ADDR #ENDIF ; #IF ($ - RF_CFGTBL) != (RF_DEVCNT * RF_CFGSIZ) @@ -48,38 +77,12 @@ RF_CFGTBL: ; RF_INIT: CALL NEWLINE ; FORMATTING - PRTS("RF: IO=0x$") - LD A,RF_U0IO - CALL PRTHEXBYTE - PRTS(" DEVICES=$") - LD A,RF_DEVCNT - CALL PRTDECB - PRTS(" WP=$") - IN A,(RF_U0IO+3) - AND 1 - JR Z,NO_WP1 - PRTS("ON$") - JR D2_WP1 -NO_WP1: - PRTS("OFF$") -D2_WP1: - #IF (RF_DEVCNT >= 2) - IN A,(RF_U1IO+3) - AND 1 - JR Z,NO_WP2 - PRTS("-ON$") - JR D2_WP2 -NO_WP2: - PRTS("-OFF$") -D2_WP2: - - #ENDIF -; -; SETUP THE DIO TABLE ENTRIES -; + PRTS("RF:$") + LD B,RF_DEVCNT ; LOOP CONTROL LD IY,RF_CFGTBL ; START OF CFG TABLE RF_INIT0: + CALL RF_UNIT PUSH BC ; SAVE LOOP CONTROL LD BC,RF_FNTBL ; BC := FUNC TABLE ADR PUSH IY ; CFG ENTRY POINTER @@ -89,10 +92,30 @@ RF_INIT0: ADD IY,BC ; BUMP IY TO NEXT ENTRY POP BC ; RESTORE BC DJNZ RF_INIT0 ; LOOP AS NEEDED + + PRTS(" DEVICES=$") ; DISPLAY NUMBER + LD A,RF_DEVCNT ; OF DEVICES + CALL PRTDECB ; XOR A ; INIT SUCCEEDED RET ; RETURN ; +RF_UNIT: + PRTS(" IO=0x$") ; DISPLAY + LD A,(IY+RF_IOAD) ; PORT AND + CALL PRTHEXBYTE ; WRITE + PRTS(" WP=$") ; PROTECT + ADD A,RF_ST ; STATUS OF + LD C,A ; THIS DEVICE + IN A,(C) + AND 1 + JR Z,RF_NO_WP1 + PRTS("ON$") + RET +RF_NO_WP1: + PRTS("OFF$") + RET +; ; ; RF_FNTBL: From 7a4d42ba938fd30215497ea6ac8a827467dd44a1 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 3 Feb 2020 14:09:39 +0800 Subject: [PATCH 03/36] rf config updates --- Source/HBIOS/cfg_master.asm | 2 +- Source/HBIOS/cfg_mk4.asm | 2 +- Source/HBIOS/cfg_n8.asm | 2 +- Source/HBIOS/cfg_sbc.asm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 9bc94944..8c3e18e2 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -161,7 +161,7 @@ FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER -RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-2) +RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) IDEMODE .EQU IDEMODE_NONE ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 7291659f..ef2131dc 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -116,7 +116,7 @@ FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER -RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-2) +RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) IDEMODE .EQU IDEMODE_MK4 ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index f63be838..0936dae8 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -119,7 +119,7 @@ FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER -RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-2) +RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) IDEMODE .EQU IDEMODE_DIO ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 3622da7b..120b468c 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -119,7 +119,7 @@ FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER -RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-2) +RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) IDEMODE .EQU IDEMODE_DIO ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] From 47bb48c8b4792b0054856d9d5f3b3f7eb305a505 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 3 Feb 2020 20:40:59 +0800 Subject: [PATCH 04/36] Update rf.asm Fix device selection for more than 2 devices --- Source/HBIOS/rf.asm | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index f5fa1f55..30588a57 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -288,21 +288,9 @@ RF_WRSEC: ; ; RF_SETIO: - LD A,(IY+RF_DEV) ; GET DEVICE NUM - OR A ; SET FLAGS - JR NZ,RF_SETIO1 - LD A,RF_U0IO - JR RF_SETIO3 -RF_SETIO1: - DEC A - JR NZ,RF_SETIO2 - LD A,RF_U1IO - JR RF_SETIO3 -RF_SETIO2: - CALL PANIC ; INVALID UNIT -RF_SETIO3: - LD (RF_IO),A - RET + LD A,(IY+RF_IOAD) ; GET THE IO PORT + LD (RF_IO),A ; OF THE DEVICE WE + RET ; ARE WORKING ON ; ; ; From 48968766a00c778e75e80e1310bca826ce7a0baf Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 3 Feb 2020 14:48:27 -0800 Subject: [PATCH 05/36] Small CP/M 3 Update --- Source/CPM3/bioskrnl.asm | 2 +- Source/CPM3/boot.z80 | 72 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/Source/CPM3/bioskrnl.asm b/Source/CPM3/bioskrnl.asm index 32e918b9..ab3a9ccd 100644 --- a/Source/CPM3/bioskrnl.asm +++ b/Source/CPM3/bioskrnl.asm @@ -244,7 +244,7 @@ co$next: push h ; save the vector push b ; save the count and character not$out$ready: - call coster ! ora a ! jz not$out$ready + push b ! call coster ! pop b ! ora a ! jz not$out$ready pop b ! push b ; restore and resave the character and device call ?co ; if device selected, print it pop b ; recover count and character diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index d0b5cb0f..47787569 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -667,4 +667,76 @@ drvtbladr dw @dtbl ; drive map address (filled in later) dphtbladr dw dph0 ; dpb map address cbxsiz equ $ - cbx + if 0 +; +; Print the hex word value in HL +; +phex16: + push af + ld a,h + call phex8 + ld a,l + call phex8 + pop af + ret +; +; Print the hex byte value in A +; +phex8: + push af + push de + call hexascii + ld a,d + call cout + ld a,e + call cout + pop de + pop af + ret + +; +; Convert binary value in A to ascii hex characters in DE +; +hexascii: + ld d,a + call hexconv + ld e,a + ld a,d + rlca + rlca + rlca + rlca + call hexconv + ld d,a + ret +; +; convert low nibble of A to ascii hex +; +hexconv: + and 0fh ;low nibble only + add a,90h + daa + adc a,40h + daa + ret +; +; output character from A +; +cout: + ; save all incoming registers + push af + push bc + push de + push hl + ld e,a + ld bc,0100h + rst 08 + pop hl + pop de + pop bc + pop af + ret + + endif + end From c83cd1cb2d1d205a5e394dc668197eb565e6e5f2 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 3 Feb 2020 19:18:25 -0800 Subject: [PATCH 06/36] CP/M 3 Cleanup --- Source/CPM3/Build.cmd | 9 ++- Source/CPM3/boot.z80 | 117 +------------------------------------ Source/CPM3/util.z80 | 133 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 119 deletions(-) create mode 100644 Source/CPM3/util.z80 diff --git a/Source/CPM3/Build.cmd b/Source/CPM3/Build.cmd index 966837ea..f70ec6d2 100644 --- a/Source/CPM3/Build.cmd +++ b/Source/CPM3/Build.cmd @@ -35,7 +35,8 @@ zx Z80ASM -CHARIO/MF zx Z80ASM -MOVE/MF zx Z80ASM -DRVTBL/MF zx Z80ASM -DISKIO/MF -zx LINK -BIOS3[OS]=BIOSKRNL,SCB,BOOT,CHARIO,MOVE,DRVTBL,DISKIO +zx Z80ASM -UTIL/MF +zx LINK -BIOS3[OS]=BIOSKRNL,SCB,BOOT,CHARIO,MOVE,DRVTBL,DISKIO,UTIL zx GENCPM -AUTO -DISPLAY copy cpm3.sys cpm3res.sys rem pause @@ -54,7 +55,8 @@ zx Z80ASM -CHARIO/MF zx Z80ASM -MOVE/MF zx Z80ASM -DRVTBL/MF zx Z80ASM -DISKIO/MF -zx LINK -BNKBIOS3[B]=BIOSKRNL,SCB,BOOT,CHARIO,MOVE,DRVTBL,DISKIO +zx Z80ASM -UTIL/MF +zx LINK -BNKBIOS3[B]=BIOSKRNL,SCB,BOOT,CHARIO,MOVE,DRVTBL,DISKIO,UTIL zx GENCPM -AUTO -DISPLAY copy cpm3.sys cpm3bnk.sys rem pause @@ -73,7 +75,8 @@ zx Z80ASM -CHARIO/MF zx Z80ASM -MOVE/MF zx Z80ASM -DRVTBL/MF zx Z80ASM -DISKIO/MF -zx LINK -ZPMBIOS3[B]=BIOSKRNL,SCB,BOOT,CHARIO,MOVE,DRVTBL,DISKIO +zx Z80ASM -UTIL/MF +zx LINK -ZPMBIOS3[B]=BIOSKRNL,SCB,BOOT,CHARIO,MOVE,DRVTBL,DISKIO,UTIL rem zx GENCPM -AUTO -DISPLAY rem copy cpm3.sys zpm3.sys rem pause diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 47787569..14dfafe6 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -13,6 +13,7 @@ extrn @dtbl,@ctbl extrn @date,@hour,@min,@sec extrn @srch1 + extrn addhla, bcd2bin, bin2bcd include ver.inc @@ -570,50 +571,6 @@ read: ld c,20 jp bdos -addhla: - add a,l - ld l,a - ret nc - inc h - ret - -bcd2bin: - ; convert A from packed bcd to binary - push bc - ld c,a - and 0F0h - srl a - ld b,a - srl a - srl a - add a,b - ld b,a - ld a,c - and 0Fh - add a,b - pop bc - ret - -bin2bcd: - ; convert A from binary to packed bcd - push bc - ld b,10 - ld c,-1 -bin2bcd1: - inc c - sub b - jr nc,bin2bcd1 - add a,b - ld b,a - ld a,c - add a,a - add a,a - add a,a - add a,a - or b - pop bc - ret - if zpm signon$msg db 13,10,'ZPM3' @@ -667,76 +624,4 @@ drvtbladr dw @dtbl ; drive map address (filled in later) dphtbladr dw dph0 ; dpb map address cbxsiz equ $ - cbx - if 0 -; -; Print the hex word value in HL -; -phex16: - push af - ld a,h - call phex8 - ld a,l - call phex8 - pop af - ret -; -; Print the hex byte value in A -; -phex8: - push af - push de - call hexascii - ld a,d - call cout - ld a,e - call cout - pop de - pop af - ret - -; -; Convert binary value in A to ascii hex characters in DE -; -hexascii: - ld d,a - call hexconv - ld e,a - ld a,d - rlca - rlca - rlca - rlca - call hexconv - ld d,a - ret -; -; convert low nibble of A to ascii hex -; -hexconv: - and 0fh ;low nibble only - add a,90h - daa - adc a,40h - daa - ret -; -; output character from A -; -cout: - ; save all incoming registers - push af - push bc - push de - push hl - ld e,a - ld bc,0100h - rst 08 - pop hl - pop de - pop bc - pop af - ret - - endif - end diff --git a/Source/CPM3/util.z80 b/Source/CPM3/util.z80 new file mode 100644 index 00000000..affa7ade --- /dev/null +++ b/Source/CPM3/util.z80 @@ -0,0 +1,133 @@ + title 'Utility module for RomWBW' + + maclib options.lib + + public addhla, bcd2bin, bin2bcd + public phex16, phex8, cout + + cseg + +addhla: + add a,l + ld l,a + ret nc + inc h + ret + +bcd2bin: + ; convert A from packed bcd to binary + push bc + ld c,a + and 0F0h + srl a + ld b,a + srl a + srl a + add a,b + ld b,a + ld a,c + and 0Fh + add a,b + pop bc + ret + +bin2bcd: + ; convert A from binary to packed bcd + push bc + ld b,10 + ld c,-1 +bin2bcd1: + inc c + sub b + jr nc,bin2bcd1 + add a,b + ld b,a + ld a,c + add a,a + add a,a + add a,a + add a,a + or b + pop bc + ret + + if 0 +; +; Print the hex word value in HL +; +phex16: + push af + ld a,h + call phex8 + ld a,l + call phex8 + pop af + ret +; +; Print the hex byte value in A +; +phex8: + push af + push de + call hexascii + ld a,d + call cout + ld a,e + call cout + pop de + pop af + ret + +; +; Convert binary value in A to ascii hex characters in DE +; +hexascii: + ld d,a + call hexconv + ld e,a + ld a,d + rlca + rlca + rlca + rlca + call hexconv + ld d,a + ret +; +; convert low nibble of A to ascii hex +; +hexconv: + and 0Fh ;low nibble only + add a,90h + daa + adc a,40h + daa + ret +; +; output character from A +; +cout: + ; save all incoming registers + push af + push bc + push de + push hl + ld e,a + ld bc,0100h + rst 08 + pop hl + pop de + pop bc + pop af + ret + + else + +phex16: +phex8: +cout: + halt + + endif + + end From 6828269137061d2c730139e1b95771bd54dd4c3f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 4 Feb 2020 19:14:56 -0800 Subject: [PATCH 07/36] Fix CP/M 3 floppy disk access --- Source/CPM3/diskio.z80 | 64 +++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 91613e73..b951bfab 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -36,6 +36,8 @@ extrn ?const ; get console status extrn ?bnkxlt + + ;extrn phex8, cout ; CP/M 3 Disk definition macros @@ -365,6 +367,9 @@ dsk$login: ; simple single density only environment. + ;ld a,'L' + ;call cout + push de ; save DPH ptr ; check media @@ -372,7 +377,8 @@ dsk$login: ;halt ld c,a ; put in C ld b,18h ; HBIOS Media function - ld e,1 ; Enabled media check/discovery + ld e,1 ; Enable media check/discovery + ;rst 08 call 0FFF0H ; HBIOS call ld a,e ; Resultant media id to accum or a ; Set flags @@ -380,8 +386,11 @@ dsk$login: ; ; !!! Need to do something on error !!! ; - ret z ; Bail out on error + jr nz,dsk$login0 ; continue if OK + pop de ; else error + ret ; return +dsk$login0: ld hl,dpb$start - dpb$sz ld de,dpb$sz ld b,a ; loop count @@ -422,6 +431,9 @@ dsk$read: ; ld ix,30H ; halt + ;ld a,'R' + ;call cout + push de ; save XDPH pointer call dsk$seek ; disk seek pop hl ; restore pointer to HL @@ -440,8 +452,10 @@ dsk$read: endif ld d,a ; set desk bank ld e,1 ; 1 sector - ;rst 08 ; do it - call 0FFF0H + rst 08 ; do it + ;call 0FFF0H + + ;call phex8 ret ; return ; lxi h,read$msg ; point at " Read " @@ -470,8 +484,8 @@ dsk$write: endif ld d,a ; set desk bank ld e,1 ; 1 sector - ;rst 08 ; do it - call 0FFF0H + rst 08 ; do it + ;call 0FFF0H ret ; return ; lxi h,write$msg ; point at " Write " @@ -485,34 +499,44 @@ dsk$seek: ld c,a ; BIOS Disk Unit in C ld b,12H ; HBIOS SEEK function push bc ; save it - + push de ; save XDPH pointer + ld b,17h ; HBIOS DEVICE function + rst 08 ; Do it, D=device type + ld a,d ; put in accum + and 0F0h ; isolate high bits + ld b,1 ; assume it is floppy, 1 head bit + ld c,01h ; 1 bit head mask + cp 10h ; floppy? + jr z,seek0 ; yup, skip ahead + ld b,4 ; must be hard disk, 4 head bits + ld c,0Fh ; 4 bit head mask +seek0: + pop de ; recover XDPH pointer + push bc ; save bc inc de ; point to slice field of XDPH ld a,(de) ; get it ld e,a ; slice to E ld h,65 ; number of tracks per slice call mult8 ; HL now has track offset for slice - push hl ; save it for now - + pop bc ; recover bc + push hl ; save track offset for now ld hl,(@trk) ; get track value ld a,l ; lsb of track to a - and 0FH ; isolate head in low 4 bits - ld d,a ; stuff it in d - ld a,(@sect) ; get sector - ld e,a ; stuff it in e - ld b,4 ; prepare to shift out 4 bit head value + and c ; apply mask + ld d,a ; save in d seek1: srl h ; shift one bit out rr l ; ... of hl - djnz seek1 ; do all 4 bits - + djnz seek1 ; do all bits + ld a,(@sect) ; get sector + ld e,a ; stuff it in e ex de,hl ; de=track, hl=head/sect - ex (sp),hl ; save head/sect, hl = offset + ex (sp),hl ; save head/sect, hl = offset add hl,de ; hl has final track value pop de ; recover head/sect to de - pop bc ; recover function & unit - ;rst 08 ; perform seek - call 0FFF0H + rst 08 ; perform seek + ;call 0FFF0H ret ; From a96e8e9ef0fc0025c155384d3eaf4bf0c6ec668b Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Wed, 5 Feb 2020 19:26:24 +0800 Subject: [PATCH 08/36] Update ppide.asm Initial multi device ppide --- Source/HBIOS/ppide.asm | 197 ++++++++++++++++++++++++++++------------- 1 file changed, 135 insertions(+), 62 deletions(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 1cf840e3..4ebb7d71 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -29,11 +29,6 @@ PPIDE_IO_BASE .EQU $80 PPIDE_IO_BASE .EQU $4C #ENDIF ; -PPIDE_IO_DATALO .EQU PPIDE_IO_BASE + 0 ; IDE DATA BUS LSB (8255 PORT A) -PPIDE_IO_DATAHI .EQU PPIDE_IO_BASE + 1 ; IDE DATA BUS MSB (8255 PORT B) -PPIDE_IO_CTL .EQU PPIDE_IO_BASE + 2 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) -PPIDE_IO_PPI .EQU PPIDE_IO_BASE + 3 ; 8255 CONTROL PORT -; ; THE CONTROL PORT OF THE 8255 IS PROGRAMMED AS NEEDED TO READ OR WRITE ; DATA ON THE IDE BUS. PORT C OF THE 8255 IS ALWAYS IN OUTPUT MODE BECAUSE ; IT IS DRIVING THE ADDRESS BUS AND CONTROL SIGNALS. PORTS A & B WILL BE @@ -173,6 +168,11 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) ; PPIDE2: SECONDARY MASTER ; PPIDE3: SECONDARY SLAVE ; +PPIDE0IO .EQU PPIDE_IO_BASE +PPIDE1IO .EQU 20H +PPIDE2IO .EQU 00H +PPIDE3IO .EQU 00H +; PPIDE_DEVCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE ; ; COMMAND BYTES @@ -213,7 +213,7 @@ PPIDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE ; ; PPIDE DEVICE CONFIGURATION ; -PPIDE_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES +PPIDE_CFGSIZ .EQU 16 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS ; @@ -223,6 +223,11 @@ PPIDE_TYPE .EQU 2 ; DEVICE TYPE (BYTE) PPIDE_FLAGS .EQU 3 ; FLAG BITS BIT 0=CF, 1=LBA (BYTE) PPIDE_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) PPIDE_LBA .EQU 8 ; OFFSET OF LBA (DWORD) +PPIDE_PORT .EQU 12 ; PORT ADDRESS OF THIS DEVICE (BYTE) +PPIDE_DATALO .EQU 12 ; IDE DATA BUS LSB (8255 PORT A) (BYTE) +PPIDE_DATAHI .EQU 13 ; IDE DATA BUS MSB (8255 PORT B)(BYTE) +PPIDE_CTL .EQU 14 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) +PPIDE_PPI .EQU 15 ; 8255 CONTROL PORT(BYTE) ; PPIDE_CFGTBL: ; DEVICE 0, PRIMARY MASTER @@ -232,6 +237,10 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT + .DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) + .DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) + .DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT ; DEVICE 1, PRIMARY SLAVE .DB 1 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS @@ -239,6 +248,10 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT + .DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) + .DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) + .DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT ; #IF ($ - PPIDE_CFGTBL) != (PPIDE_DEVCNT * PPIDE_CFGSIZ) .ECHO "*** INVALID PPIDE CONFIG TABLE ***\n" @@ -275,6 +288,7 @@ PPIDE_INIT: LD (PPIDE_TOSCALER),HL ; SAVE IT ; PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD IY,PPIDE_CFGTBL LD A,PPIDE_IO_BASE CALL PRTHEXBYTE ; @@ -375,11 +389,15 @@ PPIDE_DETECT: ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO ; INTERFERE WITH THE VALUE BEING READ. + LD C,(IY+PPIDE_PPI) LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - OUT (PPIDE_IO_PPI),A ; OUTPUT TO CONTROL WORD - LD C,PPIDE_IO_DATALO ; PPI PORT A + OUT (C),A ; OUTPUT TO CONTROL WORD + + LD C,(IY+PPIDE_DATALO) ; PPI PORT A XOR A ; VALUE ZERO OUT (C),A ; PUSH VALUE TO PORT +;; OUT (C),0 +;; .DB $ED,$71 IN A,(C) ; GET PORT VALUE DCALL PC_SPACE DCALL PRTHEXBYTE @@ -717,7 +735,7 @@ PPIDE_RUNCMD: JP NZ,PPIDE_CMDERR RET ; -; +; READ IDE DATA INTO BUFFER POINTED TO BY HL ; PPIDE_GETBUF: #IF (PPIDETRACE >= 3) @@ -729,19 +747,22 @@ PPIDE_GETBUF: RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO READ + LD C,(IY+PPIDE_PPI) ;; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - OUT (PPIDE_IO_PPI),A ; DO IT + OUT (C),A ; DO IT ; ; SELECT READ/WRITE IDE REGISTER + LD C,(IY+PPIDE_CTL) ;; LD A,PPIDE_REG_DATA ; DATA REGISTER - OUT (PPIDE_IO_CTL),A ; DO IT + OUT (C),A ; DO IT + LD E,A ; E := READ UNASSERTED XOR PPIDE_CTL_DIOR ; SWAP THE READ LINE BIT LD D,A ; D := READ ASSERTED ; ; LOOP SETUP LD B,0 ; 256 ITERATIONS - LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) + LD C,(IY+PPIDE_DATALO) ; SETUP C WITH IO PORT (LSB) ; #IF (!PPIDE8BIT) INC C ; PRE-INCREMENT C @@ -761,16 +782,22 @@ PPIDE_GETBUF: RET ; PPIDE_GETBUF1: ; START OF READ LOOP - LD A,D ; ASSERT READ - OUT (PPIDE_IO_CTL),A ; DO IT + PUSH BC ;; + LD C,(IY+PPIDE_CTL) ;; + OUT (C),D ; ASSERT READ + POP BC ;; + #IF (!PPIDE8BIT) DEC C INI ; GET AND SAVE NEXT BYTE INC C ; LSB -> MSB #ENDIF INI ; GET AND SAVE NEXT BYTE - LD A,E ; DEASSERT READ - OUT (PPIDE_IO_CTL),A ; DO IT + + PUSH BC ;; + LD C,(IY+PPIDE_CTL) ;; + OUT (C),E ; DEASSERT READ + POP BC ;; ; JR NZ,PPIDE_GETBUF1 ; LOOP UNTIL DONE RET @@ -787,19 +814,23 @@ PPIDE_PUTBUF: RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO WRITE + + LD C,(IY+PPIDE_PPI) ;; LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - OUT (PPIDE_IO_PPI),A ; DO IT + OUT (C),A ; DO IT ; ; SELECT READ/WRITE IDE REGISTER + LD C,(IY+PPIDE_CTL) ;; LD A,PPIDE_REG_DATA ; DATA REGISTER - OUT (PPIDE_IO_CTL),A ; DO IT + OUT (C),A ;; + LD E,A ; E := WRITE UNASSERTED XOR PPIDE_CTL_DIOW ; SWAP THE READ LINE BIT LD D,A ; D := WRITE ASSERTED ; ; LOOP SETUP LD B,0 ; 256 ITERATIONS - LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) + LD C,(IY+PPIDE_DATALO) ; SETUP C WITH IO PORT (LSB) ; #IF (!PPIDE8BIT) INC C ; PRE-INCREMENT C @@ -825,10 +856,12 @@ PPIDE_PUTBUF1: ; START OF READ LOOP INC C #ENDIF OUTI - LD A,D ; ASSERT WRITE - OUT (PPIDE_IO_CTL),A ; DO IT - LD A,E ; DEASSERT WRITE - OUT (PPIDE_IO_CTL),A ; DO IT + PUSH BC + LD C,(IY+PPIDE_CTL) ; ASSERT WRITE + OUT (C),D ; DO IT + LD C,(IY+PPIDE_CTL) ; DEASSERT WRITE + OUT (C),E ; DO IT + POP BC ; JR NZ,PPIDE_PUTBUF1 ; LOOP UNTIL DONE RET @@ -860,17 +893,26 @@ PPIDE_GETRES: ; PPIDE_RESET: ; + PUSH BC + ; SETUP PPI TO READ + LD C,(IY+PPIDE_PPI) ;; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - OUT (PPIDE_IO_PPI),A ; DO IT -; + OUT (C),A ; DO IT + ; PULSE IDE RESET LINE + LD C,(IY+PPIDE_CTL) LD A,PPIDE_CTL_RESET - OUT (PPIDE_IO_CTL),A + OUT (C),A +; LD DE,20 CALL VDELAY - XOR A - OUT (PPIDE_IO_CTL),A +; + XOR A + OUT (C),A +;; OUT (C),0 +;; .DB $ED,$71 +; LD DE,20 CALL VDELAY ; @@ -909,6 +951,7 @@ PPIDE_RESET1: DJNZ PPIDE_RESET1 ; LOOP AS NEEDED ; POP IY ; RECOVER DEVICE CFG PTR + POP BC ; XOR A ; SIGNAL SUCCESS RET ; AND DONE @@ -973,9 +1016,13 @@ PPIDE_PROBE: ; RETURN SOMETHING OTHER THAN ZERO. IF AN IDE CONTROLLER IS ; THERE, THEN THE VALUE WRITTEN TO PPI PORT A IS IGNORED ; BECAUSE THE WRITE SIGNAL IS NEVER PULSED. - XOR A - OUT (PPIDE_IO_DATALO),A -; IN A,(PPIDE_REG_STAT) ; GET STATUS +; + LD C,(IY+PPIDE_DATALO) + XOR A + OUT (C),A +;; OUT (C),0 +;; .DB $ED,$71 +; CALL PPIDE_IN .DB PPIDE_REG_STAT DCALL PC_SPACE @@ -1207,48 +1254,61 @@ PPIDE_WAITBSY2: ; ; ; -PPIDE_IN: +PPIDE_IN: ; IY POINT TO CURRENT CFG TABLE + PUSH BC ; SAVE INCOMING BC ; 11TS + LD C,(IY+PPIDE_PPI) ; ; 19TS LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS - OUT (PPIDE_IO_PPI),A ; DO IT ; 11TS + OUT (C),A ; DO IT ; 12TS + POP BC ; RECOVER INCOMING BC ; 10TS EX (SP),HL ; GET PARM POINTER ; 19TS +; PUSH BC ; SAVE INCOMING BC ; 11TS LD B,(HL) ; GET CTL PORT VALUE ; 7TS - LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE ; 7TS + LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE ; 19TS OUT (C),B ; SET ADDRESS LINES ; 12TS SET 6,B ; TURN ON WRITE BIT ; 8TS OUT (C),B ; ASSERT WRITE LINE ; 12TS - ;NOP - ;NOP - IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE ; 11TS - ;NOP - ;NOP + ;NOP + ;NOP + LD C,(IY+PPIDE_DATALO) ; ; 19TS + IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12TS + ;NOP + ;NOP RES 6,B ; CLEAR WRITE BIT ; 8TS + LD C,(IY+PPIDE_CTL) ; 19TS OUT (C),B ; DEASSERT WRITE LINE ; 12TS POP BC ; RECOVER INCOMING BC ; 10TS INC HL ; POINT PAST PARM ; 6TS EX (SP),HL ; RESTORE STACK ; 19TS RET ; 10TS ; ; ----- -; ; 170TS +; ; 243TS WAS 170TS +; ; ----- +; OUTPUT A TO ; -PPIDE_OUT: - PUSH AF ; PRESERVE INCOMING VALUE - LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - OUT (PPIDE_IO_PPI),A ; DO IT - POP AF ; RECOVER VALUE TO WRITE +PPIDE_OUT: ; IY POINT TO CURRENT CFG TABLE + PUSH BC ; SAVE INCOMING BC + LD C,(IY+PPIDE_PPI) + LD B,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE + OUT (C),B ; DO IT + POP BC ;; EX (SP),HL ; GET PARM POINTER + PUSH BC ; SAVE INCOMING BC LD B,(HL) ; GET IDE ADDRESS VALUE - LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE + LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE +; OUT (C),B ; SET ADDRESS LINES SET 5,B ; TURN ON WRITE BIT OUT (C),B ; ASSERT WRITE LINE - ;NOP - ;NOP - OUT (PPIDE_IO_DATALO),A ; SEND DATA VALUE TO DEVICE - ;NOP - ;NOP + ;NOP + ;NOP + LD C,(IY+PPIDE_DATALO) ;; + OUT (C),A ; SEND DATA VALUE TO DEVICE + ;NOP + ;NOP RES 5,B ; CLEAR WRITE BIT + LD C,(IY+PPIDE_CTL) OUT (C),B ; DEASSERT WRITE LINE POP BC ; RECOVER INCOMING BC INC HL ; POINT PAST PARM @@ -1354,29 +1414,42 @@ PPIDE_PRTSTAT3: ; PRINT ALL REGISTERS DIRECTLY FROM DEVICE ; DEVICE MUST BE SELECTED PRIOR TO CALL ; +; +; PRINT ALL REGISTERS DIRECTLY FROM DEVICE +; DEVICE MUST BE SELECTED PRIOR TO CALL +; PPIDE_REGDUMP: PUSH AF PUSH BC + PUSH DE CALL PC_SPACE CALL PC_LBKT + LD C,(IY+PPIDE_PPI) ; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - OUT (PPIDE_IO_PPI),A ; DO IT - LD C,PPIDE_REG_CMD - LD B,7 + OUT (C),A ; DO IT + LD E,PPIDE_REG_CMD + LD D,7 PPIDE_REGDUMP1: - LD A,C ; REGISTER ADDRESS - OUT (PPIDE_IO_CTL),A ; SET IT + LD A,E ; REGISTER ADDRESS + LD C,(IY+PPIDE_CTL) + OUT (C),A ; SET IT XOR PPIDE_CTL_DIOR ; SET BIT TO ASSERT READ LINE - OUT (PPIDE_IO_CTL),A ; ASSERT READ - IN A,(PPIDE_IO_DATALO) ; GET VALUE + OUT (C),A ; ASSERT READ +; + LD C,(IY+PPIDE_DATALO) + IN A,(C) ; GET VALUE CALL PRTHEXBYTE ; DISPLAY IT - LD A,C ; RELOAD ADDRESS W/ READ UNASSERTED - OUT (PPIDE_IO_CTL),A ; AND SET IT - DEC C ; NEXT LOWER REGISTER - DEC B ; DEC LOOP COUNTER +; + LD A,E ; + LD C,(IY+PPIDE_CTL) ; RELOAD ADDRESS W/ READ UNASSERTED + OUT (C),E +; + DEC E ; NEXT LOWER REGISTER + DEC D ; DEC LOOP COUNTER CALL NZ,PC_SPACE ; FORMATTING JR NZ,PPIDE_REGDUMP1 ; LOOP AS NEEDED CALL PC_RBKT ; FORMATTING + POP DE POP BC POP AF RET From 8a1ddec0f0f033815b236a7e3faa0eb3008d9be8 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Wed, 5 Feb 2020 23:07:04 +0800 Subject: [PATCH 09/36] Update ppide.asm Optimization --- Source/HBIOS/ppide.asm | 137 ++++++++++++++++++++++++----------------- 1 file changed, 81 insertions(+), 56 deletions(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 4ebb7d71..a24f05b0 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -173,7 +173,7 @@ PPIDE1IO .EQU 20H PPIDE2IO .EQU 00H PPIDE3IO .EQU 00H ; -PPIDE_DEVCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE +PPIDE_DEVCNT .EQU 4 ; ASSUME ONLY PRIMARY INTERFACE ; ; COMMAND BYTES ; @@ -213,7 +213,7 @@ PPIDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE ; ; PPIDE DEVICE CONFIGURATION ; -PPIDE_CFGSIZ .EQU 16 ; SIZE OF CFG TBL ENTRIES +PPIDE_CFGSIZ .EQU 15 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS ; @@ -223,11 +223,9 @@ PPIDE_TYPE .EQU 2 ; DEVICE TYPE (BYTE) PPIDE_FLAGS .EQU 3 ; FLAG BITS BIT 0=CF, 1=LBA (BYTE) PPIDE_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) PPIDE_LBA .EQU 8 ; OFFSET OF LBA (DWORD) -PPIDE_PORT .EQU 12 ; PORT ADDRESS OF THIS DEVICE (BYTE) -PPIDE_DATALO .EQU 12 ; IDE DATA BUS LSB (8255 PORT A) (BYTE) -PPIDE_DATAHI .EQU 13 ; IDE DATA BUS MSB (8255 PORT B)(BYTE) -PPIDE_CTL .EQU 14 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) -PPIDE_PPI .EQU 15 ; 8255 CONTROL PORT(BYTE) +PPIDE_DATALO .EQU 12 ; BASE PORT AND IDE DATA BUS LSB (8255 PORT A) (BYTE) +PPIDE_CTL .EQU 13 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) +PPIDE_PPI .EQU 14 ; 8255 CONTROL PORT(BYTE) ; PPIDE_CFGTBL: ; DEVICE 0, PRIMARY MASTER @@ -237,10 +235,9 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA - .DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT - .DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) - .DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) - .DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT + .DB PPIDE0IO ; DATALO + .DB PPIDE0IO+2 ; CTL + .DB PPIDE0IO+3 ; PPI ; DEVICE 1, PRIMARY SLAVE .DB 1 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS @@ -248,10 +245,31 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA - .DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT - .DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) - .DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) - .DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT + .DB PPIDE0IO ; DATALO + .DB PPIDE0IO+2 ; CTL + .DB PPIDE0IO+3 ; PPI +#IF (PPIDE_DEVCNT >= 2) + ; DEVICE 2, PRIMARY MASTER + .DB 2 ; DRIVER DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB 0 ; FLAGS BYTE + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB PPIDE1IO ; DATALO + .DB PPIDE1IO+2 ; CTL + .DB PPIDE1IO+3 ; PPI + ; DEVICE 3, PRIMARY SLAVE + .DB 3 ; DRIVER DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB 0 ; FLAGS BYTE + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB PPIDE1IO ; DATALO + .DB PPIDE1IO+2 ; CTL + .DB PPIDE1IO+3 ; PPI +#ENDIF ; #IF ($ - PPIDE_CFGTBL) != (PPIDE_DEVCNT * PPIDE_CFGSIZ) .ECHO "*** INVALID PPIDE CONFIG TABLE ***\n" @@ -286,15 +304,11 @@ PPIDE_INIT: LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ CALL MULT8X16 ; HL := DE * A LD (PPIDE_TOSCALER),HL ; SAVE IT -; - PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS - LD IY,PPIDE_CFGTBL - LD A,PPIDE_IO_BASE - CALL PRTHEXBYTE ; #IF (PPIDE8BIT) PRTS(" 8BIT$") #ENDIF + LD IY,PPIDE_CFGTBL CALL PPIDE_DETECT ; CHECK FOR HARDWARE JR Z,PPIDE_INIT00 ; CONTINUE IF PRESENT ; @@ -347,6 +361,11 @@ PPIDE_INIT2: ; CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX ; +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+PPIDE_DATALO) + CALL PRTHEXBYTE +; #IF (PPIDE8BIT) PRTS(" 8BIT$") #ENDIF @@ -392,12 +411,17 @@ PPIDE_DETECT: LD C,(IY+PPIDE_PPI) LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE OUT (C),A ; OUTPUT TO CONTROL WORD - +; LD C,(IY+PPIDE_DATALO) ; PPI PORT A +; +#IF USEZ80OPT +;; OUT (C),0 + .DB $ED,$71 +#ELSE XOR A ; VALUE ZERO OUT (C),A ; PUSH VALUE TO PORT -;; OUT (C),0 -;; .DB $ED,$71 +#ENDIF +; IN A,(C) ; GET PORT VALUE DCALL PC_SPACE DCALL PRTHEXBYTE @@ -908,10 +932,13 @@ PPIDE_RESET: LD DE,20 CALL VDELAY ; - XOR A - OUT (C),A +#IF USEZ80OPT ;; OUT (C),0 -;; .DB $ED,$71 + .DB $ED,$71 +#ELSE + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT +#ENDIF ; LD DE,20 CALL VDELAY @@ -1018,10 +1045,13 @@ PPIDE_PROBE: ; BECAUSE THE WRITE SIGNAL IS NEVER PULSED. ; LD C,(IY+PPIDE_DATALO) - XOR A - OUT (C),A +#IF USEZ80OPT ;; OUT (C),0 -;; .DB $ED,$71 + .DB $ED,$71 +#ELSE + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT +#ENDIF ; CALL PPIDE_IN .DB PPIDE_REG_STAT @@ -1240,7 +1270,7 @@ PPIDE_WAITBSY1: LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR PPIDE_WAITBSY2: ;IN A,(PPIDE_REG_STAT) ; READ STATUS - CALL PPIDE_IN ; 17TS + 170TS + CALL PPIDE_IN ; 17TS + 204TS .DB PPIDE_REG_STAT ; 0TS LD C,A ; SAVE IT ; 4TS AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS @@ -1250,65 +1280,60 @@ PPIDE_WAITBSY2: OR E ; 4TS JR NZ,PPIDE_WAITBSY2 ; 12TS DJNZ PPIDE_WAITBSY1 ; ----- - JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 229TS -; -; + JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 246TS ; +; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A +; PPIDE_IN: ; IY POINT TO CURRENT CFG TABLE + EX (SP),HL ; GET PARM POINTER ; 19TS PUSH BC ; SAVE INCOMING BC ; 11TS LD C,(IY+PPIDE_PPI) ; ; 19TS LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS OUT (C),A ; DO IT ; 12TS - POP BC ; RECOVER INCOMING BC ; 10TS - EX (SP),HL ; GET PARM POINTER ; 19TS ; - PUSH BC ; SAVE INCOMING BC ; 11TS LD B,(HL) ; GET CTL PORT VALUE ; 7TS - LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE ; 19TS + DEC C ; LD C,(IY+PPIDE_CTL) ; 4TS OUT (C),B ; SET ADDRESS LINES ; 12TS SET 6,B ; TURN ON WRITE BIT ; 8TS OUT (C),B ; ASSERT WRITE LINE ; 12TS - ;NOP - ;NOP - LD C,(IY+PPIDE_DATALO) ; ; 19TS +; + DEC C ; 4TS + DEC C ; LD C,(IY+PPIDE_DATALO) ; 4TS IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12TS - ;NOP - ;NOP +; RES 6,B ; CLEAR WRITE BIT ; 8TS - LD C,(IY+PPIDE_CTL) ; 19TS + INC C ; 4TS + INC C ; LD C,(IY+PPIDE_CTL) ; 4TS OUT (C),B ; DEASSERT WRITE LINE ; 12TS POP BC ; RECOVER INCOMING BC ; 10TS INC HL ; POINT PAST PARM ; 6TS EX (SP),HL ; RESTORE STACK ; 19TS RET ; 10TS ; ; ----- -; ; 243TS WAS 170TS +; ; 204TS ; ; ----- -; OUTPUT A TO +; OUTPUT A TO 3 2 0 2 ; PPIDE_OUT: ; IY POINT TO CURRENT CFG TABLE + EX (SP),HL ; GET PARM POINTER PUSH BC ; SAVE INCOMING BC LD C,(IY+PPIDE_PPI) LD B,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE OUT (C),B ; DO IT - POP BC ;; - EX (SP),HL ; GET PARM POINTER - PUSH BC ; SAVE INCOMING BC LD B,(HL) ; GET IDE ADDRESS VALUE - LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE -; + DEC C ; LD C,(IY+PPIDE_CTL) OUT (C),B ; SET ADDRESS LINES SET 5,B ; TURN ON WRITE BIT OUT (C),B ; ASSERT WRITE LINE - ;NOP - ;NOP - LD C,(IY+PPIDE_DATALO) ;; +; + DEC C + DEC C ; LD C,(IY+PPIDE_DATALO) OUT (C),A ; SEND DATA VALUE TO DEVICE - ;NOP - ;NOP +; RES 5,B ; CLEAR WRITE BIT - LD C,(IY+PPIDE_CTL) + INC C + INC C ; LD C,(IY+PPIDE_CTL) OUT (C),B ; DEASSERT WRITE LINE POP BC ; RECOVER INCOMING BC INC HL ; POINT PAST PARM From 684a209c84138d1fba5944e340148f62d3a8e4aa Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 01:45:12 +0800 Subject: [PATCH 10/36] Update ppide.asm Optimization --- Source/HBIOS/ppide.asm | 56 +++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index a24f05b0..b0589701 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -771,12 +771,12 @@ PPIDE_GETBUF: RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO READ - LD C,(IY+PPIDE_PPI) ;; + LD C,(IY+PPIDE_PPI) ; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ OUT (C),A ; DO IT ; ; SELECT READ/WRITE IDE REGISTER - LD C,(IY+PPIDE_CTL) ;; + DEC C ; LD C,(IY+PPIDE_CTL) LD A,PPIDE_REG_DATA ; DATA REGISTER OUT (C),A ; DO IT @@ -784,12 +784,12 @@ PPIDE_GETBUF: XOR PPIDE_CTL_DIOR ; SWAP THE READ LINE BIT LD D,A ; D := READ ASSERTED ; - ; LOOP SETUP - LD B,0 ; 256 ITERATIONS - LD C,(IY+PPIDE_DATALO) ; SETUP C WITH IO PORT (LSB) -; -#IF (!PPIDE8BIT) - INC C ; PRE-INCREMENT C + LD B,0 ; LOOP SETUP - 256 ITERATIONS + + ; SETUP C WITH IO PORT + DEC C ; C = IY+PPIDE_DATAHI +#IF (PPIDE8BIT) ; + DEC C ; C = IY+PPIDE_DATALO #ENDIF ; CALL PPIDE_GETBUF1 ; FIRST PASS (FIRST 256 BYTES) @@ -805,24 +805,36 @@ PPIDE_GETBUF: JP NZ,PPIDE_IOERR RET ; -PPIDE_GETBUF1: ; START OF READ LOOP - PUSH BC ;; - LD C,(IY+PPIDE_CTL) ;; - OUT (C),D ; ASSERT READ - POP BC ;; - -#IF (!PPIDE8BIT) +PPIDE_GETBUF1: ; START OF READ LOOP +; +#IF (PPIDE8BIT) + INC C + INC C + OUT (C),D ; LD C,(IY+PPIDE_CTL) + DEC C ; ASSERT READ + DEC C + INI + PUSH AF + INC C + INC C + OUT (C),E ; LD C,(IY+PPIDE_CTL) + DEC C ; DEASSERT READ + DEC C + POP AF +#ELSE + INC C + OUT (C),D ; LD C,(IY+PPIDE_CTL) + DEC C ; ASSERT READ DEC C INI ; GET AND SAVE NEXT BYTE INC C ; LSB -> MSB + INI + PUSH AF + INC C + OUT (C),E ; LD C,(IY+PPIDE_CTL) + DEC C ; DEASSERT READ + POP AF #ENDIF - INI ; GET AND SAVE NEXT BYTE - - PUSH BC ;; - LD C,(IY+PPIDE_CTL) ;; - OUT (C),E ; DEASSERT READ - POP BC ;; -; JR NZ,PPIDE_GETBUF1 ; LOOP UNTIL DONE RET ; From c3ef70efc08aa8a7f4e8a3c21454c554852f0432 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 03:10:26 +0800 Subject: [PATCH 11/36] Update ppide.asm Optimization --- Source/HBIOS/ppide.asm | 73 ++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index b0589701..b0850329 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -809,30 +809,30 @@ PPIDE_GETBUF1: ; START OF READ LOOP ; #IF (PPIDE8BIT) INC C - INC C - OUT (C),D ; LD C,(IY+PPIDE_CTL) - DEC C ; ASSERT READ + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),D ; ASSERT READ + DEC C DEC C - INI + INI ; GET AND SAVE NEXT BYTE PUSH AF INC C - INC C - OUT (C),E ; LD C,(IY+PPIDE_CTL) - DEC C ; DEASSERT READ + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),E ; DEASSERT READ + DEC C DEC C POP AF #ELSE - INC C - OUT (C),D ; LD C,(IY+PPIDE_CTL) - DEC C ; ASSERT READ + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),D ; ASSERT READ + DEC C DEC C INI ; GET AND SAVE NEXT BYTE INC C ; LSB -> MSB - INI + INI ; GET AND SAVE NEXT BYTE PUSH AF - INC C - OUT (C),E ; LD C,(IY+PPIDE_CTL) - DEC C ; DEASSERT READ + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),E ; DEASSERT READ + DEC C POP AF #ENDIF JR NZ,PPIDE_GETBUF1 ; LOOP UNTIL DONE @@ -851,25 +851,25 @@ PPIDE_PUTBUF: ; ; SETUP PPI TO WRITE - LD C,(IY+PPIDE_PPI) ;; + LD C,(IY+PPIDE_PPI) LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE OUT (C),A ; DO IT ; ; SELECT READ/WRITE IDE REGISTER - LD C,(IY+PPIDE_CTL) ;; + DEC C ; LD C,(IY+PPIDE_CTL) LD A,PPIDE_REG_DATA ; DATA REGISTER - OUT (C),A ;; + OUT (C),A ; LD E,A ; E := WRITE UNASSERTED XOR PPIDE_CTL_DIOW ; SWAP THE READ LINE BIT LD D,A ; D := WRITE ASSERTED ; - ; LOOP SETUP - LD B,0 ; 256 ITERATIONS - LD C,(IY+PPIDE_DATALO) ; SETUP C WITH IO PORT (LSB) -; -#IF (!PPIDE8BIT) - INC C ; PRE-INCREMENT C + ; LOOP SETUP ; 256 ITERATIONS + LD B,0 ; SETUP C WITH IO PORT (LSB) + + DEC C ; LD C,(IY+PPIDE_DATAHI) +#IF (PPIDE8BIT) + DEC C ; LD C,(IY+PPIDE_DATALO) #ENDIF ; CALL PPIDE_PUTBUF1 ; FIRST PASS (FIRST 256 BYTES) @@ -886,19 +886,28 @@ PPIDE_PUTBUF: RET ; PPIDE_PUTBUF1: ; START OF READ LOOP -#IF (!PPIDE8BIT) +#IF (PPIDE8BIT) + OUTI ; PUT NEXT BYTE ON THE BUS + PUSH AF + INC C ; LD C,(IY+PPIDE_CTL) + INC C + OUT (C),D ; ASSERT WRITE + OUT (C),E ; DEASSERT WRITE + DEC C + DEC C + POP AF +#ELSE DEC C OUTI ; PUT NEXT BYTE ON THE BUS (LSB) INC C + OUTI ; PUT NEXT BYTE ON THE BUS (MSB) + PUSH AF + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),D ; ASSERT WRITE + OUT (C),E ; DEASSERT WRITE + DEC C + POP AF #ENDIF - OUTI - PUSH BC - LD C,(IY+PPIDE_CTL) ; ASSERT WRITE - OUT (C),D ; DO IT - LD C,(IY+PPIDE_CTL) ; DEASSERT WRITE - OUT (C),E ; DO IT - POP BC -; JR NZ,PPIDE_PUTBUF1 ; LOOP UNTIL DONE RET ; From 5df54bc6fdf612e95bd70820e2f5e392fc94f908 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 04:06:44 +0800 Subject: [PATCH 12/36] PPIDE updates --- Source/HBIOS/cfg_dyno.asm | 1 + Source/HBIOS/cfg_master.asm | 1 + Source/HBIOS/cfg_mk4.asm | 1 + Source/HBIOS/cfg_n8.asm | 1 + Source/HBIOS/cfg_rcz180.asm | 1 + Source/HBIOS/cfg_rcz80.asm | 1 + Source/HBIOS/cfg_sbc.asm | 1 + Source/HBIOS/cfg_scz180.asm | 1 + Source/HBIOS/ppide.asm | 4 ++-- 9 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 6e034243..83d7e0c5 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -113,6 +113,7 @@ PPIDEENABLE .EQU TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDEMODE .EQU PPIDEMODE_DYNO ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 8c3e18e2..8a004eb8 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -172,6 +172,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_NONE ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_NONE ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index ef2131dc..dd2e31a5 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -127,6 +127,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_DIO3 ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_MK4 ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 0936dae8..ac917b95 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -130,6 +130,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_N8 ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_CSIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 41bfc5e0..e3a1d7bb 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -133,6 +133,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 89b70b4f..e8f91bc4 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -137,6 +137,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 120b468c..b7027b23 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -130,6 +130,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_SBC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 39677f51..0b90bc61 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -128,6 +128,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index b0850329..63a6ae86 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -170,10 +170,10 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) ; PPIDE0IO .EQU PPIDE_IO_BASE PPIDE1IO .EQU 20H -PPIDE2IO .EQU 00H +PPIDE2IO .EQU 44H PPIDE3IO .EQU 00H ; -PPIDE_DEVCNT .EQU 4 ; ASSUME ONLY PRIMARY INTERFACE +PPIDE_DEVCNT .EQU PPICNT*2 ; ; COMMAND BYTES ; From 336393aad63d237a07ed018dc8c544821d007178 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 04:19:16 +0800 Subject: [PATCH 13/36] Update ppide.asm --- Source/HBIOS/ppide.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 63a6ae86..92eb3a66 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -248,7 +248,7 @@ PPIDE_CFGTBL: .DB PPIDE0IO ; DATALO .DB PPIDE0IO+2 ; CTL .DB PPIDE0IO+3 ; PPI -#IF (PPIDE_DEVCNT >= 2) +#IF (PPICNT> 1) ; DEVICE 2, PRIMARY MASTER .DB 2 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS From 2c3ebee6caf127197ac23f0b4f485478bc50da83 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 5 Feb 2020 14:04:17 -0800 Subject: [PATCH 14/36] Fix BPBIOS Disk I/O --- Source/Apps/Tune/Tune.asm | 59 ++++++++++++++++++++------------------- Source/BPBIOS/Build.cmd | 22 +++++++-------- Source/BPBIOS/hardhb.z80 | 3 +- Source/Images/Build.cmd | 1 + 4 files changed, 44 insertions(+), 41 deletions(-) diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index 54429c23..57dc25b9 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -747,8 +747,8 @@ FILTYP .DB 0 ; Sound file type (TYPPT2, TYPPT3, TYPMYM) TMP .DB 0 ; work around use of undocumented Z80 ; -MSGBAN .DB "Tune Player for RomWBW v2.2, 21-Nov-2019",0 -MSGUSE .DB "Copyright (C) 2019, Wayne Warthen, GNU GPL v3",13,10 +MSGBAN .DB "Tune Player for RomWBW v2.2a, 02-Feb-2020",0 +MSGUSE .DB "Copyright (C) 2020, Wayne Warthen, GNU GPL v3",13,10 .DB "PTxPlayer Copyright (C) 2004-2007 S.V.Bulba",13,10 .DB "MYMPlay by Marq/Lieves!Tuore",13,10,13,10 .DB "Usage: TUNE .[PT2|PT3|MYM]",0 @@ -2629,47 +2629,47 @@ HEAP .EQU $ VARS -ChanA .DS CHP -ChanB .DS CHP -ChanC .DS CHP +ChanA .DS CHP +ChanB .DS CHP +ChanC .DS CHP ;GlobalVars -DelyCnt .DS 1 -CurESld .DS 2 -CurEDel .DS 1 +DelyCnt .DS 1 +CurESld .DS 2 +CurEDel .DS 1 Ns_Base_AddToNs -Ns_Base .DS 1 -AddToNs .DS 1 +Ns_Base .DS 1 +AddToNs .DS 1 AYREGS -VT_ .DS 256 ;CreatedVolumeTableAddress +VT_ .DS 256 ;CreatedVolumeTableAddress -EnvBase .EQU VT_+14 +EnvBase .EQU VT_+14 -T1_ .EQU VT_+16 ;Tone tables data depacked here +T1_ .EQU VT_+16 ;Tone tables data depacked here -T_OLD_1 .EQU T1_ -T_OLD_2 .EQU T_OLD_1+24 -T_OLD_3 .EQU T_OLD_2+24 -T_OLD_0 .EQU T_OLD_3+2 -T_NEW_0 .EQU T_OLD_0 -T_NEW_1 .EQU T_OLD_1 -T_NEW_2 .EQU T_NEW_0+24 -T_NEW_3 .EQU T_OLD_3 +T_OLD_1 .EQU T1_ +T_OLD_2 .EQU T_OLD_1+24 +T_OLD_3 .EQU T_OLD_2+24 +T_OLD_0 .EQU T_OLD_3+2 +T_NEW_0 .EQU T_OLD_0 +T_NEW_1 .EQU T_OLD_1 +T_NEW_2 .EQU T_NEW_0+24 +T_NEW_3 .EQU T_OLD_3 -PT2EMPTYORN .EQU VT_+31 ;1,0,0 sequence +PT2EMPTYORN .EQU VT_+31 ;1,0,0 sequence -NT_ .FILL 192 ;CreatedNoteTableAddress +NT_ .DS 192 ;CreatedNoteTableAddress ;local var -Ampl .EQU AYREGS+AmplC +Ampl .EQU AYREGS+AmplC -VAR0END .EQU VT_+16 ;INIT zeroes from VARS to VAR0END-1 +VAR0END .EQU VT_+16 ;INIT zeroes from VARS to VAR0END-1 -VARSEND .EQU $ +VARSEND .EQU $ -MDLADDR .EQU $ +MDLADDR .EQU $ ; ;=============================================================================== ; MYM Player Storage @@ -2678,10 +2678,11 @@ MDLADDR .EQU $ .ORG HEAP ; Reserve room for uncompressed data uncomp: -.org $+(3*FRAG*REGS) + .DS (3*FRAG*REGS) ; The tune is stored here -rows: .dw 0 +rows: + .DS 2 ; WORD value data: ; ;=============================================================================== diff --git a/Source/BPBIOS/Build.cmd b/Source/BPBIOS/Build.cmd index db50c0d7..fdc9df0f 100644 --- a/Source/BPBIOS/Build.cmd +++ b/Source/BPBIOS/Build.cmd @@ -26,22 +26,22 @@ call :makebp 41nbnk rem pause -cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:ws*.* +cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:ws*.* -cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:*.img -cpmcp.exe -f wbw_hd0 ../../Binary/hd0.img *.img 0: +cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.img +cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.img 0: -cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:*.rel -cpmcp.exe -f wbw_hd0 ../../Binary/hd0.img *.rel 0: +cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.rel +cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.rel 0: -rem cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:*.dat -rem cpmcp.exe -f wbw_hd0 ../../Binary/hd0.img *.dat 0: +rem cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.dat +rem cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.dat 0: -cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:*.zex -cpmcp.exe -f wbw_hd0 ../../Binary/hd0.img *.zex 0: +cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.zex +cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.zex 0: -cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:myterm.z3t -cpmcp.exe -f wbw_hd0 ../../Binary/hd0.img myterm.z3t 0:myterm.z3t +cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:myterm.z3t +cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img myterm.z3t 0:myterm.z3t goto :eof diff --git a/Source/BPBIOS/hardhb.z80 b/Source/BPBIOS/hardhb.z80 index 39d2afab..d19ccb40 100644 --- a/Source/BPBIOS/hardhb.z80 +++ b/Source/BPBIOS/hardhb.z80 @@ -189,7 +189,8 @@ HDSK_RW1: POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A LD HL,(HB_DSKBUF) ; GET BUFFER ADDRESS - LD DE,1 ; TRANSFER ONE SECTOR + LD D,BID_HB ; BUFFER IN HBIOS BANK + LD E,1 ; ONE SECTOR CALL HBX_INVOKE ; DO IT OR A ; SET FLAGS RET Z ; DONE IF NO ERROR diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index 6006c3e6..b1768e31 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -33,3 +33,4 @@ call BuildHD.cmd nzcom zsys_wbw call BuildHD.cmd cpm3 call BuildHD.cmd zpm3 call BuildHD.cmd ws4 +call BuildHD.cmd bp From 4ac878029d09c68761b6236a87d1cf6d4779fc65 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 11:36:28 +0800 Subject: [PATCH 15/36] Update std.asm Required by ppide.asm --- Source/HBIOS/std.asm | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index c552b5a3..a40da2d4 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -28,6 +28,7 @@ TRUE .EQU ~FALSE USENONE .EQU 0 ; NO DEBUG USEXIO .EQU 1 ; BASIC SERIAL DRIVER USEMIO .EQU 2 ; MEMORY BUFFER DRIVER +USEZ80OPT .EQU FALSE ; USE UNOFFICIAL OP CODES WBWDEBUG .EQU USENONE ; ; PRIMARY HARDWARE PLATFORMS From 7fb1a8851e97eeb940dae471b92579d1a3443f4a Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 7 Feb 2020 13:16:30 +0800 Subject: [PATCH 16/36] Add ROM based game Refer 2048game.com Requires VT100 terminal. --- Source/HBIOS/Build.ps1 | 16 +- Source/HBIOS/game.asm | 1225 ++++++++++++++++++++++++++++++++++++++ Source/HBIOS/imgpad0.asm | 2 +- Source/HBIOS/romldr.asm | 1 + Source/HBIOS/std.asm | 4 + 5 files changed, 1237 insertions(+), 11 deletions(-) create mode 100644 Source/HBIOS/game.asm diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index a94fe7d7..ad74d64f 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -170,14 +170,10 @@ Copy-Item '..\Forth\camel80.bin' 'camel80.bin' Copy-Item '..\Fonts\font*.asm' '.' # Assemble individual components. Note in the case of UNA, there is less to build. -Asm 'dbgmon' -Asm 'prefix' -Asm 'romldr' -Asm 'eastaegg' -Asm 'nascom' -Asm 'tastybasic' -Asm 'imgpad' -Asm 'imgpad0' +# +$RomComponentList = "dbgmon", "prefix", "romldr", "eastaegg", "nascom", "tastybasic", "game", "imgpad", "imgpad0" +ForEach ($RomComponentName in $RomComponentList) {Asm $RomComponentName} + if ($Platform -ne "UNA") { Asm 'hbios' '-dROMBOOT' -Output 'hbios_rom.bin' -List 'hbios_rom.lst' @@ -201,7 +197,7 @@ Concat 'prefix.bin','zsys.bin' 'zsys.sys' # Build 32K OS chunk containing the loader, debug monitor, and OS images Concat 'romldr.bin', 'eastaegg.bin','dbgmon.bin', 'cpm.bin', 'zsys.bin' osimg.bin -Concat 'camel80.bin', 'nascom.bin', 'tastybasic.bin', 'imgpad0.bin' osimg1.bin +Concat 'camel80.bin', 'nascom.bin', 'tastybasic.bin', 'game.bin', 'imgpad0.bin' osimg1.bin # # Now the ROM disk image is created. This is done by starting with a # blank ROM disk image of the correct size, then cpmtools is used to @@ -249,5 +245,5 @@ else Concat 'hbios_img.bin','osimg.bin' $ImgFile } -# Remove the temprary working ROM disk file +# Remove the temporary working ROM disk file Remove-Item $RomDiskFile diff --git a/Source/HBIOS/game.asm b/Source/HBIOS/game.asm new file mode 100644 index 00000000..cdc5fca6 --- /dev/null +++ b/Source/HBIOS/game.asm @@ -0,0 +1,1225 @@ +; 2048 +; +; Join the numbers and get to the 2048 tile. +; +; Commands: +; +; Use the arrow keys to move the tiles. +; When two tiles with the same number touch, they merge into one. +; +; w, s, a, d - Alternate keys (up, down, left, right) +; CTRL-E, CTRL-X, CTRL-S, CTRL-D - Wordstar-compatible control keys +; +; Compile: +; +; TASM -80 -b 2048.ASM 2048.COM +; +; Credits: +; +; Based on 2048 created by Gabriele Cirulli. +; Based on the console version for GNU/Linux by Maurits van der Schee +; Ported to Z80 and CP/M by Marco Maccaferri +; Ported to ROMWBW ROM by Phil Summers difficultylevelhigh@gmail from https://github.com/maccasoft/z80-apps/2048.asm + +CTRL_A .EQU 1 +CTRL_B .EQU 2 +CTRL_C .EQU 3 +CTRL_D .EQU 4 +CTRL_E .EQU 5 +CTRL_F .EQU 6 +CTRL_G .EQU 7 +CTRL_H .EQU 8 +CTRL_I .EQU 9 +CTRL_J .EQU 10 +CTRL_K .EQU 11 +CTRL_L .EQU 12 +CTRL_M .EQU 13 +CTRL_N .EQU 14 +CTRL_O .EQU 15 +CTRL_P .EQU 16 +CTRL_Q .EQU 17 +CTRL_R .EQU 18 +CTRL_S .EQU 19 +CTRL_T .EQU 20 +CTRL_U .EQU 21 +CTRL_V .EQU 22 +CTRL_W .EQU 23 +CTRL_X .EQU 24 +CTRL_Y .EQU 25 +CTRL_Z .EQU 26 + +BEL .EQU 07H +FF .EQU 0CH +CR .EQU 0DH +LF .EQU 0AH +EOS .EQU 24H + +;BDOS .EQU 0005H + +BOARD_X .EQU 25H +BOARD_Y .EQU 06H + +#include "std.asm" + + .ORG GAM_LOC + +S2048: LD A,R + LD (RAND16+1),A + LD A,R + LD (RAND16+2),A + + LD B,VAREND-BOARD + LD HL,BOARD + XOR A +CLRBOARD: LD (HL),A + INC HL + DJNZ CLRBOARD + + LD DE,INIT +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + CALL ADDRANDOM + CALL ADDRANDOM + + CALL DRAWBORDER + CALL DRAWBOARD + +LOOP2 LD A,BOARD_X-3 + LD (XPOS),A + LD A,BOARD_Y + ADD A,13H + DAA + LD (YPOS),A + CALL GOTOXY + LD DE,MSG1 +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + +LOOP: +; LD C,06H +; LD E,0FFH +; CALL BDOS +; CP 0 +; JP Z,LOOP + CALL CIN + + CP 'a' + JP C,K3 + CP '{' + JP NC,K3 + AND 5FH + +K3 CP CTRL_C + JP Z,EXIT + + CP CTRL_E + JP Z,TOP + CP CTRL_X + JP Z,BOTTOM + CP CTRL_D + JP Z,RIGHT + CP CTRL_S + JP Z,LEFT + + CP 'W' + JP Z,TOP + CP 'S' + JP Z,BOTTOM + CP 'D' + JP Z,RIGHT + CP 'A' + JP Z,LEFT + + CP 'Q' + JP Z,QUIT + + CP 1BH + JP Z,K1 + +; LD C,02H +; LD E,BEL +; CALL BDOS +; CALL COUTE + + JP LOOP + +K1: +; LD C,06H +; LD E,0FFH +; CALL BDOS +; CP 0 +; JP Z,K1 + CALL CIN + + CP 'O' + JP NZ,K2 + +K4: +; LD C,06H +; LD E,0FFH +; CALL BDOS +; CP 0 +; JP Z,K4 + CALL CIN + +K2 CP 'A' + JP Z,TOP + CP 'B' + JP Z,BOTTOM + CP 'C' + JP Z,RIGHT + CP 'D' + JP Z,LEFT + +; LD C,02H +; LD E,BEL +; CALL BDOS +; CALL COUTE + + JP LOOP + +LOOP1 LD A,(MOVED) + CP 0 + JP Z,LOOP + + CALL DRAWBOARD + + CALL ADDRANDOM + CALL DRAWBOARD + + CALL ISOVER + CP 1 + JP Z,GAMEOVER + + JP LOOP + +TOP: + CALL ROTATE + CALL ROTATE + CALL ROTATE + CALL MOVEMERGE + CALL ROTATE + JP LOOP1 + +BOTTOM: + CALL ROTATE + CALL MOVEMERGE + CALL ROTATE + CALL ROTATE + CALL ROTATE + JP LOOP1 + +RIGHT: + CALL ROTATE + CALL ROTATE + CALL MOVEMERGE + CALL ROTATE + CALL ROTATE + JP LOOP1 + +LEFT: + CALL MOVEMERGE + JP LOOP1 + +QUIT: + LD A,BOARD_X-3 + LD (XPOS),A + LD A,BOARD_Y + ADD A,13H + DAA + LD (YPOS),A + CALL GOTOXY + LD DE,MSG2 +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + +Q1: +; LD C,06H +; LD E,0FFH +; CALL BDOS +; CP 0 +; JP Z,Q1 + CALL CIN + + CP 'y' + JP Z,EXIT + CP 'Y' + JP Z,EXIT + CP 'n' + JP Z,LOOP2 + CP 'N' + JP Z,LOOP2 + CP 'R' + JP S2048 + CP 'r' + JP S2048 + +; LD C,02H +; LD E,BEL +; CALL BDOS +; CALL COUTE + JP Q1 + +GAMEOVER: + LD A,BOARD_X-3 + LD (XPOS),A + LD A,BOARD_Y+13H + DAA + LD (YPOS),A + CALL GOTOXY + LD DE,MSG3 +; LD C,09H +; CALL BDOS + CALL PRTSTRDE +GAMEMORE: CALL CIN + CP 'y' + JP Z,S2048 + CP 'Y' + JP Z,S2048 + CP 'n' + JP Z,EXIT + CP 'N' + JP Z,EXIT + JR GAMEMORE +EXIT: + LD DE,TERM +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + LD A,00H + LD HL,0000H + JP 0FFF9H +; RET + +ISOVER: + LD A,1 + LD (RESULT),A + + LD B,16 + LD HL,BOARD +G1: LD A,(HL) + CP 13 + JP Z,GR + INC HL + DJNZ G1 + + CALL CANMERGE + CP 0 + JP Z,G2 + XOR A + LD (RESULT),A + +G2: CALL ROTATE + CALL CANMERGE + CP 0 + JP Z,G3 + XOR A + LD (RESULT),A + +G3: CALL ROTATE + CALL CANMERGE + CP 0 + JP Z,G4 + XOR A + LD (RESULT),A + +G4: CALL ROTATE + CALL CANMERGE + CP 0 + JP Z,G5 + XOR A + LD (RESULT),A + +G5: CALL ROTATE + +GR: LD A,(RESULT) + RET + +CANMERGE: + LD HL,BOARD + LD (BOARDPTR),HL + CALL TESTMERGE + CP 1 + RET Z + LD HL,BOARD+4 + LD (BOARDPTR),HL + CALL TESTMERGE + CP 1 + RET Z + LD HL,BOARD+8 + LD (BOARDPTR),HL + CALL TESTMERGE + CP 1 + RET Z + LD HL,BOARD+12 + LD (BOARDPTR),HL + CALL TESTMERGE + RET + +TESTMERGE: + LD DE,(BOARDPTR) + LD HL,(BOARDPTR) + INC HL + + LD B,3 +M8 LD A,(DE) + CP 0 + JP Z,M7 + LD C,(HL) + CP C + JP Z,M7 + INC HL + INC DE + DJNZ M8 + XOR A + RET +M7 LD A,1 + RET + +MOVEMERGE: + XOR A + LD (MOVED),A + + LD HL,BOARD + LD (BOARDPTR),HL + CALL MERGE + LD HL,BOARD+4 + LD (BOARDPTR),HL + CALL MERGE + LD HL,BOARD+8 + LD (BOARDPTR),HL + CALL MERGE + LD HL,BOARD+12 + LD (BOARDPTR),HL + CALL MERGE + + RET + +ADDRANDOM: + LD DE,0 + LD B,16 + LD HL,BOARD +N2 LD A,(HL) + CP 0 + JP NZ,N1 + INC E +N1 INC HL + DJNZ N2 + + LD A,E + CP 0 + RET Z + + PUSH DE + CALL RAND16 + POP DE + CALL DIV16 + + LD B,L +N4: LD C,16 + LD HL,BOARD +N5: LD A,(HL) + CP 0 + JP NZ,N3 + DEC B + JP Z,N6 +N3: INC HL + DEC C + JP NZ,N5 + JP N4 + +N6 PUSH HL + + CALL RAND16 + LD DE,10 + CALL DIV16 + LD DE,9 + CALL DIV16 + LD A,E + INC A + + POP HL + LD (HL),A + + RET + +MERGE: + CALL COLLAPSE + + ; merge tiles with same value + + LD DE,(BOARDPTR) + LD HL,(BOARDPTR) + INC HL + + LD B,3 +M6: LD A,(DE) + CP 0 + RET Z + LD C,(HL) + CP C + JP NZ,M5 + + INC A + LD (DE),A + CALL ADDPOINTS + XOR A + LD (HL),A + + LD A,(MOVED) + INC A + LD (MOVED),A + + PUSH DE + PUSH HL + CALL COLLAPSE + POP HL + POP DE + +M5: INC HL + INC DE + DJNZ M6 + + RET + +COLLAPSE: + ; collapse all tiles + + LD HL,(BOARDPTR) + + LD B,4 ; find first zero +M1: LD A,(HL) + CP 0 + JP Z,M2 + INC HL + DJNZ M1 + RET + +M2: LD E,L ; DE=fist zero position + LD D,H + +M4: LD A,(HL) ; move all non-zero tiles + CP 0 + JP Z,M3 + + LD (DE),A + INC DE + XOR A + LD (HL),A + + LD A,(MOVED) + INC A + LD (MOVED),A + +M3: INC HL + DJNZ M4 + + RET + +ROTATE: + ; outer ring + + LD B,3 + +R1: LD A,(BOARD+3) + LD C,A + + LD A,(BOARD+2) + LD (BOARD+3),A + LD A,(BOARD+1) + LD (BOARD+2),A + LD A,(BOARD+0) + LD (BOARD+1),A + + LD A,(BOARD+4) + LD (BOARD+0),A + LD A,(BOARD+8) + LD (BOARD+4),A + LD A,(BOARD+12) + LD (BOARD+8),A + + LD A,(BOARD+13) + LD (BOARD+12),A + LD A,(BOARD+14) + LD (BOARD+13),A + LD A,(BOARD+15) + LD (BOARD+14),A + + LD A,(BOARD+11) + LD (BOARD+15),A + LD A,(BOARD+7) + LD (BOARD+11),A + LD A,C + LD (BOARD+7),A + + DJNZ R1 + + ; inner ring + + LD A,(BOARD+6) + LD C,A + + LD A,(BOARD+5) + LD (BOARD+6),A + LD A,(BOARD+9) + LD (BOARD+5),A + LD A,(BOARD+10) + LD (BOARD+9),A + + LD A,C + LD (BOARD+10),A + + RET + +ADDPOINTS: + PUSH DE + PUSH HL + + LD E,A + LD D,0 + LD HL,POINTS + ADD HL,DE + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + + LD A,(SCORE+3) + ADD A,E + DAA + LD (SCORE+3),A + + LD A,(SCORE+2) + ADC A,D + DAA + LD (SCORE+2),A + + LD A,(SCORE+1) + ADC A,00H + DAA + LD (SCORE+1),A + + LD A,(SCORE) + ADC A,00H + DAA + LD (SCORE),A + + POP HL + POP DE + RET + +PRINTSCORE: + LD HL,SCORE + LD DE,SCORESTR+4 + LD B,4 + +P1 LD A,(HL) + RRA + RRA + RRA + RRA + AND 0FH + ADD A,30H + LD (DE),A + INC DE + + LD A,(HL) + AND 0FH + ADD A,30H + LD (DE),A + INC DE + + INC HL + DJNZ P1 + + LD HL,SCORESTR+4 + LD B,7 +P3 LD A,(HL) + CP 30H + JP NZ,P2 + LD A,20H + LD (HL),A + INC HL + DJNZ P3 + +P2 LD A,BOARD_X + ADD A,16H + DAA + LD (XPOS),A + LD A,BOARD_Y + SUB 02H + DAA + LD (YPOS),A + CALL GOTOXY + + LD DE,SCORESTR +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + RET + +DRAWBORDER: + LD A,BOARD_X + LD (XPOS),A + LD A,BOARD_Y + SUB 02H + DAA + LD (YPOS),A + CALL GOTOXY + + LD DE,MSG4 +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + LD A,BOARD_X + SUB 01H + DAA + LD (XPOS),A + LD A,BOARD_Y + SUB 01H + DAA + LD (YPOS),A + CALL GOTOXY + + LD DE,TOPBORDER +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + LD B,12 +L4 PUSH BC + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY +; LD C,02H + LD E,0DBH +; CALL BDOS + CALL COUTE + LD DE,ADVANCE +; LD C,09H +; CALL BDOS + CALL PRTSTRDE +; LD C,02H + LD E,0DBH +; CALL BDOS + CALL COUTE + POP BC + DEC B + JP NZ,L4 + + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY + LD DE,BTMBORDER +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + RET + +DRAWBOARD: + CALL PRINTSCORE + + LD A,BOARD_X + LD (XPOS),A + LD A,BOARD_Y + SUB 01H + DAA + LD (YPOS),A + + LD HL,BOARD + LD B,4 +L1 PUSH BC + + PUSH HL + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY + POP HL + + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + CALL NEWLINE + POP HL + + DEC HL + DEC HL + DEC HL + + PUSH HL + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY + POP HL + + PUSH HL + LD E,(HL) + CALL PRINTLABEL + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTLABEL + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTLABEL + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTLABEL + CALL NEWLINE + POP HL + + DEC HL + DEC HL + DEC HL + + PUSH HL + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY + POP HL + + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + CALL NEWLINE + POP HL + + INC HL + + POP BC + DEC B + JP NZ,L1 + + RET + +PRINTSPACE: + LD D,0 + + PUSH DE + LD HL,COLORPTR + ADD HL,DE + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + POP DE + + LD DE,SPACER +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + RET + +PRINTLABEL: + LD D,0 + + PUSH DE + LD HL,COLORPTR + ADD HL,DE + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + POP DE + + PUSH DE + LD HL,LABELPTR + ADD HL,DE + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + POP DE + + RET + +GOTOXY: +; LD C,02H + LD E,1BH +; CALL BDOS + CALL COUTE +; LD C,02H + LD E,'[' +; CALL BDOS + CALL COUTE + + LD A,(YPOS) + CP 10H + JP C,L2 + + RRA + RRA + RRA + RRA + AND 0FH + ADD A,'0' + +; LD C,02H + LD E,A +; CALL BDOS + CALL COUTE + + LD A,(YPOS) + +L2 AND 0FH + ADD A,'0' + +; LD C,02H + LD E,A +; CALL BDOS + CALL COUTE + +; LD C,02H + LD E,3BH +; CALL BDOS + CALL COUTE + + LD A,(XPOS) + CP 10H + JP C,L3 + + RRA + RRA + RRA + RRA + AND 0FH + ADD A,'0' + +; LD C,02H + LD E,A +; CALL BDOS + CALL COUTE + + LD A,(XPOS) + +L3 AND 0FH + ADD A,'0' + +; LD C,02H + LD E,A +; CALL BDOS + CALL COUTE + +; LD C,02H + LD E,'H' +; CALL BDOS + CALL COUTE + + RET + +NEWLINE: + +; LD C,02H + LD E,CR +; CALL BDOS + CALL COUTE + +; LD C,02H + LD E,LF +; CALL BDOS + CALL COUTE + + RET + +RAND16 LD DE,0 + LD A,D + LD H,E + LD L,253 + OR A + SBC HL,DE + SBC A,0 + SBC HL,DE + LD D,0 + SBC A,D + LD E,A + SBC HL,DE + JR NC,RAND + INC HL +RAND LD (RAND16+1),HL + RET + +DIV16: + LD A,H ; HL = HL % DE + LD C,L + LD HL,0 + LD B,16 + +DL1 SCF + RL C + RLA + ADC HL,HL + SBC HL,DE + JR NC,$+4 + ADD HL,DE + DEC C + DJNZ DL1 + + LD D,A ; DE = HL / DE + LD E,C + RET + +SPACER .DB " ", '$' + +LABELPTR: .DW LABELS + .DW LABELS + 8 + .DW LABELS + 16 + .DW LABELS + 24 + .DW LABELS + 32 + .DW LABELS + 40 + .DW LABELS + 48 + .DW LABELS + 56 + .DW LABELS + 64 + .DW LABELS + 72 + .DW LABELS + 80 + .DW LABELS + 88 + .DW LABELS + 96 + .DW LABELS + 104 + +LABELS .DB " ", EOS + .DB " 2 ", EOS + .DB " 4 ", EOS + .DB " 8 ", EOS + .DB " 16 ", EOS + .DB " 32 ", EOS + .DB " 64 ", EOS + .DB " 128 ", EOS + .DB " 256 ", EOS + .DB " 512 ", EOS + .DB " 1024 ", EOS + .DB " 2048 ", EOS + .DB " 4096 ", EOS + .DB " 8192 ", EOS + +COLORPTR: .DW COLORS + .DW COLORS + 9 + .DW COLORS + 18 + .DW COLORS + 27 + .DW COLORS + 36 + .DW COLORS + 45 + .DW COLORS + 54 + .DW COLORS + 63 + .DW COLORS + 72 + .DW COLORS + 81 + .DW COLORS + 90 + .DW COLORS + 99 + .DW COLORS + 108 + .DW COLORS + 117 + +COLORS .DB 1BH, "[40;37m", EOS ; 0 + .DB 1BH, "[44;37m", EOS ; 2 + .DB 1BH, "[46;37m", EOS ; 4 + .DB 1BH, "[42;37m", EOS ; 8 + .DB 1BH, "[43;30m", EOS ; 16 + .DB 1BH, "[45;37m", EOS ; 32 + .DB 1BH, "[41;37m", EOS ; 64 + .DB 1BH, "[47;30m", EOS ; 128 + .DB 1BH, "[44;37m", EOS ; 256 + .DB 1BH, "[46;37m", EOS ; 512 + .DB 1BH, "[42;37m", EOS ; 1024 + .DB 1BH, "[43;30m", EOS ; 2048 + .DB 1BH, "[45;37m", EOS ; 4096 + .DB 1BH, "[41;37m", EOS ; 8192 + +POINTS .DW 0000H + .DW 0000H + .DW 0004H + .DW 0008H + .DW 0016H + .DW 0032H + .DW 0064H + .DW 0128H + .DW 0256H + .DW 0512H + .DW 1024H + .DW 2048H + .DW 4096H + .DW 8192H + +INIT: .DB 1BH, "[2J", EOS +TERM: .DB 1BH, "[?25h" +RESET: .DB 1BH, "[0m", EOS + +ADVANCE: .DB 1BH, "[28C", EOS + +TOPBORDER: + .DB 1BH, "[47;37m" + .DB 0DCH + .DB 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH + .DB 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH + .DB 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH + .DB 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH + .DB 0DCH, EOS + +BTMBORDER .DB 0DFH + .DB 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH + .DB 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH + .DB 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH + .DB 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH + .DB 0DFH, 1BH, "[0m", EOS + +MSG1: .DB 1BH, "[0m" + .DB "w=up s=down a=right d=right q=quit" + + .DB EOS +MSG2: .DB 1BH, "[0m" + .DB " QUIT or RESTART (y/n/r) " + .DB EOS +MSG3: .DB 1BH, "[0m" + .DB " GAME OVER! PLAY AGAIN (y/n) " + .DB BEL, CR, LF, EOS +MSG4: .DB 1BH, "[0m" + .DB "2048 pts" + .DB EOS + +; HBIOS functions replacing BDOS functions +; +; +; PRINT A STRING AT ADDRESS SPECIFIED IN DE +; STRING MUST BE TERMINATED BY '$' +; +PRTSTRDE: + PUSH HL + LD H,D + LD L,E + CALL PRTSTR + POP HL + RET +; +; PRINT A STRING AT ADDRESS SPECIFIED IN HL +; STRING MUST BE TERMINATED BY '$' +; USAGE: +; LD HL,MYSTR +; CALL PRTSTR +; ... +; MYSTR: .DB "HELLO$" +; +PRTSTR: + LD A,(HL) + INC HL + CP '$' + RET Z + CALL COUT + JR PRTSTR +; +; OUTPUT CHARACTER IN A TO CONSOLE DEVICE +; +COUT: PUSH AF + PUSH BC + PUSH DE + LD B,01H + LD C,0 + LD E,A + RST 08 + POP DE + POP BC + POP AF + RET +; +; OUTPUT CHARACTER IN A TO CONSOLE DEVICE +; +COUTE: PUSH AF + LD A,E + CALL COUT + POP AF + RET +; +; WAIT FOR A CHARACTER FROM THE CONSOLE DEVICE AND RETURN IT IN A +; +CIN: PUSH BC + LD B,00H + LD C,00H + RST 08 + LD A,E + POP BC + RET + +; variables + +BOARD: + .DB 00, 00, 00, 00 + .DB 00, 00, 00, 00 + .DB 00, 00, 00, 00 + .DB 00, 00, 00, 00 + +XPOS: .DB 0 +YPOS: .DB 0 +BOARDPTR: .DW 0 +MOVED: .DB 0 +RESULT: .DB 0 +SCORE .DB 00H, 00H, 00H, 00H +VAREND .EQU $ +SCORESTR .DB 1BH, "[0m $" + +LASTBYTE .EQU $ + +SLACK .EQU (GAM_END - LASTBYTE) + .FILL SLACK,'e' +; + .ECHO "GAME space remaining: " + .ECHO SLACK + .ECHO " bytes.\n" + + .END + diff --git a/Source/HBIOS/imgpad0.asm b/Source/HBIOS/imgpad0.asm index e2822918..74a2a125 100644 --- a/Source/HBIOS/imgpad0.asm +++ b/Source/HBIOS/imgpad0.asm @@ -1,6 +1,6 @@ #INCLUDE "std.asm" ; -SLACK .EQU ($8000-BAS_SIZ-TBC_SIZ-FTH_SIZ) +SLACK .EQU ($8000-BAS_SIZ-TBC_SIZ-FTH_SIZ-GAM_SIZ) .FILL SLACK,00H ; MON_STACK .EQU $ diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 59256504..3ac79c51 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -368,6 +368,7 @@ MENU_1: MENU_L("~CP/M$ ", "C", KY_BK, CPM_ENT, 2000h, CPM_LOC, CPM_SIZ MENU_L("~Forth$ ", "F", KY_EX, FTH_LOC, 0000h, FTH_LOC, FTH_SIZ, BID_IMG1, BID_USR, "Camel Forth$ ") MENU_L("~BASIC$ ", "B", KY_DE, BAS_LOC, 1700h, BAS_LOC, BAS_SIZ, BID_IMG1, BID_USR, "Nascom BASIC$") MENU_L("~T-BASIC$ ", "T", KY_EN, TBC_LOC, 3700h, TBC_LOC, TBC_SIZ, BID_IMG1, BID_USR, "Tasty BASIC$ ") + MENU_L("~PLAY$ ", "P", $FF, GAM_LOC, 4000h, GAM_LOC, GAM_SIZ, BID_IMG1, BID_USR, "Game$ ") #ENDIF #IF (DSKYENABLE) MENU_L("~DSKY$ ", "D", KY_GO, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "DSKY Monitor$") diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index a40da2d4..7172ef96 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -422,6 +422,10 @@ FTH_LOC .EQU $0200 ; CAMEL FORTH FTH_SIZ .EQU $1700 FTH_END .EQU FTH_LOC + FTH_SIZ +GAM_LOC .EQU $0200 ; GAME 2048 +GAM_SIZ .EQU $0900 +GAM_END .EQU GAM_LOC + GAM_SIZ + MON_DSKY .EQU MON_LOC + (0 * 3) ; MONITOR ENTRY (DSKY) MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT) ; From b89e45741478ac33d80cca0f063258e3d59c7d5d Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 7 Feb 2020 14:33:21 +0800 Subject: [PATCH 17/36] Update game.asm keypad and arrow keys --- Source/HBIOS/game.asm | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Source/HBIOS/game.asm b/Source/HBIOS/game.asm index cdc5fca6..8bbce38b 100644 --- a/Source/HBIOS/game.asm +++ b/Source/HBIOS/game.asm @@ -115,6 +115,9 @@ LOOP: K3 CP CTRL_C JP Z,EXIT + CP 1BH + JP Z,K1 + CP CTRL_E JP Z,TOP CP CTRL_X @@ -133,12 +136,18 @@ K3 CP CTRL_C CP 'A' JP Z,LEFT + CP '8' + JP Z,TOP + CP '2' + JP Z,BOTTOM + CP '6' + JP Z,RIGHT + CP '4' + JP Z,LEFT + CP 'Q' JP Z,QUIT - - CP 1BH - JP Z,K1 - + ; LD C,02H ; LD E,BEL ; CALL BDOS @@ -147,15 +156,15 @@ K3 CP CTRL_C JP LOOP K1: -; LD C,06H +; LD C,06H ; LD E,0FFH ; CALL BDOS ; CP 0 ; JP Z,K1 CALL CIN - CP 'O' - JP NZ,K2 + CP '[' + JP NZ,LOOP K4: ; LD C,06H @@ -1120,7 +1129,7 @@ BTMBORDER .DB 0DFH .DB 0DFH, 1BH, "[0m", EOS MSG1: .DB 1BH, "[0m" - .DB "w=up s=down a=right d=right q=quit" + .DB "UDLR = wsad ^E^X^S^D 8246 : Q=QUIT" .DB EOS MSG2: .DB 1BH, "[0m" From 15d607d686d183c85b87c8be10a183784cd6b8c2 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 7 Feb 2020 11:47:16 -0800 Subject: [PATCH 18/36] Further PPIDE updates --- Doc/ChangeLog.txt | 2 + ReadMe.txt | 2 +- Source/BL/ver.inc | 2 +- Source/CBIOS/ver.inc | 2 +- Source/CPM3/ver.inc | 2 +- Source/HBIOS/Config/MK4_std.asm | 1 - Source/HBIOS/Config/SBC_std.asm | 1 - Source/HBIOS/cfg_dyno.asm | 9 +- Source/HBIOS/cfg_ezz80.asm | 6 +- Source/HBIOS/cfg_master.asm | 13 +- Source/HBIOS/cfg_mk4.asm | 13 +- Source/HBIOS/cfg_n8.asm | 13 +- Source/HBIOS/cfg_rcz180.asm | 14 +- Source/HBIOS/cfg_rcz80.asm | 13 +- Source/HBIOS/cfg_sbc.asm | 13 +- Source/HBIOS/cfg_scz180.asm | 13 +- Source/HBIOS/cfg_zeta.asm | 6 +- Source/HBIOS/cfg_zeta2.asm | 6 +- Source/HBIOS/ppide.asm | 747 ++++++++++++++++---------------- Source/HBIOS/std.asm | 1 - Source/HBIOS/ver.inc | 2 +- 21 files changed, 463 insertions(+), 418 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 873e0e36..26919279 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -40,6 +40,8 @@ Version 2.9.2 - PMS: Added font compression option - PMS: Added a "safe mode" startup w/ minimal device support - WBW: Switch RC/SC Z180 platforms to 115,200 default baud rate +- PMS: Enhanced PPIDE driver to handle multiple PPI interfaces +- PMS: Added a ROM based game Version 2.9.1 ------------- diff --git a/ReadMe.txt b/ReadMe.txt index 49a04500..f9f522d0 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -7,7 +7,7 @@ *********************************************************************** Wayne Warthen (wwarthen@gmail.com) -Version 2.9.2-pre.27, 2020-01-26 +Version 2.9.2-pre.28, 2020-02-07 https://www.retrobrewcomputers.org/ RomWBW is a ROM-based implementation of CP/M-80 2.2 and Z-System for diff --git a/Source/BL/ver.inc b/Source/BL/ver.inc index 530202ad..ed995cd7 100644 --- a/Source/BL/ver.inc +++ b/Source/BL/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 9 #DEFINE RUP 2 #DEFINE RTP 0 -#DEFINE BIOSVER "2.9.2-pre.27" +#DEFINE BIOSVER "2.9.2-pre.28" diff --git a/Source/CBIOS/ver.inc b/Source/CBIOS/ver.inc index 530202ad..ed995cd7 100644 --- a/Source/CBIOS/ver.inc +++ b/Source/CBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 9 #DEFINE RUP 2 #DEFINE RTP 0 -#DEFINE BIOSVER "2.9.2-pre.27" +#DEFINE BIOSVER "2.9.2-pre.28" diff --git a/Source/CPM3/ver.inc b/Source/CPM3/ver.inc index 868c7005..0b96de4f 100644 --- a/Source/CPM3/ver.inc +++ b/Source/CPM3/ver.inc @@ -3,5 +3,5 @@ rmn equ 9 rup equ 2 rtp equ 0 biosver macro - db "2.9.2-pre.27" + db "2.9.2-pre.28" endm diff --git a/Source/HBIOS/Config/MK4_std.asm b/Source/HBIOS/Config/MK4_std.asm index f0e45a2d..b144c790 100644 --- a/Source/HBIOS/Config/MK4_std.asm +++ b/Source/HBIOS/Config/MK4_std.asm @@ -41,7 +41,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) IDEMODE .SET IDEMODE_MK4 ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .SET PPIDEMODE_MFP ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC] ; SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .SET SDMODE_MK4 ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC] diff --git a/Source/HBIOS/Config/SBC_std.asm b/Source/HBIOS/Config/SBC_std.asm index 8097a3d6..31e094cf 100644 --- a/Source/HBIOS/Config/SBC_std.asm +++ b/Source/HBIOS/Config/SBC_std.asm @@ -37,7 +37,6 @@ IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) IDEMODE .SET IDEMODE_DIO ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .SET PPIDEMODE_SBC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC] ; SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .SET SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC] diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 83d7e0c5..e6808004 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -109,11 +109,12 @@ IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) ; -PPIDEENABLE .EQU TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_DYNO ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] +PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) -PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $4C ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index 35fedb50..d38b3587 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -125,9 +125,11 @@ IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $20 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 8a004eb8..a63aa593 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -169,10 +169,17 @@ IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) IDE8BIT .EQU FALSE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_NONE ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) -PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $60 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $20 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $44 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_NONE ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index dd2e31a5..448d6361 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -124,10 +124,17 @@ IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_DIO3 ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) -PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES +PPIDECNT .EQU 2 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $44 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $20 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_MK4 ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index ac917b95..0a1b2aa6 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -127,10 +127,17 @@ IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) IDE8BIT .EQU FALSE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_N8 ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) -PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $80 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_CSIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index e3a1d7bb..9e1ba907 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -130,11 +130,17 @@ IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) -PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES -; +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $20 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index e8f91bc4..1a79f75a 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -134,10 +134,17 @@ IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) -PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $20 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index b7027b23..67c1b36a 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -127,10 +127,17 @@ IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) IDE8BIT .EQU FALSE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_SBC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) -PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $60 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $20 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $44 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 0b90bc61..79f88b5e 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -125,10 +125,17 @@ IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) -PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $20 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 4997be12..d34cfdbb 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -101,9 +101,11 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_SBC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $60 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 65c3e8d5..44c6bdcd 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -106,9 +106,11 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) -PPIDEMODE .EQU PPIDEMODE_SBC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $60 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 92eb3a66..98dfd096 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -4,30 +4,16 @@ ;============================================================================= ; ; TODO: -; - IMPLEMENT PPIDE_INITDEVICE ; - IMPLEMENT INTELLIGENT RESET, CHECK IF DEVICE IS ACTUALLY BROKEN BEFORE RESET ; - FIX SCALER CONSTANT ; -; -#IF (PPIDEMODE == PPIDEMODE_SBC) -PPIDE_IO_BASE .EQU $60 -#ENDIF -; -#IF ((PPIDEMODE == PPIDEMODE_DIO3) | (PPIDEMODE == PPIDEMODE_RC)) -PPIDE_IO_BASE .EQU $20 -#ENDIF -; -#IF (PPIDEMODE == PPIDEMODE_MFP) -PPIDE_IO_BASE .EQU $44 -#ENDIF -; -#IF (PPIDEMODE == PPIDEMODE_N8) -PPIDE_IO_BASE .EQU $80 -#ENDIF -; -#IF (PPIDEMODE == PPIDEMODE_DYNO) -PPIDE_IO_BASE .EQU $4C -#ENDIF +; NOTES: +; - WELL KNOWN PPIDE PORT ADDRESSES: +; $60 - SBC/ZETA ONBOARD PPI +; $20 - ECB DISKIO3, RC FAMILY +; $44 - ECB MULTI-FUNCTION PIC +; $80 - N8 ONBOARD PPI +; $4C - DYNO ONBOARD PPI ; ; THE CONTROL PORT OF THE 8255 IS PROGRAMMED AS NEEDED TO READ OR WRITE ; DATA ON THE IDE BUS. PORT C OF THE 8255 IS ALWAYS IN OUTPUT MODE BECAUSE @@ -162,18 +148,7 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) #DEFINE DCALL \; #ENDIF ; -; UNIT MAPPING IS AS FOLLOWS: -; PPIDE0: PRIMARY MASTER -; PPIDE1: PRIMARY SLAVE -; PPIDE2: SECONDARY MASTER -; PPIDE3: SECONDARY SLAVE -; -PPIDE0IO .EQU PPIDE_IO_BASE -PPIDE1IO .EQU 20H -PPIDE2IO .EQU 44H -PPIDE3IO .EQU 00H -; -PPIDE_DEVCNT .EQU PPICNT*2 +PPIDE_DEVCNT .EQU PPIDECNT * 2 ; ASSUME ONLY PRIMARY INTERFACE ; ; COMMAND BYTES ; @@ -194,7 +169,7 @@ PPIDE_TYPEUNK .EQU 0 PPIDE_TYPEATA .EQU 1 PPIDE_TYPEATAPI .EQU 2 ; -; PPIDE DEVICE STATUS +; PPIDE DEVICE STATUS CODES ; PPIDE_STOK .EQU 0 PPIDE_STINVUNIT .EQU -1 @@ -207,75 +182,131 @@ PPIDE_STBSYTO .EQU -7 ; ; DRIVE SELECTION BYTES (FOR USE IN DRIVE/HEAD REGISTER) ; -PPIDE_DRVSEL: -PPIDE_DRVMASTER .DB %11100000 ; LBA, MASTER DEVICE -PPIDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE +;PPIDE_DRVSEL: +PPIDE_DRVMASTER .EQU %11100000 ; LBA, MASTER DEVICE +PPIDE_DRVSLAVE .EQU %11110000 ; LBA, SLAVE DEVICE ; ; PPIDE DEVICE CONFIGURATION ; -PPIDE_CFGSIZ .EQU 15 ; SIZE OF CFG TBL ENTRIES +PPIDE_CFGSIZ .EQU 18 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS ; PPIDE_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) PPIDE_STAT .EQU 1 ; LAST STATUS (BYTE) PPIDE_TYPE .EQU 2 ; DEVICE TYPE (BYTE) -PPIDE_FLAGS .EQU 3 ; FLAG BITS BIT 0=CF, 1=LBA (BYTE) -PPIDE_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) -PPIDE_LBA .EQU 8 ; OFFSET OF LBA (DWORD) -PPIDE_DATALO .EQU 12 ; BASE PORT AND IDE DATA BUS LSB (8255 PORT A) (BYTE) -PPIDE_CTL .EQU 13 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) -PPIDE_PPI .EQU 14 ; 8255 CONTROL PORT(BYTE) +PPIDE_ACC .EQU 3 ; ACCESS FLAG BITS BIT 0=MASTER, 1=8BIT (BYTE) +PPIDE_MED .EQU 4 ; MEDIA FLAG BITS BIT 0=CF, 1=LBA (BYTE) +PPIDE_MEDCAP .EQU 5 ; MEDIA CAPACITY (DWORD) +PPIDE_LBA .EQU 9 ; OFFSET OF LBA (DWORD) +PPIDE_DATALO .EQU 13 ; BASE PORT AND IDE DATA BUS LSB (8255 PORT A) (BYTE) +PPIDE_CTL .EQU 14 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) +PPIDE_PPI .EQU 15 ; 8255 CONTROL PORT(BYTE) +PPIDE_PARTNER .EQU 16 ; PARTNER DEVICE (MASTER <-> SLAVE) +; +PPIDE_ACC_MAS .EQU %00000001 ; UNIT IS MASTER (ELSE SLAVE) +PPIDE_ACC_8BIT .EQU %00000010 ; UNIT WANTS 8 BIT I/O (ELSE 16 BIT) +; +PPIDE_MED_CF .EQU %00000001 ; MEDIA IS CF CARD +PPIDE_MED_LBA .EQU %00000010 ; MEDIA HAS LBA CAPABILITY ; PPIDE_CFGTBL: - ; DEVICE 0, PRIMARY MASTER - .DB 0 ; DRIVER DEVICE NUMBER +; +#IF (PPIDECNT >= 1) +; +PPIDE_DEV0M: ; DEVICE 0, MASTER + .DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT) .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB PPIDE_ACC_MAS | (PPIDE0A8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA - .DB PPIDE0IO ; DATALO - .DB PPIDE0IO+2 ; CTL - .DB PPIDE0IO+3 ; PPI - ; DEVICE 1, PRIMARY SLAVE - .DB 1 ; DRIVER DEVICE NUMBER + .DB PPIDE0BASE ; DATALO + .DB PPIDE0BASE+2 ; CTL + .DB PPIDE0BASE+3 ; PPI + .DW PPIDE_DEV0S ; PARTNER +; +PPIDE_DEV0S: ; DEVICE 0, SLAVE + .DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT) .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB (PPIDE0B8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA - .DB PPIDE0IO ; DATALO - .DB PPIDE0IO+2 ; CTL - .DB PPIDE0IO+3 ; PPI -#IF (PPICNT> 1) - ; DEVICE 2, PRIMARY MASTER - .DB 2 ; DRIVER DEVICE NUMBER + .DB PPIDE0BASE ; DATALO + .DB PPIDE0BASE+2 ; CTL + .DB PPIDE0BASE+3 ; PPI + .DW PPIDE_DEV0M ; PARTNER +; +#ENDIF +; +#IF (PPIDECNT >= 2) +; +PPIDE_DEV1M: ; DEVICE 1, MASTER + .DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT) .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB PPIDE_ACC_MAS | (PPIDE1A8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA - .DB PPIDE1IO ; DATALO - .DB PPIDE1IO+2 ; CTL - .DB PPIDE1IO+3 ; PPI - ; DEVICE 3, PRIMARY SLAVE - .DB 3 ; DRIVER DEVICE NUMBER + .DB PPIDE1BASE ; DATALO + .DB PPIDE1BASE+2 ; CTL + .DB PPIDE1BASE+3 ; PPI + .DW PPIDE_DEV1S ; PARTNER +; +PPIDE_DEV1S: ; DEVICE 1, SLAVE + .DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT) .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB (PPIDE1B8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA - .DB PPIDE1IO ; DATALO - .DB PPIDE1IO+2 ; CTL - .DB PPIDE1IO+3 ; PPI + .DB PPIDE1BASE ; DATALO + .DB PPIDE1BASE+2 ; CTL + .DB PPIDE1BASE+3 ; PPI + .DW PPIDE_DEV1M ; PARTNER +; +#ENDIF +; +#IF (PPIDECNT >= 3) +; +PPIDE_DEV2M: ; DEVICE 2, MASTER + .DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT) + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB PPIDE_ACC_MAS | (PPIDE2A8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB PPIDE2BASE ; DATALO + .DB PPIDE2BASE+2 ; CTL + .DB PPIDE2BASE+3 ; PPI + .DW PPIDE_DEV2S ; PARTNER +; +PPIDE_DEV2S: ; DEVICE 2, SLAVE + .DB 0 ; DRIVER RELATIVE DEVICE NUMBER (ASSIGNED DURING INIT) + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB (PPIDE2B8BIT & PPIDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB PPIDE2BASE ; DATALO + .DB PPIDE2BASE+2 ; CTL + .DB PPIDE2BASE+3 ; PPI + .DW PPIDE_DEV2M ; PARTNER +; #ENDIF ; #IF ($ - PPIDE_CFGTBL) != (PPIDE_DEVCNT * PPIDE_CFGSIZ) .ECHO "*** INVALID PPIDE CONFIG TABLE ***\n" #ENDIF ; - .DB $FF ; END MARKER + .DB $FF ; END OF TABLE MARKER ; ; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL ; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING @@ -294,9 +325,6 @@ PPIDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS ;============================================================================= ; PPIDE_INIT: - CALL NEWLINE ; FORMATTING - PRTS("PPIDE:$") ; LABEL FOR IO ADDRESS -; ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER ; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218) ; SCALER IS THEREFORE 218 * CPU SPEED IN MHZ @@ -305,55 +333,61 @@ PPIDE_INIT: CALL MULT8X16 ; HL := DE * A LD (PPIDE_TOSCALER),HL ; SAVE IT ; -#IF (PPIDE8BIT) - PRTS(" 8BIT$") -#ENDIF - LD IY,PPIDE_CFGTBL - CALL PPIDE_DETECT ; CHECK FOR HARDWARE - JR Z,PPIDE_INIT00 ; CONTINUE IF PRESENT + XOR A ; ZERO ACCUM + LD (PPIDE_DEVNUM),A ; INIT DEV UNIT NUM FOR DYNAMIC ASSIGNMENT + LD IY,PPIDE_CFGTBL ; POINT TO START OF CONFIG TABLE ; - ; HARDWARE NOT PRESENT - PRTS(" NOT PRESENT$") - OR $FF ; SIGNAL FAILURE - RET +PPIDE_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,PPIDE_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +PPIDE_INIT2: + BIT 0,(IY+PPIDE_ACC) ; MASTER? + JR Z,PPIDE_INIT4 ; IF NOT MASTER, SKIP AHEAD ; -PPIDE_INIT00: - PRTS(" DEVICES=$") - LD A,PPIDE_DEVCNT - CALL PRTDECB + CALL NEWLINE ; FORMATTING + PRTS("PPIDE:$") ; LABEL FOR IO ADDRESS ; -; SETUP THE DISPATCH TABLE ENTRIES + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+PPIDE_DATALO) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT ; - LD B,PPIDE_DEVCNT ; LOOP CONTROL - LD IY,PPIDE_CFGTBL ; START OF CFG TABLE -PPIDE_INIT0: - PUSH BC ; SAVE LOOP CONTROL + CALL PPIDE_DETECT ; PROBE FOR INTERFACE + JR Z,PPIDE_INIT3 ; GOT IT, MOVE ON TO INIT UNITS + CALL PC_SPACE ; FORMATTING + LD DE,PPIDE_STR_NOPPI ; NO PPI MESSAGE + CALL WRITESTR ; DISPLAY IT + JR PPIDE_INIT4 ; SKIP CFG ENTRY +; +PPIDE_INIT3: + CALL PPIDE_RESET ; RESET THE BUS + CALL PPIDE_INIT5 ; DETECT/INIT MASTER + PUSH IY ; SAVE CFG PTR + CALL PPIDE_GOPARTNER ; SWITCH IY TO PARTNER CFG + CALL PPIDE_INIT5 ; DETECT/INIT SLAVE + POP IY ; RESTORE CFG PTR +; +PPIDE_INIT4: + LD DE,PPIDE_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JR PPIDE_INIT1 ; AND LOOP +; +PPIDE_INIT5: + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(PPIDE_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+PPIDE_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (PPIDE_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE LD BC,PPIDE_FNTBL ; BC := FUNC TABLE ADR PUSH IY ; CFG ENTRY POINTER POP DE ; COPY TO DE CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE - LD BC,PPIDE_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - POP BC ; RESTORE BC - DJNZ PPIDE_INIT0 ; LOOP AS NEEDED -; - ; INITIALIZE THE PPIDE INTERFACE NOW - CALL PPIDE_RESET ; DO HARDWARE SETUP/INIT - RET NZ ; ABORT IF RESET FAILS -; - ; DEVICE DISPLAY LOOP - LD B,PPIDE_DEVCNT ; LOOP ONCE PER DEVICE - LD IY,PPIDE_CFGTBL ; START OF CFG TABLE -PPIDE_INIT1: - PUSH BC ; SAVE LOOP CONTROL - CALL PPIDE_INIT2 ; DISPLAY UNIT INFO - LD BC,PPIDE_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - POP BC ; RESTORE LOOP CONTROL - DJNZ PPIDE_INIT1 ; LOOP UNTIL DONE - RET ; DONE ; -PPIDE_INIT2: ; CHECK FOR BAD STATUS LD A,(IY+PPIDE_STAT) ; GET STATUS OR A ; SET FLAGS @@ -361,18 +395,13 @@ PPIDE_INIT2: ; CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX ; -; - PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS - LD A,(IY+PPIDE_DATALO) - CALL PRTHEXBYTE -; -#IF (PPIDE8BIT) - PRTS(" 8BIT$") -#ENDIF + LD DE,PPIDE_STR_8BIT + BIT 1,(IY+PPIDE_ACC) ; 8 BIT ACCESS? + CALL NZ,WRITESTR ; ; PRINT LBA/NOLBA CALL PC_SPACE ; FORMATTING - BIT 1,(IY+PPIDE_FLAGS) ; TEST LBA FLAG + BIT 1,(IY+PPIDE_MED) ; TEST LBA FLAG LD DE,PPIDE_STR_NO ; POINT TO "NO" STRING CALL Z,WRITESTR ; PRINT "NO" BEFORE "LBA" IF LBA NOT SUPPORTED PRTS("LBA$") ; PRINT "LBA" REGARDLESS @@ -391,11 +420,10 @@ PPIDE_INIT2: CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED) PRTS("MB$") ; PRINT SUFFIX ; - XOR A ; SIGNAL SUCCESS - RET ; RETURN WITH A=0, AND Z SET + RET ; ;---------------------------------------------------------------------- -; PROBE FOR PPIDE HARDWARE +; PROBE FOR PPI HARDWARE ;---------------------------------------------------------------------- ; ; ON RETURN, ZF SET INDICATES HARDWARE FOUND @@ -408,20 +436,14 @@ PPIDE_DETECT: ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO ; INTERFERE WITH THE VALUE BEING READ. - LD C,(IY+PPIDE_PPI) - LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - OUT (C),A ; OUTPUT TO CONTROL WORD ; - LD C,(IY+PPIDE_DATALO) ; PPI PORT A + LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE + LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD + OUT (C),A ; WRITE IT ; -#IF USEZ80OPT -;; OUT (C),0 - .DB $ED,$71 -#ELSE + LD C,(IY+PPIDE_DATALO) ; PPI PORT A, DATALO XOR A ; VALUE ZERO OUT (C),A ; PUSH VALUE TO PORT -#ENDIF -; IN A,(C) ; GET PORT VALUE DCALL PC_SPACE DCALL PRTHEXBYTE @@ -485,7 +507,7 @@ PPIDE_IO: #ENDIF PUSH BC ; SAVE COUNTERS CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT - CALL PPIDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS + CALL PPIDE_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO POP BC ; RESTORE COUNTERS JR NZ,PPIDE_IO3 ; BAIL OUT ON ERROR PPIDE_IO1: @@ -526,7 +548,7 @@ PPIDE_STATUS: PPIDE_DEVICE: LD D,DIODEV_PPIDE ; D := DEVICE TYPE LD E,(IY+PPIDE_DEV) ; E := PHYSICAL DEVICE NUMBER - BIT 0,(IY+PPIDE_FLAGS) ; TEST CF BIT IN FLAGS + BIT 0,(IY+PPIDE_MED) ; TEST CF BIT IN FLAGS LD C,%00000000 ; ASSUME NON-REMOVABLE HARD DISK JR Z,PPIDE_DEVICE1 ; IF Z, WE ARE DONE LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH @@ -759,7 +781,7 @@ PPIDE_RUNCMD: JP NZ,PPIDE_CMDERR RET ; -; READ IDE DATA INTO BUFFER POINTED TO BY HL +; ; PPIDE_GETBUF: #IF (PPIDETRACE >= 3) @@ -771,71 +793,65 @@ PPIDE_GETBUF: RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO READ - LD C,(IY+PPIDE_PPI) ; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - OUT (C),A ; DO IT + ;OUT (PPIDE_IO_PPI),A ; DO IT + LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD + OUT (C),A ; WRITE IT ; ; SELECT READ/WRITE IDE REGISTER - DEC C ; LD C,(IY+PPIDE_CTL) LD A,PPIDE_REG_DATA ; DATA REGISTER + ;OUT (PPIDE_IO_CTL),A ; DO IT + LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS OUT (C),A ; DO IT - LD E,A ; E := READ UNASSERTED XOR PPIDE_CTL_DIOR ; SWAP THE READ LINE BIT LD D,A ; D := READ ASSERTED ; - LD B,0 ; LOOP SETUP - 256 ITERATIONS - - ; SETUP C WITH IO PORT - DEC C ; C = IY+PPIDE_DATAHI -#IF (PPIDE8BIT) ; - DEC C ; C = IY+PPIDE_DATALO -#ENDIF -; - CALL PPIDE_GETBUF1 ; FIRST PASS (FIRST 256 BYTES) - CALL PPIDE_GETBUF1 ; SECOND PASS (LAST 256 BYTES) -; - ;; CLEAN UP - ;XOR A ; ZERO A - ;OUT (PPIDE_IO_CTL),A ; RELEASE ALL BUS SIGNALS -; + ; LOOP SETUP + XOR A ; IMPORTANT, NEEDED FOR LOOP END COMPARISON + LD B,0 ; 256 ITERATIONS + LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS +; + BIT 1,(IY+PPIDE_ACC) ; 8 BIT? + JR Z,PPIDE_GETBUF1 ; IF NOT, DO 16 BIT + CALL PPIDE_GETBUF8 ; FIRST PASS (FIRST 256 BYTES) + CALL PPIDE_GETBUF8 ; SECOND PASS (LAST 256 BYTES) + JR PPIDE_GETBUF2 ; CONTINUE +PPIDE_GETBUF1: + CALL PPIDE_GETBUF16 ; FIRST PASS (FIRST 256 BYTES) + CALL PPIDE_GETBUF16 ; SECOND PASS (LAST 256 BYTES) +PPIDE_GETBUF2: CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! RET NZ CALL PPIDE_GETRES JP NZ,PPIDE_IOERR RET ; -PPIDE_GETBUF1: ; START OF READ LOOP -; -#IF (PPIDE8BIT) - INC C - INC C ; LD C,(IY+PPIDE_CTL) +PPIDE_GETBUF8: ; 8 BIT WIDE READ LOOP + ; ENTER W/ C = PPIDE_IO_CTL OUT (C),D ; ASSERT READ - DEC C - DEC C - INI ; GET AND SAVE NEXT BYTE - PUSH AF - INC C - INC C ; LD C,(IY+PPIDE_CTL) + DEC C ; CTL -> MSB + DEC C ; MSB -> LSB + INI ; READ FROM LSB + INC C ; LSB -> MSB + INC C ; MSB -> CTL OUT (C),E ; DEASSERT READ - DEC C - DEC C - POP AF -#ELSE - INC C ; LD C,(IY+PPIDE_CTL) + CP B ; B == A == 0? + JR NZ,PPIDE_GETBUF8 ; LOOP UNTIL DONE + RET +; +PPIDE_GETBUF16: ; 16 BIT WIDE READ LOOP + ; ENTER W/ C = PPIDE_IO_CTL OUT (C),D ; ASSERT READ - DEC C - DEC C - INI ; GET AND SAVE NEXT BYTE + DEC C ; CTL -> MSB + DEC C ; MSB -> LSB + INI ; READ FROM LSB INC C ; LSB -> MSB - INI ; GET AND SAVE NEXT BYTE - PUSH AF - INC C ; LD C,(IY+PPIDE_CTL) + INI ; READ MSB FOR 16 BIT + INC C ; MSB -> CTL OUT (C),E ; DEASSERT READ - DEC C - POP AF -#ENDIF - JR NZ,PPIDE_GETBUF1 ; LOOP UNTIL DONE + CP B ; B == A == 0? + JR NZ,PPIDE_GETBUF16 ; LOOP UNTIL DONE RET ; ; @@ -844,71 +860,69 @@ PPIDE_PUTBUF: #IF (PPIDETRACE >= 3) PRTS(" PUTBUF$") #ENDIF - +; ; WAIT FOR BUFFER CALL PPIDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO WRITE - - LD C,(IY+PPIDE_PPI) LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - OUT (C),A ; DO IT + ;OUT (PPIDE_IO_PPI),A ; DO IT + LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD + OUT (C),A ; WRITE IT ; ; SELECT READ/WRITE IDE REGISTER - DEC C ; LD C,(IY+PPIDE_CTL) LD A,PPIDE_REG_DATA ; DATA REGISTER - OUT (C),A ; - + ;OUT (PPIDE_IO_CTL),A ; DO IT + LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS + OUT (C),A ; DO IT LD E,A ; E := WRITE UNASSERTED XOR PPIDE_CTL_DIOW ; SWAP THE READ LINE BIT LD D,A ; D := WRITE ASSERTED ; - ; LOOP SETUP ; 256 ITERATIONS - LD B,0 ; SETUP C WITH IO PORT (LSB) - - DEC C ; LD C,(IY+PPIDE_DATAHI) -#IF (PPIDE8BIT) - DEC C ; LD C,(IY+PPIDE_DATALO) -#ENDIF -; - CALL PPIDE_PUTBUF1 ; FIRST PASS (FIRST 256 BYTES) - CALL PPIDE_PUTBUF1 ; SECOND PASS (LAST 256 BYTES) -; - ;; CLEAN UP - ;XOR A ; ZERO A - ;OUT (PPIDE_IO_CTL),A ; RELEASE ALL BUS SIGNALS -; + ; LOOP SETUP + XOR A ; IMPORTANT, NEEDED FOR LOOP END COMPARISON + LD B,0 ; 256 ITERATIONS + LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS +; + BIT 1,(IY+PPIDE_ACC) ; 8 BIT? + JR Z,PPIDE_PUTBUF1 ; IF NOT, DO 16 BIT + CALL PPIDE_PUTBUF8 ; FIRST PASS (FIRST 256 BYTES) + CALL PPIDE_PUTBUF8 ; SECOND PASS (LAST 256 BYTES) + JR PPIDE_PUTBUF2 ; CONTINUE +PPIDE_PUTBUF1: + CALL PPIDE_PUTBUF16 ; FIRST PASS (FIRST 256 BYTES) + CALL PPIDE_PUTBUF16 ; SECOND PASS (LAST 256 BYTES) +PPIDE_PUTBUF2: CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! RET NZ CALL PPIDE_GETRES JP NZ,PPIDE_IOERR RET ; -PPIDE_PUTBUF1: ; START OF READ LOOP -#IF (PPIDE8BIT) - OUTI ; PUT NEXT BYTE ON THE BUS - PUSH AF - INC C ; LD C,(IY+PPIDE_CTL) - INC C +PPIDE_PUTBUF8: ; 8 BIT WIDE WRITE LOOP + DEC C ; CTL -> MSB + DEC C ; MSB -> LSB + OUTI ; WRITE NEXT BYTE (LSB) + INC C ; LSB -> MSB + INC C ; MSB -> CTL OUT (C),D ; ASSERT WRITE OUT (C),E ; DEASSERT WRITE - DEC C - DEC C - POP AF -#ELSE - DEC C - OUTI ; PUT NEXT BYTE ON THE BUS (LSB) - INC C - OUTI ; PUT NEXT BYTE ON THE BUS (MSB) - PUSH AF - INC C ; LD C,(IY+PPIDE_CTL) + CP B ; B == A == 0? + JR NZ,PPIDE_PUTBUF8 ; LOOP UNTIL DONE + RET +; +PPIDE_PUTBUF16: ; 16 BIT WIDE WRITE LOOP + DEC C ; CTL -> MSB + DEC C ; MSB -> LSB + OUTI ; WRITE NEXT BYTE (LSB) + INC C ; LSB -> MSB + OUTI ; WRITE NEXT BYTE (MSB) + INC C ; MSB -> CTL OUT (C),D ; ASSERT WRITE OUT (C),E ; DEASSERT WRITE - DEC C - POP AF -#ENDIF - JR NZ,PPIDE_PUTBUF1 ; LOOP UNTIL DONE + CP B ; B == A == 0? + JR NZ,PPIDE_PUTBUF16 ; LOOP UNTIL DONE RET ; ; @@ -937,30 +951,27 @@ PPIDE_GETRES: ; SOFT RESET OF ALL DEVICES ON BUS ; PPIDE_RESET: +#IF (PPIDETRACE >= 3) + CALL PPIDE_PRTPREFIX + PRTS(" RESET$") +#ENDIF ; - PUSH BC - ; SETUP PPI TO READ - LD C,(IY+PPIDE_PPI) ;; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - OUT (C),A ; DO IT - + ;OUT (PPIDE_IO_PPI),A ; DO IT + LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD + OUT (C),A ; WRITE IT +; ; PULSE IDE RESET LINE - LD C,(IY+PPIDE_CTL) LD A,PPIDE_CTL_RESET - OUT (C),A -; + ;OUT (PPIDE_IO_CTL),A + LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS + OUT (C),A LD DE,20 CALL VDELAY -; -#IF USEZ80OPT -;; OUT (C),0 - .DB $ED,$71 -#ELSE - XOR A ; VALUE ZERO - OUT (C),A ; PUSH VALUE TO PORT -#ENDIF -; + XOR A + ;OUT (PPIDE_IO_CTL),A + OUT (C),A LD DE,20 CALL VDELAY ; @@ -979,30 +990,14 @@ PPIDE_RESET: LD DE,150000/16 ; ~???MS CALL VDELAY ; - ;; CLEAR OUT ALL DATA (FOR ALL UNITS) - ;LD HL,PPIDE_UDATA - ;LD BC,PPIDE_UDLEN - ;XOR A - ;CALL FILL -; - PUSH IY ; SAVE CURRENT DEVICE CFG PTR -; - ; PROBE / INITIALIZE ALL UNITS - LD B,PPIDE_DEVCNT ; NUMBER OF UNITS TO TRY - LD IY,PPIDE_CFGTBL ; START OF CFG TABLE -PPIDE_RESET1: - PUSH BC ; SAVE LOOP CONTROL - CALL PPIDE_INITUNIT ; PROBE/INIT UNIT - LD BC,PPIDE_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - POP BC ; RESTORE BC - DJNZ PPIDE_RESET1 ; LOOP AS NEEDED -; - POP IY ; RECOVER DEVICE CFG PTR - POP BC + CALL PPIDE_INITUNIT ; INIT CURRENT UNIT + PUSH IY ; SAVE CFG PTR + CALL PPIDE_GOPARTNER ; POINT TO PARTNER + CALL PPIDE_INITUNIT ; INIT PARTNER UNIT + POP IY ; RECOVER ORIG CFG PTR ; - XOR A ; SIGNAL SUCCESS - RET ; AND DONE + RET + ; ; ; @@ -1014,8 +1009,11 @@ PPIDE_INITUNIT: LD (HL),PPIDE_TONORM ; SET NORMAL TIMEOUT CALL PPIDE_PROBE ; DO PROBE - CALL Z,PPIDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE + RET NZ ; JUST RETURN IF NOTHING THERE + CALL PPIDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE + RET NZ ; IF FAILED, ALL DONE + RET ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT @@ -1025,18 +1023,15 @@ PPIDE_SELUNIT: CALL PPIDE_PRTPREFIX PRTS(" SELUNIT$") #ENDIF - PUSH HL ; SAVE HL, IT IS DESTROYED BELOW - PUSH IY - POP BC - LD A,(IY+PPIDE_DEV) ; GET DEVICE - AND $01 ; LS BIT DETERMINES MASTER/SLAVE - LD HL,PPIDE_DRVSEL - CALL ADDHLA - LD A,(HL) ; LOAD DRIVE/HEAD VALUE - POP HL ; RECOVER HL - LD (PPIDE_DRVHD),A ; SAVE IT -; - XOR A + BIT 0,(IY+PPIDE_ACC) ; MASTER? + JR Z,PPIDE_SELUNIT1 ; HANDLE SLAVE + LD A,PPIDE_DRVMASTER ; MASTER + JR PPIDE_SELUNIT2 +PPIDE_SELUNIT1: + LD A,PPIDE_DRVSLAVE ; SLAVE +PPIDE_SELUNIT2: + LD (PPIDE_DRVHD),A ; SAVE IT + XOR A ; SUCCESS RET ; ; @@ -1064,16 +1059,11 @@ PPIDE_PROBE: ; RETURN SOMETHING OTHER THAN ZERO. IF AN IDE CONTROLLER IS ; THERE, THEN THE VALUE WRITTEN TO PPI PORT A IS IGNORED ; BECAUSE THE WRITE SIGNAL IS NEVER PULSED. -; - LD C,(IY+PPIDE_DATALO) -#IF USEZ80OPT -;; OUT (C),0 - .DB $ED,$71 -#ELSE - XOR A ; VALUE ZERO - OUT (C),A ; PUSH VALUE TO PORT -#ENDIF -; + XOR A + ;OUT (PPIDE_IO_DATALO),A + LD C,(IY+PPIDE_DATALO) ; PPI PORT A, DATALO + OUT (C),A +; IN A,(PPIDE_REG_STAT) ; GET STATUS CALL PPIDE_IN .DB PPIDE_REG_STAT DCALL PC_SPACE @@ -1145,42 +1135,21 @@ PPIDE_INITDEV: OR A ; SET FLAGS JP Z,PPIDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS ; - ; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING - ; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE - ; PROBES WHEN THE PPIDE BUS WAS RESET - ;PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE - ;LD A,(IY+PPIDE_DEV) ; GET CURRENT DEVICE NUMBER - ;PUSH AF ; ... AND SAVE IT - ;;PUSH HL ; SAVE UNIT TYPE FIELD POINTER - ;;PPIDE_DPTR(0) ; SET HL TO START OF UNIT DATA - ;;LD BC,PPIDE_UDLEN - ;;XOR A - ;;CALL FILL - ;;POP HL ; RECOVER UNIT TYPE FIELD POINTER - ;;POP AF ; RECOVER UNIT TYPE VALUE - ;PUSH IY ; SET HL TO - ;POP HL ; ... START OF DEVICE INSTANCE DATA - ;LD BC,PPIDE_CFGSIZ ; SIZE OF CONFGI DATA TO CLEAR - ;XOR A ; FILL WITH ZERO - ;CALL FILL ; DO IT - ;POP AF ; RECOVER DEVICE NUMBER VALUE - ;LD (IY+PPIDE_DEV),A ; ... AND PUT IT BACK - ;POP AF ; RECOVER DEVICE TYPE VALUE - ;LD (IY+PPIDE_TYPE),A ; ... AND PUT IT BACK -; -#IF (PPIDE8BIT) + BIT 1,(IY+PPIDE_ACC) ; 8 BIT ACCESS? + JR Z,PPIDE_INITDEV0 ; NO, DO 16 BIT INIT LD A,PPIDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO -#ELSE - LD A,PPIDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO -#ENDIF CALL PPIDE_SETFEAT ; SET FEATURE - -#IF (PPIDE8BIT) + RET NZ ; BAIL OUT ON ERROR + JR PPIDE_INITDEV00 ; CONTINUE +; +PPIDE_INITDEV0: ; "REAL" IDE DRIVES MAY NOT ACCEPT THE DISABLE8BIT FEATURE COMMAND, ; SO IT IS ONLY AN ERROR IF WE ARE ATTEMPTING TO ENABLE8BIT. - ; CREDIT TO ED BRINDLEY FOR THIS CORRECTION. - RET NZ ; BAIL OUT ON ERROR -#ENDIF + ; CREDIT TO ED BRINDLEY FOR THIS CORRECTION. SO ERROR RETURN IGNORED HERE. + LD A,PPIDE_FEAT_DISABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO + CALL PPIDE_SETFEAT ; SET FEATURE, IGNORE ERRORS +; +PPIDE_INITDEV00: ; CALL PPIDE_IDENTIFY ; EXECUTE PPIDENTIFY COMMAND RET NZ ; BAIL OUT ON ERROR @@ -1188,9 +1157,8 @@ PPIDE_INITDEV: LD DE,HB_WRKBUF ; POINT TO BUFFER DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING ; - XOR A - LD (IY+PPIDE_FLAGS),0 ; CLEAR FLAGS - + LD (IY+PPIDE_MED),0 ; CLEAR MEDIA FLAGS +; ; DETERMINE IF CF DEVICE LD HL,HB_WRKBUF ; FIRST WORD OF IDENTIFY DATA HAS CF FLAG LD A,$8A ; FIRST BYTE OF MARKER IS $8A @@ -1200,14 +1168,14 @@ PPIDE_INITDEV: LD A,$84 ; SECOND BYTE OF MARKER IS $84 CP (HL) ; COMPARE JR NZ,PPIDE_INITDEV1 ; IF NOT MATCH, NOT CF - SET 0,(IY+PPIDE_FLAGS) ; SET FLAGS BIT FOR CF MEDIA + SET 0,(IY+PPIDE_MED) ; SET FLAGS BIT FOR CF MEDIA ; PPIDE_INITDEV1: ; DETERMINE IF LBA CAPABLE LD A,(HB_WRKBUF+98+1) ; GET BYTE WITH LBA BIT FROM BUFFER BIT 1,A ; CHECK THE LBA BIT JR Z,PPIDE_INITDEV2 ; NOT SET, BYPASS - SET 1,(IY+PPIDE_FLAGS) ; SET FLAGS BIT FOR LBA + SET 1,(IY+PPIDE_MED) ; SET FLAGS BIT FOR LBA ; PPIDE_INITDEV2: ; GET DEVICE CAPACITY AND SAVE IT @@ -1227,15 +1195,24 @@ PPIDE_INITDEV2: ; RET ; RETURN, A=0, Z SET ; +; SWITCH IY POINTER FROM CURRENT UNIT CFG TO PARTNER UNIT CFG +; +PPIDE_GOPARTNER: + PUSH HL ; SAVE HL + LD L,(IY+PPIDE_PARTNER) ; GET PARTNER ENTRY + LD H,(IY+PPIDE_PARTNER+1) ; ... + PUSH HL ; MOVE HL + POP IY ; ... TO IY + POP HL ; RESTORE INCOMING HL + RET ; AND DONE ; +; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER +; VIA RESET IF DEVICE IS IN ERROR. ; -PPIDE_CHKDEVICE: +PPIDE_CHKERR: LD A,(IY+PPIDE_STAT) ; GET STATUS OR A ; SET FLAGS - RET Z ; RETURN IF ALL IS WELL -; - ; ATTEMPT TO REINITIALIZE HERE??? - JP PPIDE_ERR + CALL NZ,PPIDE_RESET ; IF ERROR STATUS, RESET BUS RET ; ; @@ -1291,7 +1268,7 @@ PPIDE_WAITBSY1: LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR PPIDE_WAITBSY2: ;IN A,(PPIDE_REG_STAT) ; READ STATUS - CALL PPIDE_IN ; 17TS + 204TS + CALL PPIDE_IN ; 17TS + 170TS .DB PPIDE_REG_STAT ; 0TS LD C,A ; SAVE IT ; 4TS AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS @@ -1301,60 +1278,69 @@ PPIDE_WAITBSY2: OR E ; 4TS JR NZ,PPIDE_WAITBSY2 ; 12TS DJNZ PPIDE_WAITBSY1 ; ----- - JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 246TS + JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 229TS ; ; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A ; -PPIDE_IN: ; IY POINT TO CURRENT CFG TABLE - EX (SP),HL ; GET PARM POINTER ; 19TS +PPIDE_IN: + EX (SP),HL ; GET PARM POINTER ; 19TS PUSH BC ; SAVE INCOMING BC ; 11TS - LD C,(IY+PPIDE_PPI) ; ; 19TS LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS - OUT (C),A ; DO IT ; 12TS + ;OUT (PPIDE_IO_PPI),A ; DO IT ; 11TS + LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD + OUT (C),A ; WRITE IT ; LD B,(HL) ; GET CTL PORT VALUE ; 7TS - DEC C ; LD C,(IY+PPIDE_CTL) ; 4TS + ;LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE ; 7TS + ;LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS + DEC C ; SET IDE ADDRESS OUT (C),B ; SET ADDRESS LINES ; 12TS - SET 6,B ; TURN ON WRITE BIT ; 8TS - OUT (C),B ; ASSERT WRITE LINE ; 12TS + SET 6,B ; TURN ON READ BIT ; 8TS + OUT (C),B ; ASSERT READ LINE ; 12TS ; - DEC C ; 4TS - DEC C ; LD C,(IY+PPIDE_DATALO) ; 4TS - IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12TS + ;IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE ; 11TS + DEC C + DEC C + IN A,(C) ; GET DATA VALUE FROM DEVICE + INC C + INC C ; - RES 6,B ; CLEAR WRITE BIT ; 8TS - INC C ; 4TS - INC C ; LD C,(IY+PPIDE_CTL) ; 4TS - OUT (C),B ; DEASSERT WRITE LINE ; 12TS + RES 6,B ; CLEAR READ BIT ; 8TS + OUT (C),B ; DEASSERT READ LINE ; 12TS POP BC ; RECOVER INCOMING BC ; 10TS INC HL ; POINT PAST PARM ; 6TS EX (SP),HL ; RESTORE STACK ; 19TS RET ; 10TS -; ; ----- -; ; 204TS -; ; ----- -; OUTPUT A TO 3 2 0 2 ; -PPIDE_OUT: ; IY POINT TO CURRENT CFG TABLE +; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY +; +PPIDE_OUT: + ; *** TODO *** FIX ORDER OF SET/CLEAR WRITE LINE EX (SP),HL ; GET PARM POINTER PUSH BC ; SAVE INCOMING BC - LD C,(IY+PPIDE_PPI) - LD B,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - OUT (C),B ; DO IT - + PUSH AF ; PRESERVE INCOMING VALUE + LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE + ;OUT (PPIDE_IO_PPI),A ; DO IT + LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD + OUT (C),A ; WRITE IT + POP AF ; RECOVER VALUE TO WRITE +; LD B,(HL) ; GET IDE ADDRESS VALUE - DEC C ; LD C,(IY+PPIDE_CTL) + ;LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE + ;LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS + DEC C ; SET IDE ADDRESS OUT (C),B ; SET ADDRESS LINES SET 5,B ; TURN ON WRITE BIT OUT (C),B ; ASSERT WRITE LINE ; - DEC C - DEC C ; LD C,(IY+PPIDE_DATALO) + DEC C + DEC C + ;OUT (PPIDE_IO_DATALO),A ; SEND DATA VALUE TO DEVICE OUT (C),A ; SEND DATA VALUE TO DEVICE + INC C + INC C ; RES 5,B ; CLEAR WRITE BIT - INC C - INC C ; LD C,(IY+PPIDE_CTL) OUT (C),B ; DEASSERT WRITE LINE POP BC ; RECOVER INCOMING BC INC HL ; POINT PAST PARM @@ -1460,38 +1446,39 @@ PPIDE_PRTSTAT3: ; PRINT ALL REGISTERS DIRECTLY FROM DEVICE ; DEVICE MUST BE SELECTED PRIOR TO CALL ; -; -; PRINT ALL REGISTERS DIRECTLY FROM DEVICE -; DEVICE MUST BE SELECTED PRIOR TO CALL -; PPIDE_REGDUMP: PUSH AF PUSH BC - PUSH DE + push DE CALL PC_SPACE CALL PC_LBKT - LD C,(IY+PPIDE_PPI) ; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - OUT (C),A ; DO IT + ;OUT (PPIDE_IO_PPI),A ; DO IT + LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD + OUT (C),A ; WRITE IT + LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS LD E,PPIDE_REG_CMD - LD D,7 + LD B,7 PPIDE_REGDUMP1: LD A,E ; REGISTER ADDRESS - LD C,(IY+PPIDE_CTL) - OUT (C),A ; SET IT + ;OUT (PPIDE_IO_CTL),A ; SET IT + OUT (C),A ; REGISTER ADDRESS XOR PPIDE_CTL_DIOR ; SET BIT TO ASSERT READ LINE + ;OUT (PPIDE_IO_CTL),A ; ASSERT READ OUT (C),A ; ASSERT READ -; - LD C,(IY+PPIDE_DATALO) + ;IN A,(PPIDE_IO_DATALO) ; GET VALUE + DEC C ; CTL -> MSB + DEC C ; MSB -> LSB IN A,(C) ; GET VALUE + INC C ; LSB -> MSB + INC C ; MSB -> CTL CALL PRTHEXBYTE ; DISPLAY IT -; - LD A,E ; - LD C,(IY+PPIDE_CTL) ; RELOAD ADDRESS W/ READ UNASSERTED - OUT (C),E -; + ;LD A,C ; RELOAD ADDRESS W/ READ UNASSERTED + ;OUT (PPIDE_IO_CTL),A ; AND SET IT + OUT (C),E ; RELOAD ADDRESS W/ READ UNASSERTED + ;DEC C ; NEXT LOWER REGISTER DEC E ; NEXT LOWER REGISTER - DEC D ; DEC LOOP COUNTER + DEC B ; DEC LOOP COUNTER CALL NZ,PC_SPACE ; FORMATTING JR NZ,PPIDE_REGDUMP1 ; LOOP AS NEEDED CALL PC_RBKT ; FORMATTING @@ -1552,6 +1539,8 @@ PPIDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$" PPIDE_STR_STUNK .TEXT "UNKNOWN ERROR$" ; PPIDE_STR_NO .TEXT "NO$" +PPIDE_STR_NOPPI .TEXT "PPI NOT PRESENT$" +PPIDE_STR_8BIT .TEXT " 8-BIT$" ; ;============================================================================= ; DATA STORAGE @@ -1565,3 +1554,5 @@ PPIDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; PPIDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER +; +PPIDE_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 7172ef96..1d7c96e6 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -28,7 +28,6 @@ TRUE .EQU ~FALSE USENONE .EQU 0 ; NO DEBUG USEXIO .EQU 1 ; BASIC SERIAL DRIVER USEMIO .EQU 2 ; MEMORY BUFFER DRIVER -USEZ80OPT .EQU FALSE ; USE UNOFFICIAL OP CODES WBWDEBUG .EQU USENONE ; ; PRIMARY HARDWARE PLATFORMS diff --git a/Source/HBIOS/ver.inc b/Source/HBIOS/ver.inc index 530202ad..ed995cd7 100644 --- a/Source/HBIOS/ver.inc +++ b/Source/HBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 9 #DEFINE RUP 2 #DEFINE RTP 0 -#DEFINE BIOSVER "2.9.2-pre.27" +#DEFINE BIOSVER "2.9.2-pre.28" From f65e17f3ac248e22f8e5d3a839800057cebe6010 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 7 Feb 2020 13:33:30 -0800 Subject: [PATCH 19/36] Add SUBMIT.COM to NZCOM disk image --- Source/Images/d_nzcom/u0/SUBMIT.COM | Bin 0 -> 1280 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Source/Images/d_nzcom/u0/SUBMIT.COM diff --git a/Source/Images/d_nzcom/u0/SUBMIT.COM b/Source/Images/d_nzcom/u0/SUBMIT.COM new file mode 100644 index 0000000000000000000000000000000000000000..f651bfee6be78c05670bef3a1976d7212f66061c GIT binary patch literal 1280 zcmbVMOK2Nc6n#%KPeBGx|AC4&ej`ttbd*wOk|=nPRj|^KLR^KUpG_Mxk;ayYJmZYV z`uHQu-INBhDqXa+gl2a29xys?v)EWAUQ*uqpOO&iVF=1E*Iy^l#W`aV+ zbjHed^&kF4+os2CYg{>QIL3tOLQc2vd8=ZSO9h&>E!VNjG+Ts(Jj9`gW9D7ksna9V z<+74BEX#Ijwro$Cd+7<&C_Iz1%JpXz8KJ?%Z6d!V-3>mA1m}dHBL;5}U;c(nCeNy0 zlMN{roCEwV$2S1q7n~>B8c^SJ>N}wB-===#)DJ*C#H-dhz6tnYNb%*LIsOUoBOL$A z@h^aPZcA*EsU);ce!c?VFZ4|^q-~PU*6PKGxbx`(Tot|jEZ80ZgONFMt4nPP@jE&=2%MFpANPIv5gYPA2KyQGuiOr8c|71<5`B4A zI;&Qsez>^@wsr*XkZ?`J1vUz>xDt)&vr<*BNolPHH!!~({w3l$e&_5Jo{q?05!e!N zU%R&%j}v^E#e*55H6(Z>ljsdeYa+G)iwJf~ZLq0d2Up1;xglK%M+sziX;_gea0k6% z64V3_)Id9aPrFX=b>16hOTxr#zJ~81 Date: Fri, 7 Feb 2020 17:26:17 -0800 Subject: [PATCH 20/36] Build process cleanup --- Source/BL/Build.cmd | 14 -- Source/BL/Clean.cmd | 6 - Source/BuildShared.cmd | 5 +- Source/CPM22/Build.cmd | 8 + Source/CPM22/Clean.cmd | 1 + Source/{BL/bl.asm => CPM22/loader.asm} | 0 Source/{BL => CPM22}/ver.inc | 0 Source/Clean.cmd | 1 - Source/HBIOS/Build.ps1 | 24 +-- Source/Images/Build.cmd | 20 +-- Source/ZSDOS/Build.cmd | 8 + Source/ZSDOS/Clean.cmd | 1 + Source/ZSDOS/loader.asm | 228 +++++++++++++++++++++++++ Source/ZSDOS/ver.inc | 5 + 14 files changed, 264 insertions(+), 57 deletions(-) delete mode 100644 Source/BL/Build.cmd delete mode 100644 Source/BL/Clean.cmd rename Source/{BL/bl.asm => CPM22/loader.asm} (100%) rename Source/{BL => CPM22}/ver.inc (100%) create mode 100644 Source/ZSDOS/loader.asm create mode 100644 Source/ZSDOS/ver.inc diff --git a/Source/BL/Build.cmd b/Source/BL/Build.cmd deleted file mode 100644 index 7b8c5353..00000000 --- a/Source/BL/Build.cmd +++ /dev/null @@ -1,14 +0,0 @@ -@echo off -setlocal - -set TOOLS=../../Tools - -set PATH=%TOOLS%\tasm32;%TOOLS%\zx;%PATH% - -set TASMTABS=%TOOLS%\tasm32 - -set ZXBINDIR=%TOOLS%/cpm/bin/ -set ZXLIBDIR=%TOOLS%/cpm/lib/ -set ZXINCDIR=%TOOLS%/cpm/include/ - -tasm -t80 -g3 -fFF bl.asm bl.bin bl.lst diff --git a/Source/BL/Clean.cmd b/Source/BL/Clean.cmd deleted file mode 100644 index 23ffc7b3..00000000 --- a/Source/BL/Clean.cmd +++ /dev/null @@ -1,6 +0,0 @@ -@echo off -setlocal - -if exist *.bin del *.bin -if exist *.lst del *.lst -if exist *.sys del *.sys diff --git a/Source/BuildShared.cmd b/Source/BuildShared.cmd index bb8076d6..578af84e 100644 --- a/Source/BuildShared.cmd +++ b/Source/BuildShared.cmd @@ -1,14 +1,13 @@ @echo off setlocal -setlocal & cd Apps && call Build || exit /b 1 & endlocal +setlocal & cd CBIOS && call Build || exit /b 1 & endlocal setlocal & cd CPM22 && call Build || exit /b 1 & endlocal setlocal & cd ZCPR && call Build || exit /b 1 & endlocal setlocal & cd ZCPR-DJ && call Build || exit /b 1 & endlocal setlocal & cd ZSDOS && call Build || exit /b 1 & endlocal -setlocal & cd CBIOS && call Build || exit /b 1 & endlocal setlocal & cd CPM3 && call Build || exit /b 1 & endlocal setlocal & cd ZPM3 && call Build || exit /b 1 & endlocal +setlocal & cd Apps && call Build || exit /b 1 & endlocal setlocal & cd Forth && call Build || exit /b 1 & endlocal setlocal & cd Fonts && call Build || exit /b 1 & endlocal -setlocal & cd BL && call Build || exit /b 1 & endlocal diff --git a/Source/CPM22/Build.cmd b/Source/CPM22/Build.cmd index 93a836cb..5c1effaa 100644 --- a/Source/CPM22/Build.cmd +++ b/Source/CPM22/Build.cmd @@ -32,6 +32,14 @@ zx MLOAD25 -OS2CCP.BIN=OS2CCP.HEX zx MAC -OS3BDOS.ASM -$PO zx MLOAD25 -OS3BDOS.BIN=OS3BDOS.HEX +tasm -t80 -g3 -fFF loader.asm loader.bin loader.lst + +copy /b os2ccp.bin + os3bdos.bin + ..\cbios\cbios_wbw.bin cpm_wbw.bin +copy /b os2ccp.bin + os3bdos.bin + ..\cbios\cbios_una.bin cpm_una.bin + +copy /b loader.bin + cpm_wbw.bin cpm_wbw.sys +copy /b loader.bin + cpm_una.bin cpm_una.sys + goto :eof :asm diff --git a/Source/CPM22/Clean.cmd b/Source/CPM22/Clean.cmd index e2e6145a..243e3c08 100644 --- a/Source/CPM22/Clean.cmd +++ b/Source/CPM22/Clean.cmd @@ -5,3 +5,4 @@ if exist *.bin del *.bin if exist *.lst del *.lst if exist *.prn del *.prn if exist *.hex del *.hex +if exist *.sys del *.sys diff --git a/Source/BL/bl.asm b/Source/CPM22/loader.asm similarity index 100% rename from Source/BL/bl.asm rename to Source/CPM22/loader.asm diff --git a/Source/BL/ver.inc b/Source/CPM22/ver.inc similarity index 100% rename from Source/BL/ver.inc rename to Source/CPM22/ver.inc diff --git a/Source/Clean.cmd b/Source/Clean.cmd index 3c374280..a4420787 100644 --- a/Source/Clean.cmd +++ b/Source/Clean.cmd @@ -11,7 +11,6 @@ setlocal & cd CPM3 && call Clean.cmd & endlocal setlocal & cd ZPM3 && call Clean.cmd & endlocal setlocal & cd Forth && call Clean.cmd & endlocal setlocal & cd Fonts && call Clean.cmd & endlocal -setlocal & cd BL && call Clean.cmd & endlocal setlocal & cd BPBIOS && call Clean.cmd & endlocal setlocal & cd HBIOS && call Clean.cmd & endlocal setlocal & cd Doc && call Clean.cmd & endlocal diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index ad74d64f..1572af95 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -107,7 +107,7 @@ $ComFile = "${OutDir}/${RomName}.com" # Final name of COM image (command line lo $ImgFile = "${OutDir}/${RomName}.img" # Final name of IMG image (memory loadable HBIOS/CBIOS image) # Select the proper CBIOS to include in the ROM. UNA is special. -if ($Platform -eq "UNA") {$CBiosFile = '../CBIOS/cbios_una.bin'} else {$CBiosFile = '../CBIOS/cbios_wbw.bin'} +if ($Platform -eq "UNA") {$Bios = 'una'} else {$Bios = 'wbw'} # List of RomWBW proprietary apps to imbed in ROM disk. $RomApps = "assign","fdu","format","mode","osldr","rtc","survey","syscopy","sysgen","talk","timer","xm","inttest" @@ -155,14 +155,6 @@ ROMSIZE .EQU ${ROMSize} ; "@ | Out-File "build.inc" -Encoding ASCII -# Bring over previously assembled binary copy of the CP/M CCP and BDOS images for later use. -Copy-Item '..\cpm22\os2ccp.bin' 'ccp.bin' -Copy-Item '..\cpm22\os3bdos.bin' 'bdos.bin' - -# Bring over previously assembled binary copy of the ZSystem CCP and BDOS images for later use. -Copy-Item '..\zcpr-dj\zcpr.bin' 'zcpr.bin' -Copy-Item '..\zsdos\zsdos.bin' 'zsdos.bin' - # Bring over previously assembled binary copy of Forth for later use. Copy-Item '..\Forth\camel80.bin' 'camel80.bin' @@ -187,17 +179,10 @@ if ($Platform -ne "UNA") # "Building ${RomName} output files..." -# Combine the CCP and BDOS portions of CP/M and ZSystem to create OS images -Concat 'ccp.bin','bdos.bin',$CBiosFile 'cpm.bin' -Concat 'zcpr.bin','zsdos.bin',$CBiosFile 'zsys.bin' - -# Prepend a bit of boot code required to bootstrap the OS images -Concat 'prefix.bin','cpm.bin' 'cpm.sys' -Concat 'prefix.bin','zsys.bin' 'zsys.sys' - # Build 32K OS chunk containing the loader, debug monitor, and OS images -Concat 'romldr.bin', 'eastaegg.bin','dbgmon.bin', 'cpm.bin', 'zsys.bin' osimg.bin +Concat 'romldr.bin', 'eastaegg.bin','dbgmon.bin', "..\cpm22\cpm_${Bios}.bin", "..\zsdos\zsys_${Bios}.bin" osimg.bin Concat 'camel80.bin', 'nascom.bin', 'tastybasic.bin', 'game.bin', 'imgpad0.bin' osimg1.bin + # # Now the ROM disk image is created. This is done by starting with a # blank ROM disk image of the correct size, then cpmtools is used to @@ -225,7 +210,8 @@ foreach ($App in $RomApps) } # Add the CP/M and ZSystem system images to the ROM disk (used by SYSCOPY) -cpmcp -f $RomFmt $RomDiskFile *.sys 0: +cpmcp -f $RomFmt $RomDiskFile ..\cpm22\cpm_${Bios}.sys 0:cpm.sys +cpmcp -f $RomFmt $RomDiskFile ..\zsdos\zsys_${Bios}.sys 0:zsys.sys # # Finally, the individual binary components are concatenated together to produce diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index b1768e31..6e379154 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -6,20 +6,12 @@ echo : Cleaning... echo : call Clean.cmd -echo : -echo : Creating System Images -echo : -copy /b ..\bl\bl.bin + ..\cpm22\os2ccp.bin + ..\cpm22\os3bdos.bin + ..\cbios\cbios_wbw.bin cpm_wbw.sys -copy /b ..\bl\bl.bin + ..\cpm22\os2ccp.bin + ..\cpm22\os3bdos.bin + ..\cbios\cbios_una.bin cpm_una.sys -copy /b ..\bl\bl.bin + ..\zcpr-dj\zcpr.bin + ..\zsdos\zsdos.bin + ..\cbios\cbios_wbw.bin zsys_wbw.sys -copy /b ..\bl\bl.bin + ..\zcpr-dj\zcpr.bin + ..\zsdos\zsdos.bin + ..\cbios\cbios_una.bin zsys_una.sys - echo : echo : Building Floppy Disk Images... echo : -call BuildFD.cmd cpm22 cpm_wbw -call BuildFD.cmd zsdos zsys_wbw -call BuildFD.cmd nzcom zsys_wbw +call BuildFD.cmd cpm22 ..\cpm22\cpm_wbw +call BuildFD.cmd zsdos ..\zsdos\zsys_wbw +call BuildFD.cmd nzcom ..\zsdos\zsys_wbw call BuildFD.cmd cpm3 call BuildFD.cmd zpm3 call BuildFD.cmd ws4 @@ -27,9 +19,9 @@ call BuildFD.cmd ws4 echo : echo : Building Hard Disk Images... echo : -call BuildHD.cmd cpm22 cpm_wbw -call BuildHD.cmd zsdos zsys_wbw -call BuildHD.cmd nzcom zsys_wbw +call BuildHD.cmd cpm22 ..\cpm22\cpm_wbw +call BuildHD.cmd zsdos ..\zsdos\zsys_wbw +call BuildHD.cmd nzcom ..\zsdos\zsys_wbw call BuildHD.cmd cpm3 call BuildHD.cmd zpm3 call BuildHD.cmd ws4 diff --git a/Source/ZSDOS/Build.cmd b/Source/ZSDOS/Build.cmd index ad45fee5..984b376a 100644 --- a/Source/ZSDOS/Build.cmd +++ b/Source/ZSDOS/Build.cmd @@ -13,3 +13,11 @@ set ZXINCDIR=%TOOLS%/cpm/include/ zx ZMAC -ZSDOS -/P zx LINK -ZSDOS.BIN=ZSDOS[LD800] + +tasm -t80 -g3 -fFF loader.asm loader.bin loader.lst + +copy /b ..\zcpr-dj\zcpr.bin + zsdos.bin + ..\cbios\cbios_wbw.bin zsys_wbw.bin +copy /b ..\zcpr-dj\zcpr.bin + zsdos.bin + ..\cbios\cbios_una.bin zsys_una.bin + +copy /b loader.bin + zsys_wbw.bin zsys_wbw.sys +copy /b loader.bin + zsys_una.bin zsys_una.sys diff --git a/Source/ZSDOS/Clean.cmd b/Source/ZSDOS/Clean.cmd index 1d355724..65ff8877 100644 --- a/Source/ZSDOS/Clean.cmd +++ b/Source/ZSDOS/Clean.cmd @@ -9,3 +9,4 @@ if exist *.hex del *.hex if exist *.rel del *.rel if exist *.sym del *.sym if exist *.err del *.err +if exist *.sys del *.sys diff --git a/Source/ZSDOS/loader.asm b/Source/ZSDOS/loader.asm new file mode 100644 index 00000000..27dc735c --- /dev/null +++ b/Source/ZSDOS/loader.asm @@ -0,0 +1,228 @@ +;=============================================================================== +; BL.ASM +; +; BOOTLOADER FOR ROMWBW DISK OPERATING SYSTEMS. +; +; CP/M DISK FORMATS ALLOW FOR RESERVED TRACKS THAT CONTAIN AN IMAGE OF THE +; OPERATING SYSTEM TO BE LOADED WHEN THE DISK IS BOOTED. THE OPERATING SYSTEM +; IMAGE ITSELF IS NORMALLY PREFIXED BY A 1-N SECTORS CONTAINING OS BOOTSTRAP +; CODE AND DISK METADATA. +; +; THE RETROBREW COMPUTING GROUP HAS BEEN USING A CONVENTION OF PREFIXING THE +; OS IMAGE WITH 3 SECTORS (512 BYTES X 3 FOR A TOTAL OF 1536 BYTES): +; +; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP, +; PARTITION TABLE, AND BOOT SIGNATURE +; SECTOR 2: RESERVED +; SECTOR 3: METADATA +; +; THE HARDWARE BIOS IS EXPECTED TO READ AND LOAD THE FIRST TWO SECTORS FROM THE +; DISK TO MEMORY ADDRESS $8000 AND JUMP TO THAT LOCATION TO BEGIN THE BOOT +; PROCESS. THE BIOS IS EXPECTED TO VERIFY THAT A STANDARD BOOT SIGNATURE +; OF $55, $AA IS PRESENT AT OFFSET $1FE-$1FF. IF THE SIGNATURE IS NOT FOUND, +; THE BIOS SHOULD ASSUME THE DISK HAS NOT BEEN PROPERLY INITIALIZED AND SHOULD +; NOT JUMP TO THE LOAD ADDRESS. +; +;=============================================================================== +; +#INCLUDE "ver.inc" +; +SYS_ENT .EQU $E600 ; SYSTEM (OS) ENTRY POINT ADDRESS +SYS_LOC .EQU $D000 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE +SYS_END .EQU $FE00 ; ENDING ADDRESS OF SYSTEM IMAGE +; +BYT .EQU 1 ; used to describe METADATA_SIZE below +WRD .EQU 2 +; +SECTOR_SIZE .EQU 512 +BLOCK_SIZE .EQU 128 +PREFIX_SIZE .EQU (3 * SECTOR_SIZE) ; 3 SECTORS +METADATA_SIZE .EQU BYT+WRD+(4*BYT)+16+BYT+WRD+WRD+WRD+WRD ; (as defined below) +; +PARTTBL_LOC .EQU $1BE +PARTTBL_SIZ .EQU $40 +BOOTSIG_LOC .EQU $1FE +; +;------------------------------------------------------------------------------- +; SECTOR 1 +; +; THIS SECTOR FOLLOWS THE CONVENTIONS OF AN IBM-PC MBR CONTAINING THE OS +; BOOTSTRAP CODE, PARTITION TABLE, AND BOOT SIGNATURE +; +;---------------------------------------------------------------------------- +; +; THE FOLLOWING BOOTSTRAP CODE IS BUILT TO ASSUME IT WILL BE EXECUTED AT A STARTING +; ADDRESS OF $8000. +; + .ORG $8000 + JR BOOT +; +BOOT: + LD DE,STR_LOAD ; LOADING STRING + CALL PRTSTR ; PRINT + CALL PRTDOT ; PROGRESS +; + LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY + CALL $FFFD ; CALL UNA + JR NZ,ERROR ; HANDLE ERROR + CALL PRTDOT ; PROGRESS + LD B,L ; MOVE BOOT UNIT ID TO B +; + LD C,$41 ; UNA FUNC: SET LBA + LD DE,0 ; HI WORD ALWAYS ZERO + LD HL,3 ; IMAGE STARTS AT FOURTH SECTOR + CALL $FFFD ; SET LBA + JR NZ,ERROR ; HANDLE ERROR + CALL PRTDOT ; PROGRESS +; + LD C,$42 ; UNA FUNC: READ SECTORS + LD DE,$D000 ; STARTING ADDRESS FOR IMAGE + LD L,22 ; READ 22 SECTORS + CALL $FFFD ; DO READ + JR NZ,ERROR ; HANDLE ERROR + CALL PRTDOT ; PROGRESS +; + LD DE,STR_DONE ; DONE MESSAGE + CALL PRTSTR ; PRINT IT +; + LD D,B ; PASS BOOT UNIT TO OS + LD E,0 ; ASSUME LU IS ZERO + JP SYS_ENT ; GO TO SYSTEM +; +PRTCHR: + PUSH BC + PUSH DE + LD BC,$0012 ; UNIT 0, WRITE CHAR + LD E,A ; CHAR TO PRINT + CALL $FFFD ; PRINT + POP DE + POP BC + RET +; +PRTSTR: + PUSH BC + PUSH HL + LD BC,$0015 ; UNIT 0, WRITE CHARS UNTIL TERMINATOR + LD L,0 ; TERMINATOR IS NULL + CALL $FFFD ; PRINT + POP HL + POP BC + RET +; +PRTDOT: + LD A,'.' ; DOT CHARACTER + JR PRTCHR ; PRINT AND RETURN +; +; PRINT THE HEX BYTE VALUE IN A +; +PRTHEXBYTE: + PUSH AF + PUSH DE + CALL HEXASCII + LD A,D + CALL PRTCHR + LD A,E + CALL PRTCHR + POP DE + POP AF + RET +; +; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE +; +HEXASCII: + LD D,A + CALL HEXCONV + LD E,A + LD A,D + RLCA + RLCA + RLCA + RLCA + CALL HEXCONV + LD D,A + RET +; +; CONVERT LOW NIBBLE OF A TO ASCII HEX +; +HEXCONV: + AND 0FH ;LOW NIBBLE ONLY + ADD A,90H + DAA + ADC A,40H + DAA + RET +; +ERROR: + LD DE,STR_ERR ; POINT TO ERROR STRING + CALL PRTSTR ; PRINT IT + HALT ; HALT +; +; DATA +; +STR_LOAD .DB "\r\nLoading",0 +STR_DONE .DB "\r\n",0 +STR_ERR .DB " Read Error!",0 +; + .ORG $ - $8000 ; RESTORE ORG + .FILL PARTTBL_LOC - $ ; FILL TO START OF PARTITION TABLE +; +; RESERVE SPACE FOR STANDARD IBM-PC PARTITION TABLE. ALTHOUGH A +; PARTITION TABLE IS NOT RELEVANT FOR A FLOPPY DISK, IT DOES NO HARM. +; THE CONTENTS OF THE PARTITION TABLE MUST BE MANAGED BY FDISK80. +; +PARTTBL .FILL PARTTBL_SIZ,$00 ; PARTITION TABLE, FILL WITH ZEROES +; +; THE END OF THE FIRST SECTOR MUST CONTAIN THE TWO BYTE BOOT +; SIGNATURE. +; +BOOTSIG .DB $55,$AA ; STANDARD BOOT SIGNATURE +; +;------------------------------------------------------------------------------- +; SECTOR 2 +; +; THIS SECTOR HAS NOT BEEN DEFINED AND IS RESERVED. +; +;---------------------------------------------------------------------------- +; + .FILL 512,0 ; JUST FILL SECTOR WITH ZEROES +; +;------------------------------------------------------------------------------- +; SECTOR 3 +; +; OS AND DISK METADATA +; +;---------------------------------------------------------------------------- +; + .FILL 128 * 3,0 ; FIRST 384 BYTES ARE NOT YET DEFINED +; +; THE FOLLOWING TWO BYTES ARE AN ADDITIONAL SIGNATURE THAT IS VERIFIED BY +; SOME HARDWARE BIOSES. +; +PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE +; +; FIRST CHUNK OF METADATA IMMEDIATELY FOLLOWS THE SIGNATURE BYTES +; +PR_PLATFORM .DB 0 ; PLATFORM ID (SEE STD.ASM) +PR_DEVICE .DB 0 ; ? (PROBABLY UNUSED) +PR_FORMATTER .DB 0,0,0,0,0,0,0,0 ; ? (PROBABLY UNUSED) +PR_DRIVE .DB 0 ; ? (PROBABLY UNUSED) +PR_LOG_UNIT .DW 0 ; ? (PROBABLY UNUSED) +; +; FILLER TO PLACE SECOND CHUNK OF METADATA AT THE END OF THE SECTOR +; + .FILL ((PREFIX_SIZE - METADATA_SIZE) - $),00H +; +; SECOND CHUNK OF METADATA +; +PR_WP .DB 0 ; WRITE PROTECT BOOLEADN +PR_UPDSEQ .DW 0 ; PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?) +PR_VER .DB RMJ,RMN,RUP,RTP ; OS BUILD VERSION +PR_LABEL .DB "Unlabeled Drive ","$" ; DISK LABEL (EXACTLY 16 BYTES!!!) + .DW 0 ; DEPRECATED +PR_LDLOC .DW SYS_LOC ; ADDRESS TO START LOADING SYSTEM +PR_LDEND .DW SYS_END ; ADDRESS TO STOP LOADING SYSTEM +PR_ENTRY .DW SYS_ENT ; ADDRESS TO ENTER SYSTEM (OS) +; +; +; + .END diff --git a/Source/ZSDOS/ver.inc b/Source/ZSDOS/ver.inc new file mode 100644 index 00000000..ed995cd7 --- /dev/null +++ b/Source/ZSDOS/ver.inc @@ -0,0 +1,5 @@ +#DEFINE RMJ 2 +#DEFINE RMN 9 +#DEFINE RUP 2 +#DEFINE RTP 0 +#DEFINE BIOSVER "2.9.2-pre.28" From d8bbb1e8cadfdb8343a7a7bf5314cd7bf1d4bf6f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 8 Feb 2020 14:24:36 -0800 Subject: [PATCH 21/36] Drive letter assignment enhancement Drive letters are now only pre-assigned to hard disk type devices that have media inserted. Media can still be inserted on-the-fly and drive letters assigned using ASSIGN. --- Doc/ChangeLog.txt | 1 + ReadMe.txt | 2 +- Source/CBIOS/cbios.asm | 91 ++++++++++++++++++++++++++++++++++-------- Source/CBIOS/ver.inc | 2 +- Source/CPM22/ver.inc | 2 +- Source/CPM3/ver.inc | 2 +- Source/HBIOS/Build.ps1 | 2 +- Source/HBIOS/ppide.asm | 11 +++-- Source/HBIOS/ver.inc | 2 +- Source/ZSDOS/ver.inc | 2 +- 10 files changed, 90 insertions(+), 27 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 26919279..1edf01e5 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -42,6 +42,7 @@ Version 2.9.2 - WBW: Switch RC/SC Z180 platforms to 115,200 default baud rate - PMS: Enhanced PPIDE driver to handle multiple PPI interfaces - PMS: Added a ROM based game +- WBW: Only assign drive letters to hard disk devices with media Version 2.9.1 ------------- diff --git a/ReadMe.txt b/ReadMe.txt index f9f522d0..ecfc0831 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -7,7 +7,7 @@ *********************************************************************** Wayne Warthen (wwarthen@gmail.com) -Version 2.9.2-pre.28, 2020-02-07 +Version 2.9.2-pre.29, 2020-02-08 https://www.retrobrewcomputers.org/ RomWBW is a ROM-based implementation of CP/M-80 2.2 and Z-System for diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 971d3690..b0ae7c29 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -302,7 +302,7 @@ BOOT: LD SP,STACK ; STACK FOR INITIALIZATION ; - ; COPY INITIALIZATION CODE TO RUNNINT LOCATION $8000 + ; COPY INITIALIZATION CODE TO RUNNING LOCATION $8000 LD HL,BUFPOOL LD DE,$8000 LD BC,CBIOS_END - BUFPOOL @@ -2014,7 +2014,7 @@ AUTOSUB: INC A ; CHECK FOR ERR, $FF --> $00 RET Z ; ERR, DO NOT ATTEMPT AUTO SUBMIT ; - LD HL,CMD ; ADDRESS OF STARTUP COMMAND + LD HL,CMD ; ADDRESS OF STARTUP COMMANDs LD DE,CCP_LOC + 7 ; START OF COMMAND BUFFER IN CCP LD BC,CMDLEN ; LENGTH OF AUTOSTART COMMAND LDIR ; PATCH COMMAND LINE INTO CCP @@ -2398,7 +2398,11 @@ DRV_INIT: LD (DRVMAPADR),HL ; SAVE AS DRVMAP ADDRESS LD (HEAPTOP),HL ; AND AS NEW HEAP TOP ; - ; SETUP TO LOOP THROUGH AVAILABLE DEVICES + ; SETUP TO LOOP THROUGH AVAILABLE DEVICES BUILDING LIST OF + ; ACTIVE UNITS AND COUNTING NUMBER OF ACTIVE HARD DISK + ; DEVICES. NON-HARD DISK UNITS ARE ALWAYS CONSIDERED + ; ACTIVE, BUT HARD DISK UNITS ARE ONLY CONSIDERED ACTIVE + ; IF THERE IS MEDIA IN THE DRIVE. LD B,BF_SYSGET LD C,BF_SYSGET_DIOCNT RST 08 ; E := DISK UNIT COUNT @@ -2408,31 +2412,76 @@ DRV_INIT: RET Z ; HANDLE ZERO DEVICES (ALBEIT POORLY) ; ; LOOP THRU DEVICES TO COUNT TOTAL HARD DISK VOLUMES - PUSH BC ; SAVE THE DEVICE COUNT - LD C,0 ; USE C AS DEVICE LIST INDEX - LD E,0 ; INIT E FOR HARD DISK VOLUME COUNT + LD C,0 ; INIT C AS DEVICE LIST INDEX + LD D,0 ; INIT D AS TOTAL DEVICE COUNT + LD E,0 ; INIT E FOR HARD DISK DEVICE COUNT + LD HL,DRVLST ; INIT HL PTR TO DRIVE LIST ; DRV_INIT2: - PUSH BC ; SAVE LOOP CONTROL CALL DRV_INIT3 ; CHECK DRIVE - POP BC ; RESTORE LOOP CONTROL INC C ; NEXT UNIT DJNZ DRV_INIT2 ; LOOP - POP BC ; RESTORE UNIT COUNT IN B + LD A,D ; TOTAL DEVICE COUNT TO D + LD (DRVLSTC),A ; SAVE THE COUNT JR DRV_INIT4 ; CONTINUE ; DRV_INIT3: PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER) + PUSH HL ; SAVE DRIVE LIST PTR + PUSH BC ; SAVE LOOP CONTROL LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; CALL HBIOS, UNIT TO C LD A,D ; DEVICE TYPE TO A + POP BC ; RESTORE LOOP CONTROL + POP HL ; RESTORE DRIVE LIST PTR POP DE ; RESTORE DE CP DIODEV_IDE ; HARD DISK DEVICE? - RET C ; NOPE, RETURN + JR NC,DRV_INIT3A ; IF SO, HANDLE SPECIAL + LD (HL),C ; SAVE UNIT NUM IN LIST + INC HL ; BUMP PTR + INC D ; INC TOTAL DEVICE COUNT + RET +; +DRV_INIT3A: + ; CHECK FOR ACTIVE AND RETURN IF NOT + PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER) + PUSH HL ; SAVE DRIVE LIST PTR + PUSH BC ; SAVE LOOP CONTROL + + LD B,BF_DIOMEDIA ; HBIOS FUNC: SENSE MEDIA + LD E,1 ; PERFORM MEDIA DISCOVERY + RST 08 + + POP BC ; RESTORE LOOP CONTROL + POP HL ; RESTORE DRIVE LIST PTR + POP DE ; RESTORE DE + + RET NZ ; IF NO MEDIA, JUST RETURN + + ; IF ACTIVE... + LD (HL),C ; SAVE UNIT NUM IN LIST + INC HL ; BUMP PTR + INC D ; INC TOTAL DEVICE COUNT INC E ; INCREMENT HARD DISK COUNT RET ; AND RETURN ; DRV_INIT4: ; SET SLICES PER VOLUME (HDSPV) BASED ON HARD DISK VOLUME COUNT + +; ; *** DEBUG *** +; CALL NEWLINE2 +; LD A,(DRVLSTC) +; LD B,A +; CALL PRTHEXBYTE +; LD A,' ' +; CALL COUT +; LD HL,DRVLST +;TEMP1: +; LD A,(HL) +; INC HL +; CALL PRTHEXBYTE +; DJNZ TEMP1 +; ; *** DEBUG *** + LD A,E ; HARD DISK VOLUME COUNT TO A LD E,8 ; ASSUME 8 SLICES PER VOLUME DEC A ; DEC ACCUM TO CHECK FOR COUNT = 1 @@ -2446,14 +2495,20 @@ DRV_INIT5: LD A,E ; SLICES PER VOLUME VALUE TO ACCUM LD (HDSPV),A ; SAVE IT ; - ; SETUP TO ENUMERATE DEVICES TO BUILD DRVMAP - LD B,BF_SYSGET - LD C,BF_SYSGET_DIOCNT - RST 08 ; E := DISK UNIT COUNT - LD B,E ; COUNT TO B - LD C,0 ; USE C AS DEVICE LIST INDEX +; ; SETUP TO ENUMERATE DEVICES TO BUILD DRVMAP +; LD B,BF_SYSGET +; LD C,BF_SYSGET_DIOCNT +; RST 08 ; E := DISK UNIT COUNT +; LD B,E ; COUNT TO B +; LD C,0 ; USE C AS DEVICE LIST INDEX +; + LD A,(DRVLSTC) ; ACTIVE DRIVE LIST COUNT TO ACCUM + LD B,A ; ... AND MOVE TO B FOR LOOP COUNTER + LD HL,DRVLST ; HL IS PTR TO ACTIVE DRIVE LIST ; DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE + PUSH HL ; PRESERVE DRIVE LIST PTR + LD C,(HL) ; GET UNIT NUM FROM LIST PUSH BC ; PRESERVE LOOP CONTROL LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; CALL HBIOS, D := DEVICE TYPE @@ -2462,6 +2517,8 @@ DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE CALL DRV_INIT7 ; MAKE DRIVE MAP ENTRY(S) POP BC ; RESTORE LOOP CONTROL INC C ; INCREMENT LIST INDEX + POP HL ; RESTORE DRIVE LIST PTR + INC HL ; INCREMENT ACTIVE DRIVE LIST PTR DJNZ DRV_INIT6 ; LOOP AS NEEDED RET ; FINISHED ; @@ -2880,6 +2937,8 @@ HEAPTOP .DW BUFPOOL ; CURRENT TOP OF HEAP BOOTVOL .DW 0 ; BOOT VOLUME, MSB=BOOT UNIT, LSB=BOOT SLICE BNKRAMD .DB 0 ; STARTING BANK ID FOR RAM DRIVE HDSPV .DB 2 ; SLICES PER VOLUME FOR HARD DISKS (MUST BE >= 1) +DRVLST .FILL 32 ; ACTIVE DRIVE LIST USED DURINT DRV_INIT +DRVLSTC .DB 0 ; ENTRY COUNT FOR ACTIVE DRIVE LIST ; CMD .DB CMDLEN - 2 .TEXT "SUBMIT PROFILE" diff --git a/Source/CBIOS/ver.inc b/Source/CBIOS/ver.inc index ed995cd7..b65ec245 100644 --- a/Source/CBIOS/ver.inc +++ b/Source/CBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 9 #DEFINE RUP 2 #DEFINE RTP 0 -#DEFINE BIOSVER "2.9.2-pre.28" +#DEFINE BIOSVER "2.9.2-pre.29" diff --git a/Source/CPM22/ver.inc b/Source/CPM22/ver.inc index ed995cd7..b65ec245 100644 --- a/Source/CPM22/ver.inc +++ b/Source/CPM22/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 9 #DEFINE RUP 2 #DEFINE RTP 0 -#DEFINE BIOSVER "2.9.2-pre.28" +#DEFINE BIOSVER "2.9.2-pre.29" diff --git a/Source/CPM3/ver.inc b/Source/CPM3/ver.inc index 0b96de4f..2fc0ccc8 100644 --- a/Source/CPM3/ver.inc +++ b/Source/CPM3/ver.inc @@ -3,5 +3,5 @@ rmn equ 9 rup equ 2 rtp equ 0 biosver macro - db "2.9.2-pre.28" + db "2.9.2-pre.29" endm diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index 1572af95..1e653395 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -140,7 +140,7 @@ Function Concat($InputFileList, $OutputFile) # # Since TASM has no mechanism to include files dynamically based on variables, a file -# if built on-the-fly here for imbedding in the build process. This file is basically +# is built on-the-fly here for imbedding in the build process. This file is basically # just used to include the platform and config files. It also passes in some values # from the build to include in the build. diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 98dfd096..fc964390 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -990,14 +990,17 @@ PPIDE_RESET: LD DE,150000/16 ; ~???MS CALL VDELAY ; - CALL PPIDE_INITUNIT ; INIT CURRENT UNIT + ; INITIALIZE THE INDIVIDUAL UNITS (MASTER AND SLAVE). + ; BASED ON TESTING, IT APPEARS THAT THE MASTER UNIT MUST + ; BE DONE FIRST OR THIS BEHAVES BADLY. PUSH IY ; SAVE CFG PTR - CALL PPIDE_GOPARTNER ; POINT TO PARTNER + BIT 0,(IY+PPIDE_ACC) ; MASTER? + CALL Z,PPIDE_GOPARTNER ; IF NOT, SWITCH TO MASTER + CALL PPIDE_INITUNIT ; INIT CURRENT UNIT + CALL PPIDE_GOPARTNER ; POINT TO SLAVE CALL PPIDE_INITUNIT ; INIT PARTNER UNIT POP IY ; RECOVER ORIG CFG PTR -; RET - ; ; ; diff --git a/Source/HBIOS/ver.inc b/Source/HBIOS/ver.inc index ed995cd7..b65ec245 100644 --- a/Source/HBIOS/ver.inc +++ b/Source/HBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 9 #DEFINE RUP 2 #DEFINE RTP 0 -#DEFINE BIOSVER "2.9.2-pre.28" +#DEFINE BIOSVER "2.9.2-pre.29" diff --git a/Source/ZSDOS/ver.inc b/Source/ZSDOS/ver.inc index ed995cd7..b65ec245 100644 --- a/Source/ZSDOS/ver.inc +++ b/Source/ZSDOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 9 #DEFINE RUP 2 #DEFINE RTP 0 -#DEFINE BIOSVER "2.9.2-pre.28" +#DEFINE BIOSVER "2.9.2-pre.29" From 8fd1fefdf94911ddc6290e11f7978e2339ead2a7 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 8 Feb 2020 15:56:18 -0800 Subject: [PATCH 22/36] New drive assignment logic to CP/M 3 --- Source/CPM3/boot.z80 | 149 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 130 insertions(+), 19 deletions(-) diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 14dfafe6..0950af2e 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -14,6 +14,7 @@ extrn @date,@hour,@min,@sec extrn @srch1 extrn addhla, bcd2bin, bin2bcd + ;extrn cout, phex8 include ver.inc @@ -121,32 +122,113 @@ dinit: or a ; set flags ret z ; !!! handle zero devices (albeit poorly) !!! - ; loop thru devices to count total hard disk volumes - push bc ; save the device count - ld c,0 ; use c as device list index - ld e,0 ; init e for hard disk volume count +; ; loop thru devices to count total hard disk volumes +; push bc ; save the device count +; ld c,0 ; use c as device list index +; ld e,0 ; init e for hard disk volume count +; +;dinit2: +; push bc ; save loop control +; call dinit3 ; check drive +; pop bc ; restore loop control +; inc c ; next unit +; djnz dinit2 ; loop +; pop bc ; restore unit count in b +; jr dinit4 ; continue + ; loop thru devices to count total hard disk volumes + ld c,0 ; init c as device list index + ld d,0 ; init d as total device count + ld e,0 ; init e for hard disk device count + ld hl,drvlst ; init hl ptr to drive list +; dinit2: - push bc ; save loop control call dinit3 ; check drive - pop bc ; restore loop control inc c ; next unit djnz dinit2 ; loop - pop bc ; restore unit count in b + ld a,d ; total device count to d + ld (drvlstc),a ; save the count jr dinit4 ; continue +;dinit3: +; push de ; save de (hard disk volume counter) +; ld b,017h ; hbios func: report device info +; rst 08 ; call hbios, unit to c +; ld a,d ; device type to a +; pop de ; restore de +; cp 050h ; hard disk device? +; ret c ; nope, return +; inc e ; increment hard disk count +; ret ; and return + dinit3: push de ; save de (hard disk volume counter) - ld b,017h ; hbios func: report device info + push hl ; save drive list ptr + push bc ; save loop control + ld b,17h ; hbios func: report device info rst 08 ; call hbios, unit to c ld a,d ; device type to a + pop bc ; restore loop control + pop hl ; restore drive list ptr pop de ; restore de - cp 050h ; hard disk device? - ret c ; nope, return + cp 50h ; hard disk device? + jr nc,dinit3a ; if so, handle special + ld (hl),c ; save unit num in list + inc hl ; bump ptr + inc d ; inc total device count + ret +; +dinit3a: + ; check for active and return if not + push de ; save de (hard disk volume counter) + push hl ; save drive list ptr + push bc ; save loop control + + ld b,18h ; hbios func: sense media + ld e,1 ; perform media discovery + rst 08 + + pop bc ; restore loop control + pop hl ; restore drive list ptr + pop de ; restore de + + ret nz ; if no media, just return + + ; if active... + ld (hl),c ; save unit num in list + inc hl ; bump ptr + inc d ; inc total device count inc e ; increment hard disk count ret ; and return + +;dinit4: ; set slices per volume (hdspv) based on hard disk volume count +; ld a,e ; hard disk volume count to a +; ld e,8 ; assume 8 slices per volume +; dec a ; dec accum to check for count = 1 +; jr z,dinit5 ; yes, skip ahead to implement 8 hdspv +; ld e,4 ; now assume 4 slices per volume +; dec a ; dec accum to check for count = 2 +; jr z,dinit5 ; yes, skip ahead to implement 4 hdspv +; ld e,2 ; in all other cases, we use 2 hdspv + dinit4: ; set slices per volume (hdspv) based on hard disk volume count + +; ; *** debug *** +; ;call newline2 +; ld a,(drvlstc) +; ld b,a +; call phex8 +; ld a,' ' +; call cout +; ld hl,drvlst +;temp1: +; ld a,(hl) +; inc hl +; call phex8 +; djnz temp1 +; ; *** debug *** + ld a,e ; hard disk volume count to a ld e,8 ; assume 8 slices per volume dec a ; dec accum to check for count = 1 @@ -156,29 +238,56 @@ dinit4: ; set slices per volume (hdspv) based on hard disk volume count jr z,dinit5 ; yes, skip ahead to implement 4 hdspv ld e,2 ; in all other cases, we use 2 hdspv +;dinit5: +; ld a,e ; slices per volume value to accum +; ld (hdspv),a ; save it +; +; ; setup to enumerate devices to build drvmap +; ld b,0F8h ; SYS GET +; ld c,010h ; Disk Drive Unit Count +; rst 08 ; e := disk unit count +; ld b,e ; count to b +; ld c,0 ; use c as device list index +; ld hl,0 ; dph index + dinit5: ld a,e ; slices per volume value to accum ld (hdspv),a ; save it - - ; setup to enumerate devices to build drvmap - ld b,0F8h ; SYS GET - ld c,010h ; Disk Drive Unit Count - rst 08 ; e := disk unit count - ld b,e ; count to b - ld c,0 ; use c as device list index + ld a,(drvlstc) ; active drive list count to accum + ld b,a ; ... and move to b for loop counter + ld de,drvlst ; de is ptr to active drive list ld hl,0 ; dph index +;dinit6: ; loop thru all units available +; push bc ; preserve loop control +; push hl ; preserve dph pointer +; ld b,017h ; hbios func: report device info +; rst 08 ; call hbios, d := device type +; pop hl ; restore dph pointer +; pop bc ; get unit index back in c +; push bc ; resave loop control +; call dinit7 ; update dph entries +; pop bc ; restore loop control +; inc c ; increment list index +; djnz dinit6 ; loop as needed + dinit6: ; loop thru all units available + push de ; preserve drive list ptr + ex de,hl ; list ptr to hl + ld c,(hl) ; get unit num from list + ex de,hl ; list ptr back to de push bc ; preserve loop control push hl ; preserve dph pointer - ld b,017h ; hbios func: report device info + ld b,17h ; hbios func: report device info rst 08 ; call hbios, d := device type pop hl ; restore dph pointer pop bc ; get unit index back in c push bc ; resave loop control - call dinit7 ; update dph entries + call dinit7 ; make drive map entry(s) pop bc ; restore loop control inc c ; increment list index + pop de ; restore drive list ptr + inc de ; increment active drive list ptr djnz dinit6 ; loop as needed ; zero out remaining dph table entries @@ -613,6 +722,8 @@ fcb$nr db 0,0,0 @bootdu db 0 hdspv db 2 ; slices per volume for hard disks (must be >= 1) +drvlst ds 32 ; active drive list used durint drv_init +drvlstc db 0 ; entry count for active drive list ; The following section contains key information and addresses for the ; RomWBW CBIOS. A pointer to the start of this section is stored with From 461aaedd569fc2f7a2c94e9cf2334b5200253a4f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 8 Feb 2020 16:23:17 -0800 Subject: [PATCH 23/36] Update boot.z80 Bug fix --- Source/CPM3/boot.z80 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index 0950af2e..3e1cf55b 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -171,7 +171,7 @@ dinit3: pop bc ; restore loop control pop hl ; restore drive list ptr pop de ; restore de - cp 50h ; hard disk device? + cp 30h ; hard disk device? jr nc,dinit3a ; if so, handle special ld (hl),c ; save unit num in list inc hl ; bump ptr From f552c83f23e1187fbf6ecdeeaa60e8490ae4cfce Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 9 Feb 2020 20:25:45 +0800 Subject: [PATCH 24/36] Update romldr.asm Update to cater for possibility of more than 9 drives being detected. Update menu system to support --- Source/HBIOS/romldr.asm | 160 ++++++++++++++++++++++++++-------------- 1 file changed, 106 insertions(+), 54 deletions(-) diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 3ac79c51..8a44fec4 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -206,8 +206,7 @@ MENU4: ; BOOT SELECTION PROCESSING ;================================================================================================== ; -SEL: - ; HANDLE SERIAL CONSOLE INPUT +SEL: ; HANDLE SERIAL CONSOLE INPUT CALL CST ; CHECK CONSOLE INPUT OR A ; ZERO? JR Z,SEL1 ; IF NOT, CONTINUE @@ -221,9 +220,13 @@ SEL: OUT (LEDPORT),A ; CLEAR LED #ENDIF #ENDIF - CALL CINUC ; GET THE KEY - CALL COUT ; ECHO KEY - JR MATS ; AND HANDLE IT + CALL CINUC ; GET THE KEY + CALL COUT ; ECHO KEY + CP 'R' ; CHECK FOR + JP Z,REBOOT ; REBOOT REQUEST + LD DE,MENU_S+10-MENU_V ; POINT TO SERIAL MENU COLUMN + LD C,2 ; SET SERIAL FLAG + JR MATS ; GO CHECK MENU SELECTION ; SEL1: #IF (DSKYENABLE) @@ -241,8 +244,12 @@ SEL1: OUT (LEDPORT),A ; CLEAR LED #ENDIF #ENDIF - CALL DSKY_GETKEY ; GET PENDING KEY PRESS - JR MATK ; AND HANDLE IT + CALL DSKY_KEY ; GET PENDING KEY PRESS ; NOTE DESKY_GETKEY + CP KY_BO ; CHECK FOR REBOOT ; CAN RETURN AN INVALID + JP Z,REBOOT ; REBOOT REQUEST ; KEYSCAN AS FFH WHICH + LD DE,MENU_S+11-MENU_V ; POINT TO DSKY MENU COLUMN ; MAY BE MATCHED WITH + LD C,1 ; SET DSKY FLAG ; DUMMY MENU ENTRIES + JR MATS ; GO CHECK MENU SELECTION #ENDIF ; SEL2: @@ -267,8 +274,10 @@ SEL2: OUT (LEDPORT),A ; CLEAR LED #ENDIF #ENDIF - LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED, - JR MATS ; PERFORM DEFAULT BOOT ACTION + LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED, + LD DE,MENU_S+10-MENU_V ; POINT TO SERIAL MENU COLUMN + LD C,2 ; SET SERIAL FLAG + JR MATS ; PERFORM DEFAULT BOOT ACTION #ENDIF ; SEL3: @@ -279,51 +288,96 @@ SEL3: ; ROM MENU TABLE MATCHING ;================================================================================================== ; -MATS: ; MATCH SERIAL INPUT TO MENU - CP 'R' - JP Z,REBOOT - LD B,MENU_N - LD DE,MENU_S+10-MENU_V - LD HL,MENU_V -MATS1: EX DE,HL - ADD HL,DE - CP (HL) - EX DE,HL +MATS: LD B,MENU_N ; LOOP THROUGH THE ; ON ENTRY DE POINTS TO + LD HL,MENU_V ; MENU TABLE AND ; THE MENU COLUMN WE ARE +MATS1: EX DE,HL ; CHECK IF THE ; CHECKING AND C CONTAINS + ADD HL,DE ; KEYPRESS MATCHES ; A FLAG TELLING US IF WE + CP (HL) ; ANY OF ; HAVE DSKY OR SERIAL INPUT + EX DE,HL ; THE MENU ITEMS. JR Z,MATS2 - DJNZ MATS1 ; FALL THRU IF IT DOES NOT MATCH ROM MENU - SUB '0' ; CONVERT ASCII TO BINARY - JR MATD ; AND TRY DISK BOOT -MATS2: INC DE ; SKIP MENU SEL CHAR - INC DE ; SKIP DSKY SEL CHAR - JP GOROM ; BOOT FROM ROM + DJNZ MATS1 ; IF WE REACH THE TABLE END AND DON'T HAVE + JR MATD ; A MATCH GO AND CHECK FOR A DISK SELECTION +; +MATS2: LD B,0 ; WE GOT A MATCH FROM THE MENU TABLE. POINT + EX DE,HL ; TO THE ROM ADDRESS TO EXECUTE. ADJUST THE + ADD HL,BC ; POINTER TO THE ROM ENTRY BASED ON WHETHER WE + EX DE,HL ; GOT A MATCH IN THE DSKY OR SERIAL MENU COLUMN + JP GOROM ; JUMP TO THE ROM HANDLER. +; +MATD: LD B,A + LD A,C ; IF INPUT WAS SERIAL + DEC C ; CONVERT TO FROM. + JR Z,MATD1 ; ASCII TO DECIMAL. + LD A,B ; DSKY NUMBERS ARE + SUB '0' ; ALREADY DECIMAL +MATD1: CP 10 ; DO A RANGE CHECK + JR NC,MATX ; NOT VALID, HANDLE IT BELOW ; -#IF (DSKYENABLE) -MATK: ; MATCH DSKY INPUT TO MENU - CP KY_BO - JP Z,REBOOT - LD B,MENU_N - LD DE,MENU_S+11-MENU_V - LD HL,MENU_V -MATK1: EX DE,HL - ADD HL,DE - CP (HL) - EX DE,HL - JR Z,MATK2 - DJNZ MATK1 ; FALL THRU IF IT DOES NOT MATCH DSKY MENU - JR MATD ; TRY DISK BOOT -MATK2: INC DE ; SKIP DSKY SEL CHAR - JP GOROM ; BOOT FROM ROM + PUSH BC + PUSH AF ; HOW MANY DISK + LD B,BF_SYSGET ; DEVICES DO WE + LD C,BF_SYSGET_DIOCNT ; HAVE IN THE + RST 08 ; SYSTEM ? + POP AF + POP BC +; JR MATD2 ; IF MORE THEN 9 ; UNCOMMENT TO TEST DOUBLE CHAR ENTRY + CP 10 ; THEN WE NEED TO GET + JR NC,MATD2 ; ANOTHER CHARACTER +; + CP E ; WE DON'T HAVE MORE THAN 10 DEVICES SO ; A = REQUESTED UNIT + JP C,GOBOOTDISK ; CHECK IT IS IN RANGE. BOOT IF IT IS ; E = AVAILABLE UNITS + JR MATX ; IT IF NOT VALID, HANDLE IT BELOW + +MATD2: LD B,A ; PROCESS FURTHER INPUT ; B = REQUESTED UNIT + LD A,C ; CHECK WHERE TO GET ; C = DSKY/SERIAL FLAG + DEC C ; THE INPUT FROM AND GO + JR NZ,MATD3 ; GET ANOTHER CHARACTER +; +#IF (DSKYENABLE) ; INPUT DSKY +; +MATD4: ;CALL DSKY_STAT ; WAIT FOR + ;OR A ; ANOTHER + ;JR Z,MATD4 ; KEY FROM + ;CALL DSKY_GETKEY ; DSKY + CALL DSKY_KEY + + CP KY_EN ; IF NEXT KEY IS ENTER + JR Z,MATD6 ; OR GO, PROCESS AS A + CP KY_GO ; SINGLE DIGIT NUMBER + JR Z,MATD6 ; OTHERWISE JOIN TWO + JR MATD5 ; CHARCTERS IN ONE DECIMAL #ENDIF ; -MATD: ; CHECK FOR DISK BOOT REQUEST - CP 10 ; 0-9, DISK DEVICE - JR NC,MATX ; NOT VALID, HANDLE IT BELOW - JP GOBOOTDISK ; BOOT FROM DISK +; ; INPUT SERIAL +; +MATD3: ;CALL CST ; WAIT FOR + ;OR A ; ANOTHER + ;JR Z,MATD3 ; KEY FROM + CALL CINUC ; SERIAL + CALL COUT ; -MATX: - ; SET ERROR STRING AND LOOP - LD DE,STR_INVALID ; INVALID SEL MSG - JP MENU ; RESTART MENU LOOP + CP CHR_CR ; IF NEXT KEY IS RETURN PROCESS + JR Z,MATD6 ; AS A SINGLE DIGIT NUMBER +; + SUB '0' ; CONVERT THE SERIAL NUMBER TO DECIMAL + CP 10 ; DO A RANGE CHECK + JR NC,MATX ; NOT VALID, HANDLE IT BELOW + +MATD5: LD C,A ; C CONTAINS SECOND CHARACTER INPUT 0..9 + LD A,B ; A CONTAINS FIRST NUMBER INPUT 0..9 + ADD A,A + LD B,A ; MULTIPLY FIRST DIGIT BY 10 + ADD A,A ; AND ADD SECOND DIGIT + ADD A,A + ADD A,B ; CONVERT TWO INPUTTED + ADD A,C ; CHARACTERS TO DECIMAL. + LD B,A +; +MATD6: LD A,B ; PUT THE DEVICE NUMBER TO BOOT + JP GOBOOTDISK ; IN A AND GO BOOT DEVICE +; +MATX: LD DE,STR_INVALID ; SET ERROR STRING MESSAGE + JP MENU ; AND RESTART MENU LOOP ; ;================================================================================================== ; ROM MENU TABLE @@ -508,7 +562,7 @@ GOBOOTDISK: LD (BL_BOOTID),A LD DE,STR_BOOTDISK CALL WRITESTR - CALL PRTHEXBYTE + CALL PRTDECB PRTS("...$") #IF (DSKYENABLE) LD HL,MSG_LOAD ; POINT TO LOAD MESSAGE @@ -737,8 +791,7 @@ PRTDRV: LD A,'(' ; NEWLINE AND SPACING CALL COUT ; PRINT IT LD A,B ; DRIVE LETTER TO A - ADD A,'0' ; MAKE IT DISPLAY NUMERIC - CALL COUT ; PRINT IT + CALL PRTDECB LD A,')' ; DRIVE LETTER COLON CALL COUT ; PRINT IT POP DE ; RECOVER DISK TYPE @@ -807,8 +860,7 @@ PRTALL1: LD A,'(' ; FORMATTING CALL COUT ; PRINT IT LD A,C ; INDEX TO A - ADD A,'0' ; MAKE NUMERIC CHAR - CALL COUT ; PRINT IT + CALL PRTDECB LD A,')' ; FORMATTING CALL COUT ; PRINT IT PUSH BC ; SAVE LOOP CONTROL From 09b967e82be71e3813e51cb922e89cd469ac96bd Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 10 Feb 2020 22:44:35 +0800 Subject: [PATCH 25/36] Add a user rom pack template to romldr --- Source/HBIOS/Build.ps1 | 4 +- Source/HBIOS/imgpad0.asm | 2 +- Source/HBIOS/romldr.asm | 1 + Source/HBIOS/std.asm | 4 ++ Source/HBIOS/usrrom.asm | 80 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 Source/HBIOS/usrrom.asm diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index 1e653395..cb898af7 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -163,7 +163,7 @@ Copy-Item '..\Fonts\font*.asm' '.' # Assemble individual components. Note in the case of UNA, there is less to build. # -$RomComponentList = "dbgmon", "prefix", "romldr", "eastaegg", "nascom", "tastybasic", "game", "imgpad", "imgpad0" +$RomComponentList = "dbgmon", "prefix", "romldr", "eastaegg", "nascom", "tastybasic", "game", "usrrom", "imgpad", "imgpad0" ForEach ($RomComponentName in $RomComponentList) {Asm $RomComponentName} if ($Platform -ne "UNA") @@ -181,7 +181,7 @@ if ($Platform -ne "UNA") # Build 32K OS chunk containing the loader, debug monitor, and OS images Concat 'romldr.bin', 'eastaegg.bin','dbgmon.bin', "..\cpm22\cpm_${Bios}.bin", "..\zsdos\zsys_${Bios}.bin" osimg.bin -Concat 'camel80.bin', 'nascom.bin', 'tastybasic.bin', 'game.bin', 'imgpad0.bin' osimg1.bin +Concat 'camel80.bin', 'nascom.bin', 'tastybasic.bin', 'game.bin', 'imgpad0.bin', 'usrrom.bin' osimg1.bin # # Now the ROM disk image is created. This is done by starting with a diff --git a/Source/HBIOS/imgpad0.asm b/Source/HBIOS/imgpad0.asm index 74a2a125..2aa54841 100644 --- a/Source/HBIOS/imgpad0.asm +++ b/Source/HBIOS/imgpad0.asm @@ -1,6 +1,6 @@ #INCLUDE "std.asm" ; -SLACK .EQU ($8000-BAS_SIZ-TBC_SIZ-FTH_SIZ-GAM_SIZ) +SLACK .EQU ($8000-BAS_SIZ-TBC_SIZ-FTH_SIZ-GAM_SIZ-USR_SIZ) .FILL SLACK,00H ; MON_STACK .EQU $ diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 8a44fec4..4fce8151 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -423,6 +423,7 @@ MENU_1: MENU_L("~CP/M$ ", "C", KY_BK, CPM_ENT, 2000h, CPM_LOC, CPM_SIZ MENU_L("~BASIC$ ", "B", KY_DE, BAS_LOC, 1700h, BAS_LOC, BAS_SIZ, BID_IMG1, BID_USR, "Nascom BASIC$") MENU_L("~T-BASIC$ ", "T", KY_EN, TBC_LOC, 3700h, TBC_LOC, TBC_SIZ, BID_IMG1, BID_USR, "Tasty BASIC$ ") MENU_L("~PLAY$ ", "P", $FF, GAM_LOC, 4000h, GAM_LOC, GAM_SIZ, BID_IMG1, BID_USR, "Game$ ") + MENU_L("~USER ROM$", "U", $FF, USR_LOC, 7000h, USR_LOC, USR_SIZ, BID_IMG1, BID_USR, "User ROM$ ") #ENDIF #IF (DSKYENABLE) MENU_L("~DSKY$ ", "D", KY_GO, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "DSKY Monitor$") diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 1d7c96e6..e8ecf3a6 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -425,6 +425,10 @@ GAM_LOC .EQU $0200 ; GAME 2048 GAM_SIZ .EQU $0900 GAM_END .EQU GAM_LOC + GAM_SIZ +USR_LOC .EQU $0200 ; USER +USR_SIZ .EQU $1000 +USR_END .EQU USR_LOC + USR_SIZ + MON_DSKY .EQU MON_LOC + (0 * 3) ; MONITOR ENTRY (DSKY) MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT) ; diff --git a/Source/HBIOS/usrrom.asm b/Source/HBIOS/usrrom.asm new file mode 100644 index 00000000..5d4ff8e7 --- /dev/null +++ b/Source/HBIOS/usrrom.asm @@ -0,0 +1,80 @@ +; +; USRROM TEMPLATE FOR A CUSTOM USER ROM +; +#INCLUDE "std.asm" +; +CR .EQU 0DH +LF .EQU 0AH +; + .ORG USR_LOC +; + LD HL,BOOTMSG ; INTRODUCTION + CALL PRTSTR + + CALL CIN ; DO STUFF +; + LD A,00H ; RETURN TO ROM LOADER + LD HL,0000H + JP 0FFF9H +; RET +; +; +; +; PRINT A STRING AT ADDRESS SPECIFIED IN HL +; STRING MUST BE TERMINATED BY '$' +; USAGE: +; LD HL,MYSTR +; CALL PRTSTR +; ... +; MYSTR: .DB "HELLO$" +; +PRTSTR: LD A,(HL) + INC HL + CP '$' + RET Z + CALL COUT + JR PRTSTR +; +; OUTPUT CHARACTER IN A TO CONSOLE DEVICE +; +COUT: PUSH AF + PUSH BC + PUSH DE + LD B,01H + LD C,0 + LD E,A + RST 08 + POP DE + POP BC + POP AF + RET +; +; OUTPUT CHARACTER IN A TO CONSOLE DEVICE +; +COUTE: PUSH AF + LD A,E + CALL COUT + POP AF + RET +; +; WAIT FOR A CHARACTER FROM THE CONSOLE DEVICE AND RETURN IT IN A +; +CIN: PUSH BC + LD B,00H + LD C,00H + RST 08 + LD A,E + POP BC + RET +; +BOOTMSG:.DB "No User ROM Installed." + .DB CR,LF + .DB "Press a key to return to Boot Loader.$" +; +SLACK .EQU (USR_END - $) + .FILL SLACK,00 + .ECHO "User ROM space remaining: " + .ECHO SLACK + .ECHO " bytes.\n" + .END + From 219891823111cd42ef0b2552cdc1d96d3e1bec61 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 11:26:14 -0800 Subject: [PATCH 26/36] Create SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf Thanks to David Reese for contributing this. --- ...g_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf | Bin 0 -> 120834 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf diff --git a/Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf b/Doc/Contrib/SC126_How-To_No_2_Preparing_an_SD_Card_for_Use_with_SC126_Rev_1-5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9dd3fe3ba9bb5dd01f85ba17d8fa59c511b02da9 GIT binary patch literal 120834 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�`XN$M;&u1c`D^R^R5t4M*9QT3uVCF z5A-NKaWoN?9~t6fndJ2?;uVHh;|c`Y^j)Uqr^#J zyR1s$-zNk`Gn#xj<@@7x=Fm2}9N>2GB7aGL2OnQd9Ff^n$Be>)ApC-Zl~ z_4y;mB@)<=8@n`RTpA7`&e#FLatIJFcc{N5>!+vBOe zNWX&fjpFeq7RjyR_WFIln}iF~Ic;)YlR-5~AeWbXS&U+fD;m53)19x9(zrMNQkId0bs+Z!9tM9DSi0ThF4|6HS4^ zMtRy#l6fE#*XlHl0>SJ^$}wAD3UZbUJ6N~w-iBoq6sEriUf7mBg1IZ{QNm0mTLrE zL%TCK(tY7}LQu;jVF3Z|(?LPGD%i1MrC4M~?|#M8@1ARK5NX}X#N8yC%L zlA2u@Y0@s!hFcYGT_2q@23@sh6!cCxeG;;AIQ03d@KF0mj=ASbs-a1YPHn`rz7D<| zia&C$u;cIydIeoKNQZGBYG)}eB$rvd$G(PN%Ggjv@@2H>i*;n3!t*!nI3lFyrg6E~ zU;{Wkp_(YLGFny+{>wS5iU^??0BnUR*?|E3Z?0q}b0H ztY0jNqes_yB{=m%vUdjc(-GeVCSV;c5HcpB9{a7l{Tk~8GrNT)D^!S zl4ogQvMK7Y-Z@Z_LJBjlLYX->>DOVSIE@he7wC1K7!^xDx6;v;rYQ?+k{%~W0-UAq zUvGdAy!tV2cuAKjg-=PS`Li*zg)Df^2O!{{A{s>bnBi`w?)=c4z(nk|ZZWs{m`*?E zvCU2=)kY1H*ti#$jVe~yWt_E}#`{JV?C$MdW5W~_GSmJhtLnW^Cm|=hi_R&{LXy?%#TN98<@>lc>*145leI|zVdy93n$p1*x1xk+vwMGF z7CqTmn2j#zFdM3-Hu%g+k4M)b*S?Mja|}bW%H&zDCW)JQVTm)`qxDlD@F2?AD{Ot_EPqQRx18;ungh_=YMS zsd$2b_;Nc^`|K<7;oZr96_Z)UFUaZWg^h zVF}F)MqZmaj8VI2UOn6`@=cq8O&z|7c-eJQ#Hy)yMPzuO?D%Jv$iXtq^PqOlv~^zT zb7#K%4q{%j6rl@|h?N!SGTVrADJ2zrlQMtBQFjBXn@gt!HF%<|6SO{D-17rSd;DmC ztNYAgL1jm((7}w4TvSu~X}2;|0cm{+6x`z#+As^AjTyY$_&a}Q!+!MkH0A?@Gp3xQ ze7OAUGsFXTDJN9g*k|#)!rFajjgl12-XYd$ZazXk{z|Ado<}X$LOeTtH^?A$DGlgzfYFcFT{mB);!p2T;1VzZdxB^Lc()%ZvR(NPYHr z%Ih;W-0JJI)#J6dKgoJw9v0$Udb~IP|H8~|AMotrwAR#1XRj)**RL1a_x!6E#oPZM znDN{Rb}X4X_og*^+*OKt`^MI`q1n-z&$gb?0_bFvGn(CW*)jUgo4V=5$dHk61Osi+ z;HY2Iib@5d!9Fa{y9UmmiRQYs9oLruMhg>$*vQn5@ngR@+aD9;5ab;Y5NQ3p9LwU( z(&F*@$SnDgS>WPU!$s6$2Ed>9<)6R3>hd6yU#+^-5oSH@rv`$Gsvy|@qqE6Uwgp^S z{V~L?$P(+M07G*TKq_Gv$#xWa)%C`DfG$F86Jx6|DjX;%sh~xdt@s$tvti8v2(f7G zI#SkWXltW}b*U$24G=5`lo)h5LzR3t0Vh&P(B!SraFE5~Hh}eJY7IZvWWRweK9lJs z7a`D{UQ&8K*^rAYG=Khi{749GLb{IbiJ%2E&2%2Zh9i7P{EzgB{2*_6NyQ_(KdLEk zv+xCO(jMLQZ9_${T!&NXC^KXY-J8{`QD{U$L~FH*n-Y2}1$)6&h{>Yj5f zSwPX1?3x#6>n?CNwSIg8O$G3wnXBe(Ui#h>{|%ZPWx7o{K( zr(b3tjFjg3mthjKa#C*Nj&v1RYN7?y>ueiJfz`D!E24xE}yL;3(_gMdti|%K7U0%Q{2U*XjwE$EKtrJiK*+&h<~@V7R0u zB?kc1yjeCJt~`Ec4vx1#-AviX`>Y+xu5)I=7zw~vr|id7hwEZyN<`_orw-Zf`Emnd ztA-(L&;Bq3ZRz>b#24wC!g*6lhp@sC_csbglQ`4TnVZm4U>aRRNuy81JH>67j0(Nf z#rrUnoky)!{*_m4IEy;%qM_v_pHEvm^1*;r_)Q~_7wKC)k8h%RPauM=u(Yp)Um^ux zzr(@^7lI^CvANdW+a#S!J1(*$uEPiai%aWik=m9-;how;#~J%JJkwqHW0lL zyQv*IZy(CT$ngeY?}tZ@zQ$VMv8(zw1vDWK6k9^M(m~?VZ{nYYElCf*@^VV|WtlDW zlX^6ls!d_KKM>b)n9DSl_5~>)3586>ah@mY%N-z6NNzAb1;O#(u|*vrtT@i5=v&cF zUbl_QW0pcXo=^>$cN8Gm+M+?X@A>o*(H=vU`iPR{ZY=N}dxOi7IxnMalj_Kk!#I-c z(eFi3F>wOqNopR|7#$SGK=n>DYurmO?9#DU&P7D*x7XR2XUl4>hz*8G-P$TJ-X-^E z)66Q~$I%s)g7)+TPLa_y+=lhw3-*_#;Zo^eVXrM;*wKO$Xdsj;*!ei+3$-A3?V{m4 zFvPBPGUt{R?3GaNE&V07&m&z)*aXxG!&Lb;h}e$f-YLh&?z{^Tnqkg)Rw?IHSJQ$w zLAAKK0463DeR3crJR89(ED$StZkS4_8ZWI@bot^Fhx%0sB^_-y^-mFF+)bI!YFe~e z3I=jl{zWvkIgb$`x#!*SRuoVXZ61zR$XS=L37e?I&@664-z+q__Xo?P?|*x?e(3pg^N8VhOJKET5{otX*3t>MCs-T;O-s&{3X6>8-9h000B z=twddl4qYNPBvGfTyhteZ3Z$S+%Ay%JU0kWQ?wI^g|Gm*@yeq4^Q*Bv^F_GGRPP@$ zFl<&H;28p@SLrzyVBFow2i{h~4QmB+DL75;!L{-1sj}qRruh{q>0?59vIg>=RI6=g zsaltM$c>ED{S$kBo5uX0x^U_tFBkD(QL9kXZqHe_Mt1qlqXDo{OrEIFP|`!(AA1G3 zcNLB!bO!!L_h&DXeBAo03{M6v&bK9>*-rIUMfU>*kToj{U5|GJl|Z$ih?G~5O=mX@ z`})>7w-bR*v74vr#Pep-P1FpEAItN3=M!XZ{g$chm!~5VM$la=Q}bJaGAs)^lcAf7 zQRZs;HPt>?)hKLji=BS`09(#5IDe$7G_j9ugiyG?3+D6E)en&2GWHmU;T*CPccDla zs0~eQ=r&9<^Nah64*{#Gd=cI3u?#+1d~}?dcK+b2LUqC1*(g-%2TI#rf_Dnp@f}&} zgol7^lq}xl3}kxF5=60wpTAos=JeV#5YP=}Oed%WJD=A}HN9-6lU1<3uKgnhA1$j2 z!eH?DlQj>=gb|}EAIjk@=se7|pOCq%Tm7;;UuvY$^=O73XZA81{=BWV)7umES zq0p2;=9s+X9&YuA9%+3kLD8gdr`k+Ac*)L}a{npR;N(IDZ+wR6(__p-DkxTLS9u|Fc!EqMmJlfwX}wq{R|J8tc@d(;Y(lukccP^dbS` znVSv^H|cPyL)!Z-BR)+%T)Q?JIMGSBRupqg!^+vLt%j=}KyMo=+^WPE5^?S0o8mBF zn-{&o3qMGk6sVGy*E15Fav7qO$t^U5q>M2m&Yb6)gp>-0O*WE6VA|KP4L{T`B{){l zH?NPB#Ujs*Csh)_JgS-if6=x1;=@i=dYr<4q{n&oV-bxx1D~Y1Y-F-Tjj$N~%dESX zZmbUKxlEO`b0;%Po>ZDtE@E3oBdf>D2=FYCx>bdcqT@RleMe*+*JqH=7GjydQfo4X*_yCK7O%j|0=VqMwibtSQ|OBwTRyr% zIHaY)D{nQJTz4N4nWOG7S_g~Y&7FT!76b4wS9``Bv;3$FIjUedwWl^t=QF7SU8Er- zQcSfkR)bWvdvo1o&6T_<8~__mIt*#7OLAyeV~xEX?)yqeSFipz82I;=|1Sm@*x4EX z7Y69*|3d@x|HkwF$1onIWF%ATeNV5!ObABhlUcbwMw)3KD=8FvP!^&us3F*c_SdUo zae_p#jq@$6e!go5akA2F>J$X5Z_oFu9_)#c6^9f+DfI!!^%0k5Ca zQCZvA*w)-$kqb5=W@}r)ESPTv0D?jPK#jLr-W_O$E7|UK1eu$=(fb-mhy( zQiu7Rll}NTk}TMCNF;eiBzy?0gf513tZQ*K038BY9Am05p=b5@(AEab|5$^KO!qID=M zVzv>-7j57&D##)?h1XsJ(Wpi~OBIxJPQ6MR%(wADRO>e+F3dWa=8}_C_I5XAIqs?_+vd7owoV&ar#g|V+s(IUx*UQ z*&>Al)b)~G^UA=ubWXZ5S^~VCaf!(pid^yc2&CgK?*ydnESi5^(tzV}EJsP{7%7fY zzLWdT)C5qQyu0bzsEnqAQym?Pgeq5%%S8{BG5o@l0iC0|5v+|g*~&nkH0mx%X~Rb8 zu_EuKso@o=__MQ2qh7S3t>kK9_6!jQc$U{-*K#sM%x}{&3P2z9jZaD2SFiZ=t9oc>}PZGAwaZi>NEK1keOeEvMsT*#HSv}l|n<12_5z^et z&A1uP3u0JKqx>H7e*NO-f{X|`()W9Oom>MKJho{*i^m-b1>HjX!zA)z{3CYcLBK8Y zKT^rCyFO|j5{>qVPl>Esv~A;`!L`<$!ViSTq)q{kH!^JO(Dpi>#_Ro=OD+JnFRgj& zgVYtkqCr#yMz?MIM*-b~z`s-rpBA=t$9qtn0k`=ceY}T&IXnRUBX@vt?r*;#WWol^ zJVLfIwF6Bf`BXOo%}Hl2a@&j3cTH%iSHmO$kqOUy{u$sUxn^5JZ5ffn^si0iy&#VF z2)_G2EPIt9NC}gkvVa?gTckSOYsa5=B9B`0jPMggdxYDjUli!=Hh zXH3ZOvM@oc^AkJiQZWl|U&f3Y>;*;oWi2$JiO1Zj+;@g98cf{Fu2|sCA@nE}%gO0@ zO|*36lOG@V3EcZcEeRp^tm*G#PgD1`)q8G;p6UL-Z%P%2^QHeNH`Mvrim*;N-)jg! z%pZK9pbB=LNUJM9s*zv>x@ER$%yg_E^off@Byq@_B6LDwU5tKGkStI~4jhgu5rg`t z%|9W#G>0N!p(|MmgQ;^6CAAs_fP0$uaTqE&}_h|JGZBm`rwlu zuvD=`+0qxq*ZtY-yAwzc2fL^osmqQar)~%n3vF6`$788IMWeM+$3nFXSUF+gU7}7o z6bM~-52=K!%az40sgmSTA{p#?D&_>6sT*$pvJSbd%WF>~YgcpCHnxlc*~$o&LZF7m zAIoWvNBY^HT(C zjG)Rn#JqZwMWH4FFXRa1Y-=xH984*wV6-pZ44;(9DV(M%!BkNpUx^oC7MCC zpW-QgG#qNGFhtEsfM<1hVYAUoBh#$qQ)$XH^;o>uo7{V;AweFd;s8nR@YJY_KL6fE z(G<3w(4w-SwZ>w!S@hmS!Fjf3#&Z4KNHU=bMvX=7J6=tpFIZ2bYywV+jG~WgT5hd8 zPL}KiUR_hjXN_7#@T8IxRGs18?2|j*%~-pn=ynSacY?F9jy#VJYrY!M8zi8rXjQak z5to-mU8QkRmKyDImS2_M3M&`iRFm1MR%@ZG5V~6j%Ohu%UzegF8Gr%Qf#3&~V|pbL zkluPUeH@(%15*v2PO}hh0KL(Q#lGeV~w5P zjHF(yFa&=CIi##8N|q3VVzmjlz9qM79N1g;~(KRfJpVFqO^vD0rg6*@MqUPc74vh%aamU2k9kaG?PK}uTYPwQ)d4)W$Y{rf zNCMLU~7NDM7%zPoUkwHO8rCOaQ49pC>4HeWO zKD;PpK+O(m?n+K``c?rvzO!1g++AoPxGK#r=g$lmeNF1*&(XTw;Ux%C{?Yg`08Lwb z!6QGgYTxpJ{_ncmR;$y%~9bg>3oUnmvxe+gaHf;~`g@3)6t568B8ZLzI{( zFnVGP&Rs4HhPp92_n6$t4We)6@6oG0omREm332l9TmWc1Wei_)^XvuP@mf2lpYEPS z6?~9a3hs)kO*6>sYIb1ovj+>P_K7*XY7PV|YrW>;F4M_S@~-G~Xk3X#mWH{aA)2af zh`;C&q>$<`>^OHU1)Xo2fhg6j>wu7r|94cN>5M3S&j8a0$iKis^jIah0${wy-Gp(( z*`%E?qm-RgcnN#dl=1K!5ntObz@e0#m1gZtZkth&hb1dxlz6jJJ`YO%xI&k_{`mcs zr&`|Jq2gVkGkIZ7qGjGhDh1z70zwq2Fykh5{dS>(;=^|bTU#l&gQAVd{hCCnvv5%x z{WX|X4D)uiLCL zrtNsofNzHU=lbMr(_n8gs{UFG_KhdQmmEnJHc+5r-7>ZN_*C8Id3%<5Te(|&xsXu| zV!YtAiV6D$>i=L_##=j3GKKi^6yy29ZJ+lk^W z^){@+@y|825!j9)i?+7EJn4z-Se!XPeeRfhOj7r+tGPQrUxVkm_MqQi_pi41ldHNr zHM%=j=aZ@)i}RQ~S)+@3+vy`eJ|EkIIetCgU#W0TXm4~Wyneh#vQc=x-w&a!pQ){Q zx|+UcHL{akg6MY5xMK`<3b)_atE_@TKP9gop^P~`-0C^RyT9%qi;_=KZZF^>lka;*X1jxI@PeHoSUmdtgytT0A#h30xu{CbbNs zIy-}*+2(!jxOQrPW(ry-hkevU@ysS4^d54k2JZmV%%kuaz@WmLvP(~Y5KG`V?*J+n zb{?0;*lH2fnW0P&`Lyh)s0~_wn;B`Q4oe9((8$qQJRl{90 zzl)Jf5)`^f{mDMG570%JYz8VD*#-uwK=nc{W02u-#GOx$e#ItPW}L=x z$nDsO^Dw!N0K2CgRU|Xs51ONDhuf$77%RI>T1XtJHEHOZkQojo{~7V>RETO}9msIc zKhh8oGeV`+IOX_(m=^Yq&nh=Wv$I?o|L0KpMhX7*2d(Rc+)wm|5J zR?t<|QB{aUVDJb)BcsV=bVpf&8Frgn?w=aX=NT6${_bG%DvPgl(^`t;~PWQ zoP~%Pl`Sexk4&ZV_*mThd^1+N35#)$lM?e;GX=mz!zSwT9FO$%!c_DTWpE9dRX%as zX*Y#eEDlLG@ok~Pi;*e|2Hpq{k@yho9kzO?BtKZEQ}xgr#1_HTX}=*x8%1s^%1c{B z6$$+fm`h|B5$-bw!?9;Y0r>`Md8cYEVdqJ@snFP^yTfLxP_grb9Di4}@cK=_lb&6I zV`7{eD4)z$Aju=|4T=!3rZN}$lMHPmyw(A)s>f*Vhxm7z=>*=XN3_NgPZ-LF30)4( z1IC4-#vsY|-s$$#i)K@H#qO{VT_LUyN@G`|DRINhbxKzC?Agh5Ra*z)(eDCB|=4164s2% zXupOkD zKMn8fVnT~VIKb9KLqV}p^R5o4FS(wuoz_ikI)E8)3i-m(-jUm4mFeevf%I7GSFHDn zeGCPnd{VK*YeRJA#hQ$+zyXHIwRDqHbT0k8B>A1mqlays=^wgx$n7*Yn%_Y#U)4#8 zOy4ChynyPDtfeezqO3^1QcE1yA`Mw~C8V~D-%ypX;U3^Z5IyXYZ?p8F6&+IOX0>XN zQs#YC(IKpbGHx~S3d)MAk!X(RQpAFCx-pcbZ?5$OA;+LDvt+Wt%>(al=L037FlWs` z6F>B~2}n6bYFyym;v6;uDd_YhT_z zphIE}ZqhopVwZ0ff(BK?!T{m0gMN+kVBP?F5Hx9b?1LMfv5EK33b2QVf%M$r-u3o} zi`Anbt-9?yTD8<8S{tUN&C#y+9bWij8xKm|;7cg$+ti!s=~1qrLbf>sv);`Ly6A&D z(?Z6bMW6H?pVjeNzm%94o}NMMmL{KeW+nraU_$#$&J;^cZxR|pOB%u9W$&Cw z%r-G27YEf6V(vx#)ao{3pAOyuUUU2Urr^3TA2lu^12%KB?>;b&tkXl7M~(`U@;;I& z88sV5pU3iK$@Vw8Ov#Br3n(d&HapnXRRHLd4`r6zZ-F_@M#a@EQtWk#>rEic#jM(L zzNb{Bt6Gz2R0j~g=a1xX)i*&-AENKy#Y<)F3mg-@W}`4s?h*pQyPYM4%3P@~2G&Ox z5o&rf)ftA|Of~RYIIt}$DUyLLw$z$r977YJ+7BGwWpcAePMkd6&F5Wh$^$WS+4ZO5 zlFeDj@nv2eun4kN3gbk~(gh;0ZbxY&MUENiZ%L;Q(s+p63YDCaLnr5u0}~?e&)pjt z6BqTCVCtlyFTgaUZh2yJm0JK44rG!6MBp0mM=deM_`L6n zb|Hk|{f^l?9S3XOSn{yobkAYc+Ih_iaImd8rt{qfxpk~A}Xc|+O@Fa74fKmlvblPYSL^%TPi zen&$Oo80ECHpWQMjFk3@ZQ3s6dmQ>FBp8Y0p%oFITnp0BUbQ30;q9Zrpn{ZRxC@ra zHM+yTITtQm%)50+%xMgI&`0UvHwk2bj>GnqeM*?&Lp8R>&=?hnZ-;-2Oo z09$>P-^|!EOa<%jysfdSFEw8V2;zhzRmx;geY%6Fel@C2H6nOVwJ?UiP9NRm3NMg_ zxBX*CH~ky7eY_EYu~E@KrU7Rl7d+|vtX~})VeQ^FX6XBhvt5C-ygIP<&guyhpI>|t z_vHpX6X&6K!O1F)1f;&CYUKTDH&iI3LI1Wsj$qzLPf3i)%2BJxxb6F;`k@-M0&+~;nkTs zJVtuSl66At>dg+a((~v`3hQej-|R7(FM&_FMSJI9zi{24ydWeM0tC?*c}(!uF1#Y& zbeOodIdorKYFA@J-ZJaxT=s6vA=r`aBmvjJHcNl0$bb!B=KK+hfAdAdk8U!M@EaNg zXy2aQ&S3IZV~Jj?-M7PMOga>C)?vmP;yZTQE0kp1FmGaqc!p;fKE9&yiQ_po@?b4E87^}N5 zp!XqN^4}BxKa8CNlO|lYr7NvU+jgaG+s2!=ZKKk*ZQHhORob>Qr}{>Gwp)Gr#|4z=i^Jp$LsUl+Q)Zc z>s@XAZ;0!1#*od-vAAx#;~K9WonFVIk}fF8sV)XX%C! z?b)=_Gq>-(QYTC@WhJ~)_M$iEDa=n~9lZnhZ}rsp9MQKT(;iW|lCS(4X1!nV7}6IE z1#i5k5v&jVS)+mBrt{R+5Ru&D12uhvM7XBre`LElPW&O%?Yb(#OtFXp$gf|gdk&cS zz`Y8s8uQ7NWRGbIC@z^%BuTQq-@XPm?!KPVenI{5n?*%?znsX(Pq8gZlCvAWk}^%q z!~DLJdrly~nMBPj9_ng1*3kk|tPZwu*x?{i5ADhIs1Z1Ps8@lT|51^XTYRYjY@q>0#JQzI{z9#8`OLEh1$yqLIgXAJp8?y2di*vFOzFe!4`1^pkS6dW8)Qg|!Cj z@?uDAHT zkbh|>fajFT`)}$%&^cz+jZ$kmTIkjzgNQLkAx=x=$uN=LrshBL&lUa zVh5mDrv)kxBl?2lsK1@-&gbGvduxYqO56P!kF%C&X~Ws~VlMI0B0nXql6F#JU5!{Y z6Q3N^iCjn;zX~CWuY)wO7Ab7l=nKkMgdPj}iFthquIApO7Kqs*Uav|Sd(=p=UP~Eu z{OgpsU{?9oE{P!+e^DN?7dr*iF#ETKFDrJW|)*i}`F&oC7Yxwt5kn5pav+N<4 z$VMi6Tc^gyqIy?M8}WXo7@>tahOc87ur(X9(YXM|A>gpwZgcC_?~z1vPgIX}c%v8s z1lFyU$MX`caZUHp5kU2Sj7PFfBM>qzH{^C)nbu(iqY@$bYEgYjQ4O7$fgm)k2 zHHGcf9dO-iXTtb%C1;;Y#|m)Fu#JBMQuWTdoe$=C$Ys-sj-_@!s@27UOH1<^y!Is` z>jg2vk1v!Ot-^>`k(paoeVeY<#~>T1Ul^-)QN1pJ9lLx6u0jA?6s_az@D#qQ28e(F zJ1%Z&ReD8Fr7bxI=C0h(z%CtQao>Wq5JbkjK%PW+En1&xavElDiy*e{6Mc)07l*l^ zN8V>wuD+KlfMnnG_uj(tS%c;pyDR5;t}LA0u6&AziWp$aq)U^U-QicRQvfX@Xs`MUbl(EkiyiDYVMT?)66#j3 zs0_k+N97)ZX1pP8tJd7nrP2yrN`^@6Q zI+aD`<`;WupI{}g{_AO9g$j5IkPjd{yBcUME+w$EtwZjp~i(Rh9@8=U>Acp-}f<3d2~W=HeP=_@|G2UQ1?i1 zo5cDpchFGDK$U!lUQmP~_`u;))yvew{vV zMH@VAkpBy@Ua%hi)M7+Uu&B)j#KXk=&-XXd(K43@z!mpAodeh>A#4WFsqezXC;F`D z_f9It6|~tq?&-KS#60Y|(^uO&KJ??(+JBn*|HQNzIGF$a?aE01|4e)SW+u7+i9 z26t|=FjUZ{u)#;`>$V4Wa#ccCv;OO*JeICE<)(DuU&UHL^#ivf@z$BzV{@w7C_!+~&q6-fX4hZsj4s z>bu>Y-**b#ZYEpClax%(FXa$$823zFe7hBLi0x^@b9tdo6~Ys0_&LskL0Sd?;GpG* zqGuQTduk6Gz0%!f!Kh<|+25xiisM;&^o>Ach2Z6=PU-D(I3u_vpvwW;0dM4bBmK4B zn`>k3(LQH!#5+@0tiG}WOp2y#fcB?I%>zqK{oQdz-tqT#(_IkI9ZH~I$UK-!h!QL| z1c(tvwcb+9!3QcdJ~m-Fb^Ph}XAS#rXzH*yw*wPSuZYH+uF58JaeD7*O_ZFSbV<)V zW^@uT;;Bmy5}FZ!nqb&3a+Q0&1(`R@!jIX{>;ot-XlbG|hWKRuq3xnN{1fo3EVKJ@4>B$5#J5;Lij zG@w=)Mw8`>=EOQeazHpaWAIx8;Nn{s*Ms=d(?q=b9}&MMW01j)NGRy(o5W+?k`bZq zj;eOyT}0(Yn#@2Wr#zkzgq_DIvwJ{rG+Gf^%oYIs`rsMmpb+r#q=uc>aXhm?~zhvTX zf*akfIE1`GbclBJ71#EsANPgFloW4)tA)NAH*uC;Lk26!WON+Xqohalb^ND&U^=U7amM z#dUbkNY^{!YNd_{{yLfV%f69uKVghoCGHK)y`I=?!1bhrhGlRTNa`K279*dKrtJx#L00VC}n_Pln-t2g9?p zyU3qC-{pPxC^6Hkxck3-X69#a>E!1)g>&EwNHWBdEwbf$9k42K0%uZY6%lVfJK6I{ z3z+Te4#^{8Q-aXk@#Q14F`WOCaQKCCwD!*wJplr$-o%=bv)Zc*yKNU@BvJpgMX zdmP?8O``T_T~)gTZrRElQcMg{8Y|&6p^{h<#3SWT^d})OE%yVXLmf8VSvth@2V;cr z=YDlDHlC_07PbUP9Lto(33$a|<{})zGKlp|80PSElg3(FCpfsUHB+ulw9XL*&lg~^ zO(qKpG_}jDy<`O(30a>(h36a7{k(HqDasbSUd-#pV=te5pIgJ%+)}7c%ptTYSSF=H z#}`?Xqm&faUl$PxUe4Xhm1zdT?vRxzlII{IzsXp*G4nJqz{KsOD&8wY_5gLAtE*#R zXE<3rsb}(MoXc!3J(Nve1aeN3BYaA8iSeuBg+iq}AozNUsuuV~)80 zk-Yrk;yjr#sDHy?qK0v}x`0Wa=PrFuNGw8e|k-$@@JI=IBtd+jwc6d?R?kDhV`X-^+kC0VOcGX?scv`%kXI=DLOBqVx)>?VvO!TnS~I;iN$d675$L@nqAkc|GLl3HQk9{>SSR~r1NOgG$fw7IHK(&g&Xbp+0HYDy zOb8hAoT5+32tCdQ)dC9+a2X8CoWdi2Kx%DAQ!IzhjcIV=s1Et>;GxWpn z298#YLkf`W<<3Y+_TbIEC{nr{^khWVr&V$o2wYU%(3vKeuDLR7Q zhVc-xM;H0sTiZF!^ZeOi{SqRd|4P+{`a4V@gFwJzhRq<|MKqt+r~HrkgA|=L;RDY zyZh+JMa9#xJFAEP4qBgaAc!WUnwG{t3hKai|6DL%pzP6fN$3a#&ey)ASeC7uG;ZL( zP-FYe5tg9-TT2d2Zw)7N6OFIu>)~nTTJ}4d_~U%W*DFG|`)mL5?NBDW+v`!zf-j_Q z!oxw4?rS}!gwJan`Nj6HQ(gT4cP+Swy#shDyURfOg1zv0>S60V=_z-;tvh$M9{{vC zd=qc>m+W+x+@7kYo;Bwja->E;((6`IW_Fm=M9aHudtH z<}hg6PWF=|PU)Jo{#=rzochZI8c9^=S<+HRUojbm5n!Y+%0JD*)ZY+y`=ft(ckt=$ zS@+NHmT+AT-{~FO4+mg~FWHydngw0Xu0&P%R~7XID<+$POVflaP$mT7@;uxjwv1Qw z*MT-gvQv$+Q}A)h$;#WR%4zkq3%UlrX%n3kAYu^wNySkVX2ZROa*Fw5+Jx@b1Axgi zfBR6@1vKnJo9Fsoq-n)IR`IQf3+zhP-X^SU>6Q`Exz?bQO8}X7l#IaopU4}9OrXY5 zqtXeRfC7mYEi@NmFWaTdSc+c2rc5FAx(^SaB=Bn;!q8mS_OM*3_e>o|TU|*%WrDOe928Tz}6j{7b_KGVS zQUZ9a&4QEtRxY^07(7!`+bzJ-bLyoQ4E+kv&m7CCs=N-4H~>ixx1ZR`@Ak z-ss9UR7Ro72r*8b)lltxAY|dkw6A0pf8MCP&XZA+j;iB2nz8JTVdbs-;lsVF++aS5 zZ4+%%RuA>FpxcacV*@CJl@B5sPV{P?mPv49gj*W+xVxn2d+fSp z2)yr~uF|Fm7r9BULpb#^lZ(6&xYYe;sQXzcRrgVrq)9Z~#&5`-{)|z~-$j;e^+i;_ z{pFbtm@uwHdA&APTqy&@ZldiYz95e$zp!1gf0epP)SreaDb^B(pCqApkjlu3H(3>s zbF(y%H-|x+o@XMK=xB+b=M8=KYGeDuFA1|zZX)!~ILlQ{TTa_`y=U(fySxHg$y#bX z&fN!8_;!MZn(*$G&vSVs!X&SV{HnEG%@73iCWN6q93wCzW;)bEExY(z5u3B&&3H*z z15DFCI3bapur7B4h@_4X7QuOfu{GFq_jh~0XD{z~35DB9h zsk|9Rk1|7AQfIdh+A@k7f@NZSETED%{Hh{3W|m683)t7Sga1*w+G))kyg8tqwu<1O zB=JHS)fahM&y{vYL&@OL2PJNsm%gC*)4bqv;|CtpA_ND_1X6|-)?B#(QAjr-91$24 zUqMh1KUG6joqy7X!kopz<;}b31ZWTPbuL&i1TszRLQVJ&EM5n_UDp>7&}$I*-Zd{!r{*y7gK$ID7&yQ=%cvZK@b@vA=h6<;8KonS^!9`Go?tH_ z9(Md(F%uXwCegWJ@^hhw;JEoXtvn~`HQf?MToy`;dAADW$FndsQ1<6A$0Q#2*JG{* zO)=OMROd^b$!MH4xa%M%vJ_>rO49^T5MIWZDP>|PDg=rLO{#pURTnuNZap&*g2ZMH zp}@YyoZNT`(`>nbochvog8}%M8P!WAXb5w+(fDt&0-eQKfD+ByECaS>2hvsG_>T$m zgq&%@%RG*FaPeN?ygG+E9c7|}HYL>FKJ1djgIxXy)SqUyYfO~l5u_7yyu|0YORArE zIE#Ix$>JTF)X3rbkVJe2Qf0Zyu1bv)Pclg)6X&qXqGz-=Aoz0`>IHtP(W@>ymyJRz zJjTl)wrXxd?cSAM;9k+om5vo0CiUQC_pOPFZd4V@^KZF~zJoB;)n~QkG1S3=>aBYY zh)lA-MQTG|(>>G%`N$l}H^^Ua0Y5=VOaYZ|+0;q;64vMQPMa_szEH~k6Dq$PAViqJ z(1bCy`88Q8ft zwu!+fRPucTt>@s0aiX{0WX8X^X`{A5gNw${q>|&b9|*n#dzs_f#r~i}z#H8pUaS0x zn=G2cLGqC9P&t}Q45XIJtmv%4g`I})I%y?+P3SCrTV)f&TtU8F94K&Uk;z9sZez{P z?&pPP+9kprx1+hZ7aaKPi>bmIE@Ksz62F@$Trd!kVVU%7juxc)g)>g>(?c_}+4MLYay zo|F_#^e17Y;bl@&j+v+TN}L)r3V>hlskl;X7%XmU;p&wIn! za+oPs8-hWgS9VyzPcFG}3J3q4oD8h-mnGb-WNeEf+MmZ6lIcdZ44H(xh3C&9tdxFq zD1(L48cW5)?&?0PQQ$OzysU<-xYS&8lrX=Dq?)igDrnj`)i@0+>W#ZR`IK3!sNC!`p5@3h`Q)#@dH13vT=>O z=?<#)O3dSA^A^|yNXHX&v*PB1Ss`S&J=@XxUT!KG`sNl%zD`Jp1OJf==bZ=)(;F6A zh(`58mrXY@by(}7kcL=oy1n`5pI#NV8j2%kG5to##sZ&el^^1_bg3N>MQtmjE4OBg zOcISqPW&v)Rls>o4}oC$M-ZB4V)@BW$a0U&@d0JV0K*2nBfnZfYWOUklQvJc2>RzM z`)bh>Vt$=N*lNg7uzqdKY`gVxmgt3wR`cJAl2tpMqB!$oFqcqT@>0Fv|_WCiw zsIQ_*A`wH?hy&`BCv&1Qry|5=0?YuFsfZ(ei{aW#M!;2`#?IPhDYJN&io|L*V-_d; z-qUAIyIBXWDv=r>IlmzYo`FXZ4N?Yt@OC-m>7;44Q}G>ZuSuBQXVW6(U~Dr z1)ij(N`yqY$e1O`v2Ol>`{YrU*|wEL8ZdJjEB-3Y^|dUP;RwyS^HVrt0y8d6^+j}j z;p5(uiVg1Uc$?L&A;-{8u(q)JF-hhnvI?f?a3&3vdS2V2kY~){yJh{Uk%(bxM~7_N zprl#Wz{xyiNp!0F%Z4gesSkod1=JU)K5j%(H%ZazNC}rz#h7}gWS-=WU2s5gGCH4{ zo1d267H1?zfdVC`Dr4YVXJmM#$+p`D1H==Ue-R})ibPOU9C0{Vh;xH`CB}6B*V;nq z(=Mh`Fb({8>1x_69^*G$Zv?JN%BI*ZCQRyM*nk^Oh3H`UBf^3^vbOU3pchDg0v;Pp z9FVF3qMF)8YS3|G_I!jV5x{%V5u)G8``&?O32a$<4G)%z@kg}gbn;f(%5ks?u|?6-u^ z;?=7zRb{jbHG904A+&X8Jctt`yo#Hi#2$M_r6jU*v)c)LGw&;0B=$jaTAfUz8EWIi zmf=f@K?Ln#gIH_yiswxESuVx11gHDc#pGlAhNhsC>4a;*ssR^MA_W4;D%vWz118wK z>6d3-5^oiC@k)i(=1ULw8oWi0F8p7zsI`f4P!5g~>N0a2gL^QtciiDCUo?9Vxg{_6 z!BGT-aTtPFelDdcz;dvBzxN5#JqN=G}Hr zvh(rEr_-BS@7^-JJe4dS>mY72g-}CDUCV3Xx1Nwb|BBhX1}lDm&R%VK1sj)7`lo-5 z`4M#p_v6}!{dvvBdQBR8wi(jc2sCK!wGqpOu1Uc_ux#^o&KJxrtdRbHl4Sp+q?wr5 z>HjUs{=u^RUy|%!ZvKChWL;P?5!7wBygmKLU|dw*E(3ZPF_-){8Qi1#W0Ygyf~>Kw zYdtwsNy=2t6^|dl8j}yJ7S3hed>dLjfA1go{?Gjb+7d`R4dl%E@$a6m&&wIU%&#e~ zoBNUNp4*g~Z?_I__l6QW-CKzmdcn?LB}SiMD_<^eTMOAgdOklEI_}ln*pg}aQ$7}! zBADF#-FWt|lhAG}JlS&8zHP3Y&i`Eb9swRuxT}qQ+mZyfYE0kZPS5`6=e@t)5r|*C zrO^4hd3w3O-?B)~$0C6`f+M4?{`mb9LiVh$=j+ZS7Qg3gVA{^UL|1lalk_geH|wjA z-auH7^w;8Tc8pkh=50lX`#G9hdI!*p-^SwvpKehEL5EO({_O;i_FEs6zWLBQNP9Fx zy}gJkj^6KjmS2aCR6W{D(A|km> z^Q6s3YdrZhO<8#FwvT1-t`Sf_+h}ywpCDl}e1DDVev{9^wicSDF;Et!IcxS1!HeN2 zr1z6luBar)ce9=aVHKz)l~|s^;jjE&k-N>rOwRu%JBsbnCCI+pAJ1~R;j!ikxnrqW zk2<%un8`(B<*pkB50~53#!Sk9G#-1$fAo4<8!EYu40N9i(A1mQ>9C`rM$+(UyyyU) z)5?puo_QDCQg{@ip*-@w@}qqFmF8V{FZ$z-uKf$qMKo=F61|5jYBQ~$68br5(%mpd z!Ib(8T&gHt3N%P=$zM$xT&67_EcvgB*rF9N70_tl?L2GL@eGYnrq3b>{#vskS%?6- zV1+Y3gv6saM!YQTo7?{MMu%?V9BOS)r#XzgPN0YB&zm_~K$1!XeIP7ebod!WW8@o1 z4q_t5ur38neuEyO<_ZObT)r^FXC>q_&dh>Btzsge%UBGZ?8oaXyi6uw0Y1i;giR$H zt*kkrGaO@H=dYM7C`0dPVdjXX5Gc7b1q{S3%$^V9n3;_pMO%R+Hn`@kvr>4W@XD8$ zY`e)C9r2WCRL?QoslJ#STvnWFXzF6Q%cqiY9XO+dxD^ohsP3Bal`78d`c>bVD-f(W z19TAv&cK<<{OgnW3VaxAzb{p<%RSwwmv@rp`;9r3JRN*qYZ)OW^i=Tf2h=y;RE$$`L}(mSXqp7xIf~nx5Lkc}21t9av<4!5X$=6qE|kVN z%Mf|3bdx(a2BZq#GBJfD|My}HmSR#%o7Au}x2Nh>l(U~os%!Swa4~I>a!Bb0IjA-b zY1`9&IdXh7T~-$EYJM)IShoRpsRf{fktrMDQ|gNCZ_W9sC6XNU_xCq*HUd3;rv*2N z)zh#cI`=7Hm?@D(@J^!F~$mjP-^ZHI| zrE-M&ir>*VEds?bT|KJZ^MjHp+@l<((H&QR*i?F~kJ*UWODm`&46g^` z*dD_BW&=?o+d?IVEadDGSDTz<_lVGi7ExjmmV;!H1`5^V=7Jl|&DIr~#u&E|)cX*} zg{AQ7f$m#Va(buLN$-%CuI!JoFF9(sOB)NrLapR&QqI8u)(_fnO^5(3Cm{IDRvlZFEV;@>r9Yyj1Hm1z}_ zKe61aK8MVbT=Jf|uj#@o8w(_%LR|<<cXg-dE1=cnC4<5cy{+f)d6tbk7Dz2LDPo_=eA)>| zY&mI%WjJYh7KLh2lB2RNR#{Cotx`i)$cHb|zQL||8; zK6j9gfT6pMlnGPyYLPfkW`)NELfnkGXk|75$7k!Y=RdG51>u_vgj#X*464$02gyjOV5Ewv)(vCg13PfUMWKX z5QdGsTO*jv8~m0%2tzhYk)q3r#N^EQ-2Tvakd>Rt#$lrz_HML0tDvwjThUVrc10+K zcjT?DrNb$u`D{>_qI3~9btv;sR`|Z`mVA+>B#?jXHQdHZi z)kKTLZ?G>lchemX&$xySbKsFpz)EyrjxX&#aA0C~J~;BEz2^c|X>%KZEZC}|fHJU0 zi-FtJp}bFd+-~Dx&YF;hUt?jonbtLLM=-?Lu7{36dw+V>WT2J50j%+&|D;O2N4^u( zPb$w=&o|qyPV{ytD{He?hk3x1ZP8m`_m=Z1(Em*p!)h7&(Q+I-nc#U8!int{fTm4y zkBi@%z+XP5ld51|e5s_o4F+^u4GJ%1tI>>jyMSDO?PHzx%O3KpPb)-&OXW zldHe&v_O^`mtw}Wv+}HpE{Rvy`+k8#2w_lcyiGr#fRjm-o+5nz6#U*b zA%usqd4gkOUPwT)+cFG)-uZ!(o%EOuCpFCZP``Os)BqpB>wJ4w^L|F)TXL`kk zast!2St6zILyDR>l=YxiTA!0`(bCr&&7Lq7HgGAk0Il98ZrrAJu_UJmj&#eqD6MDw z+}yp+$=t$OZf{Y9njBf@OyZGK-y0y#qq*&ufD_mq?4dSH4_((mR9!eGx-@~$2-yyU zcDL#cVY9J$WAcnu9Vw`c4(Lg?q*B|^S7|3kv!4ErX4Yj;(NWwi{ZIyImEzT|eKwyg zp>nt$7i|o$8P7W{K4pC-{`t`nK5rsVn*W2IgU7m<0;DXS<`}xIE96r#PkkGk(8NS* zoDwrpjU?0zz$UD?z09)I4&4OBen+s7Y{C^my3sXv*5Q~Y(Wb;8P;KeU`nlZ|#iara z^A1c5kc|*c`l2aM=>$3#&^YJbaGTOz#fEi}ukoE@GQ< zp~b09AVim%qOr+^l&DD~$H2qJgfAIWT0Jb^Ezf*ion1X2FB}qk z#U#IvK!?fQ1R(<;$iV&r6?K1}?z72UfSPiBa{4zN%jlBZSL zul>PU2ZeWJ`=Qo4b=~8oN;_=j3I;P=gxkiv*k~+FY#uigMmz zt)qbFT*(pC)KKEi7vj}73UXob!rG3tPa#WuGNhEOI|O0;Q=EKV!TVOWWJQ@>CpEo+ zwp*(D3#`S^_{F>Dek=s{-E5S2WMVh7$Aq9)oEEp99Ag(MxOBKTW>xw3N`C&+4~D5g zRN6DQ8?IVt0YUVN&pj}l^GJUq(O)Xb=+f+l@W)ENyy28!xETb@GXxuL?cxe&J>gZq z?fl!Oe%uD^N#>gMR9~tEHlC2$^~N+4;WES5p(?cYHj(5dCkzTzXI6#7d(QQl@-+00 zT4l=VbXA!9cT5>BUjX^351Ld#F|m^!QglLz44LSXgu)OdRab>taMrj$29wFclm`uv zgm!BR*y6he0#=kA=I$r$1% znxn0dc(@@Fc7a5Y;Fc0bFc^1Eyroz{MHJcS9?}6aCOK?+&xTGST-1Ca-PII_v8CX5x8S#U7G8CpMMJ!@CBQ3jK zfBQrvtBMgB`VAHap=Z*hCW7RmboQ7R{KgrYh0-1D$$r1ZFs~Mnre{c&s{?mJVzGys zQIu*an@ct43Ov>+QxL>}PZl1oxDFF&l9hHMY00N}jt{mh^z6}o0z{&Z-b+XOq?tOF znjCSa0P_=l1!mQu_DaJ9S$qDn+Kiba=#|}uT|fa#WD(p)y+W~RLdOqlRgQAoQ0OIU z<}Ik~MY-&UNE~Zc9Fk3NHF1mTn@u85!0Yqll&FM|HbcG3CbO=QK?og^0|r!8MeGwi zWo8!E+J=B2&t~la)ddGOb3rS7rH+y(u^=f3nF^`LCo^OZciEc|sW%s+uax`JF zm%7ujB31V?z%_D{HO1td+FGM)35 ztyN89UZ3c&~l{vQKTB~Y3KB}0pr4mACHHl*7VO?@E z*txUNhUUV!8yT#8Q=yqZKYI^>oikmzwVgJJKj(@B1EpBI!(@lgPHl2UONroG!=p5{ z++U336(@vGriaE=nd$-?@1dwE$JvPomXR+3FNMIu(@qr^HYGL<4-I;};jQ|TK!k$h z=C!(+m2-ijKK<;O3}s3O)NPDsSM91^Jk{rH>cbHTnYsO@QGBytf*FK;W5`9FWfZEn zRV`QcBLQ6rhc`C>&eMU>bLp77)HIs=`8{oP=kcd&d50-fih8)!?Uf-su-P#I(o${d z)zy`DZ?$Nxm-T@RCzm1tZr(u~Cx!B6qZ{(Ge-$;~a3lg5=K8)2XrS%MsjE|;n-f_& z8?u%IB0gEXdsPdw3zIPF&(CuN{$?h78btqCVOlZ!NUGQ^w9pkB`s0f{dfFlvwYj0N zn;!q5M=G~cZ+5CLO}hJRzhP|}mZP7a z{Gm|TTFsv8l8YnP)Z#;K{n%0Jhp}7s0>S|f+-5H^ZI4%-eRP&XSgqm1s_Um1@Y6S; zIO)>^950mpb>#PZGCHGlw-QWyY8`EGPexSurl1f6uY>vDGiyotmuv9f+vdGVS-XLQ zs&~EMz9>m{zY-2DOXSEkL&7*-322hIJN&U$c*6ZLnW-B{2gV~Q@NY!SM+p-qP7ui0 z6e}1Ky|ZDZ&T(BJiuv1;`RC8yDduyBI4#!9T+3VFIM_5E&B_PLK#Oo%z_>de_u>-? z{JuAcAjm-_`9EZDf6hRyC<^Av8MP)8uC|8jYrw;0qbiM=4hYAygg;KBPPhg5;f_O zk7!_?Jq3>6`U#-R^zA|nIMs=y$}Ol#hgz16#X>1ncX}_~Ig{XhDmbRLlF(*rPy>Qt(S!pGZZm z`j_!h$sSjKK4-{QaC@AEKH~d7R_uUS9fh=yGo} z)Vs_0P|RB>F8;!7t2s?_Iu=)~%?i@B0bPt6`r;iz=pJolAS)R=8QKkut=)5FOdYO_ zs<_3znO`tqEgApu;?O@qXhueMj{n`KnEu0M+5fN8vg#5Q`=SWl?`kL9dPNl;3B8cN z*5D3U#{zMJGvlQRjDXW7K0cM5%h<{epLGHRl0C|*|2j%4@LMeld|7A8HFhUB{CplK z9~9rZzI>k_dG7$#+3S&Oxx2f^n1v6A{;NakOJ?DLcApdO^z31u^KMT)h=-@w1(6IW zTIg4x56B!&-o|{0)>G+iV)*%r?owk$bm#ptK(=l_%5}hdW3_GxaM^~_FwBdDuHMe; zO)C>A&*$CU!0DI6TPg`6ke<;MOmkGN3`!$oK{o6e5Z+nwk7{~3I^SjG=tqB>3vDGr zB7Y>PX`jz!1q1g=Lj}Dma;bY4hkY;}_*$%6or*Z~P(k3=+@KG#H&{dZENyd8>U6fl zbZ2}zoP5H1?a@fCBs^-vK^<3{#s{mweecFvi3nki{l9u%C>L0}?sA2WTtx3v70($w z{bj!I?Mdxn43fL&vV%z0k)xs!XBBKiDiC$g#Hxf8q zCJ0y98C+OY!mXq&dxLKnvs*^(fv^|qA44(KtvW(|3^8ZDaff4MKt5}ib()eoqBQ5q zd)1+rvR~=4oM{K=1pN>_Xt1%`n2OM%f<%Mf!esEUPFLs1y`>8iRDeExl`tbBMV)?g zTjmj2&03U2%~OK*uAMebicZ5L>2NDW)F1#e6O87;d#W|lFt?9LvBgf9d@Xb#e#;b+ z9QEeuCd(ae+>7|a5(R>nAzZ)-e%?>7j|iw?SP+HE!#?3OH?)dLe0XA5oh$~COCXz+ zkYsLC-#B!ZbJ`=GeX!)1XH0PSOyS+C2*ZRLN4b6q*pRao3O}O_O8ln}0xA1!^HVm8 zb}1K`_PGm`%N7HMWHAj06gs9c;dTV0ic3gjEOiFqd3SQi3WVJ3UNoZgo}+&4jdWI} z{RR#j8mDJC`=#rg*g1+t;FZt`OLC740bE8p;i$`mO^R{Vr*jihVDIEu_r~F~WNBon zJW(iK^ZXU@I94;L{07!Ykst90xbixRh2Rh&y<~_f8C!S#I>n-!C8cU_He)j3MO~RReDnRsk1c>yk^S@Qz;Joza-vDp=rFMnHdUiGG9-}*e|qb2Q}mk1 z-J0jS(qdk5d5^)&=H#WHfP5xl1P}HKwH7IAH9)-5c`80$xDkB!55s+wdPX=YO z0>&E~JAb~SowBTY+y!mJFID6lF_8J@EW0H%{&5gg#=B&2nn>*w-t(MTM z&L;JaqSFMsOR&59)M(b*r&O~bKS*s;;lFRRpclf>S$g3Rm=1_0jwuVDvYt)~yfWUl zBPe44DX1qjC!WV4#8#0hpmA2<;gOOYj(Qhmfk6IUKOd^ePK)#H2^ZqOu^y1cHYkS? z$O#~_s(5K9Lk2%rC3_kvQ(92Ea8G`_t6uvtA>CcHvm{#NV`9xUJO(Gxa3MsCDp+?~ zPSnb-VACt*MK-d;>1y#y-8oE@YuhyfZHWl+yH^v9gS3Tt+iWIhZzer;1MsrZG($s9 zbM^r!pGg^z5^WmCp!J-c6;k5Hjv#0qij0jTi4EL5Im7lKevJRm)jh*HF8**uOR*3KeTh* zfhhWp8B=27swvQ4{~j>!8Kj^hEcNjsZ}ao&e7*mrAlHlh^BT^O7rC4k@}!~N*-0VG zIXGs-B|uFvjLnx|>SrA4suC#JuAqFv@#wzTue#h2Kkd3BzArcA-7k$jFR|`hv6W|Z zw9(ZHujb1y2qS+00fXXFM^&Mox0P$atfxf+tW^ zc~m;?KAo+0qcf$28HDs>0T1o|2Mt3BsfO9QOpKKz)nSgZn4#f{P=szosEDf~rr-ugLt4*dT70h6Ac;BXShqDGST>WB_udC(?#x~Q0ZNhEoTIvNf}L*qb? zkKaEgMtlN6hZ)+)s7!RH`B~PCcKx0$#cF-~>Bt1DJC)~qzoFr*u^?Q~uZ=N}#JWqxUX(9u)h-^TyNu1K{T)hZhX+Lt33!@5DNoiuZIy52h z;;kzb>2L?tFSCIYO)t=5c<3BOn_-EoXz4(D*p>kE2QcU!|8aXNMp$wsSJGH;?JGlB?PlxCJZ#oN7N!Eq1Nc$`BGCEga9)I?HTw6Ryr`?zl` zRF4*dKR{gRAscU8|009OZogqYtfBhuaA$dVUTD7+X6z&Bl;l8oUpfpeplJ|jjdq8> zySnRWasDi3(d?iU2vl#gV)&2JqfNEq)zb4016iHLs-pZd3PW_{upQtq^Kk%@S|`@l zlTYxP*QVZ;;+c+{l?V09?SYCryKxF;ZS*Lt8$BU7tdW0z> zi(7q|6=&GYx6Bm3nlro9Ac&(bAnDY5zV+%TYR#{@%*s8mDtzu;Odi@xLEOD}3cZrw zg@^lot8J95qjnPRYK8QkkT|R+u*_zcAV)yp>WlfS?A`UmTyi z6qh)aSwlb{W|Wm!7!iW&Hm6>w51v9_r>$zifo;j!r zBbK4OmUC9kgkV3$F{gg^utcS{I)2rWmxlQ!4|b^NGQ%GDSsd#x5bbp{xB_+VL9_V? zyVbe3U~oO9KpC>6NibvA6*W6d!xrSNPw}BxldXCN9kR9Kw ze#>pyU=WUSX!IswWoepuv3+B30n)WpA_?o=L`;x3BbG9}+Ow!kICUv3iqm@`#+c!x zA)M&4e4h0iWY(8Bk-}kQQjTV<+3{62&iLDtxoV>jElJoDiMI{;_)blbz3*tRCNZJQI@ zwr$(CZQHgc$;7tpbv);I(54H?A_g`s(06Uy4GHcUmSyKBaOCAyj^MQ z0r^9cVi4^F?j@2_^s>L{-mtDvS%Ic(5oj99&>sg?o1X)r0xXYA0j&6Glx#@`^Bt3< z5;g(v;EbCsCXRems6XX(Nnr;zvGpuu4Eok3T%x#AFls^;>polr!pO=jFRj&TcFN2u zw|IkQ(f&YqD42f-SlE99@>IHKa!XZFLf$Y7{Uiw&at2@tbL#bML)^yos13Bpo>&phe zHSpEL@T|D7s|__U?fvp^!}h_G z$o|pR6`Jwx(L5p*d6J__cHhK10o4xpSk!2r;u5Ws-T6%@m&vty%*5i$s z%HnjPMJzU6C!ZgNh&M9-+ZWWoflUkytpCYCVfy!9_5XZ9G5udT%d}EP)+Uao^mz2_ zYz$01Jdpnq8g|WG^mI$bHgPlYa@rDAQBv7Da(r4};AZ5ej){)rnjaNtA(m{Wnn<>S zSgSK!0UrS+{oz1Gg%y2141b%dg`2F4o4*Ylc>$khgcMEsqdw!DCxaBKvf&H>&H`}{ zr4LJz`^|exMM;aBk?qArvgoqC&;^;Jp!)l0lI+kN|(*}P3uTTXZtHTT;5kg5lK?YseP)ARB}^UX!?14XrGXX=U9{jvG$jckJMoFrJy?IoMB zG>%$|apF=aoO51gt8qFlF$Is$oE96PX^>{Mq zsWSga_rqItlBT(Cr)`9nxmpIt%G3N8yftF5|F(E0fWMz20 z$8*~F(mlOO$2EOJ$t~TcxAW+JL)M1Z@oqu0pgXl@Q{D@6v8HAn+tTl#WUd~EMut0z zl~a;ufu92>G#|Ku)R}88BuKddW9C7>1R9Mb3& z&3(I$OFMJPY42nh_C#H%=nDDr1b93RczWQq;SOB#0giNq`$-rcS?on8k;z7fy^}a9 z0=M2BP+qyXdPv=LS1n|C5hVMSPz8vnge6_w zepxbEzgs=kOS|c4ea*sz1J#5?XYRGRMDjNdj~TZX@ROL(2GftjD7tWg5d)S5;`|t9 z(HtbFK)k-7*FQbpH7vx#_ak#M#D$$hT4XC{+C55_K#$>J8-3 zkw`1{OcT?XfIPLxol1%-Nu5kq?w*?=!tuS1XHu?@2m~t(EobYjd!fVbZC=y{QSpcI z;&Ny5nQ|og3K?e^g6wZ#8AEozvrSIcmbD>+9gC##IQDmNK$X_&U+2d4{v@W|<=^yv zC0Yzq{%uEnb@ZfB(UqNDYZvkOiNJmGPit;U%&wh0931Z6tV;k48~4qxVp)rd%r-U$ z!l)wYXk)Qqbhisx(;m_Fe+J$iADEN%c)#gFAiZjRp^^|OOBIpMu5GJ)?mdb zz|}2Y956)gIOIZhPToM0VS@*vDBdje1oyw?BF*4Cx5P2tN786>B3=ODaCQvpMfEd6 zv4SBA?{}+j6WW;Y4r!_q)~)<9-6@5N3Iy;sr)Ak-O+6Asl1McWh?cLoTd*X}I7w2? z-_un}s=lIZKTbO|Ec@baOac#|tQf%Z?^9%0Co4N;tR)o3JIQ5MqL70OO% z9beM7>z}s|-lb5T<0}J>Mrjimd0HqhHip*Tb&W$ZMo(^oGwe+HaDhkrV%pgdup&|R z#mOY{za;fk!&;Z?0LuxhD~SGe%azKRzbx)8LK8hXhA#HMevbHXFE=i(I zu}pd9T*!jNk`&BPFdmwo@xTrDtnJd(eH+>>TIJ={$&43fWIW%r;!*&{qc;G0V53jl z*gHz^aNTi#>bO@hG9d179wKa33sec#IUFiz@ zok5h#=bkV3xBoZ}-H7B+)o(tEHHjkfJAgVYDn;0t>sWu1c#z8pU39Kz%-D9K&~{gO z2{ZF0Dyl_Y;d$X#vm~kt(`;lVzmz^9-HJ)=VnATMhn|_c{cpM`nJGU2RYxn8PJ4o6 z7PVtu6l#ADeP=%{93fua;VxQ;x2e|3Izum092ZIpHEE^o`^gR+DbN4zZMsI_YfvVt;;0+4IuAhVHe#ij*I zDztEeRlbbw4p-5F6*0llNp|?{hVb3;@`_|MhZU;Qt)1`Ger~Oq^s;oL6-$~N&fi%p zI{m5*ofTm|K?UYB`m&(vk36&W5yx+nU!c?$uptqy#pQ{LWUkILcU@$tq&Q9<_$S`r z(BU$EzpmVVWVRkwI)N!9T?U!N?L@^c^Ldq}m`^8QWy9HcXoYS)uTL`yMd@?<`T4>3 zMGUHkETUmEpQEwKASBiwNrT=K0f5j2j0?Q$3gddvW2|$@CMGBd;oHhfqwT{o`ciXN z@k#j#3Ly3O{@CrmudACIpa$@*1<8TV0fb9N9MYwtq_)sk+%;#b?)3))Oj*v^jePax zWztE&!7zp{J(Y3VjA9BAB%*=X3(+V5)6j3wR5R0^@aI&N56_g}?!RVZ60skpQbz=) zQ>eZwS4L});7(an?0=eSSaBvXRmV>?oIBLn>^z98nwtqNrdnY*CfVj`jhZaHTBa_z zlq|MPwhCI$&~iGjr>~V9Tp#y@*$8n2wWoEFDSzTPs%clzD!kf^dh&*ldaC(jlB)0r zsk(0dnej)r9h?7g6Wvx+orr0Ysu_3Au8%cPlj}=-dYz$0u-c%mW-K)Xv@o+UOYqEn z-Pm2oTI;HO9h=c74KO$x+sVP7r}_au|6qI}Uq(>_NO3@TSCwQ^+jK$={`^{?LP`qk z5iJj@lOdVPPi!kepT0;24?@~t9JLPa5Cp!|w@RS4OIn_Cnt4HMBy8zHb^ivajiev= z;p8xHde62-;@j3CgpEwjV(FA)xvtT$Hw$yYZ?6BrZIqko2K;~zBQ~j4%+L(L*#6h&sdr0I)jd{D9eel15AMD_)P-}kKA@1-gLr-KBc}eSbS^c`0^sg^r!%K zPCA(83nq?3CNJy?;fx7QGJG|NLeyeFis&HBVg2;y5^DVu&dES0;m5WRio*s6VD1q) zIg~~@s+gby6eR2Pa)p(8sky}ete2aCKyEYS4|?=HT?_H+q2$2GoDKCousP0S)olX^ zi;$|tLC5N05@V4nAo5gw4X75W9m4P5I)w_b(wQs|8^shJ&#mJjumN+{j?{!@v4FR2 zh?|Qilsg0*1KWX28Rn9pov!a%V&t&VGj!(cB zSr6PDPH4b!kgM^-$%TxJ&#Q8??!BR8nezIsURm>Ml_`47tNEF3$cpb*u+6mPcjTgQX$nvc3<_Im^ziVh^hk%7>NSb9 zO_?yK6pkLtOeBUlP1NTd5uqTGN$U(~?f?`cjuKazmg<`t=Myz63!cDXr@Zt5Iqc3h z)W?z3l5uk1D(i(a^+sCrFgmc{@b(h)@*j8I-T2`SLPW82WSVrk65M{BPq)WNwn?*yeBKD2w1wIG^46|9%GsQASw zH)){b9ws7$yW2v7skTtX-b|aT$Oe-^NXoj&N@i`$K9i!~ z`5J|Q%#({$KPPEX5rhwQQnNkD{!H0yzMcqTQKY(qT&Gkr@7z&oYPG&7G#HpdFu%^8 zhx?SxjW`5ZT&9f3X?MHiJYFw-a9Zkr_PKHW+RU2f0PdmhEH%VaMTJyE@rKr z6DvX(QW`OPI3}PBJ15vr(o8%wQJnY0T(NX`cphN}iE7R;#<$(bgx$&yd?^AyAv^?+ zZ)l&$R0$mBByd`JGgyZd;FvBjeE`_bsi+-;TVfDpMSi+GGKi7?c5m_LSEy2x_F1t! zdE(>x_i@V==${CU54SH!59rE|v&o85Ob5mWyJ8&r89KU6OD2}Mr$qGuXoo~s(mm(? zGm^u;AidnRY&eIhv&Imv$5_m{H*=C?Fb#q3Vo5!FkG!=5eV?99R_IaITPU2ATRw5u zcp~qmeeEu|)V;QMf$ZD${REitdi`A~@IXrU;&XHLO=a3sSk-*y^eN|hJe0~y1{*`A zseN|+w$4j7m>6yF1z|*Ifxx~!q9oczCh7iG=6U>%Wy{Re49!O`EmX#6Mm0JvIbSBt zWFg6+ouR~WluU5Z+YQNGPz$U>LySzgLWa-QvjeilX~Dot8D-WZ2kE^5#1eCqocdg% z^+NS*l|cAvvnISXh6_Hwj_}>zVdiV~nT3=>rT7*g%T{g$+zS#xq7s040BRFRz_$gd zy_w~(GX3I!zCeD|lSclLS8okN^NCggU=7H`7AM)j-f+R7mEy!IaDp__cK}w_h_&-j z#+$R^pF@!3wdqX67aQqD8s+6Oi*uwT4YO{Wz~&uDrCHPu{1ePpbs%u#w7>(+#}**!pZz??rMJ9*0Hhr+Ar3Va;( zbx}L&vZMFQ{?1*!+j!*ibY2Y%INq?LiH_l|WmKAP;zKdaj9#`JW1Tdf)%+&UE)R$H zvSTnU%8aAKPw}+j%F2esS-S7GU+HJgNpWvkI;GRkL~pOwa)!lLERx^cu)L^Nq+p2F zRK!??ZwH1LNXu{s!oin=U@)>~6(gCd?8Q@DzSB_Z^;qv6Bc=A%3X9xde!zvCy{&um z%yDqlO6I0+@i2d-ru?|#@!3y^B@STjZ}{osQ{s@z_ds2Q3OQj=UQw2R zdp1*><^0x%<2>brb$P6PtxEMaIoULW_#-AVlFJ!eqiOJpD`{qVP%j_FB+^4!$KcDi zt3T5?8&k}wbO}HP)nnKYeT@u$WIZ04-@uG7Xy%CwX!C5SQb($AdH@W#{puw{T9ztDe=4oS?g->l0K_&~c_Qj0_CDE1?=?<5vzsXE2yXH58h?KLf-$lB!Kj$Zc5!=* zlmIAQ=yc*YlO90_P_+krL(nzo2k}4zgoVjcmgHPUS^+cH*>(BWbW^WYr>Cq1@{K;6 zE4CbM|IIW9P+_WW7Iq3xdm=K1|0A|G7FfcBB7TxzQ)QSUNlSWGjg?mRPbcU=C7+nT znjK1N7PMxNigdyGAV*@U=9-$Y5wT-oTPk2G9yk#J!2YHUD85}{-N3Abfq8i@Su=VC zYjf;bqv(YerUz2;k@X}!oVjyI%3 zD|C!y^5sA%t3O``z$oTc&>#!I6)>j>10SF`QkKFv5cG^I5v@|4i;`efz}(_x8GC3h zBQc#F^#$5J-BOgM+vLPS1@2|K+N+B7FdMdkqp+joa72t&j-UEsZV3!fB=6oo(VpE- zwRhVu{oW*t5H}0oRPpJw2fk6cYmcEJ1hvtH3UQh&-J%W<5&RK2#>D}$vSPt(~%@T1WN5h|)up|&VH zf9pI<62yvjzl9}Oyk9n)7ZKq{m_{+|AA(4&c0;c6kd+Dr^Pi^w5hnZC3ZwObI71LJ zx~GXAX*IL9G6kHeMZotuz?D<$*0CWH>EtrL;N2*B(WdSY0JbU1>5Mq99dCi_4}2zg?$L;z(# zwgVV_A9s|r2l;U5Y$D#`cC2aJl1%*Zy-(_1H()NjLE0BBOI-+}nwf~zK5$2_sY!Gw zpy!^=E3~v&~u@L8jvnSX$I@gfqLK`r60q#EX=Yx%gotIBLXoZV;SlkeOsd- zdM=0cvV`(==Nf)IoxGo3oMrFBTaB~x6ESu|#Qt#B8+juxZjMO{Ik0!f?n80B$#KJ% z{(K)y(PFeUOQ&>6S6&7 zSOLotJB&Yfhn?38S6y~E1_K<_lRv1J=8^4t39D+v7u3`#L$$%&VuEBOcgRm73lfMM zQX3Kk&_h(il=XXFMGoK>NtyhD39(EIcSl8(!H7KKMqWh-uyM3CndXJVwQWxY%!ypp z`grbn<=dI6f8X+Yy-4&sDk!bdsIe)=I}{SZzKrX}3Dy_PV)bQdFwkl+kZYUOtj^K9 zwuGTcWIm&W_8 z*LQ-onBw4ogEBBl9=^s<+*oGWK3T1qJip9_Hf6Xebgf4j6Pjp#PA6!c`i*mYKsgnx z4h_p(A;QE(FlfL3_Ga}0ht--xGXakTQcl%K1DmafvZ2G4SiH)Zzb>*;PuFeS$M+}3 z_sK{&DW=}Q!dOnldS~8}7fQ|EUhTAO^*$bI8LI3HAv*UmQwinBBmZ<31VhGIQ+7!) z5yn3Lz@PljBZH6CH6Idf?@-}(J!GrVV`hzBJMG;*N-PW|g_Tc9=nE|T&mH9IKOTbB zy*@xyeNAyXhHpE*B&S5Kxtv#=l5wKow!KoJ?Br%zGZ~G9{IRYz5YdXOFgj)Fga+x5 zjNr;Ed5iC^v!-NzY*4M{yzX;2(iUbgmK=pM+(S5aneo*q3Nj0O;G=&0G_>)C?Q}U) z)5hDtevUrCj2PSnXKDOC-^v0EAu2ispICRw#_pvoJ=JjWENBYgh=)3&L>e&@SB3r2 z7M0{twbp-h%A%{g>R%eW6K(e`EQ{!U7S^PjIK;_484Ia@x)JtGf^(j zGOkF-BU*1N4wRA9oFhAdxJ0v%sL99L2Fc4pAj~wwaZYI>k$Einv(DD>i>*p_P|zZZ z=%sYY@{MAQ3%tpEX}1?AHD)(U`-l)eZ{U%o90omZIjHHT{Dn)AU<=hOJ+kxh3@x+M zx;voK%F|c{(^YrQZp#$4f0*vLaTfpbYzw0%Ck5%o^{g+=XN5o%#W0uZpI85hW?a}v ze&6FOj0i@wzi^V2b{uUCn>azd{(zS|Tektg;5ug&q<%*njC=-NQ6tMz@N4 zkcs~Yq(9@PemX(th-u}7MZ|d-7;=U`Lykg;WvUXD33?zw3JP|Y{g)|*(zL>Zj4Vj( zk_JjgeO2S$PEb&R(R-*Kom9zbt6FKDe2vu@_2#CfHB@JK@roz=xcYQJ3RT~eIym!s zh@U^R>yexM$Pk&LV&DN!r2a@EdiF=1M)-4)&2ZScst z9iG*RN|;oS6bmYcE#u@?j{ooiC0p9cx1R;E3`&d>uq(6688lmU z>|)z%Cq}8GH$&>f=T{~<3&NP8Hv6OM`lts1C`lcFs6YoghZ1k7R*iP6AVcB%=7yE? z&{_6eOF$#u#}u-Fwf>lr@~ltep_S&WhBUw*btXytM~4EnB|#=?d`X~=rY=R4RZ#tS zci0ru-pqpQXBQdZ@vH;Rh_x&5iQgE_0-(~kbX3WW_BVr|?{A)DWgR^m6CGm~`lI+Z zv;F$`{HNW^P}M=Es!|t$#9cS1^a>GLh$$GSPuQM_S&df`8kI8wFK}@rnYDx<0b1S` zOHM#~JcsI)R;z?9sUnHt&&i%Jc?MuX8rk3B8InWf3VTFmoiZA6wnUWbLvk>6v?J`B zBj*f6`%!VrXvLmMew<%$Qjt8%5jfkzgBeio=R=k++4K_gwRuLKvn(9g+E$67TCL z?PkWv@8OBM+(0l@%f$;~+=*)GK`p;iE_lpUJY#mKWC z({=;(RFRWHoAZA==oo|H4^?qGk0EOeYaO!d5R^{$) zj-WhJIDFAw;)s*-_1ljADNQ0+v85*ysIuT&`KW>^3tphdk+nr}HFr@cU@%DUba(V( z9ExJF!F+K1jSpnXrm*l>sYm&z0%CQ?0I2<^j!wwE07%jL+_?`S?ns;ch%+|LMVp3t z*b-DEB9A|=kxyg?5yFLjYRtN&jb3&$U+|#aZ{eU567!+Dk6<>7)>4fMI5Q_Sr3Q9% zbe{JcJKM^uod26_OuLWzC@{{rJj5Am*%KV2njZJRth$l)n8;b$|KY%O@z9RrNbeb1bkB9Vlo(EQhO?7cs-f!0Kx7*& zt(!LD*#x%HiMUfKj@gmiF(HP4r@$k~{nTUX$2Jqr-w?ANc#vqH#Bv`Z1p8yOMsrFY z#tn4}HWG?S3*KyCgF7)}%zz?133j4wWG`E%3SI*Wkw~FM%88+-9E%58d`c4yTW&?@ zfO>)gQ9@QL#Kbn1(w1oCgf%2Sc~Sw12WUrLX;>dqo02+W*NK6=-C0Ypg0GFATO$@2 zXQaw`(r>E-JMzFnZaTkAss7+o4$3E=Y<~3IaLhv^-a*h1`hq!>e1a9<*ap=B6Es5i z6~>7;1GO-uv(chA<|`jbX6bS26Wc{3bkH+ulmPrQWvVp6N6DD|RT(s&Ry@wDut)2n zhlz|SFp<#BDiKXQ>r8OlOO_wk1G>{jbumL4o&Oydsm0Ht=-$=iPe=7#QI0D(<0vr7 zfK*jZDdKj@9XSoodHRZ{MG?o5wk}d2FLg$Oap9YSWI{p=PCl#8ex!i|>inDuAq#Zy zady%|Y$U(F)0y#oSs_$s?QQQf@aG+{%Ojn>nwQrD_+887S{ml`A|a?j^V)D%bk+yL}wqIynNbP+3(ctmUem-bQ1$d z5rKURyuPzZ(M7EGqNkW+x2pPrQ(3+0ntH`LN>n`4dCUR*?kMDDdQ-jEpQ3XX{Z!$R z?_)&!5aQNZ#Cu#DKz-8f-_uvqq_>uR$w@;6z6XYmMp zFBW+#Wk+krqcsiNGRW%>p%&4IU!E0TzeT^*`b?kJeC72fmOn{?CE@d?1GK%tfA!&N ze%PZS+J?D5gf>EL)qu|d7+-;Ft5*ceC5*1yV*dURrd4&^LTM*n*S2#!TZ-9qKP!m6 zMM@&nVmnFbaPe`4qn^`!S;GY1uiVxx&F-dT!;)(L;vj!{kP zkY)3$1N03XCR0%|S{?qzxIVSj+3>vt+#I#26U;lFCE_823{ys)!jG~uqiYb>zT3jb zxMkwtAUK;@x7w0Ag~ezfE0>;i2w@+Qi)=~haiR8)0qoqQ+wph^M0Iww?)^I%~ILa?8Fw454GtXyfe*r^`1x*Zh9AfL~Vd zE1RtIOE?C#-}*S3Kt*PRY*Q;nYt3&y(bhw2CKUmyI+;w;2^Tt1@4peEO?VzfaPF{+ zht~FCh~Ib5f|<0gqBfrq*S`2b*lE783DfPlDCXuh zt7fgH)ec>OG&P!RIG=N13>z#Jg^J7;(~mt-&bU`TXC5hx#~B}MM(;8lpBXTLWWRtP zZV!kX*Lxx#wvmooW5}0#bL2dO11QdcZ;=be2Wv#ae`b*NH<;az zQO5JD_XzXTq0B=Qycc1AO5+cIM%>wSZLHohitKndK3<(ycF*?oYwgnQQ3;Lg*+gII z^x1^NG($_T#erez7#!;U_72O^^M?G=xc=hl%vwkbsO^O6-U@kSXz9OA(S3t>-h?>= z+vyZMpFBOg?t*Im8FEo;^>DPlmWpcGfiTSpvi8{9ZE$R74EhsjEoR_}e7~x@mzq)1 z6(_n4sC(jiOK&FLU=wTvJNQED*&B*GTTb@__t^*OedK6rfV-2i6Ai@s?BW`lq0(k( zIq(6l&!#i_Y46Qw4^t(mS6LLy;4z*WjXT$r!tt`>nCsU1fThs1gQ!vE}OgK@~0pv94<$@$yan4(1NH6$C8UT-e`s#2&s;t8GxFasX^{wKnuJuXvb(^Vb=yCLH zi`TBFtrhp8alzPc>bk>Lbsv5G&}#Z6^1mP({{bxi<<_RBV`TbIz9G~9$Tw7Uvo)d> zv9Wd(GIB7mH?wuLvHzzkqi1DAE5QHvM=5LTXlA8HE$*miX=VUPD`Kf<;(*7(_Fek+ z6A-X*)u3i!!J}qiVZ)=RXJ*4=XQtPp{V!{NYZFT&JZeTdNLqde10!okJXTf)NZP-H z{jL1j_D#;Amu}jQ7nv_fP*KW|l?_c>ka=EC%T|G{T6(=pM0n>!kPzk;Qnqmhu2fsLWj|Ab>|B}&I+(7^{^y+cN?4M3j%Xow>y zw5*S_KMqO1fWzB1jAQWyXW!pizUs85e26{%F}!C23b*oD%L)Av|B*WKc${*-4!3b` zv*%^)<$jyuEfy)=(XF+c^x3j(EKy(k_}ohU>5e|V=bmNAJJ7Jkz&l?e&6@q5LiEPt z;(Zw+`Fd~R0lhr(#^m){@iUo8_LSq|oqhjhRcb4}V#aatE)Oc^?cfGG`5nsDM~bJ( z-KumxI;%%o`s~QK_1Q4%$fTD2h!)GSbcI;%`o5=y38J}rJvJ6P$KtL^V$QP;} zB*hTSd7K4IMe_~NTh7_zTB5DI7i;*cw`RQsz$VQBX!EA~&~s0H!(}GZNH^h*M<4nF zhYRLo15(Q83ADH;ARy1@2biEwh`aQCNKDx0_?%AKXVUP(RvujNXAr~32C9@#1W)R5 zj2HC>)S&9CO6kOWj{qF?2jy@56Puxp^HXxR0vCJfA!_{ja1G+T*;a zkLBm%8jrrML(m8HSCtySpikHv#1FZY!Mgw+s1K-4w6G&EH=@U%*#ckkX`iUv2(J-` zVV|XP$2z$=h%<1ncy(X4$;UO>=RMmSW7$oWj%2$hBd)sMUy)j?n@8-CnXqlsn8lSp z-?y%MnPgOpdbX5zJ{SMD$oMzK;rHtK?+~C>aME}D8xM;1PDcN<3g|f){axh$S0tF( zJ2(oO>e=IcFIFkNf0bDnA!$|23>{4!G#FS}@V-|i9t#UQ9y9ZQuD|W9Y;^y${k=0X z(*INb$Nt;ypE?~A_517dxBNZUKhIhI)&IZx zhSd7682-=Rg7?qfBM(WdXrp9p_BTB7{t4v&Z)pGjlh>I3ujIA=hF&v%qqkZ9XRKdz zx#?;QHPP`n)DT(JRW7Pit+X#43O5^S)PEDKIa`|0hh=VnuK&4-Pi2cU;G7n~H>T80 zZsk*jf*?LGB7==c01(&64P@cdfJ_vHkW`h#bpw%?KzegAzD&A^4V=Gv>gwSsoSaNc zV?4@CV|O^5T&Fb2wecdA5D^R&_Iyik-Xvy}Fd+=|j)7llfrGWZis2I2c7c~*aC)fL zL~_(B5E1)i-v6n#(ohz`{>ADeEcON<0Af>fYI*jnUZ)68(Fdk19;=;Uh5W&En<2RcSk46znfDX6%?zK3j< zeupa;eVaAcjKLKE`$bXCKXuGd>VfRz$2A%PDTmoEEKl>YHn>a%WhIb84{OXT^@{gO z&OuKvBjG#1rjBgA(ReEK6*NK5d-G#l zWXKey9daWCS2$-UEBJ=3MqCHJyPU{0 z48uppo;Y*aZeAW1JE(GzhB?4z8euO}pmyvJ9DIzObTnM18}h#cSLM)5 zN7Q4VB~-&$3v_x{JzzdqUw_`a+@pw5j!4X+BFT)vW`;G`(!g%RSNAUB`A}y^p=}?~ z8E4U9b-ChnL+kwDejzs$sxeDg^;;uQZ-7n_%)-!802|^b3P|!kjwM+8&^I6cb{3iP`Q>sVb-P=i0RFl`g$<&JfwtEL!#QAT zGbFng>yN|S#<_tjk2kCjjKwasaS@TMd<5wq&wF+Uq;^1MV~9JRaubH@mr2oQt3&k9 ztifQfQgEu}f@3uX33+Y*q9b}rQrLh+IHZUf&7hWgo$aj#GvtbZDq&W}lwCC`o>%0N z+$&ju^2|TfH&UIl80E>21mj=;F$|LXSt-pA^F z05zVu+~f6T!OlTQyU}&VS#ny9G=oC;tI=kUjuC4o!1UfDR=7#gqG|%OPCy)?CB&>? z)O$5SQA>ZC;{E=SiEwU=8+(PZQdO^ku#1(ROs!S#I@b>pHTU9KXf9$T?51WWZbzo7 zs0x35bo65HP~Xsr+cJ?h#?CN*(acmaWGTUndCyTrBAitzPq8n~P!?!JH(uee*kW&I zW1+e0G?kqtdt1#yW}2Zqi+Pk=`l*=7wk$E%szC47d;W?_LaTe5kgEEvM=<`*RXsg4 z1h?4UO7D5;PvTos;l%84Q-GW;suz}G{5y7RG7wcW%SeeDZKO(5tJB+d(N@cXdUmZy ze%f*BT=DQIPfG&Dm%?|~SmlbwvbrBxchc#g1D!}EK=Fo2#Y$`aw49h=P)$}#L$uS5 zUqP#inz4bMmp0m@xkGs{u7afcMh=-Np+0QFcsPL!t2)CGOl#m`oRiM;A{DjD^nuu= zm1A|f~MPmf8l;r3Xzo+ z2*z~6^;9F|%r@q)L><;x$MW9lqIsU8AkSp{Y7% zkI61hqVfm~t+l<;Fd>VIgGQBC3IYu6dgI!-!;*rdlPL}#SN%APyY7P94FncKq^xvf0tutsdQ^f9ZOh_b%hL!m*yYHQS z^ejV*6$f~JJAzTtvz2XJ00!A<;>Hi@^te^NQl6'(1BkZWYSK;4II3liqAMCS4- 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 literal 0 HcmV?d00001 From 0445b3547cc828e85469f7661d8d56294deb67b8 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 14:44:32 -0800 Subject: [PATCH 27/36] Adjust for older PowerShell versions --- Source/Images/Build.cmd | 12 ++++++------ Source/Images/BuildFD.ps1 | 34 +++++++++++++++++++++------------- Source/Images/BuildHD.ps1 | 34 +++++++++++++++++++++------------- 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index 6e379154..891419cb 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -9,9 +9,9 @@ call Clean.cmd echo : echo : Building Floppy Disk Images... echo : -call BuildFD.cmd cpm22 ..\cpm22\cpm_wbw -call BuildFD.cmd zsdos ..\zsdos\zsys_wbw -call BuildFD.cmd nzcom ..\zsdos\zsys_wbw +call BuildFD.cmd cpm22 ..\cpm22\cpm_wbw.sys +call BuildFD.cmd zsdos ..\zsdos\zsys_wbw.sys +call BuildFD.cmd nzcom ..\zsdos\zsys_wbw.sys call BuildFD.cmd cpm3 call BuildFD.cmd zpm3 call BuildFD.cmd ws4 @@ -19,9 +19,9 @@ call BuildFD.cmd ws4 echo : echo : Building Hard Disk Images... echo : -call BuildHD.cmd cpm22 ..\cpm22\cpm_wbw -call BuildHD.cmd zsdos ..\zsdos\zsys_wbw -call BuildHD.cmd nzcom ..\zsdos\zsys_wbw +call BuildHD.cmd cpm22 ..\cpm22\cpm_wbw.sys +call BuildHD.cmd zsdos ..\zsdos\zsys_wbw.sys +call BuildHD.cmd nzcom ..\zsdos\zsys_wbw.sys call BuildHD.cmd cpm3 call BuildHD.cmd zpm3 call BuildHD.cmd ws4 diff --git a/Source/Images/BuildFD.ps1 b/Source/Images/BuildFD.ps1 index 531a891f..f482bc10 100644 --- a/Source/Images/BuildFD.ps1 +++ b/Source/Images/BuildFD.ps1 @@ -1,4 +1,5 @@ -Param([Parameter(Mandatory)]$Disk, $SysFile="") +#Param([Parameter(Mandatory)]$Disk, $SysFile="") +Param($Disk, $SysFile="") $ErrorAction = 'Stop' @@ -18,8 +19,23 @@ if (-not (Test-Path("d_${Disk}/"))) "Generating Floppy Disk ${Disk}..." -$Blank = ([string]([char]0xE5)) * $Size -Set-Content -Value $Blank -NoNewLine -Path $ImgFile +#$Blank = ([string]([char]0xE5)) * $Size +#Set-Content -Value $Blank -NoNewLine -Path $ImgFile +$Blank = ([byte[]](0xE5) * $Size) +[System.IO.File]::WriteAllBytes($ImgFile, $Blank) + +if ($SysFile.Length -gt 0) +{ + "Adding System Image $SysFile..." + #$Sys = Get-Content -Path "$SysFile.sys" -Raw + #$Img = Get-Content -Path $ImgFile -Raw + #$NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) + #Set-Content -NoNewLine -Path $ImgFile $NewImg + + $Cmd = "mkfs.cpm -f $Fmt -b $SysFile $ImgFile" + $Cmd + Invoke-Expression $Cmd +} for ($Usr=0; $Usr -lt 16; $Usr++) { @@ -45,17 +61,9 @@ if (Test-Path("d_${Disk}.txt")) } } -if ($SysFile.Length -gt 0) -{ - "Adding System Image $SysFile..." - $Sys = Get-Content -Path "$SysFile.sys" -Raw - $Img = Get-Content -Path $ImgFile -Raw - $NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) - Set-Content -NoNewLine -Path $ImgFile $NewImg -} - "Moving image $ImgFile into output directory..." -&$env:COMSPEC /c move $ImgFile ..\..\Binary\ +#&$env:COMSPEC /c move $ImgFile ..\..\Binary\ +Move-Item $ImgFile -Destination "..\..\Binary\" -Force return \ No newline at end of file diff --git a/Source/Images/BuildHD.ps1 b/Source/Images/BuildHD.ps1 index 523a4b62..eedfa4aa 100644 --- a/Source/Images/BuildHD.ps1 +++ b/Source/Images/BuildHD.ps1 @@ -1,4 +1,5 @@ -Param([Parameter(Mandatory)]$Disk, $SysFile="") +#Param([Parameter(Mandatory)]$Disk, $SysFile="") +Param($Disk, $SysFile="") $ErrorAction = 'Stop' @@ -18,8 +19,23 @@ if (-not (Test-Path("d_${Disk}/"))) "Generating Hard Disk ${Disk}..." -$Blank = ([string]([char]0xE5)) * $Size -Set-Content -Value $Blank -NoNewLine -Path $ImgFile +#$Blank = ([string]([char]0xE5)) * $Size +#Set-Content -Value $Blank -NoNewLine -Path $ImgFile +$Blank = ([byte[]](0xE5) * $Size) +[System.IO.File]::WriteAllBytes($ImgFile, $Blank) + +if ($SysFile.Length -gt 0) +{ + "Adding System Image $SysFile..." + #$Sys = Get-Content -Path "$SysFile.sys" -Raw + #$Img = Get-Content -Path $ImgFile -Raw + #$NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) + #Set-Content -NoNewLine -Path $ImgFile $NewImg + + $Cmd = "mkfs.cpm -f $Fmt -b $SysFile $ImgFile" + $Cmd + Invoke-Expression $Cmd +} for ($Usr=0; $Usr -lt 16; $Usr++) { @@ -45,17 +61,9 @@ if (Test-Path("d_${Disk}.txt")) } } -if ($SysFile.Length -gt 0) -{ - "Adding System Image $SysFile..." - $Sys = Get-Content -Path "$SysFile.sys" -Raw - $Img = Get-Content -Path $ImgFile -Raw - $NewImg = $Sys + $Img.SubString($Sys.Length, $Img.Length - $Sys.Length) - Set-Content -NoNewLine -Path $ImgFile $NewImg -} - "Moving image $ImgFile into output directory..." -&$env:COMSPEC /c move $ImgFile ..\..\Binary\ +#&$env:COMSPEC /c move $ImgFile ..\..\Binary\ +Move-Item $ImgFile -Destination "..\..\Binary\" -Force return \ No newline at end of file From 382b5594f06da75ff854f19f4cf0a328e02ebead Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 17:01:55 -0800 Subject: [PATCH 28/36] Support multiple devices in IDE driver --- Doc/ChangeLog.txt | 4 + Source/HBIOS/Config/MK4_std.asm | 1 - Source/HBIOS/Config/RCZ180_ext.asm | 1 - Source/HBIOS/Config/RCZ180_nat.asm | 1 - Source/HBIOS/Config/RCZ80_kio.asm | 1 - Source/HBIOS/Config/RCZ80_std.asm | 1 - Source/HBIOS/Config/SBC_std.asm | 1 - Source/HBIOS/Config/SCZ180_126.asm | 1 - Source/HBIOS/Config/SCZ180_130.asm | 1 - Source/HBIOS/cfg_dyno.asm | 21 +- Source/HBIOS/cfg_ezz80.asm | 21 +- Source/HBIOS/cfg_master.asm | 21 +- Source/HBIOS/cfg_mk4.asm | 21 +- Source/HBIOS/cfg_n8.asm | 21 +- Source/HBIOS/cfg_rcz180.asm | 21 +- Source/HBIOS/cfg_rcz80.asm | 21 +- Source/HBIOS/cfg_sbc.asm | 21 +- Source/HBIOS/cfg_scz180.asm | 21 +- Source/HBIOS/ide.asm | 878 ++++++++++++++++++----------- Source/HBIOS/ppide.asm | 85 ++- Source/HBIOS/std.asm | 6 +- 21 files changed, 755 insertions(+), 415 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 1edf01e5..2dbd6d4e 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -43,6 +43,10 @@ Version 2.9.2 - PMS: Enhanced PPIDE driver to handle multiple PPI interfaces - PMS: Added a ROM based game - WBW: Only assign drive letters to hard disk devices with media +- WBW: Enhanced IDE driver to handle multiple IDE interfaces +- D?R: Contributed SC126 How-To: Preparing a MicroSD Card to Transfer Files to/from a Linux System +- PMS: Updated romldr to handle more than 9 drives +- PMS: Added "user" rom module template Version 2.9.1 ------------- diff --git a/Source/HBIOS/Config/MK4_std.asm b/Source/HBIOS/Config/MK4_std.asm index b144c790..4909dc00 100644 --- a/Source/HBIOS/Config/MK4_std.asm +++ b/Source/HBIOS/Config/MK4_std.asm @@ -38,7 +38,6 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_MK4 ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; diff --git a/Source/HBIOS/Config/RCZ180_ext.asm b/Source/HBIOS/Config/RCZ180_ext.asm index 29837d4a..7c9cca5b 100644 --- a/Source/HBIOS/Config/RCZ180_ext.asm +++ b/Source/HBIOS/Config/RCZ180_ext.asm @@ -41,6 +41,5 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ180_nat.asm b/Source/HBIOS/Config/RCZ180_nat.asm index 2ebeebf9..5c83fe9a 100644 --- a/Source/HBIOS/Config/RCZ180_nat.asm +++ b/Source/HBIOS/Config/RCZ180_nat.asm @@ -41,6 +41,5 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ80_kio.asm b/Source/HBIOS/Config/RCZ80_kio.asm index d30c7ff0..eeede184 100644 --- a/Source/HBIOS/Config/RCZ80_kio.asm +++ b/Source/HBIOS/Config/RCZ80_kio.asm @@ -47,6 +47,5 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index 61ef8517..d266d9f2 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -34,6 +34,5 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/SBC_std.asm b/Source/HBIOS/Config/SBC_std.asm index 31e094cf..d5cb313a 100644 --- a/Source/HBIOS/Config/SBC_std.asm +++ b/Source/HBIOS/Config/SBC_std.asm @@ -34,7 +34,6 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_DIO ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; diff --git a/Source/HBIOS/Config/SCZ180_126.asm b/Source/HBIOS/Config/SCZ180_126.asm index 01f051ca..09d2100a 100644 --- a/Source/HBIOS/Config/SCZ180_126.asm +++ b/Source/HBIOS/Config/SCZ180_126.asm @@ -41,7 +41,6 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; diff --git a/Source/HBIOS/Config/SCZ180_130.asm b/Source/HBIOS/Config/SCZ180_130.asm index 60de55b9..ae332544 100644 --- a/Source/HBIOS/Config/SCZ180_130.asm +++ b/Source/HBIOS/Config/SCZ180_130.asm @@ -43,7 +43,6 @@ FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index e6808004..0babcf5d 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -105,9 +105,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index d38b3587..d691eb2d 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -120,9 +120,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index a63aa593..f02968d7 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -164,9 +164,26 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_NONE ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU FALSE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_NONE ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $20 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 448d6361..37025c1a 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -119,9 +119,26 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_MK4 ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_MK4 ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $80 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_DIDE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $20 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $28 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $28 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU FALSE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU FALSE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_DIDE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $30 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $38 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $38 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU FALSE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU FALSE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 0a1b2aa6..3592584b 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -122,9 +122,26 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_DIO ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU FALSE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_DIO ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $20 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $20 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $28 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU FALSE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU FALSE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 9e1ba907..aeb1f0c4 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -125,9 +125,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 1a79f75a..3a49b4d3 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -129,9 +129,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 67c1b36a..78193630 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -122,9 +122,26 @@ RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_DIO ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU FALSE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_DIO ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $20 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $20 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $28 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU FALSE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU FALSE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 79f88b5e..532544d7 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -120,9 +120,26 @@ FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) -IDEMODE .EQU IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE] IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -IDE8BIT .EQU TRUE ; IDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER ; PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index c9149ca7..5c4240a9 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -4,9 +4,20 @@ ;============================================================================= ; ; TODO: -; - IMPLEMENT IDE_INITDEVICE -; - HANDLE SECONDARY INTERFACE ON DIDE -; - IMPLEMENT INTELLIGENT RESET, CHECK IF DEVICE IS ACTUALLY BROKEN BEFORE RESET +; - FIX SCALER CONSTANT +; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION +; - IMPLEMENT H/W PROBES FOR DIO AND DIDE +; +; NOTES: +; - WELL KNOWN IDE PORT ADDRESSES: +; BOARD BASE DATLO DATHI +; ------ ------ ------ ------ +; DIO $20 $20 $28 +; DIDE-A $20 $28 $28 +; DIDE-B $30 $38 $38 +; MK4 $80 N/A N/A +; RC $10 N/A N/A +; SMB $E0 N/A N/A ; ; +-----------------------------------------------------------------------+ ; | CONTROL BLOCK REGISTERS | @@ -100,77 +111,31 @@ #DEFINE DCALL \; #ENDIF ; -; UNIT MAPPING IS AS FOLLOWS: -; IDE0: PRIMARY MASTER -; IDE1: PRIMARY SLAVE -; IDE2: SECONDARY MASTER -; IDE3: SECONDARY SLAVE -; -IDE_DEVCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE -IDE_IO_BASE .EQU $20 ; DEFAULT IO BASE (NOTE OVERRIDES BELOW) -; -#IF (IDEMODE == IDEMODE_MK4) -IDE_IO_BASE .SET $80 -IDE_XAR .EQU $88 ; EXTERNAL ADDRESS REGISTER (XAR)#ENDIF -#ENDIF - -#IF (IDEMODE == IDEMODE_RC) -IDE_IO_BASE .SET $10 -#ENDIF - -#IF (IDEMODE == IDEMODE_SMB) -IDE_IO_BASE .SET $E0 -#ENDIF - -#IF ((IDEMODE == IDEMODE_DIO) | (IDEMODE == IDEMODE_MK4)) -#IF (IDE8BIT) -IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT PIO) (R/W) -#ELSE -IDE_IO_DATALO .EQU $IDE_IO_BASE + $00 ; DATA PORT (16 BIT PIO LO BYTE) (R/W) -IDE_IO_DATAHI .EQU $IDE_IO_BASE + $08 ; DATA PORT (16 BIT PIO HI BYTE) (R/W) -IDE_IO_DATA .EQU IDE_IO_DATALO -#ENDIF -#ENDIF -; -#IF (IDEMODE == IDEMODE_DIDE) -IDE_DEVCNT .SET 4 ; DIDE HAS PRIMARY AND SECONDARY INTERACES -#IF (IDE8BIT) -IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT PIO) (R/W) -#ELSE -IDE_IO_DATA .EQU $IDE_IO_BASE + $08 ; DATA PORT (16 BIT PIO LO/HI BYTES) (R/W) -IDE_IO_DMA .EQU $IDE_IO_BASE + $09 ; DATA PORT (16 BIT DMA LO/HI BYTES) (R/W) -#ENDIF -#ENDIF -; -#IF ((IDEMODE == IDEMODE_RC) | (IDEMODE == IDEMODE_SMB)) -IDE_DEVCNT .SET 1 ; RC2014 COMPACT FLASH SUPPORTS ONLY 1 DEVICE -IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA PORT (8 BIT) (R/W) -#ENDIF -; -;IDE_IO_DATA .EQU $IDE_IO_BASE + $00 ; DATA INPUT/OUTPUT (R/W) -IDE_IO_ERR .EQU $IDE_IO_BASE + $01 ; ERROR REGISTER (R) -IDE_IO_FEAT .EQU $IDE_IO_BASE + $01 ; FEATURES REGISTER (W) -IDE_IO_COUNT .EQU $IDE_IO_BASE + $02 ; SECTOR COUNT REGISTER (R/W) -IDE_IO_SECT .EQU $IDE_IO_BASE + $03 ; SECTOR NUMBER REGISTER (R/W) -IDE_IO_CYLLO .EQU $IDE_IO_BASE + $04 ; CYLINDER NUM REGISTER (LSB) (R/W) -IDE_IO_CYLHI .EQU $IDE_IO_BASE + $05 ; CYLINDER NUM REGISTER (MSB) (R/W) -IDE_IO_DRVHD .EQU $IDE_IO_BASE + $06 ; DRIVE/HEAD REGISTER (R/W) -IDE_IO_LBA0 .EQU $IDE_IO_BASE + $03 ; LBA BYTE 0 (BITS 0-7) (R/W) -IDE_IO_LBA1 .EQU $IDE_IO_BASE + $03 ; LBA BYTE 1 (BITS 8-15) (R/W) -IDE_IO_LBA2 .EQU $IDE_IO_BASE + $03 ; LBA BYTE 2 (BITS 16-23) (R/W) -IDE_IO_LBA3 .EQU $IDE_IO_BASE + $03 ; LBA BYTE 3 (BITS 24-27) (R/W) -IDE_IO_STAT .EQU $IDE_IO_BASE + $07 ; STATUS REGISTER (R) -IDE_IO_CMD .EQU $IDE_IO_BASE + $07 ; COMMAND REGISTER (EXECUTE) (W) -IDE_IO_ALTSTAT .EQU $IDE_IO_BASE + $0E ; ALTERNATE STATUS REGISTER (R) -IDE_IO_CTRL .EQU $IDE_IO_BASE + $0E ; DEVICE CONTROL REGISTER (W) -IDE_IO_DRVADR .EQU $IDE_IO_BASE + $0F ; DRIVE ADDRESS REGISTER (R) +IDE_REG_DATA .EQU $00 ; DATA /OUTPUT (R/W) +IDE_REG_ERR .EQU $01 ; ERROR REGISTER (R) +IDE_REG_FEAT .EQU $01 ; FEATURES REGISTER (W) +IDE_REG_COUNT .EQU $02 ; SECTOR COUNT REGISTER (R/W) +IDE_REG_SECT .EQU $03 ; SECTOR NUMBER REGISTER (R/W) +IDE_REG_CYLLO .EQU $04 ; CYLINDER NUM REGISTER (LSB) (R/W) +IDE_REG_CYLHI .EQU $05 ; CYLINDER NUM REGISTER (MSB) (R/W) +IDE_REG_DRVHD .EQU $06 ; DRIVE/HEAD REGISTER (R/W) +IDE_REG_LBA0 .EQU $03 ; LBA BYTE 0 (BITS 0-7) (R/W) +IDE_REG_LBA1 .EQU $04 ; LBA BYTE 1 (BITS 8-15) (R/W) +IDE_REG_LBA2 .EQU $05 ; LBA BYTE 2 (BITS 16-23) (R/W) +IDE_REG_LBA3 .EQU $06 ; LBA BYTE 3 (BITS 24-27) (R/W) +IDE_REG_STAT .EQU $07 ; STATUS REGISTER (R) +IDE_REG_CMD .EQU $07 ; COMMAND REGISTER (EXECUTE) (W) +IDE_REG_XAR .EQU $08 ; ECB DIDE EXTERNAL ADDRESS REGISTER (W) +IDE_REG_ALTSTAT .EQU $0E ; ALTERNATE STATUS REGISTER (R) +IDE_REG_CTRL .EQU $0E ; DEVICE CONTROL REGISTER (W) +IDE_REG_DRVADR .EQU $0F ; DRIVE ADDRESS REGISTER (R) ; ; COMMAND BYTES ; -IDE_CIDE_RECAL .EQU $10 -IDE_CIDE_READ .EQU $20 -IDE_CIDE_WRITE .EQU $30 -IDE_CIDE_IDDEV .EQU $EC +IDE_CIDE_RECAL .EQU $10 +IDE_CIDE_READ .EQU $20 +IDE_CIDE_WRITE .EQU $30 +IDE_CIDE_IDDEV .EQU $EC IDE_CIDE_SETFEAT .EQU $EF ; ; FEATURE BYTES @@ -197,57 +162,130 @@ IDE_STBSYTO .EQU -7 ; ; DRIVE SELECTION BYTES (FOR USE IN DRIVE/HEAD REGISTER) ; -IDE_DRVSEL: -IDE_DRVMASTER .DB %11100000 ; LBA, MASTER DEVICE -IDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE +;IDE_DRVSEL: +IDE_DRVMASTER .EQU %11100000 ; LBA, MASTER DEVICE +IDE_DRVSLAVE .EQU %11110000 ; LBA, SLAVE DEVICE ; ; IDE DEVICE CONFIGURATION ; -IDE_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES +IDE_CFGSIZ .EQU 19 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS ; IDE_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) -IDE_STAT .EQU 1 ; LAST STATUS (BYTE) -IDE_TYPE .EQU 2 ; DEVICE TYPE (BYTE) -IDE_FLAGS .EQU 3 ; FLAG BITS BIT 0=CF, 1=LBA (BYTE) -IDE_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) -IDE_LBA .EQU 8 ; OFFSET OF LBA (DWORD) +IDE_MODE .EQU 1 ; OPERATION MODE: IDE MODE (BYTE) +IDE_STAT .EQU 2 ; LAST STATUS (BYTE) +IDE_TYPE .EQU 3 ; DEVICE TYPE (BYTE) +IDE_ACC .EQU 4 ; ACCESS FLAG BITS BIT 0=MASTER, 1=8BIT (BYTE) +IDE_MED .EQU 5 ; MEDIA FLAG BITS BIT 0=CF, 1=LBA (BYTE) +IDE_MEDCAP .EQU 6 ; MEDIA CAPACITY (DWORD) +IDE_LBA .EQU 10 ; OFFSET OF LBA (DWORD) +IDE_IOBASE .EQU 14 ; IO BASE ADDRESS (BYTE) +IDE_DATALO .EQU 15 ; 16 BIT DATA LO BYTE +IDE_DATAHI .EQU 16 ; 16 BIT DATA HI BYTE +IDE_PARTNER .EQU 17 ; PARTNER DEVICE (MASTER <-> SLAVE) (WORD) +; +IDE_ACC_MAS .EQU %00000001 ; UNIT IS MASTER (ELSE SLAVE) +IDE_ACC_8BIT .EQU %00000010 ; UNIT WANTS 8 BIT I/O (ELSE 16 BIT) +; +IDE_MED_CF .EQU %00000001 ; MEDIA IS CF CARD +IDE_MED_LBA .EQU %00000010 ; MEDIA HAS LBA CAPABILITY +; +IDE_DEVCNT .EQU IDECNT * 2 ; IDE_CFGTBL: - ; DEVICE 0, PRIMARY MASTER +; +#IF (IDECNT >= 1) +; +IDE_DEV0M: ; DEVICE 0, MASTER .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE0MODE ; DRIVER DEVICE MODE .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB IDE_ACC_MAS | (IDE0A8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA -#IF (IDE_DEVCNT >= 2) - ; DEVICE 1, PRIMARY SLAVE - .DB 1 ; DRIVER DEVICE NUMBER + .DB IDE0BASE ; IO BASE ADDRESS + .DB IDE0DATLO ; IO BASE ADDRESS + .DB IDE0DATHI ; IO BASE ADDRESS + .DW IDE_DEV0S ; PARTNER +; +IDE_DEV0S: ; DEVICE 0, SLAVE + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE0MODE ; DRIVER DEVICE MODE .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB (IDE0B8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB IDE0BASE ; IO BASE ADDRESS + .DB IDE0DATLO ; IO BASE ADDRESS + .DB IDE0DATHI ; IO BASE ADDRESS + .DW IDE_DEV0M ; PARTNER #ENDIF -#IF (IDE_DEVCNT >= 3) - ; DEVICE 2, SECONDARY MASTER - .DB 2 ; DRIVER DEVICE NUMBER +; +#IF (IDECNT >= 2) +; +IDE_DEV1M: ; DEVICE 1, MASTER + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE1MODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB IDE_ACC_MAS | (IDE1A8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB IDE1BASE ; IO BASE ADDRESS + .DB IDE1DATLO ; IO BASE ADDRESS + .DB IDE1DATHI ; IO BASE ADDRESS + .DW IDE_DEV1S ; PARTNER +; +IDE_DEV1S: ; DEVICE 1, SLAVE + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE1MODE ; DRIVER DEVICE MODE .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB (IDE1B8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB IDE1BASE ; IO BASE ADDRESS + .DB IDE1DATLO ; IO BASE ADDRESS + .DB IDE1DATHI ; IO BASE ADDRESS + .DW IDE_DEV1M ; PARTNER #ENDIF -#IF (IDE_DEVCNT >= 4) - ; DEVICE 2, SECONDARY SLAVE - .DB 3 ; DRIVER DEVICE NUMBER +; +#IF (IDECNT >= 3) +; +IDE_DEV2M: ; DEVICE 2, MASTER + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE2MODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB IDE_ACC_MAS | (IDE2A8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB IDE2BASE ; IO BASE ADDRESS + .DB IDE2DATLO ; IO BASE ADDRESS + .DB IDE2DATHI ; IO BASE ADDRESS + .DW IDE_DEV2S ; PARTNER +; +IDE_DEV2S: ; DEVICE 2, SLAVE + .DB 0 ; DRIVER DEVICE NUMBER + .DB IDE2MODE ; DRIVER DEVICE MODE .DB 0 ; DEVICE STATUS .DB 0 ; DEVICE TYPE - .DB 0 ; FLAGS BYTE + .DB (IDE2B8BIT & IDE_ACC_8BIT) ; UNIT ACCESS FLAGS + .DB 0 ; MEDIA FLAGS .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB IDE2BASE ; IO BASE ADDRESS + .DB IDE2DATLO ; IO BASE ADDRESS + .DB IDE2DATHI ; IO BASE ADDRESS + .DW IDE_DEV1M ; PARTNER #ENDIF ; #IF ($ - IDE_CFGTBL) != (IDE_DEVCNT * IDE_CFGSIZ) @@ -273,78 +311,87 @@ IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS ;============================================================================= ; IDE_INIT: - CALL NEWLINE ; FORMATTING - PRTS("IDE:$") -; ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER - ; AT 1MHZ, THE SCALER IS 961 (50000US / 52TS = 961) - ; SCALER IS THEREFORE 961 * CPU SPEED IN MHZ + ; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218) + ; SCALER IS THEREFORE 218 * CPU SPEED IN MHZ LD DE,961 ; LOAD SCALER FOR 1MHZ LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ CALL MULT8X16 ; HL := DE * A LD (IDE_TOSCALER),HL ; SAVE IT ; -#IF (IDEMODE == IDEMODE_DIO) - PRTS(" MODE=DIO$") -#ENDIF -#IF (IDEMODE == IDEMODE_DIDE) - PRTS(" MODE=DIDE$") -#ENDIF -#IF (IDEMODE == IDEMODE_MK4) - PRTS(" MODE=MK4$") -#ENDIF - ; PRINT IDE INTERFACE PORT ADDRESS - PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS - LD A,IDE_IO_DATA ; GET IO ADDRESS - CALL PRTHEXBYTE ; PRINT IT -; -; - CALL IDE_DETECT ; CHECK FOR HARDWARE - JR Z,IDE_INIT00 ; CONTINUE IF PRESENT + XOR A ; ZERO ACCUM + LD (IDE_DEVNUM),A ; INIT DEV UNIT NUM FOR DYNAMIC ASSIGNMENT + LD IY,IDE_CFGTBL ; POINT TO START OF CONFIG TABLE ; - ; HARDWARE NOT PRESENT - PRTS(" NOT PRESENT$") - OR $FF ; SIGNAL FAILURE - RET +IDE_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,IDE_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN ; -IDE_INIT00: - ; PRINT UNIT COUNT - PRTS(" DEVICES=$") ; PRINT LABEL FOR DEVICE COUNT - LD A,IDE_DEVCNT ; GET UNIT COUNT - CALL PRTDECB ; PRINT IT IN DECIMAL +IDE_INIT2: + BIT 0,(IY+IDE_ACC) ; MASTER? + JR Z,IDE_INIT4 ; IF NOT MASTER, SKIP AHEAD ; -; SETUP THE DISPATCH TABLE ENTRIES + CALL NEWLINE ; FORMATTING + PRTS("IDE:$") ; LABEL FOR IO ADDRESS ; - LD B,IDE_DEVCNT ; LOOP CONTROL - LD IY,IDE_CFGTBL ; START OF CFG TABLE -IDE_INIT0: - PUSH BC ; SAVE LOOP CONTROL + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+IDE_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + PRTS(" MODE=$") ; LABEL FOR MODE + LD A,(IY+IDE_MODE) ; GET MODE BITS + LD DE,IDE_STR_MODE_DIO ; MODE LABEL + CP IDEMODE_DIO ; TEST FOR MODE + JR Z,IDE_INIT2A ; IF SO, DISPLAY IT + LD DE,IDE_STR_MODE_DIDE ; MODE LABEL + CP IDEMODE_DIDE ; TEST FOR MODE + JR Z,IDE_INIT2A ; IF SO, DISPLAY IT + LD DE,IDE_STR_MODE_MK4 ; MODE LABEL + CP IDEMODE_MK4 ; TEST FOR MODE + JR Z,IDE_INIT2A ; IF SO, DISPLAY IT + LD DE,IDE_STR_MODE_RC ; MODE LABEL + CP IDEMODE_RC ; TEST FOR MODE + JR Z,IDE_INIT2A ; IF SO, DISPLAY IT + JR IDE_INIT4 ; NO MODE? BYPASS ENTRY +IDE_INIT2A: + CALL WRITESTR ; DISPLAY MODE +; + CALL IDE_DETECT ; PROBE FOR INTERFACE + JR Z,IDE_INIT3 ; GOT IT, MOVE ON TO INIT UNITS + CALL PC_SPACE ; FORMATTING + LD DE,IDE_STR_NOHW ; NOT PRESENT MESSAGE + CALL WRITESTR ; DISPLAY IT + JR IDE_INIT4 ; SKIP CFG ENTRY +; +IDE_INIT3: + CALL IDE_RESET ; RESET THE BUS + CALL IDE_INIT5 ; DETECT/INIT MASTER + PUSH IY ; SAVE CFG PTR + CALL IDE_GOPARTNER ; SWITCH IY TO PARTNER CFG + CALL IDE_INIT5 ; DETECT/INIT SLAVE + POP IY ; RESTORE CFG PTR +; +IDE_INIT4: + LD DE,IDE_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP IDE_INIT1 ; AND LOOP +; +IDE_INIT5: + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(IDE_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+IDE_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (IDE_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE LD BC,IDE_FNTBL ; BC := FUNC TABLE ADR PUSH IY ; CFG ENTRY POINTER POP DE ; COPY TO DE - CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED - LD BC,IDE_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - POP BC ; RESTORE BC - DJNZ IDE_INIT0 ; LOOP AS NEEDED -; - ; INITIALIZE THE IDE INTERFACE NOW - CALL IDE_RESET ; DO HARDWARE SETUP/INIT - RET NZ ; ABORT IF RESET FAILS -; - ; DEVICE DISPLAY LOOP - LD B,IDE_DEVCNT ; LOOP ONCE PER DEVICE - LD IY,IDE_CFGTBL ; START OF CFG TABLE -IDE_INIT1: - PUSH BC ; SAVE LOOP CONTROL - CALL IDE_INIT2 ; DISPLAY UNIT INFO - LD BC,IDE_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - POP BC ; RESTORE LOOP CONTROL - DJNZ IDE_INIT1 ; LOOP UNTIL DONE - RET ; DONE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE ; -IDE_INIT2: ; CHECK FOR BAD STATUS LD A,(IY+IDE_STAT) ; GET STATUS OR A ; SET FLAGS @@ -352,13 +399,13 @@ IDE_INIT2: ; CALL IDE_PRTPREFIX ; PRINT DEVICE PREFIX ; -#IF (IDE8BIT) - PRTS(" 8BIT$") -#ENDIF + LD DE,IDE_STR_8BIT + BIT 1,(IY+IDE_ACC) ; 8 BIT ACCESS? + CALL NZ,WRITESTR ; ; PRINT LBA/NOLBA CALL PC_SPACE ; FORMATTING - BIT 1,(IY+IDE_FLAGS) ; TEST LBA FLAG + BIT 1,(IY+IDE_MED) ; TEST LBA FLAG LD DE,IDE_STR_NO ; POINT TO "NO" STRING CALL Z,WRITESTR ; PRINT "NO" BEFORE "LBA" IF LBA NOT SUPPORTED PRTS("LBA$") ; PRINT "LBA" REGARDLESS @@ -377,8 +424,7 @@ IDE_INIT2: CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED) PRTS("MB$") ; PRINT SUFFIX ; - XOR A ; SIGNAL SUCCESS - RET ; RETURN WITH A=0, AND Z SET + RET ; ;---------------------------------------------------------------------- ; PROBE FOR IDE HARDWARE @@ -388,8 +434,11 @@ IDE_INIT2: ; IDE_DETECT: ; -#IF (IDEMODE == IDEMODE_DIDE) -#ENDIF +;#IF (IDEMODE == IDEMODE_DIDE) +;#ENDIF +;; +;#IF (IDEMODE == IDEMODE_DIO) +;#ENDIF ; XOR A ; SIGNAL SUCCESS RET ; AND RETURN @@ -451,7 +500,7 @@ IDE_IO: #ENDIF PUSH BC ; SAVE COUNTERS CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT - CALL IDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS + CALL IDE_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO POP BC ; RESTORE COUNTERS JR NZ,IDE_IO3 ; BAIL OUT ON ERROR IDE_IO1: @@ -492,7 +541,7 @@ IDE_STATUS: IDE_DEVICE: LD D,DIODEV_IDE ; D := DEVICE TYPE LD E,(IY+IDE_DEV) ; E := PHYSICAL DEVICE NUMBER - BIT 0,(IY+IDE_FLAGS) ; TEST CF BIT IN FLAGS + BIT 0,(IY+IDE_MED) ; TEST CF BIT IN FLAGS LD C,%00000000 ; ASSUME NON-REMOVABLE HARD DISK JR Z,IDE_DEVICE1 ; IF Z, WE ARE DONE LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH @@ -582,11 +631,15 @@ IDE_SETFEAT: PRTS(" SETFEAT$") #ENDIF LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE POP AF - OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE + ;OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE + CALL IDE_OUT + .DB IDE_REG_FEAT DCALL PC_SPACE DCALL PRTHEXBYTE LD A,IDE_CIDE_SETFEAT ; CMD = SETFEAT @@ -601,7 +654,9 @@ IDE_IDENTIFY: PRTS(" IDDEV$") #ENDIF LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE LD A,IDE_CIDE_IDDEV @@ -620,7 +675,9 @@ IDE_RDSEC: PRTS(" READ$") #ENDIF LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD @@ -640,7 +697,9 @@ IDE_WRSEC: PRTS(" WRITE$") #ENDIF LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD @@ -657,33 +716,29 @@ IDE_SETADDR: ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_IO_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_IO_LBA2-0 - LD C,IDE_IO_LBA0 + 3 ; STARTING IO PORT (NOT PRE-DEC BELOW) - LD A,IDE_LBA + 2 ; OFFSET OF 3RD BYTE OF LBA IN CFG - CALL LDHLIYA ; HL := IY + A, REG A TRASHED - LD B,3 ; SEND 3 BYTES -IDE_SETADDR1: -; -#IF (IDETRACE >= 3) - LD A,(HL) - CALL PC_SPACE - CALL PRTHEXBYTE -#ENDIF -; - DEC C ; NEXT PORT - OUTD ; SEND NEXT BYTE - JR NZ,IDE_SETADDR1 ; LOOP TILL DONE + LD A,(IY+IDE_LBA+2) + DCALL PC_SPACE + DCALL PRTHEXBYTE + CALL IDE_OUT + .DB IDE_REG_LBA2 ; - ; SEND COUNT OF BLOCKS TO TRANSFER - ; 1 --> IDE_IO_COUNT - LD A,1 ; COUNT VALUE IS 1 BLOCK + LD A,(IY+IDE_LBA+1) + DCALL PC_SPACE + DCALL PRTHEXBYTE + CALL IDE_OUT + .DB IDE_REG_LBA1 ; -#IF (IDETRACE >= 3) + LD A,(IY+IDE_LBA+0) DCALL PC_SPACE DCALL PRTHEXBYTE -#ENDIF + CALL IDE_OUT + .DB IDE_REG_LBA0 ; - DEC C ; PORT := IDE_IO_COUNT - OUT (C),A ; SEND IT + LD A,1 + DCALL PC_SPACE + DCALL PRTHEXBYTE + CALL IDE_OUT + .DB IDE_REG_COUNT ; #IF (DSKYENABLE) CALL IDE_DSKY @@ -702,7 +757,9 @@ IDE_RUNCMD: LD A,(IDE_CMD) ; GET THE COMMAND DCALL PC_SPACE DCALL PRTHEXBYTE - OUT (IDE_IO_CMD),A ; SEND IT (STARTS EXECUTION) + ;OUT (IDE_IO_CMD),A ; SEND IT (STARTS EXECUTION) + CALL IDE_OUT + .DB IDE_REG_CMD #IF (IDETRACE >= 3) PRTS(" -->$") #ENDIF @@ -720,79 +777,116 @@ IDE_GETBUF: #IF (IDETRACE >= 3) PRTS(" GETBUF$") #ENDIF - +; CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT - +; LD B,0 - -#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) - LD C,IDE_IO_DATA - INIR - INIR -;X1: -; NOP -; INI -; JR NZ,X1 -;X2: -; NOP -; INI -; JR NZ,X2 -#ELSE - LD C,IDE_IO_DATAHI +; + BIT 1,(IY+IDE_ACC) ; 8 BIT? + JR Z,IDE_GETBUF1 ; IF NOT, DO 16 BIT + CALL IDE_GETBUF8 ; DO 8 BIT + JR IDE_GETBUF2 +; IDE_GETBUF1: - IN A,(IDE_IO_DATALO) ; READ THE LO BYTE - LD (HL),A ; SAVE IN BUFFER - INC HL ; INC BUFFER POINTER - INI ; READ AND SAVE HI BYTE, INC HL, DEC B - JP NZ,IDE_GETBUF1 ; LOOP AS NEEDED -#ENDIF + CALL IDE_GETBUF16 +; +IDE_GETBUF2: CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! CALL IDE_GETRES JP NZ,IDE_IOERR RET ; +IDE_GETBUF8: + ; 8 BIT I/O + ;LD C,IDE_IO_DATA + LD C,(IY+IDE_IOBASE) + INIR + INIR + RET +; +IDE_GETBUF16: + ; 16 BIT I/O + ;LD C,IDE_IO_DATAHI + LD D,(IY+IDE_DATALO) + LD E,(IY+IDE_DATAHI) + CALL IDE_GETBUF16A ; GET FIRST 256 BYTES + CALL IDE_GETBUF16A ; GET SECOND 256 BYTES + RET +; +IDE_GETBUF16A: + LD C,D ; PORT FOR LSB + INI ; GET IT, SAVE IT, AND DEC B + LD C,E ; PORT FOR MSB + INI ; GET IT, SAVE IT, AND DEC B + JR NZ,IDE_GETBUF16A ; LOOP TILL COUNTER EXHAUSTED + RET +; ; ; IDE_PUTBUF: #IF (IDETRACE >= 3) - PRTS(" GETBUF$") + PRTS(" PUTBUF$") #ENDIF - +; CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT ; - ;LD HL,(IDE_DSKBUF) LD B,0 - -#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) - LD C,IDE_IO_DATA - OTIR - OTIR -#ELSE - LD C,IDE_IO_DATAHI +; + BIT 1,(IY+IDE_ACC) ; 8 BIT? + JR Z,IDE_PUTBUF1 ; IF NOT, DO 16 BIT + CALL IDE_PUTBUF8 ; DO 8 BIT + JR IDE_PUTBUF2 +; IDE_PUTBUF1: - LD A,(HL) ; GET THE LO BYTE AND KEEP IT IN A FOR LATER - INC HL ; BUMP TO NEXT BYTE IN BUFFER - OUTI ; WRITE HI BYTE, INC HL, DEC B - OUT (IDE_IO_DATALO),A ; NOW WRITE THE SAVED LO BYTE TO LO BYTE - JP NZ,IDE_PUTBUF1 ; LOOP AS NEEDED -#ENDIF + CALL IDE_PUTBUF16 +; +IDE_PUTBUF2: CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! CALL IDE_GETRES JP NZ,IDE_IOERR RET ; +IDE_PUTBUF8: + ; 8 BIT I/O + ;LD C,IDE_IO_DATA + LD C,(IY+IDE_IOBASE) + OTIR + OTIR + RET +; +IDE_PUTBUF16: + ; 16 BIT I/O + ;LD C,IDE_IO_DATAHI + LD D,(IY+IDE_DATALO) + LD E,(IY+IDE_DATAHI) + CALL IDE_PUTBUF16A ; PUT FIRST 256 BYTES + CALL IDE_PUTBUF16A ; PUT SECOND 256 BYTES + RET +; +IDE_PUTBUF16A: + LD C,D ; PORT FOR LSB + OUTI ; PUT IT AND DEC B + LD C,E ; PORT FOR MSB + OUTI ; PUT IT AND DEC B + JR NZ,IDE_PUTBUF16A ; LOOP TILL COUNTER EXHAUSTED + RET +; ; ; IDE_GETRES: - IN A,(IDE_IO_STAT) ; GET STATUS + ;IN A,(IDE_IO_STAT) ; GET STATUS + CALL IDE_IN + .DB IDE_REG_STAT DCALL PC_SPACE DCALL PRTHEXBYTE AND %00000001 ; ERROR BIT SET? RET Z ; NOPE, RETURN WITH ZF ; - IN A,(IDE_IO_ERR) ; READ ERROR REGISTER + ;IN A,(IDE_IO_ERR) ; READ ERROR REGISTER + CALL IDE_IN + .DB IDE_REG_ERR DCALL PC_SPACE DCALL PRTHEXBYTE OR $FF ; FORCE NZ TO SIGNAL ERROR @@ -805,44 +899,102 @@ IDE_GETRES: ; RESET ALL DEVICES ON BUS ; IDE_RESET: +#IF (IDETRACE >= 3) + CALL IDE_PRTPREFIX + PRTS(" RESET$") +#ENDIF +; +;#IF (IDEMODE == IDEMODE_MK4) +; + LD A,(IY+IDE_MODE) ; GET MODE + CP IDEMODE_MK4 ; MK4? + JR NZ,IDE_RESET1 ; IF NOT, BYPASS ; -#IF (IDEMODE == IDEMODE_MK4) ; USE HARDWARE RESET LINE + PRTS(" HARD$") LD A,$80 ; HIGH BIT OF XAR IS IDE RESET - OUT (IDE_XAR),A + ;OUT (IDE_IO_XAR),A + CALL IDE_OUT + .DB IDE_REG_XAR LD DE,2 ; DELAY 32US (SPEC IS >= 25US) CALL VDELAY XOR A ; CLEAR RESET BIT - OUT (IDE_XAR),A -#ENDIF - -#IF ((IDEMODE == IDEMODE_RC) | (IDEMODE == IDEMODE_SMB)) + ;OUT (IDE_IO_XAR),A + CALL IDE_OUT + .DB IDE_REG_XAR +; +IDE_RESET1: +; +;#ENDIF +; +;#IF (IDEMODE == IDEMODE_RC) +; + LD A,(IY+IDE_MODE) ; GET MODE + CP IDEMODE_RC ; RC2014? + JR NZ,IDE_RESET2 ; IF NOT, BYPASS +; ; RC2014 CANNOT ADDRESS THE DEVICE CONTROL PORT AND ; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE, ; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME ; VALUES THAT A RESET WOULD CAUSE. + PRTS(" FAKE$") XOR A - OUT (IDE_IO_CYLLO),A - OUT (IDE_IO_CYLHI),A + ;OUT (IDE_IO_CYLLO),A + CALL IDE_OUT + .DB IDE_REG_CYLLO + ;OUT (IDE_IO_CYLHI),A + CALL IDE_OUT + .DB IDE_REG_CYLHI INC A - OUT (IDE_IO_COUNT),A - OUT (IDE_IO_SECT),A -#ENDIF - -#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB)) + ;OUT (IDE_IO_COUNT),A + CALL IDE_OUT + .DB IDE_REG_COUNT + ;OUT (IDE_IO_SECT),A + CALL IDE_OUT + .DB IDE_REG_SECT +; +IDE_RESET2: +; +;#ENDIF +; +;#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC)) +; + LD A,(IY+IDE_MODE) ; GET MODE + CP IDEMODE_MK4 ; MK4? + JR Z,IDE_RESET3 ; IF SO, BYPASS + CP IDEMODE_RC ; RC2014? + JR Z,IDE_RESET3 ; IF SO, BYPASS +; ; INITIATE SOFT RESET + PRTS(" SOFT$") LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES - OUT (IDE_IO_CTRL),A -#ENDIF + ;OUT (IDE_IO_CTRL),A + CALL IDE_OUT + .DB IDE_REG_CTRL +; +IDE_RESET3: +; +;#ENDIF ; LD DE,2 ; DELAY 32US (SPEC IS >= 25US) CALL VDELAY ; -#IF ((IDEMODE != IDEMODE_RC) & (IDEMODE != IDEMODE_SMB)) +;#IF (IDEMODE != IDEMODE_RC) +; + LD A,(IY+IDE_MODE) ; GET MODE + CP IDEMODE_RC ; RC2014? + JR Z,IDE_RESET4 ; IF SO, BYPASS +; ; CONFIGURE OPERATION AND END SOFT RESET + PRTS(" CONFIG$") LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET - OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER -#ENDIF + ;OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER + CALL IDE_OUT + .DB IDE_REG_CTRL +; +IDE_RESET4: +; +;#ENDIF ; ; SPEC ALLOWS UP TO 450MS FOR DEVICES TO ASSERT THEIR PRESENCE ; VIA -DASP. I ENCOUNTER PROBLEMS LATER ON IF I DON'T WAIT HERE @@ -854,28 +1006,16 @@ IDE_RESET: LD DE,150000/16 ; ~???MS CALL VDELAY ; - ;; CLEAR OUT ALL DATA (FOR ALL UNITS) - ;LD HL,IDE_UDATA - ;LD BC,IDE_UDLEN - ;XOR A - ;CALL FILL -; - ;LD A,(IDE_UNIT) ; GET THE CURRENT UNIT SELECTION - ;PUSH AF ; AND SAVE IT - PUSH IY ; SAVE CURRENT DEVICE CFG PTR - - ; PROBE / INITIALIZE ALL UNITS - LD B,IDE_DEVCNT ; NUMBER OF UNITS TO TRY - LD IY,IDE_CFGTBL ; START OF CFG TABLE -IDE_RESET1: - PUSH BC ; SAVE LOOP CONTROL - CALL IDE_INITUNIT ; PROBE/INIT UNIT - LD BC,IDE_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - POP BC ; RESTORE BC - DJNZ IDE_RESET1 ; LOOP AS NEEDED -; - POP IY ; RECOVER DEVICE CFG PTR + ; INITIALIZE THE INDIVIDUAL UNITS (MASTER AND SLAVE). + ; BASED ON TESTING, IT APPEARS THAT THE MASTER UNIT MUST + ; BE DONE FIRST OR THIS BEHAVES BADLY. + PUSH IY ; SAVE CFG PTR + BIT 0,(IY+IDE_ACC) ; MASTER? + CALL Z,IDE_GOPARTNER ; IF NOT, SWITCH TO MASTER + CALL IDE_INITUNIT ; INIT CURRENT UNIT + CALL IDE_GOPARTNER ; POINT TO SLAVE + CALL IDE_INITUNIT ; INIT PARTNER UNIT + POP IY ; RECOVER ORIG CFG PTR ; XOR A ; SIGNAL SUCCESS RET ; AND DONE @@ -886,19 +1026,14 @@ IDE_INITUNIT: CALL IDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR - ;LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT - ;LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING INIT - LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT LD (HL),IDE_TONORM ; SET NORMAL TIMEOUT CALL IDE_PROBE ; DO PROBE - CALL Z,IDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE - - ;LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT - ;LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT + RET NZ ; JUST RETURN IF NOTHING THERE - RET + CALL IDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE + RET ; DONE ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; UNIT IS SPECIFIED IN IDE_UNIT @@ -910,22 +1045,16 @@ IDE_SELUNIT: PRTS(" SELUNIT$") #ENDIF ; -#IF (IDEMODE == IDEMODE_DIDE) - ; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE -#ENDIF - PUSH HL ; SAVE HL, IT IS DESTROYED BELOW - PUSH IY - POP BC - LD A,(IY+IDE_DEV) ; GET DEVICE - AND $01 ; LS BIT DETERMINES MASTER/SLAVE - LD HL,IDE_DRVSEL - CALL ADDHLA - LD A,(HL) ; LOAD DRIVE/HEAD VALUE - POP HL ; RECOVER HL + BIT 0,(IY+IDE_ACC) ; MASTER? + JR Z,IDE_SELUNIT1 ; HANDLE SLAVE + LD A,IDE_DRVMASTER ; MASTER + JR IDE_SELUNIT2 +IDE_SELUNIT1: + LD A,IDE_DRVSLAVE ; SLAVE +IDE_SELUNIT2: LD (IDE_DRVHD),A ; SAVE IT -; - XOR A ; SIGNAL SUCCESS - RET ; AND DONE + XOR A ; SUCCESS + RET ; ; ; @@ -936,14 +1065,18 @@ IDE_PROBE: #ENDIF ; LD A,(IDE_DRVHD) - OUT (IDE_IO_DRVHD),A + ;OUT (IDE_IO_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE CALL DELAY ; DELAY ~16US ; - LD C,IDE_IO_STAT - IN A,(C) + ;LD C,IDE_IO_STAT + ;IN A,(C) + CALL IDE_IN + .DB IDE_REG_STAT DCALL PC_SPACE DCALL PRTHEXBYTE CP $FF @@ -962,7 +1095,9 @@ IDE_PROBE0: DCALL IDE_REGDUMP ; ; CHECK STATUS - IN A,(IDE_IO_STAT) ; GET STATUS + ;IN A,(IDE_IO_STAT) ; GET STATUS + CALL IDE_IN + .DB IDE_REG_STAT DCALL PC_SPACE DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS OR A ; SET FLAGS TO TEST FOR ZERO @@ -970,22 +1105,30 @@ IDE_PROBE0: ; ; CHECK SIGNATURE DCALL PC_SPACE - IN A,(IDE_IO_COUNT) + ;IN A,(IDE_IO_COUNT) + CALL IDE_IN + .DB IDE_REG_COUNT DCALL PRTHEXBYTE CP $01 JP NZ,IDE_NOMEDIA DCALL PC_SPACE - IN A,(IDE_IO_SECT) + ;IN A,(IDE_IO_SECT) + CALL IDE_IN + .DB IDE_REG_SECT DCALL PRTHEXBYTE CP $01 JP NZ,IDE_NOMEDIA DCALL PC_SPACE - IN A,(IDE_IO_CYLLO) + ;IN A,(IDE_IO_CYLLO) + CALL IDE_IN + .DB IDE_REG_CYLLO DCALL PRTHEXBYTE CP $00 JP NZ,IDE_NOMEDIA DCALL PC_SPACE - IN A,(IDE_IO_CYLHI) + ;IN A,(IDE_IO_CYLHI) + CALL IDE_IN + .DB IDE_REG_CYLHI DCALL PRTHEXBYTE CP $00 JP NZ,IDE_NOMEDIA @@ -1005,33 +1148,21 @@ IDE_INITDEV: OR A ; SET FLAGS JP Z,IDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS ; - ; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING - ; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE - ; PROBES WHEN THE IDE BUS WAS RESET - ;PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE - ;PUSH HL ; SAVE UNIT TYPE FIELD POINTER - ;IDE_DPTR(0) ; SET HL TO START OF UNIT DATA - ;LD BC,IDE_UDLEN - ;XOR A - ;CALL FILL - ;POP HL ; RECOVER UNIT TYPE FIELD POINTER - ;POP AF ; RECOVER UNIT TYPE VALUE - ;LD (HL),A ; AND PUT IT BACK -; -#IF (IDE8BIT) + BIT 1,(IY+IDE_ACC) ; 8 BIT ACCESS? + JR Z,IDE_INITDEV0 ; NO, DO 16 BIT INIT LD A,IDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO -#ELSE - LD A,IDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO -#ENDIF - CALL IDE_SETFEAT ; SET FEATURE - -#IF (IDE8BIT) + RET NZ ; BAIL OUT ON ERROR + JR IDE_INITDEV00 ; CONTINUE +; +IDE_INITDEV0: ; "REAL" IDE DRIVES MAY NOT ACCEPT THE DISABLE8BIT FEATURE COMMAND, ; SO IT IS ONLY AN ERROR IF WE ARE ATTEMPTING TO ENABLE8BIT. - ; CREDIT TO ED BRINDLEY FOR THIS CORRECTION. - RET NZ ; BAIL OUT ON ERROR -#ENDIF + ; CREDIT TO ED BRINDLEY FOR THIS CORRECTION. SO ERROR RETURN IGNORED HERE. + LD A,IDE_FEAT_DISABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO + CALL IDE_SETFEAT ; SET FEATURE, IGNORE ERRORS +; +IDE_INITDEV00: ; CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND RET NZ ; BAIL OUT ON ERROR @@ -1040,7 +1171,7 @@ IDE_INITDEV: DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING ; XOR A - LD (IY+IDE_FLAGS),0 ; CLEAR FLAGS + LD (IY+IDE_MED),0 ; CLEAR FLAGS ; DETERMINE IF CF DEVICE LD HL,HB_WRKBUF ; FIRST WORD OF IDENTIFY DATA HAS CF FLAG @@ -1051,14 +1182,14 @@ IDE_INITDEV: LD A,$84 ; SECOND BYTE OF MARKER IS $84 CP (HL) ; COMPARE JR NZ,IDE_INITDEV1 ; IF NOT MATCH, NOT CF - SET 0,(IY+IDE_FLAGS) ; SET FLAGS BIT FOR CF MEDIA + SET 0,(IY+IDE_MED) ; SET FLAGS BIT FOR CF MEDIA ; IDE_INITDEV1: ; DETERMINE IF LBA CAPABLE LD A,(HB_WRKBUF+98+1) ; GET BYTE WITH LBA BIT FROM BUFFER BIT 1,A ; CHECK THE LBA BIT JR Z,IDE_INITDEV2 ; NOT SET, BYPASS - SET 1,(IY+IDE_FLAGS) ; SET FLAGS BIT FOR LBA + SET 1,(IY+IDE_MED) ; SET FLAGS BIT FOR LBA ; IDE_INITDEV2: ; GET DEVICE CAPACITY AND SAVE IT @@ -1078,15 +1209,24 @@ IDE_INITDEV2: ; RET ; RETURN, A=0, Z SET ; +; SWITCH IY POINTER FROM CURRENT UNIT CFG TO PARTNER UNIT CFG ; +IDE_GOPARTNER: + PUSH HL ; SAVE HL + LD L,(IY+IDE_PARTNER) ; GET PARTNER ENTRY + LD H,(IY+IDE_PARTNER+1) ; ... + PUSH HL ; MOVE HL + POP IY ; ... TO IY + POP HL ; RESTORE INCOMING HL + RET ; AND DONE +; +; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER +; VIA RESET IF DEVICE IS IN ERROR. ; -IDE_CHKDEVICE: +IDE_CHKERR: LD A,(IY+IDE_STAT) ; GET STATUS OR A ; SET FLAGS - RET Z ; RETURN IF ALL IS WELL -; - ; ATTEMPT TO REINITIALIZE HERE??? - JP IDE_ERR + CALL NZ,IDE_RESET ; IF ERROR STATUS, RESET BUS RET ; ; @@ -1097,7 +1237,9 @@ IDE_WAITRDY: IDE_WAITRDY1: LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITRDY2: - IN A,(IDE_IO_STAT) ; READ STATUS + ;IN A,(IDE_IO_STAT) ; READ STATUS + CALL IDE_IN + .DB IDE_REG_STAT LD C,A ; SAVE IT AND %11000000 ; ISOLATE BUSY AND RDY BITS XOR %01000000 ; WE WANT BUSY(7) TO BE 0 AND RDY(6) TO BE 1 @@ -1117,7 +1259,9 @@ IDE_WAITDRQ: IDE_WAITDRQ1: LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITDRQ2: - IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER + ;IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER + CALL IDE_IN + .DB IDE_REG_STAT LD C,A ; SAVE IT AND %10001000 ; TO FILL (OR READY TO FILL) XOR %00001000 @@ -1137,7 +1281,9 @@ IDE_WAITBSY: IDE_WAITBSY1: LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITBSY2: - IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER ; 11TS + ;IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER ; 11TS + CALL IDE_IN ; 17TS + ???TS + .DB IDE_REG_STAT ; 0TS LD C,A ; SAVE IT ; 4TS AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS RET Z ; 5TS @@ -1146,7 +1292,39 @@ IDE_WAITBSY2: OR E ; 4TS JR NZ,IDE_WAITBSY2 ; 12TS DJNZ IDE_WAITBSY1 ; ----- - JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; 52TS + JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; ??TS +; +; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A +; +IDE_IN: + EX (SP),HL ; GET PARM POINTER + PUSH BC + LD A,(HL) + INC HL + LD C,(IY+IDE_IOBASE) + ADD A,C + LD C,A + IN A,(C) + POP BC + EX (SP),HL ; RESTORE STACK + RET +; +; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY +; +IDE_OUT: + EX (SP),HL ; GET PARM POINTER + PUSH BC + PUSH AF + LD A,(HL) + INC HL + LD C,(IY+IDE_IOBASE) + ADD A,C + LD C,A + POP AF + OUT (C),A + POP BC + EX (SP),HL ; RESTORE STACK + RET ; ;============================================================================= ; ERROR HANDLING AND DIAGNOSTICS @@ -1252,7 +1430,10 @@ IDE_REGDUMP: PUSH BC CALL PC_SPACE CALL PC_LBKT - LD C,IDE_IO_CMD + ;LD C,IDE_IO_CMD + LD A,(IY+IDE_IOBASE) + ADD A,IDE_REG_CMD + LD C,A LD B,7 IDE_REGDUMP1: IN A,(C) @@ -1284,16 +1465,20 @@ IDE_PRTPREFIX: #IF (DSKYENABLE) IDE_DSKY: LD HL,DSKY_HEXBUF ; POINT TO DSKY BUFFER - IN A,(IDE_IO_DRVHD) ; GET DRIVE/HEAD + CALL IDE_IN + .DB IDE_REG_DRVHD LD (HL),A ; SAVE IN BUFFER INC HL ; INCREMENT BUFFER POINTER - IN A,(IDE_IO_CYLHI) ; GET DRIVE/HEAD + CALL IDE_IN + .DB IDE_REG_CYLHI LD (HL),A ; SAVE IN BUFFER INC HL ; INCREMENT BUFFER POINTER - IN A,(IDE_IO_CYLLO) ; GET DRIVE/HEAD + CALL IDE_IN + .DB IDE_REG_CYLLO LD (HL),A ; SAVE IN BUFFER INC HL ; INCREMENT BUFFER POINTER - IN A,(IDE_IO_SECT) ; GET DRIVE/HEAD + CALL IDE_IN + .DB IDE_REG_SECT LD (HL),A ; SAVE IN BUFFER CALL DSKY_HEXOUT ; SEND IT TO DSKY RET @@ -1314,6 +1499,13 @@ IDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$" IDE_STR_STUNK .TEXT "UNKNOWN ERROR$" ; IDE_STR_NO .TEXT "NO$" +IDE_STR_NOHW .TEXT "NOT PRESENT$" +IDE_STR_8BIT .TEXT " 8-BIT$" +; +IDE_STR_MODE_DIO .TEXT "DIO$" +IDE_STR_MODE_DIDE .TEXT "DIDE$" +IDE_STR_MODE_MK4 .TEXT "MK4$" +IDE_STR_MODE_RC .TEXT "RC$" ; ;============================================================================= ; DATA STORAGE @@ -1327,3 +1519,5 @@ IDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; IDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER +; +IDE_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index fc964390..3cb48b86 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -4,8 +4,8 @@ ;============================================================================= ; ; TODO: -; - IMPLEMENT INTELLIGENT RESET, CHECK IF DEVICE IS ACTUALLY BROKEN BEFORE RESET ; - FIX SCALER CONSTANT +; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION ; ; NOTES: ; - WELL KNOWN PPIDE PORT ADDRESSES: @@ -30,8 +30,8 @@ PPIDE_DIR_WRITE .EQU %10000000 ; IDE BUS DATA OUTPUT MODE PPIDE_CTL_DA0 .EQU %00000001 ; DRIVE ADDRESS BUS - BIT 0 (DA0) PPIDE_CTL_DA1 .EQU %00000010 ; DRIVE ADDRESS BUS - BIT 1 (DA1) PPIDE_CTL_DA2 .EQU %00000100 ; DRIVE ADDRESS BUS - BIT 2 (DA2) -PPIDE_CTL_CS1FX .EQU %00001000 ; DRIVE CHIP SELECT 0 (ACTIVE LOW, INVERTED) -PPIDE_CTL_CS3FX .EQU %00010000 ; DRIVE CHIP SELECT 1 (ACTIVE LOW, INVERTED) +PPIDE_CTL_CS1 .EQU %00001000 ; DRIVE CHIP SELECT 0 (ACTIVE LOW, INVERTED) +PPIDE_CTL_CS3 .EQU %00010000 ; DRIVE CHIP SELECT 1 (ACTIVE LOW, INVERTED) PPIDE_CTL_DIOW .EQU %00100000 ; DRIVE I/O WRITE (ACTIVE LOW, INVERTED) PPIDE_CTL_DIOR .EQU %01000000 ; DRIVE I/O READ (ACTIVE LOW, INVERTED) PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) @@ -66,7 +66,7 @@ PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) ; | PPIDE_REG_STAT | 0x07 | R | STATUS REGISTER | ; | PPIDE_REG_CMD | 0x07 | W | COMMAND REGISTER (EXECUTE) | ; +-----------------------+-------+-------+-------------------------------+ -; * LBA0-4 ARE ALTERNATE DEFINITIONS OF SECT, CYL, AND DRVHD PORTS +; * LBA0-3 ARE ALTERNATE DEFINITIONS OF SECT, CYL, AND DRVHD PORTS ; ; === STATUS REGISTER === ; @@ -122,33 +122,31 @@ PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED) ; SRST: SOFTWARE RESET ; ~IEN: INTERRUPT ENABLE ; -; CONTROL VALUES TO USE WHEN ACCESSING THE VARIOUS IDE DEVICE REGISTERS -; -PPIDE_REG_DATA .EQU PPIDE_CTL_CS1FX | $00 ; DATA INPUT/OUTPUT (R/W) -PPIDE_REG_ERR .EQU PPIDE_CTL_CS1FX | $01 ; ERROR REGISTER (R) -PPIDE_REG_FEAT .EQU PPIDE_CTL_CS1FX | $01 ; FEATURES REGISTER (W) -PPIDE_REG_COUNT .EQU PPIDE_CTL_CS1FX | $02 ; SECTOR COUNT REGISTER (R/W) -PPIDE_REG_SECT .EQU PPIDE_CTL_CS1FX | $03 ; SECTOR NUMBER REGISTER (R/W) -PPIDE_REG_CYLLO .EQU PPIDE_CTL_CS1FX | $04 ; CYLINDER NUM REGISTER (LSB) (R/W) -PPIDE_REG_CYLHI .EQU PPIDE_CTL_CS1FX | $05 ; CYLINDER NUM REGISTER (MSB) (R/W) -PPIDE_REG_DRVHD .EQU PPIDE_CTL_CS1FX | $06 ; DRIVE/HEAD REGISTER (R/W) -PPIDE_REG_LBA0 .EQU PPIDE_CTL_CS1FX | $03 ; LBA BYTE 0 (BITS 0-7) (R/W) -PPIDE_REG_LBA1 .EQU PPIDE_CTL_CS1FX | $04 ; LBA BYTE 1 (BITS 8-15) (R/W) -PPIDE_REG_LBA2 .EQU PPIDE_CTL_CS1FX | $05 ; LBA BYTE 2 (BITS 16-23) (R/W) -PPIDE_REG_LBA3 .EQU PPIDE_CTL_CS1FX | $06 ; LBA BYTE 3 (BITS 24-27) (R/W) -PPIDE_REG_STAT .EQU PPIDE_CTL_CS1FX | $07 ; STATUS REGISTER (R) -PPIDE_REG_CMD .EQU PPIDE_CTL_CS1FX | $07 ; COMMAND REGISTER (EXECUTE) (W) -PPIDE_REG_ALTSTAT .EQU PPIDE_CTL_CS3FX | $06 ; ALTERNATE STATUS REGISTER (R) -PPIDE_REG_CTRL .EQU PPIDE_CTL_CS3FX | $06 ; DEVICE CONTROL REGISTER (W) -PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) -; #IF (PPIDETRACE >= 3) #DEFINE DCALL CALL #ELSE #DEFINE DCALL \; #ENDIF ; -PPIDE_DEVCNT .EQU PPIDECNT * 2 ; ASSUME ONLY PRIMARY INTERFACE +; CONTROL VALUES TO USE WHEN ACCESSING THE VARIOUS IDE DEVICE REGISTERS +; +PPIDE_REG_DATA .EQU PPIDE_CTL_CS1 | $00 ; DATA INPUT/OUTPUT (R/W) +PPIDE_REG_ERR .EQU PPIDE_CTL_CS1 | $01 ; ERROR REGISTER (R) +PPIDE_REG_FEAT .EQU PPIDE_CTL_CS1 | $01 ; FEATURES REGISTER (W) +PPIDE_REG_COUNT .EQU PPIDE_CTL_CS1 | $02 ; SECTOR COUNT REGISTER (R/W) +PPIDE_REG_SECT .EQU PPIDE_CTL_CS1 | $03 ; SECTOR NUMBER REGISTER (R/W) +PPIDE_REG_CYLLO .EQU PPIDE_CTL_CS1 | $04 ; CYLINDER NUM REGISTER (LSB) (R/W) +PPIDE_REG_CYLHI .EQU PPIDE_CTL_CS1 | $05 ; CYLINDER NUM REGISTER (MSB) (R/W) +PPIDE_REG_DRVHD .EQU PPIDE_CTL_CS1 | $06 ; DRIVE/HEAD REGISTER (R/W) +PPIDE_REG_LBA0 .EQU PPIDE_CTL_CS1 | $03 ; LBA BYTE 0 (BITS 0-7) (R/W) +PPIDE_REG_LBA1 .EQU PPIDE_CTL_CS1 | $04 ; LBA BYTE 1 (BITS 8-15) (R/W) +PPIDE_REG_LBA2 .EQU PPIDE_CTL_CS1 | $05 ; LBA BYTE 2 (BITS 16-23) (R/W) +PPIDE_REG_LBA3 .EQU PPIDE_CTL_CS1 | $06 ; LBA BYTE 3 (BITS 24-27) (R/W) +PPIDE_REG_STAT .EQU PPIDE_CTL_CS1 | $07 ; STATUS REGISTER (R) +PPIDE_REG_CMD .EQU PPIDE_CTL_CS1 | $07 ; COMMAND REGISTER (EXECUTE) (W) +PPIDE_REG_ALTSTAT .EQU PPIDE_CTL_CS3 | $06 ; ALTERNATE STATUS REGISTER (R) +PPIDE_REG_CTRL .EQU PPIDE_CTL_CS3 | $06 ; DEVICE CONTROL REGISTER (W) +PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3 | $07 ; DRIVE ADDRESS REGISTER (R) ; ; COMMAND BYTES ; @@ -202,7 +200,7 @@ PPIDE_LBA .EQU 9 ; OFFSET OF LBA (DWORD) PPIDE_DATALO .EQU 13 ; BASE PORT AND IDE DATA BUS LSB (8255 PORT A) (BYTE) PPIDE_CTL .EQU 14 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) PPIDE_PPI .EQU 15 ; 8255 CONTROL PORT(BYTE) -PPIDE_PARTNER .EQU 16 ; PARTNER DEVICE (MASTER <-> SLAVE) +PPIDE_PARTNER .EQU 16 ; PARTNER DEVICE (MASTER <-> SLAVE) (WORD) ; PPIDE_ACC_MAS .EQU %00000001 ; UNIT IS MASTER (ELSE SLAVE) PPIDE_ACC_8BIT .EQU %00000010 ; UNIT WANTS 8 BIT I/O (ELSE 16 BIT) @@ -210,6 +208,8 @@ PPIDE_ACC_8BIT .EQU %00000010 ; UNIT WANTS 8 BIT I/O (ELSE 16 BIT) PPIDE_MED_CF .EQU %00000001 ; MEDIA IS CF CARD PPIDE_MED_LBA .EQU %00000010 ; MEDIA HAS LBA CAPABILITY ; +PPIDE_DEVCNT .EQU PPIDECNT * 2 +; PPIDE_CFGTBL: ; #IF (PPIDECNT >= 1) @@ -722,7 +722,6 @@ PPIDE_WRSEC: ; ; PPIDE_SETADDR: - ; XXX ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_IO_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_IO_LBA2-0 @@ -731,19 +730,19 @@ PPIDE_SETADDR: DCALL PRTHEXBYTE CALL PPIDE_OUT .DB PPIDE_REG_LBA2 - +; LD A,(IY+PPIDE_LBA+1) DCALL PC_SPACE DCALL PRTHEXBYTE CALL PPIDE_OUT .DB PPIDE_REG_LBA1 - +; LD A,(IY+PPIDE_LBA+0) DCALL PC_SPACE DCALL PRTHEXBYTE CALL PPIDE_OUT .DB PPIDE_REG_LBA0 - +; LD A,1 DCALL PC_SPACE DCALL PRTHEXBYTE @@ -1000,7 +999,9 @@ PPIDE_RESET: CALL PPIDE_GOPARTNER ; POINT TO SLAVE CALL PPIDE_INITUNIT ; INIT PARTNER UNIT POP IY ; RECOVER ORIG CFG PTR - RET +; + XOR A ; SIGNAL SUCCESS + RET ; AND DONE ; ; ; @@ -1015,9 +1016,7 @@ PPIDE_INITUNIT: RET NZ ; JUST RETURN IF NOTHING THERE CALL PPIDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE - RET NZ ; IF FAILED, ALL DONE - - RET + RET ; DONE ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; @@ -1026,15 +1025,15 @@ PPIDE_SELUNIT: CALL PPIDE_PRTPREFIX PRTS(" SELUNIT$") #ENDIF - BIT 0,(IY+PPIDE_ACC) ; MASTER? - JR Z,PPIDE_SELUNIT1 ; HANDLE SLAVE - LD A,PPIDE_DRVMASTER ; MASTER - JR PPIDE_SELUNIT2 -PPIDE_SELUNIT1: - LD A,PPIDE_DRVSLAVE ; SLAVE -PPIDE_SELUNIT2: - LD (PPIDE_DRVHD),A ; SAVE IT - XOR A ; SUCCESS + BIT 0,(IY+PPIDE_ACC) ; MASTER? + JR Z,PPIDE_SELUNIT1 ; HANDLE SLAVE + LD A,PPIDE_DRVMASTER ; MASTER + JR PPIDE_SELUNIT2 +PPIDE_SELUNIT1: + LD A,PPIDE_DRVSLAVE ; SLAVE +PPIDE_SELUNIT2: + LD (PPIDE_DRVHD),A ; SAVE IT + XOR A ; SUCCESS RET ; ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index e8ecf3a6..aa6ae0aa 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -151,10 +151,8 @@ FDMODE_DYNO .EQU 9 ; DYNO WDC 37C65 @ $84 IDEMODE_NONE .EQU 0 IDEMODE_DIO .EQU 1 ; DISKIO V1 IDEMODE_DIDE .EQU 2 ; DUAL IDE -IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT) -IDEMODE_RC .EQU 4 ; RC2014 CF MODULE (8 BIT) @ $10 (SPENCER OWEN) -IDEMODE_SMB .EQU 5 ; RC2014 IDE MODULE (8 BIT) @ $E0 (SCOTT BAKER) -IDEMODE_DYNO .EQU 6 ; DYNO IDE MODULE (8 BIT) @4A +IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT ONLY) +IDEMODE_RC .EQU 4 ; RC2014 CF MODULE (8 BIT ONLY) ; ; PPIDE MODE SELECTIONS ; From a9b400f0766371c457d0e7f283201578164d940d Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 17:10:11 -0800 Subject: [PATCH 29/36] Update ide.asm Cosmetic bug fix --- Source/HBIOS/ide.asm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 5c4240a9..b2f771f3 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -911,7 +911,9 @@ IDE_RESET: JR NZ,IDE_RESET1 ; IF NOT, BYPASS ; ; USE HARDWARE RESET LINE +#IF (IDETRACE >= 3) PRTS(" HARD$") +#ENDIF LD A,$80 ; HIGH BIT OF XAR IS IDE RESET ;OUT (IDE_IO_XAR),A CALL IDE_OUT @@ -937,7 +939,9 @@ IDE_RESET1: ; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE, ; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME ; VALUES THAT A RESET WOULD CAUSE. +#IF (IDETRACE >= 3) PRTS(" FAKE$") +#ENDIF XOR A ;OUT (IDE_IO_CYLLO),A CALL IDE_OUT @@ -966,7 +970,9 @@ IDE_RESET2: JR Z,IDE_RESET3 ; IF SO, BYPASS ; ; INITIATE SOFT RESET +#IF (IDETRACE >= 3) PRTS(" SOFT$") +#ENDIF LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES ;OUT (IDE_IO_CTRL),A CALL IDE_OUT @@ -986,7 +992,9 @@ IDE_RESET3: JR Z,IDE_RESET4 ; IF SO, BYPASS ; ; CONFIGURE OPERATION AND END SOFT RESET +#IF (IDETRACE >= 3) PRTS(" CONFIG$") +#ENDIF LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET ;OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER CALL IDE_OUT From 5d35a80cf702a6c7f0f2d5c2585291d82331c64d Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 11 Feb 2020 19:31:30 -0800 Subject: [PATCH 30/36] Update romldr.asm --- Source/HBIOS/romldr.asm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 4fce8151..c6be9084 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -244,7 +244,9 @@ SEL1: OUT (LEDPORT),A ; CLEAR LED #ENDIF #ENDIF - CALL DSKY_KEY ; GET PENDING KEY PRESS ; NOTE DESKY_GETKEY + CALL DSKY_GETKEY ; GET PENDING KEY PRESS ; NOTE DESKY_GETKEY + CP $FF ; CHECK FOR ERROR + JR Z,SEL2 ; IF SO, IGNORE KEY, AND CONT LOOPING CP KY_BO ; CHECK FOR REBOOT ; CAN RETURN AN INVALID JP Z,REBOOT ; REBOOT REQUEST ; KEYSCAN AS FFH WHICH LD DE,MENU_S+11-MENU_V ; POINT TO DSKY MENU COLUMN ; MAY BE MATCHED WITH @@ -307,8 +309,8 @@ MATS2: LD B,0 ; WE GOT A MATCH FROM THE MENU TABLE. POINT MATD: LD B,A LD A,C ; IF INPUT WAS SERIAL DEC C ; CONVERT TO FROM. - JR Z,MATD1 ; ASCII TO DECIMAL. - LD A,B ; DSKY NUMBERS ARE + LD A,B ; ASCII TO DECIMAL. + JR Z,MATD1 ; DSKY NUMBERS ARE SUB '0' ; ALREADY DECIMAL MATD1: CP 10 ; DO A RANGE CHECK JR NC,MATX ; NOT VALID, HANDLE IT BELOW From 3f9b41e8916749dcd7b42304c0864785ce152a51 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 12 Feb 2020 11:25:51 -0800 Subject: [PATCH 31/36] Create SC126_How-To_No_1_Serial_Comms_Using_Minicom.pdf Thanks to David Reese for another userful How-To document. --- ..._How-To_No_1_Serial_Comms_Using_Minicom.pdf | Bin 0 -> 343062 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Doc/Contrib/SC126_How-To_No_1_Serial_Comms_Using_Minicom.pdf diff --git a/Doc/Contrib/SC126_How-To_No_1_Serial_Comms_Using_Minicom.pdf b/Doc/Contrib/SC126_How-To_No_1_Serial_Comms_Using_Minicom.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eb4d5b4876aea7b63bbba9de7db05762120866c8 GIT binary patch literal 343062 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

9>J1Dl4J+hxjH-=(!k4^-17P|ly+in| zKVKG&<@Gu!n3)uDJw~h|Pu{J(X~6u7Aa)~v{XMKQA7z_0Ur}};HZ;1odzU@ij;g0I zHQ!>b@I%{{ypngA&4RXIujHiL{}8}2YhcU}P?+NHvmjLBFc9pB9c%x2}C8rwb!5O7;? zAf(RQUyn=Q%~NP%OQ)R%`>;l|s0>rwDQg%&P9+lK>!G@P!w@*oG_yPQ48>IGk+d%S zq0z_)D3G1xj8A zuBSde)s&&%&aY(wG8CLSjic^w;_?z*2G{0rP-?F=KGIHAW4@VruV6HA{tCvYT+`;* z=_)Z=onJS{4(haA2<7$^-~>?73?+qa(k_uKdNV0uYfsPjqij>Cz;+~G{F66lk5+S} z6;YPjg;JpXGlpe63Y+!{*02vg9uEPQq(c7M$W=8FE1W`&k@9#eRE{B0ReK$)y{Hbk z#_;@(Z(ldT9tf9+-ytvhBJriY3?9nsxbYzv^W&F zK7WB6a}2Ms`M`h{2W_P%90B}&{t}Z@i~r6kSBMaNyH>le_0GAqZ8WxdndiTtr4QFE zYJXg2)Z8=bug?dsVsX^Ggb;(u7ajjZO+SBA;1jy_df%h)#z$F$pj6xQy-?0`jGMDO zMS^Q`rC}L3BvyJ#Sq>$f4zVY)PyC8f>W8^o6%;(noLMz4`^rDf2tcmG<*=1cd=U`I z#@E!^r&#UA7FH_h_vIb4b#moZ7Z(+4+hg$9q*sJ@irQ^3otu% zsT+%|k`-U=yOhrDaej0+VySJ_i4s&m?Z(A;cW*5#O(CowMvB;0IMYkg;w)ThEcyzh z%N5GXf$#A1#1l2ck}3IbslNoo>P2TX^@@j_1=!tW0fRUdHeUI;Gp!*#VeR-XmDLYJ z?195Q2ds6(vo8V5%7b$*mF>rAOP#Hnivt_bka^6P4E-D z(qz`C9DqjgWC%ed3)hynfH7cU;qAKvv~ytm+PEiH>CyUP~cOm3Z)27vMxrCIJDHm_WB8?cjzg z8(h&O5~8cLfyAPum1>66vv(g#8oGW}wI%XIH|}W?&g*YQEEL>~B&a(`$_@w?tdt4mIj5O}y zkg-nxCvh6<6q*lEZPAdFVv=~xBAYnjR9%a2K>K`r{mTO`GkBQ>qb!kGpBjI{@a46l z-(f!M^wDoXj9X}L10Q!&MMT4guvWXf`Ep_aX8&829{u%CRXRxVw<=9f4+1<6QM*&? zj7*jfaYp=)96Zw|nz3~v0(KZJy2ZUaX9Shmif7vi;|(o5ks7FIXU+Z0Q?6@H#@G~^#=|C>@mA*$V35>Fe=$QK zCR0cDok!QV`Ep?8O0)5#Tr^`ihumx zz_JslKnnsBe_!X3)mjx^x)#B@Gl6*5_#MbOK}R=yG2}Jf2WSBnL^ zuLV?_1;E{f_Ao-GzclXtOl7Y*ZVr zb5Lai+Ag%0d#T}I3t#V+{_Jg=?jN* z${%_xG$5dN#ZF2$r!nOp<`pEnp0Q2T@KGZUo0=eR;z}Q}Nl2Iu9YSQOyynW-stqib znbvBYfSt74m4ze!5SV83Gwa=9EkSni2uYV$Lsn+d9`q zL$p(#-~;6+D@MMjaoU{AuLbpW)xh7HOO=0O2gD zww3BN(c-g!UK%C)_n%7ZHx5${rMFCDOvddA^W~eZ1D7lP5s`MgSkm-F<@^6g(RJL6 zCjww+0rBpS6S;Gl21pKM{+%LTGJfO#&tIO8#J^tu8i9X}z`sV|UnB6Z5%|{#{A&dM z>j?ZJRlB42l%iDk zm$^lE=fSS?Us|xQov6X+!`K;iE4Rp=TKNvX!9GhivxU|0BwC!t-%aYy-+^MUHDUzc)j8+Fw;xYzH~UgQ7_KEi6yn;4??5nV z8?BzuJ|A3Tb6Vk1&4%Vf)wS-PEEY{;6OIpNl1nieOWBhCupO?58pvwMG^@pRtYVbb_TChhk(p*T zAEt{rEeq&2s^W~Dr6pa*vWs4$z-ejOyH{^et<>heQIlpec*R4kA>fqJ4?VTT-ahAT z{4<%VJPRzXk5}smi2l0tZPdo~M(tHikB05tYPZzd?X&zceJS=!n|B!n_`ErK&psRq z|44BoELtHNbf>300zQct?1E{w89oMly^u>oc!wo)e_CKpoQpoSVVY`>>nXpk2SZ^} z(B*sG2{Eb*7#Yc;_+-WPyO~_a96hQSmCLcK{EpN$o8^xZ|R+vlgtx6w5M%@<+^EY1S6<(6|N~#u&Yk^lo41 zz(S%Jzi$CoBKb~;<<#f>@^)A3S9Jp3&%wr9qbu`3Lz_aCPMlAABew!ggsSG7q!)Eu ztvlhg@bNVq%3P{(-f!fm%a9r!J39%Wl@`amg*=@xiSv@`Ft}RSq3;1aQOAu-jKmbG zk+7Sh*!-K@J5Z%Bywg^vu;er1`D6Tf(=slh9jPo%I;vpJ0q0fIFr!DaL}$-{`blo*kjasGn8R8BH{gQ9RKqLY_`+BIcvRVI;K^AiW|>Sn z-oPhnfo*J&i{?i$zLE;@M&|T|lcQHb1$~Y1Gnj#%V0PHP?!AxgjSvy)+-U91(v2HV zlC=}*GHy(kPc<(rOCa3$zty|v86lA6*8_p^UmRQ#ugxlMNE=Y!TTjXS(IDpDpI98q zJOMYZomokd_eeZ4Nr*pQ{Ly6!aTBbwV_zSK=r63_?+5#MHg}t@h_{Saj?nv9pKOk> zt8<1i4_8`cOOE%4akwv@l3eS&u$+UBQ}oX?KE1P#Z*GgzB(1raBQ&@;#~T)$inc=5 zH3d>#v=f%{X>-S;NTLh0eQO`5<|fgCN8z6EC#Bp7+1?|i^)4O$br9<4ZR~= z<6X|UH(%BLV`wI_sIA?RNa&YoZGSe{s%0(Y)SlsvN)h{E8u~Q1Bc}`L_Bk_z?#|^M2lzkpB;Oqu1gJa1||Ftjum~MvaZ*6*7MBrBnO;Z`HS_9uUB8_VJSB zjAcbmbHMY!i!-$|rH17_lyap#Jk6`VgWm{=7vi9@fe4}Y!|HA}R*6X#h0ktq-Cz3{ zaGk~YOmIE#%^9kc{*A;@>V{X3%FBk!i~)#a0ceYh0?Gpu{7!PE&Y}3Im<=I)s6RDX zIAU=2#Z9*25$E{*1Rq1NMg!?ag;&e&YKH7W{P5Ct)vR3y>fv&*aa&ut?FK(Fj{cd0 z?nB@{Yy`Vnscj8>dhS>aUtF5pwaM2brT{G#3?8?=#AqTsZ;@tv0(pUJjv=P=yPtB_ zQ>Q-lJ)W5y$q8XTX^tGbDw{yg_Z0k~nv8Mkgrnt$ZXMT1PUCU+8j(5WQDV<<{wV!+ zRa>o3E)sLZ-O4}s*yyChTXmi9bL=L5=R?lxHV@7ZBz#JxxBaf9WDotTK&i?@Ru#x2 zePn;-AGaNR5GS6BtcJAHUWJSD^#UIQguf$~HbHecwKG@KUEil_dU#|Zk)$+5<5HDE zzH!rOb{U)8C6zO}!B3a&XR0!P3}9%or&gnWvpKk#y^itOJ?(O?rdsdv_6i#KA-Hbe zCDzSoc_Q?tdsLn$vRq>%{h%tfVap?ECuMT5{zVP@b<2iFL+gsZ2aCkE3N=G~Z?pQH zC-U9JHdBg=uRx~~_D)3EZV3hIQf6A4%{8xLR_B5!^?vxYfx>g)4~EsV6@>aDdZWie zSmo&=cP}26i&W=}1otIIXlm$EX0aAUbbF-sojR;f`?R1D(Zr|l(K>(j(wxdR|JN-o z6^iFHK(0ZheGFt#u$%p;HH*9Mx>CyfLZ(mVH!YvBmu9^0!V^YgHP}!wc%PWffh(J+hA8T!PlNvEcjp z)x4`e$uqQbIWACbNb*E_6`&>6ybFx52Q8y6~`kd$4}Jyp*-wo{@wkjbjw2 zl||UhLR#dM(7<)e&b?hZrqUOW;lR2XY2Dy-$pX!}p@IZny#SL98{Z9i{~e zj*+FWKSYNx+)No@tD>7fT6yFc#XFwQm=UyD+H&;VxLZ3@A!z$c(M%6|>g$hfdg%j9+*<{IdC8&kJ)TFewmO@^{bGj_7`oldg9te-c5>HEY7e7=+|BNeYg@|1{1 z?=NOPOEb>%L1FIoU3FjknuAV#ws`h~dPU{oE0FJM!@Tv2M9V!`ir!f@B#Cxxp&&U;l_OFa%=bN$edOF`l6)0;k=dM zH|ue$$Xe)uJ!XeF^~p=|Uzuib=joTvVm}h!2Y}!BT9=mbKEbCImQ~C)%ei`3oF0@i zBIUkJ3J&gKY-eUi^nDKJ({D3E6ZKWRZr`5eXsQzY>->}1L<35IAK>H&lr~DD*Gy^j z6%*I%kG}K2ibSk_18WPr(^~4}zv=)kb=q>6JZcC*I!O{2hLjwrt&kOX^J$C2!A2tMF~##bsw>v{v0i2k75pzO{ZH*v?CuB@ z+us+tIQ76^`p6*Yve4iaS;bp3WjA^^+4I|DruC@{!t7SG)6(DbSxY4gdiRu(72Dn} zF7OcPU7o7BF>co7Y5GoXc2@LR!sF!C&sZt9<4D9^F6l4BtyRxhnBng7hklm{N zU!1*lSX)uBFG>rv6fIDoNO9LajCR7$jeTtXQfOWsMW5dhrO4} zF>Gt8h@8%y6aidBED@-~_qf6qrHEL{S@u(OmqJ80wnOy0i>T^G4-GK(dOMN@833Jp zY2~LGn~Xhf?w(^tDjCWpD?rffFltT>#MxTx0EaLeY`ngC~xwMN#a^|6NW;BW=HB&i(23!7QW7H^Zbf?Y0(xEk#|z% zk#g^r1gc?=4jbR61oiHBT!Ne#nO7;dLGO)PPwEalX|;%^cC%~pw-<-W6Fw;ZamU}B$4#bag>K@0lb62C&IJn>9r zdCp~UX7LD26cD?Ncz*9KQywgOs% zF@2ydtv{hTQa%l;?L5l*Rh*`=S%|3kGOWg0n`&HIiO*V_3}AMVNV=T}yKBmB`ty^v z9a^C~DKdc0#jFpas2RCWx5YdsuNB=m9wk+o!L`g*_&t9zA`wahf7(z39Ws`jw-T~Q za5DyGOYPlt8Qu1r|1>s(#dUnRPea?oJsF=cmc%%oZ?PTtSnl8_sWrnN zE%EODHMc;dyW?36$ZqW8d`Vs%C_0CUb3I4y`;UushUgw?V@MYo^Z?*9TH~A!sL{jEmDJt9^`$u>%S*##f{O)MqCKfTvAnB^CJ&@iY{)PU$ zq(3141Z(3L4c!nPJ&%eTifO8fotBq?W_oNUb&VZAHSH2!?0s;exj(AcMH_g=7iQSn zMRME#0r@HOFXHqOF;>QUBLin+VaZKx4YFy5hA+hb>6Cno7ba8DBhF(H+Gldypb)a0 z{BYQM6E)$T6Px95lu^#kU)$^&I}F`P)*l;kV;O*uZ3C*i(Z9IGdSn`S7!Q98r}9{;RqbtT0--{yRDdA(JTI_RGhRhre@uD194sn_-Kw) z_}~0lJaoh|bZBgLYBw16tKR%41T^oj1we0PGtnzEn03XqQ+L9X@^J!8{5^SDl101x zeOX6lHjR$gcgv%*=`!O_yx8(<;Ag{hXu#}qaGPk?k69H&^YaFsr{pn(;2XF%v==aX zmIT&y`Kr3?Q|X!{+LgqJx;CPrpZEm*fWl?#E6|=cT|1TNoTdx*$T763ucMLjVSr>E zHE=a_nX=)=zcy{FX|;RDK02QKsf|sG7?pzRt+lkz_+lG=gd_KT>e|{|nRRB&#f73;HxEvsQ^Ae83juVNDYL~Dmy^$1 zH-S-K3r_cQlRMmFvb>w}zvQe%<%E^9fA1oE8HJ4qc^4ATR!J4VK%akkvCHeMOB)=F z7!1GooJ`l)a<4lQ{J!qYGu}S@<8}rqE`0iA)M6`#x=Vj|>@89&RtDM%ii`AAN`aW% z4dTh|DDJ-;if`M7y$80<_-|m!gmkgAfhjx=?5B9dL%odrSZu}`{DLdZsE&#WxqCFE zL-%j}9_r!wB0kDQYh^4KlhCAKS(nmcBT)y`sY0LOv5b|on3a=A1~eY|tXS@$XbqP%o%Axu5Mb3_2-tN3KgWaAgy-k@fc zvQTKVyw3d8o7_(9SrXBec*Up^v*GqZuZ`Tc9D%9 zYYQdU4V$k;5s!knHZ5;FA@5>eW2m|wP*@DBx3`lGWRuc~jDIeILE_v@`W}7iHwwxP zxz22GGyG}l5hFLpLPDW3sySo81IZ-CBsa{SKMzOG3-{K zY+#*SkebX)D@RK8L{MVp3OSG=a~h_2>UCr)3mFt(eBVplx8hl?;j;s8tHWAhS~)M^ z+rIaR6V-TH6l`i^r5ePtTPk07?OS7)v$ioW{Un)|VR=v5aa;XRGzpkc!-aZAZ)ut| zddPlbfUCFXK|w}wU9a68XwMzp0wv;2daJS+3fJTB9Z-8x^P29Itd1sg2~2)$agTqP z?5v}_?hR4e>!-4g|t3Slmb6$h; z^IzMm3Oj4~h5%QhTw`gkgR^hh8ail3Ik{ePA1-UK+YaEhHC&SL5HXzLW*8_{RD6(` zYZ8xt+bJl*x8o+_Za95()w)%k%*1ZdW2Y5*uvIf+_@RyuRo!N~V&ztw$@SCSMMDUa z2^yE+XXkdNhK#DM2yxy#pMTH}!+4d@{WQKSX2#Q+LC)G;*%tkx?HYSBtZ5KlH9J?? zh=y)+zlv`I&C6AZY;Wz0AFMU8{UYIGr8iej!bh{fB(gL2_hfyyI`c5t0)xhWK4jGe z1vFV4zzlgdOKR5E>4raGzVvdG^IH{1v-_WN0VYqqXw9B;BTrn904Y6GS(JJqLPr-z zRZsiy^w1rRCf`{~DmYSe0$IFb_d6S0&{!t|WLcIYm}H7l9Ua1E1eEmc`KN-d=%AQo zhTs-%dmHH8v;Y_I!KsN?On)5jpnYa9rj>Y6R{UF+ZdtSKu|Jz9?WD@rkeO^VpPzP5 z$AN*|K|nAG&*tRF6=A2H#In{3KP;Z<@hx|zw=a4=;NvGpeQZ)H8L6?) zSzDa%H)jmTv=?ZfY-tU-tJ)nU({X&?T%Lsk2XUAWOwGfuiJ*{}-f2awXZgolcwttb z=?ez~re!yK5N9=U5yQA~NVF20NnIjbl56ha=@LL4IuFCO&a+_KY#9xg^kWaENS#*R zzp2I7AA{HP#cc-G43JLj^{aG+RQJqTmwmYERxU?dgtM^FR*~7qzctaQ?pb97y?u8H~0TW6FBKp zeZ^I86FW(T7dURlJ|i_piR~dhxgR_ihwHA$hsl#G@@~HIAB18%(LWI}DDrMOH*hes zU3H6p6Ps(jEk}tRV{J6}yVbjm*<4WI@u!`?jTV@mY_4gfPO*M_dxc*-BM_;S2qO zncRA|EzL0rwW$s%!H+m>bGKXB;!H1vlElsrB69Fqo({XYD|M($%2L}(T{O2Xjh%22 z1jtadY<{LwQ=Y3<$=@mCb#*h2WwI1+eccS*Lhx2J1_CDodP_&$f zr{jEjE;tI$VYxhPaz|s{9?4>NcUqaP50|j)W{`3}fSiN%O$%K*py}_25^yboi&|6_ z>w>aKpL*pdBA~!yXr3jo8kbbNp-X^nS-}~Neq8zvbhD0J0fU_fJeaXH%y4|kjC0ut z+8X;&QMk(dm9?BW9s6H*PQFwOB;bqVYwQij6LYJ@_W0UG* zsVMimD)s|`VDm|Qzswuwxj`IRx=UJzt|5)GRhd(DoSaq%LQ96cQy++K!HaS%#>(R< zthQ#c^T!yMGX|<|#I1+#%~M3S79)Ffktxc~7I)e-(kxyUmmqbQO}S2ESW6gZu0#?$ z!C0z_UV^f$U1X&?>2%Mi6V7HCKUgniUNWH)Bn!X8ylu666$%bmyjs={Gdw0IvC({a zOyI^~NG;Q&`@FFp)=Oql34PThN<;p z+Sx9r#Sq%I#}`d@V~qL)wqQJH+S^-qM(1-7kc^RTZxzK}_sc~*jJ$%sM6%TE)>%>i z44=B9Pw^l#%sH)w?O>#YXRCYJ?sg6btN}=Ih&u~bN9CG6W*JHoKXW(y*zz%fg2v`=_N>$V81eIzg>>=kEJPg_#WrlvC+~ zTUxRh{}3z8^|P9vF@kVB84^K(yW^m1f1P2qT*0lRss@&1n+ z>)s0)YuQ2pOmgvJXpO+@+7L{|UJj|_;xb~k_QmPNyc{1AnyE}B=GL^MNHe?glaJf57_Xb=`Z%)n3Qyik)49B$7ZtP4(pMW+}ViWc$F1v8z)S#x+B2v++Iev{`T;Lyb_M_$duX(=Iv?1JmccWhH_R5e zk@*+)@=4WRbk}HM3gXFazPmdODS*tEM!nGT9ys!7Hn2`vT`wC#N~E@tI0p3L(jfsPzwF(KxOq|9c3{t#9rNVX43nSN z*_5704H&m{#M(x5X6YaM^zJX0XLc9f1oi_C%BZ%N;YxPDciDURrGy3W<0W&`n$+CH z2Vg5*%9*wh_2wdRzG21+Zr^hwMmlYjclh4z^=11AC$sZD`Jr<~XliIlncsRDV9%jo zT){>1fp{VCIL|q8CPl+)iMg?mnp+0~2UWV)q-T{AgS(rrhAY7=fpIj0fY!Vl7 zz_Z2L{ z;!=@_?n``@_&+|^MVPyMyhyglG4%Y7o##7u|Jz{1$IkQ%vtO{g@)rw`3Z(C=0Y~wl zhH_V7GFp}%LT%S1)irfH3=Hu+(0fVRM@F&KCim|q?iS96`<0}aE(a86_85`z4eoy( zm&VZAYihLJwyn$`hv4pwF7aX*jc^PfY0d2T4*?2FV~j|;WX3iJOTarW>kFvRhz$qu z#nM6F{^*+mOwx|@%ws2|t}(iaqN!MTyuQA?o89S)TKW~wYeCs0-2)xD2N}t_<=s7S zJWW2Pw^6S14#5q4c?eOAsMpXcJz(sJj2!z(nwoV1z+Y6WUW8q5l4fQ9UZNph>-viQ zbGg(JF?dM(MX9JfLp@+nyV8t?^LAvSXSl!q`LTWV9T+RK@*w2ZtZ!;Z3Q;-mS5tYk zyWx0Hk-tqFbvb3}0MxM<3#-5%?yxW6fPnyicgW_<92_&r$(6R#ZYYEAIx99&r*jUIpJZwi8z_iU z-xBpY+Q}gj9BCAPt6oV@g(Hlywrx!XHdZv0gqVSsM!v%{ zuuhI4W@P~+1&!-dt9f zyp~7C;;*rot@WFi6&kNsh|J;fl?tk?^HWK*ttg**40aa2bGZ{54&&r_FCo|FYZnd| zzIW#76pb}fIfjo9%SEx1L_`WnO{{_@ZSHO!;`Yq|h2wkGjsa^nlLMnGiZAl%NKowe zjjmU5Nit~OUKPuz0&s9=YxW+HRIEtqBEt#Po?-5EhvkLn-d@&m*6xSONpYpsI*7W! z#hU=JtLs%ln%&J}034%cs(4FADbXm?zst~XbCn>PL$OhR=)yMuwMma2avU;eI#J45 zGxPq9#C{Zuk55v?w(CvetON0Uc=G`V%5G_MU$XLCC1-o_((STzDAy>I;wLG}GT}{6 z{1*bOv9va0d_yFB!irw}7KUR#xkh`qS*+mM?A>Gf*!dXhS25L>SlT^>P}VAh*t3_lr&}KkNKus$wS4aQDk` zG<(*~S=V*1fxPV4+O<*RWmc4G`ShUe9(!H-#6esn9%`w(qm9O=Qx4g_;((Pn8Ce6mpLgO zJ+1tgC^~#zA#3jE+9GFLi;XM~M-reMOxa=X+?k^0S&+v-V528+$5Aemw-x&$%XUq{ z&Q?AA!em|($+uRytAAdqpUqp&^9LEp^_fjIEjW_i4<*8~_Gp!=?bgT@%*84zNwyRa0 z3Wrvzu@1oa=X%G7w{p6hmS}=}NARQ<*JOvi5G=FyIgh+P_4M*Z#CPmUEQ*)cdmOJZ zF7|ze8XrNLx&_p+h&X^l%zLexr81nYowBYvE`xW` zM0U^cEmj@K*K)!4D;g!F=KW<@N7`)W+sUx)q{~PSb!oA~w{yy+Gp+650KUt~B$AdN zW$q5m@6V=HR$OS&EpsSpX;gBo`#&rl(B${J6ajPAJS!))zgbQE@f>mhU+DvY`paM1 zbfM}*zTGr{m^@q}f_MleS#9V^GY-g5LC%F;9&&?J^d= z!=L(&@pa{L*0BA|B5IQRDG*o2+5L^2KvEpO`scnOLgq!^AZvpZKVj!17Y&n{(Zxwkq5R?$3b&ub2}JvdD=VeO2g_MWLLh~$Tt^3`o{EXI1Ifzf6>&^VeCy8sAM#;q=)1J^XgvO zm30?bxN4j(k_jrjeM?Oi{~CPCLYl)zj*JKopG9eTUEc!Xu>1O@^SrUw)rVS$Ad3!6wso{EtdpyQ95z)o>b)@`g@YzB;1(pm1TP(ZL zveXZ^XvFPlhQfx7f&2;w9Btgyl$JQ^MaKwIR{Upp~)cTl(C0xU{zoORV<@w=- zb^fYvbLQe4DCcm}y+k{?oWED|p=`!}^B_E_QoqBcXFYY}0Z>X*OrVEvf8AKF#y1{g zK(=ru0FS53np0gRcOGL>B()kO6aH_jTpNHmV5awtmwBbBBA z&i%fuHoLXjQ=ME2JB=HmWnOeY?GKBOn+nquYUn?Y z!g(vOSw%~6Kssox%NbA+l8R(qzH8Gwk8rnbS~@8Z7rx#xmyv=_(p*fT$ts z%ZH_nxqRYqnLMx?^>Ez3rN~TA7%Q*6B)+2YuxV5xwDt=Iv=3BSOqCZw0EQ+jE*OKo zI?-rMJh!-gA*>}=aL>;kg==!e;PC{%{hKg96`upS`MJ~LvHN{KJo#ad&HE{ii(FFm z4?uJU-`s?;ZP|35>XWV4sXv!!uji0STT_jD0$2ZbGoIg45DcD&vV6^S9CW{=bKjW_ z$CWSom$rMBDiSPP1njuBe)i!XuaKCh__|#!x*rXFb*DewrX*9h@NX2Fg9i>8Wiop2 z+;*5iiw)fEV>L7SvdtON6m`w z9W^%@7jLebZJdF@hD7mOg7`m@)_TQ%$?Ul^!c-?A&re zus+1@p(|JH$_34?#K270lquQIfGudLSd^-^Ha5%4MStv!c8axMPsRi1RB%NAAp?X@GoDJ8t+;9iSGtqK3 zZxRa;9@ffR|G3dAWl%|+Z~ye&P$9_;+_?D()YjH+Q|6RVaVTftSw0&-YE7ia89jRx z2Hh;1bnIa$PE}(Fp%seLJSm)fU)OAPY48$m{Hh9>2pBcBQz~F&m6vW+rqclphv!;~ zC!CM1Iagv?U$_j z5L7SxQGt?4-qfK&=qLH26gS1{b8#H1!7aBPHXgLyuUepzUr|{hx4)J?^B9a%S}Y9(!4B}QrksJ0GU`fX`v9sD1XmZ8N%Y}wiA;T_=SHV7xF)^#)#18YI-8*iR`W8Q$>sg9 zb7XgE2W-_7Qzfj?M4YIWMFi446c!2Z}{#x8%`CS%rPbBp61lH9+EFHP+$e+LgId@~~g z0z`9O{r)M67~?ld%sWa^Lp=Bx5Ojd7RAV&%`LVtvv1y@>w!JTk_~v2Rgb;p3RCumD zAw9%zgM_j*cUVNL33y69lmO3bo60^~t~J})cBO4#VPi?c18#`WB>*M3iQ(;T)!;Yj z7u~}k*?B*Y0eb%1dF4;1U1Uw|%U>1qWJ;eVh_NE*LU*yT%Jlz2H)t@JX8b*pz6p%O z*&wBD%WM)I1mBOVt(#uTlE97`VNFBOgWBF1K5bP(`*A+Ocp?4 zcjp}83>$yH{NG7Pz__JH`v1HW;fKK!*(R9i5*1`?;^^c6GPL=3WM^cFiptJO{+ayW z5f^}y1MuI&-2XW&D99!cvNdxuCuax1hg8@kEv%hD4s4RvhE5;}kg=T!NLU#4KQHQ* zk*F@On5-*A0R5+3wy%(mvp-eFS+0-}>+QF8;Y%5^nMjyv8nOpk@dTN=;5-%c zrMF1rZCi$9S9+Z+V(y`=-H*PjFr2x%Yz_b1y~PcSCdr*X%Kla1qT2B_+KJ}zMkUqf z&2vKu0>fnoU17r+qqOoQqQvbC*%$RBkJt z99$JCC4t=?RUQLP23)i$Ur9M5d2?u6$e9*NYi3KP*YPhj@B7sK3Ynap7!ZgBUO`w= zwO7h~)Q>9(X!|8fjLN|2IqUoO43lF{p{dMYs97;t++xKq-XMlmIvLjBdcB`RI3wLp z3L5*#dPQA-spZo2{^wVLnhIGPV{ZRM2QBhRf$!f#N2+E_xpx!Y%OY=C6^QY~u17ss zIx)Q%s=Z_urv~%djP|nRBe1kl-?-5-#q_f{f5tYo4fLZUgdt)5VKi*JJqMrTP=hOb zV5tQ^L?_$QS}C8pYeK*i=#va>yNjy!i>Z%)dk6L{St0|xm|U%AS+^o<5D~|iKT+yf zo$xkr_bLk1`9Wvm7q5^VWy%I1D=zr?Mr{=v@8U=L$?Yq$e^h+p>t)^HBX6Tzg%|gH zwT$u`f%Cpuz;D8{{qyruLf2WS|2yZy68~R6G+I%)C!FS}d+#x)yQ>0zQmX}j4-dDe z=}jyq!0nvTVCgaWCY;2Leqq8kkcILJriMBXE959#ln=}{T6nNHkRXk+j#ce`!!f-7 z#>Ed^bvLWpU(b1cex+M|TRG#f2{S6j2#|%C6*V637@!(&kNDBU_l3*r*>(sk4~<%c zCe*SpvSDyzY7atQLSb0znts9G=)bQL$a8qNzK+3!&WmV;4R&8u-&VoYDfvmnw98L4u?=|Hc}2**F~gHA+44S4p|5!pJ9Bl37D|~CAT4}PD6u$rXAvvLRVj^% zr#A2fuZ&udj&ML!%W-18yk}qGuxu{S{WyP$oQQjHOmPAuwB78qpk8vY<mgrr`U0Z+1wU z4r6RU=%Hu47}1=lLB`$cZjTAU@Au0$mnrS$XR2qK#_3!^I50GX=VwmO90HK{3A&riethIs4w zU-6Lw87bSHH@=#J2~kK)5EoIN%4CtMtQs#`^bw-I)U1w8FHjV-C5;cyDrN8sUjuRM z;)Cfq?HSI-%#FA<=f9`Kxr$keZ=T`!&kB%5cb2B%5RVP#WI!~6_U}#aYMG~2 zcU{?tFMoFKF+>WGs^OrP+v8x)yzsole6$KPP{gqMkuPd^Ph>1v7O9#Lk%00&vE_Hp z$t^K^t@@8HK@WCQI#%8d_BbcDI<*aEa}Q;ZWpwpHHRikwS0Gk@P7hmz!H>ENhTZjm zq;(pWqCxy?8{DWOwa|QUh2ir0**h`m13lyBG7lBBLzVg0Hd%P&v$31}uG?=W2MeRn zgSD@WJ20cZ2d#2cI;!d%ZvK5?;_2agtr&7t_D;JfdD!}3PWR$xz%pg>B{79S)Lc92 zeS=YcvNPBIHuE=)A!SE*gb}8Yi1ihKbR%~^E3JPY#Q)0#x>k2tsV51(&JkIrlyv`x>jE}RS9i^}Xb1j1E zs3UMOUd^XuGg1ji51O1pNh#nW{3EG;VXf&oqWat#C{@Br+~qDq~oALYo=wweReh)C0G6$v7k25-seK2g1qcun5@neXv+FUNs9nSaPI$X{D z2Z&8e$;c99?8K((Y~=LsyNr#Y8Hi2O!UV3}0eqj?q(K&D=1$}Q4glL13n#~KAO~?f zn;&+zAX_JL-v2TKI6nU~15p1rb^x2Wowc2V>JLL>5Ss+Z#lje*BJ~CJf3*${mt941 zWxC${0K9+CU<6P8AB71C8F&h`X5kTgT)Vhb8=pYFpWuC!5b``Z>SlFO7V`+X+!{G9 zGQ*8~FWo8BA<}*VG^`ymHQSz_Pt_I>_zz1c-(EHf!YZvv_1x0_4m#O~{C$JOlGTkt zg-xf^*G#>k@zVYk!mgna;}3eRR%l&hU!}+kPGUDf*e!#-AqCdhiGgst+|?uIyu&KK zT&6Pu@qb+PCna71$zBB;TL1fFjGg7k8Ngv&&eIZ#20N7 z$|?V3u6wMENco{yu;@Vb-8PvtGQxMX2w7x_Tvku<9<^|(^Dmf~<*8DT+T{MDd84J{ zhgQ#*w+mul8DqK+ZBKrmao!M7Mfn=Wy&7m0XnsxPA3=_XV8TPGbl~2nl*#XGq@7I3 zx7GY9#g83K?i%k*CZVQF7Y6xU(pIsCh^cq%yNWuMj7ncI!sCO(ITm-K^p&|EMdj7c z+~JwDAtv^}kb$kwZ%{v=D$5N*GMj{y7hy$rH_qljv3-+ zWB6Uk#~rsP#r@Rn-(qlxuaBP@M6!<)m$|LjD6?-w?%$gBpRz@dD_;?|Rmx|I-+y2B z+2gW+yhIWh_r)V2~t?_KL!KqD$?3toSwa;)E$M*cInswTR5L>wdG z`U~wufx&KxdsD~ia9~WZVJ)oSv=2F3(p{a&(0!2_6T^p;Mfq-KQ{W=F+`UKh?xW1G z#R*P^yfvr=UDfZYk~14+@9FF{L~rY5kb(2qgYkh^VgLJAkxDjmZE0vVxWU|ZMiMy~ zwN6;Z`8jmrVQ`a=`W%qrc5X~`0A;@QaZ%B)pXGN1|7r40^}%EqRhP>6-r>QJr-^1| z#(VGvj4+G>MyN^n3;t7GXz+1aCG<FQ#cjM#}!cT&BF$O`koOBP9ln5>JeP& z*rBx+x~Z&PYO8Yzd$^h>OjVVY zqSCON#Rq&PlF3H1%4aIC**EQ>`5oRebqi4IK6?gg;#?(+$&=dX=P8LwjYftYaFLUt z=1B1Lu6L>z=FwrsKAXD?-P^dA4S161#@nmI$!cS07NXRcUj57YA}@u?D-)iA*ZnHN zMX!5W-cX+m|7nvvBv%Sqb_z;iea8OWf%Wo zD8hv2W-@KE&+!#-a7ig*x|ell>b-31l}>*zSQ)L9oC5~o(_bfP0q9C`SML?vdXCSf z?epwMf$mA~fU5O<{!S{0anCD+;5 zV07dYQ*S;UknBpV>tSM=gT2@;FC0QLRt^1ahF7rLRg?se%=be#Q1Do#pFj0L%SKPt zVg|ek-7&+As4B+|IA4Zy+KRI6{;jkBdJ?OAXUX-E7-W{alULtJa8WT|23%earoC{N ziDE2vfcf|rM{`xuW73H6ss(BN$vB3>)`N?6W4y;T%X3u;1$47qzStPz-y9AF zmuvpd~LMdL77N4gIKoFlpSIKvw$k-An%tfjdSTyh87lZe9%N zYI6jyalYte5)sFDWje#^T%(BdyN$T=C4@Uuu3FHMc8Rg>Q?uJmYHMY?B<;Bbj*267 zdQ>fq-GnqOC^xtQ&3d?9UMQqO=xNXX_xkv!WkI>B^TVn=MCZFu7&Cb2`U7lLEoR=E z&=d2BNxr2Ey?oUhB~2tpyU?phj|a{rjBweO`a)tGBqA9#11Qnu)@=A>#FW1D%jgsr zY1^VER_Xm_Jw@vNN`N<^$yb(4hXUeS->pa9t&tqn#x4f6#Y@XrBNKuf--CAP10R`g zKuhCdUAcVUGbxe^rF`VW+3`eAKq;*gI4!yG)#?XJ;gfT$Bfk?%CuVzc5zXK?oW?hx zb-p?_k*)UeKP{5y#*U7&?ip{2{N+!E<{Zt@Zy(qm&Q-?u5LPnXv%+QvEIZ4;^L;9+md>o88pzRn zr8_^Xkx=%@hW@}>k#6JK+2qB^c7uEPw;*hwUEcj$gM#W{X`RAA!9DY5+l_kp#qPil zQw<#Y!H)0eUKR%9ZD~2C*yCVX+C1)}A+*k=Pde3Y!wx{ym~T!b)N#~*Yq%MYav&%&H`u1DjGmo3=W(E9%5~qmg@K-#n$q0vPm+wfBybX4 z@V2fGc;9Midj!ugx>Vw(#`{=+Gt{v0^xc=1s&JO;)Nz%x3gXp>g9~aZo_Z(L{I#1Oj&acqqO*Pm#yxti+l>D+s z#+~oO+az`hE;iN^i;_b=uO?hqvLdc!^^#!w9AlfL_I>a_xDfKV$0UC16a^l_BNnb8 zkAE1HXZ&V(qU`;r!K~&y<}CNS-m4VsZF12h4x^q8e?&!gp~+6Oc5Vz3$F0eu_qDPP zOB1B-T0Y0qMi;JkB!OS{9p5_u8GjtRXOL<$Gy#HbY`!X18xp8Ua~8f`Z6>5U zC1(-*Y31+jwjWxeg;$yeuWG;f^pLuooT~CFNZ0I)3ETT9tAE$~`+v#A2zP-vxuFq* zU3P@HCOKoq-9cnMsl-Mq?4UN#0bY0J^{mcOQ2(Mk8$=R)po3G!5#pbbjGDoJSXgXP zQ;E5^^nCzrzF(BH;2#O+a1uWGaz+Bh$xXaD5lL&U9Dmox*cz&viPj8lwhyPE9{OgU zX-N}&ddXsrHlM!!rG~H_poXA5_?w5p@z*u~d4P6r^2>97s7{(4z=3tyXo>WShXL1} z|Hx277C!_Tvphj=tFgJz0&+%NekDh=T<0T1wxk|YajWebqS0)Hf^RX)0y?JUItms_uQc^qc99Zw2&)Np)vIw44okpM13gH*nd zK+pU;ES%J*Fx)S!hkAmbZt_ZDAdHIk&X(8d4)kG$J9kIV{ufq9N@p3`>E3W2#U~;t z7?`L$&siyHCS`gJvS!TL5sX_P~MzOwxpN_S8^I6gU z>7cspn8FBoWS41<9_Kz1pZEe}d_jh=d8mwW%d0gFv(CLruLc(BiLp}0^xrIE$pNab zuK4%2!;gEV>y(11*Ut7`3i*$tVpACKQmQKDv&1Rwp3eHd#5s2qD#txK#2(YoWLk|i zegLC#Xid)RS#66DJ#_y-Qn^GeDq#?{kHDBtyx*we*`EdX;m;WWo zj9<_j(&6c}_UGI_vvk|I{5n)Hu~l)|Yab}B^;(G;`y!qaCL-ACt#P7r$L%X5Rs8zC zO1A!E>+>eWRRs5r5?h4*@o4#{^M+31D2}-F#H%B`Bxk~XhwuDP_O=^c+BPW+nF;#9^($y$bR*awB4J5P0ZDGF@JfjVEcYNEDTzQF4Ck`*wLOKx(CJ$@N!1Ge5!8{7okqH%)h$ zB>s;O__BB}L*2Emy~L_bS_FijEF79vQEKorzaPNw0w3`E_XPpH0AAx1;XB-;g1->q zgd!k(gp-1R@JAF*D+0nBI5h|epa176hSpY!DSM9peqDe|Oo9LPIPE{j|MN=u81VD{ z|J>vMjI7{h9mh^c`wfYK!3tlO&zMrm(Jq`U@`oJmxA4#Z&Fkl3;MKo*TYu7EuffMe zwz^4cIJ>>tf%`tUaPFXCW!_x7dm8F<1!t}NoqTJC%bRsXH(F>qA7!r6pJqDGzg;=q zv{E>wVjGD#7P%$_`L7^H<`>$-lg)w)f_KrDLS{$2FPn~PzeK5}!|sT@EKVMM zoKbh#CW>r8IL4#F#^Ef6aZcNnimmMJ5!ZX`|KYa3+|Fea(FOIZ?JRW5CsmPWsg=^eud^3 zx9U&e%-SVAyC92HFk9*!)z*QMhl6&$s)GOt49KIJT0O% z*bmsUTUePxxVy8@O-ZvVoqPtr+1|D>RNN?Nav_Xhysu|6!~(I5A1@|vlZ@>oL!jMk zs6~A!sY0vu=(LbPxn?#&-m^U~%ryCxa@9~)<**QA>f`ZJk#_!@OSq%8atbbu7754W ze93Zh_28Cz@^rlgt&dR0eLxK=Xjl8gaK7``?y@*8t||FdX>l|uz;f`MN+~aeDn=rU z^bqW=r~sb@Z3afYS`6#+Hk7}yH)LNC*_Tv~YHN>{{qpYM^LF|d#-A^*3tkUVqB_qL z4^Ef1#RQ03SuW{eHw)=TEPDI8+7N9gPuh%_#ZPsKU~(1k6m%qy(44@I?oWTQZ41K6~6L*r4GbRN9% zI5F;;+0_$1sV>z#MF(++gz`?-A{a)M%Nq{P#}vPgqkJ+vJQF4g$>YTPkv=TgVih!2 zb*xZ|@3=Kf`TNfV>NeMzW{TRnTBSg${#yv z28-h3D>XWh-&V9gk}5^|$^Ck~ygdI465qFI$L*>sKRnD3(nU9Dd0Fqsri}mn*Ra~~ zOs8KZ{9FY?B#KxoATV{!-EBRJmrG1>g+hDfw6oDs^j@3G!r%S zHKJ1Sc(P$X_V*C)90KBWw=E}Wpp*pt>(^QHR-~*WaZnx?$-Fm?bgGY5v(f%x4 zx-!S0GKcgp^86$eqG{tPZ2QYye5c~4Td(YwyFk^`Z2;w2GxcDiv`=eX*xLc{uV8r^DP^tkrzM z7Pdk(=$`1Jr=B2?)cE$0kLOG9GQZq6P;k1_B|cOfMZ#e+eL3S-nevXPVD~Alw^^;x zo=75?((md>0S&6!9G2Z&P;(o z?f!4y_+}qM?4}|k8|{!gTvD4xAN+Weg|5_@UAC`EjH?NmPRY$v&kfZKx*Y-H z7%Mx&nfC`@>pyYSCxYeqh)ckK!gM_+n6NpUL{ph!Q4zG@5-wuhkYPZ8^K<3dB8U}F z+NhHXDXz)0v?WQ?^V`tb{{%NM;SgZ`JU=6ULHzoOn6XufD=Kf&p670DDCx7a<#**o zGKSH&&hRLOrKZ*vzr%ygnd-JFyO)%Jel3>*sb-7<_-DUr@mM#53jAHC$@FHAZteUl zlAB%QV=gy6n`R^f&w9%D#Phwu(Xa86=%kxMUjCIUB6i>iiSu@(sPchpJUJ!JDQAi= zaUa^XXS7_*%IWZayfj7;a?-1?p7shzE8aY&^CtJ6*jFi zfY~U57nUgfZ;XouVv!0vP>wij&zVaQ+0E%9wq`6QUbrcpe*sA+3>lK@MUp8_3=+YH zepU9hni|uhd(SQ?{h0}dgZGbta4Mf$>N*kOCe;+c$t5G!8CQt=Vu|uE@U40WXhbI3 zmfcL(zIvM?Zy}*L(Ww*5tL!*#m)YR0b^EC?{Cd7L!fm51n+luTNw8gJ$n?>;9x zuZATrS1$^5MMg7V^W!2Rl7!i+c!2rRvakToOlrr4RSqBd+wfNZE8t=Eto$Qw`8z23Zb77{5janeEwwe)Z^2-*-i-s33gxZ-2bH#`}O^uvS5l=UrBq4#_9+x94jO0h_Z z$H9|{@ETB%K!wbmmvL^hOLsMtwYRV;D;jBkUwh6PCijMMW+7&0`xEUmeP3mLmOkZ7 z4?-S-vs}0s(*d0d7OjTM^MY=L5D^#0Gy0Ccs?Pj36B&%|Rk@|vv}(CqFuPc zEw!NaO_m@kbS`lNrQ#SWV|qV3B8A|*&={&W?vH%$G5!VX@0!!aJ)vdZLG}8# z*juvN$|v=Nd67AWI5m~-(Y|Xresh^DajM(o++}uFfmVU!luPS`X>w4Gaw)y2Rq8{* zM0@O840qSX^WBt!&YkI##GRo1nEEOaWy)tWYVTYaqVbXN`P(9H^S)eTzQB3OFU)L9 z2THc*tOofK6)gOkA6W5Y$>Ra4cnMI&e^=(926Q+S<2{PuRm3+JFJ~&FA5Kg0VJAJk zya8>Ly>;`ZfYV6K3?^9RCE=!Z*MNH5w}Y?UmlB`*8JrX%0hy6G86=pJ#msWG%+rqC{>?pg@%7|VwEfaKh9 zB?aiVbci~qw6_-+$03=$?u{U=>w%;oGGHP1xW``=^%i!o7b2Wc3WiJa#wwIuQl6z> zZf7&wl|PV`L!h<5edTJl9NJX9ELI16lgQMIOYF$-nLhITAE;@N_Mz7M^``R`zhcZ+ zR>Ht}`KGL|$jHFu{Y94%*TqZ*L8rlIukg~D{AMw4eXCT6J@60Rl9XYGvVJ!W-=hhB zi>`3bt%;=#|44;~3CLFj8ZdF|w6ivXT2g$l6IX2Fy)1^ZEbKJE&lXK`p7y)|zv?~f zLGtxO$TF7rfr5?M>%|AT{3XKSF?0-s7P()n@)=8vP}7gF=2q-Tm1PGuA^L3%Kl?8K z))>R@gHhL5*63k6pB)2vQfEpzn{B>ySL;4HvRHptHrn6i6o$8)5MTU`r&h}wws3orW{y3|OKKhc8&lrPgmO97 zZ^f<1<}mug0W{0Bx$7A2@|jx=-}9c}?A9ut!|i-56)9IwJr!E%LMom{tfqp;LDY|W z4x{wYIE_wEITHhV{1-qclLq)DPUoMZj$w-ZO91n?pVe$DI8i)EykO zO@wnh#pT?7!P)Fj+1uWcj2XPw1{Y+9903ZRARUkwo)|+I{K? zNDD0pd$&H>-S6>>d>J)}u`Min?vv!e;pHYEu>4r-WMWO5YnC^~LERatm%Atm>q~dL zs7}*JL7F=<(WRl6x_!L=4e_7ng6h=R59aGUs_BYSFTq49g>+{mz;n+OGdnLMKi!!7 zE?XaHvASKiKf(veCAA&=ydy`%q;M^pu4T4#>O%plMu9}6e`UT328`DBAk2=eTSjk( zm{6o`OKYw%j>nRA%bX%jP}%Os&z&vM6WhEll}x9xOXrQiTB`7_5D zS`^N?Dckpw^$XC<{;dSvD^6s@-`gvS#HT+F6u|9(4G-{Kk`h@VRSSHWJ9f6b@^Fjf zV5F3#B&*s$P=KIT#_zqEB&_ZQz4?Z?tU;yEkdJ+Nn=>Q{E?<<2>2)s63h6wPYU2^Z z1PN}HeAB>PG*@w1GIT%#Fqe^eByG5iL?RA6(Q*E7If*Z4AzSvh_3hTq^o(-WcU;)P zY!}fuUxEwgu52Ihk$jcw!oSQoz;(UDJ`+a-VUh|WEThcTIDX2YG+vy@NJt{XmT34l zrRaOy^nQXTa91>`4|2j&md$uEW{X+*g!z)-4J6O!DB5Sy8UynJ{ z`uT$gs}&vSofGFdP~x+{UnPrT0QV~Lzl%2iFF^%JMUtzZzDobIx5sBXbF_cN`y~I+ z1x*qD2NmV%pDHn@=$QF}Zu^&ma|@L3zZi>@=Dm5@zG>&JccwwlpqQPAY|abd3C~L6 zWuXS^QEl#ZG<%V{Znrz8+94kS%>>y4wyxQJNrBm%qSlu>-Un1_b++u05#)PE)LhX4 z`G}jx%Z>(c|L9G6T z+s7M`Jd;D86R@Gqa;=<}WZ1S+?nHNt z*_h91Lck7Yu(=z-SW21GV{^<8m5?($v!5%i)cdC4rFr#y1q~X)=(~WV^BX zP;dke!|g3=|J6;WiN)-}+|xT9$dC(1x||V2O72Md8kJCus?22G=IErK*xRP*Q0O;M zs7X?(m3+xfTs*|XGa9Df+1(?@qDU+)_F`LBEe-tRW$x+7LLuxAqKB+jU^(#Scw#0w zX{I+K8y6bS&0M)Ju<76PrcJ&Dnkkps;he3j?|?4!3i7NZxmEe2omJ~eY*MQh=2C`v zY6S_^^gYkFQss{h)O`Dv><=Kj?J3SulSR9y6Gnn<>#cR7D-%h`Jw;accAjS<3Fc?6 zLb2)vCFHr;MbY%SUkWP3$|B+6J@1NdIcqU@-wuB}l+F;ywCH`ZEFUfDnMFduxxe@T z@)BI6YfAN?`*|^a$ma6H`!-;XoZ+%Rc6?8qi*c=8jP@B_f+B7CAI?Q|sctw{FK;TU zN#gag1^1DOcn|qy_e&nq4=N-WCo$Qr{7r{#UiNiGnmWEkgjzQN(s3#*RC-V^WHfE? zjewvm^%|9!m%IDTO67+O<)v-XvKIh_ruK3D>`@%1kBIlU@m370$*}1-o z`*soH>e>%t%kbi;>Y>WdROvdE^dqQq(e5mC*{?E1fHhOz%dGf)XjWHSMtRSjrTC3bY(MLv3? z0U3qe@I#_3;X<7YEV`;z_pXmjQrA(L^ui6;$b_@XAVkO}3#wkU!rg_8zki))On%yx zCz6UIOSG|ArWTnFZs{J--h+|Hybu0Jxs;+E@DQSw>-T?97Z*UUbwRB<2g>)1Oj~A6 z@o%@I$-M>-BY`hRn=o567xRAKgVsO<6F>E#RMBC#erJ2}$S^7gfyJxVmPduxx+ z1aEBVr-T7dAj8yyw*$7nT>1$LJ@+WJgD7G|!s=#DbzmNvf`8|KC%}Z7nYJ<5wf5 zwDJ-L@~HGuM$UBBX#q^z7N0QOoF|xQy|JR(x>B}I(Ov-c?K55k-PeX4w*GoJxoFi+ z@oLD*(3qorh~wOiFC+EntER@P15i2=Im_x>ILU<;6`lTK0p)d9QZTc^ zhUged*qW18X|n1X(efGBdNfFuL8F!YFO>je_oOo|*qA4Io>r}&!7+n0+1cR}&tTin zyntpo;HI}Qx+eVQ0iwlMr?TynYb47=-k4G?S$tEe{L$&GWqw8p)=t8p(Wv`;@mM-Z zzAW!#M|8ApND)3iZ^K*3jc%7_=s9pXiTZxnO7imVI0z0L(iz_7t!Df4RRsPrei117 z5^Y*_Mev+UNPjE@d=kmM8!8;6nkt7h|EjVETf}ohlu!HO>;g_t?L~>DUHd+nW?7dP zNRDW!&QBo4AuazN196MNoa!kLfY|g=C%hsXqYcCR8Ls?nN}}5x!2!1nq*dl~WzYpf zAx2xDFcV6fyx9sYmt_IwaDdUMoBCcFW^_XPx%9v#p#MF_eW_}T1Aq5oW*|p&?^aM{ zt+sw8z*VJ5XFPj9ZhUc6(id1Oi>Dpry!pdF>ZG+Y6`Bk8xzymoLq@&zXd!3#2^ZaP>m$MkG{7BJ}0Wo7J8eDd{ zQLuo!3*C+*7vkh{85mHF_k53-9O~O*7&`Ac?h?lN!lLUxp&5+-L^FEf|3Wk55!Qw+ z2nh5jD?Pgm@5~+i1J2pjL>95>in%A^1_O}hM~9?v+y;ch-25_cuQ?rnKTTWGhy?V!`RSJk6|BuDZzkGKj%nf#*~ph?Nq zjf|$&ohs*PuYfKn2W5+-d`&goku5seDfawwps^R8mmQ*YFdedC?DeoG%6|b`^*6IL zd>iM0zNyOAn$mlFMPl1`503RxjdC^jDPiiYSna!#VbOhPis$DXk_^MMdN(7_vq|@K zl#0`z^Pi4V5L@Ank!2T2Kwl4|0$NkKg14lWS!jUe^6*(;jm3`cW-_D|u3U^V5ANoL zfaHE&TXAKH;b2fDiRWAN8%V)eu7+bJd58!D4G76|bR~ zFSNEX!!mJGIc+q%qcXZd&cC$@l9$z-`w@ZCkhL_1Zt|idS-5WqF5V6y$Faob1A&^Y zS-s~$FQHD~#SIfvgfIezu`6DC%9*>b3Q&qwhl$%aU8r4#Mg=2g=L#6UdaF*Y)0( z4PXgP;z9a&UPm|0TZpr75PoCoGmSeBkyM@llmNqPk7Qt4%o;K<5nx|ZspWYc5kBqp zoA5=sCU78I>D@cJ0v$ChmNvz!SOm@=0;;o>Ns86K4TrhvuPzv{Eh2r_9VpW%tP|qU zik5jaeLe4E+EX2-%3r#A7iRsU=NIT9o~Ys9jtVH5K7g%{;*CJK)#0)liw?pQ9TlIa zW8C8R-G7lo?Y&y58hS;Ozdbs7!Txos*?AxQhrQGt??1k~LCMwepflMl-f22ptC|hu zDY|ES#!|GlyXA=*1LDx!J{~Uh(@&hF{k%#~;z8NAShollJ4f?t`#nZ4S(}TKm56@H z^L6;<8*XEczfjRkJFexUM%`-E=|$+gk*4t{Zj)V z?qpDa_QzRK0dDPqeboiPfZ0FAd2c#VMl0SyGvdC8d=p9#h18Cp9D~G7A+BfqJ~iOR zBVL(~;&0faMBIP~P{a91zI%mGxi{2DtnOjWtEF6iG;VHK-%5{gJrl+meV{ZR<`fh@ z<)RTsa4Uw2q|NS)41KrgL;>mwXABZXvdWk!Vg~VJm3ODoG9HLZKCQ;Jv!ma}K&&!2 z_~&pFFSasjC{Sb|=N{;yLd5%8+)MNQ7RSq>Zv-O@mi$R>D+@w5n@xYVjNZQr9?+y& z`xb@FhbxcA(o-Cnc=cVfl>kl03r}oVV5$UBc24R-;PnZUTuIWsnoyar;pSoeO}KoF zS#-4P8#r}_*v|wQ2#rLq4W)va_lJfW$XXg*4n}R(O9r==B#(+HPFxrlq?zZxijcZ= zj1}#T(=GXBj$PzQf z>;MjMw`3jt`Ff!eIuX4#L*)gg{rZA4-h~nk&vqr}vhus1jc`tJrRpourQ1J|0pxpL z{qf{C8>GpgG1Z1O(6fxhri|6Ba zdz67E3_^oP#>!49hq9E`LTg0h;pGp26p1AnT?#y~YAEu~wY)Lh&Eu!@>J0lupCf@# zqE|wFdouK;=B&KbFe-U3>dSG>mq4&Fot6XwRzY?RA6ihVnzQ>*B&g4e$=Do7|U z@8*MW(MnTBYTUgNz_cJ=Jv#9_Kh(fdM9*s)O4+CN`{n8GBf^9EjyJRhR1x@KdWW#& zg^f?Pn4zAOf__4CZ8B1thk46RvzKoH!mK4-puI|}Is0@xy=~&lUNrU~{*sG-nne|Z7`(MX(F7Q*~7Am}nl`(ZG$|M^~731t}<5wa- z*W5_E{2XsVzUQCq&sA>4%JQKl&jOX?5y)xY0&`1S3)pdI`?rRFN}|&w-;d7qJ%x^A z3$nAjKEc`;B$>r25+I<2?)Jh1bCAf((29sMO=tVE7yG@N1#jNN(HBcb+fnRVE3pud%pc0CRrYF1GJEaguHQ%N6UD58T@5A&tiY3lhPKQ>wq zVd%MV3Z`TbpInLJu$ez#q{8Kh57_I^L|cX4h>a{)QM21>r!}X9`?hp5dEd7jG{WA= z_ZPrv?ab9e0X5)^H(BBWi~Ri&sQGM(dY8hu*}_oz1CEiv)Bj2bAvt)wxHHQ=hv^X) zEU^OPqadjs4AiSEQLbm?|}|Nct{ntQHai4209`}^>mPr`EnU&OfGTHs=~VRm+| zihFM4IYEY5nu`UNh;y8oNhQ`X8SJbZ5-wDHa!Z;II7E#ny!6pb>%d_C_wrtIR4u;B zG;~$^O7H#(WQ3tdEfI|B;R1`xkiY6XOeyg1nKw85?h^s3%U3lle%8zux0mw8m!KmAU6s?+GG>)!nTT=zlES`=tE0}g;Fsv4J z1(1`i@1yd^dX-&vGm-X#>E%CT-wfU|ec)gBipr3WG=Fbt%sSu4TDbaHyC(2Jlux+# zrRJ#gGi}dL<&~+8kL)T#2rg9d8#8ak#I>`36UES&HY1y;JM+Ix-|Qu*cv{NBmGPSevU#%RP6eR_0H9lagcHGqGi%Rnb}#(lf8W)*ESN38W@=Tmi(K z`4lB1D$Zl7R8XNe?!+{`V1xN!qdbDO5_%=1#$X~;64E|N7sWfA%e=XZueeag1=TCG!BkV`$n#=Q8xnldWv`YC*mQ?|$&S43~^W3yZic6z>kR_a~? zZB~xV$kg79m@X(ha7E|&EgZOvzKIeY1{Z^@Pzx5;JsgE)_;=!&a+t>8AU?K?vxUn) z7P$neq_HT{vBZdu)YNNT#AJVZJ73wc(%j!1kDNltf>7`{z)ma0FWkwL&b?#}q4U;t zFCC63M#v!lNi2A^CiRzCF#4WPHQCXB?mHInrDODweTcSJ)#rGTh$zSe^@Wxl|6&7H z&u6`B8fAIpIr5O3Xj{(~4(fssfp$TC$ zj?Ff7#V(q|uWtk*XNaPU#|eEHHCRvCr{i2 zwqBXe;V~S{_e59snRTnns&u-udI`dme@h$=3jb5$2u!Qlmq5s6zU+K(5O=ZGY%;$H zguWVDfc>D>)Az*!3rrM$yYTD)6zY0ZHE^c1;r;0QzSBPo*4^@mMA*)cS>7d*rTAde zJ64mcvV-g^m+*vQb$>xNXYHHJ>l6t4@#ej1hF}}EsU*C8NQ&saF&Gm%@Ax#QLZlMI z0PrB0oX41QDZd*P=};cp?v=mj{yvAwJU8uP$}2+BwOSn(c>7H9T!<_MjrXnG8x|CS zkrs)UVjbtem=j>`lv@8dQ6(Y9OF{w3a=9EPp2)36w)VA5z*7=dO^^y#);HZ6bG~zN zx9!+WkkRQ#LDFt~A7c2aV^v54-<+>tGu4P7jX)_XZ<&dppS1_wTIH2xGj_f}f=JB$ z#_u7TgFcgLoR0~$Xk%q<+Vjteiq^+nmD&MD#^wxDBRyJ_=tyfuv-OLX2cQg;;JDOL4J$%RPi-rtOjM!;et%AnOJngRCtE6(z z( zQi&x@dyfTM5LcX-@Wz6W`)*8ct{&TkoEU>|N-5rN4$y_M2;2hF;o1Rx_grEwF~eRj z$@*PyD(*%%_Y>PRKhWp9$7m5aYo)H)VF1ZMh^_rE5 zZAa1=;U#d}d9n!<`p8@yb$A8s%=AURcb3j4+{w3Jwt-Zl%y9!5FlJK@`(vGNej2-w z7|pev?W#{!dGN^fDynVANuHL4(V7ssNYnzD3Ei;gr$l12SY@$?KRkKe%efvAzmC-I zO`?l>8x|83(xvpC3q)ipN(#sWqSh9-g+ZC5kxul>Npe8_pRvFol|Q@qFrXlDas|JL z+Nd?`Noz~16ohYjEWDVOUlJlvn14unwvl-$?$xEaq$4v^nUa_%op zN~cB>Xx$v~xXJxhgy&R-mxlCu3j_7;+EM`a*~yQx#TsXpmly`QK5(6M7AUC&e{%1hhAI(AXfAf{q>rYt`L^3YoZV@b{^ zq{8yf*Q8*DnF5;hj&Rl;dF5L?V& zaeR()aSB6}Ur#HNGf7~@2(+}^=ul+TKXC=2*;JZt3dkyx<1f|^o8>nIwgA`YcuiW>Ej~L1 zyk#hl38l#w$OJ&BeE$jWk5SlxU}L>-+gqvYTW8tgS3kbgRgH81iIv3qPBm4S z#ym58hfbkp^VAIE|elwb08VI3+5; zYe=v%oDME}N9->&TTk|Jq&jERpKyK_yiZwgx!BVebEqg0z^-=@0vblRuk^~95!Bq< z?28BD`9Cg91X@(1kgAh3V-3IO1Nu8#sU9*OkvNQIMUM>L-wzP7PN z+ZMB}o~uoL7|Pw=nrx7*POmZ6(|F0T5ZD@-6TmC~9=p~cB8>BnG2T|M0IUv z{AJ!?iut`7jj48LBZIH+;2jBcv~~Zc!KSb%NaMUGw=MKEzy`);VR<<P~YTopsG(H1L+E-eMLjNOV>X6%U zDzJ0wsP!7-Et7!vf0v(l_i*zmrL|rKdB)G9B{w+3X6HMOTE(dHPsK2TsTn@pKja|a zB}7T^Zlhb zwYD~c&F7ni+i*?2!Fh!ypFcv_pukunB~N_5r%OKl4iiE$e#Fszby!v$%4-9~6N z>FW4&?dYts&^PnGAmVPVC#+3Z<;jym@7D9pBEZ>Dm9Y8zsQbHUIuKFtaG-OX=6wlG zIyQxVLQCLh=HN_4njrghn(FVZGHA8=0QZdG$&rDQo-`b$|)*;m(QAm#Gk z63SPvGa$Bmhmv9+Ger=WlgZ#C>oOHV>66iF3gPI27ldrj@!kVYe<}+Z1YqVA$Vn%R zy5FLMC3Z`pNk#sMLaJ|r-hbR;9u2+WD5iMA`d{YNKepWX`5oQ{w8ze+@f6g)U1{~z%b-fY7e;sy|+uS*NUD9yCC&_@chU>9yRolU*mhXJ;(rR9JTo zWyccTKU6nZF(Z&hpwv0rMPbx)?lX^-;Tc=(jfkyNZ4(Q!Zbp+{N6w?T?rg#Ae>FK2 zdPkU}4y>sxn=jcWKL)oQTz4*xy)yg`oR1%T`@sn#@x#zI0jKy6Z!{3Z)Qkaz<{8|7 zDKte=$`%sFv@SJVk3Z3BQ7))?B?eFu$)%3QMZ=# zl2S<$K?IqnZibLH9N|cnU7wNT(1vbF65ut4gtYltr4TfWIXv7>H1t>~KThF(+V`O&wa5$)1@$*P<^ZPDgGN5&r%z-52D@^{>mST5VP z^ao5SueV~tZwF_=e;g`B6=x(BCr-RhLsim|da4Tx$q{K#+M4EF27H#lFC(blJT8b=t2mFv2nCEl7+@fMW0Gxq&QAV?j##UPcF@7VoLbT+c_Fe`zn3^h zXsj-G2VZDUzRBF#!H%=r00~@dFu|cP5AG*qCy;5)@gztkypVVJ455-`wQ94Z{B=UgWmGsX1` zlHM;yMh+jOjMu4p?WMpOHbHzkooEzlbrU6M|2%t;I5KGTn6CsJSjfsptahEV zY89mM?C4jQKWp*81PQjPhnnd~+gia_e7v|SJPr$Ey5g;hPKY$_O(oCg?NOeDT*OFp ziM2!MuBNV)HDz~>d08;HxKBRGqRL6xQR1Hjh?(7A1jw#FMMc3&9F-fzLubBiaQQ37 zJE?KvF>IqxANAtz@VbB2G|A7Qp95dMjwWHZcGo}e={`vp5Vba}%ZIQm8AJ^J@i;S6SqM4aKw* zwhQAfmPS}uR&6dwCk8y!mfGHH0U4ywQu3XLl?}Y`Q_W#;tZW_}k;Iq%Vo+#f{4_yf z6@bkx^wkhHuJ`yer$4f1UUvcw5deUw4Ho->ERU04xIx=1as2tQ6{uDge<$1ql1K;* zIPBLb^BQ{2OvG%=;zXBqzb)E|TVGBtE^; z%UQB24_<+G7#a2q4`=r6t6zFkT!SJ)a_HXk3x2fWQ!z;Ae=-QN zrwB~@IBX1Vl=9(D5(gP{IBIE_nW>X$c_$Xp`$BzztAg8UL7F(~_-2QVIDnic#A~=uYdQzob9G8>3B4KFz=ljp2ba!l@N9mM9=0xkGuYh;vifJqgr@t6&SDTZhGnm zUW{Zz2*);?VR!tSU<0>1Dp`1&A)AYxGcCJ>r!%q+`G`?*_U54JIjLS-JNYhr7qJ@G z*yA1+#7BnzkB%rTVBjgC0~|zFFH{3}clBrL>>Wp}zYO0V6yRx!XMdMDV&7PI+3a@f z>$y!~Hu{C}ObA4_rt#qvOvGYz3NPi(DRTq$Cz4`I$Qubm z?b~Ts0`Z)poU^%btU0142Ze19owS$Ue0Z#`2q@kh=E+O8rrcT7`KY(&8m13|_&8N( z8A2i~GDe83VhTxYkd*~16|a<6A6(atUf!UWwbM`0!p=9VmMQ#hBPg+dkY*{nOkgsqCxeSC)sHJb@ogT-TBEGTuU`R zroO2Yq#e>PY{HY~sMu3^OAoKkL(#p6-oqGT=+M&zre#=e^+3NNE@eiU!&7a@4JR(SSNH|H0!5_qU6vAFOm5n2> zASC1d*l;_5ACyul@@9VO_eivYoY=0yACz>OZoDYJ4Dnn2Wb@R{7^Hnda{z|bqo{0n zjg=~k@LBhaGLh-x0;xKJ7}D;lnut_C$jRD|A7e&!SLqcVVO1+W_U7%i=}QeUQ{M`x z8#Ym!(Wr7}Vf0u4Y-q~qn?|r!`R8d#0+<{0$CHq~q_f1+1cRLm@NhMk`9N2v)w?8! zyIR7g$dvt=EhZIPF!mn1mA|6Z;IhC-2~_jdo)9S@PvFwHTEWd3Lr8m;B}d-hAj#f1 z^vQX%s#*OhPmflGK3}_G(i!AyH{IO30f27%K#5SOQr!;q51XHlc5;2KR@6Ag1|`-u#|2>~MJ_5<=>&iAn1Cb=#>F7~`qiy+?6jl&`U@O3<~N^cnfZXi?cC7xKCGY{H5cK$ zx4w*|DKbKKNCM&9Lu+TPte8nq3&Ld5!yXi~KFoE+@NTTKxvA1!c}V#C!lJGRceFj) zPu$vQ_}{s3at%O263bX~v7rnkr_BC7{{Rvwz&{d-GWR~rIyIC~5tR}eW zszBs0>}w$2a;<;5>0q;_oFXpyb4U2}&MW=`i4@IwnlQgmyNtxZ&z$~!YO6ZemCF)(VSQ=VC z4N%s1&L5N+7~6{id9kM96#x;$r5L}W2J#sQ zhU2TlArSh$&GSQuY0y$h!UNFU{}yE0cq|@h+A0ASdvI|;row%&mb~O%;B|9(ka!}B zg~k#p8;bq=sysLg?RkaX5sP#arN2LKtuBcWYE}~Fh;*@`O5G0IS$BjrV!nB;-lkYf zbCc}9Mu z%yGseIg$lLyG%J=OpIe_2-A*apAP-{0FPGQ%q)A%@YPX82NM=13q+joE$&7N;lvDF z%5j+h7ky$V{w{au4<*A=8ogIkD4b>sr0Xwg6OdT5&y0(K>hw90DHpD)3NXIMC!4fR zlU3{aMai`haDDY8;wt_c`xO{nC4kT;>F?L)_o^d9Vq~zwI4b`i#*2{lviKZu$4imv z7lQX#v6L9OzdSwMoM3)lHRmnbi{Aito_4AnX4%$0U-rpR>4iZBvx+;8|G!d5Zh7x{ zx;8qwa%uKY!t~xEJr+N*0ZBI&OG$rSo>M7E)R#9FS7}v$_B*fMN_tiR4vN2EIykd=sec+s+TeS15Ecj*E2!XAjgj{}7*(15@G)1O(yJ?v*6 zBeoR0Z}`kNSWbfCQ5!Uxv3>H`Q+ju$V6JFkQ=|4Jtm+&^dm zX?Z@D>~=inyHfnD`P9Thho*abWhhE24*&pXG``AE&>ivruw2HZBpnc>Wpq1;MKwLIzYQC~d`0Q+A}%!eh2cel#SBU$=u>Hypu z5VjFuK>_jEn>E}!Bd;}2mI1qbJuYhqyW`G<+l%p6dY)|CEU#N!h+{>C{jV6$*8dda zY31em94sRN*bsyJlYA$)I z@*Kx!>Zb2qO0-%XXNyqzBGSFjDHMOD0KtEc{6My-m8jI3?#q&NLHC(Ln*K=sU<{VK z5PpFfkcVEr6#}P7ODU%JnMIn`AFh%Qz~RZNwXFB|Nv)6jgd^w6Cm%K)&UD(&3WW$B z?P~WVrMv^qxVkrxt}*SjIcD4lMMTOfwvt?bWIV*-7Q_J%sHYWgAS)DwX?aD$b97Rv2iQ1zhg_cn`9*S0~9x$z;$Ta))6+Q`%em+QOe|l&gs{OnTn}@_WwY<3HXdg*()WAa=O>QOab6A=f8p2~BGm?#%SU!Sxqn&~)V=;{-Cy@q zBX@=rPB=Y5vpD167QRR3`iu~2=3_@BkVE=*s(kUL#6dG^rMQ21|@q zLXg+;IGB6KJ4Bbh5Td!K$&bxlH!ryykcaHQrE2Kbqhj*YDxd5FO}q4+8{_J&#Z@xj zkkA80@-N){E-yEG_lND@Vuba#^Dg7HaIv$_K$HWXcdYng5kQBRnhVG)TLG7u+uh5N zy7Zl&9-zL|nFv=D{=ry*7aMx-%qMb0El7oich=;Ky-lHd+IQ*eqb;_#ZJD#!F=J}B9A`dfeFZvuJStG zfO(K$I>U9fK*HiD37|Of=R~`U(*g;LNi6<9UxDZpmd#6PMJ@#pBOmZQT^$+Jc3_l9 zk51|GHfiN;RiOM@xcTe^q+H44BdsxdseE06VpnP-pbyqFyA^39iRu+^ta|gu-m)d! z?H7qx+ZvZx=uc?XaX=JarN@(v1`{{c!eI}Ir@~iw_ zQZ%(GJfuDAFs4pMTyOo7Gw{mGqK5|Zk!S9BYe{bI;plWUaDoZQEoKtZkt4eLtq7y_ z^tv4o{~#HXopD?CgY&1y$_h&r=MT47>geIG_r+m-bz2iRA4wtnhN8Z{!o8Jl;Q(D% z*byeT7@5o5W;dlJ=+_QBu4Yv_SpU0_Uknz#Dw1P_4( z!a_blQm^G2lLbMlcCP*8Hs5?AOOv-1-5pL?2MyOMC3sKxRL|xyhxu;cm!mOQwtsS5 z@1!|)y=`%-q2Bza=V|aC(6{Ox2J6Jpk?>sc4#i>XD!}+BocPy)TqjWbV;mbNS!eP7V9a@chvjbQOv~wa~sbfnf*N^bm z#g#FWYoAJ3f;Q=v65 zc#H!d2mdQ!3hWY_Y%=VLgaSWNK)pD1%gF0bxbCE#x}0C6V~(G&T$Y_j8fgE#MKU5T zHY{PJg)=b**d(9wECQ)s^B~p9lpQd|sN-Pbhy!1luEn$7Z6CEWIn7}Z z3$kB8bw3VV?>6ajwG20XPLJa1r@sQ+xc@z#0!JPpUqHCLZ2j!JwFqEJt&Bk0;#@x0 zu~^77)AGdwR_nIr&6{L8oG-2lRIAhRg6)AN{{Y(@b9b*w(M=Dwc&Wgfa7k<_QL_rY zj32Yyr5cFhe856yo6m0Y?c*uFrlwfNe(@yeqn%|{TC!Y^5Szr3MkcGZE&g7OG!~(| z@bXs?GT>hP8G}?Pp67dVz5=(5kCq^Z5Rx!gI2t&{xt^>r6|NG-P;O69njQPiotD{* zjv4+=&q&YVH)Lh89pRqeXQjROiQ3Me5R(jnd5lG5Fcbc3`QC?MU9bWb`3RHRF~yK~YpsrR1x z>}RdL_S$j$Km6a94<3gwCyX)27(%}O%sE7ZfXai(cK+j99j z%J46VS}&N7`{g-&7|IxJLDjYYB%FApCAh`jK5}~SM-g7VH!_>4)m`p(d;#`BU?u)Y zeT%)`XtOOTybDL@J|+7rF&L8IG- zx;=td%E91G9EAe>?n9283u@$*O9$-pNwn%-JZfnNpZti4Mj@Hbxja-IdX_hW@0^gA zpvf`Z=YL=o&2}>N{Q`7#oB_UVrri_0z@;c1o$AN@V9A$Q~+S?04?HGc`7J<2t%Q zv+)AQmJE(9E_-#2xwkIkH*Az%Q%`EvL8@E5vIR;W2+iQ*5@1&*wQn25HBIz*B#@@8 zz3aUoZDZ4bj_p4)kz$Vi18fFnl*JP*AE7@|BCa|RhBEoOx1wM0!zrUFT zBSvV{x?V$Dogi#3J4IE4HPbP;8gBwvJWtGal=27X5z`ZsNe|+8{a=;FNn+za#_OO& z**!rG>=|Qtd^<5|(4^W^(x)-WADPu3UQ}4D11D6(H^uWFN-Or|nSu$YM%`N{N%!{yZ*taxe z)lqqobs*6%A6RHl|H=lp50Q2EfX__mWQ%9Mf%tpf(1Y7f>l(%Fq?Mry{K+xCIyUpx zDT9yM-!)VatNUL^Q-zyV9!M+CB!_s9pTp$Sme?I8<4nir+m*(VnKK6b$#Et$1S}4|H%;nhs9o4^87hv;#2&@1MkOR#AXYp{bhV9Wg)7m^7z0ZV?HWTm0BUK{MGQm zJ>v>D{h!7iurh&3<<8u(09rEt3rK7ey3D&>0L3W$JWlL#j@BdKn|m7hb7wpINc1HD z0q?B8A@#D?7=GJO%AF~~KEM5Bidi(H_KJX`IgD`I)2V=$i&pJhg}__ds|rPN4C3`6 zFpYC<038nQkX>dN8>%v*&p@xzo1cY5X)|9`ok<0%S(LEC`)00`FLyuw_=VL9D;d1* zmx!);+v`F<@3P#A$7<6`6$tVV-ScDWH$dtplRt?iX#Ln*fBot z(O))SJ^%3zcsCb93GcsCG{E=FXo@v~JVJTdU3r6};;_G(y0vbx`3^B-;v4;ouw9Q1 z>7iBW|H7mwUwjZ7cEP~8$7KsU+`Yktwp?K*CQxG^M4PtG2{$-8wj~JD*Kc1Br~IGz zp;5f$4=(vP{hshHDwnJm6R)THgvoxH(yl`1TRC8Za+y!Ut5`Xa-qD> zaLnFHL6;wla7&}whcTC2Zc`kd2*=9b8cekrOEQidBxJSsKjn%?<%syvd8vDE+_AFj z)xw0mW>tTSyjQ_(T}7Fl(^zF<v?x>(EQ%q6`!iYKQH> z8C7a}snW6) zUR?iB(|*n$HrMewa)&ZHC|t9O*2uf>Q8cQw@?m(qM?dj=rTJ{3xtwP4to!*;2(7k_ zY_6c;phRWQ8`=r;0nIfBn&|n|X%3r_HwJ=Ur-VXoCkK}0CTsK2dkT=Xe19lFI*J@yonm8^&3=&xH>ugL#o;RyMzxqQ+-YSY8>*n1gf^8`-8-h)3>`SR<4t#Euj3oA$B&KsT`bZ&oSIbC0&> z#`z(C{4W2Mths9|Lpytx*@$SFTFVg?Xzpqpp%-5iFwy2;r=E;F9FLi8t~E=Bf&F)tUci|BoG?G-YdulaOHPIY+e zaB!!ghfDv;%G5HBW9B{}6LoE=lpj`VS>c|dYADuJEGVLuYp78kUaG#+!( z-c;=Q>x~(fLxiA-pPGw&08jJIHpGneXk=otGf)+=@5@eEr9AUj9#;zZyTe#3)Hj@*%_OHPhCgCI%ZxJ2@Um?!X1^V=5JJo_@%w3ex_ef#SlFHIh+Vo z4D})0T5xnl4W|Hys!z6(dp4aXT<3o-s;ij)zz?guH|I+-83vbH4pHX!%+ind|fB(HEUGOP8YZYJrrY zWe2wU#n$e?o%&}Xi8<~48Z~LC`6I&6#0aY~q_57u8i{yvvNhR>J%k{3#m=1kw3!eM zNPcsl+7n3_QMATJRJxQm&f3Z*gdgWIGD@07+B8)P5LmWn8m`LOQ&v4w!5wDjWM9kv zmMQLsQO#C@>VIe`3=TE8a_01PEXA&bEl?9HcWoU-0}`SwMqdUrp6qp$6K*MV#_0&(YLLquvrO%Ub!fOWYuex|&no)D+b3 z4UTAcJpxZ}0d3l->X`Y=UZ3s3#jqf&RhnyHz7u}+) zZldqN>MWfZ%IH8Tuqn5QPi7)6&UQeYc#GMe=JvzW29g8|?El>R&1MX?h@R>EV z_q+3gjym3&$^Mz@Pjie88AT7eHqTaw2<4tCzT|Wn-6l*XV}}sb>?_r36t{ zVdlrYg^wdL2Xv<^(2r;YrtGhuQ+HK;WG@<2k4^&&7oh({o3z;3cE_0zTPrDA7Q9p2 zOb5i;GR8dv8r75V;Um0G*Z%G8)PXcL5gyLjeaRFi5G?XUJ&MTR@LKsf8pHJT8Z{`4 z`nFkNd^S=?uCjlibbC0)hT6xs3h$Si-Is!nZe^@< zX)9tlk}ro{6|AFE+US1l9i4a@fd#gN*urLf4~G;^M^9|~3sn&#^Ays9RI_sx(yJZ& z_J$RItcKj*pR>OZw^1@EB~Z2hIhgle{=(IKJyV7P1>=xJ==(S{z4ig7mEg}yOr9EQ zZ%B~tKNzWTIw#pkd$(h(rYIl#2 z<>e3#eT}uKa92y{lsnLv9&9h2G58G+vM0R+o6iG(o18OK;JzZ@pW@}zW)8g{MXIaI z&wwFP0?CjrTBMj#bF`FUOCe8n_sc+umdnI&H@7o~TSNZN%K54z*Y+1qHkhS13YDnm zg#S2b%Y@7mdU||V6{cWrvo>U9i0#&2-MFyIO=dP!a05$YvUJ;y2qKuqbQYsm>VNrk zCQXaF5h~jo;CDZ{H0*D<>Hzhk!4bp`gPg;g26(@I!&OJBeZ=?X|8?h+;<8@nBn0&`I+<&=BI*p!=v($3fFIeC5Qz7 zS|$lN7&6bwnbkhtO+5ATu8rD|WtT`Z=vXR1m2~;^u;U1->-tr;kw*`@C8<5nm!M^; z`$9n)*_{a>8=-3F%+ur+ReGGT{!{bbJ;Uj!p3-u_7R{!-nG{VgRX^M)El3IGB&yhZ zkuYXX{mIA2$hk7}`DoB@7OV88ox(q}So<0N!D3x6p}bvtZJnI~7q_x^8Y6M}f%u&K z!>%C!|AZWU_8TlgTBtuAHWiKTJ~&7fW1geJj?>wW`AOV^aq?0;is`1I9N$;^1uz-s zDO_%z9G?U9OJA}2Z}f{twWM#zIA*ET( z=p1MoYAONU;?A7t)vE<$%9iwbrrjRIAB4#D)n=WldEhirmu?7U^^6=#DvM}7^f zWfNPHsMMnqanWE5=*D`_kJYpGx!zvl#)9D{$HjhWw_wZ0z)2QOKt`~PDtb>IQp(FQ z`5X3nPb&%zd)?x_L|rbWQV~yoyFRWA`GV&E_S=s)H1|>Lk-6IB6(3i8cBjwCEn}^u zHd}u9su(nZ=U;s75!QOTtwHq_c(CMN(kLPaDzL*X#hG>f@^!2QY|a6T@Q(E_%`7q_ zY3PSeL}4$vf89xuU}miHidUT?SA2-d{(&Void3R|*?Vb^*j z{tH42e2_%5u4MCFj{a%qI=PY-KsOv_Cj&CYtc=4zak4;$cyz<4Ux}8%+IWis%Rt#A z#D10N?y0032OZe`i#x4UyAeX#hkViK!q-N>qaveJLIgm4Q^u!-9XDCL?}9l2GA&kw z+m)zds;dDWErr9xpdqO6bW!^Al@WUy!K%2={J$hw!?cC?xl;jI_EfnVfMr>kG3C%U zddw(ck}M;gap8zZ?V+PA=JOA=v%TuvkWMg613BW=BMMy}C6^DdnxUrkCk6#NfJN3U zLqsAkLmg}Xabl2mAS2GilTt|rHCT>Hn@M-M{#3!YrXxSEYP3IenqEhbz0GuMX?i0K z*6xT3h{*AB?*svpd&d!BL&Oi|FplDAdr0>DeKhd|w_V3+Awn(&<5xZsqA1(i;lMd29*ezb(G z14U!3N~zROgA?!Lha-)_k*r__P(JPexis>IZL~e0dGx7Hfr!Dz&-5`a3w~=0)_2dP zk-PJ(QcRk{uQD7+K9F8bEj>vNs5|Dsvi`YIa;bcGtI{ggw)-A1`csc!6t~}wnTG)<hD@MZMS!~UEe#4VXe_#W9GKR^ZGw{!29Dq`)-zQ37+ z6s&m}Lr@U8-um=R|K~ojS_i!aHRk(fhHnM!#UFdCGf(x#;N&0byEym2z64x{Zh z(5b9SL%cqMX$WZe{+9Q|OM`w~E4Eu4yHmpTdtD}yyR`23j+h_(25#a zI%(@oA;CI|oI&S{XBOu45hVU|T*>ppG)kDB)=E}IucvHJ^!WC2Na|HW2)#L`rQI$f zy7Ex)4((HlZHapgOf3Zo0eRN`AAp$3uY}@VFb!5`+uEC(`jch;QTohLJeLrTwAY91 zs@D;4_N@4;dcYSp4pfmdDOG@Mm!8J|;m`U;i=w6vaKBn9nNuSxxtz9*ZNlQ+y5fml zFAiHpf%!)_J--0@p4a@Jz0luc-WRsUG}Vkv%!}k0VF&9kc~N~e>Yv&85F|n6lE^o9 zZy)C)oO)B#ozm^e+Vj{_9N?sFDzO1mxhC z8c@dPl)S6A*(tUJbc*9=j^)6=+{^ng&S8eo_006Ew1!yMN}i35<*%Q>03UI!pG~`Y zc|@3pZa-h;{<~4=!qD@{mwfNem5zsm1>;X80??<0QCEwQ{Tizsx>gqNTw)OM8Q;`A zgho@!$1F4%Op~{|jlRMMLK$cVx@R6=LiwL{J>JWx&SCNHGFP(XDo`T*E#p<}(0}%O zTIV^~yUG64mgnZ2#^pLHbD)ubo6&jOL?`qfc~VmYgWdEeC7_g+r-vC15^ zZ-Lm7!gIXE?(LA+vL9+9p{#@4G)eN8*c?r)(@GEWPB8z;YFy~VRW1L) znQc-2!Q9W12`U4AE!WwLCk8&J6`y80*DbxDvLpH;7<9_9~D&F>rC$_kmGSt5ZJBX$ur; zsqp{)rUCgF+6AvL@_5$}G`8Qa6+sUKB9CD&@B4ex7+t>??k4>8N!y%0gD2LS)&085 z8|p`WC`s;Taz5RNxZPe&pDL$KY%WJ1@$|@$#=tVS9y%OF?KFP46_i$i@{1|1jMK(B-vmNRFj~EM}n6d&ceYwq}5EBL8*iqZ_XOHnvB27H(|` zs8)*tongFdm(%ywPZiQiP8UwWGKcMYl2DjTSv{8^#ba{V zP7czv;jLPX+AU{SA+Nq%6)HS580u^j``Agh>9)h~(iWLH!5x1JNrkdo{h&;*m*XaF z#wLoRkGzp~^cDl-4Fc7)EOJ!B>@IQN^(N3Y*p4Gu6{VSI@U#S%8q5^h!jfnb1FWAJ*ZBbV60hL{7Nf z$JFaN*ITBzgmty=?`gMN)}(QPZ~g=-qEA^_a1ttF=>W0Ju-y5HeqMh;|57|TtY5*=!+KbdA-`!;XH(hJbZ=D9r(o)XP}$<7C^; zap8>IT`5)V(97xIGZVfflI_UpPrF3cz5b#&C^B_`jiu1c_b!gK&UzE26}+3&a9 z?6{bbD^g-ocD!${bMk4enma*takE|8nKU^cy2ib|#s>BsR27rfxmn@W_2H(9(kEgF zDCYy&NZ|o_o)w5Mt{#d%H1{khFMy+GFVfzWwt!NvQb9}V)ZV9T3@Jz7=hG3-F(A?M zN9jbrIs~J2146sX)TVxW^O&5ziZE-A4Rm&^&@oe+S&NWzQ`D&Dz9oKlx$8MFOq4Hu z*pf!1tZmbep4VHqUC?lkGuY3-@K;4dzuAIHo42Lo*Z02OY>VBmO6)oRBaX*T6ty`$ zRSmZbLH@m3gk;4t9O+DwbiuRz>w&vzN(lsK%eze(c9mbZp0XL|#;W!(3UAD!k}4GC zU%|lcU^b`q?fG=R%Jy?{2?vdDjQ-jK;YMBVE zhIrbDA0EmF{5kuwISuKhG}}%6xw;#jTKDPAt>hKq!wdD*>E#;-Vs;Cq^EaL>DMj58 zzKTCg{ZT;bXGp^Z1>CcPADH%+XGb@BvF>eLvXCW5DVdyH4xqSuBzjx1QBfM%L%k%~ zwPM~qQ$#*~d3H&h8d4bd33O0x6mb6G4t{fBlEMEXZNS$ao4_xhP_K0yf0Dl4w&f!P?4bDlN)7~ivkQ_8bXs;|$ z%OC~u8M9eaE;{sNAIeGh()k-)hNskvxNQX;*KXD&%1wfo$Hkju@qAoX^gM1_1T56X z=K8H$5mNX_jh?C+_2U6tjS?GOV@^F+Zj39&--e#%0-(y4u==3?XrjY$8+o9uNAEJ8 z>cnr5Dc!piLpo3jbI=#?RJ!D&(sRXm3|6;SGxO>$oGc3E-z_mWk`MNYcOQ|I!d1Mm zH*>FS7*13rvA0O^1_Trv1y?oom+$SUg}+_qJ=LL4l^3$L?mE051~Q1HW8R})cu>c+ zeIsU>@~6gGDID~uVK#NYozfN#;CrYV;9FmFhfl35Z&0xFFB}UoZ4lqwct#H4{qQv# z!-Gxwwe7i5f@B_G@EMu>nsMWq4>9iKos3qE@^=y7RQXlVnx>WO+rp;eX9$3|MmDa+ znk*g%eAOqYubDNj6xU6!pEJk4*BwP9bog*kjdD*qs%2(^H%DLFvg9T9UoB9iSQjwl zAuQXU@D8ZSU>oPHs`P%$BsXlJdEoOslk?l#>=Zf`!^-RZIX#j|oh@RC`&oCuRE>pZ zxZi7C>H^7h5~S=5rx9y6NaM~2REOf*q*Pb1;B35Dai~3^I9gHNH_~Z0d~e!joaaAu zgcwEA@34`p9gtrGJr)eINj*S>m`0ld)62-4y;|3;GHwM!dKTax;Y2C6qYZAZ&2^#c z5uWW=FZK(6&~ujReavf+ABWMIjXUk-Ram5fV(~EzGa*>v8XKU ztP~*dwDi}2ip)){a@%oD-6@s#&h@t$SD%U5R6Cxy_DY1mVrt4bcc7wVR3n|^9^p(R zdYoV6M!$~L_)*b#MAG+ph3R{pi`Ln)+OzG>d%CGf-KTv)NKIr!d?JR8=Nxv^2%sYQ zOlAFaBR+Ghq|fDiiiYq^L{~_!Fs`*TYXfWM|KN3Jfmgm`ZH-IC@GXugeJA--S>$eh ze0XHFn}?$_YVGv-TTh;g>y?P$9U67>nFWq9npO!>Pa5>g-;N+%(~umMAULOm_A`Dd zsdsUF_da4<@6S)Wc3QX3H6bDm?BMjBh$ZFvO9VD8$SZ$%3{A6dQ)6uW%C@gIWQdEu zIDudtZy<)UeWw$G(F-byokNT114onL{%gV%)O;#jc|r00^bcTk0@MK>s&+loHB-sm zS4GQuPcD)ey<;T8jl+0^OOsA3RWB?HdRcATg*ueRCJSvWG8e&fS>C2n5U46P2B8j` z7}L49hc~C0!DjdiE;odt|B)L6I$VL=&<#AtK68i7Z*xvQ?=bx0|BU+06+Rc6_#%S> zojD9usPYULP6_%N#W7@KBn(q^q@ed{R=p&++sjL(MwpeL^e@_Nk-6HR%H{C2MWtCo z@zn7(zrh|U@RlwN?UPre_s~2H5iYUoZOFiCNQ#6w`OMaZUbwNnwSB*J#NeUjAJb2`g}YTt2!0Xm-?kq@_{AWu z?ec$x(DFPWF?{k_%QjI z8<#Ee3oke7!mMx)w?}h`XxaY3@wJUCaX!)OZ{U#@1`uokp)ztbY9`5WJ{WgvS(M~BZ zfkwT7=+8a$;5%^xh03>-ynjgn)}htUP)~%riZvs=2J#9;^CAJlrH{i)S_x$6XpQ6b z?!gbS8}uJ=(h&1)Ot(1UbBDshI`wOgqLP(+RbE7u-I?Ve;ae*`IJ>yNl^6B%qg)b! z!14UwrX5vJlPxX#j9c!>o~ZES=lK`Z=D@6?3yyfG;3%MOBk$vy7w7XYoUVbLs;1|W z;k|4qnGvgKYGHxmNsnII@G+Cb&uG-;62-FRAAM2k(~Fx84w zGpW|3riA0)H$nnS;=em+8us2)3IWd!%w^Ab_0!Uwh=LNL zEhbNjOp7-;lFjv(1Cgo8<0U%v7Q=g3+;i=;xM7~#4W@n>fGDwB29B4#~5KxST86Jk0aRr6t~gJKd60^kED|PA3?hX zZK`drTGe2J_cPNmP8o@yyQ`e%(6)P|QmjP*@D`&?_bQ11`+GkU&M@z{?(L-T4;6Wj zlU%>(pYqw$$4q1jYH?XKKKApGSO05Z1;@p z@m}bfu(a7J&A$b|D65UX?-QCtd7H|^ngH`45hfBiEQBX3GXMe0COKhu@H_UAxtRj=@y+{HqU90 zVLB=S7Mj{zB9Ga(fbgjva@1zz(9*)$%ZQeX%tqGd4uUb10tU0CY8|u3jwJe(Zu*7j z02;f_kA(#ZGxoGJ`R62MW$|~ohIf@j=vk6?WRTs_FX(HD*<5ySDr?`(`-UjUuZB=! zD(i@yUrOPgG7`_$yk(e9kE;iGyOyk+|0YOgz8Y>uD1*U~wK|Q!-sAAI6;`@4Wq40rz(Yj?lX6*ma)^xZ^LL!WR1uq&#oWAJ&cD8D4}sf%%C!;*E_X+FqjfEgOAIA6m-p0)jc+IY0%{FE zv}gZHrj+nOZN{&%*?cebvfEn7^e)S1!1F?Qv-9N-_;wNwq7?z5lsC)p?j~%IeJYIp zzkLhgjq(3)1|SfkTo(M~f0Qo%w=CsUqC9ffP4|t0F4fYlB%99oNhy%ti;Mc#Xlx-7VaF#lj6jvL4N=k&4!<{)2Sbv*{pVU zX$$*%jE%&u}FPI?)zV{ThoX?%G*%y>C zT>v8FBv5HiKH5rISq4)D&(EV4nt<4J`G~02=(bfFL@A!bVI-IC>^9NXmhJLo0nk;<{V z_MK6Tm^`Eg-G!rO5-K$v&C8|PGaqcWR=S$n;c=;`YIdwtor@33c|bkOB$cCdVVeDF zvuyJEJ$PW*C&cK>Dtq)j+IL?EWt!@z94=3)-b%nIf9^k)S3WR2dFqLs-E01hp%Wz{EL8N{&Hh6d00-SrBp>caQ?_cy`D?!?{_J;t3iMLA)c&XX zRVAP>n4r76jm{<7jK5<&_VqeWLvOfkE`EvZc`q&ZBlaf)#)9ovoq2Z<-t1Pys(tJH zw>vRsH#YI9W7X7{qq0Ma>_5}Txit3R9xcrm)+a1V>AG$TEZ6lwVv3bR zqf-fRb+ENzbOZ@5;^Fy^g%UKB*PSePvF=`?M(_P9f3xCyKS?-4JI9A_fDJIr`M^qx z{<23uTedRIG@iuoF_Y0DV&WZ!=?kGgbdde3yYkbMnAx&_i8XSDdMiwME7IHmVyI7Dh+yAPe zFMN7DQqb6ukloIa4`4FQ^IHDmH(c+O8UzSfGYlrTxnaMoCC8!Mf&OgZ1_2M4n=LyX zYft$ap_Pk*_v;zl6RU6g$FYN8cZgJ?&SCo-e0z8f;O-O0n@p+{xZ>J$=?zvj0sRkg zIv`7g(`MO9(ia(?h&rhGOLt6jU&f8+?HXykor9Efui;|t>2=4zyz|mtJf){tghZKw z0+??IV?Yr$GasQr z$XE8kxh&WlyMc{Kf-OZ!(AXR}xmAb6IYYhO!iIH6;nX~JlKB>Skv*2*O@nC`y=~ZZ zdnxSH$b0>*YDnMws>@^4^1eTi18s{{kONYvEyjEA*{KqD+#Stc@PkQ(GfcGhJfwF6 zFHq7|Ee{whHgmC>^w|!8N7#tb_8E?2utwoe*ePP-Obf)M0afBz&sJqk2%tg^?Z)%C zimP6WZv=_WRh*zMDR|qI^oy_TevLO6{s?e3*`|N;J#cZA{^WbeUKUgsi1r3GCqYE1 zQIGlBi!~oZ=R0R2ek&A}p8+z`^Uf)&Cp==a;JElQKE$n0RmsOFPtX|bK8ypz84BhyUF1$? zdY*IB1`TU1N&jP$GVsrvlxvadYP1%j9evrHPz```9D!8#({Q^}XCqPc2d4T?&NUz1 z<77(IWr%%@Jbm#&>7F#|abNOXaA{3Ib8DpbzE;fs#iH;f_w$ofR=2|u?GSFFuUFI> zl*tLSS6_>w*ACxww=xJ_nV_<7-wY>8it}-lsy5MQRahE?=EkU6i+oeGpiZOw7eL~R zkVH+apZfS`A+VPwD(U zrW@3Hby2Zab<8{}ErQ9Wv5 zsSmRd7TuepdEGGZp?i$aQj@@mYp1B+lYXS>q2I=&%n2*|69lq6&?NeQSiN(br8D91 zzdYji6{dWiMnf*6znk$WGS7LuAX#zt;RCq^8IN|w;MceNJEz)BHsyP=iKtgPyi>Tg zEUqsXS`}HX$VFv)YvVP~m^U;Tn0vn62PCxN??L4#O&Eg(V#d}x;b2+9cu;Ei z#@uoZAn{Vr?B{}Cg4)Q&y8p%CG_<_S2WBSWhu-XEb}~=QQ2uod9|6HOt|S|YA@9$E z9swa&l%55|i-U<55%i`ZfyF$6GXh{Rz)Od3hycd`5X*qo{~p){{rxiVn*Xwe0XBNtBAUaBOkB z8Zr^SE&4u>DQU*{!NV)#BUKm*nKvkpayhp}ZZo&E<)XG_R-KbV9MZM8zxX1DV2g3} z=Oo=!zZ$5&2mP@Wbs;7y>+>@&PcytEc_K&FAk6c0VZ!90zN+%5;#BB?d6jV7wCyrC z>-Dm!KVPD0e7+sX7jmOtc&$(;>HDf-VK3VmKh`jF!EpUzggL~3DSy?dRGcM6HU3?Y ze3#lsXH;I?@yd>|bs5aK?KF9B{}l**f1J>_8TDJfeZHU)BUub(JU?IMWO55>6#4=Y zDP*%XwKr2J6=CXdBid=BY5ostbp84F$={)TBYOKP61a`3*GCDv_aChvua|RZ^HNFv zt`t6yj#2IWe*Y}D$ly>WHz3r9pv>v}G2O85II%Y#)1}m4e3Sk|T}LO5Orv-~!^Fl{ zY!|cjFDqZ5ZH#7Fwk)b@lKMYou(%Q2+&i{T^m7Y>Tl@hNpk%VvYVY>}eRj(OL9{~Q z?_HHqkDUh=JW}~~LbFf<;rYgFvX8X`rp?v{^%;Bu-5hkP6CQT-m(P~IdeBX`q8C<; zE08x$&bE62tC5UpOY6LCX~T%x)R4V0cahVSBhG*mt;Apm(e?xRIX5EjbnQ2+U;(BL zl-B;1weov1X{ge{#}uHopDrUUur~!&X(KA3hnxAmrkxme35K1{Yv3WqS8>2D78_{*3jMWZGXAZ{9LPgOH!#y+>(58y2_q z4rsd;>8jROFZnn=2}A5sy6D9tQKQ1q34O>FVCk8-53LLLKz^ugAozp)XU&KOYO_CX zEz7QUU!KP1&A*iXLV1@tpMu%5e-?e%G#E&NF-C+!E3Eq*il-Cd{>HDqJcr~eDLkWb z$#2@=oL!OqQB!61a0mS)z9stlE$KG1Qbm;-revVuQlzWl_qnhsEb`yn|Jvb#+eckH z3-|t|bw1}Ec;amXtHIfO$>Y9Z+rzp*NmDRKnToh#$O>j%Or%ZVzq@V5MITEFlB%LL54Bkqa@HD`eiy_d%AI5WT;?fY81)bK@m7Ah?r>}$1M zTJN3~Ck~I34YL=O2?{Rlyg10!u-p()vv95zD3F`*_ZSrUin`S5-_tM5YGF2h{ z$@*7ApT58Q`cZNJ;@?5q(BXuD4NiekQtjk-p(|zh6ZpD>*2`?VpTy{ zPK4aH$$i+0*e>^6{-bkzx7g4fZ57*@#eNv=i)%E*+ZFOVdMp6hZ0I`^AHfe>x>%5? zjIQlLA}vh@?bblCm6I#%u?0igA%Z$mLj(kS@)=l{s`z_ zbGVNtRyRuEwxf?K6HEcMCz!0!aq^%kjrK05FZl>*!4YM2kU(uAIymfg4b6c^$-CjU z}SN`kzRZ_y*aP}ny6kGGOAo~HT{`zMk(lLhhfzqjL{to=bs z(P2$E3h2TjcX#2p0`~zId!3QImBNdHZwbETqIP#I%&x&lP|!+ZJ!yK7H`?NoBSR*d zbeBY-=#@hU9qSrFIwdH6;X39EY#TmPUwRAkPViW#7U%sy)LS+f2zsK~T4W<+oNK4V z&Mc*WxL28Oi@I7@1uJl6zo{N_K0%EM_f%@*%X&)%T$UeD?zV$&_WVs%;5}izG}@!4h%@p@;!r>Ao6)R;>3l~VM*w_V;1~wiexusL*yaEm7=^KQa~6z zRwd?98LPfs36>jhfl~d#!d1Nkvu4gun^YqMmLhkhTl$-ZdP#dJ5Lb!=l#?B24`DGz z@8@5In*$SHl$$>~*l)S7h&ahvb*XXj?t>eP?Vg2-P*bonXodQm z5c>ioC~hDKUoIX0v*7Q*TVHWBrcb&AKPm3G>IPf?MpWg4@EZX!9bn%&V4I ztBdiD$lpgBTs)5))xW&U0>QzaNz{rf>7zMB6KK6cxh?isLsympn{sC13nsz3g{_~W zx**1m3%*fzfy$j|L}fY{HiwLkNtA;Mp;iJ@*wxhsFY)BLo0`9Q^zRab5E7TCjBC?s zDb$m%C7z-xoQz+)XM?yNVDMl|#WCCJJ9u9HhIYe^T;uc}OJ&;2JO=o6yN5!h^zPx@ zOx+256n_iUQAtZm^};1|cl9w6g_0|5DCfBF2!0VBVnS?pa!h)OO%{xL)h85pPR?X5 z`^wYQMKIJCuphN=1=Tr!>ZKZt>+cSyGN1|Fyp$(x>edm@9ZE#q*_oMwW?E{nL$zMe zBWzn@0Xa(eoJjFz>s?V+FoTP5WbJJM_T(1jTL4(u_Txza&u;TjdgW85C|xhg1pH8{ zf0Q3=sZ?nY*@7G$8ell-&D}D_D=i)4mkP-OZhJ`-XRQfCvVi@wqa|Xf+%u&jgS}C9 zou#DVwBI~CRcm&*A8>sSJ(b0O`oozF<{F+S$h+TX+4g?S;Xh_Hse2(9dZB`7P1wl> zh&B1<;Vo=X_`|8Ddm?7}R3tY<_v)s9Cxm#oLg-IWe7R3jTyecBLfK>cM1yHV%5wcv zv+n8Zcl4WdkujiVt$+iw^(A07W{%J1S-Y9)&*}Z;xFv@?#An?t*nD-rSN%>#O~7+g z!UB=z9WXFiYkHpq2Ts3cyiR-Xy4X@#v@yx9f+!N#sov1GF?v&LaQkUJNJjes*~LH{ zmvfKfu&rll2csSY+RI4e(1IE&^F&rUh=q#!c(o6UFz>85abDgnb`Hq**at$<(n+-_ zB6fGQ+kyItF!5e5Rw@lWD}7wf#J=}J5K`TXje>9oWW2rMT`d*5@wtoj2$Q7bm3}7@ z10Ld=F0f+$)~jcuSdU5d?873rhC9PY1zQB&w*W3~AyqfNH&`o*ID(8&g92Y|BjCYV zU8h3R5CeK~HA&+X_UzVp3WKtw$D(RE*H#_kac7kyd}rqtaC^WXIi`9lhUNm+<#U%le%V}~n&vAld_gPCr+VTXYu zJniozFQ|W8@c75xy&(eKU$69z3rH0eY!{5{L*^FLM5u|N(cG0CiG6VD=68vjE%0fw z4Z!&o_eWBWctY(@S~1Q>wjPv0SZ;JMuZKIoAyPd*Wb?3ZjV1jlk4EwN@_b?E%Pye? zqhYlZG?8XeKzlOwr$MR`4m9Qikys?^Ph;Hi{(a-#q*~Y3n}^J%?}I~by6X(xPN3$T zm(Kc@O!~RgNg0n3Rqb}5OKF=;z~G;F`olkGuZal&&dczlqK4BuhRkRZv8e)u{E1)O zGJ+&u6!56*>^O7loklh6$P9M8WSkvw*Yhzl;&78A3*zO^u99R!Ohuie@%vil=aW}> zK|JEOq}P1bKQ7Nk77h7qvAcy(#tZxpzDII(<9MD+48tzeLHv^gY>LNhOLLxvchwy} ziPu(fv{s@^(no-m6*S>upa-G0t2e7r-Nug3O*?uxzwkvl4g36Xu-NLC0Nbqq162xdc} zEetG|j&>DsBxcgodc>N8&)#8_;eGUy6PI{e#DY-q<^~>rbhxezD^IJM)Yq8b3Z~BM zJx^A{AhBxx?k|lTp*o>JpK<65p;$a_eVZSB2V_sBSodAVGfm0VQd^!M51B4lrP)fL z-~RYzyF0QHlkB4?GSA(%yZhz~as-xH3@Xty@U>0TIc>nG`5xwdkj?Q0LGl}o59az> z*aa`&fU*&9An56}W}eH-O8gkW&p)2-nA$-2Om*)~@S72eRDcZvEw-0~{(D6>|+z!f$>r6>HU(Oym$`z62{F@V>oKTTt$#PReUVLMu>Zp=5RI%xjoz`8Ki#i4lIfuWOt681Z6<@o(ZXm!Vw-?&6@&E`yL@)*&!0ttI3=GQwfgYokq-_gojw zjZ2;j5xSJ4>TsEH^U7^GAD+5Rbc(=GL0rKD4eg&YeZ#KRo@-MF?L$pVY2I0^YdK9= z!IZkPKOPZoK}Zm7gPYYva(#Jge-;@$VIb1Bfp<$cwMT8NzSUVvA^1`eJXlE~hr7AN zU*>MlzNZc!s(P7 zr>+xd&!N~9(wr6Gj-ybal;^dXoqyo6< zYQnTTlypWpqMJ~^U(}jIHvHx4`Kv2(=6+-bb`HOqBZl=2L~RtQZfhyV-ZxT!SyHdr zH|*Ux%7FH-6qESc(kg70j}P^p0WL&B;(gvgATPzg=rJ60K*sW)JoxAw#Tr?=Y`+GQ zd2yxU%3V*y>qd|2Nm}JUH1ifA8l*nr)p${a7faw7SP5O@jT@Psq4jm;N&J=*dVo<8RA~&Nv?Qkf@Pa6}!3Bch&@DnH&#&Il?ZdXZ-qJ31OcKjr$n{-kmi)|B<6){WI7hc$tU50C3n=eb^@g!gJe6#aH z=I)iKU2XrUZ*n^wLfA0d1#9x5_k_oU+FdKt(f*@uL0HJ%L?-sg=L5LomcFkNVoxxX zU!P0f8RLvjOTG765Od`|I0b(Gym^hzxo0;=MjkcjRlpFDqLKv}3eDv;1ZbOY)o8=R z$h9}89O6t)TUEjVy+)d5Q{}=Xj#PAI?qjK_J3XPz5*Qmao{DQ*z7H_-b~bu~T)!(e z2{+OAxQGM&@raccj54y}4e}U#loyH?n#1TPlK^1NFyJK?&K~oV1fX9cILP2b-t6yX zQw11Dz|x2XE>9xBM{Mx*2rgtI82u+K$$!qqB`!Jx@0y_e-`7*E^e@2g`fFJRDy-l? z|LfoS=at<5dv9^6UVHED3*~KYZgvU0PD^K*9t1}(a{9keWZ~7eViQnK__rV9|2IzU z-(2562gaglqfj?~mbSdT&2KpYy?9Vb42pLMW~A^7Z6vx$U4E<#+zf9n;K9rY2>;du zA{u7)VH>9tBM6>pLYI8jckSC}S?)Ry$7S%D9W^5^wER4^A!o6sM)drMN?j zySuiKgD?(PJK03k>q5bSRHd+&SB{l+dHK!~orQZk8E2kF$BK1WS1ULUN$=F!}OfudczZ?j8{KJ8YWZ=7dSV&`jnW!70 zJ2cCc<hl+D6-5cQZ#f<$t=*j_0CRJ+4KGB3EE6Z>59siI|#sbvcn4y zB?~SK^FDYaH$HPi2T*4G-dmr;v^Uu219torN;Le24{l*=Z0X`&0G0(l5wW8I0Redz zN0M_xt53oKncTQ%UaOMdzG6fwuu>iEr9t*jQ&tAP8#if-trrmoVFxqEVWUi{=`a`f zH!cZZ@bE3S+92b#5G(=UpEVqi5!o8ajo;sGu|D^GiW@r7_apF#q*mNGauyuq4PsLS z)HHx9es1mU-|0BZG4onihzerk$a*gl56@&MU+r~O9vr4o%->??@$&0u5GcM77f%64 zuU$^-^)BPK#89`+BmcKLzNQztL?&fQ2Ef_s5I_fRT~{(E?7^&6cgH^sHREeeI`7XG zuzIL$4Fk50;&;~vZ4}u9bqvY9PaESee?gVR$y^R5wyHOWq9)&l1pp&+@UPf5y~B;_ z)k+zRPWNgqu>K~g8tlt2K8MZ`9~>ey`=vVt{zjg)Gpm-1WOHFQsNWbPyqwGeN2{!c z$$VT*86p>q2Bl2Yo4qv+D*x|eEbAQ%wQjmAxI3!6}p6)$XO-@mJ9xC zVzP^H9UPr3LVyq_0D}xd{CFS%F{CJ@@4P0%R*_U+WiUE;C{-4a%WJ)f4tf8pEzdm$ zbN8D2kn7+$6BF%K6I1b7zSjYjmtqJcq7Et?6Ci+k`}g)onPvi>zFhL?d2v_+A!Fuw zN{8Q`I>r7t;VLVh?J9=yi=!7>*O@%s~ z3TNK0FXkw-l8Prv&br5lah|3bIZ)>TjsZe@cxi|AE1x?WQ*A^BnF~rss~B4!-}3`N zCKpEpxg172Oe$$yumP(%)^Tp*O~(}9nng^^ktO2R^;L6J9~btHk>_hR#(~mdVb?{; z=QNaC`pNTsu3LI)m%YXM@D`FJ>OgiXGlsC*mlYq6U0uY(6OR*E;1(N#((*VPz||4A zUyh_NP_xKSYnrt)pFKD04$%((9AmZXqgHZ`6_M=bZX-56lM^&OA$j%?V}qo~bx z+9;ct&gmoeh-`XF)g1#j9|0AamCiqR9{9^FKg`blmLg*jh9^f7ug&?Woil$*_JQjM zr_O<&jVA*GJG+hnu&dLS4@;eAu*03cGnl)V9o0oD*2~bZLS}&4l~<7CsQ}}3bJbjGE8~d*4`y%V~Kqvue$WpNG3}zg?wihNc5F0e=Fi7 z*eF!HD*vWw(#z|&!AD%ouZ(Hq3Ilhyks7Ns1$N5cIsVvryv{kzLW3R`<-2~3c?((@ z66j(>@xQ6u&G7&(is!>jxC_0t>C!AUw~JeHX)3IB*XE4}#mht#G<`2e&FU(11L{h9 z;$MDPYU5ns44H}+pf*ad)0xktyU>$M{*69KPnxs;qC?ND_7#5&URMWQQz@`$cP(N# zoD9ZAq$i`&@N6~*i4SItTaUEM;LT3en`IpJRW|Pk=Fj}9D5IvlYQrJ(KLtmY+1(GS zq-bd*h1d!qvJe4S?$QQMY|t!Tch;bNsj+sJSyo|)W3H5!J3LYlEg4uN7^cvaN4d8e zQ^CaNGInuGjbFz+ZIu`Z7MVbvb?#%}-dObIyiKlC?(=?%@7%2!q9|37uU861@pr?y zsONsY%ywWV<&GheUt!`z?$dWV%+)hsf-U~ zXq-Wkck72+PfAPcpDx8yVx`91Ew%9Qxv9LznO0wqwOL>CL_oMTlSG>mr(>GxHlE^V zxJJSd%#96YASaTm>fNsUCFQ86h-T{R?pH| z)o}=~KAOFG!8XG}^mv${%(>u_qp4al53eQU*0Cy1S<9!%EVg|4(r`9JY`<@ccf>#Q zV$P3|tS9C5(daJwE|r5E(Bwa~avYOY{UepSMIjf=p5F#S@1foz+WTG|tVybPIFrXL zY;RuX_#CUMh#&r7d@Gr|CA%h;8#I?O_F7{7Dr*-s{#+nA^Sh3({cD2J#ABMO$^_Vv z5B&_0`$42@$@le{9OnKo#;nsn9m*}He+a6nYfV_S&AW?6n@>T49bs@s+h>FYt|~Z= zGv7IvxzinH7j=9w&0cL5B$bD|b|W98%*=e2Bi1ya8J*iu&N3;@Y|Nkl=>iJMF7v|3mx(MY?(W>7WQ*I zEjDAEe(Sjq0a*V-5Cf<weCV3uMc!zR(+Ya4G$cEuQPNAGKc}ET-&8?3*^-iZd@08W6A?COY~Wy_7zCH!Cqe zVD?W=rbQAFqHJX`@+7=N-<+{o9qIw%-$?O0oH&3dQI#sb>(BcHSsNPjeg#)(E(l!orUfPhhCGRVq|+`$#{FCY%EO+VK{xC^{4x3 z7`jkpQ(R;<7qoGk&np3gV^aj5-XknuU5c_N=ZIi26x)M%Cb zc%k*7vw2J&-}W3UBzV-7jnoE)tZePng~p;<_Z<_7W4oX6DITpq3DQN-fJ!IV|KPj~1-u zT(rSqT*K1iN7&l<>nY5#Nw>0Aa=0?%g?#?uaY>RnwS#Sw&bPcK$W!;X@yVuVPm!Ne zVEqmb5jzDsLk#PkhT!dAIPI(kd|Fe)> zN*d&+#H`tV6n$I`ynKedD`)el?vdEcn=Je<4z^vq^fFZxS}P%*K45{c>-{hmzev;v zp0JH3dF8wBJ!+iNi{rez3XWws6 zV_IqbB9dBwD51+7u6$4M$ltIYTJ8{`SSTMe8jZ{xjfTHYw;)7j;qyrf|D6Bg%K}g5 zny4M>Rz8+5Ob!)hCL6QIyoK4jRF6o9Mh}@l_ku!n8)5N7G!c@3M zmDO+C*U%{wA>?;^s@GEZscbg;WzooZm8Mr(PwNlooBZxjCeLzw>mNEzJLVK@y7gVp z-`YT9#xnO-HKhnA*_a0Se&$bhWG9unF7acZ0OF5{h3|`a1L+#=BGD#Np&N5r>tler z0}Ukpn6sG-)q{;z*FrCLjmit|N&=ERF)`na2>wd)rA9)A(U_WlxHGh0Oo~h4>--Fh zvu$ldiT2I3$AHxNS_RK4NCG0iIj1# z_jHiXy+NE-$7!*Nq||e%FN5sI4ECos3*A@ZM~Jh2~4YhqWrT5jaZPDlZ<!rBhme6M%2%+*@He9Z#jC?g9N3rBj#Z98UoQ8 z8f+gd-L&_raYuEl2x<`$vj2`C={X9N?);%X@ z(StgAOQ2Pu{+KjT!P3pJJ-$9UQ23|saEcdK8urL%Gr#JVXym2M!R|^E+($$2!e2L0 z5^El~yKqFnATlZF?TWd#OIhn9t>-ME9bR-0SFb;K`4e@h>;6YP)u^tp7?KHSxw(XE zho%*NQ{x({HIs~;xgYHpphST|ZI{|OvN12Tg0XcLf%mKPobFX0$QkIi)p^-+jP&^b zHdh&>(P+A8CM|M4k;A?Kbj$OqRDITiSbP(MYG(4BkL1CJxwjTo#`YQ+(D_X5m09a6 zgE%*cf`Q#j0f&peiMw7IVmd2$5#{pNO!hVF15%(+jC@m65o9{N!h)Cju*mAh4FLIl z{hHNhX>9B3UZ_rCf~ne$;`t>26dC_50bq(Q^nbGe$Pup8btV7%(bBfP+W0PY<8uj# zz;02{el5qn8#m5t0i_DR3;>?~pA$WG0(`dD%LYh+e7_{T)b0ZBlnXEg$jxqCwge@s zwQk>jnTCvOOlykRT;KgK5M~ql-=dy+rv2a!YsG|B)~2k7A9H|W^vpnYwLx^%kAs4| zL&`BB)%)cxmqPgROU%^4KU_$om$#W=S|9vp%lFytmx#OQ8i6Bs)|V3QeB$EBLg&%R zdN2;w7QesF*{b=s7%X}@kY6xjE&kry3EY2I0i=cf8rAovhuy_8&)0GNNyyqw9m!~i#&f0ym0|^W#6Vv~o z6M?MT4ER+U{)>A{ZMex^9Ez*Q1OF;Ng}1$Km3=Z4-#VBj8BwNM^ry0Q;a`KaiZjvQ zs{sF3&bqI#e?503L;x4cu2b{GfBBHTtC#k2>EmD?iRlyV$6?g}WIhlBUeybaGGEJY z=B|_Tf+F88GXEs|-KsZ*Z~T_cF}UC>leO~A(P#apkegk_POXd?Yc5xEQ12iz18Bp0E{Nx$+dwYJtQ}8Z zHs={u%y8-k*#-5YR*o8`+u=&YA2S}Bb3axlC6n}UdEoRXM?~jYb;-JudNMsI2Q*3a z6mObNHcm@Z&wg%}X;OX1kc97Bt@_Q@tt?yN9MI1ft;M|q1{C1li{q%YLgVQmtiV!@ zj|2^4A081=rg*lY>nI59Yz*nE?T8e8x3#T^h4-MQ)Jolv!k9mOgXrv#I`}>7i@X{> zgFS=ni+Saq=O2HaRL7K2UxIhPp_+Jf81F%60s+@uHHRW*mzvp;pQ|xysFX?QTg_jj z0P~^dHiYhH6I^e2uXA}Bj_NOrqSKh|(a)W%qsq$3@tT*{#qANIF-S_D^)IySy}xPJ zm#<|Nyd`-x5THhs145E;M%Tl9T};(QBNi3lZ=@TPR=8}sn?84;M?b8oT-BAIp`ChM z_l-+}nj6PuWDC*Cw8+d!mY3Je&&JtRY$URFWUtrXEPrch_arSDqz|a6n7AI zaMFrOlqO(&-$u;~Cdm!W%HC#``tTJiOa{l7Qun4>PCSCsaXf|8DJ_qV*6R%tqzVPT z8%lpcg~^1G$Fsy=DSB81;M6O^8=yuwYJ~Xssn}lP-?n?2niE@2>97}EZR9vOs#(G| zEeBEc(Pn2{hS>!&afQ`E4!UERtkJ@r>r2WBP3?91ItdA|vkQ4*-rtoNw9|;|S}D4J zO;9!wmRoK!(RWWPh1rWpcDl&!356HqU3L*$BZ24x8&DSx|dgj_wo$-&PvMME(g2P-;z{z66#*fId z7qY=IPMf9R?2N{uEA%#sTuS~dz%`jZbfkLE@r_;8*7Mk=)|l6!<^+)NmCm1+RpEO;}CXs87!P#J@ zlVD>a5BJ&0rqOOu(1!j_lVtd5TPHZs>*xu|jT;A?@+xqdw^!1II#w@^US&b+cD~6i z#eF=q=-d2q&zc?|BblzIYo9YbD?-Y%C$ijI+_0*KwU($`{@Els9F!>MZ%v|#TU-+l>t)~FB40E318+tQGvUefr)ZPVxG&AcNBOUGAZ4mR{mk( z+cB+a6!Rr)`4ShwWvJz1bt`l6HZXNv{-8~}P|)YB0X7-bdT|>_x+J-)&cdZ!SOYql zt_R7Fwbgv1C9)(EXz>B@SZ?yablr?Y4oCJpBAF!}S zHMAa`^_S%qxfT=@pmMjb&goY*fDO4|kqFd&f590mt2Br{v68GymK zt;Ir@_~Q#|)|u3KFj4BkfaBwK$`e&Xa=)d^?HZjAGS8IMzxes=H`f(5QY8;1C)6Y` zyV%Ms(fThJ;FiWQMNrjmffMDUXnB8U)|`c~J~0df?NXbH7TGD1!-mlr4Bp|jowB4v zC-MbgoAQU56q<2A9oaAwS3itDSmF5x9gkEGmcgOtF@c&|wy0KgL`^Ozx{0M@MDQwY zjSG?F*xlyqSvfl$K_r&?Iuw=g2~4m}ZS*1Q_iz(m&fWpk+ziD5%wQa%6qtDZrDFAI z*fU1GRpE!Za_M<>X|WWYx5B^gI^8~B-`=#RfKW_yj?P8lp`c9ESgr`CcQjh07nnbC z*n>Df>~V=WkC>7-j2aMS{T18(COq`e)+quAmgyokpyp+hr>itsg^4O$Z2(q@;@KDV z1rZ}BK)iziEzUtB+O^x}uioq1J!|Z{0lCC1KH8c!ih~i1;ZJ#S8FmB`b|qB)@JRh3 zl+66|G4z8xPPjIwm@uDB2u4&tgZg#QU_LEf5$Id6!`cUbv#o^tT90TX+?wq#5TYBq zr0y|nOrzB#P5aCFW5Un0V~9rFRS&D@sZ~Q!Q<5UgFpy9l$oaaI;Xk(h8w9!duLR#xj`wuENoM$?P<_F z?(7?GUsIlsA}v`~S*^GMR(dP%HzwW7a)-$1v>t!~PvLmdSnSc3>;L__)uyKr}T0&f11ciY{cC(S&Q!u&hp`_np8M?n?0>{AowNLf@0~W2m z;v;$w#OD^UKZZEH_VnENrXs#Xd%jj~$P4hsX2!c+*L{3a{dq$PT`cp&bN_}4(-(Av zYsx-C#&wDD?niclh>HOc!Enzf`YoLGn@`v-K)Tv%t!8s0f}L>EHbffpjDA5FZ~Z-WoH3H4}0!p=GEPb&8E`!3~CB{1}4&AfE8>2 zxA*IW2kJVIg2Ce8!xNlvJ;yoEcU|+A*0j}|;6`PepxnbCgSNgJMi_T4zNgNqJ>j%3 zlfZskW8;r4ZH^O}a&xsIFiuy3si}&Y6fK}yvB@jL%lapWC37o?je~U5Oj)6OqrFvK z63DIa>3qkhK|c`sak^~k@gtEK%wVvy8K0d-Xowa5rd{pgX{4~a{@Qac!C%&4P?@F7 zvrW9i&-zR{V_;${Y@YQ`Fbr0;5c_4PqFNB-hHUUgCwU1lE|)4)?3vao=& zMQ8Ok?3P0}0*#!p>?RSx37VUiR>$N8lwQdvoAPXr_+$XCtBst#_2#Hy2gXI)b5^u$ z&I~6v-M_}TmB6BIic7Hb%}1s-M${g@SY&>F z*&tT*Rdtj?BCLDN;^vF~(np32V9{F71=-TuXhWZXFR&_GH({_S*(OQHD*b*FuLJ7< z4~91j+U|!PPFg($!EN<&G8_hSwx=pSi;LgKaB=VVk+k2X`Qgw|K|Cu8IqvEkd4w|& z2X%%UwnQ3UQ2q42Q%##~3%wXSxubRN^7^)Tj9mieDT|P3TrNZ9!D)#ec3@t#Jz-@; zESx$85XEhD<>3Qsa0fBB)zipEg&1{pNp78s`Y-O-^}V!r&%yB!5Eshm<;kp8YW>o} z_Kiat7NL=*2S-z&F4uMwx}3ccA$y-1<4$B)&a(gGMr&XoN0l96J8+nyB$KL%v-#Lwpkx ztKXqNH2K6r9$`E!Kl_mvg>ADJ0YZY54HYPgo(<$V3{})*m`19^SuR8LO&5OMZd6T2 zbOGH*)Lkn#r0RFMmtgVfsGm*^5bSBRf9SbtO59V)(Zqw#Jx9FD7FhDAlk=zzUHgz{ ziRhcX3qY8qnRrJlZ$HCqy$Bc%BJFJlNXZME1iP}?ui?gDVN^@259s~AjpDIFKl!Mx z|M-`VzfN{03<0H#30Y~)e4fW7AxQ)fbF3r#b?Zqdi4E2+jt@SmB2gxPlt)RZRM!|Pv@v-rSR|8H3l>8ee zz6YM=3wrpf6&NbxEfYQ~v3Qu-{Mb2}pQGFUFbA?hV1-xbJzMM3wDnZQA>HX^x0|p*BRNsr8}*$nB#roJT3tuG|ot%sieU&9izH*dLax1u={RoCg~7+P&(ujRfcL>@|Ld@e;{+T?O%4_cf0aksp*UnXm?ZZhwJK zO$&QXr%Z*f@z$gYarvtTB6yOIDJXa4d@b{Z~ zn9y5n(N%BET_b(1KazCQtgu;oiwfy2UXCN@Zw)QGKATz^TWAH?wC2_w_8Sg>vt-+zeVE~H|u;~ANw9Y%N zN6M{eBj9&2^|z%mh**_;O2fG%uW*oOHC^?Hx}jtQXS9{S?d~|2*e65q)4nm(GXR+( z5b8_c7;AI6$*XwK{o=4$8=7G$cbifP9$uC=T|8(UAB#q638s`?XoF?WYy=k! z{ni0_a-Q6S9w{K?I27JbW6yPHNnJ5M;`JYJUm>YwG4L~4G$=6pgO)K@48^51M!%v6 zShM=%G~hm&S8QI{@0-cy9WLCN`}&mMVd2n9&A7IDM&T+&iFTk^zrmZi3ZDXUIr!i= zOZQwoDpwxW^+-zOCyju)>#kzU@J%yD6#q6T91meU{?P1LGZ7Y+eLIF{U*tufxi`n> zTYw6$ukutjx$|t%AGn+3IH)-ysChtco$0&=+4NtM{koI~RqF-dh z&vl!L?+U|~VvVo3I>J~a@({XQqil#as*80nCgrQQ$VZM=yX6^2HR`!u`Rz-$3*p{I z7z+nN`tG4Ntd7knEnb2T*$A&TNJf!je%tC>Hz!(o)dxW;gqb-aLyynb1@l}b{i$=` zT9;tJUkp*Aheltail2UQh;#mo3pm2!a#`LXwzvI3)`{O z807GJ5NK-hY#>;)ylOx}^uhAJ4Z@jT^4jLwU@pEq&*;7xp> zS+KhYzT#%M^*pv0rWd1`Svt{_Fyzo2ASC|7&~^S+3zt#-_9~pX-y$t*<`|Kt?=>cz zS8uOU5M&rN=u*7ebQo-(^63M*G}RxlTqWDIK+=+9M+9Tx`KCj$lYK;5hiCT5UJ(Og z{7LSQ<{6ozE-eP+tXp1K9Fo~IRdzcx*7BzY#YkM`?5$-!t@=g&kY219V+Qk$>_~Tf zOiOMMI@$cAXZj_2fWhghFDFc)otbB))c`>A>=q}pFt7SN@=k0l39Afx*=D@@r9Uj2 zO(?;IgYr|rCieGGH{~~NS$uyLeDALO1vPndd&JU;b4_D4xTd(sQo`;p&y9d+i7UDZnlm86;pCp&M6D7 zQBjqGs-bGe?5S@*5Gur#O}8CKo*&9C2T=u_#ZNVV_RitkAIOu?oubschhkhgme1Rs zPf5s?H0l!2jPpf^2BAJVx{q!Lnv4vn+1D$Q+SR^%_ByZLyCPwhZ8mxP&u8;b2;ejWl&;o@Ua@!tvt2S$zDIGIlVOpP}pO3~K!wq59D$46dRznL{6~C14vP6prmB3l+ zjBA{+UOnZa!Dp^k?x2?!_V~T}ANTt1-IngEb&@4TxYLJCD;=CygYHWVx)twKUs``m zI3n%QqWgSjY{ZYW8+nb~5;`(P*Vh%L5%-R>YJmD;nUiF-0ni!p4Wydo2b@itrHEo- z1RgUF)%9=x@wOi0L&F-Nq}r9Sg`wE;Xsz4Mb4vW1d>-p{jZDvIVW%nSPvd%WvLpX& z+6b!ensLL7GoIar{x(K{&IV^l1J_)2J_aZk3h}P36#FMfpO;$(WLcAmPxIPG=Yae+ zda5WZkB6!@=(K_#g}vlIHk6r4EqChK=p||bloAsdJ~H1?{D@veSXqj-$a_K^{+uQL z-iSn_zt=X}eA|Y|-f+0h=jMjnx?KY_;WqQy(e&)7!=`v3!Kh$+u1}lU=mcHO$sRJ_ z!;gssE)H|s3>rNXU@7F1ahKryd5bC^6xg_U_Rg=sHKnN*q~enm93tJ zqx#a4`pSgoTv=>hws}|r0!A+w4X{;SEww$L+0cBe2pjpNL21a~Qgmf z7nrA*$?3eB9Yk`8DK=9sOcqZyS4Z`l1kF)$ot4Nws?90?Ab3~w-H7hplM$gmf@z6? z*9<%CKEQYWR)KR8J{C)|os?F9$b5Z#bv&Hd)-*_izR-8pyX;F}GV$CZtUGuHuK!IT zS&a!vw{BkHeNp(ilVoJeP&IUrg`Kf4}!V!kE(Ex<8UWn4*%L9gdzn-RRb;(@ac| zL+&^`w;4OTzc;b=y-+$OsyLCXC*!jaUC=MRmEXgK9y1SoxnEbuXLxM#F33{{x2ETD z1wA+|DDi(2OAq6(iKUpi1qwDEWX%pb?JsHEObwvwFEASu!)5+LUv{s#mgmEz1$rIf-> zt9-cQUwV4IiveLgP(1iSr|!bouFd zNjd=rm^5Ao18F)BU;R$|h>r#Y<|*sqw-7Z&8vG+=F5Xw!8URU zV2?GhvI%Clv> z-o4yWmKwx{K7`3oXa{UxN(S^CPVJX1y!4JV;8Wce_ArMs^C#Q$mhMb%jE3p&m| zkg3TJgH<`Kz?q|EKB~!Yau0ryHSp`qa{be|(}9*nQK>JX7^{ZaRJ^pi^*5ONc=tmz zMrCXNyOjrQfxzo5K9kbq!1C?w$Fd%LD`#UR>Hj8^<1l6=b z>C7+MG3#R!HGw-vY=OZNqUJ+L#q6tNG_+*iWo5^(q9I0WyahK7k-6bbUR|*HBQL;? z3rTotma9vpw_A(M@U48CrYnDR?l(|HO5x6!4c#%}d#hmH1cV~FQ%V$+B9mo2%_Pn= zY;qiw2oZmd<4UZKn*Qn1)Ab&RL5n>id?Ie)xtSrv-AGWF%rveA_cr^mJe^#lMAx3G z7^DBYc=gBk06gLh)NM|ENbj^pE@55jP$CT6#lR9}Q(8Y>uX zEaAN3ep;;f_I#x>$jPuiU^@KhX=oWtDVDN+I*KOwt~+dc=W-GdQj5xKn~1bdE{$LB zR?0}EcNu#(?LE-2ge^kZDE)|uEX<$oLK=NXWlrkI>L&U4ykY4j3Ar%0GV2y-lmAt$^>yudDRHL( z`2x%%ft(PvYD5C)xre|Q_RZIiom4Z)8nc3fpvUvMgK_L$4*uwHe$9W;A0wO4)NA@9 zLhtg}7$PrOLTsKbH_3NTB!5LN0^F7*1Z*GWK@H{vaqLpJZr+79$A+AUP^%pZXQm9`mNw|T2` z;}kn#ww`$}K3X}d8)zlwpH_CWA=3H+{Cy`sw!o9zn)7!|+zdZB`^TkhjW1+P&sfbF zIe&|P0Pzg?;-{_*oGUCS&>?icy?MaxCP!G^*O)Eow(QLw-HuO$8A@qh-;rG4Lspd< zsp^3*W$J~kFy+j^Gi`*@D*Wc-7y_^N#g1Q%H%!Nh6aWYXX?4^#Nb5v6SNr%zw{+;>+%Yc-} zUS_qgbTCJz2|4W^aDl#{;`%T*&%=FK-)*TNKR|GLjV!sY?43cRGUtTt);7nW#rn)6cO{rJS$ zy8bDPOJrH>yn}I}Y;5b(3zNin+0=`+ z^q__@Og7S+!TFg>566lD))rtwLV(EsQX#I`W{=0zs5dWfbc7dlb(^4R0^74m=_?Qms$3O+_| zX#qwRTW7D1mtu(Okm#fYUn}3yo}YS>oa3=6DKHw;KjRsvKO%T^3vPHdQrWGL$#piP zL^C9Q-iDLq8O9k|Zq&Sy)H?(Ek)Qh_-plJ9imMmYvkDpfC=IUE#z7TpZfttJx~94y zuE9D-Y+Jm!t{amjlF40T3(oycwj++Z$H_1<(`ePF5%YizS7rCkCF`MsT0=sQN?iK! z&Qz-6Z4m(noqDMecj^mV zMghcOH!mKIoxY&%0uo)Ye*V)T_cxj0F=2_|j@QjlH%*RxirAJqfysV{V47Y+}eIj4p3G z1gWV4zdq3kj>Y9MPHZ$^`)KMlOsC*FN$ zfRnM`Ze1(uH1;dZ?C>^8lPM*;<>lIZhn|Qy9XtEs);2gzcd=iBGo*hO=8pW=7y$N0 zntsm@H_aYb=VsjY^j+b3Hl@#B0lIb81#A5jjdwq4M_FD zIi@cb>li~`TM4=&W%}?*Ca&aB88H{1&fE8NsNyyfE_QOAFmyUnef-Ye+g!*OI0#2Jzp4_Ue!%~(o&+}@BE9*pJ&rzLw_28y~T;+H_tbD93$wGX}#hC z<)snz(?)(HcKcv=(dAU34dLp_4`^gcL9EQ!1&gwX*bo}8JrS<+AILWqgkSz6o1xKq zZ7#^UQx;^mESR=(@mFzreV~C|Po!`a8C7`oQ+ZDBBaueQW~v9@Hz15^?A~q#LkQy3 z+cSG0yeu>&)o{Iv-dsCN^XCM#V9>65KRBhZjD}WcVMute7F|l+s9^mWbI5bj8ot75 zHM|X$FLTlyni!WBZR&BR@g9mGReY8#Ff2Z}Yt9u|kOEP<>d)OerUHOs$RTG+&4OS) z&!pBizDuE{Eb8_kbKIW`E+%()f2+{E+gHGN-=HgC z0>V9xMu7oq&ha^A%bvnlbf2=;rtL43@fx+}Lq~a2$tJ-ZO}5Cg_#jEX!DWg;B(Sb~ zqD4AAt52;4kg~44cg4HIzt6!i=KBoh}m@N*%a@u7V}>AF+r9++UKUK z-LM5M7g#jGz4Qj#-tx2kcUm@&%rB1EnDWofxoVWX7oU$Z`GrSALx$x4WcK4i3e|1GW?{`d)Ub}yC z$ahf5e!A7|z!G9(>b?x-KPR1cO(gw4Ay$V!bY<5H^egOdf!TZzhE8v^*6{c;Cfb_Q zfU9YdEU-}qn#1vE#Az}v^bjpJQvS0qEepmW!pQ`vzSP_QA^#<{sJ%UP1?lAd|CIGu z$>B-)7fqVq8w^>Af$3Ha*{0)nhq}9`k_{Vkb1sSstp-*^f+5B{M{}D>l!Uw?Tlxo< zrl5`^4@S><<8uywbsgNg=c>7Q6|NA z?t}O4=olLjuCiPj9%No>5e6TNmyOPyNXT2ZT&S}Zp z(I5eN>_3u2$Op@)2oYif@JQU`7)RqLC)!m~zq7=9u|gX>_?iXQ)htxR<`I#K4;8Gm z-p+KA3tlboRC-@LljC}?ydTn-S1ReUzcj0kcvh&B4msJ~Pn5n&Tc}o4ME}V9|ND#DKpv@+$N-?gZ4>crzRc+ zy6|gq;eSF$OSK9B?N^&A+oYJ=f!Ngl@~JL!>^*IZEZNVc6tj5&624=bZ=|qEY#LRE zW2*8{`HtrVI!p`Uh}rYM%TPcKe(u+TDJ&bV`13Nz88mRFB#hH#qZQ!qN7yEax4{Fl z#{NF9d14(c`U!Fb(`c>I&}V+a6=+xO`|fs0ai zuE9m`Kbb0itK%!zu61~?v61)UU2yx`;-`&#e#-u%R)^`;Nfxkn3u$ z(;J8X@*x1Q$+R%uto-!plMV41?4I5c05AT{PtOJX&j0uH{-W6r{%sYzGT}3A!x7i@ zBFeO+DUs+OypMyfA8NCZ^iOR9Z|57*0l}GT@X1VjlCEZNQ8ge{yA0>CO=b7-=n>xo7wz=akO6)q5!8D_Q|-O4$c*V|a_W zCFrqJ5sP9;ktofUdt8u1;)^eI?EGs?Xx1DNra?Y(f?C<8s%!Aqf zJXy*KWW~5svAB?k6G_gzRxk1)t!DHZSDF(Au;;e=ktyh8X)ABK|y_Noul$3uz zi7uREWvf)}>!?tQum4Fu0OPq+RLr_A%rjRm@Z3o81nqb~ZMnE>-x!O0P>v6rMoXKu zDEeLZtjq@4sH&c9V3wYROnE3qK5&FffAE!hA?PGm8Cmrqny}m`h|R$J$6F!Q%gopA z#}$7$yAXXmLc4y&WWc6UlZaV!yNNX-OG~+;8n%xQMrQ1i+*YX{gQ=8}q)~|*=1Qmo z(9S-~$3FrR->56V4SWnT;GMN*g9<@7k<%cY+^;~wV>$ae8h)$e$lN3}>^wP^C06mO z-41BW{D!GmQBwt^64mDR2;78cDCbBdPH)$PtXvuS4)$H#7kuGph|5q1Gf$CpB{#>` za_#%R>jK<$u0D2RDkFV#j5bUaCp#PFz$wDkS2+1XODo0}==ti80)Rz1E{AjVaHQQ|@KPHycdw zXZ84(W{m)J#eg%hMJME8Vie-YB(U>;K!oh`Ko_u^wF`{>_|?x{CD_s7x|q-DLJMRO z^@?D(1wh^8PWpZLO|g$YQGzqiPqS*rLiRT{r5vZHNx1lw46!GN7+J9V7{t!s)+<)mUn+@clLI?%$UE%Zqrxt5THQkOdVr?Q z(oV<$<9KiBs?evc(Rp?9rrH)Vy>EP?TTS~RaBLTtt-6ez{vcN|(Zfj&(t9ir`J)d4 z{{V&d%5dP3t+RMJtfZq0+5S_sc7Z~-3J>2FP7_DG-rCb(J*>9!F^*H+;p-$;-RJDv zQe@Th83U}KE71U_Rxu_6>?hv%+j24_N!)n)!xVGiBID2!V~FbQ&E=k|xR+#q_IPR$ zRjij?%@O5nr2&u*(HJA>A6TWicmD(K`0MyfJ6C_f zkZ+)qn{Gywj*9-jA4Qni*X zUvG>O18^ioo@M`rar12h=}@%FV(&(s;vUSn=LaYkg@~8n56PEh8G|g1yu$E8jzO6yXQ9$y**Gir*x2>A+U~s6e!4SY)xU_ds z)5V<22HyH9PD*cg>f~3As<*=Lni947|I+gFf%x%kKXj4Z0hK^)*dAUxq0O;T;!A|8 zP036|CTr!qaL+{EDlR{@?^&f#-mHG&R#fb>ZS43l(cH%l6Owooi{H&Ii7j%Y5W$oq zDeV$N$GU;HsB;}G52vTAwZ$%Ptw!rNFVFCyJqs%*U%t$?KT$_o>e*_{rc8VseQSei z?&l?FI0lNcO1(c)l+am7(OUnGqjKn+ADYstPGGq*45&n6zJPf7YM4*nc)O==5L3e2UQ=WW8a5dhD2L?Ft-$OQMWnm| z3mBQP?7$C36l^vH+c_Z%e$yurU(}ETKGf@>RD zjB{QkIs>H=_SI2Hb%p)R;nf3IWH12@$%6-n1Jmv^Uw2er? z6pa3mG<%Tu1v0VPVE>Lk>3X=xkQ|Usyh_^(2)1+2OsfhtQ6|Mlv6n6hixVg#cMV4T z7O6xpcgLznmFI9p?U)`Lyw&5{8_EV4y_m~-vEBJ<9&x27@K1ECD}%hzP&{+AYiVXX z5a7YFLCV(7aIrvwA^xm#&U<;~eF8spi5PJ1r80d5j9J{zss$IpFE z##<;v;8F=(%7>o8M^mO$7$|aIddVBA3~)=eTMk+ZbuO_4RDxu|TxGWNX3&YBn{XMw zTv}ywtGBb==IjABoWQJTiW}>2*HTWa6I&sdI9Tj{uqdeT zO5JH}Fi}~7WQG_l9T|!Hp~^1>Y=>A2)>Wf1(9L96dX~0^6Tjg6@xZAuWq65W1ZE&# z7C_&KIz%@}vr!v;_*41K`+QI_@tosM8GnJ7x^ir0=5!^iuH>h+e$lW;Fw+)a1DhJC$GNQjT}m zMn}#9w>sBGYjWOp)TqsdcLPPfsMKBwNK5XR_fjKa!uWYhz*LSsNzC#DhC`~#?Mhqn z@xElAb|$r%falR0=vk<`Q5|lJnWYC4AS_nb=oNlo+lYBizPDP#JP$h){i2ZMd~T6Q z?UyRwD=FbGuMuyZUY^2Z^+mjI6b2jA2SiReOoOysWdREZy4LUu^`2k3_}j&^B%eN4Vfm5@%>UVKRt-(K&8oqNn`8i z{^Klsi7nVs;olMiTl`#B0Fpl-kBm>DJ~^H2kxGi#TrhsHmz~zx?7pT~K9O7-S}uW$ zW{p?;P*geexNQ=scS>f7`*?D*fcut9h68&ib%=nn>XRpSMp!{7wmi_}5c`X2M0`YO zgiws?wZ~q6Lmdz6GArg2W;qgjQ#miypWs?8q#-Yo3f;w*rnm=>Hc-GiC!AM0*J#OIA?e$j` zHA=ai$l5KQfb-0zuyIvX-uB2Yow&O{-9Kww|AsRBv{;7Z5m zo$t5HCthvWkcpi)oIhceRC^TDBa6zKn-OdBM}16OHt@^4$Q<9G{*h}BH2S7I{rTjj zmy65x?^j3*Lp;eBe_dMwd>{UQT;J#n&|+L}XRZ#-zpKfWmSQ_OCy{vPS%8EFs&Y1~ zdxiDdycZiyv!bZY+N&Jlf3k!PlW=%u3TOm18GrGMC1#9D5{lhZ^~UWUChhS(IgWvYCUY3*W~p1*2|`3^`LH8$47) z*MoiPj_@=ffL3#xFcn&>^I3QcyVB|@0sDRfAU09e?L80wY$?T4^~2P3hU4tc;cLkR zR<;+o<3qT1oEtx+%*v?tyQYHJBcaN{U~K(vOA`~#&_}VqJ>1vu!+rg z%z@kzypn#cPiRZjZxd!2_Sol-b{O;N)-Tys(5n2CKGJ!P`JJ$6GWUYdS=?3!u@NU+ zvP|L2HuCo-3*QJxjpp}MtrAzedW%2w4EWX2GzhM3> z@q5Q$qlmi=w4+ogM18u-{~={P!l=0y3I9fGV9fKi(h$A|hjE*_=hhBpqnqbdKjIkJ zHu`Ef1E9K1R~~`gEuMmP#Er^>81oUZ4tU|Cz>E2{B;m^d?prj?XgKWfK)g~;4vOLW zaw4MjLyA4c`H&o$W}F1-O#JWiS-fcdUjz+=!O+`uWk5gkzvY;poQM*xMfLxLx2qkt zC=+Dn$5lLo6cIo|xrpN+Pr?HQgEz3st6_Xd3$Iw|kB_@`w@M8{0rAOh!5y zjRsfLzZ*^JgITdTt)R1gm!r37JyaE?(vqjYjSQ<%m_4z+Ic9+l9B3%-WZH|Rzq=RjcRtw&{bF{v&{j}{ZsziBjU2^j@lPS!% z))MXmX{M7qPU8)6e@kFNNen1N?s>9I#Wlw!rEp}{9qgcS)1@V#cwl1DNz-`A;dlN! zzqRi^8=mg36V+jzB@?c4Y!)OwFg*8>RAG~D#wNc9h4>)B-$czi2H{_yd#_}LSVCHu4|>zb`kjPfThDjaRCF6XSPam8 za-nlyX>OJiP0#^t30(8@S9ooOI%PD{prk=-rzB2`@D>a2W zc3`7r^v&}X1xAIE+@BKtR!frXel4F>D221xta)|jcS4j_ckrW66~JE4B_vva4B2TK z$mj_ZP{z=Wog}@8wW%`m;d4do{AH!ss+toqrep675x4gJC&%j1IUmCk?!la{UwC}H z$ptt&%lpS^s*B!}+0e|%Gnb}Z@sZtAH^(m!5voK-z5v-K)@z1UH!CbxoiNYbrV3|g zZ>{@ZNh?H4)5y&6$s8d=@0RD#%9!?IZuqiT%Qw=kn@hLcb5TM*bPJmC-nd(_A9bQ< zZTxSF(!CN~#_BS{LE7AWxoFvgFvH>cY~EriJ8GdO#C|nw8~dt<#_D~2CB|t1KPp|6 z*a^nRW2&e0DVJ|u&CP0!(@vGlo<7PH@@ck;pleHy|4#aL)&J-t`6I*1Rli1e8ADAT zaujHXh-d$Bvg?|R?Y)VYQ;sjkbvQfcqSXK+g|LP9k@f2y?v9qQP6Zh{CL%P%)#C~_jCY$&Md$J zPOAx(|CS(Qg-rzioSD?!ueyQFDLmV+=0*8qLv_jy0S%O=#$$tVO`JZ#vmyV>Oh3;$GL9G@yX`oyYY!xTJ!*R39Oo3EtK#-r!!@jJU z0%eRMAJ%_^LHOn#5*sNL)&9J`1gWM_G*(`o4?7?*L4Fxu~W| zia4mbyW+pg1O+*DAH~E>kC}&+e}=>Tzt^D<4U_EFTjF5GJc7pGqWs0CHIJB5b)%t#yhhMo-;((FzS+GaLnWKb-^3S_bQQnThmO$h%@T zE=@_8rhOJ;jEZh>IP$ej&8etzu22o0R|{NXao(d4qoKW$hb^%jt^d;T4bIw4m?rO( zQTt`?g+tQ)S6a3{j6b}?F5-j$FeNtziI*w;cQ#Rj=eMkS`+mYD#B9WDFRBZCsIxue zLa&Mk$O*VHnwc$XIzE&meK6a8@+w$}2*ya`5K#cqp(98!Cal({?&C~#o;}oVA7PB5 z5Y)^^(@i$VpbLI4qMgbFA6=X+-$jABsh8%-(VR7>)ZV}JPX@ZO-tAUiUB2_D1RtF7 z-%Id{74*(8f0jm!35~fP@uk#M$2o@=M14WAT6^)fW<%}wlEl=plR~Qv&!_mphl-pW z4}~*i@TkV8yR&A1>JY}y2*&4Dy|28mnI?uD;KDJK|8p;_b7QI!QZJqGB0{^kK`)(h zVWuGhq(KS1sHFhJ46jR*N`^s=09pFNT38W@25vpg{1A;#KpWDaPNN5aa0c7_6!3~6 z@fwnMLUO1&oCu<>x;+j36D$AP-UWc8gA8z#9ajCg#AeRi>EqKGuJla!v?iCUQ}4*a zsD4RWl@*Eg{goM2k6QgAYtX^T!UsI-=_C(e9`;gouaTm*hPYk7Iqh zI*}p$WWm)27XR*i05r!>gE#GcRH!s_yCbQrWarfp7geEIT)vU-)v z7`CYRBdCX1&NM?6)>Q0N$yLm%=p$qtz!o7As2z*Jj7RFWK96G}7%;`c&L}b&HCa^d zO)@vRhCiJ?(_l)BSx7EHtX#z&u1!{(|LTwE%IZVPB?jy-)siw)m-pxxMHInNk?oc% zeYq+MhbIkGxhiAf>?F1+FtUo7H{90p4MSD&%%S>fG?HIHxa_#ZP1s48(nwWawMB^o z^Ru?5jX{Hz;U`(=XAV>GG41l7(`pa87cEnMFXrz>eg1snbx~!`;8toavA7-T;W+&* zk}J0$3WB;av)|hTa89WGF5vHD_vyH8WFXCOu8I(jM}<&Ajln7_QzDmHxw^O1f%;++ z;L}5ZSJ}M-pt`=l8e5zU-bzvh--@lRdj2RE6ztd~`*+5T2wq7*)t=NE_%j&x zmgPIyNAUt^c)I_4l)jEZ_=62ix9Vj_fI>!S+IvXoo0#2lpXKAst~-1g)9gD+0jn&3 z`f>#y9RM$t;O`R^NSlKVBLZyUsJ7%rP zs@fla4;bs*R9YVznSngMHSt@}YH{8nhKJ>Hkt(a|$7=kuedEQ{Z2Ufy@>;Q1W+Q5CzdPCTtvvw^KX@#wXPKJ#B5wCu4;(MN z6C=zvzdx`|Ci9SNo&|mbF2q3-D#2d@Y$6Dvf8gya&$fDy7F-jQ>7=JL->2>I4D3sn z0WJR-tBGOimx`g7gez{z+z^0_*bQMQ-VY!qaNm43f;*Bv93$q!~h7-t$ zlrEd?H^+t~hx5L+%`T95l#((AG;U8IGf3kZFGQ`kd=QH! zYb&Wk_LnhlHAfEJQ<9~;2|{Pg@l=?%=Y#|W0`k`|5u5hf3EXSTaIR0KpB7oyGC2c3 z?W6NBS%%M-1B}()Sjb?nTNsR`Ti2)r zHJ(r)Pa9ft{kB;nVCiz&{=TB$()}_FLdiAh^(QthxQbs98(gF@?UUkh3sO zcs7aW4pMzN#J|alLOd(dWt~eZ*~>Hr+IlM)qozEH zlxp-l{eFNeGpzLJ0hI(H{jsl_AJ@hj5(PRG%wAO|-Do`H7+X;;kdlJFTIv1^PpGGo zv|4_95*E&zMb1-JS2C~RT_icL{ZJ{qqkppkpcpHkH=od)mFKaew0`#5<%UG0H#;IT ze5{EqT@?sU*5_tdbBZ8%7>FX}(^iDkH!>f&PX~&L9UqKX(F1oUzMc&E@f zY55u!OL`KH42fielv9if{Y>rBKqOx`()#g3+1^V3xQ_uwU*|naquq*g?g+wU0PL`7 zSu_c=+0+|`-JegvEk&jce<@t`1F8s*e?6GZPwN*J>s8nzd>np4r}{;v^jGf(W${mt zg%4wZ1Oi>UK~ZiKvx{rt)^iuS`}t(@4IaOKd1+MWfd%`(4$Sa8wy0ksU0>(~jh6-G z2?BYj{bDcMjLUG<6}VZa%||&@Rt|0EEYA=uGwH1!ZCkb9YM6rzmt+75uzf0a7}{m! zWSX3aS&po2A>$9ZD+85Dw<<&JSLhiv$b}|3c;!_{VaK8cYT>Grr62Y_jXR3j_U_Us za3O=vco=n_WEb%JyW^zSrj=&Fch%8L)7B&sTB(n7cK=cM6gA|JE||?qRQsc%J4K0Z z^^0&u!uwcGV(qxOx6<$!6^jl}06E^1Z8N&mEn&W|l}%`iID;*}LSJav2G^tlz-KAE zxJUKn&UO=!6ww^ZtTQ^xEGxS6b=`ORUt#9}Lz2da|9#{L3&9EbB+KNrz-f8pJl>bh z9+iO5n{g4P0_xJ|@NcaIahBtU?^iOSE*|4Gz@hPTCI9N2tC-FdvE2*m>aoMg*0Va; zJzI@FnOjKOhgy7e2>UOE__cYdX97@ZGP1EAdaLGNzHZl<@V;)CCs*SlKP~RN^`bCN`6YKm1{{8A zz1?lgq)yF^lcnNSA2+gfr4-fb<|*tH#nS1`5A-iFMoE<4(dYO`{W{l&#a#Ps`|!+; zN&;J5EEEzj)495CqH{GHR_nYw zSHxGzo|gNyXe3C6?+^WhjZGs7CL4RB7u^7F5&hkhGakN{qzk8}nM(1jk=0~Os+Xs= z%)k`co-Uo|Daowv(*6paVIdiFbKuOWk#ek|kj;1jNa6~B(Ye09I_7rj40f+O8P9j# zzOr)eU!|%0p~0zxEU7v>6FLjX1htX$70gL4L&Hz)}LG*Sm+-O1B;}>05DqmhS>X=C)IQrh?-+FAT4>c z?0|RJR_F9PJjLO|?SqqStStPXejmwb;8QitLCLHmd!SJ!5lMU=lJ7Dy*V6amYC(tyLb9P7x&;IK4k;UEuE49=*pr0 z;ceE=$tb3duqYy~-)4p-B)))$6Zq%EfbmA^)79Svq6HBBp)6U{_iBt4IW1LQOAMvS zzjQ!rkyS4O;(OdP&BrKyd2X|+H?!stIk;0zu6W2{3)B$+m*nnUu#HvQpU094E%QjA z7g_?C<+=}o>JsQ7;`_pLqmt{rZwKO0D7cb6zUp(v7dpKz3maibGwZa z`{>xNPgJg(3(rV5YqPdYSpw_7yqzup?|*nCrSC;cpEHBws+LZg-ZxIL=D{>R0D}I|(uN1Q zBqDOI5M26r4ylTWSBccB7x}T_0ZYIeBlFw9G2H_HYh~*FFGZa6cv5%tVz}WW#rb^K z7c!N2ovmu5B$Yww5VhiCQHa{G!d3nMa|(6Y-6x8Jzh0C;6`TsV)bVp6Napf*QAu)=m?e`yVq*n0_FIO|7DH z4SA1i3*;@kk$jsA6%SQzr6xmBt&FsHyMiT@R5b$JY!~3yio|-$79*d?pb(g{dOn=v z8sOv_mYM%>ble#Eh>sHL0sz&$BIF_KQ zNQ)U%YrAKNw-A%j zc>O;RZP>HA{uVXGB>*jQW$SstR0i1Y(LYZ~5NsTnF#k!0)NTg>qr^Dk^b5u((>=>( zzRS>AVfZb^)@`GTTuOMh?nvA)O2i!At9^_%vHE@d!hWIMfA67vpj^t_UV89Ni6OO_ za5hdG86lt;!m3u^cITYdG&A(#KnKWW*L{yd*%X9}$Es~rX{{Wuu`yHNWlv`{j6+G_ zvhes~vMxzyyDqA-kTxo| zzfl}o)mrkSOcoEQ%IfDS8BSMQI56E^`&p{B`B0aQZTx8YCGWoePDGKTMF(JC2Jm>A zjejiRhwTwL)`>#&X z?G}#jh-E%KQB^i82jxpt{ird78=zg7bCRp#$WKZgtQ|YANdAk4t-XO{Wvc-V0Y+SuBPVB)BlUmA%C2+v? z=ye}%?kZZR>;NWv{dS#2vSh!jKAA!E|A?Q+Z2|F`dRq&E)=%_0FJCEF^@F$W`(KP-+q?7xy>joe zKXguQ-lLab4e4)e@D<-D$_=e~5wKiRK{NRdyvf}WO$BC)Oo5UKnG9a{$0p(~pVuT{ z^-+k3vfZXX`v4(|>N8K~%EwWLp%GmbLlZAC$aFnA#_@f8br(2`*0~L1F$j2mo(5*6 zFdGzB_#I@D9uleK6*4wy)J{I=%$MCstN8TVFQ~$~x9(>3gZhavh)7q*j-Op0Ao=O6 z0p1bk^4%jtJea#YMi~VSO;);EMTi;A_!YB&CsCzzS`P}?oU>W`*7T~E5kw)Pj2Dw3 zjlzkW^riYR7wfW3%s0uY5<)jbI0-O6&9Pn!LT0=14^K0`!MuACFWwV5J`Mg{C?dxf zYt6OyTV!ZaT69g27?8A`cP`x@J`MS_CP5Fd?yNKHQ`U9VBDxY8X=rW5N8DMowgL&N z6w4Z656w`om{Ug5^wf~n_!uaE;1o0K$T8cX7l52m-#0>A{AO)W`t)?CFO1#V2NPx< z&H}m?CHbmfD!g3%Yxm@fN#b?dPCXHcw>^&DtJmeN?fPW> z2G7@#F`EpA09o>qiLdrmiKCO556^MH-2-F-AT4}g!9TFm`&l@nh(rX?NLm}Fi2?>a zQS>xw0|tNs23f$`Zz=zk4pCzfEE+sarij-)Juns^X54(tk!(N{gkf5GD^{vaRyqQ1sy&klF^VxSEY%BeR16SL1 z*|76a;uN{NKr!z}wGSI-ea2ldP~mjH5|yX<9+qX+eEJu@i1}R_pBl{bE8wM9bOlrl zERB48{tsM%NJD?dEW`t+?4$#Y!a<+12m~kNtylOj=eu{zweDRP;7BtsBvvPNfU(4; za(pJO43RhMaHS~HRI)aC&{y{}iI9^q98c_OG%n<48i$p3s@Lo8B9EoNra$ZVLm_4^ z7FtTiA1qpv3vY-O-3&G3BZ4T7 zv^1>eYmZ2!LX(En9P&h7W%<{(63i)~ez65|59PHva)ZT0eCrVX{n<>PqQMvPlHV94piAuZIoK|S^x{bA6Ml^qY@R!83*HL}bg*pX;8r-m zj{Na^Pv!BS@8!s*$YNGX{;qTjaAevUl-wycg!3*gj#=g{wMS&!?!0z%LUisqvW3{e z$mcB$9F!Z?dgBX9VN!9UHE?|*XCr>!A8+Pno4n8xKBqYu_t7b~Y@en!^ra6kH{rfv z86`&0CsLxRf-bRRd(=6$hf)^F+pLidjZW%cf})%yPOc5k_?-GaJU09Tj+YEJS|8v; znSZReBCp1Fd(yBLo%tVE$xRW&iS9rj28N?d*nB)4=c6Ols3v!;#xXmS{o?5ryi1a4 z1!$mKfyeduJUOX)AD_d-yCwSU=C$)t!_`Dm#hH#VCVi@`!2zAH$7wTC1FEUItZ*x{)Y)oU<2~T&_k(T99rC!XH~ zrb6!Rp?EEE^?iEX!kfM+?r4Bk05ij??mS5l03?|wzAKj}h_++Fhsosvu|Q+=l5@}2 z^f_RnsR01(BMp3H{CRD+A~7=kia;@cAsx$wms6B{ki|r}MWu1*oufS|-3i0mh_%@m zEvV@8!71+p)3bISrB~xflC*E7a&qwxJ)WdE^PB-5FkuPeku5AAA9GO1Kk2TCQaBf6 zf#}z9!NbCc^pug*_^h=TdGZKxdftd&+WehYvD}B3Vof>t*pL8HED@88McwQEFUK%y z0|W*B4n+wOrTPj50vx@&+0MFHM`&89jfHlq3)nNst)NrN0%ctOtc6D*N47CbUitOV zRTTKV&xwt&Uy>>WIL!c84R{q@AQ0t12Aj0+nDQT#0cb5$5m=me98wwnn`TSYMqCUG zvR_;``Mr@{(guPmcgKF@C7zQIg*XJluyeol!_cO+zG&Cmg29;$`|P4TrcV=;g6&)@ z&>0BGE?j*=+>q_-g-)uD*6?*QtjG2HyUIJx%SI7~{%g~FL`BkJvdIrm*dIF%{1jZ? zvjXfHnZfQCfW|}oQ2z0OijMAm*r1MG@k(gr{K*T}0dp(E9fV$vg2WKW(VuZNjl06E^fK&mNync*d{syyEYDieulOheQv^Jf zL;xoVvud2M=b@T(fh=o}@@GF6FZk(S5#bNdpEw)4zM7okPKIWDjQy)iTL~=k@M1T! zB#ei)R@&x)5P_r@eo;@W2cNoi{Vn7ItS&xa?h3{Nf+xID)VOT7C3Y%ic~7$jLmMQBM23nS!7$)!#CEkVmxo_Q2 zT&GnO7p=def!_GI&~n(N)ukSu#fg&)BHW_K-x%OEODP@lztD+%ZKL!*{)c?)CiDrMT=aW@?ZpSnQaWS_d^7Pz-ULs2L z*6BB_$X<>&ea3CX(B3`#!(Rkii1aO#pH?~+Nvc?TlsGEXTDC_+VWf$PX3M@_m=F2V zq^DlavbR5A4)#Icsa|~#|U3~?tN~3`5{hP~zR5lO3|~ij83p`Km93$&#o>g0z=FyAmWm1}Q_0}Y z-vTrFm4wNNfle2lN&Gz8ImZ02o2 z=R!oS8tbM=+4=}c|F`ZKoH-NJD6QPC&p<5&8m2-LUQLXg0i5GrjKy*W0Nqk>&dWgs zp=5LVxq~`#^5k@*S|UG$LZd#3c1f0na7}rxBlX9#!+41;GR>u$S-vU^ywmFs6amW9 z|GT3UR;1?CFD2^f0$rji#Qzg|pv+;5k7_JZrM4@ai;>sDoJfc{)B7y&_Mu4taU3gY zpURIu2ZE%#_Fqg3F6^J~5)Ikh82bFQM^CmsL1r&f#WWM3%SX?8Ec4m_`irHR!bGa+ zq(Nn%2+m8E+lJVnA{#`RF^L16|LO%X3++NXc9+9mq$eD(toPKyWXL17&eeR0JV1E2 zxRU4CL96sJp$lB}ceSpTmdx&a+v#M-{sh&;*xSF=X5O(-Q-mr9d4nEp{i;>sL5ZT0 z$5HoRB>-k9;rBZ?mMq2BUDl*B7;>dlFS=+< zD*qBmhf1tRiC~Pr`xz`8GQWrJ>Cq%w!9U$@YXTWOY;jm{h+|8ma8{M#4E_yxw4ooK zH{nRuNf-JFN)WbBUX>JpNcys;y7D<~#vp*B>E-2{!Xo43d*4aq8h?K*puHK>!yJ-e zbL)myvH4HtMisxA=Q!Vg;xB|4WK*5DxVm?n~doTR(XnKurHt`cdri=PDx9duk)n~4DYmqMN%%N|3 zxlgZ@NW^1bH~fVJ&AmA%A=%Nt-o-OY+%Oe=<$|0$yJF)kiPL))`%Yu0XxzVO6jDX1 z2r!wrCreSV(CJFrf#2tDxmMXxaR!DGPkzQ3=^Zl28pIzoB-W1 zr*JZsu5XlSCH+=)q)I~sFZecEVMd*~gU)%&P>|83J33}eFGR|^z?d2D+oX%`?q}0% z2F#`sB*jqDjK2TsUGXjRntLC8(xP?}d{oGDBIGnfF{rHhB$s4=sWo@mukq9M6t6(` zlbR1RTUHRJPjo!yPHl(!UhEHqx+@$C)n`wyN2XT3hNsvly}mej00%;}NoUJu(|_Qi zqi)?7dbzK97katUtYSrif5%1H)B5&yHwCgQDi)~ss5pHTSIrD(kPIay`J_3DCAviM zYHCx9P{3r|S6-oJBQ8Q!QiGJrE#2NT79js^BrbL>FO9q&aBmDP;m39-`=#EsC?~^i z`KkpOEX=?Ct>(1S(~2?uYSHcAsHuc!I4%^NGgI^On%{>BTi%iW$BDD4iSlrFU~YaR?@~ox z=gt+Q31tOS*>sjVG>4N^jOMyq2vu`}%T)?K$|#|jovyNPpp`tpGLa?wI6 zbYpKt_g7Fiis{qiPa#mU4ev*A{}jBb4z0x_al!7F$UtEHmr9-iJ5wEC^9}%^`I=;Y z^E>o%hO7z29?uGBZ@;8zNL4eeX1->lP*p>?1JwP)Ba!w%$}DioKauwo+#oG*w-Mh$ zrsKskA7NM~?;~M&a-gxJo^R!X>keS>^f(7Gi8pvUN8t^giu5hdXugQ)q&2v)|4qGg z2dI}D^uH$E+QnAvdI9R?T6@*({_749lrx-#7f;&+_X_MqeJW4}gpdwtC`<5#vM^MZ z$r=51wcj`vs`fP0Bud3}umJs!3si_o+xC;=V&QlV*jHsOlJ^vFs;lKioP`P6O_z;tjN+;eQMxc(tX8}nFEgsj^yFrB?2DFeWQSzqd9 z1pSQ#TTIB}R|7rpL_`F)(*CX4V1PxO3t)BsxA2fzXY!FX=(cvj6_SN0_u4PU;V#^7 zYj^uV4fIA9lLFxYAS9(tBSGTr`HD9}KkG`-6Bg1N00m%4vp^&o*Pbe*UEIF+cFx`@ zP{h+Df!Umb>h!bYg(cJsccKokwHQ0+5!{bU$(EQ3g4_3-J9GS} zE)d-pvr&q6E1`w(Nc2>_i!^R>qL~`?oD&$f@Z~(vdvU-Eid~@oHw7Q44mft;yeCbfnVxx^)goGE#2Df|l zk^$Bk7U9hC1aCeyWPe&vl3a-e%%{l0;`a6z-XTgI(j!$i$A0?nBLu-|yaM8IVAl&B zgCK@ZQZO9CqQfdf4(u&Sd-|KA?(hi+CGUVjU>^H^&z#oXvf8Cbz!)!$LhgH|LI0>8 zC(d3Lc;4B#2U(GAppT(J(RPi4cNsbVN8H2I!K>y70bQ<2tWg5#G)KeO2%|0`eSC z8E?$={a5t$hZUV6vkX2o`gIj0mgK5}?2W0u;H?Vu@_w>5X3Q7$y(?_*GUH93=!zUy zsKL^av0BnWYTR=X1>OBY*C|%X*2z+(@lH#T=uu0%yi@zw9{w2A?gBLE53^~dihm5+FnDUZ(k?u};D_k&M@$5zddH!ic$Ce0Rt%DeKnZfhVX zVM!S+>vxXMpgEschAHqy8v#Jp<4y^|Yy$Gk^4RdfD9-jeZZ80WAQt4xe_<)VYBU#E_aU1ldfM^KZp|BsHTp&RmrxrQ6kDVu4B(Iyc1F1Opwq zz6Rb9@il2yCSh3fjlH%iZ(PFso}RoA?bqLLyZiLCrL}JL^6cSo%U(|&%#Zx_ag%XL z#7M75O?BbbMUR&H$KiK{`#*EtLlTwSyjBr~ELKTlo$C%bGN5QGw0!wXb&(}MlXX>2 zs>rT9j8mL{3ex31xLuoMcgp3pH!!ZFoJZhQUS|}dY?06}<}tn%K_he9*+vHuS#_cz zeZDputsKe}jmRCq&8?Lls=1f*2Cow;ThnH6pBr3ffl9Po-`8s1wcxs?G?IX_@X~HK z1t=2&{gUsfB{%`dFR5xx;2i_J?%UZfbrlt^3z{t{<=jx;@NJ;UVfcP-T;%omN$ATD z-bpk(9#Yox6JhHrbnXpiGi0_cF)Tt=d1JXHYbu`u^r6%1nlq7o3jh~6tHH%ub>CS} zWXb1ZYS`3!#50=pSOB)yeZluwNE%nl!QhbO0W$I;QAI*oFjof1T3R_~9B**`C?uYWOX2!Dz{ zaS%Jioa&Z_NWxoS0fM}Q>dR-h1Co^{W6G`>3yL9Ry2(+!IX`u;Jjb>kr2 zmsEqMhMhj|y+j_!moU>WL;dl8rt=y(xi{lQu)YKTqX@P}IE%*Ew23~ceZT7J{48F! zyK+TIX>?3SOz#?jS}HZaHwt%P?vwb8k?y$xT||K{C%&D}1+(|X^=c-}e`59uZ6xqR zsNI^()>XNv607?#1Dj^n)+)^Tb`=%0Gf$8&pP{!*n+|Ek14jlw9`@%-8upt>m5}-3 zSJVPMu%ZSxfMdXj^Rwcx5kqJZ6p5G6GOsw5#cMAczo4u+gt2dGFmz}Ugzg*54ISmB zL474*X5>64q>vU1uNyA9ck--EV^~6?R5Jhi+Yrjv6>kWYogWvVQ>x{+_s2GB<|8L= zJ$LNY)ZZlFP`N)O;E&F)fZc&z+DG7F%b{IrW}F6I+dFA*CxokK*Ff(2f4e{{rSWJb zKsYK8fKj_On5E(eTQvk=w996Ab%8$4$SRL}9UZ3jZQ%hhGy|ehZ_dSZD9is21;Wbq zwOPsT*&n1gY%aAxvPR{IpN}HM6yTAk&=0rGd62w)$}dhqf&R~<9%zURBUH|!zfR;y z={TUBo%<#eglwWdVZVez+6!f^|^!_-K7DpCO2y5?N>{r?HVo!Im)h z@77UI?lQCI09}}L1ZknOS?86B=yjJ>I-nCI3JAMlHU6B|r7;!)yV_`pVvx71VoTrKOAGC#m1c zWcAt)4|?#zq8U;Q0$Q%fDE58q3m|`QbVXkLQO^LJSOBHPuQTBKKUzHfkDvUnzE9-J zK!X|l_45D5_bIZg!FKTt;|Zr^q1DQMDXNk3AbT z%ue7_O%;+)tUf+z!{jAXcn^j;8H&%rtOP)a@uINTG=g%slrof?=P(0*jNYYZ0i*Xy z=?p`YhwMJ=Ba&l{mX&GK^{j%&yu^trmDgJe%B5W9ThosCvt=LmD~5+P`@V)(xteZ} zR)$`w9pcSW=nHWu!F4<({M6qlTz*+&l?;ysDxsv%xG4^b13aen{W2htH3c_v!bsUB zl|HKmt8E`F<#lceVr>yUe>XM$O&~|3---HO)kvnLvO~oYsC-RYn;Pu(|4{eVaZ&Ai z+pum0lrkt45fy0=X=#-1jv*z64rz%2MUd|996E;>8U^WY$)OvDZiaUa?tRWa=RWuS zJn#EF|GeuDKQPW(tTpq?>w86y*G)d|%i-iBgCRPMal3D@b@~RLE|PlEZnO-snq)s$ z8I*R`*Vq`n?B^8~^d~qOms|^quF99%Msz!BEbkkQ%S$2lnw{Ai8+zve9y!oNZrPO_ zY-t?E?3mo`Q0^Jh)tv#%aQeM=BeME5OSjsC;HJuqI-lIc70yl5STKqUuH2X2NjywR zo~dxr>HoP)@O7DCyz2O%K2~}?M_8@3jO`Yvy?VLZqeXc(;HpgX-4I9V(5v}7fMW@< z(^3dn>JY?|p$Q&k-54|+x06T~SI7P>M`l$BAf)Eye*n|(joc;3>ehkTTzR((uis2~ zULf~nYDPwkX5Ts6!Xy*fH|UfwVRmc;kXM1v6l+<2jpu3%2MJc7jf!;V<*8MnZCFl8 z!Wmnu*!dZ-^8+8qNNN&5p3-DQI4Pg}`ZhE1cyc`dOs)~-{=&XI1gJWjC-ji#$Ppv3 zSq^Qv1Rs{F0oyKsREzK98|n0rIEZG(L5y&E@++b6_A`y*&}A8^#bZ-;jzt%7v@B{d z36>^}c(t@|3_>$obyu!C&+PZ7G(fE=;c1w}*r@ltXb3XbnxxL3Xl~;)f$!yY95GoG zn~SE;drTcM^{X(?YmEKeFOMUS@n!Hgbk88833Ng_m#+SuM!YC{SF<0mweUTkHkKy zZt&V@|B9j>kO1lD3Wq)e){}taEMbduf5SWCo9q6t1PRn+>eZ!TN=RM$i z0z=K%=v9-5J@Pm-xbsEB|E!Z%%eMQ>{aewT(nGJ+h`12wT*XQgl{VG)6C&H zhvm#H&IvaG8Q-6 zdV2-kC7)xx1q5uCzz!cDacyfVAAzN7qh)BMP7c{Rb#Wdhw_C0FY}rYtc!4tPcbb{# zcuoye!o)%#%CMKLA@~dyZ1pux6JgIYT*y-Z4AhU_$g9+ zCF!^D+12ZKi~#>Krp4u<$bg5Og<;|C%f)JP>=TUlKb9~HkyRR&jUej=~QhQ(HTo+pvFYE zeq;i!p95Uztwa0GU_jb!&P?D1p;9`!+|(O^_iA4+_<0%53HfK~?L6-k2YQ&`vVK(k zFTVEOgjO&wAlJ8ieZDuDvg@2ih0N`<)n`J4_EdU$Nc{6)PzR2>1*|Jr{eRVnf@mAvMj0k(|ftUo;Pr2bCgy54*azzIo>%)#>2@D#9bZB z&(=kJ9$;1VneofWuAxQ?vRhECdBb+sNy1CTRNlKGeW(iX)*hIC)aPl<8J$R8oC|Mb zvK^y$@{%8+u9iyEwF=fPGUp`r8r zAJ@34y84kR=lQFx&S45E-%FZsN^Q-7LYSzN`=9pkQ7RwNDZnNNf29D2O|KLUF2$E3D&`(~GX;y)Jfwxn{%(y#r>ETOPpgZ97a#J<+vya#pH?!UE6+K3D(Ad#6P_UZKyo$@P&F1o^Na+ZT z(!G(91GH;ACL&^mb(wdh4fqNH=X%O+0&mytfb1jLPb1$Y*y3n6Agl%vhZfdmO)QNT zzcyXgxWYvPQfNnYCI^GJSTr`OOvVArbt41wLU&f-fiGgK$C=OkR%!c*Gp!>!(}=d0 z>f(W_uKp!HWyb>i%8@TPO3_42)n52Ri=L|8ZrA`8Irm*T`<4V;JK=K`-%J72F0e@i$=!{Ad zPe6v9R#Lan_|cA~cIRELbm+rsxO zjoS5W&ZQS~f3CFvjJ(3*QC zS=RY(Q+NORw zMf*&{<9q3}zX70{7-;?~0_5$19Ybi?=h;}v!)f#tDO+B7ObMgFA} z0F?fG=)|v?)jt2IZmUF z8PZb!j_{5Gj}?w?s{}jC>ab^v;zr+&49Sb~@~(_GH;RhcN4^2(RhLzV6eA*BHfkhP zL!S=0LM6lBe+hk6CW{Y_zjZ25kVYIvF@%4hYF<1~WX*Nl?K&-y&Yn_I0#^eh?OxoK zc1s;&Etmon37eO#(OJi#qZHY#5IZ_jVl5_ovGhmARyuulMPMEF4Gpw;8!gebdD~hK z#vICJ+Z6ripg#1Y%K|iTNrIv`UmL|@R!Xz~<*BnT_>O3!X=+%7-}}@=Ap_) z^Yi7#ZKKjp`b$9>6YP1asyVw|?~LM)NR{%Rh$E<^I|?^#Efmj!r+;#HPcd*sH&jRB z^#b)rtFj^+#{KvWh?k4UnF{Zq$@y|D#nWW@K6e1ZHW~ zml2K*de+nJ0YHMi*%7&O^foK)`H8D0_;&gEHEenC&_;P|@}U>ORc%yprr{n+2g>dJ zv%`>l^==kWJe5krB4tv;<8Y+=1y*~?2eO}E(}jRs{-{0oHi{2#2*RRNnS>|5SX4D0 zvqWeWlW-PUa(aAFed^kpS`GR%2Dnw{ zLJI>nR#jz7BO1I)am3Mg=x(?;cg5WhJVg$7p7Xp`E*MMdyPbzrj%s)_^aXln@^018f;%Ri3^$_Dx$lh#doIViAd$ z@SOYHnzR~mJ?ji;qiT~MqPd{cy8(P+h)*3#W;;$zs2NI4Sm1eO=U>;hudlzLU#?Q9kF z*R+s`jzn->CUcQ_&BCXzVHxdGZjfcIlWR6ohx;?`0#W=Sz5(#RNXU6liZ-eU+ zb_oQ4?*EO0Isi$k0thISpWuZ|?9oJZCt;pB;2Lb-bYk#0^W^B@$*|8(XGlHGD-pG< zkZ}pTkw{+9@Eacg8i%QOOiwdy3g~|O;|KKsCU|~oHd9armwIG-1ta!EourlN*)oKE z{b|I@=5y!AE-%_(KbBl<)KU*yIS-oIK!a-oDhEWA4fF!%H6M9j2Moa<1KBqPwkF=L zw_J@d`e0L^e8Tp z*-VND+!huQFXKmOLRtf2)8>Ms8m4P5;ttlfletic=z+(j;)HoTZU~QVmf7%jux@SM zRqnoH&HGc(6TnFz{>-rV!q%M!MZl^u05}P(g+x6CqNMm{@9^zt?3pMCQ7ljsDH%#F z=r&43NF>veY^9R~QK8||AcbqV)Tf7@XZ`8WyWg}={_1PmXT{4JcA!rQR%l!)zF)Fl z`|Z0w?WtStIM&ff9&daaxDuUhJ)%7K+o4}+#)h8sX;BQuC#cJotK5pU;)y=O_iREg zb*c;gr1lcnBvyQEyM{`aBb_n!(Q5~AMAtX=Pk6j}iFiULZX)dat1^ha+KOiKVF^mw ziM2^Ogb(mp-QZY}U(?i~EZ*P9efyZ~hq!6yep&5kcM3lMTY{uGyr=z%Xoy!73#1pG zD{n+agh!5XUX52+N$ecZMr3tsm0KOhW&1sBVfNF#8UUG>>g!bB)a#y7NdeQ!;TOkq zy9pvtLez|t9>)ZH5;b*2&W;uiLO~9|+)aSYpUYnDMP$y7lzIzsb6Bdk#V8E5Y0@jX zoNcMSZjr4Zr6VYiY8H{B>=vM>I_(rC+(J<+`BAkntHFEj9v}w_jT^tmk%kD!Q3!N} z7bn+6>nDN6VngV!^I2I$oc(#LEe94Ke7!h7!3vChRAA>{0szm?z;j4*r&XQ z+|$e{-EPkIYpd=8P6qa-8Vcq#m~hySITw)Uj#cG}YJB=fW0j#=5%cwqR9TWMx91^Yx!IZum?8PPDEdIXQ zj;hPBH5aBEv{D}B{euz>v_LbX&USNXOYs}y;!N*qJX^J|T$1N_tIZT}UnfWu35m~I zS-iGrsL+_`5qRAN@aKWYb>}KS(Ba6oP^W|cN!e7+7Uuzm->27Wv)BcwwZGlm#58pg zYUARPb9W8kP=-DvIXv0>5yX1#p)~knlH-3PKeU(f??(LXoCH}AH=BJVBdhBeXL;D3 z0Ta6 z6dP;)X3!v~!-f2?bu5N|euaG25FO)!88r?mCBlz~U!xr$<_tAek7hb0%qW}AU z`QpEM9Fml-)0Lo41P*-M{|}T)G#&;V{ov`kK(qh{eWc?2pWWmC{?q*b`knv&RlF!D zL02Wwhx1LqnnE!7I4)vp#{Bn7H^e;u`h5SJl!SkW&_mlk)LY|6QU{@Z0U6;=%K`dH ztbJGRBj&jm+ON>&6{Yht3i2EUebHlG$=4nTHx{`!mcf}w3m}{FAif6m-5bk#e#i?5 z;iaIZ+FSP1?rL=?R1(e@4DpK63~kuD(U;xq#Wfu7LlIBJ3F#36lASj>A+<55mB*3n zK)u2F^aZWZE8;AO%lYg@!xDvNbf2-elh`$i+U_8Z;1K+W2W4Sj__YaTneHXVD+V6# z152zE#?i(M*_4xQ2Hl}XR=|G3!Yl;X+w^!0jXZjA&iReu5Vf4lAH7X~jYA3+2?2R0 z>9cSvuEbRhET-~t~)mL|kOlt{kpnXl*6{FWT`b^ug zb%@XOCtz%*X`A!AHB{rTP5S%3MCodygUE3z?2j>L~upuPcOxYeFTseK|7%@@;-P&%_c zg>SZPZV#EAgllJ`AVe`#gaLo&vJyL8EM3F9LXXh!Zf-_Qi;sOK=8PRbDcZvz(qx5@ zwe>+Qq4_K)SbNp`ym&zo#JV;FW9G-DMouLRM=P- z6l|2IcY#?_LcNmcYx7}e5|6jH6ktog3L!znDG*$bSKrfKKs4{oO>;5?ZBx=Ua8$!O z(r9Xvul{6*n#t7*qoL3&U&n8A*Fm9>Xeu+(4j-I-O_H&hyTK`xD~b(cG6UkI0w$g1Hb)HsV8xW)xs{@-D1_rXx>^M;_m(pBLH4LX{Hq(uM&jU+70C{ZbhX|vW__6##rFqFrb^kFN;q5i> zsGM(*_ZuR8_4q$Sqy$5nP@QCDDLKtN=M;eMXuo!gN-J!w?+V0Ysopq)YR)R;+hvJ} zgf@D}$+5JB)BXlZ`6)A>pLO<%5PUm0+!*l??qA>WkvN$BG@cCrybN*OAZNkBRXoN( zj3+TJ`)jyV09spFMrqvK;fGYIsSA0(lsq{T$L-_TFtO0*rr6z1{h#wqRnD`VKP@9) zP+Q3m3#6}1Q+XqcH`U)*h3byUCe@tcJ!Lm&DPrvl|GBv~xd|lj$!j?rxdG_$V<}69 zfAUb@YSs`nUu;A*J7M#rf82*U4aT{i&Y!GD_qYUK55l1vp$&zi&O3X!fTJa+&sGj2 zxwVPz`>k$g_p;U3(+_C_rYCgDmID3(pqd)208yPm&)i?1m)B~(>k{a?4pCr|AjxJw zXh+?eJ8TZ;=``X`lAc2oNY|Nf&<63dWF;F>z|FlITy=(OW6=SiI1^S;WOglM)M^}B zi@y3o!AfF4;@(vBW1*hiZgXY`20dJKA95hj>a2I`vXYT9zp90*jmrXtg9AL?kb9Elnl?O9HP13nMpEiKHO{>K z|M|qN&;fm;&shvsQaoxy@UEg2DTIZ^R@$jp`s#NI`-PZA)D(ACilR=7pW51kUI0VR zL1Jh3*;>}D6A`J2&lRq*R{)+g%jRogW886`*I+3t5XmvsUy~YvpZ>8AGHkDyxwG!& zPaLS-i*Tl%PU2-Ok1;-Kf>zD`)iW^5^nKLiP$TRy zf*SBJN9$DWhW6{rCv#WHZ=SqF=vUuo2 z1T4+zUOm<`D5({|t>a{2+y>3jO}d^{o+dS=3r5UpO8e}0w>3I3nS(;?D6iSipS64r zEZN7`&e`EWYyekztStXr)Z?B&fgbK(nzi{X>;eu^qve6g87OdWFVF zyBKtq-J-_;mW`n5+J*|Ej7$}6pef4TBRw}qBH1TM9W*g9osCPM5=^Qy$h^8XFG_qH zcPUZ>9ex1#+DAUIiI3xwCS;c2@{5b{cuV9CRoIB9KOPKcP3idwcw_<&F^X~0JpBpK zu-GJrqkiRH6)GK-gTTMon56Wrs#Tpwz%=Zhz520;IcU2%z}C8Hz*l4W7=n`-@_q+p8~ZILoo~vImIGuh02wAl-{DV zI4$%sbdTH(q@-L%Ypwy$>TAIBuJgYDo>bqLuS%AKlEBr~c zUdFdT%{Q(lmzW%e;OXW?64eZjN~BUiM1%c~fO0~{;_iDFQLBH4GgaFCwqMHJ^CHoX z3!NtUJQ+8}FBsn*<$g8!*Wr+HEa2(Fa0X&w_dtS`-%bto23dtrvR*ybN>s~H zGr^{XRP6CINJT)y9-it^BiD4EyOsgfKR_%nbnl4Sb;=2-DzpEVrt2!e*qO44ifm^j z5KobWmcJKj&cuUoq6aOQPmNr@1|YGwgYtS2O5{CR?_RNW2%3fkF;`jY86JzKx6cp_dpMFedlvEBM#sAPOLz1Wb`QR0dXPwl65k0i`maRi}zvxxMIc3_COJoR2ui$hp! zX>yAp07rwsgC0|QBc%i&cGJlp|2Q4ob$)UZdDS_Iy%7k$mWAIyujy4)&;Xu2hGw+A zi#-v9-J*d$1x)nDZv7PSAAL2jWe_F>nrQn=_)RnjpP*|6EJIb9(Uzf<=Pn4MHto)I zW2<1T$@J79o)jLnxc3fUs8~Z}A2Ib+%})-Q%Zv5U3mm0~5^Bfs8?8{sU0CpehUFnw zc5D!(4G6jZ=y`7)@uK;>zs^y3L)1n^*yA+!^;={Njh&s~nqle;_=qaoB-A?CNfQ6v zKei&HE%YPi2-lim8EoB6QU!!m{@w1sd`Bxwu2_pVbLvM7n@Xw7t6|U&W5dCwJB>)o=4<_AK7U`G-uD$}AD?Z}~DnHq(FnVA81F zSVY|GDKlxcYtdv@ivJB3g5~ICeMA)xj)>T2Q~^2IfHou}5rF8VhD=a=Mj}jeU3@}j zrj4|7p!(yz9s@IwTm4(xqF+3pW>T}j`x{;+e{vhOt$X$s4Nq05>ad=sof}9!V>C0_ z%UhbN)IVx-1PGBy>CT4Qs@hd_PD?+#k#9E8JV?Q0V4Vm={FSx92V-40XeC@+%-Zs1 zQzat4F2BA+pm6#g=HOD?*)UjJHMo{tuhPzl+jNgu+Wm3qYQHhg^l`a$p>HXLQL4dZ zPs88ANISzBa0LCly^aD!AHBMO>tY?O4)%C-hYQIKiH~O+_pRQYwP(dp*r|2qRE(>S z{LgWid0%v*?+^aK=Ck0tJj$kPmH{*aolf?qRjavPr^YRr7G{8Q|D^|WoXIL3>v-WK49)-68zz1oXsh(=e-<$yu#Z8sgGW1?4w~@6rSJS3ehs!-X zXXaW)eB*f^5L!ay?$-**w#Kc!paDe6ucG`}A`F1ArPCEyskR%Ac_Jy!!)VQFRfExI zHAfdhc|dAnRx5wN9Zl9snNzpD{_!6`h4QRS>~Nd4GO33A5I_ieB|kw}-C9CLMLu0* zNz3V65`3tRLRDTB$jqrdW6ge_7`L}OQZFTjQfFz9EAvlQjSmmHhV_`?f5CcZ$Hr#$ zYdw|~_*`m(oGs8#%{oJ)+=O7AkU$AyadEIMdt!skG+p)(JOabXpWyfAUk8Y< zB<@5QSYz{T9U^XuSk%KfKQDAn^I-gAviS-|XQDhgKmnO3V^0NBv>KFtgLk%MgPgIR zYA~Z|#Z&t$KHb8*#t~p;SDl}kc~y%$EoGB`zXgLJHSwzkW+ZSOf0;q?J9ddIUN}&;Lux5<21BU(mZf@OJbp8`#=>50c zlwH~zH(Y;N03m}^7U>!rc}y?<;m6>_$wZu#6J=dUUUcr|dRKY_^avg({n1T8+v zgzl&dkiDfMWirtbT73*0&zVZBbVUDRr}qDuY6X;t{&VW+Kk+o9cREKq_ek70l2)5y zVd9IwFBiH3;$+f9SzXWxU<41a!(1)z-4gp!SVC0Ur1}e6Q;*)l`yaoI@2if=Ac`C= zzLJ=M4v*>m+@wqo;(`LoQEbQE(7wVFKRBDf23r~0+1rBkEYUw%>ziR?voJq@ z^BnyX8w&>)$3I?X=KS+zUS1|;=Z|0}bvb=Auz@|3l7qfI`gaLSJ!3GFnyI0^$#Zr# z7AA49sj-Rub2es9ruU}ycJg3bA#2Nz)>dFE`{!?&q`_9kz#CaufU7EEGl`m7*n@4E zL@o5}!NOnzYeO)TkhO)ityDy(aeS!+sfWZRQ0rh&BN3 zVVMTh*Z<}7moUSSZXWmQ+E<2J&#S#cXZKI#I;Lw=kUYsNe3lyOy5~PyE#Hgp-=rh(jbgZvrD|tdA8XaFxAnd-UvS+Yia58(;;ztgRgp)XkeW^NkMSqQkDr z)*JUDF>csp& zsgYN&qraO#wqoQ{@VH^C-d_ZIX1I?8V5P+is3CF;#6bo|lO{nu_cR7DchD+S6k`Gp)UjMayvndngq>iCvlR-x0kot3f_KVJTowQ5u=tEb+W10Z_y^& zT9BN8m}4URX}w0FO};e7p}zp=sJo$?cR20*%cZ~F_ITGN%~xinc3eSi)hO8kBq@0x zhVRTTcgQHY4o5sGE^s09ad|y$d$5NX@LO|k(c(|h4viy(a59+eK5}h&BE0T$*^*oJ zhm;f-r*TID2Hv_n3FK=!$2(BoA3~+SzJ<%xdw+usuP-{Rf?wy&+KGH#nvT!tf4Ho@ z;!O?9efIrRO7ZDoMR-bG&c(x#ha#WlI;eEyIOg#$Qq#owh!h$7SVVg9j84sW~$8(RttH z87k8jm8=!iKxXzw)p6e86tS1I>x<-FMl#8>EP8v=h(oO6RwJA@Gg4Q*EVrV@hZz}E zKHu}e?Fp(b0q?TGcL}mjEZ!b6M94kDIM`sf<^i2kbP!RW&6T|mj5%Vn-&aKDDj8o@ zGQQ*pxz8SW5+c(XVpr@@{&@vFnS`Xd1gcN$=1_; zYL$!lZZghGwfBTK=-rOh`mI@~w5N?Ohz}Z1^l=$4F1SdFGbI(HV>F33A#KfGBN2~X zH@d&1GA6*c@$Y(shEj*B5@%F)CGU6@Mn15kukx z!LpGH4)ERHE#ADe{TK`4a)vthrpLDxD2O#?8@{&PzFd9|z2&=f zk2EEKge5A2VRejYO^a=1KsB3#h4FiNIeDW=di~p>Zc!nl-m{J(j+Uwq98Vl*p24S0 zMkS!Zc2P(NEimL3RwPvN4Pk&K&FQe_umbT<7scD9xZkleqV46M0Md2d`NtsfC%yp@ zq+Lk)=g|})Zp8QZ`*K7IGbf6>UG9V*;YXLj#4kHye4X|()SMKo2X5BizKZ-+N&0X;>&L&L#-aAEk z4~%Bx;qfcVXStqW^2ceseNnj#t=eON8-Hx#IgSR+5sxauGP7Jc9QNTfOedauG&Yz! z*+=c(%KGrxaB-dmIJc?c%dJjD%2j9!hf~0Zm^}RB?K&fu2q%aL9{2$%N5O1jzJHpJ zXp+0f4~mJGo!OKsn$J}umBT^Ajw;sjFrU99b`)^M`Xvg?-tz3oA??$VD2!ZAZ~Le7jf}@LjHW*`Na*qHvSyB= z)w|M%3_1syYVD}HLA$RiU*bqB`gQ6LJB}+2((s3l=g=I(>v3>NZi5P=AN`$;99!J|*ygHl&1!v;Xfqmo{ zHe%vIAHqA8qkB;UUa*f=&Xe+t&(tB6Kh=_9G*t+Nn2ZeMrQ6_E-mK+fZ_6`^GbiL! znkDH2vaBR(?UiH(b4~V6MQ_Mgaa}y{z*T8MikzucX+AEy)7C*5Du12!Df=kH{0A)5 zWDuWyh0%Z#IQL@@%je#B?{WKWGApj7@PJ5$l!=TG+Uw@Y!F*Yt`iVIGXU3AkvfijcIQh-@B3;d z=w>2DX`IaBQ~JAh3gubzJZu$d3T))+glBO7G5r6f_mKI_7h$M#CWu!DPN;xtm_ zbP3k5ki11wRfm7;-+{(=sV(2_QV6(GD%{@-`Q)chZ2Q`Eyd8dDpZ&~)t`v8kcL(YZ z>Q@7Y`5Qa0XW#GBAN3I9b>Iy!r2Udbh7z#~z%F&+_9d{aHw-6g$Q7*j$Uy@YLW6nLJBWk||53VHe?$&uKEcf_ zn#9;s=R@|U<131=nzF9}+>(P>;z(dE)@x}?Ps`q27}s4aqghMl%2aJBRSkQt`Ygtm zj}MhEh;_LAL$we;zsP#_Gfep|u=2nIzV?8L<8KbMwVZ(wXNw1wOLkdRavzWPbRK?s z&cYobW@D{x7lLEDNMJIv5il9ka}fL1^lZMzSl2Ktny{yuy|I2XQ$42BbJ(K){h2I7 zN0ORN?Kdgin2~f4BrYQi=GxrvIrhMV;ouR^M2F=}>kcQzqxi!kOU#jay{c-|VJyv5 zSjr(Xu1CtaFScU#I8~~&nkL@;s+Zm}sq9VYnSpGm5$OVy|Lr1ji(|B7eA;zsCLf7i zqR4jqqe9GiDP@*5R>nw&=_PVc!dFYc!7D?E#5Fv)QkBK?9UMPD&-#AF-A+ZK&n+m? zRJ*a#%g9g@s1w-=BAFgxa32RNrHh+VonGa0ED+5*gfaQL!rHP!_^{uu%3jx1-e{{k@Hz86op!gx<#*DJDTxis)F+r0V~-fXS9fZ9L0IGi_dWDe=;y(ENO&RSDU z#^#^T`g@7cyvp-XTEGqqZqr*qAf^Enf)syvpuTlAcGpzi|3O6TsrTi{2FQE97 z#4259bL+I$3_%^9IM^E9ObAJzYAVQ#fy-LOvzIuF=<1=p5dJ!Ho+|qx(A2SVDV0f7 zCp6C-u$Y_G%*?a&SW+CR074^o7!^k<8*OvfCjdq0330C3q;9pc!xnIkTYz%KRGI)9GQEa*gl*YLQE*=49JgE(05OK6=B>hcsyC`(xG-lv0br-N7(SyV5%2M z4wbucGtn$z(%__Wr!stY ze~-RWD#Le9eBhOo{<2>#p6+xw0uzm8O}o;kD-0|lL-Nt#nUm+2yzc9xofA!wV8#3* znaP<(7wftm?iBr7vW^z%Tuib>_UEM;GL}lwx!w*5{0q@!mz-EoY4791!=MZghTW%! z%}$J@qq(N~7Fx~eU$&fXX%SoCc|dn?qwVZpp)d?pkv)AWWCzbasEu_G*X%|U!KP>UnKREEPcE$ zX1IkBNzMRDJ36f+uPSS6X##z6*SlHryJT9-El>cL>zdtc>= z8CE)umRd@x5Pq<$K%Jo5l4zl za}R?MH}24wKaTYNylwS}iSy7P-1o$8C|+fglqw>RyHjz;P$q@jYh2Wf%^|T)|9nnK z&sc7Aa&=*Nyz>sZaQB%2R%48FkfBAq`xv~ItI2G5$a0+ghtIvM>W;BoB{C}1eSHf! zjbyL;of*sRmWNsT)6O}QQ&Aol&WnrVc6!;tn|BXvY)XtC$c>=%%q`*^2$=$w_}da}k6kd8W+0AltihyxLaQ?=wG4{2bUn zPR-CGp`f5>3f{ug+GNhGCz5g<722BUPhBoeB(<9iYth$musOAKZO>(;_8jYb@+%$F zb2tZ)%Aq4Sp+fw#;N2}8swT53r_Oc0w!TFEO7kc&Idg-T_X<>pD9Q{OIfEty16W=e zyjr_l>j>I?|Hx^t9`!=vTgaL>%eevDhI|a<*7H>3(!<+)D#WJB``pnIDh^=Uy4n&( z{*MnbvND_+Ba?pG5y(|n{ItATwq4xTAbu&q%kj8sWSi~SV@;6)KD+B*CrMzS%z*5inLL zJ6?xb-?)9iP??;HwaY-1^hz}ymMT$;HTp`_C7~KlgUJ{TvHHWR{lSp?Bta*p%=j-h zSdv}7{B~S{K}OH+55E9YjIUbU^mixE=8%RQ$&`1u9?;{I4HS@Sb@ZJ*B#^}!+iyuv zA@bs$8x0#V-{<)vxXKf0kNZ-9dHTXjO$}>j8=B-veioc2d&lG#jS;cCS-*|pyOUsW z)}^;A>j(7DEf0?uuf?`Y6;7z<+O5Q9W(mL5{kxbf(zaWi^k zvDvGT$PZ)UC&iN-V`jF_3eYZ3G;NRgubyhC5*sy}s!0)|0>LTvuBR zc(kiD0WS4w9%rqb*AvDngCb1t>M^~l;@)|DS#cLBZd5jdx8CbT8f$(&URv+)OnSS? z`+iR9DCs@Aj$dq-rysJK#Kn}3LeGC0E%egJN|kyZk9n#|KOToG;cQH>2gdncIOq5+ z1Pg~cJDQ8pXR=f@M z2XO)d=xf2-U}HK(oi?!4J=v3=8dWfR4O%Y7rOW#M(K{r_xW(khTefqAyx6PSV)H)V z9*tNGr}Z&e*{NCy*wDXLJM7^jl81Bn8V?scznf}(CTtn|)+(E=tB%JmLAB|wdy+&< zj%tDW=$vkQSy_=el>M`;r8tSFC~rV~y&BNDzo$JbO=Wm{R>+X<-6(nZ3Q`6-Ej8+F zr9vK7qADb=UIiRckXZ4#FQLj}IgvjB10*iC-iKHD!!{CeFblsJMPfVQ(dGz}B_X=5 zzzwaSPRjI?>6XK1mm0(Ro$*{=ARwK*zOM_%OX1d``B$SJ9P%;>5 zmJ*`tgIfw;$m!)M;pq$8tM6(Ja;*Wq@w3TIiOZvkWs7yd^~1`My?5^1&j?$!*!`Cr`z`B6r0Xq3mV5kPy1#M9N}V zF9?;X@iHo@40oCd|3fCwHdfU^nXK7c4L5z$(EW2gmw~Bcz;d|r_?>g*AD1PCOmjji z2K~u$X3~|bfj!}Gj9-3iGMs&Os_r}=m5b$GBoZv!6Xk7H-RXVoCPK|}`{NW4PNFNC z&EYEmv{2MO5t%rmAh+%dp_e}+ilF{JSFA9DwlzbmY60mx>(-(_A?2DM)edF!xeX%hT88|0 z#x0H~m0A=50n-e~-X$LcoTgc1`=D;TKk1`b;nKq_+gIOMR)Il)F~7Z<6<$5~DY_}4 z%#xlq8Jc$PZ2{e7z{}PO`}G01lcY@?+f)hH4EnT(ks|qjy9votLv`+3x%)~V6|0r1 zJSX>kPmF%%4D^3Lf9&751a8rqVzCQsEXN{BD)n=p;PIV`EVa3N`6>c`MQGKKr(;V7 z*pA09(Gk5$1Z{b+tt*v!KGKW3+P4zBeV9N~VPz(m&C$MMaw=Q5gM8`#gB-O&O6x(x zw$a+uJMUUjPX4vejFs}DOgUzW(p%O%WS>^CO|B-VYBm(*>frpyUSx0kIl&a36fwi0KDUdOcO<1)ic#;p_KJ6{%z zo0z_(+#N5~w?$B8IvY$#<4TP+z4R5e>@RX2cWq|i3DK-M?C7pI!2TlW#4yFP*hROkf9H#8HOLO!J zeOIm`d)%}>XQMpqQ6j*~@cuh=b8^XHXfbXbk*D179a$7#Dr0p#2!4UL=tl7vH-g-e zigrdUd7sV1jmHj}cKgoIlsmM1Ak7@nFasKgC%;ej3X;#RMP7wdWDhq71w==B%U16! zEERQLMm-o>rl{l_i8jui0J@t8wa+zH4VLWdyu{kzd*ms?Hen?aWdp9d zw9s=vbFdt*STJUN>sEU-r-5*S;N(8t~-w`LXIXBBKkGSOm=T;8mINZbTX$h zx3tuBt99!z!g?EKM+e#Q^=VaG^5~raKzi{ur zjYtZ!!O*CDYBquyENXmP{l|vgM)u_eB;ahBs+GM!<87eE&dS$=&I|s4=ldN$L}d9i zM_5@oa#f1sE}w^}Q0vlMp7>2vqzMkxb|ut{9a>hLKQU zKlX?X-A-=+wIPk$KzWDw|Ma&TsXpj&@(;z@?6JJhpFgXxo{ePS=H~yo*96A5|EZ## z8vf=6(nPg!%kN}l?n2GHkyG`EA|mCU5#5w*Z^+~?p*4cf4gXTK%UP9mL?z%&r``SH zf2zvx`KG#sr(|!o4cwuW&Mg|_@*(d};c=e4G}s$UAEv!F$e{5d95coKkIWxCvu}f& zIQa!ZbP?;r_wc&@=*Nom7Buc`dSm`!vL?v)XyGVAZq>X|AMclp+jipdypt`F5^R8q$UrEb0FDi*Bj3ivMn>x8o-PvPep)@21k%wp7;+xSn6X1A5Lq<)>a}} z%gC%=3zl}*xRewG%v2!fZ7Iuk^(mQd%DGC#lYxovISZX0yGX9|IO;?*H3y>xvOG(H zVb{Mdv;#o)10aG8NMl|lMf__jp(E&==Hoh#ivyP`W!AsFRi0QfZ_76;V9l3e{NynX za`z#?q86M~o^;PSCjQKy%5a-4s^z4Xof*50bt$E+omVzPH*Oq1zIylM(1U;l`z^1P zg5!E^8_CzpR>$GN*8+-T8%(k-Sh7%PVnW#y1xizvS0^|cMz>=fYHN!5Y|d3At?q{O z(YA|!ve{qE%H_*M<`|4@ydAb%i_VC-3YL}bqhH=T-Sq6vT&>l67tr=glbLq#z7uA_ z>Vdiv=1^Y#`B}efvC=*luO9YpNU!zLrs!#6jxX_+*eRy>bbv%B!-sv0x^T~e#j%hg zuiL$3L$%)37k2aIbb@Pl`IC+m8}UcPrX2h-gp9PY`g&HLwHOocR(XRunBl=iHs>>n z8(hK+6G3~^4lmXnBxUc)eK%f#__?~#{_3kPgT6O6ow_$7E|q5X#NG~6L%(TduP@4< z(6>VDE)!hsWHrVz_6!dcd9Pni3WAfWgDiY62)cv&9&|rnC!k3nlIDbRjw3q3wgp~G zJS>vmsXyTCD9obvq7hwQZV`$cw?$0@%;&I{`Rr+Jo?jYqfR}i0mE%XA(|12qaOhFi zZTBU+%#8##++J#eJTHDZOb6x;<=vnIr%mgajlN*)j9i)}Jf=Vr<=tLz!%Z0}{T7~W zy4YX0QTK5@zU|L?VlHmaS(=Nfgi?OQSXxXqjRV$?J*ys5M#ST_>=yaSKXRsB^X~)A zv8Gm!0VpC@zMObVex_V%9V?x;en20fg9_QZ<0KN8^w5Ffjmnby~zg;A}GG| zkj6XoOv)}Kw-kUGX~PPqy$rl=&b3*c=T;QrGCqk{s{HzMxo!&f0m<`>icKM|6yE#v z&IHVPV>@&Q>#p-3rU?c>Rf8b8MEEf?=lkOVUGB*)NL^W%aB(%gqZeP_>|9IJ-j&Xj z#Hg=iq&LCk4(LUzld)5nYR1^p(#VPdR+V*g1k2o^5n~>_^&h$nX z;kAY6brKYI9Ptl6Py@zgv-pl6mK>ZjD(w=jOFo-(ITcb1i2u5d0h8|QLUbj#3G zt6buI+1zlM^vhhugM2M;KhkGCn=(t(I3)p;DfXrnMd+{>0xqMH`xy7eISYCARn4Fb z;}H_-VN9`=N%{XU_SSJx#cj7Y1_mkJAl)e;4bt5)q{PtD-AZ>3-ICJXAV^4ecXxNc z8}zQ{JokH!fBBIa*)@B9>ssHnwh6Qy4OH^Hx}9g)JEN5(A(mpjctxcHmGu|)%P(qB zQ8G0WE*f|BCo0-oDedELb{E^oU=OR}sLZ3hbI8uRyA(p% zYi|d$Vl&x{%h*>^#vJtue@AFXY47Hs-0>%^4E;G->f*~1-JK|O@DtE)(jT!149IST zM+jT;1m~Ih>)GTahYH&H$VC#Z*-#aE42N`RoKncHhS_w8NK+*f045&4m*u)`BjWC?KPc~4%sl+ z&oYLcv#j0sR_ro4T`WN-XO2u%XqZq2tv9OV0LLH~dEnFjHgyg%#K)NPK$?+pc;x~v z`_Nu!nkhT|RQJWR*mnVLOge(#ZX(fX&Pk1P z!p!?s37HW)$CsrUcP6jqdl`QqWs)fv zIA&Fz!zCI|iSWsc$dZ+BvtErDc&!(Bbyz#GRtk8J-+zM{67nFJsIy%c0Zo4hJ2R2*XQ? z;F0g*Y-}rTX<`MGy@~vGO)Xf2ZFlYw(3$jkN<{c~1%@um6%!-nTBrGD5%Xf@EnHqE zO+r1ou72~Be7#TTjHPUC zXY!)kA#WaWE8BoHACeJHzSEhJzy_w=NK07Uk$CKU{{ck!m`1 z>+T~9haRtb>6svHPKa7EN8TVM_G{V_e~+rFw!-tFRHB40586W$On-DAV(N97=2 z&J$2(StO-`TLu`YT?%oLCq-o=Ux+yuUT55eUP_p9y{gF1-CP~A8Ojr|i=cqr zh+!KGO^Udq`jmRaq1@}m!OpyWdIO6uL@oaF3)#}fd(qh?(J3OT3xR24F&IV5ex>$z zswvjF2&N%z=VT4Ht643CGbzERAmGBc@OY%8{dY!>dtUw?rN>Tuen|~6q+Ey zaxAm)=z8le7FV8e5vf1piMK??dsDGler=VqI!-1jn{>WDG&b0{gCT`I+b{2f{3DYF zyE?YcPV_bKuK9o=MQW?e`_X(s+GDK(c{3L~Ya=F0dMnJYXnyR}bfK9GzG%t#0=3j> z*1VaC=<*gYTY()O`NzGIuxs)oY?34M`3k_7!>Kw*aE6l#^yAo^RRIS+TBs$&m*Z<_ z)5VF{M8db~2u=)_;LU|b8^5Y$QwWD7r%atLH)uRY97J(J-lKp{$TD+ZcYNs;CS;wG zg_-bhJ&NlGgIlenfG#y7(a4eM*S7QV?x##NUdJr$H>qHMwyy}{DoQ_A2lXcjTbE#Z z*jXc|o62yzA{4q2QblV~vg*nPC4;8)`@iU-_1-vu$(3B{*4N~DQ-r?%b9>utKG&}J zc8j2Z<<=seyw`oYC+`&(H4*S$P1QkdR|SR>E|;0mruSSA40(K9(nGf5)rm}_>g9u9 z=qtCw$$k`ra@z!wak1MHgm8I&dE{FUmhDf_$XjHOx!A!_z<$-DhW+L0s!E6@#9zuN z7Y~g8OWbE6!OdFXfDLOhFZrroF|v6S7#L^#Y9oAX1V2n!R ztqR}dyMkME*k5);e)ZbWG^Koq4{Xu_Hb)u)-S-Bos78b41YRPeEYM`FWIRrGIF)T9 z*ak1KIT2wxk?1@@q=m^kv&ai$nVu@vNdPXI4AEZ0D)!88ouC`AeTuYlDJ0 zXgq{#s4#qLWzBjZYpRuw=zY@?Io3vjr z+DuO6h@QV&;W|`8zDRfG%}hqu<)%y;4OkX&Kc~V|GSQ+NqvgBGoqRfF{9_cbziK)= zs#gsz>?~%igTRbNY)E0DZ->nbHZ2M-)s^r1o9U(qnuLQ=bS^g!YXos^54E8=qA_|D zd^uSCp4{E~_y6JUB1&=sq(e8$=a3w|@&uS{d}9WhkD+hkH@dS)!nzqRu`6TE0ad%w z?iXxKGzJD$ndd}xVct5Z-^kD5WoscsaC{HVj4a*GLmHV8YYrcqUE6%kq|7aH1&wTS zDsXKKY5(h5r$)a=-_xw#O(b_~Dz>T}Ern9sY~+9j#{HpX?^$pv!kbzi_4sVj(r_$J zrIB*#wP)B@8P*tXIzmJ7qgb{+JAw^Crs-11?CguYIfuR|S0)ara14h%*~LguiaE+` zgTd9SU6{rzDwNdu@7e;srY!z}Q~K*?M8keOgw}VXNTCRtyJ8&EY7mbNh2luba&EjP1 z)Q*K&GPP7F{(pPhSNY5yeSXUD)kZ59!1dI4~*`{uZ+^iXbUOR zha55b-sUb_z{H9Eb&hjVS`A&o&DJok3s`~Z%*J2!7D(_yE#{*1JsB8{_ zNw_lY4JF}__yI?MGq=ipk)BjfRvGl*->+?@9GXui6}VNWi)Rn=))JS?n>ONLLWat% z4_gsvwq>Yk)2uq&7_?-mD8bW=&n~*8YXn=k^EmMVMC2i z_)osI5;RKmY#d%C-O^hSXic(vhz4P|#==izmoZ?{*a`DMICS`YU5Bbu>5~lQ>h+sKLdoz|t~&rLu|~T-_v8okz9Q8ho&xIgJI^vGNZ=Ft zLJo!b60lXXbe|Znw@|O10k&-3|N1t-mgjx0|&K5F~D7wC^MvH$ib zmkO?(Q%z*>(mm@(+^s8v!V)LuZA}PwMG^p-k6{2TB}Z3|RU@5V%**83Ga^FT9RHpT z)b-3J5BH7MukbwPFJ|OCK9vSSf%BfnRsF)aTEV|AzgF-t9^%U@T6_KjSr#3MWw+zN zndrKWV(p?n(A<$NKN`_=C>>aJ>Wu%avco~z>)azBc?L#OzV@7J+sLIp@zPM@x1+_7 zg?N^QTR3ngesaC3M_n;&uC;RQ#OBo|(B^#zagmvGj8_Zxkch@v84X@j{zn!Q<|sZq*E7M=1(K6KIFJ$sdZL2v-wCe{tw zNT`_qY`|#*q=zORq<&K@9@Yp=pw|#)};9VCe`9no?^@my~~17mRx+60}gsFxus{zg!3Dw?rw$ASkx>gO;pkCz3$^q+tx_%`1M6N zN&>kPi20JBQFHK5*=JxK24IcRrmY!hAmqp_w?omM5&Q6+t5pa?FGmm$R)g6tqvukr z{MKHuZS|eGfzddC*osHdlv>bN(@frk`n~m2G1x8q@cLVo*?b)*$u0k<6h37T=D$>X z<~NHtxf!sGV`~GrZT8Jvx%-wG{l!r~9ZKVR(InD2mzSU6yPgLZEAp6Oj7{*w8TkMtY%VNMG|I$e;5|? z4d8*J5(}Fx3>Iq-*BbSIFO>eG4?Gtq=6nT1szOD#U+I*?;GZ&hHFC;mG~JQN3q+o5 zLhbUkDB34Zt(o^@U8&+snOaTqz4wez@PoYqJr<|3q2O=B)^Hde?KoZXJMxumJ%Q!7 zeS(i#Hj_!I!c^<^22!@bH-&%(aFRn#+-h7U=H{vq@xuf5nSig_+Awgg&A>mypMhKQ zrrewqi%7WMp`f~jHsMv#Tb6EE`ej!}7wE=So$RBc5EHo%e1;hb9<}2M@x#?kdL5)j z*(6}LaJV&HKj$?zYcwv*1zQd|ctKYxQYy1`VPcmE3=eg#jH-533vD|l8IOWEKK z$#mfNCwVT40#aS})xi=1Cfgr0CKXJdCxJWI zd-QYs`UmMX3bSY5eZ(#hXtBn-C3ysBF@%<8&@nHLQRf*kUnYA_HRQ)PIweSW2-%FlrMSh1sukjq>GJt^*7}~qsHK$CC|VS*}hUT zhN*p>MfXv0JyAoL1@8@-g9>en*&N;yiwGRIFjh%Xmg1F?r!YKNu-d9H^yuFBmKIB? z@J`C%f%$26-Omx=0$ed~7>QH+L>QgUXvkkF0yEp%HK|G!J^kiw(y&Vx5G|J7^&NC^ zgX_w9{Nx-e$-bpxh2rDct=AE@Z$f-y+%kC-JMIW)q*6^Jk^grCjle$vUQ8}ht4}!j zRZZ`V<8~KD#LheA;{%h|T}DhM<*SUviY$*-7?mVn`+3OpwUYOb?tduI4RS0;al`sL z&XxgA#srfvygc4BDxG{sdgXw^l&+tRZG^DOxa$QUpOLu}j)wvaFzSMM{kk3Uh0c)S z*$P))$kcKLTUe3rzGk!0@S=T8V4evuo1~8QCBJ+;t&adCl6^bW(GE8V@y zd=&UgzA9+&^aZcn{(W4%P{|R;YV%v$ci^A;lj$^{*sMcCGI@@`?2(m^BGRbnP-U8> zIN!fD;fsf+(``#9k)r)4&-ANenLevvgq3~A~Y0E-?3gLyHDDYB0eTe}+< zhDdxHwMn-K=%Y5Iv~S*cp^6`bm?njIqyI`s&OuK`o6s(fu+@7>ZIIxcCx#~42h$jV z&oo%(j`NkuQy!+%h*;Z@{LoHP-G#v8;b*WLAH2)ctrr+r)UX)L_(0wV=CehbPHa+R zyVVelvO@s*jh?hJ$cMg=@c;O&ChghU+&f_@U@N!$zkAyhNfwdDolUAyc-&6DfZWLmu+Q-1utYbVOq^ z(O@-U=luoaQM6vX8qEE5Y{->C*{YFQSnhilo~~8f2CKuocSvuI{Z+L-`9b^|pCZgq zt`YL=*Q;nDqi-Uqzq_1~whzX0@>*dC@=oS@M+km1V7Sk&YYoqcqkGw-$nD0x-|Gmx z9}k?;9Xq()iM(4f&E>MD(gwx#0o%;xBmZkQp(|5odU|itMQm4^z5AQR%O=w5-^DI7 zCe2==B8Df+0v*f|RB%1xd$vqi$#>?a+FPbb;ZJIk@$yMcJ_P(xldpJ1#0J^-5=08P z=#XA3+^T#-h7v#DtA#1dlH=9SRiS$%oQEk%o(N}N!2JXW=gVJC zYi*19^WC2OFSis;<3W_a)o3%S$Pc&=#y%iVh=oqarizi=y zkU)N=KbriWet$asCuup?99fN1-!c3on)8VgSrY|cvoG9)DkwYwUQKjigQS*?#(ctZ zD?dezIbWMBRP>IKT=YfokvswJ@r6Ck&g$-dqxHd<1GFk-!p-9J_XZg0!=t?8vd*?_ zY-L;zrxA?{D`}GNcXNe*?f*igd+Mm2rn z7NgbhX?x;8(>pixC#IVF>}66@_J_n?;CbP~i6nwWsT{3C=|S9LBI<>%y$PqMtuLVi z5c^-laz^>>#A$cdNFTlBIzRltj>M-RQ%f-m`Yy(+SgqkdR@^E0HT$-}W57&{!=5YRH#GyaK9QfG7Q3P2|kCHEfV$Ae2Y2x1BI32#^6t70lPl4_4K%;7w z!K8JqY(n%2P#9<$0|cvb3UA)3KDSlG6Ym^IwT{r|QuRgkB!aMQU#Pab_4DXu|As+! zD`$-d{b;M-V5WIX^0w8o*D~6hS((`NNd+fQLUaV4SY9eFKCU*I`n`ozrdeE(C;%9* zUPJ88km?>B*6b8M&)1^3Anf?qrQ+%$Z{aw!@3$QrG-Z3+CFryCZT+s?SagFOZO*R1 z0N4ds3fKVS6?5X8;#s?G4@AAlVVj_u=ZZgRyQQ6OPN%yHd89SBA&J>}QmJCiuSEpg z$vn__C>PN-vd9}6Jhl#nQ-O{YknD_hG6ifz?Yh@Gv=6UyY|OyY3Hz1yJWoT3&3!mJ zi#G_fD6;HL-jMa=u-C+c1dw?PBEGCFq-hb53J&A+#ZdWahkm=n#?h4CC?cw!T#R9q%5WW%9+>Of6FJBfU z49OV3!3F*?4bijxZw&f>m99Tv1dc+-->m>SLnMOGkcEs}J#4<(%`yZfDG7*$=WyHV zhF3g{w(?Tvm)&$N4oIB9qI#PwjXih`<#8z>!iDcNpklA+S{pGp+^KQ&n!3hegC)Ps zLd>(w2%w7roxKLgK}reAgEcCjFn+Aci<_KXSm!hv=K;2C8o2UTRfRMDM!e>{@xZHP zD?Q8nqoMU;OG@SMJ)SLeg;IZ)Zf;%-xQFT1eY5$!j3E*3SZjS_quOj55prGXVC6ol zg08vt?ot>Ej6?~`M#aU1*PdghndO&h73=wMnYB6b`_Khf7Tt@F03xI^sDchPNR>uI z1YXk6UbJFRqM$9FaG=JCdJJsA_>it#uChm%0j~xkq0!K})_kD0ZtE{VA^$gpmsz*f zI4=Gn-d15D7Cx9ZVc0k z&_CcM$EB$BuANLl$BPX){Q8C-R$84QE-+j0Bsk%+l~gXy(l4|CZp$(0TkxgG2Ahlh zch^uFqB)Mtuh+%_#i6m>pyESRfjf?9F-1IZdW1m8bdb)xdvBoELM{zvcT9g|UMOwUz%6|N~zmMa=+aMmQ>{*=p&e$1by z*HJ?Z@P@xBtJy~TDC2dL{P+Ntt8NTd59Yni7G2tCSS?o|GkXEfbAP-*VRf%pib%ee z1X=6_d8GZ$T&P0)CeM8KbASa&9LSj2!AhVleuoyY(W5g1arJ$>7MMbUe6 z=M4DC=1D}#0vByoU4GX0urn1#-GUQh^VAn}SHC+L?3E38#JRg^oUeGhiAkRSFS^-@ zuRIe4fTa%~J{(x2uI;YwJFtd^^T7eBoz3q-b4f{t2Tn;|%XO!N)s@-9kFh$G*)c-m zb>YpFGYLbN+As(E_)Qjv_Rx|IEN>gUn1_pH>9VXyRVwMzUxq%I^n1pe>sj*(IsNxv z)CJA(#ktx&n&(P=?YF}bDn@ic(-kFXLyv)0G_GQ!v2^C`J>R@kfrPzw28Y>G0?Izs zrTXS??ukqL+pH_qX%FofdPYkd1GQ>q^nAQf;0R@O-!4Q>Wbfg~lDQ#oooQZCiVvF` zZUTLna8%&D4@9dUbhe>W=_N})K%DcfMoI~fyh)#o*65VhQrz+OaF4DUruxRwH-g*n z)Ay;4x&;i~y{~s&{dj%f%G34TXxZ=dJbB3)-GjS87&PdfL=FgVXW8qA#E0<+3-cT< zm~T_6L6BzLvQ+se9bw^30qy*|7sNX?mMu$R@LkStIRMTe+4cwR35HxbvNP6G!nLY$ z6Yug{_@~pJ79E3OnIXV3HX^4*b8|KZ4#DXFNU?{o@tkRU^CJ3IqQ7wgx3}lsQ}w>& z$SFd326hmI52PRMqce=5odcMm?gav7A#Zv1@VpaIguwg-+{CbAM-=57;DbtBr`2-L zxH%zO6D0#m6S(^iK9>iPH#{&s-fCXw@4l<+L^FQbm}_wmV{pGsX+brB&f9Ut#()n# z;Y*4G6itPjfRMI7xa!zVRPrNie{epf^KdKe^XkwB@}6mBgA>>&_n)M}{XFppV=*8q z{^9wS^)f`lGjeSrlQ@FLx*)~<%`rmmis%^D454UX$LbW&S*Cm1tX!V6quzt&HOy{Zk_zUpmFqC8rGQxoYpIDm^W*xbl}zMN+uq&kQ7OGFOiShc-f1Fi zIW`fF(>t~G&2qK!el9DX9T#FTZU0!_S(c)zZl1T=ympJmqq*Gm%ar=&w|^Na;iFGj zH9Rbin-R&8*=>Jr|kZauqM(#UZ?Tcrl#=OvZ4w6Gbe{%KA|@m?vOtn?X3u4NCkq36f%Nafx=|)>U#&N$Gm0X*Js9=JZ zrCvdz*CY<#v4cUw!r~y9w_uP;Hccp}D46{)%AmV-d((wC^)!vj5vSIswA257j?=-2 zx@qvouZok}OYJoTTm2Q{)$}UGitTWGH3tsLTil;CUqAj}y2*q*uS zVga{)CZ6EK+NDO>hCq;U3oz1p3hRy&>i7|lx%}pXFQkA4SRUZ=mTxy7DHJe1l?7!E zfN+Cw{4Sag-#@>&dbTrWZJ1D6t<-*1W0O- zA2V!ra)n~)jO~srwm}qob=P&UWwm0uJFL{ zJ;y=GoKqcIP%DK|J>z_+)AzVc_)7G3un<^M_SH(6<7D~PvP5+y8=F?^9gto~7z=0ASSStG3~y#TC(g<#N^@{B;ixXzsMOU%q{c1^c%Y#{dUQ z8C@qk!9_!q*uq8dL`!?N$t=6GO>6|ig6D=vf^Qxt#>Uj$rFMwO4N=Lw_lg%?#>U|! zX~*O6o*cm!qOVU;>j(44oIRdr;Mbb16!0{}dmZeLaD{X1wuI+lwPpg^9zMkOfE7d^NHb zLTx^AI4=LNkO8`5x<}sjAE%(#fx2fTNHjI;X>dhwTH}JfX*LetN&tnVuRS)8Fdt^`TQ% zuRHGQdc=taY{T@7##>GPnSq`BhCN`Q=*jn)@RW@W@S5B$fC7Q=dkIr8c@hkqo*H zHl!Vj91I_`yYi4f^vw8S*!L3*XZQ|&M4TuqV_?n|z|M_FmjbuQ)gw^m{-;{aR|6gL zt}Ga`+j4WT=ll0iUnN{J>+X#1pT#ZL&}&tA7`n0Yd#bta0Q@o^MBZjMkE``a&UFn> z7Vl46#!DzZJjt5_l31FDqTQFo_1AyeE8aqR67>q>HJcVVj$nQl&Jn6UJaE_9^$Vgt z<3#Wb{VP79_>e{-I<0H87iKx`JBN)|+^u(~8buab^bCvO-6BF<izrAW5Mo=3BVIs(kA{NRO%}@R6W{-MvJFv zpk?8!p#5t{i-5;S?$NCdK%h~~`)O+q*;Bs|2X?eD$`yNJhsi)}FkYP=dDuFz##LHJ zdi!R>fev?aafP)c8FFk<^V}DaqNf^)BB&qGk8;1vZ;Qw?!r&C<%@u8bsoy7R^PN45 zUQ>sP7Bc+npth1LLjM;7^#%eMsL0V-)6ct)X`#9^KJbAs;WGDY25qBdA*=pZ2+GIT zI{H)hu|78kzI~O@;Jhl&GFMp7vQ0Qy^z;(RI)4xRCdF`TBgbTGcfX%!Y-1R*F&58c z(UYG6Mf&!1_Zu9<$BL z(ar;zKB}eTY{u@WLm2(5n~*)#dW|WC4N5B|Jz#Z_!1V7mMsH8h9yV_c2Fzi4IHW%R z|3c9U*_m<(NGAw-D!8``K_m@S;$=}O+6W0NlfUD#1i*|Y*E{zUq?Z`Qmy{TWc1#Mc zYHR0AIJbsO^G-v>IUOLXo#$kCRc`Oyqfyq?R8EPp!2H{`R_Y!cRCJBuJ+%GOPHqRI z9eIt|(I5KX1pzA7LDSzkIZ~k&<#5VLdl_FF=GbLHHL}`AQJA%}-BtnQvE^PYO zu(-Wa0k&@4S=ZU6YBLRGM}h&VFFA)_kXdGe#`J#Sa4o3bgJn#&S@YO!wP6Tpv=I>5 zVpnA{XgUppc@JZNys$aVo(}(+@JZ20E6P+f)~Z|6`ox6z5}{fljqqJWM!oW@=;y$- zQg!a;-&}{<7kFrtv2WJ!MDIt3 zq;lxe%Gs96Z89F#u6qq#C>q@BuW+4CeR8klnfF>Vv#pEupOk($B<}yPj-PwEEA9GL zr~xT%VxgQuI0|4wbZ{YoANc{dfMWk!vuRid6^_)%zNt2HIa@HEL+|&-TLbKovYypB zKMY$c5zxPxz9!u~CcN%Lf-XnzSO`i`2o$s8-meWe9Ds8Q$!N)a$(Da%_ceX2Ej>*& z;wCLJ$x!^mKQ}(|&w@@v^soKoc9(PE%ZI|_%iYWJrF4+vLxk}H$(iEphV!a=wT;%o z*GlMoOLUDoAX9r;37C0oMmHYIl;)&VL1LyCgD*e5oID5(uFewm(Q;uqYm$@nABzG9 z>b=NgTf#j`{`@$56T@;XEqh0mH`7NJC-gc(jQy#F#P3*PtAwl9Xecv($hN^#^L(`q(?hjVP z94o;AoE}l^Afz>y6fgQ*v6~y_$g!pR-TWSYfo)ilCxB8T=x|*gxx7+<I59=?iA7wC0COamYB$EfC1UyO1?hc$rRJJeFmsAMS~2|6 zho&!?5}MgGM#^!fFKYMwMhQH~qAX*3>lc+(jz!w0Ka_=|BG$6Q9jWw0i145&^#(+C zeZHbF1@3AgsCd;+_Zj52)_J{)g}gw{b0eMMMga-m%8a-)Vt6j%Ab+bEd;QGX<%J$0 zCascN(PH5>0yPG8x4C2Q7H26dH&whh?Rl*qD~Z<%TLFamSA z68=|*zqAE$wC?n`y^J{@@U5~HE}OSlnUW zLZ7wKk3Y_QwtjM_iq^Z^{b*376cM8ik~7TQtb;tu0%m6lzp``62iEme9>jXrx{TnI z-<2;2xj%fGT`T=&Qxv^(c^uBw+r+Bb)s_F!Cbs0ct_9K6BIZnX^knEHN>~`yW6mjr z#Yw!|+y;QKnGqi$><^&;gk8bCwaWJ|Zyf2OK!DN7EjCC#D?%U>2yp90Nxo}_3}=tp z2T^oT34lJbvC`F_#&dZsc7E9xVxc8Zo6-81eOHC#0jS^y&<~~H=?Fsxqw}dF>y2$> zFw!`!Qc{fUhCf7*@}R4%Dg()Ibn60xEATwrQ&p--((L0~WQUL46B%{D?KLDK007NX z)i&NGz}7b+@rp6Aw^piu`(9JbPFR}tvJ(eJf`+P2vau6xb(6nn{x&j!9vn}IKDOcfR zDVM1jXqwJNO~@4ee&e^(!k8|Dx}zouOpuk_G$wZm7E0l z`>2nnY3G%>j(y8iYULzmJNZ)yJ_gi1%?gl+jGaH%%<~Rz){dh9eu6E^N}~w4??Ato zQEGWEgBIrc%C9$Jxbs0uX!pt^IktH;%a}_1tq3ANXo;BMK2dkKmYmjT>?61)i*p** zE|Xdp=}ypEGueORf7sDb~KKuwIV5;DMJ?2}6$@vms zn0IFswFJmQIgzRR*d&M9!e4z4b43mRN<`k-b;UmPrI@Mr)gGzYM_z-zi}50z8geG( z%Lzs3i_b(J$O|RAgN&%jD$6)ARz`8FH2IGVdJoS=@P{#Ymu#=|Y=5_3Bz}AUxz(5Z z9edN1jR&HleeUXAq_Di^3Nl+?=z$`^kL<&N1XokkcGu~G$wx#SKnA2`? zTAAI&{knBImMO5>$W@9-o*49g*UB`S8WFRyVbRwogdSu{=3GG^ZIpTU+~@;W>o=!9 zWv>}m#iADMe=QE^k>E+grTmdl%(?jAJJ$J$V6Y%e%cP>mFOs6^$np9de2|b zD0oD}9@}WPN{v*C?Zyn5J#bl6uaeG~0f2FAN{&At!8Q zgWwM393^b|RMO1qx{yhn`iJ=0_$qtiV*a5704>yZDG&2@buoRIo^Lyt zBT~F$F-KT3w)Qj_7{X9oy-OfQ5f-b4wCA$@m-_Ij7%S(me9%Z`wB zo|6@)j4>?SP$}* zF6n$o)@RmayYHfAKcKr@UQyQP=I+jy^akSsAT19p{Av95{yK}tUTLSXU{0sEJcFFO zOu*Fa$|vlph5wT)2uFMBYLkQ?HUm})p{U7!?pCvCjQ?r;g9$e(cXPZ2sT+4bKAg`6 z?sF)Y^7$(bKpU>WKnzd?V6_WXFd0mEvm}c3UddZ5Ui)cNZvTq_Fle@q7V-~B-k@xE z@n+OIzQWp{vAc9bA30FrB1?Fw*E~BYLN@NLMIFmc*R(BE)8T$0Vv(g@0d~M6NMxnE ztZbEP!#wDzY)4R}4gQ0tTdG4Jy?f--J=!I*jVsGA&qMzQPqDb)f6v_Oq7X>cB=Ke(Z>mXH&y=1sD|M+W$ zJ#|nzu+ANQTIWKgVSlyoLz+-4`;IPG2zkaw{@0l2Q_{ViGg*$oKr^>^=_w9)=Rlz? z3e*n-gQzYfZ_c;ZYrjP+y&RtLx%`7i59Qys$2~kL(IHMUEMUJ7UPV8=y`ZxUhEgQ` z%eJTKwN*Qb-4-^@YfdYv6MTe%a{lL=0UO-+D5!j%_hY5Aq&x=8Y=L_f*~Y=#PYe$p6di#nZ&Ibi29_XY639^60d265yemE@5eI*>LJ&-Qp%6 zDS_eGm*KntK$`t%rk$^{1=vyPV`Gito;Xr|L-R&a(H_d>V|E|*yo1z*TFcK~VKYDN zl^GDI(4P9GYaVV2?vJ&>uWdtq{HdSLxkO@+MF(atg7Ec6^(p>5HR909w!iAJTn{pi zKf_PniSex{81a#&Wt5fFSvdY8=b4DJHr*f!D<$^85duK6Wz>MQ8Q%=j0<3W920 zIjC;=J0N$ruy4=mbGyjhG2m{qav93v-o(@7evfmJQg_5uiK)G2^W9bLTbUw0fGBvI zbQ9g1lO;H{ij8sJv|9kf#dXiJ#fk7RSSgXWN@AgL2cJoc3I2t@tINg!<$FS5vQi*P z-(3mfCgR($)NU{2=rtU`cc7q&qC-xte3yxft(B9sKv;689RQ4fkbY49iMIb-;?^2| z6%8E@4Eb$cSw&ipgXV5JL1!EYXBu^Dn`_PAQASPzYh8Kj-+!RIHdh^7W;}-p zA`nit$|*k*!+#i?F6#D0D~HISx|0Q>X(#G@&jlM)c^Q~k#T`_zS@7HjCi&;>we)e zfnOsf(EJjSQD@xlaMpES&eZ@ZOg#>QYqPV7U41}Xspe;L4!?ywSm1>HejTr)=;LKG zhM1$?zmX9V0cHNCP0#gZ4#801D*)@zd5qLaQb-*6yhS%z%X@5#?hd=XGIp3isEVn4 zQJF0L&YbCXVy9j%jM~6-;kAZ_DonAYF@@>Y-#oi)mjBb(23W_(O$~6Q{#I80=)TL* zy_+BVi%KEJOJO#wL4^Xh;|h}}Uk`q7lpv&u@S9fONNZ-_>Y$^~ci#x!?AK<*Urxl8kjqHSY*N4bwis2<@PFslMO;}~9}e1+_3cr5MeqqjZ7(gJ-&`*0WdI0;QX zY{510*Y_$5lZ|jtPn}O8X8qgFrgtnT^?NzvRZJB|Msy?V36!wPk?|l;-3EF@f#>Va zHPUfh9(zYQSl$n>IvzvfO{}N!(hEP+RZeXAo`x<_pKShjiXoi_jyOmdEH!T5U8|wX zw%hLetWY1jw_{jPtSpUY;SI2YLQ_2sPpZ`svckC4bYWKhvfORPtiN86x@)4~k5oRC zD{xd(`l(#HyRL5(*FKy%%_2`YMy`G#1-UiSK_{bE1^&tU$03mnw>F-?C<{V~ia`-T z31};$mo_het~cT!`G__^oM1Jd{K=$G4bIlOBI3bA$|kpiJ;lKYkIPz54PX(-8jE2HlekXoF&@ zrw{9fytL8z&tV06S!Si)40EF;Lm3+fKfrih&{-{yLNQ@O7HH7P#&d|I#~d*b z*T>f}ZpOt`?gDxxME zCjAuIULv~GQD1;DXC6WYyLk!sjR4I5qxX+$N(}UxynQZ<&i8^3l$ob9GBRa&Qkwrj zvVN@3{EFIt>Ofb5rQ;oJeQM(i0V0A9_uk)zCvuWniKxUhQtp%d!Rq|C%2+4{kB~bd z4WK%DYLMgVy(3uZ|1~6#`3*TPR~Ta~J8|Q~{1}YqVI0!wX>UheR-yJgeLvdArYF%v zL|Wr6E6H@E(xy51+D+gtAt$!<(cRbg)(n?tH>npw)dLD&-S|M!nJVRSInU@$SW}#j zeI%w|JPG(R`(R^k%d@@#jmKg#u67Vt{s4OG0O%v&GdiZ z@1olbdt6%|PxL|RSGYJAlb11;+me$@6jfy%3qeV`3KtI~^(uN#M7=!@;`pF=i)q!J z-P+M>f*@JYivPcOcVPrOVAys2HI*X&HxR-O;mzr_kb!63#MvI>;`ZJ{lcF0icT#AR zT(U_mJOWPkW9tf4=A7+0Z7b-N)B>-fZj?zFPYQp{k^X|Jk&M-<={mATA zsKjzV!EZKf2X&eIft*IKRgDo6>gPVhIC!7s2Z}BZ#bC#8o$htyzfO*)Zv2;7UxUk>JAtH&{1S?0kk$uSIsk8vys8hKWID=`7vnd6T+A* zdYb`jDOHPjs|IS=a{C2Ij7>jNqDh99eZRGy0ddGnjbBatN1n$CIeuB4Yt{f||C1dy z4GTC1Keq`^BW#D@QYm=U*Z{Y^K(FR0aIIGI7`UeHboSp%eeX2z6B|x>K+4;`E2TkH z%eT{d85kzd*yLZ5dHjQfSK4L}g=I%oVWO{FMiamblW1##xLWdj^*O<6Jrb|AP<;gK zeFWnzREH5n`uh7=_Hd#p@|>Lg$(dTuGmhauSj|SLf|_(Pq_iKi;gH?0uN6ttXj&cE z%qRNGaBWn}7nH5LTEk{W6}SeN@T{0$N8L0t^*Vp?M@pWjD#v$}CE54%weT3*zkAId z;Zj|TF=nY(rDoae?T;P+i=B3d(>ltBYvqOJQ!A=&*k?mA^KQ`V?pvT7trIBO>1s%57Fp&4zKI7EL}dNV(_p1&Cak|JJ+2Yl{rQ;pR(uB?HfmSThabK%2O8zy?j$QDOBO@- zXevy?bk%bG9Y-dw)K_N5nJn3{*gP|>GE)D`=mOrEMFv)Rg5@DV_wXTMj{iqn@3nwK zhyMZXNK=_;gG$LGKX7ek4HW_fCX6Q4J{>D=Xv^`yTc~9Gd^OxIq4H{2m z?k*V)Q)J}jXkd4%^GezLHe)(*M#AcecvtJb{YJ!(?wkbg%Nj3Qi0YmAJQJB&`F{i3 zzoDUA_#Ta<;Hp>u?CJZ`-TE_XfT_#n3BMovL<2k5#1GsA*W|Y6OJ?IvJZMtZ_t)7c z9v1IpaN(%Cey26DNxo9+Cem=Fb&)hf*KPl|2)h#Lf*aH(&;T^s&h($s`6__3h1@%0y!2&iYLr` zG#nhoT()~_oduuhQj<@PuGZ3~?y#wV@^y`8##BM!*tCAM+>Uq6(X+^6AH2#GA1kaa zUSfgswtJ!Y&N}{x=0SC!$ehpcuhex0;Bu%eD{_W$7CM zrw+>2_iqv$c(fM5rrHU=Z z+H0>`dyP5g7~@BTDw4ymx$uCx3__Z0`IPv_*N05#k1Y31uok3ms{CJD{?KN7SvS6! z?^4DE1}YKzswyz^9lPU5H0kTZ9zr;P!|e}`toW${xP=Gu9L?*({ULh}P}_0#zrxhF z8VXi`69}33E-;`*sN~iuHU>m>}{Qm{$R3bVE{#($g{R_?W zKWLodw#p2-RK4h*RZ0?zldjItD0wdT{?IU+gPU>Uh!qtX zKDt>gDGXd(x&uZ>PwJwS#~M=O_@gqNM1fpyC4sViwZ4SL=(cu@v?dWX3a=%K;puSq z`#&|!pn`3=gT@b4_&INc^Q}X2l&^qtv;iT5hG&A;LpdhOuKZ9eM!w&kKVtMwLL-qA zUyhQ;Ztd{Sju|G+Ps4C^#~EFkEIZ#7#6n44A|3{adSc<;By&I#1LnjhFGyJ<4=7_?R(PKJ+~L7- zM}#za&|b;ni`SJUT=Y_VX(qoB^$}Ww-tlLgC%zep-EC=v!B2H)Bh(BgC0AQ10@=plIf^G-twU1PwdBfE5n2+bmHYM1|hx{7|Ni{Oo#XV z3fC%zj(4cgb$ysdNpi@$d;P~bt1u;B7Q9UJP_AcEOk_hvg`#h!oPww+J zZ4<$}LlE}M^8)Ou;*(x0nq3L!Zw;=zg$xnRyO0lEg6G{0?NBWWOMu=Wv*WDsn@JH9PuhbGw)Q=Tj8Km`JRQ_E&tNOJ*mOqmmI>}j& zX;u_U&ihbtiye@eOB0@%IKeiX;{w_z{YS!-Jkh~&D2e?=$ML!?TY7|c^50ajECn1= zoVd~7DBsh{m+UO3)fd!OJD`x9IK4`9_wKRs7Kg9d26tu=98Vnzi&on|vDC<2MjJZ5 zalLNnBT|^-&@;W=l(NIskX{3@&~LW-IkF*Y>N~A@FX7>&)EC^7zYQ>eUO*EB1MAYq z+6C{Uau1$@#Vq9B3tk{tvyQQ$PspP@Mm4&^64l_hza8m8nu@MGfIJ9oTOAF)J=8hJ zWSFNJ2_=~yZjqPuEwv5Kd2=_tv z&TCdWgzSRazo36^G-T2fyG8%)e`(es3jsSw} zlhWnS2T-&zV~BprT|g$3pc@q(36K&M<-}p;WSy_GmdPssbO0?tYNfr!w#6xFH>Er6 zr6Eon&1lc( zzFK*vQ5;v|JGQ60K7wHW0^q5{X@L(9CNJhSmT!KMJR=8sPdMdLJ>*q+?UHc69NmA5 z1RhSN(fYw)Gd~D0o_ZiG*4NtFl$~OACAjI&5FxQ1-1;xBMNFaX3_y9+*(R zm74S%Dqkki>!usNxEozfEixKW-+$Scv!DqpTJN|jYqdwKNNHk?$iCfK_yMM6WhIXW zp5>7wx&~0k; zO9n_W?SlbigNhO zt>ZOjPx(iFjz4u--(1tD#TE&%^@87<1fShjt0k}UWyN?7T%kgCO8CFs9u zY~NhnU)?U~TT=Rs_q@W|z0MnBEk_idxWi@rwWb?|xg_t^y7tgKU#<^tFX~S z9w!d4v1Ym6y>!q4S%P&4h9SAxRA8UO$Un)wjexB_V}Dj|U!wt%S`(OmWb%C0J^+^Q z9Nqsbz5(D4fE6aoU*xAvpP9AZvv&-@;jn=B|MXHo4cfx3WT^mncZ8mawyTvt*J=Zf z4GPFrITjlw)%)^-C4BHPd1#~UzU|rCe)6lOq3#l#_D=Lu==dT0`Xs;#9x%`8Vx-i( zySEaT6pR4QHUW`A3reWbA)(h*XCWuCdCjrw;FbDl6wkXh{QUf!B>BW!PXh5S$NdQC z6@D>5?IS_=%}Wg*;L?GvaRFfEeV>mK;EN~Z(0a@UPT6Rb)WUY(+Ujb_dudfp&{xI; z19=cUpd7765+1|vIh-+v*o^_inwP>MdKvP)Ull?&CGddSc#xs4oED?fS@YG7-lm3x z=avRz$!4Cp{U4XM1h2wYD_OZpHNQRqu#e9nAb9ToYLy~Ny6*0JUlZ_T)bGO~$Fkab z)@Q;(&T-^6E9VkrXgb}cB!IogpG|QIt3Owh^t?7_)m2SP_WJc-D`W0P0wADus2nO7 z$uZRki(-wT&icS?7ZU?dIdz0#f|hL;K26@MQ|eQN$)nCA3?LsffD07=t_#{bzYUco zJtjy$iWEA4gHYrP=g%N=kNGNLo~<__MjB~LRa+&1_ZCnIAlpO-kQnlaWFXsz^-760 zdSN~i9>3BK(SHIkP8B(>05)GhIZJ@T@R-nq2<|r9Hii$Mo#S~*0Q5%TPR1>|?D0M1 z{#$Ej*an3YD%|($|J?}63#!k!9;X}JeN9}bJlgpiltqAoXds|>A_okBg(PRJBZJef zMNW-ckbzPDNJ0m|(Lf5EfJ$~X8MK1j=}BTa<&gOT?duvv`s9D^!=eoDxlxJnuyWsb zukNn?qG-_m;a@u`!b@ND7&PM08{I=lYNId zY|W{n5^2-@+4Bos>E6X~9xLw6xIW!G+y({NgPSuKvNnTt0ubOG+D1Cvr1Bt~;4Oq@ zeLoXWDlNmFW%%;QJpGgqSW1^J!S;lS4#sph)&*BH{4pO*t7lT2Jk8TnO8uY%K%W8V zD;|mesjoQi1JGAomk?ECN_B06NJfju{A+NmQUQtd-Qf%%&6xW*A12=HO6?tCyN)L})CRyvYD!p0UH35;-*O+umXsao{cvcBzG+-kjxwKbOJ=*=&;Vc$ zc%A%1_YMf?&)5lI_8GV|rVWZ=j$=mu7^p@#RGEa!(l8Jaq6 z`*@f8MN3-)vhp(ApK+5OfTsOiXg1rFj*AV>$M~vY{ z9`gG%OJ!*r@!O4>4MDk`GHT}LQ9MyUM{aCXHIixl4MEuvjEwy!D<;x27&S7t(dxHT zbLkbY#5nb?ZF?vNB&`*$W>Yix2hPL)OvE6!E<>ao7lF%l7{>V_4d4F6-4Y;wzqfzBfU)?Sg)Gnd=ZPesK-X<(3;mt`OK54%SP)FGgxHh+e zfueX?d9v^yl_O;3u79JuKibQ~(Xm*Yj%pZcQb6+L;crDF?i{!pDfOOyd|2tK8l=A) zJ5l?!lur6bZ z3q2Pms*>B%%yh~N5)6OTFXprj@|n8c3DYthRRAynGSqM~f5%MCOnXg+?a7AIrN1Bl zC#C20C;}ALezQEPdJb1yx72Vs#SXfkt?Kq_!^*ks4d^-2fCt6?Sx~COWm|GEt$35Q z6HEyabJoa{RfJJ|UhOw!>cBmfBo=B5!8%*+>rz7LPe#<{gJ-{$?<83N;v|jjsBbV? zLe<*e(_x{;(r=g1C$5l8^0?6XMG6z)u*vg zwzJT~^zk zE!-pxyeH~$-r)cM3BJoP@Rs6xnQON$ywiUW67t@?fI?*e%6pYmg;W{)!Q)W$T1(Rt zqvCDFQkgHy4Iv9$UHAIWcgwiuWL%|QYQ)SOPb(;k?h*gRDcn;m8bIPF1w7f(GHNjv zrJ56bqanSva$|2qEqSSekE6OhWhYzR!#M$(e4ck4N_QE8760aPeZ>9`>3Ttcr8Yp~ zU=j3P;vjxak;#gKg*eORKoFq6C+cxYoD_EFQi_{Oa5dS_5bFGgR)H*ny5b*N1xtd- zivL+Zfn%E#cD9j1XQL2+e_^3|dWxfW@@~GJ571i}enYALL&cz5nA(h_W)W~di%zg9X2I~2+YwJG06F0i-M5u$&zenLX^9GLli9hBztKh{Ad z4MTnajXy;NkopWhdl7y|GaSY55dgA+fNFKzyGDUh0HJvAyYj#XDuxrk9ZjAv*aCn_ z^gT^9V2I%rveXjpBnmn-5Q=cOZkE^pG#s1UeM%KB)fCWj-ENdsj(;oM3!}aB3uT%k zN|Mn)OgAtA&RJedv9Z5~yh$Uy8vpne8W57?OIvGHMfeP^?y$lL%p4=0N3f0TT|M+v zzbtE_j?9rL0Qz@<&|U-1pn$+C9#Cc`w`lM#N8mxBP63dMA3%CZ9+=<9>$u%|p0R=K z_U;8FYxy+-D}deQ0_urH78zyS-(&PEDE;X53|23qAXT1*h@Tg}=ANcV?!^_;k?d(E zUh^|gQJ9wih!+$=orkXOz>lDS#pj>vzMU{9->~c|*>hBRF-OHDhGn@i>yM`-EGO0P z9D#h0&<8+SR}j;-p;pC~rMvE@{){f;_2-2e8{|27&iH`(fTA-zG0v}|00MmiQ)~zt!Yz1^{aEFV=2re~iS5uo`?vaPZ#P zF?zoQz(TeIwCD##xSu@Yto0yujNI?4{ukUNB2~`9_v+yR>&(ZpE$N74MN1hMtjtnw8uJYn8t0Neb}Tedj;#DUl)l8S?#y zJNuu%m&)6kcGb{lp67I7Z$|b2!@_4l(AxekoWOo-^u$IL#30#@}Z{8d%jg3 z9-w653^O4BS8m6=``GL@vHF5_fbImqfEMNv;3SQWCSl>F8yKzZM1A#3_b&@-(T91( zl1i$O#Qs7(LcLSP9DgxvD=gVkKu`Wr7w!P43%4dcLFhF*wYvtvoX#XdP5L;LM{O7z z^>eQ$Sn7oMO|B=e?I_9fs$l%?=EtA6$&PFI@y5L9jvQJZVCrs@1i>z3e@2xMuFGP! zDTvdSkheI$SC{yTEmzA6eQ?xB+{o2?f<@yAs}gQ>len_^^LLusl~kB-=dqLs2lvN9 zyhC06)T1ycrLt;3q3NkDL8QaH(BDw<`4a(@{HGc$CK$uq`Jw9s!T3*#`QnRhx*0R1 z#f{Y2jJ=+IEy;IroglH3sa#?1-PetOHu;~6`$agVW%l`6$diGH3?bWa=-OC&vgSRF z`};d9L;fG{M0N^M^1EXLx{)8$-Z8-x-1(U;QHG@!hChq@eygyp9EmG@_+4L}iYwSH zgXUH#A+5@EEc=%-aE%8}!kdOa{`3EY10j@;bpHtsd~DXGfQI|4_V&LUS;u>SBnwYU z1nXZ|(tWmW8D9;5NKqU>g>dOz%+|~Adeh*pHYOrjH=gVVsKh|N14f{)E&qlQ01oDW zjqlRg{}oF7>#)BlY?q%?&;U-(q4@8SjQ;>O&Z+%pFn>I*^oFC4TR$ouWxKt*M%RS` zn$qL;$Sh@QN`5!FH8)Z=1_RhG1NVQAd;V;!mYRiqBZO1wq0QNtc@e8C;Op-j0KuF} zS8i3O4wrFxgWHs`U%Lg+(m&;Q$-+g^8+~rtYptg z9BB&Epb3kLQj#G8j{JQ>;i-I@`Y{Fns3zx2g|`b-mS6Ek>ETNPL>rfJZs*_Nv43^q z|Jm37J%jxpI`F@3_MzB&^M@66gfg@;uy?RC)U|y7WUXfg1;xOCPlx~hiIJI(neJbk z8UNhO#YL;&YGX*NBCTg;sP8~4@2KbS{^S2+sWJL>KoDu7&@8i8w%U$x4Mhx^nKM zPmY06{@eBc|9f92tUWXk@Za6L_wIbZcMMGQ|GIN5|GIPk=yulkZvUHJ|7&-SVh@%P zH($KA=Z%3VDv{L{Y{<%pC;e=!#`eJQsQCiEP2WU&^%OOMB}Y?L)?#cDmz-ESgY@+I zi=$t6mGv8Ei9ZMV7hIf9au>Gy7%!f;tCK1ooY!=>iJLv1_QK%tH@6lqx9MQ%Y}0~V z_6knPk5!|gORu)~-5_vZrFq`2t!6OSHu+dj?wtzL?QV+3A2nAWOt-2!rC&W9&L}cQ zIY*vf+3*g$zTnZrPEoMjGf;5<^ndJ6?d-W&L5|^BPcE0m%e1ad3F<3!HPXV_=2G@@ zzKG{sZp9dfc3iu3yRPSK-S*&~GV45RyvImqHMalX+K^Ewf7{y;k+V|##BVcH|a=QZIB-J z6ziuDs_uWxiOaG9-yIGX>FeW`QR(0slZtDviOot0^L1OCQq?AWpjbyh;*HJmL1;?H z=O@j<3WfRrOJ!n$z2~8Dk&2|jq8os@^lU~1l}w0fi($KAas`uGsux6dYzwME1m7&4 z8Qj^hV*k-X1&nj_)D}ZSh4$m=`KP)3Zy!~^YX+_90^(cJ+xrCQzps{lK+mvi%Z9pW9{adD~Kt0xl86r5~cThvW&ow z4!=D4@`l(G)bE!(1^g(9z3(wT zVObIjaKz)RP7^l{T@!2TC}xz_Jx8eAjwIXLPECf&o`n^0fU&YmQo7;7*bMmiWGPE^ zZM_U4uc0^~Z0$5<339oXLJHyaUbEtunmEzZgNjZDALT@Yo6*>U1H3y;^+DX!G_#8P zbA&qTc#>r;yoWSK+ZoV~`2y_2Ze`Q4M0QLFc@V+-cQo_x#Bx9Cm!0i!-bi%0?r1;4 zjHep*IQoXI|1@-wY<9laUi4i24vvSTQ7mylJoE9UiT%i!W2F zsRhzCi_^PbB126gQaV&mA<_SFnj_R;H^eWzV#)OsN3vhZf?Tr4{ve+$L-J0s`E%oN z&4B~cY?T;G^jsW@V8iHDO(p5dXJheOil;Pt3RR_CBT>j~ME)L=&v7_iOl^nxE*>g@ zOB&b;hcKFR?2Q#yO7yLy09U7IKg*4!b~+UwOCWf^efQHzHvzo^MY(gk(>;nSmj{~U(FgT zBwx9jNQ$}w)>E(B6iF1#*F;|V%n{OR9*zpi**xjAqp4i{W74@t3A2ntxmE#XLemOu z0`cIbaJgur2Vu%8{#+-pKGuBi0AIf%Bsz4%?+)U}rBdbS07JCA8!DOwXgu?hOMu!@ zaF|c8805jSrm7iSVdyFAuA)!4TP{-$X}uU>5~T9P5YJBhD4B;0>}42_lK)YpJ^c$| zrWn2fXmv?8++u@c14pFKP_ZemJMh;F3`_^oRHxWc!SBG(Xqlo|Ij3$=7rgR;E9i6O zYB3(ND$E~+{hMy(5;G%bGGE2RRC9_JM!AI3HCJ{pP9TuOk8V-P&`F-45;iqm2xsP^n#bUnUPfrSst$ zCMZI%7T$oOV_nMlRsh$x$za=m*$u{+WcsKDeMlQfOZ9_ggYJcMEgO8Yx=KUpLOym} z&*{TcR{klWz~qk&E2uFo5visk$_4qKuWfKgzns?P3)SM5eB?zzgqNB_Ch_9 zhMjcN2YhaX!Ey=zD2H|Y7(uPycTeYf)YUkc&id5>u_ZR9@}#X$vvKCjZA33aiy6FX z`w(C2oP8B=VlD3_GA$7EIRcWEgiGx2x6}p^$G5Jkv8V z#=2I^NlY**BS`FH)+YZI5pHV-mn(&CYZfY`*v}#cp_^<6ky21-Kq!IQD(4)G6&q?x zaw$!pr(s9At|Ed2Mi9Qb;T4aq0BK1{)XU-=UgsD}J?a3bb&Q+rQg5PeYav=oGv(4h z7N39)#LiKBO!2|kx9N!Zm{0?uDycGaA7|4QX48v4gm8=|!ZgK!L4kAyke?Luy+P>q z+bjI;IG(rZhNFD-OVW4DVNoVC34vNZN>fzUOLf&W)rIQwY8tOIt`wmFaybiMAQltT z_DGp>S@xagL_|p?rIR3vqt+0ZNc)^0NEHnmHvicihJYvOyvO8<|5`nNBsh*#pV=WK zBR4`!-shZl%LZ%vK^Yz2i0uOwuuE1N7G23RB1w8(w6UU{NVo4-z|t4*+!lHXd?Z^KiJ*{I zkZ(3GSPpb9vN2kDjJe?+1ojdd_&X4&$`QZ>oXF5cT^~)6<~m;He)z{1J~cF^60y4R z*2-EpX(A2?=?h$z2kximY*!l~aqbHQ)ajlfdBV$n>OKQ|72j{d)#g`l&L8_8G?7jc zi^RdtwN_>`5Uqe8Z2f1?f^(t~H725IT!!MllahhdqG1k{XbYR^4 z#)n*R(vMTKlW3xG$Lwqef7EHE^%LGPaH;>&)fw!-TH3Ylh&5b6wo_XJk!tHteO}Sq zArK$P0hFFbTlKFs=%gEdpW$nvbL`!{ny8s%Y$=57fj73XK}<%oj8TD{EaE>YYxN1` zHl6wonAJkZEz)cH6&8U&%#-(>46>1YpZm6!$R${>WOz@OO1f@vK&TGw>xE~5sJoPo z^Ld34o_%KrVpFVxbuB-vZ$&8HwvcTjh$T(?lzuz%8g9^My(C&0;Yq_4$J!zuZJKk_ zJv@!GUu0X1o+DC^BB8-Eye~bfW$>$>8aS3|b%`$`O8T1Kxhn~XEoBYr6B0vcJsyzG zb5<7QXZ%T>A|CnMJD6iB7+qOutT%YD1neUKRZe~JwwZRT9!i&HE7V(K5oax0l+^WJ z|A6VZV~;jn9*%jyC0>5cJCD5g;DZ59+oLxt?6i|feR-A>?iHr8YMS}S{2iX-nZx{N zgrBX(LJ%pzdBw+HEJ{Lf-Dj(TtiH&wO|WN+_$O8-qH^p}hqMjh-{46HQN3b{qY+-s z=`C|1-`CmebmPmmMM#J`UXEH$Ms^+R4ZHR9w)A@G%qDBh^ls`1mJXWZ4DYGUrg?Je z#>BJ?VmUN!=g1DtZ3(REZ_{aVEs^~y*+cHBv!s;E(6&fd-cAbg@pj$NrkS;*MIUgp zQHnC9DbmiELD>$z3M>z11QRe{mV5au%buLdvvp}=B%LDC0>R@DVfjS%rP3PD8k*e` z3qJi0+ke+Ybo#UF*d|9vcOer0(0z398wk8c^zq+en|I9e8<*0vv;7O)u>TKm!$|jk z0d72%hRb$@U{>#xU2wk>m42e(*FP@@S(KcL5gecx1m*i2(~`O#EmoGiYJaBDr`aG@ zl~1Jj(`R*l*&Ek^4k&Pp2yQxLmF?hcIlEE2{pfWT_xWxbo>jB;#Zf(*^)So2!gMj{ zihp0I2E_X*|LN5i_ww+n%DIMd&35zS!@bG_FgK4$s{4;_j%CiNm6kdtRT|2bJuih& zGd+z1r$tOnAI^i$Z&hs_`ZZQ@J1Op3R<@Yke)NYSDlZ|>X`+@nyNTRUWDsRYC)|1% z!lBMoR{V8DpL1U(svgQ2g)(DNtk3Zyxd=1II|k1Beenlld^itZYvwA#HkMAtu}*qvi3n1B8egF24XPA|vVO z#8#?yi&vYE<%CF5Any0Nmx)NLD1eRJuSWRg&!DIs;keZ}MNNMjYGbJq9uvpFA2hvh zwp(OAf{@1u&B8x|-b`6obg!erAXADf5|HR`v1w=`zSIrB$pg}CB;Pn9Ps{h@MEoMl z_@kvrvAJsZM;glPocp1`;*!i&qB?=x*$DMXLmQLBfsEkG(m}r|II&3~s{&}VzUdnq z${rKKAp*FTw^8uM;HE%Jst)}}swUs=&JIu_obTOw%1J8bu$Zs?XGv5XFH&<{WR;RY zAG+VD*}gVx3@(!l0&#KZPZZyMv^qXOh?MR48Q{Z-#SxL3?cI?L{_s;1G1EvHVOJMr z6Vo4sa-&(r6Jz*}@0n|E3rAlIluVsQ|DK^(Cl1k3Y4MU+CQ^isN}_&B5!r*Y0ju`* zOa&?{bfx4_LNq_0S(RhkaOkrAt84b^eg7^i=J54^mZM{kIN#Snm2(QFxmy&dZ*J|o zHWSJpUGu=7oi6K(v5V6THa&Ph#vrM|kcr&j3;7u%;Cg&=g37^e;GMB0xQ zZzp0BWK88VUYeE{TkK$4<`vh>JUH6pD(l_H3LdZXHFH$#GL7qVPlDEDa!hq=3?^(- z?#)vs$E!9C^ffn#<771q-V1bBN9Ht_k)dkGS%@5p5Y082;uKMuFA-bx3PS8)iPA{7H3X(T0Q|n$2l`bGl6BTPYzPsw zwQ!?_$`R9$2#PKU9z?5dyXYN>g|la$2!lt;mu6ib?|WR-XKvh7oqyDLa<=I;l^iqs z$${Tk%9Ez2G+QRxj0R1LqOLQ0i+mpKej6Vc%9zpNK%?h26~z5@{oj z+(V3~A4EHd-c~cLS)lMBf5-Fuq3ZQ-W|QBO#QSVQPe;f4&)J0WAF(e$kn7J-3FCX* z>wgQC)T@h^Q#K>6WovKVblP4kLBoObEcqUPW{>HOQDi`dNd0NsGuk(Zuzt_ z(l*h5Y9(6e=5Z6(EBndI{ppMsr$@GAccXv{oEDzDbKRP!9OtTWoTsfa+nT5E#!yS?(*lS0+l^!oZHMjB+O8~~*B3U&>+^^8 z;EtV(=>22{oK+W)KoudFY<>##;0W-vI_lU4lG9>m@}VflA3H4vgtMaFA;Sln$^A5E zxY>K@hgzhfRcY`f(!27_slsbl#I6$`*0=4w-JH_}w^kqJ+~P$2Qg_sZyCkC>1O{DP zG%Ly4B&ZO!ruZIaC00`emN*eXtbe5&x2~8t6(|PO-7G61z}HQIVGAxpD&{LSK$TjP zDyo!@mePTm;J+r1eml_rmDkD6lF^Gk{A=oN1lrz=Wlz?C)kRI)0BJT-smC-n7|K9X zTOP}88- zfN9ty)d;z1X^rO18M3F}Y(@?A?NvCe9>$PGko(+2C`r-AHZzh$W@iMSwY47(@O1`5 zTQHp>eloTd|B+fp*P$xOX?d*W7*I;cI?HtK=T?`eSH(s`)<9G!SnC6=^7yjDZf7Gf z%m=UN`!k7)PpaXOU37%P_%^LhqYm15*f(+q8XuOA*RV#HlUHVTM+LSA5i6mN`*Zs4$mxXuHifXwP5;)i);^lzJ( zj5U6Zj3uB6#zC>R{)cL)Kz?941F5%(28nlr4pIh_u_)WbiOQI_sc(ZV6Gww+ULTQO z#Go8YeX!7Z)8?g^*gUf!i^R~LTW7wL7*weIk!3sq0q!IJd!s>JI})GNxUK6%h1Y8Hmu1JFX@6%+|={3|bfdW(L{^ zX8BU8qqhbeb6mUq{2`c)wo^Tsw+LvvGSWy@CD!^w?WK}CuB+N`(3DWLO4lt6mNUcC zbzCfI;{}!9Q}L(C?C#4)&-9>OW@pE)GRyWWZ@UR6gQF)nHwb6-;FJPV+mR@CiLVdj zcWg>f5&qUU7v_+%V+@r`0cS;*-@+Gjhky@f^7O@V{891fqh0(eWKPt(D zgPk`qQsGNwn4PjY_)~td@}zU$lL}QfvS_a$`sMtJ5+o1lQ#uJknl_8rJ*ejG#{83+ zzJgve4Ejh?ekEf}ZcW)7>kR8soR{5PR5|{5jJXB%n*dOQiYC@KMMm(?V7Tw5nCv1Tkn7;8+&F;QZW(l1!Y%^j#$G7r6<75y6+U0tp*oi_485JWPNU^{4QndIOH&D z2i1;c5o$u3t}xd>;eQf0(qouOJDbLfm<+#Kx-~??jiF#W{J7Tp>^5Ymlf|RR!z0x? zAZ731LQ*HlBDsa8q-0tCff5XctS*h7xZlN^Ib2b=D)nd|6!VxqX7p7+>0;6_p`ORD z34?5byys^z+*V!bF0&6v;?*y?3~`P6oXj+S`2l-SPg0qEqJowPaxS)!KYR8%e&H9qIPZL% zE@=vYS2(~vr2N1wXqWSHpNJ3&Y=wxN)GmZSTGQA7#1jSmV@X6A7YG^5GR+yghkpN_ z7AuBT?(u#es)Z_anT04eMA`jZxS4buhZ2iC&jQPK2s+Hxn4lQhs*8_&POZ5t>uY)Omj>0o; zKzW{U~8(Vt&DULlQ5*`+{$U|Of6j?;yILyi zN4(j#sfv5rly4?g`$_!8*il%3Y`w9)fe#0(<_8e}f#naIqKO5?W6MwRH3+)Mlys^v z?u-IV&h3`dHri;Oq;&FPynu2r1Q&$^fAn=Bm7#(;^{zaV;z|DfFRZCrTKB&uu?P1* zI^G7dq;)OCmwp!j`&9j{>J=8AHGx4~eJ%M3%y8i@r$H;JRSsA<>$&OvXU{i19D3HD zw$MVGb6OO1KVxnT1{y`zoF?~)Q-7J@@Sjhc36?|?OD9hE`zSgaMHDjVEdP*;Uvj4M zz6=qYt~BcP+VAxRHr6`-C6d3od@F=q>9nwPvz)u$teq$mes9M2y`B-1(ZN|}jTHLI zjt57Q*1i38VXQ}WRZrl1{508~*#?`;f-Ywn%6|4fs6yRVDs)LH{wviv8x!}&(x6#h zt4bkKNJZj770S6^l+Z96FM*J9z|LebPH{th85yf>aSv3PlPC9+Ko6=MC=+o_q(?BM zQ#~t4urHLN!q5c~Dq$N>uh7hZQ193xc zm2dUX@1$Fz%tZSwg;8pMAh@}9=5mGxMHO3sa{xjf6Ph-aZ$>7)>R(=AkWIB^qiTYaFNQ z7*=Mc?l~tySPXdZ5<>=^jG>WtADIVg>vTZr3K;byf4O}+X=V??%)f?`ig9k9#941B z;^r#Mu(GnybSygED@9kgUjlXTXc@rc+>A~lPs5})$wEKI8%aU@C5P+zRc)s;fC-(j z0aj>7g;}V4Da?Il#Qj?zf20GeTjJPhQefyi{ZknUJKi$2Xv=6H*2G6pw zZ0}NE2u^%qFmK+1T04m<6AW7W#OE3$3=+ac5G51VZuec%IP4%z6kAJiB1?l{+lQjM zIjPjyE)5EFf___@#c=roRBfJgNX*eNfTr`DM7Km)z;{&orQrArSH?{R{YQ<73b4DS z)?w{4lM@9B<5j_uz}i}f3Q}e3l&LIE`IoG)GK5FjJ*z-}xY$~MCFb>6t#S@x|CHOZ zdU|@O4*D20U@_{1wjbMLSU2WMnHoqnTfC=z37qFTdhI z@mj^?b>QGdD~YsegWc$s6lqJnzz4}xSj6F07oiPkluZ>O=mQHvfYqj`*wz3iOJ>QvFem)&eGsUsGQHRQY!DjYP3u%Cn)Z86L!m~GGh1PX~ww* zNzTdZ#=z*8tytho@pd-C7A}W?e-w&eo0TT%$fxGk9S*v>Ip4|3LYKTG+ys#oTyO;z zOxhNM#Q)6ybuOcTa2&QINfNOz!h(WQlikGQ+?OL0UBJla-bX&ciu@A@6sl3oajYx@ z%`rwHQfUBNzZ$K&7Tos+9+_!A14?p^MgnBP=3l1p1n8W_)ScH>7zh`-r_&hvTw9!a z5f=~D-%uMG?3p_7dbw_am!Lb?ZAQd&@<+hKXex#jyu!f@^LY!|e{9|hrp%mp&rFhY zrBgI=5a&iV#iS!I5O<#L8y38HBz-xNj!3}^o7NK< zK*+*)Vs^`PXJ44mr3VLzj+!agpl}KatCbijS~~wK)V1F-aY>P&w!^+h#9QJ3XK2KB z5Yy!_49^hD?X8xgnbLrv_V~p;2!U4nmLk3HQV6sKt|zsLsWKX?N|0lju^f6ZN8gE) zq{TYzi@Lfz1=F;bYJ=JVZUbB(XH~;ZM;@(ki2D~qmuv+G$Z@9F=@zG+H)Di;wnYeQ z`5%YssVWxh%EBEMj|Nq+kmxAZaMTXV>6*6e9*`npX)-JmOhWlFn4S34 zS2$j&rw?f9U`{j-FC>EEdB-*7?#7=nFm`K5#J18=4DEfV@o3+^q{cU697_RjObN5~ zYQ6HjyzC~QNxdOL{P21l4(IZC+#9~X^($_aW}2GB;nw&eFW{Wp(2?1my$O1K9j&cB z340Eu{9{vu75Q>>?fzh_O_y!E9P{Iy*{{tE-zI2YtG(|`QZO?Y`0=EE=?)nulp`~d ztX>uN#5Srmw3d#z8AqJ?Kx`Rb)|1&gFHg8Lw*B<59H_~lTe+6NNmGVw%40S|)pjV1 zFZCdk`M}O=*e3i;Km97X;DW!nX>7#PDr!u|3y%3Uj z95J%hxN6I(<2skFFfh^upmiVacB}aHGKh+Q@JEDGq0es$*qsL$ z^qW+vxqrSHZ-EP~b_sRw@!*^%fQ0xsG)tUs785(NL=Q}U0!=l|%R5Ks zQfRvuR-rUb1T&wSgHOlk-7|h7aoJOvWrO{isOJIDwjc! zwfs8H_sZYn(o$v6bM?IewE@QMsz72$NrVrD*dALI19|wYEOPevio{JMA|JPpfIiRY zdWS1t66rAB!)JMeW`6_pOKO!pZhjMjXhD;CT!rB*v5{4{KPQr$8_CE?oc2s(1nGep;nCuAxR1SqM=ws!YzZYFS`dD4WkxwSK^abR;c~$N*d9~?1%RWxZL>Y<)zRXIAZ-xq=CBg;^$E;C|J}8J()Y~3J7CO+h zs+WcWNeZ4G@fMA@N^}?QR23?IR)P^n<|lt1$|xNfk8_iA>tE}L4i1iY_*FxLWn9j| zFE_=wlsHs+Tg2uKK7!i?*ZWOfPtI(=aYO9j5W{h!2BI}%G0AY$T$rr`MlV<+YL2{6dG=aeXS1b6efl(N=De?An5Y;*5avtR zJhF(2W{&8UGnv@LV-VCwNRKjfdtgVHk*iWp7IzqYGzn;i<=iTm^$aouTA7*Tj!kG* zT#Tqtg{#Qa##nVpwB=5bc_y$DFky?K2F6vYgzarUAwny`+&5pfRj|}g?Wf!BW2(u% zO;}?^pih=5;`ZCYU=8*1L9kvzqH@5>z^4Z!dF(gwiO>h6KRO~*4AGojAz;^Q)w<-D zaBiA|HC(WAy%Z!m>{bi56(?R)9iYLLv*TreexkrEq%eiIUa(p-z3s zxA2qk5wdnsShA}fn+WFPubt;N2#kpqjeC`%O~mNw1sxOdVsIO*VX7?wG`YZ-TQ=u! za7&?T2EsOlxWIdZ&P#ofZg^5>aMQ9NjrQ!Q$;L~jI!pc&K_PeO2y{(HQ^qjX->I!} zrk`L~)l9{R^6G4DAxxtAo?zV*Vv(Ib4(?B<58TEy@8HjeB3}Dj*JM>sUVru|1g6mzTuEbQdLmzetVA`gE?0@5R4>PRq{}MxAnFBn`oJ7& z{v43+0K)Gjj%OIc8aY&D=2R*{by5B+eI6-$v6}DZ{96P~t^j-4tTI}!?JTpSjWuT) zLODZNTS-Yx0sqNmI<4^%(;Af@%cd?FsQi!Ws;6KI{#esja4-p~^9ONk*TMJ!bQ(cX z>Xc=KeQOBWuAmP|Cid3FilS{p1iGZb5MfkNx3;TbC7s473HBtqu@i$Mq1y2xLa=H`L56+r; zyHN=ouG)=W7-WA6E>nV0$ehZDNadNBS2Yy2gNbpu)YtgH0u)`0H!TNsySwN=0(v?rGShHpMU!1-7BV@V)q1#(mb}#9A z5aZFqB{PS#Qt!4Tn%+7NKADlJwsG?%upzR~>-x4umX_ z4`KL`KOJ}#B+Rffxk9N@YqUDO!N{4+7Hgi(?r^&D3)~(r@AC(Op>SbQaU>dxmn4#< zW#y@KMP*fWO>JF$Lq=$vHho6Z%;xi2T4$mEPyWe10&^$I2iLTLY8@PtOdVI-in=xX#W^e{GJ|Jb^*caZ|w z0Cv;Zqhr59OCWVO8pc0j+hx~`?Sv=ip>^m^v=^7iI%Thn{yBU7SkKt+09S5Bk6|tL zF;D?{Wb7hTfT~aiU5Z{4-yZX_;?c3}AI5e=`BBseC2a+$-$Fk_htc2h4E%;HEJs;9 z<{f)&>^-DJ4e;zen1vsQ{dgvRim|h=vtJ@Pa-e2-`cl-5R-hi#j~<8L522RFaSEsL z3}yz?!Q8^!!~C4ROLmRyTIiXr=s7@Y8IE89&%*QYQ}}oIchFi}*lS=QC=d_tI~_Hl z^HB%9?{?^^U(s5>i$*bq8Z5^>_!|5W-h~h0KQb?|^JVABJ{?;=b^{`>Ylimnp+Zy- zCCrEZ{W02u_QTVE1c*+kdpXX)`+b8spV`Ew*mm|3_G)$q`zZUS>>}BZv#IQVkKH)- z$k_8^Z;ib_b_~ihAwP+m=5-T1rsNBGD1 zdHfd6GJ57Iwt~Hj-6z8`L3WSq<*X_Dz3g!I_*m1}qOsHPeoN8y=oY}X@1e&4YQ?j4R-j#hNZa8rz389#ANUS*9Nwjq$wMpf?@$%K1z@FnPJW<*vYdjYU?CX7-S zhb>^U!UjfNi5AEk z>Dt4OJsR69s2>$&)w_;>}_lhJDbh0C4iG|R>pk6{5SIn^Iyz6%t7W!W-A_qTE0K_ ztFZ^h+Q;h0D#t9@Z1%J4&$B zHTxCJ0UO6I9y@>R6pT0P*j;1w*|+g_c*hVLh4J-kpsRO5zkDCsb|FwWfjJLzD2qNr z$DoDYg7p393Ba+ipK%!e#MjM zGsVN~SHi4|E?h8w-rNh?+vc>kWE$%0YHO;iD$}X*veIOtBp!=Kii--vp4E9pns^ND)@Z@21>c}O z(7PMk8!+`S_NJQM3{vT#R)em`RukP$10u#w{5$bAKZ1p!pW&VVlP?*Wx%scXlCcOnE?8B z(u$4*RD@KYyo&fz-GL?&(|I{Rs18gEtlV~aCv=Ew+aQ{|#W&<~3H!&6AXgK=ZT`Z5 zZ!nV|ShQqD!EP(sHh0S&r@%X>ro>~rIg{9$yA4Lkqtj3JbdRS|AI(mDv*wOBCnhxt zv;Z0m^2>Or$-)4Z~F{E zw+D{>ZEDOCDMk_EV37WevUMQzSM?xJNXgD2@Z5n0{1$sFi z9B4k&z7QT;RFi-<_xVV#-Zm_tr4Se#xL~0e=F!spAtWTCiw2oal5#MYlDB}Q4CGSA zAMXqR`tGHIOWvR=JpOOwY?h{#HG|mpFOs{(^jY%)vo5%JA>XvEQ)=5;^QVNw^s4bR z$v0@3zL3plBp;K{(p132OUE;lz(U=iECl}wipgEWN)@0YjlulPL9X*W(O#tS`Tos^ zhR05jr>HaWm{iTdn&{MU?UeA8>gl$zP+?h^nKl37ZQC?ct3D?>s0$6MLx2^7`p}?( z`YoX$n_)qeA2f7^fPfgsZDL_=!NNE5eT(>o{NVfuP?kE!iNuMz!FCw#gW3?_E3xIY zEF-n`w9vfJpgrWkT;1uq>iUG^$O)276C&V^)K-NCxzM1A`fZ^hr-{_SL}8o9ZDOIb zYCtN$)&1{vFw%c}XwVsQAg)ez8cB7b^kEQ-jo-eoGk?hUD_jM7Edi6he|J~rtON?^m7YpIRL0^mc`$A<&(4>1HO`A!&y zp>0+90pFtGv9V4flMtGPp%I1{6-~ncZd4tKI{_GsN4?o{1uZnO?%>PG8`DNXuJK2r!RjAZCE&mKH2$kA7bmmNfS z>;r&-*(cC6c8OpcG2+J*Pr09pJ?GxD^f};vFf`l&VImMlwu>zVl{*@BDe-Yo8C+B^{|+=k&}P ziY`&HIcd}yRHj>dsGTO)++Q=J<;1^L4fT;v$IrwEVCy#N* zOx4vUb9Hso45%9Epq)*FMN4KZqK{xO9lI6G^!W?-BPCQxn@{m`2wVgumL{if5qO7N zr7sBSLiuWs8@W9yrBiEnW4FrXW*vH$8zWK>0SKjCcOCA4O7BM*(#(2W#ywKt56d;=+LWV2?GQhKIlv^Y-BmoL5m%US_is8@Osy8KAx* z5HO{}0l!kAoD!Z0`orl|MY&0IaHQ;lbbMhXy|%i)`7)uQq4nqffZrWTQ*R&;oLMSl zGOhbtGYyT64VhN<_L|aAEEbE_w|^s>u8GI1nVSO$i-?rEeR&Ww1KF7fVl{<1i1{=85RS0gy<{GG)m`eEnpH?4Hvqm*myDB}1&?Ui8QZkUh-ULoK zE813wP1#2$5i*+qaflLPFg`esojgYIKR5nxZrs7J!_e3go=?JX358RI5@OpYqAMp* z`@X81+xA^PpP((p-(cdh=GAlC?4_C3Pg*lcN1KSyP03{6#dl_}AMcjyr+bSk7iF(E zdTK~amDebtF-HAkAINTlo{FO5!t8fVZ&=?BzFYW-`9tf6!A}amvVIlNsI2M$Q(^8l ztuS}zEid{?r_k!Kxy3xYaFO{B)^~%ST0aRYT~56Y$rTo7zD=j+)LcH!AI84DespEA zVVL=HFXt;(s)uo_pk@>{pI@t(;~~w>L34YKc$jw2VGrYR#Vy0k0>RuH#wg5(lR)rg zVQ1_&S4#~(``8>V+usqLeH3Mm!Ef{^ca%HUL1-WtY%<%cOOuEYDS=Z7KxZ_>QWGnm zP#TE@FT#BtsILPPN|Q&L*$>D-8$Qo!D=(|0Bq-0SRQMnvok9>|9}5-6pyeX&JV(g| z*M95iCw@L~LGr>tq`qTY_SEqk_u}BE3+`lB1Trl*v^F@*J^9HWeB+AST-@x2$c*|+ zmfiT#``F79s&V1ii0mq8ZzE8Rp9z;e%M2^t(!6VU&;0wmw;aEBzL)<_!AFMAnJ*Oj zmz^)?Gv;HKqj?`XKh2lD=Xk5&6Xqkuhni0fpO}?hj>`)kl|Qb2O#1`<6Gr7KX1StU zv)XXExyz=o`gBT{Pp0KaYibbU5RZ-kXY(BM84Mgdv*1~;DyiyKv8w$LDM5W@6snaU<_c?U^HN~V07bjSvRqYb2f~LC7)cH$I}`>CbMAlWWcgQqvg98wMyl3 z3OYjyTJ7MoFw;9f=JE>&+Up>)fXw{`A7j&V%!R%rf%X6mC+tZbwFosQY(-rinWzatKbwwIL=UG;a+ByuGp}wV zlswB5`_>N#p^$}%%^pAfL5_5={-2R#s7_1XMi z=F9ZMV@HIR0#B-oS!4aB;%&t{)_0sADL%G-?ED|*GsXXyPh0=#{UTtjP&6wT^D65q z$K|fey~_i4GdsOI0zdSAKk%hf>sHEHttIHeD)Q!$nv{yRnA4vcP#sn=CsdGtZO@oJ zK(Z+fF}nE_=fQ$!z{70!U?B4jA&mrcAcF)ScnZ>9gpH^Ty$-V`U>I=8DL^tG=`0`V zET7M&l=(QVXPD_6LYuW95$y@g%ush$n79Bx5KJA>Vy!D2+zegODOfE+AnmpES{RF< zH>NDkP>aMe0(}}i3bO*4T4$f6qYAplRGols>xZ~w)FJGjM{xQwfi(4uLE3QXM$jfqgbg&m?jN0~Lwn z%nrXiAbMo3k*zxYEdRaR`d^siDX#JqWnbNXD*Gw{%KPT>AwetQXzN~#| zskJ6nR1lhuZLht9jSI_L*Ph?CY2if|Erd3WLW4fe-j1r74f{d5_*gJaPaFA6nss=> zseEEp4v&4j2V5VxLM3=?v7g08jK7b`&dZ+}`@Q`4ns;^YntyKv5?J(J@=K$3mhoca zZN}G(zlh1b?U}S&$fPN|m`PU;j|~dd;Hu`Pl}P2O#H$Qf800Ix_j{Q<>~uT5Z{YU~ zAGkm8zEQ1uU5neai?!RePitS)%C%ZUf^=s?o;{UF#E}IHmUhd4WtU~pBDYw$VgVA0 zi%}F;bFnCnyNzB0SM71fy#{RXdIuJCr8>MASb{ZzIf|{oG*!plZW28g*k%&_L$2D& zan;zs0XuEiRLA#6_j^5MA;qhPUvMu+Ux}YKoCGBKDz3US`f&V7!{glZhCSTg=yUO3 z8-C8c6n!nOGetddU$i7%9<7T{kDedD&2R&EQ*>KgccI~8?!xHB@#Tigx#iKz;}00_ z<1}`IgR@5SS~e@~jbejL<~LU0u?k#K zA)_46th7wj$Phr%Keq{F~o zIT27OS%fRAswn#uFMQzJiQccz7A+^BB26@`rpwGpg+JPC7?HeIuSl~ zw2nJUg+R`1VPtGrX2x#BSmbU*WJeJ8Oji3D)B|P@iBT;l7U7ByB&H8W_|7E%gaV zR2~$;y+T5xRT<=Y>`4RWwB9@~&qa7`A}_)7k@v&zM?MXI8aZtm#2?o+9zBc znHJ#RRL%V@Cnr1u{0*0~Q6Zh15YioiLW4PA4tY_b0j!|O@5Nzbkrz?n9C`}1%!ghq zj%aleZBam0tn&u2R)axkN8_oy&zi^Q`2%vF6;ktTF>nM2j+g1{SX)ZzWu>j0n(9yq3Z^QcHQ}{@5)VIJx@BdtT=+TzdVe? zrKMxl@sjG(4{jYCyt?mO--2;*AM|z|a1qVSPldGFtVlb}w)FDkP04$c-!Iu)^7E3n z)Ng9uD*aIXQRzwDsf0;`m2#z8Sy7a%NHiDEOsImSk9)O7nCHRLAR|@uh%Q^F_9Qb}UL*gUeQq%5V8TryUNYSJ3fp{W(sVk)>K zbx->|5~eOqZ*3FP!KF_(lcx`e&JjU7J)H#LvO?5UBf%i9pmr6eYU)^>Mnk5VreujV znJi&_l}c~Z)~4f4tg)%BiSah!CLs_?H3=2zrnllAh&Kc2E*!TEZ9M|>>uWqge9 zEtjUyXVnUbFg%TOq6B?Sz1#q|gB#=yaz{7?=W0}Eqr^cwCZ;E`cwFjwa$ zh>5>`lPJK!e;*Oz`iKPLLV`x0nNF;k#A+he3}X37gMu5BTwZd0A{EeQl7zk1h%=ZW zlkgjz89fzZoP<$=ye6p(6McrbJY9$b4*)b}nu#@&SWU!=p6hQBCQ}h%w!(CQD$i=C zycH#wFmMVLBCAb_rCnsk(jXy`9~JDSr7j|d(g)ZXW$WrT&-6z4o?o}G>R)o(2aE2@ z82x54orKB^i5o7wV@@cYe(dvk^E$5mb@TOg7M~$f#qpJ)D(2f>Zy}-CoUx!Fbms-@ zT335LdPAnQsWnqvR#Y6bIf`5^v#Ygb^}3d>`~m|cl}&e)lmJIRc04;@b`OljFiPQf zgv6-#q<^${G=4I9GNn-DYr@Pv-^;#tirN2N;mzm5iF_WWjQ9W$+$1o{f&)Cj zl1KA}vS3VwCPcKUt6pkCZ#B%>(iK^?nb=9s#kxE#P6xUv81=bbpE<8^D;G@>Eg86DSV*!x2xR z7ncXXD)L6XIOQwL5oPodZ5SV?|CJXDe&4aj2!ke=@n z(?ya^ng67SwMmM#Fw?~enwAhNPG-OoV&#^P34!kjecj?-IbDrH5)R^24w(t9$1Cad zoxP_uBeVo4l|OObgBSb`7d?IFvuzJD)){v!e&FKzr?30QkNdKNRBQw~&whvaW|k(i ze;$7AhIJ+Qo6#E=t#50Y`_O|x`L6?M;e43q9q3v?i_Vtj2`-!)L(o|mqV}{nAhSkf zlUyc_teSIV{hV}oC%21}aZYD$`Ez`oF7tI_vb5ZJ=p1XE;*>_E;>{ArvS{oBy3SdQ zDsjD#j>vJc1j{RI6@iLOBoocV>f>t-R~yuFK99do^>f85{F{oSic=LTgvQlKa&Kbw zw3sZ(NTna)n~HI9q%x&5Qv#OofPkxM*D!)+K*MN!i(|MghGVf}s}L_sS-Z`g&!a5X z45R?lWLiB?^^5lU7W=WEQa@-8zpL7QbCNEtDarPNSIH}rN>=Ht%IuTcW%ekc-_Z`S zd5-k~Z$b#LkrUzhr%Ny!eKQtyitQ=HjaSvWr@uYe^OtKYjUif3TL8)CBdl zC9bfY%X2=uJ$o_bQ+pisg+*?&ucnMhv_KJ`0EsrvGQthhjBC((<4s1Hk+e7>)`jj( zo|}v}dhT({jRPd|Ua*V<{t)=U>NVbF{H}37+G~8-sE~QAo|_H#8h+`KCvb_On7h|~ zx99tweeT!L%kB?78uLzsd1I-u(Ky$*#`rY)k?}Y>Zd3=1Y2#M3)p)1zzmUR6I&-r& z9pl38I>SukMaGM{i#)5*D#HrTmFP;tljup~r|7T7FOVspvv>m7Z>TcPG|uq6gMRN( zn|U>_;kCSu*C)&gOTwDSQzuLrQ^uUJWUQIIHcOjT)n;llx8*H1EjBNrVk%zfo;M`pH60{n|_szSE*qAktoda#J8*}ch?jvp%1pWK= zZH2mnwDmlG2$i4=ejAaMxsJYL9etzDlO2v@9Y?v7bPl0=0>IYXtSX7hfd?XzugD77 zs~sYNR&uI3Rh_u>O2?FY?BhLlFIfY6Q*!BknH$_^!R7qMY6JLp8znYs5s2B*zK(wS zFliqHJcU{fmW*+LSX6e0!HJGKjTs}g=x}us_k(>7pNG;yL~%0zRPKHTca^H(H zv)||Ar)()!5#F8bDoT0xdRnRwPe_9if93{sC@v~8nK+HpL3)}~wW+bRm8f>rARpaE zOeP0Pv9}bLI;*E{BNE}MZ}J`@2vXvdNhV0#A-1%QY#2`28nl1SmZ5#T5AG7KpMLpc zYv(wU4XuA|$t0b#gNaLLtXh=YH7s?^q5S}@KPwzM@1afEt>XAAsq%6duW#d{>4n*W zNpTYQgVENpKgs6G-bXX>Z=Wf21VgD1S==>%{D~c4l@fghJ;81#@f6?&#WZ(;slhhw zhWr}?+v@M0rfC=+J0WmnH-ys}Q)-vCKvvHN2(^PJ>cJJlI%~$|2dgKzEVISCHF%%% z{@QjPVtgm(C%krumJWRy-#B%V7GVoEWChY)2 zv!qSIVPM<%bfJ&U#M|PF<2~{1@sYS95y$bLg@NB{*K}%F%`j$%SQR39HKxKDYHu(R zWZ=jX`)F@nb;IMR?e%q$f2okFiLAnXui zg6lj3A;0h_xbN(Nr%8ApJiWt!flyrc4B4_{&~wZpq(D{hu!HmP9_F~`gop7oD3Kzm zcwNCNK5u?%KTe7>PaU8VNa20Q$eO4mi<5n#z9>W->jMgMG;^$j2YK zLkMU-?x69Z$)f9o>`Fw}5=Ihe&)7hf2D{xR8yA3aZNATuAj_qtE`$5-g|{xOs;Doz z?TH_Do%%)F&6Pz(gwBTxY&Mg7!}&eerOW-e_Q~GW-~6uykED2Wre#}eCcKFA3PNFZ zc)HE#@-E!fan~OL!NN?-gRL36X}K+&T2U2lwi+5*zq9uKORgv;E3N|I1hmFNw@ zcSR-k`hovkgI3|L!mi@WE3d+v^EMP-QMuo_&#g`PpTmgkUqI*TErn@T^D~yoFN~^z zjb0=e6$$90Hp5~=k727pVGuh+$y~oD1U&UmAXJJR)COs6pV6H1CUJ5Yf4rw^9o?zx zh)OFXWQnAM6Sr8Q{kdbM$ytNO_AP=xma@7^67dA1$P1N+T`@-lSyT21awhU4$W~^F zU`cX}5Cxnl5QB=z?OrG~ydqE9yq?&;R?-X%^r1OO_OPF@#9gGli=9rLGOzfq)=MAU z^!AJWZ6zr_XfJMv)OTL@?R|G{dh8yox_i+>vRhoPhSncLE88;>d%U83@6|Wn{j%4b z<}D48NOERT#jHBaK5*MEoOds6^(TQc7s?Yrp`YGQc3K6_>C4z%%UzpYY@RFRVnAd* zF=TV5hDGB0@5+67AQx@5Vyn=cwhAzqtpbc=>o8vX43eu=I_QO2h(m~3icAPIOJOQ) z=XQYH$8ygzttcPeh2ND%2-!0|O2v9IfmKu53R7+LY%wq=dsH&7zfJ|gdx-t|voTv? zb!56c@zr<6MZt@bx`udh!VE324qCtpEfB(GR4fu|o6}qPt%0qb z?0^O-&IH`Y)m2Paq70r0~boz#xTbZVp1*y?HZ%6yR^ zG|wEt6lrEzwaM}Kf@YIE*sRtU9$+p*dDyT=aZC@w{cLhjNwD|o2lPAiyYz$l6M6;G zC-s7!)sqdI8F*W6!)EsAU%1hu;*RlAvReZUX(q(EuLJjql_$N?xU zgh-1`r@)W3-gN#W|M=riA31#a?{L9)u4#(bMI7;b=hENJPAmAe-Q8=inbU9w^L#_~ z82ag+KirF}4t|JBpD6W}$Lk%2p7rh7SywE){F0U1t|Vi74PZ7|A1uaKJj-KzzXF@7 zvTMkd)^M#H^ECIgiSY`uNm?56iSxmYx+yZ;R80%n+1eD8-8yT11Q>9gUS&4%@kGib zG&Y0f3#Cj37gdo+mQhBSY%vpepVgVd#Rly#b_+fOVa^mTrv|BbRZ`Wi>Qwcr6gyN{ z<%$CFH<<}KwAuO`AE~hy5K?b#6B88bEf@rpp;; zDtuW)g)ebI&&V+>#~1=~BWnsE&P3Vi97EmFN0w3qD@V8&6S3$DmWf!Bs!iXx${0le z%JTWXX7Q@-x_cVCE)(jb;rYJkQv*0SLBg)2`*Q5<104;mWvN*G`D@l>Upqs65Bhrs z(chE3fPCnrV22)6i+w5>6cdNQ8@V%AcF)$MF(`6KfbbcTyk5*N=+x}Qk*SHkZk@m+ zfI4x?Dwo6SX<=g8{FIB)syH>TPO1fUuX;eeL#%dzH8cAtrD$|r&?jwhn$B!oxwPSF!Uw2mk|yoBc{5d# zd7ifI@zWnrotbQ(s6bO)Qc{hpz=C%5fHeC6dpnFHmEhO-K{QtjU}+34!z#@x{uD1S zHdGm|4Ugb=j2{~nxta3J#S*g8A-M6x$eAkH`1OKK$P=uBMKB8{sz6mBxCNtb@}PP< zr&j9o6gw44jgLq&8ue!$pH8dt`+Y>o#fW%i z%g9to=0m!EPMVc&a)KC>sWVTEjlFbRAOPi?VSeXmUTtvO` z=L>h8*L`=?D=zM38XLB+l5l#ok?1rgii#G@s<;5tP36(=G}f02_`5m0?gG3X0=zEA z&j_3`=nXRGSbioeSAcrV1Ob~MOsz<~UQ@)D^V(-W1}J9K$(N z2k=w)&nUNY9u@nPP{Ax!BaQ+`6@?)~MAl;&vM3A@bOkCPE(HgqrQm?H6inRRP+>yR zI5B5X%o&t&2Bn1hD6H0G%%w~Vtl4)pNlYP6Lh{}HhQQ3Y0;LtsQLwCtdfJ3tdpEBQ`UzlH+ zFMA-286#&dM}%fEXYXX?QKX`DR5pQfXUvQmiH>UNDyS@Xod&`$o;iU+@;Okg(bEzX znwnEVVfH+*(lubk%TmGaBA*+XyW-`jD;|q+j-*3yv^zQ-0}h2lVeC??nJ$$EMU$V& zhw)zp9hn9hpDPVxlkTeUE-vp1U6#&CJ={+2Y3@Z%hPZZcUMJftsYx?sUv&1#qg>rF ziYLGq9z9CQ0Kt$xQR@WcpJTa&M#Pb6wGO(rANuxd<}*pzWD>74p?A_fWpZ0e?4_@~ zxL_nxRcr}wUAlZWu9LJ+3{z*hIXCV0R>cyvN@sn1jeaO@D3Ts$rj?6MJG>mETUs2yPyF>ItbZ|z=XgQf(e5eL2t9i(NV<_jl5LV zm=9fO1!Dmd85@{29_kS=!{CN5ujk$GnlM%cx}1kx2OFu*5I6n30D znygXh;^Poc<_9t_M95S-U=%oMu5b$Zf=e)Skx8?~JGs)hNUFHl#1s_D)PA3+x(dwB zv&Os>{=C%TB-5@*gJ3#l)Pf~1rT#oAY!r1?N#CC$hgb-ITgRQ0R8^;M5rQtBQ7Kgl z6{GO-9-dL;%bh{wW_>~IQWXRd&wwQ^T}DJHc=8{i3SE9h;b@ns`YSCM03> z$xH8;(O6u|TqI5E@ftF#JOLCT1bE{`pF#r~q4AtTi0BF{CXICSlp*Yt`ZgqKCac90 zT7u4~%w4Pl9Mix3%-N&>xMiq`6Y3(?^3D#-iLVtf!Yl($zCtz(z( z-v1^8n{EwC=SGg^n53_x#nRY3G+A_}er9!!Lpp=hQuYX1vI$!90idm=@;8J>kmW+l zQp-lmfMuKgruZ-7uO!~Eyl?+q{N2*OSUxE={va`EIbh!#KalvDQYuS#r`L~yT%c9^c(bAgI#b|-$V*lb&B=lND!Zz_Ey@T=q-zR!GW4=*J=?uns{oJZTMHbF*$f=u z#NAAdjw!gpgYijRwoc;8$=;b4jGNMv0YT@~oXz5hoaMx22Dx~(_PID!E$*z*Y zk`pCzR5DV+l#ti;PfL%K;F6MLk8P)I#K!Kj4T5vTCiB|1+ny$e{|Mm}Y~)Cw8cZaX zvI*5`+ki7|vsoMUQoV9@&ea#{IaDB6C=+Z_Ph7l^tC9hDSA+y;I3&zVlWlK7ZLwM{ z7Hh!oCm|4>t)-<&zb`2ikaZ(so##yJO0mI;-4OEu-9AG~VpOumR$ zBR_L5D#c4+U|5-Z_L|KWQN_TZQImNPsXIa5VAaw#np)B!qKAkyIxeGjmihgb(gVzw zfY+Z3P7Ckxbvc8cKv(jQQFRxi=`vY~s)F?Z{wuODj|nC-aAYopQxVZbHCV%F-q?@- z3z#nuOvJyFM}gTQzhlGz|7EI9VDXG%M^w~c;XdR}9s3*IS;QuLHPw?<-7Ic9%E-QB zlzM?46P;c1U|&CYJEEc@Es;U>!2n=`KLG89knd)?F^LG*w5HCj<|v!GA2pIt)iu~LXcPkT64xqEUGXDZlToK zlN8B55Y$8$$Da!s)J6z_WhL@mfYMXI3MiEmYqLgc%!CI30g8xKNGuPr+{7v%mY<+U zsX%=|ic5**C)*9B#PSf!O{@Yj=rlqQtOD`4DOg3sDkRo9mDm0c{ucE|JCNul`_s>q z`k{sBz*NKA`Tg)xM0xI6s0bpBCq6`1t)qQ?{UGNNP4GT!I&+7x+%#DmI}lLfoR4l} z72=;v+9^D-%h}NSSK_Pw0=H4V4w!QPyLdtNsfo?P(b?BU^TloDSF`Vk^Gsp*AdEts z%^qYA%MCEjIs`4s&CC!dzZep0h9Aj3%btg=NR6Tbz>&R! z@J|qPCwd+!vGM@318MM2c7KxsI!gG1#3)A;8GKk=xvgX>usQp#tI!ovV(aLerT#pl zi_G*MnCaI5&s4!Y4 zs&#y-lNOq^va=VOh(tfJxO7h8T)gzBFdPo$9twI|%@wh*8G$i|yrE2}EwnhaGc*!X zk|6QQLc`3pf*&U6m^Kh2i&Vw}Z$YAf9V@^E4MsI4YgTmr!0QA}iQr6^#KDS_4W=+E z0dd_B<|~pFLPdK;XNBBcF^ui|a4-}?;?kDYk~Hr!GuzECnwd7T3R5}v28xRPxwRMg zku&Ckvw~27iUFV=6$3CpD+Yk@RSe|LmM@~)B2g|1qTA7qKA3G_YN;cu(PW^9hz>D7tWKuFQ5~7)m>rqx=!h(Ltcr{jsmE8tjNDnu61jUmi;B-!`OV3$ z7U`A=1C>b>=Uxe$xGZZDXGuj*i(n9p@`-D;CQ&&DibVLDbYz%$U$8qJR;Sb9z>#9- zb|56@)uhpY6FY~;h6Ptm+UbutQg(mJ=d*)293hKjt^`d!xCaoQx`6vsQ00q@JBxaY z28!4sp|&nn#K%;TXS6JY4IlF*L(4Na$XNQ-5*MUJG`g7hPdC}mnciUBqj;M^m!@oRq-FiUx>4D zVR||a@>e{H<7DK-V+oO>#S$e%1Gc0@<*1A~t71fUjzpsb!2(kG;C`E&*Pvm5L)ktn z6h08x7kDYa1`f4HJEH?pHVO%Q=cS|nlOl>C*3N?7f`Nh^1qTb{1)tYc5tV$3dKy!b zpj!3Zs)=1Fk+63h8;$lIqZ)cSJR`F&*)xoai?Wz*Oc9)mk|P-6!3$}&7p>|JtraGcRkrdh@6F^=$TxrGd8}?0mSsdQtTj z&RZ3)#@Ed`lpky_tXT%U$?IbyEQ^jKE%FIE^^2^Q1A6eL!l^re<+wy#xSoBi1Cdkh zA*-~NOf(_bx#yiXmzWhbbLP~5AsoqW!1_3QJF?*}A-G)gxrWKpS$E{IO3uoL=e6!~eu9+3HA1_30a!g6zu_1=#jO)zz8SeLrCGtSy;L z%O9Vhr_i(WWj|$qfI=Xp-yu{R3Yk(ysk7^R=2G)C^RRc=_bczOd|woPQL5$gy&*n7 z5xQ4*()*R~%fhdsC*z-$Y6}T>Q<{5+LUNX+l)RrFJPsjHoG&EY0rB|xgC(`#e5In%gbNnG4CvESuw62@L`8|IE4}d+K*%@^=L*M z`t%Bn>gt?wsEa6vqO(pDMoK*Xh(G2ROg>sT`9vXm-U)hs@RH{@eM~%m zx@_f)J6eC6{Sdo;JLitf;~O_VP7K>tPenZ2nnyMeDP{Sbu2>A)5B&z)~t9O`p?75_gU_@zRSF0emn22&|jI4%^&4` z7~&qp_cHfd93faQ7xIEm7XM``r8?oUq9E^_-VCY5W`)A8dW@)M>7Z!bg{2`IIBS++< zqV{@PK&&BW8Z~(~YaSRB4i7W$3hF#71g$K?&_uJzYBrlJK=w&uk=X)4OE6Sq4d<~o z#4?2zGiFW5jPls96oC4t;5;6;Tcc4c!l4kuV2$kn^ByuW?+HEuwWD4% zfCkYKbOI@f)@3^ccR+*!p`yay?8mplJmNIb-OZy%kz<^zqi4lvd>vhG1B>3rMIDiv zN}B$}nFu*1n7(I_pmvK$0WLv`A#lk!BHUk&U`mwOV9!__dQ-+aJoYNkElEElY{RQWLe zw&2jH@APW!^db-MNqTmAUR1qvbSF>HFC1rM+qP}n*x0tSv2EMt#_LAUL_7}UPO@b# zLb<)1rc`x5!u(^DO+u_&NoAb2GW+PBMO4^MUGj;v{^uD3zden9x6?>UjP+S|kA})} zoLyU;`G#L_*D+6by~)Ec)Eb(X@6EzNH{KD>$9Z#xsXA@0>t4*tAi+k%m_Ei+3Yq!B zR6oGWaRO?6lY5=#71Ej*@h4?i4d(L+{8Xgn;+^L9cul`g1I%A-)yWlIW@S5*XXS1@$eaYA`D4y~JOUrEk+- zb3ER;!Ws5%nRhUmw_2Wjy`xuX1jBiTF|);0w7tvC&Jd0L%>@Y=v&Rh+vTWtJX#@r> zMVRcoI7l|Js{2>{ppzU*a68)mt-Dsw*rjHe0*|!%#VFaA$#$5257F8C$pn26L(zEa zkiLgk7JnG$$t~nWqi-^i$w$Btpv=H`GF`!94g8CEH~xinui2h^)3{vLP)O!_d!d6$3tHqd5p^`vPa zKHJ@t?A;b5wVNt)N^$v*Mqx%WB_l5*^}q``Sn_le5Q zI$Jd58Ze%GZ9niTp<~{O!w#40Cd^>SZooyPwB_$GuJ2S^XB_EpX4mHTE;gSkci$H} zf$V0N>F*$4OZ&J`>5~ZCtVQRa#$PW7zF(`5y>6c`TfHfp4fotl#oY7Uzu8n0Dtq!- z&u{kIL0K?1xUOYBM}yy9>ZveoEV^shR9G3};+D|ali%F4()8;L?n(_M(02TxLiyqZ zQZ)n4%oAj0m>h$3oX(Tscm)-|D4&Q3`P(Na(jEcTWqAe|yK#9WPsN9z<}L(dkGzrj zsGp&IRB-M!&3{qsimCF1}mT`r`k3FA*xsA5S%w7V>~*SguG2fD|L`>4O zj@ihO9>P-SA%)M0rlP0tQoZRAP|kB!r}9Qk8MTg~ zk`)+~N6SF0w2@#9iDfzfGZWWaE6O``XORPtJcIWiIueHgfIK- zo!atCC8kO)w3XW?$m`8)fB~M6(TW3DxD%xrG?5)bCax~Ae4@kuj()b4bQ^gnJhF7% zXWkA#x|w|WN}?7cY%uw#Xika99LX{~iO#7a9p*g@KcHb`e-f(3TeS(lpT?a(^|8I( zAUt7lnHWy0_BC3;RSf>f0)HUQ`Cv(fT+|RH%-f1{>IgBR!5RY_CL;dPOE{vy>y)ZS zaUH0E8rn?$$4b~2;SxMnF{r;$!Qx2X0hVKu5**IH z<0Tj?%U;|!QB1?8A02u6=Hkahe2SBMkR<%UnUiySoccE66 zyQlN+bt!Zk=Zh-4oq#YGk<2QT4@A<=_H<6i5J>x(YTalF<+THR!Mz`3|bA+vK>wWOEvDfg5tyjd`9o z&0BF+&9H_Rv(#u8!}SD&eN5ZscdB6*Wlg`TS2Ur_2YTHut0JsGPgK_lNS?7}SUIw&6H+l!jXjD_GMe#6Lug6P zq7ewi6A=nb;C!!R@DulC1r$^4xL*%W$)UtHgW@lmzE`~h{BU)uBkCHYm_fWrXvSh- zXf}lSUwfu3sXFi%qT{D5y1zq2#q39A3se}2RE<(%s>A>|s-SfwK~}P9!^@-8fQF{o z#Cn@%o7OH1E<3D7N)&%hZjTzZ1x=PDiiHDjYtjLcij5+4uG$$H21Jah3l z^|K||kp&kF^b*zlX*@2QBKZDzRE;z{VX8)ZtnAq!%nhC^bt<4qjB{!(aFYMMg>}qg zvIFh^8<9ibI(bg}mzh?tNsdz~IbT|2ooXN{5n#bwVq6w%k~{Ar|$N0DU4S0>%t;m4+~!%v zGyR;o#`ONGSk6iLN`@uMDG1*1p0S#d(D9L))NRm1Bx8ZUb2i7iCw~1cB^MfbY1q5kpLu1KP3Pl3{!Q)$MA4smXw;nvr`gSF3da&b?5Hs!^n_Y1plDKY)|84&XaVZQ5u1QyNAgM$Kf8vqev$ac({BW)Njw1vD2Qs-&xB9~BN zJh^UvW(Rt1E`VP*F~rc3Pi`(s_BbxbTTbDVaIW#cLVUVtJ=(VK+(RzjxKFLG56?R1 z8JTB)0)4Smft>poohuOHk;Wsv%zOlv4zE@xb!M4*ZaGhyG9rDGX&^%*} z*@vPd=7XQk-UX_`dE?wEytgM66g!(0vObV|ZUHE*ajm?jsE=-+(O*)#Xe!@M4G$^O z4&Ji5!2uwp`T5e8gjH7%LCu;K9I2i%8FOWHNaY;aWUYPPHTgA(4VLSe3t< zlkPP4KW*63(u`JQsm1J`*GDx~B%_-5)Uokt6mV(Eo_-ZhT4)vqX()AUI!EjDN!js| zmN}JcHMCV^6&^XC&k@mjGA51uWM|wvT5;mwjzYa|k)hvwFEjsoi#%yYYUNPVXtkQI ziRHRkJV$F7K2)aJt$84a8i z->f#NBB|%5jhdpj)A24)srVhm#zyaZ^x2{f_0WS%dEhqo9#hyRTDOJc%Q`gH)xfC2 z`;u8IKA6#IyGP+M^uYVl+j)0**K`f;jS6o3DLAQcWd^DfI|s*t3tFiz$=yocH zqZhySzWOttoX0>mfCj&$Qy=(bjy%Bnh@0!ivq3l84AL#0XR_V|;@3#%jqC}jg8n7t zG}Xyvsc}Y85qSsRNKE2N%B5cf2U~k2pIvR1TVte=IuYX$e_iA)i4g8D$WgSIT9P1v zEBy=4go7aAlObK8ynO7M6|AJk_D!yLf#FU24Y!ABU#Iy&ZH^DPE6=^??%x7_SG$iL zG0kBuw4C-aO;;V*o|Ql*jRMd$A3f?WwZSVeJ{V}5h2~lDE~C(y)I~Ynv&DB!?naN2 zvVgxog$fmoM1h?chsL1b`GfL5FfW(u!?RAUj73S5K(={`2H@r_5vX~kM$;|1%weciPxB)lq7&l^Qs3{zS+6U-?t7eCn+MYT5^IP2{VX4u)TVm|!Yvps)<=EX ziOtZavDmr5SRbX|V_vi6J1!a=(cOU~I#jkq+@*Fzxy7B~_rK1i-ojG>UXh%wWn=ri zv@{p=vFL{_ST}#YW=4x;%q){lyWnE8?m6-UQnmNdc9`)Ct zhF0k#KTpyUMw|{@GC>+hGmzBQQXA(jadSY zZ`1pK*A2m(=tiG6^#7PxI#bb;759`!pKs!=CsiVCO!7KpJcWRS&7V4OUX-7AG3$(o zv@iqTCPT#+M4M1L|0N3A(9EQ5+$&~e=w^vX5-oB6?kv~cBx~y8UXX`N?KPh2RFW-A z#rudL6lGjlI3QdIv`v_~onv`AiIVecHiL@Wbzz0Y)-$qA_`8;z^kE%$2d*2>BX=yf zJa@91#0=AxBWR2};HFdr&83(yaGy}91oV}eh^l^uCK@oT7a>aCPg>58DX`6RZX6$1 z6sBRyU%+|sUH%(Jv}m6;2c5zkwUn(SS`@{r6Ui$Eip1C@HEC^ln1$Em9fb`2rshV; z$vzXMwCA&DeKu-c{0E0;CB5_QzEXY@o~rjr+<*Xnn#p#pLZTUIt;>Oue6eFZf~LhC zuzdu5Js~yfQEZ3|#z*8+G}jnaa|RZq;W}K;h^#UY4AO)U)(EH47B~!&Of)qyb(aB= z5f^ERLFWD+%O_%^6s{&Sr>JtQ-M&JuF$i{InGz|(Q;5gnjj$g0N{*O9^Aiclrm5I^ zU7aPS9HxXiVBFl|Dix&+%MX$k zkTOwdbYu0#5Y@;XBYvbVIrvByK}a*;$)iuLo9>kfz<4{H_!tbM@ac+( zu=WrpwMR+t2d=YY@oi_Ck{x6l0z`g8c!OFvu+Z~RXAye+y#oyes`)X zr1jRL>-QjIo;Ko@q>i1&AG$dGTukzrL%Etvg@EFVpo2j9W2p zCW4(JZ`$uPFY9+LfbgCeS!?pTzOWr8Z+ENc2ml#! zM1By=N9%gXlrpy6lSKWB&Aki4t&lW!0}7Kh^rrJw_%=ctm;xa$0tR@RbI&SSo;bq% z%XIg_zuvveggQtNp(P}J-EIGDmMe)OeG5S2C-Ge-&Y1-XB~OCKxPmcw_^g}UhedM6 zQ)^c*C_sNbgLy_MZci)S1nRN9^USs1jm;+yd^wc<|!lAN|cqpC$XlQ5x z{AXz1wu-+SR2{hLv<^c$S9bqJ8w$eq;PVgufS=Fcys)UoB)dx4u)@~l{Lu=0C}ml$ zkm+YgVG6)84ip=;otjTaaFC1=(`G2Tf(@XDPO-7SIORJ8R}(BixDZ8`&=n%r2u;Ss z?b-YCQ<4Db&$zMcs^auJ(;ICH?7GsW<#0dy2`VcKv3JCUXQfHGf$akFdpL8M5+Be! z(I@knOrt@XZ=o#~5Zh2x%p@)&MMPT}_^=SVbyTStS29rxPe1S@^W`7 z_e>7LvYKv1Vl(1}BQ|GyUttBgQt6qRWU~4mr5#mjbutSwjGqTyUuDlE=rS@hw{UA} z08PF>RGjg0^L%=0*ymq`tw$>3dY^T4?5CRew=yeg4e6)pK`Vmd(=6DMrkL53lp4{m zhL%|tnL2_`85p@fZ!y9u`Va;r(WFGv9nBFM^2R{@y<-9&rLoj9&&^^USi6%G^!|+T zlBFYVgIpJsqdX9UJ9!>mjS@(f-30LPXhJ$+Z7j&k_1s4Q8Z$?0Lx==MbWyt7>WOfx zoU1ikY+{P&(WxmjTR0UXzHaVwae6w5bTJ$;F8=g%IIBM{ZiM7Y=8!lXTs{N^%YTx1 z#lJxPHr1M0lap@z>AXt0e_AG!533ceC(69P8|FBF$%DJwZH(gDD6g}lqG>2!mM&FA z`U~eSskU}y69<1qQ3>M)^>PHQ^Ve?VhL~M>##iOWM`yx)N`93|D+z;EJ%J`xh5;)# z9z5omV>1R(iu5Cjc<4eokWI8pyq%g+FmB3Y8x&=rbaT}DpD~T6>pgQ5N(L`wonzie zWC`a=l-*Sdu6Yt40g22yZ*oVP^r@U{F45+vtuhsr@IQQgDj8$s90gMH^YgjDLr(UqJEjn2kO{JTNAq z*-#4{7C4k9VHx~l>`WIrBrGx+V?qmKnO@C*uu9ATwA9ou;9R>5*c^ zxZx=QpKF$$=odnd#Ap61@JG-HB;C`&#*yljQRcqfsb&YfS%7!XD{@ZdrfRwAMMyO^ zc~FQ~Jk6GL?ZX}QT5=S?cD!a)Ztl34qere9aJts|gY0hw{DcVOcu@E}R^VT9(7Yhv zJTX&fqayrj-Vnaw1@ZFz0Ys3lxbZcqE<|W7s%T0zS{5tz~_^5UJkdzc4N|hX$w;oEvX-@=1d8Qxd`D8 z3yp4gMQNGlGkWw}v7aVzqGOZPr(_r#R$%MHk%T$o6H=z}h*H;8u+^G|wzR!=x-ZJisf7#{v@9G(Z&GR6!G zt2bwut|cq))u^L(a%*^`hD`2Ez8VDL9Qm*ns(46?Ua^QpQIL*zKoWV;QsLC zVym;!8p&9O@YS|w?$>R6bkF5ns$iYPg4e5^^rxxj>R7s2C-*j9u0ujQNg}svH^RoZ zu!S8sR9Wafzy{_H)u2vhhH6jpjCnj8;zp*m5Mu0DGs})b-cP!9>2?fc^_j`LL0%{M zgANY?Nj2aK3Eg7dGj4wGdKDzC6YVUc6Uz+3Il{caFGk|g|48o(bO(|cVdzS3Q~Ocy zHS7{&W7@;_#A~!lf4i5|TgoKFx5P`upi`UbIEz>AbLqNzEaVj&pRBuJLQ^DdADqX1 zUD#J{+&cte0*j^*^2*GFr99MQJJ5sbNsvy1JqnjZtO*q-p|hBAtm7v-40|awAjfTm z$hhDg=nkQH;FYL2cEG_~EsNUeXFEOvS{V6aiJ6D_!Sf962h54S6JRy0EMMg$0ZK}* z{zqY#a4L`U77D659{`B{LG^iXN0A#DZr4e{5|IqVU|0mPno=ITU}d~(+dZ)-kuVl5 zFeJPZlB4EA2tB!^_Lq_#B!a@P94v9C6Q7*_J-(7dfB--oL=(o2Ik3P zD%ZL-S=`KOovHPzwl0!$*qVD$YntVns>+_G-NFJzJww~shb=yrw^G+a%=pVYoT_kJI#{T?_w!vc-X*KU6oB? zh!Sj!xWqj{{x~+aEO~5^+A|;y;ks3C)iE#c>UsQ2kXkSEifzpV+f@?(QRA7C`rCcs z7(tCLCMCuh*=^>AdbHLTX^pI;N)2ia9YFp>^%Rk5HfM);z)Dl{L4d5zSs_qL*|W8} zwDj=@j-zX3V`+)?Zs=}0&!WTF`RR5lE6vUR*LsW5u&ug|$D)~;*M|rmjqk$Z!`=ZN z!XgaMD#7Pn9zl=6D8V27?$`H~D)qR}y}+~DJPKMpSqov@=ZG@@JPVT^Z}^N1{lb&U zi9kE-OvN3$dqxG>#Nx;kI#!gY){qjCM!OU7P-4ai07tF*8Q$Kq_&$9oQDI8cA8jqI zUxHwSsGeHo)l%p|gZGtK_{Gz~if{t~LJ9}m4Q`Rxx+?UIfW>1SHYUktB zL2JeNP86CqmhyWR;~9~nxUzDtY?@b4&mTY7<_3dH_C2>{HMLiEnLRQL=1j(Q<~{Nd zj6+GSry%7xEeFVtn%duPeqi^i+v+6Ian~%dpLp-giZEM|WY-Oh1DyZrurDKIvw$%G53V#5mrsE2>?B__~R- zwMt8f`?EO7sg`FBw4`#fHzhb8)iHnj1VhL=eQw}>J_-eICl8=-4YE;;17`wlT1 z3@;T~DM%+dbuLD`+lZoh!+-raAVU8-#$wS=2)hftso+~Qvw?WhjIBg#AWUw~7xrGe z+$$_i+tV1WhfhnYwBRI<(I95bIN#&eFNJqNdP&ymh9II zlPDfWr_r<_Dia;s3{M$X2WAQGgGPzECERAdCr5E|CxuAGY&iKYi>_fbRvCn-VG_+R z^O!{5qb$JxKID^iLqhi0=DrWQ4v-MdEeV_7dz8H-GAI~TaN2iSK9-8DkdRveYTTtD z(90lvwI*jqSD$v@f9f=wsVZSy&ZLsDc|~Dyz6bKsNuZZsni1lBb$$=C@vlgOFfvRz zZHkyo~lozWt608>?Is*$+ zYBPG~G6TPz#|d2YrSF4G>^qG=qSNyU+{C0M;Q)6_>G^!-6WQ>rJ~Pi{I2M4&1BSJ>{~)q$X#(%hz}QC zsv}t{u2)9qC>X)Oj)1QHiuYow?NLUsQz@St48^RFA5M8LVW*UalgP_MGslA8grD1P|Nh2797or# zADc7jjixZh&2n;cDjjv_KyQg`0P<<5i&0B28P~2KL&5$#c!o8$o%H6WgTl#RGs1Gk zt+#b>nz#LH>?{8r)j~<;q{|ju&tQ)m3pBxs!_<)A~R_c_DWj_YhR3Z2Jhy&siW3cNw3$jMG4C-*)8HNt1Y!H+nz8Vg%`cM?yI+jrxXSA z`-3;;o@F2AylMSuiG1_$pEA{+{PSQ!byg8S876Jy7m=z`H68}4JrKdZCmF9D%o*|b z%j4sYOxL<%VtsClONq7~m&@6vj^-S6AAs)fMg0AoWF-)O-{1R)agI}HH_5bM%pt|Oz}weKH4eu=P5XR( zjg!k1Ef3~?kcs4&kREwD23Wy*a6hFK98YBzTxO;@Rblu#W&8y8IU}+SXo5{kQu1NE zNlML^17Y~-hP4CwVem4>5s}TGFgmGwN5+PxG)tQ#fA>;6zdeMf-+{9Q9{w0m5I;Uv zEqr-Qj1e>&N*g>^6wDEeLL*)sOhDT!NH=%6FOGh@)5(_tPAnLobz=SlZl9fD&e>P! zoqZE>IuWPR$RKBmJaOU+@B#4^m5Z_S{rC8Zw9o4m+fQoc8}h7ezV)5r%8)u_?H)G9 zBR_qqaWgq7-H`4q$k|(9&W`_n$5kUVi9fRVNbFV^x;dKgA$1|}7>|pvzSKGZ)6|G$ zR-FgflyH4E>i4Pl^#D}8s*Ci(_x|==yZ&`A8KGsV7&;KiA#H+wONXvbm|ZzDy}-b_ zQR^w(tkBC)t$K#r;TAATw6(W{U98aJ4=JT>tJ;13*3Q#Hu{A(9LnFM{KD{k_o|MoD zTt7HiR!5?gIv}Z*Q5jB#bRo;IF?zF5j2u`+m?G6ghECy$Jc?orB}R-C4t%BB%b{pt zau>z~qe6v3lUy-{-??V&#))jAuhR(wM_h{MN?eI6&EF8911Gk>hNGn_Ya4Ta0SC7f zZ*RX)+i5u7%3-iDN&Ym8pY{9+@qx;mL34I2_BKnYdmI3T1cA_f5m@PxinzEu4!y-C z;97|LwJ+`o-7u!M^?274X0O$3`ogAQu=W0ChKey#Rk3ma5Xu~oE9v0@T6XLAM9p{8UU6%NveVf1BuZ} zJr|nFD+LmO-11QKfkNO;I8mVb!3LTf;T`A7fUdKf;b`FPaOveg)386(2+XO@rMXWb z6Fa9|&VX>#;`cYxMpX@oroyat@^Xp>LHvwM(^$8oz;&x&zCU!gLs%PG=%4{IW2-Og zpdis4jgg^1nns2}mqpd8xr@HS*hPM=SY|mkGL3NN0_))UV~5I-XVNaHK{e%5utXZ( zt`DK6`k<=grjebWe1Kj_Kc75=&b9H zAG3eU#zI<%f%zhq3fyL}SwRnX>0J;S3Mdp&{uC;`|G16L5wv^fUX3Y@$r1OOWjkiN z=iMnC@r{a{1&zNmb0OR3WPRNHdlet!SmX!P^hS6gbb1qesV0CeKwb;ArON7x~{RNaX9V5P0NZi{3Uv$?U5CB7vl)K>V zL;~nl;yX0z$Y7#=1pXj_q%RsY3x}j{L;W)-pw^Igaw1VbYH2K1+80lY-ahT!b6D?% zA7C$-c1lk$n((_LjZ8pX%O~l3XW1?K7fsdDJcbw3@cAv$mjlVNUiDj=c(E^CK&|NA z{q*Oxbr#)^!tvLfbKk*A(`OrJs0@#FP6%Ori zqJHQ=s`P1^NY}_5(TnMry{6Cybhx^PUCKN2e!WeZFWCvkL>#HWeaHdUDTO(SOX`-4 zFBY`cr{ss#T(4UDe%R-fF_}Pe(oypJOs@w&0KxQdgYu=o?+!oZ-vWcA@9|cbfQ;|4 z{@U+Eg4gB8rf-wxZt`yxyu5Fr{t*ZO;p5C({#NAcmT#e!$ac8*Tlo9gtwJB>#>`jt zc0zH;ywDfV14IA!e%R|vK=yyCOkv=Ib5dCbVq#aauvTey}yk%LiX#-hOZBYYywz6R7~;i}oQ&mnY_H zI+4Jk&oBCQqnIDK==(-sx8-@>06`SWwD))cMTHNcK+u5UZymzA%vX|PACNUNfhL7* z{?j-VX+(Fm+X*LMG}|vnfdzqUnA5T=v}e`Zq-Tb3eTh5B?nHv!Aji|P59Dl$7ht<< zWL5%Oq3&`VItiH>W(SY_YTlum;?I?G$Z~gtRlSL~lupN#DSZMO$agJ4- z3%VW*UT4YcIxXM3&%zX)a518-gzv=-4y4Pyi}MvowRkA+CZED1$xR6Shtn~R{n^*~CKA$k>?cp*h+La;?hUGcOl zu*;M@%)je4$!DFc(S|fY)ws^C%UG<-UPrZc7~w9N`~b`AwCqlk`YpJsI5e&kb=|a} zvmq5rhMJWY^aXta=k;wC)Uspgcet6?)xUa!eo;V|cos9YJsks?yVM#rpa=R{l4Moy zt^D;clduGL%`VBNEqLcT`}*K7=U_=fXABzRdWn8j@Ow_?B7*&-jO9^2A4t%W|S3U$o&%IP)p6cJ~DOd*$&( znwTTHJ(s;LoNkovR_VfF94hpKks0*WO0M+%7!J8YGMtk}V*G~l9A;#L^o4;b(TE!T|d?$HB977|{PYMItHy`ZpwRB=u zt!jlqD6G!kaZEni0wGp%ienMkd~?+z7RSn3m!8nN-URh}N%dKi*I+n9j~Eg^Yl8{6 zX!%gWJ{NK1wk2SEo*KPkn;5Bj5q3K*SK3=M(j{K0HgeY?Kg^q+L;?FBp2s>fWK(Ea zlp7no5%BLk-Fe@!H%TVdc8Q+GM$rf3Je>r?OUPRWpe4XKf4E|u`C9g)Tl7BtRM#TZ z_;Ci9BStl-L&%pYN1tr`+bPrsK=QwW{L~6iE5UM;AUjco9k)qT3=+d7BVqi@ zke$hino*UN6MK_<` zSEi;fHJ2NK3!hK;KDzlnWZ0`uHAkOnG}Q*CH5v>7Ux`#g(0fM@)hm)lOLuf<+wF6w zrzW`74ahx?Q`o+jm1r~^)kjCaYOgN07B<+r&5ge*FMWOGpAIegtUH{@mSrQ4q=ctR zFFzl^WHqH+6B#nQtu+0nUvm#|BBv+acZ$80u}Pb!qvm&yWRwK9kDeG#PW3vA{n)k| z-}QS?x3;>C7GL2uJ~njUD_!3kErQ&phh!hR z@70%ZI7=>1)5m(fR>R!x-T+TuD1`>QOMP(g+op}Qr~5m)d9%^y^(>oEn~x1|^{>RK zv*!}+=aHJvpE64~EN=xr)#J;CAfG)ptUJ<#&{A(^l8cFXw-SGO2UKsq;@~nyuBHZlI_w27JkN1z}fu zosLt9a2rW9n~jblS0ivuUuYXQRfMX^Xg&iq)o;qXK#ru{1$tXK(DFie71+2xAEP2Y3Yib^Whnr=hS;j)zZ9r zQI62NKTP)rU-!(k_7A)4BCnIP-ypP`Z9Q4{GpV^T`v6nEEXq_Hon>%a(eZ#5tx9`D*NqOww(VDC2@Z$gtfJi9Ly}&(gHMgJKhK^V)8{pH zV0Bh%^-7z`33mD8>%#^Pxq$8fgGOtq*N5lp?LFOgPO%V(WMi=Y)>^mCqEp|W#?9<7 zHJw(&#SXOl6*67jsvmklx%Vooh$OQgO}4#~&n48vlUnO<*$`CcYHCR&ynun;k)!{b?!_e|18mH%f1pZIM|FNrD)kc~!z&7dej z5{5SMqUTF{RLM_#KLaeq=#q{0z#kVYiXzOk>C0oIFNKw=rcC;pT4)NTiBip;{j}k- zsi~#P2I{Hmw<%~Rr!LKUcWgzM`tah&(vpisd-3%3;VNty4!w3OW>z(D79>l9CJ%t+ z!@RM2T%V6XRECm2qPvBo%Lj>bE82fC{-*uK=->Qs^(fnanI_)$LkIq9{PCP8*7rpV z@@bBAEfD4Zr3v=_{}(CHfy7SeRejPy$xXWQw-Fyc&ZNiazpbxuWl^zdel;uX&zT3h zv_gzLQn^2(gui*7*jn|h-x1T1q3-zwu_oLJpT2dx8=ZP2kJ}bD94sH@WLD{B&O%)v zNj#+1`rPVxP_%w7_f9A4FxOTKsnKN7SH=GXfN6Hyq*lM4!SwsDV&yN~`Z^*l-sG#9lw=fk5;^ir~1>*rG2Q7u0{Kcpcq(m6N$5p(PauIeU z5C3yHnawI3VX@%09@yb1!5QHkz=ttOcgOBYNc?R8E5!>d4u6m*VIeSPD=?k;6yg>1jiPhX!a}Re{#C~q>D_}Ez-6!!)7tk%`WS_k5n%JrA#E`u1 zk+??K{*b6m(QcZkP2Elec#xrIXxBUa^s&%;fp=f&6&ZAG$jjGb1f^B_vWE0>nuKTU z?1K&D`fNHwn@{Eq`yvqfPB4$mpNrfGI!VtMWB?z?HR;P+%zhUG;sq)l zNMy%@iN*Us`2P(hH_$B5!62zXq`sygCBgBv_*-_P8Kg%z7Z6xbM|;6_ocK4mu@8uS zUr=s)r*KohKeVAQGZVgfCzz+VCUU&hI`@O*?k9uFM$3E^LfK1P3@c|uogRAx9Q z*&y}Y(0v;g95F-phS+vQa%Bc>7{lGAI;K-K89Ou_JZVr|fvjNVME?+}^0oxJU`3)} zXiLf;1%$zYic_S2h1?qu*PR@K1nCK3bH)%fvr&y-i1a0Ilao`r`(D$*%Tvv6E-bC+ z&ukVNz!j%K%6*8k;x-`$1&uxxEwOxP{VdEH_uCEhG>amdS*$6mc@J3xxfra$TQPN_ z_C3RR=eynP}86O_UKloL`J81Hky)-7}27hxJ?@cFU zhxOwchEvm}d8K-!X^IrwO!5F7;EjF28)dkqQ&`ZBcEM4Z;3D!si382Ui;r|o@k-u( zx3>%l?e78&HQh8)8|=Gf?j?}M>W(Rzyvl&Fd|tlxg7d8%`2OMffW}^soT|G2tryVI z8#vNeM+th9W8m3;4&;m&jjMI^)4f%9vKHX#@coF~{qgU$g%<{TV1vS|wS8UC^~Kf0 z2F6V(?by12a|lW844OV0U}v)QDgz)}Q+EHAA7&`&Q>>*JvIObAjAxdU*o@Zw)u8ht z#%h6@;D=6(RYawb1}-X?d_dnm@Oz+WeCYqse^$isAMZa4%IHb?9|DOZg#6>bvG2Hm zQ41IX;tiTnyH5w|kQ%!ecv74(tIwvCsoUVS?>qBh_^L1?Nz=>HYWH)^ZRb3y=F0SUqZl@|aZ zqY8omkplfAl>T5ql0g56A`lc%JkURq4}=Uv2>g!-=@SAUP~^XZCFkWI#Le7F{zw)Oo*)SLPY|3c0P=qYbpO=;SD^K&W(H0;r()m>JJy_{2~i3o z%aMM->cf;S&nVMJTf&s)-;OE^nLc4LDQ18ks0nsxgw295>CFh!rz6?v3*Ldd?V`fT z2UG^ReGin45B(qd&x`E*%%^)89CE}4bOXT#EI`Ds0x8pk z{4e4NS{41{zY$c@7WF>_s)!N(#{*Ts5jHFR4{nyjZ8s@#V)?6pGGboSfzE@M;!HYa zwqVLqq>~w>&ZW!r=|Go)PMWeF5;MZ|(}FlN#biL5@u!0u&=&Jp4#)2!wLOaZ*c4WGmO?VjOH`*mNVgE$82#rPdE=dR6w_Y62HpK6}ltr`8W>%cm&YM>kszcqZ@k%~vIlt>G~}g^vOi zKEbPLN}aK*yv=-Vc9L-mgU^jb`g~na03v-H&e2eBnSKwav9w$MI06xVEOEW}527to z#J6suEgc6n*q6C&T7uh@Ko;9E4!rDyn8r0{U3@Fb4o zDILUyJ4tA?la#OT{JeCa`Ayvzse+}-og!YMOr^?2}~U6mF9mq!xpJllH~Py$h*LPy`c*oebmpb72l`QbOVz` zbG+#C;Sv$&_1wU+LwqG_1N@#tU3eaatXI>BLnS- z(gvK0R>YwBH@&R&Un5(+Nhk+%9GsbIQ|a#tkghHwE`0A29I+T+M3k7n z(}>xtegXB-w2t&lL*J?ntR?_dfsjc0kiR4 zjXee)z|YIJv|6%#bksItdC&oW`Ko}uWsK|ZP^23y5i4~+3TE+F_GqU7(L%*+NiVi3&!kN!X8W_sTDABbhJ4|3lq7g=rFOiP~k` zwr$(C)n(f@yKLLGUDah*b=kJr#Z$d!_Ut|9pL1@`)qfFBMnenEzMQY%7qx}GsA_%> ztL6Nj=O_3@WFNde+VXzXRi6Vlt;GSQ%h%xNo{uA1IiGqOy?zf%mHbZ=mHaqeuhK9d z*>z8T)L|;}#4*%YiTuj~TU*DRx`2+SqpKt3*I_TudKtrzns;xoS#8*4|C9N!|7&>t zmz~fnyBIqEH5wI17n6UK3K=+={2itLcXP3DbaECpH*oxG2Qmi#nP>mDA9V|3XLBcQ zwr`{Pe@IaO4{iVI{r_Ei-T!b6|8iRdEPvga5){3PovN+HU#lnhc1Zub$Kd$aPx_x8 zgN5_2(Es2x=>J22k${PbnVIR|UC5%hSCY=N?)JyWmDAOv&s4YD*7a)k>hsmb#f5~H zrj=%FbCm?OHq%dhiP08g@{yE~eGGDYlmrC)8w+7ccuGPN8;L9dWzabl5<&`;K=`5v z?7V|41rS!=(6;`3GSs0ksm2dqzh1BFjaA)%b*EQxaktv5w_6|Ip4e@l*K)TURHcDf z=mPt_6f_dB^yDRJX++IiV{Ht%=W+1yc^8KHOBl?5={o~pRR%&_4sVwXA#UZdS!`rqjjHDRm;=49(xyGp6lBmB?KFl z{k#{@@;&>fqPsKrD8Y%G8-Baxjp%%Jf;|xD_I`o`-#cQz7waqbyHH6r6j(y?rZdS* zxX#xcn>Dn1=W9@@S2TMTaf&P+~E(L1AcN_QWA#$#uUo{a3eX=2#jP|u$i=@XA|n_ErY2JcK7X5i4w=o8cZ_@SL`?YiXj zih7B?^$<1=5BX#wBR7Xc*=CHH)2j-~7(DdEZ@p*k4Yq8X3(8mfHrod88yIHloEk3p zdr)Wem(AI*vc(F=O3|j*qtz0BnCH(~(Kw@_c}5q*dHuwbk(T}_CQW;Oy>Q$VeR7w+ z0P%g+tF4Vn9`8IaAX17)ia0oC@+HkTC$c8|MMhNIQ1)6f_rP@NyhiwYHgRz>F&T4^ zC7eaCcDq|*B^HTFkuL(tWn|&h5Q$A1YTE|gRJYZ35gm7gaI8pghKFlmQ6<{6RDE|* zw7{YwR|!V;UfKAiP$l^wxTutsHeRl@v_T~ldv`Ocz{2=Z(}^ZAeI~-1y4ZMc+Or$% zI6_kOdqtDHQdP-h5!4(geA#&tE=KT!2X8;R>waal@72l@Cuq?q_KzwbIA1+>QS6-{ z$3UwtO!dd@Q;Zi)fAJLg5l{2;6ENTPPM8QDZp6w?fsuQA)i=H*K96_6D9_8kCg!l4 z9yd8p+>`N=l14(In$){lIvW0zlb7XP5uG15bZA#db7EaoQBjtC?I`-GHpUWplpopW z;P}21`{cM0BL$&e@Gk%xuFD#p#hV* zCY@2T*x)Cq zcH^Ueudmz4IyEOE8c6)owKj8no{<4m7-?sgF>Fn%g4Ak>Q8PecsD5f`AtX;0kv3xr zH~EKo^}_q9Ga~`QoSd9gyIy5VZl_q))kU>xQ;kkudo0i(g@yy7D45EyeE$uTxBM6; z4nn_-hh8DS_ZAHGq!(!#x)-Tbk7C|DuOT`gRSA7I_`v|L5Vh4Xz#klpvQEs}kO&}2 zM?Zy3>m-12B2;TZSD#%soD!^6!Mq3vjwM-);TY%S@$~&-ay7fG9Z7=>3Oa8z!;(Tu zDxF(}Zc!mgp)}EBB7?RSUS%A$UWa0%dr~E28n=4Usx)4_!ERmoPrf3hOhyU$y~&J| zSpx|QS6Y7hJtbw%$7=f@PS;TmM^8`B*NBhcAL*KfI&^OKInb=RWN=Fr$y(jMuKZ@r z5(8hSic<=^{Z5TJ$BHv9rA!-S{YOXBQMrK3>GvClV4&diRY8LtQoV2qz3K=ZaB(w{ z7{fZyaWjxBOA6Rf2vw_ysfLqSj4b5oXZfc_AP0s+htM`rL_nN^CCyDa4@eOpl6wVL zmXOh1QtgukY3M|e?~S3Q4Y_t1eA=_#K}2W%CZ?eqZU+ z8TrjW>q+`V*6q=rHRcM16I#bPrG^Zd$VpF`PmxpJK4#qSJ3Jngp9s~%pDA60+-GWk zCIt=_}f5EaAMRJEF&;Sd^~6ViJaBZTG#NHsIFvALAA;pC0oCM}Yz@hWFxv>D{ zjzp`$YD&#{qwHP8e3Q|7Fjot+b~&J}wDJUlRElLjqS!VJg=8C%lo0Rl=X?*SI*Uo6 zY@x$FWhuxc2Gc+hNtn34=zfKuG6hiY5Ai%f@Zd1eeEdd7;ixKxcD!dpB*?PP#@Q1J z=xmM$D28!&g7U(F@ge&z@R~f)X z92!3h!c9xJr$oXjj$*T8kgo))ufeynFRi$op1*)Vq# zBNQgEg~Sfi4mhR0XcEeV?(!2<0?-#lM_KMwzNeDMFHMK!4_5W5;|i0PA@Kb<>DEo zhLG6Gl684Y*6lqJ#NzbQ3*F3wf}_nce01w@K#CJ+sqOk7kpWQpDs?y1I}ZRL>Lxpz zuDlW%(lYe_JnOi+WcI5iZf$3#t?xrsKuDKdCc<2-tWr_p=ZPfU(Fh6MocN7G9-cF#I5g^ zwl1kQe>#SfYMsWisI-{0my#$cEmk;U-!Ur8$MOW3-X#-8<35WG>?es=G}(kzqF9gW z`g?~vepS5k3(UXvT>nrH92nB8J zS6hv9Tbp=2(O#-$yGl=~xH|@6BwjEgXNcptsIMLJRm-_t$0@@#%$|Rl+1|8PvnLlM z#|VT_a1u|GeKBa9{gJovGE2z>Nkir$=fd}o`m%Hx8xRpbtRSkRLJxwt6iRC7qpeD59XgTpu?ge>)E)^=gwPlB#`mBu(JG@3@s!F~o- zyIQr91cRDAQ&Jrw$~&8Y!{{vnJMwK*KCGkY*Z5XQX0d?ZFpUA(03GhW#$fw~7(d-< z_Dq*gM`E;axK0r~@0(QMm4oYWq^I&QbLdebsadCt?KD^%TMqK14N?#V>Okp1##ik* z-%~VBU{xr;#~F&m55nHHyY(Dx*+c6oLHLk1t;CHE6RxBZo6cP^$6qI7!ZprA3^0ye z&CrD;8{+**xQvbdt&s1B7Yb3BVzQ}7klGO<*tMnTIGwv7Ty;rPrX&$s<-%%W3ra-$ zqEPXa{5;x=EW(7hxqFzVoufsnD=&PKbIJq0b<}dqHQOJ0+tA)Lh8#iiKFw`VXzq$Xu6!mfijpOD&x!2i90Jfgl{5ZI7gi)r)Q#lZ&`X9LBOGN zFt9~iHd-yw7I5WN1N}q*IU!V9U#kB8Od@NkfiV3g4}B78-EErBfwaVwxNO^CE#ipo z;6jgL5T!=o!+Q^|&MHRtii#+8iy z$ueXkOuU&up-uaBE1TGEIP~FXq_$?rOp$;NX3$;dY~(>s`2oLh2`5vr+l`ruM;({q z6U=3yE>*?>xLke?;>eqagZ~I8vHIaV-eL_D-n0N9gJm<_AGuN{lYM0G6i1v-KU+EA z1=QQkfrSUIN0Y<0uk?I$C(wpxi)H%zg>N{XFisS|7Brv4k2M~^Imal-=uFzgH(AgY*pWrRjLB!QwB;um?U9|Vb%FwKxFid zxS%nlpMJ<9;<4`B-~J2Ad=-n)rN5~ScZ!X(*g(uZQhEHBy~@#7UqlE%)FvGWL8hv~ z`GRdZs%16p-~h5NXx3{;SB-J|KM=`AqypF!hh36JrNY@{NYroNM) zUim|qIgybW$s8GSq)-sPw6{eCbAjL;spLa%U&0Ax_6-OBUGS1fss_AkGG+hYmQrfC zDf)B9pAi0^0z54_Co(URKjdE}r~2PL-=@WU#-c@nNqg#rm|Wbv47;nFDw>1#H(CVj z^ZFClAg9#Aj#g;2b#OAl&mMLEh%_p!DDE=w^~O!KRP888sree4JU6z690T%&xWjbe z@(9}wKWC=QJpgJIHQVqMnRF%`5K44zlfwyeDl2?gO)+s0dlK#iV1}z@Jx_v z#Ug<={X!WUU`l|1_@(6MrC>@>s|3eMa%QbE_dt`l`QuUU2<_n7F!uL*I(G=<&7EKa zX9{k_c=?7ls6{?&h6G6$3A)P<`4f_4iI=t-;a}wo9uQwmAae$V7H0j;$f|0*Ie+*d z8*AsJd61RW-BVaoNOzXV@NB4~<3W4Z;q$?FV5>-4GUbxE4l#9Y&4_}5Mt*aX1GkXA}dH{J1GcXykKJY~B@hnUeEI8qljfETJy9f8GgtNQeT&p^jjP z4yT~M^S^n^n4FaV1?O`E#hp^{c^gb42Q{%%ZQCWc@W5)I$bmeA97D`gj)9Dm8<5qkPL5Uvb4+R%Q4NFV9kq9R5ltF=B&8eHP9 z*#qKVv*m7sSuieJ3=g7^J_}_`rpw+vw!45`zc)K0T86KphNi5^TMmr-)B@IvJ!aav zR*x$_>3((PS|tIbfo520C;a|`LUcDZk9d?7Cw2R3@OvF#Au~v<+Z|zOd?^ihortc) z;I1tL?9XU~%6QR%tU#U$@T_5e^Ti6Dba0$>5jNzUnrnC|j4si=zj5u%@s74EI%eo~RqZk;g1A z#1+WSkB3I2lJNn9dmlY$WgpSYPPAgos3slxIi#zq$0Qz1fe72*mJARv&w>JKDuwn7~jq0kERk!Uq82$9;NN?)PAPY~EB zAwWjZBgfS2k59Cl#}?Y;LhY9>gAx)MyumKuPx*Pxt1wWy^*7effgtz=YDB%4i2PQ= zSaHo(**GCH@;>IHIy;z)`BH)9HNh4W2PX_fX-AiCd%P!Yo7C7%w1dH%+0>fC!=1Cz;d_=|%n2mmts_Pt zAq;mSX=#(h8?x=zLSh|vW?qSzN+K}Gme)o5S|8YAYv2911Nf7XV0b`qaRuOo=@9qs zjQ07mKSh_n3yUORJe|sgs}IbY!^T{$ya%#$%{V}pT$QP6Hm_Zm5=>}j?v_9}EZFc< zA{pAx$gPpmvsK0#hPz_PnL-ttFbWymlvd;ElStauf_U-PZaA+g8=I9+iGZ|b*156E zdDFMDUFZAk>Rf-yT_FW2al`ij$&AzkGRY4g@&n;9OvOj0Pxk-0Nk57O>gu1^gIwW- zfOjER@Y#=!c7vo3w3Q#Z>yPKgU&7~>o|I|z5FJ0w+CB)EKAi7y4W@?3)(LKnIK7E& zenN>96|yv}*5P81ycVlkHN}FF*vdBvt87pQsjnATfUK4)N9`AqQshXPphv zvRZA>DJi#IyIc}>q^T*1LRl3TDM|sH=gPLI0UGNIt6_tVth&#;dShOFwHZ<}FtvTM z&ZTx|XpJry8!GN-jHCZu(G0w=--C+WtjUPVEi<6z9Ji{pJS-kHWMnTv9TsypSDO-+>NTSL_X78ffvG_zaTcpLs*qHqpi zRk}>g&HCaJ9Bf&x5Oeg5e4BYLCt33Q#f%BGq2{FFiku5tC9o5J%Zgpc zZ6lilrY?4#`kvhn6ZUImWhFNI00|DL_e-UI1w$6y=^`KW>H7oLrtH$Enj`^D{T5Yp zWBD&K*CwZie8a3H{SZh7r1WoHdBVTkxLqxF0M%*YIP)-PL*5I zy9VxfNz(*(%GQt}ojb6mG3Mw%rd6zZnt?CG)d$gqBn4h{Rj z)Mei2A`Ad@M16_y5zS^X?2W3;asF&5keov#(2(U1K^cNq zU8|TY@R6U=kVk(_DIVC1k(MsZsFo^IR!!+=w4dIE9j8&N=QL;YbRo7(|Kv064ssVs zoiQ<68W~=~8k3RgPik=-VV0IYC&hy1gDPIfivF0|bF5z(1H;OXaC(-Ny{2#QRc?zR z0l7V&CQn>Iq zXPJp0U07q=0WWB`>vp6@oKK5N=1P|l6}FRP1NALnnKWOHuW^quF;d2GT7-}b0M#S9 zG1XuDf%9$?Y>d!cg8aByYzTQ>KK8}BG1wu<{we1k@t!}602ka|<@=kXy?C>6(~0d- zjSlXyx%?(!k!ul=oVe!3CA+wthk>q6Viixuqh9spk7N_S=k{m?0&m}s=>{i+jEahs zMoN#-N&TYLJGopeayn zpo6K$bQa4l(8R((><-R&USDP@%2*rzneWB+u{ZJVi=10`v)@Ef*i>8(`@`ey(_srT zM}Apjcj9JJdt?TU_!S zAnPOyc>y=U`&UCmxZ;~H$=5F_}3l@B3?`3NO5o{%O-+N_i%P3^1&aZU`tL1=JVu6f4adtki_Rb)WJ&&tT~ZsKKhu$_rn*ssPc z-pp}#b~zrCGGPh{QupV7Hrgng=*+!v?cDo)@Jky#DJg2T-I}R{ZDgCjmjOKTXPQn< zmiICj@9PE18}Az$6>-gqm#?X*X%(ld^Z017Qaj0c*`TfMg|mmiOGsG_!c1@f#8Zn~ zjDa{b{ZPepS?spTPl&M=)~ypeK_ue+*aAi4ZYsFoHme?Yp!hwZj(nU^WEgAJa=N7$xwlQKmMr%L5bYcTVy z2IW+vjl%EGj2Bn-=b7=p>vXMtLn3ghxnToZb+g_TPg=93%Lcv}m-v9>_uy^CKUe3M zkel4i?(7ST2%e6t?T2aGu0LvRy~OJa!kh>$+YDHi0HPoV&2wi!Olrl&LikDaM&&HP z;+mzs<2htqPQQ1QfyN|0#tgEekbUovdVsvF8q^#|-C#|YhM4e`h<4EY>F=%WPF{$( z3pp`#NWqUP-&{{7``eN4`aKA^l5LT>KBJ#2jGa)Q;OssKeRB*(L2Zz#+El%oLD~(8 znV-gMM7ri3pwcj%lz7uQi%SlJd{rxI<6wPh2L(SC6#`5CBw~_h1j;!0faQC2FHjkf zVDYNHs6_Ttuf(l7EgTOe8Vis=Q++0Ypl{f<3+Vk~J>*z(^*HB$lv-h~VM^jdGt>0A z4F;F(-@$A_sSKgL3LA$sV8HbrUzM><6az>u80mFftrU~QvS0ha`D1hTe9BZd8yjXe2B*Z5iZyYJcWsA z&Bi>RK;od1C1E75dBp>tFDP=EVY7I#mNUL(mXa#3QYaQ7(~%Aqfy2LIeL;7@wP|@d z=GkmKpHdMnKSm#Sd>WZISXnl-N&)Tv{_9=gg4c7?&-m+A^qc_bz_{!<1JV=jmvXT* z`en2B1(97>QMYN)Dpf#xwGp+ERB`J{6z={3@d5dX9k@JhzAMb{SLjSduV?(#UNqsy zo5;ae?JGk3-S8jSg71C}mtyXEO;3>iw9*3~iZP}qAcgtxw=d>Jz~iTFiok~yT#yU> zX?f0ER_q#hfhyyN>zQJFLymKhn`-V7V+}iNX;pZz6{$zn1NOzDp8`XnM zGC*TuK-W_;B_iT7tl^<$`V-kS7se;kXd2oG3hL#`cR`IS4Rz`Md4F^wNfC;%HYq#o zcfE0;_u1dz^n5(xYuUu^8vfjN`{1es3*hwud~rv&chCTgVOQkbQuE@RXJ`ctc=9C2 z^iM5RGe|L{R;Lm_Qja-y6m@_us9iosk8yBvdlza~A)~yTFkC@palhEX49^CD=B*Rr zi%QJ^TRh zc3D5l&sUBhFxD9mCUE%4$u2sPain4D=vS}ML~E7L)(Bo8U9VS@wHm7lr9Lt)qE&BW zje`;C=@WV5=pp63{e$8T4N?)0ES)0y&ktkZT>qof4inDbt``omy5m&oVq%R>D8W$T zf&e_pCM(@cnmUt*mXO71Qx8_mVdIBLy(vPZx|`*koU+n8ZEL#7gN6qh=p&d2NIR9I zt>B!>&L@s! zGc(>(5E+2k((+*{mJnnw5P{&#w;j@Y(7+L|_8t5_51jvG3B)~tshmc73Q8mdQdgQp z3)ObFJ}j|WIZz|-d%;O+aAQ&Wl_jAM=0l4hSU7=pK<-%@Z%yO+)OF{JpXF^OjEXPT zHq#96A_ACWY|*Dk>fJL3r8XnTloPREFr)8oA#eU_w{8}q*GP~eWsrrM9B_AHNN}{K zuc5}*-6~a}MrIB;(Wucs&#PAv@&*P;RcKR(6+@xY!hNyBs2SN+&B^@9JPY;`QHPkL zDzM>NP`^xEz-V%@R*;un(8qJtg*^t0%d1HmN)*|?bQ7aN)g9$LYaX1wC-WaPRh~D7 z?~SpFNC3l^PG4o;&v~8)+MVcmi1}2y9jeF6?g@8?cG7AVE_Q#EzMd53em-<)RBXMl zaD&N=U_optB6L$+qZVOmWKdgEm~qmv!?}qtihwDW_@tS-ag#jKvH+A|`DP0Id4U#8 z>)RmS`DNz=e@yoJ9QCXT;N{45-d@5&FWfFXI)A7uxZ6Zy~pox=3K ziT^NCGqPpNh=v?pa@TU%5F?)%hZkRCCHF#!L3YC=jiTE<0B#mN01|RY@RF2%vk{6J z=2;|}gAWu$A2&D$6)WR0;`s5TW#h)kMv)h>?>b}m9{s{R;1ODnk8S$U>RReJ^$l!Y zsfQUcz62b%p4-AMd>*{;w>{_3diCpeD5m?jEQs3ofwY>+a95gBt$76Xq)%z^6L`N- zd=ep0-V50A_D9)S;VI*V*g5X5p3bCeRIa%zDE+q(%vO=<7ryAR8h zmy2?R`bqhwq_Pn{avwfOv^I+xY}8jUyfU}c9l{{GuDm}c#FxkY(@Luq>#pXdA04;D zfu400p)plG^7Ahb2o8xZHZpp3b3UOzLGSEOhB!@>iUo2Ua0<7|3pQT26v3TY-EAH62t z4k%D3TD2F5@Q4OB(AZ5`kX}s}zS5<#-KB!kAQ&HHB8lQ|=&ZWJCG}#N1zMNj1a0`) zeCQKcx49vF`9@eks$Loc(0E2Y4)+yaOO6&G1CBE~r zjFvn@Y#e4iW(gMB(Z<1KB<6Y3Wm_JQ2kpFhP1x&;Wrq)1I~2AcSZDvo&R*R~!13`h z7mR30fw@vg= zLC7yU@Y0RQozE1{YmGzR1rnUk@R95;4#v4FXEgjDjN>i3joNR!F;0z6vDXGJ;mzM5 zXV|HFaLuHuen3m?0NIPW)p=*INv@>EApj*po>RS9@jicE9=4*q6-{t4zg5$4+q_D`puC;b`mvS(uz7HO#KR9KYSBw|dOl0kLkPL$mJcdZ6? z$Z{9T8UixB7$hM`6_NQJH?*bhC8EIJJ}56xLvkFzvoij{~&M8;x@q>(1vfM~Yo_6!(vqXGjsfUaz)exk)R z*Ppk*nw2`}Lz>DBdmQW*WlJ(}1R{7ZD7Niy`&QVmt$nl#331l-IV2t@(5uQ>9*mb&kEvy@11G!8sMU-9sH!C$^DLn;r!kw zd!ql2hja2t-C&jM8hOn$YdFbJc_G zDySF7I+uKF82bgMj;_vW8-b%M-P5_ z#7&dvN1#zJ$z-FKpUkX2H=i_qE_{wt%;pyZju*z2gN8fYSD4pcF6=UY>{p{1H;v9O zul>hc-Tyg)!w?i1(!>FneMf8XWMc$MULgQX^_lT zpG|*Uq?>$)T`%Q1e2&%UNj~Nto;SWuK9Zh0Ke^wZU$-Z8Mk`j`4$vIGNS+Vhz3zGy zPf+ow-)Hu&Q^=&BlRtajSEU*pYwnWIV$SH7n%4X(Q_sJu1hKvfPFc05aHnRX4u|=e zuVS{%PpiYUzq-1u3Pw2m*eL;tAP)iVdqjM-AbPPZp>iV+1|y9_AfT#lO{mI*2sO|` z3KZZ|NI6X1>S&-N2XOlvfWC4u9oKTy-8f=yDdKT9MY0sal7h&d}Ezndy~9o_&&$`W;swT zmwVV&{Y$#yaJX%HgwLFeM~SseBUD?#TYayZ{hOg^1#LJh0+KX_I;A}Z}U*_!M(C|ZgSq=DdoD1#}WI3Q*IRZ`d0=ao2EXDS( z5o)YcPY(2OYH(9H+upttkn?juyB;##IAw05j}3!=vO6ONTmMh7)_{-jH2K8Q~}077tJ7C{mSp?SPHUO8x&M~dJdy}sT9W?ja- z87<4L#@5%$8%WXHEJy8b@egwq9oyS<7R5DLoKxzZ`uS9bl4Ks|oHc|Gc)$EJW36wS&>(^`72}D0&ze%|Goh*&D@T?{L*;pYkQoF8yWuiz(;-x&0zydSh* ze(&<-kidS>)54K z=Oxdh>-w6APc30T!S7YAJYUjiF)^`Txm^l-7n@J6<1+Jm1^H4w!TxBxLNnFR;cKp@ z@&7$qX})sfntjTRoL=u(?7s#1tQLFze2V&G6r1t~ySlV@q{n*l$J@wzd{A-kV2{qj zF*shYvG*BA);%91CH7{gh8%U2LWz>i(8}*Z-FsBg=oteU~va zGeZ5N&EGu7f5>w%vl6g#e4|6(>AU_PvVZgcZ2#{%zWasZ;QY6`?|%N)|GVD5ZU1q7 z-+KSq$KT_B%0T@+GBSK47k@K2LktoBc<}-z?SN^M73E zf85YN@_*0&Cbn;-f73q{{LTDR_;2U`sSxV#o&SFshJX0G|Hd%gMA41KTEVTC1Y z1`K}yK%`$naR6-)nFMKMHbW^CQYrhQO|i1nYFQ%UEynmzOxB=eoiQ5)kn zuNlhp&^f2=0ycaur^_q9&Br7#PAdo42s&OUZsNzxO`Q+Fbu6Fv=lFiETdxO5OK#w0 z>Wr@U&F^jB+qvzXHrj)i;`>s(-rqvoNCt1){jP@t<@aWvH?eq}AnP|g8(q$~!s@2& z*ZBKwHkyv_^M}l-d_93VVK(l32CmeQKrswCxma_nRH1;#sXW{}ngcD^Rx17uLpUV6oiF z{O*UWLztC7RppZs*Nn-QAZ>8>^2-fS|5sd%`eGG;|v}-FHoES5-#}CPM zf?MWB3?tYpd-&ta>CvQzzNeElW@f-vJ8V@JPRH^(+7%|{<>a$Z4dO@aue>Y$d@CFE+w3V219I1BW<}77aD< z>uNE1TdebTeIpwOy~$P)^^WfH&#U(f-6meLT889=Sw)MM^r0LfYdvXVIcDJGeZvk{ z8hdoVcFF>&W_&z_zYL=X>w!$NRBQ5%bzGUDlv&W&;oO`qE3eUs=6=k`(Q#_zLGf7o z!{+_aRP)-Cr$N5L2}qvttN_izbBw$-{mqRGUVLoV_8}Qo6ceKo zr=Sn*`lH*praB|QAp<6tn|GDGGI0Yib6=c@e7h#;aJKjM=A$GN6WR*`#OPzd)lgFuX?U*vNr;sDLy6(_k8Tk4y!84!E z(nB~y1Mlx=JMQnR^=ipy7)6XT&fWrYC0k$YWyX5?0YnNRff=^Xb2u7CLBxK$GWr#{ z2IynHWo<`@G{k_C?DQeaYPzxv(PfxwQM0MYdced*Q?*DWp^8X@-5UQn1|Sg>IgoM% z;QPS-S>6{-BKvUGvL6>2oIrESbKPOvDf4>zWVaI*Ah`joC8H8ruyiqi)72!OjKl>R zZK=FsEBK-3OsFZ&TC#)U261weT?)uyqD(eSd=KCj*jJhVd4p0Us`uzj3rj`|@e@JD zQ%?>>rGX9zt9)F%qN+lWHu{Y;(Z5t#n+t(&$lQecbM z%f`jE*Fbi+^2TtAGTE_#$Y+`$1viKpLEqj72Ew9og{Vg|xh zS;DNZDrkNSI$vtXbhba9aqX0WXrNeIOHiI=No@0EVPkVOKtB>DX?rs}D|D%{(&}G@ zK_UxGqVNxBx^*tSzZKpwU~C2E`C@v-@8gZBUCN)N{fLCbJEw4x&j&F}M4>~{i?W^d zbmPn{DaBjmXg~4LjMq=?Gm=CB(CK)5-PH^aX0@wfia77!Qar-MPc$SaD{NQJTzt;M6YF?5Phn@zV~2lUlXW2K*TM z&&OtZF(MLqk{b&pB+PA$0RPE2Q@9EDE25i2GO2j9VP+P|uS>QjIc`I%_-govva67i zq@Cuz+7-o+?D3gRhbpGQYNor$9;m5K^dCSF^>_h9)_BcC$6aIS| zEXMY3(i!?`%`Azs49LcnueOFDC~5$v;a8G8p0vME@Nft0&1C15zPEI;M!3-4{-Uq9 zKX0bvkV?AkhMoG1H9P^N6y%Ax2HybRxIcOyjXIHf^@+pNx>l1L#zMu8mmJk7J9wEU zpE2aI|NIp#4TQkXYJ>qA2@vHks(F)HlbP(+uU>IPmGmjpI8n1lF)NXa*PZGqG2ufyU z48HaPrGX+ca1!*gz60693~MNWOpO>1_#^Ux@BvhB;7$!#>UuOW7y~*jpVB#!i}Y4< zHlnET1$c`nLp~57Jod6on(l@uZqo`woUbxBb_@NhqTV0IsatX~H(h=rywXbP5c z5lJLot07NPS}l(P3PG9loZ%kMg-caMRa}aLZ70)XxxC$4-2pGHn?Qek#l{R}h#*5| zC5kLvG*cHL2^B(C;g0xE$s*OP!~4m2>1^kV%N6pN1Th>3661(NuXln*@3p|H|b;-tb8^k{_-SmKOR|xSg2SUN>peA z1ithR6BAV=lJJ%aITdA2$)r-kJXC5?K}5|JS@-tQpq@_B%|7QO@&J0Mb^x2-cQI-* zfLu&hLNw zT?G!A-MZN3a6=Wu?70vTAS7PY{v0k7Ao`x*$={zc8EC6S9@Yo`F&AG(qwNjuz;5d1 zo>LHy&an3QnhlF20p5|L#;VODW6tQ0^aw~FPA+aYbBvAUrK>sH908?@f>x@hF}%#! zwKZ&7X4@pY33!_{5cUrEvaxKK)V9?d1AG%K8jOK-Sn9nk-uA_0f?#I|s&S&c;pFg1 z#H7P?Lb78)wt?^B23+6d86lzo;ZGnS);d~$@;f6-p%xHYGsr)p+Zc*qNwcqr0!cI5 z`|K*YA*Z$HPZHox`JBU&OLamCA4Yi$5LU^b9Y4`k6`IIWywP&6J{NL!Zn#>z(kFR`l6lv@ zm#8u2phj=S1RZwPSC|Rat!hm6-U$bP_5~ZNQ32B;dkxtS8O)`Pp_;A86dkfE|hD)exmdR`1a(&pBY7U zm;FqPA~ZOLZS-MsJ{(tx-s6_#U%2*-(|6(nMX;n~z_Mlu)9uwTeF@sqL*6Y^nFe|1 zsT%n{?@(WDjI7l*zck5q*&U6wx zHOZ~Fm;MsZTS#*x?$W<|L2xF4lYgA_c`_6gPKGrfcV2pExUR8;EO6V{VBq(*@q+3w z&WeZv(3W#Lt~F%{I%$`$%(EC{VUq=^jpIHFRZ73@r%$R#OqV{VOt6h5cCU5Ts?`R? zOA*R$?;Zq1sZ$;5PA%0)6&D~_nFQJdwf|&NOz-pp{-Yq@giX}WKWrx)_4XFzJA%h6 z1C0==m7Sv@E9QlWn@S9vY}7=mVhso~N6O;ccbcZOX_zcr6P12IHND+AqPuO5cTI%V z0X+Wdvi>A+D&L^eApr}&vDT^iA$#f!`NW< zg5s4l8d*f(uOe#j{pBe2n76h_+7iY0H>8uG z0YIZIff3@#gCH~mO|C(+%iHjJ%}rv}!bmCs$;p#hfLJb~{3E8R(GVkaj(vuJ1H>#T7BkhTl6egDj7ZQS4gW zl9OZ*U4o(_f<%>!f=CjOB#M#*BqJz_WRNTw36fqf96h+6_uc#M``$bI0W(unbys&+ z)l9=bReMDqzq2}Q&^Voc1N)Y-(QNvIY9_M2CXwCG5iQGJknrEHh& z%)^Bw2%AlMGz`2WGVT%R+yRMEPqk3t(hlCk#wy($YqyMm*_d1iOnmq926vc6DA`mt z??Fnne459`hy_(vbD_#QWurznTeY^wrbR zrUDxI`QURM2YChDbPC%i+#~dp|DfT_;HZ1jcL2io7ERZdGI-~aiZBlj{lfA3aUl*T zi-Lm-3f!r@ImW>mrK?SMf?5!_LwVBJ9@cPIHj4!##~<-Y1X6h!gq5X}V>4|+XLs*j zytn_@po~CiaD0u!rQ2+W=*kz?#@D!=v&*d)LdHx-GLoCpr~^4PPc%;icG?9^rJq*h z#R?^!Nw?L4CqC28?D%jTH8okil=dEg~I{qy0z9?>9wnR3o`Uc|(`kHNrJ@~64`2(o3#4;lJ zW#-M44&IWQ5$xB{GRaa_+#`KRa9^1jNIRc+?YB|lBo ziw;*fh3-s&-ab?0fuY}P>R2AlmFA0&$|RglWxeV%{oZA^ZOE!#S>^r*J5!g!4=ANiM(bzMJuOJw&qpOM!spx#zetykx3< zU2(Xg?#No|jL7ruF8t%c*+keC3+pKbw0g7!SC#6Euw%+l?zT$j%K6|I(>h+aGxBj|6}A7%Pp+ z^fwc<6YUbYK}!;n>L){{t4!{@eeyDPa&pR-eBscQTtGE0vO)f4Sp??A`*t+T1UlLMm8K{}nnNs2m zvF?&Pxp3oXy4>ywOBT5goa6WPLPxx)XYa0=#JtevN!E?i*lP>7QK3rclPhrkf?MEA z;9hupB2+YToR2P-Wr%Z)PBA*e_R8>8^Tu~0bC>yd9Wi)Bfy5&*cQ2d!P7g#erx>Epkq0^D*AoG3j3%8s=u)Lxi4jx_)q)Z zoI^aw&O7|IVr;*QUbwfnq_TwH++`bcHlnzwS)jDqI&X|PfMrVreW9B!QJ|BH-@9T+u6!gY{p$61hI0Wi;#hy^1 z)eW;U;V?^jeT=2_8NZh3Pt2FXxw$I*Mak{c$M&h;4mHe;3!<^5R5uP8w0ft)^q3+0 zh**os8_1X`*Ja*4=_7(+&>6*!Xy#&cqqhC4H%C?WAbsw}T^o8T{W$+a_jt)6t6isr z8>{cITiy{WN;WTkmbY)Oq_wh+)`>2b7yI$qSz(RCW$o@~GLAS|OC(%4Suy^t*bQU( zImx}ua!|veYhihK6wY{{E_gt!OFdjX)n|}RGk8obL zY2d=EOtN7`jh8?f-^__?1o3810oI9qU zK+8auQ6l!@h)bwbo%_t5Wn@=#>q_Cgv7dPvf93n;#6Bs3=S)MCw>a(TbHvgI3kN!A zF0K0{d+7znMoNC1DZ7JHzt2z$H?C$6~`P$wz;#OPUoAZYm>5J=L2uUSAV1U<$C+AvUxx#~# zuAsd2F<+j8#ku>Tunl9##f5KAL^TlHF7nSzb)44$)>y@1?%HogBNg=10XKrqzkCiW-N3Jjndt_fJugA^D&aOpUDKFVv5PEL5>DEHNVi>pi?1_iXR{H=?*DdvQ9h_Z|LKv zQ!+qdP#dABtatE2*+)t#JzL?A9c(;no_d|NSMF95Y}6xU zsYmBKHr7X!->Z}&h{vU|P*!N`xf&g0*kgP%B(?s#uc3pl zkxB$_l;(oGx$Z}LCGvJ|&Gn`tx=M0ZHyVE>VZL*V3AZU-4DGvekAA_br?zhv`FD4~ zkGT0)PQIsnY3!0Pi0waAmcn-9-4LbrhtWhYzUY4D?=@fS)5(m@o-=-LNSf_G-RdR= z6|uY(VByAKJ@sh6E%wyJrwGKH&E8z!#nT9urdYC>)ME431o5W4u#Vt#Z0jax?QolC zGP%-Io;M!zM?B!gD|THfszJ)4Z9R>I{VM*viq{AX$?paikv-^$n`ZkHneM1##iJ^fv1+a%Bc* z8+xYWMfH0lnnhHjQV-q5AEIIS`hvD=Y|7+PP%Em6d;Yz~SMG=NY?1(!nC^K=fZR;9?hAXs*{>3-9wue zdI2TJI?`bubLN?7rM8(_@nCWSPifypIT1Q2AI<$g^4}2F)8`7!!)tdj^4C4B<|)~* zJA+;pI5kbL#M40Yb~+(phB7=QeOHAz+AHU{X1c{kRV?g#v*fx3)6|zVsc|3kL3rH! zvBrYo+U!HeDC7$%H=U=rx{3mZ@5v)i-z+vG)2G>=!@=`&tks-CBR%07S9eM2&X zBUbv_C3gpq<-rf`Ea{{>_Z*K^^o4n+gnKomF!S=BEJ@&KEJr@A?0kEQz*xn>@{PU6 zGyTj7ow~?X%){p6n)w8)k*ZnhIj%31UZ>Fv7s&Ftk#dwuiu@Z{582;;A|JU)LqBqa z5(SBEP}C02U{Wnx5nMRM!u*C+hC_J|vq*$;jDTT+CsyghKFRflT%F=aBQqb&oDRY# z>E~%UmC9bH%-mwvfa&KfaIVkZ|Geq#y_%7{G~bmlXxBww(R5j-`16EqWo-Az*CVfv zC6*tB#JnnNs_)`sn@++>239?COgrcmWK_^L({gU)57t-D=UdZq?#iC5vG@@2cqp@D z!~NYN*ZQ>gbd})u+Z#%9t%|)B{1xd>UM&xBer_j((h|-##cdi*X=r?o*@)L(`KY_u z9^Ih8c-8k%-_fd3@3}_W^`hF?n)3K04ThDLN32uE%aXf#9V&{H7n9tdyP@{FiVj& zmw%`JQaRsefZgCbx5V$2;Qrk6(`*058G){smWN&hKOO8H%3C|xzv(}-yZ`9yqcG?d z-Ka0@ClYj>4RlvuZ}@CT49d+X7JRr`iyK*sTy5j$a8(#D^<>|5e8W-n9xiHSweQ@b z?4tK#wzKzC-byO1RKG!gDf7z|qcO0R=ZcX(mfA{DK_0{vh7KSouHl8h_wE*)Qki90 zp7nsJ`w0~W8%wZ1ozKyw{z%b8u2I`AXU{w!TPR$3S z*NDdCYp3xpE{1@Yn4BvI3!N)lrzFGz7U}Gr7w4+xBPWjpPoC>>A8iRvS+9v&V*mUq z-_^QzAt^4-@ED>>c%<;sp<>!D(=OI2ggZr4suU-~sStrKU3=)7*qd(JOnb_rhVy=d zA-hV&swM*pw7YPhyc|F19|>s6po=T^HT0X5$e2QVHyJoMGq*!4iVxoG5OJ)596mq1 zSiYa3JT9s)t>)t8leUuqSy^2N*kS^*;?9jocu7~siAhpmuFzL|-f5n<92(rD^uK{z z|2w?Zk4(!r7y|wmdhy>)v@E+5y(qMuHTegKk%&P23&n^5IhKhiMmQV|pp2w2MvzST zXO`vv49JN7Ey*(a_aw_G4D4S48N9{%E+Cg-L$q6ZW2^#4J2BCAzY2mwv5j%QwKUG(UGgUvXX{b9HRA6u%PEvI+~b_%>tXd~>4G zE`D?QHv1tRGqp!vgup93pI0tlo-IBjF}3Po4xS@`cC4mrJao0uBt*bhN#dxIi3`T)#&GDYph@2hFzc*qkVdP zf@w`QYR#hGdXG`~QIKvq;xqlA*i4k*AK72Eecgi|r3$ksWIZOVlRYl=k9ka>AgFB` z3@l`W1j&&LNn4lW)T)~X*p-hLzn^t%TM!A8AqcF8Z!)WHGWFs|FAQ9!Uq9LdFpVaX zJdFf;^$jMC4M$il`!oVT7vT#<_al=^ef^V4BR``EwMnJnl2#jG8U)^zT6P>jA#SFn z5cpLIw3I3YN(+@ut$`Vl>($_2$Ag$ZtVKhy&z@^vI4k8^#5jPydz*KJotMC}-un`# zflU9hM6Iqk7Vvk*{y)r%{NGsj-(n2W0JFOjW4Hs?_X9n*6Ib{HuJ;QL5kT?)eG6gt z14~Gh`GLawaZbG6I^X91feqY(@Bx?~%}-e1pT8&a{|W!wf&%_*?@t|xNI#;?57^%p z$nZyJTY^L-{#4{|pnt!mFW&OJU!i|H(ih7EP$CiK31EL9H#%`iz!?&P-a6ZvB^{{u z6E8>%BoGieh+t)?o`#7v-qZ!a2$k$W+IH|oYy+IbL3sIbE&_pXw+-kZ>}-h=d2kT$ z1^5Ac8LH{zV5*IGF@$Q$%0tiKJzM~Tu?1dc`=GRakUqatsU7I(Eqtmb;D>4&I}uaD zqqc{og?9#t=S}e-%lvkVW;MK-l`%2XJW){$903u*AN`IJ)tt%AoskRl__3JK^m$AaRF((B_*LUU}8Yu&XBFX z!JvNT&ORXf|Je=g7mKY|2;*B zt+eAi<_NLFZT}G?Li}*mA65-e%Kz-DAxZrV`A^#sh}_%Z?B^W))2@aj^|h_QNE(cs zX`rN$k_P%SRDv=6jFrTosA6U2YzWzokz1f~$X0ZRY`L)(WXpHJVXJ4zmX&Bhww4AQ zwmCr~pdbhc)3_ZLz7>3TYPJ=Xf4*>_YGrQ&m3DA4!#iySZ`gUDv#ESE>YB=KUx97-kdugG1`UVhtS6kcdA26_Js>b#fe0X~y9c})d zvw_($8!}FKV^9D_TwYFI9tJ~$IxZpz7z~30M-(`siPzh=d+=Xp{0}~q%r*}O@NV$~ zJ`|A0fU*)>-#{J%s=N^80SgQX=m_S-b#Iq`9Y`1y;5 z#1NmbcG7?>1`8t7P8v~R5n%ei(lFS+k;M`tKPlhuvLZMU;9tM+;m}y{TH3EPm zsx#mNo4;T9;3x!=RA(>_kfQ51J`@bZxSjpNQ7EJcNxujr296``0|y?Y|3(%^GS6@v z5`iO`KVo|#B(lKKQN&QQQx_r)Mba;zVZlo`zwjYZFgToKo{47T0KCb`T9s)&-+dFAU)YfK%lm=b~BISc&iN#WO$|A6c-_`>d0Rl%d4nRW^ zw+K6B0S!zlDGfZblgt$ojzN>!3#e5kLi{VlFYN&ucz24Fh9g}|BmxV93n?EC_M0pc z3&)a<19%aPv=1Z}1tZl3i3Q$3(gzZUByO30(HYP%q niAbTr-9QEfz=U!L;!VWa#n{PZD Date: Wed, 12 Feb 2020 14:55:38 -0800 Subject: [PATCH 32/36] Update Tune.asm TUNE app updated with more flexible hardware configuration detection. --- Source/Apps/Tune/Tune.asm | 194 +++++++++++++++++++------------------- 1 file changed, 97 insertions(+), 97 deletions(-) diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index 57dc25b9..904364f6 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -37,6 +37,7 @@ ; 2018-01-26 [WBW] Initial release ; 2018-01-28 [WBW] Added support for MYM sound files ; 2019-11-21 [WBW] Added table-driven configuration +; 2020-02-11 [WBW] Made hardware config & detection more flexible ;_______________________________________________________________________________ ; ; ToDo: @@ -81,30 +82,48 @@ TYPMYM .EQU 3 ; FILTYP value for MYM sound file LD A,RMJ << 4 | RMN ; Expected HBIOS ver CP D ; Compare with result above JP NZ,ERRBIO ; Handle BIOS error + LD A,L ; Platform id to A + LD (CURPLT),A ; Save as current platform id ; - ; Use platform id to setup active configuration - LD A,L ; Platform ID is still in L from above - RLCA ; Adjust for table entry size (4 bytes) - PUSH AF ; Save ID * 2 for later - RLCA LD HL,CFGTBL ; Point to start of config table - CALL ADDHLA ; HL := desired config table entry - LD DE,CFG ; Dest is active config - LD BC,4 ; Copy 4 bytes - LDIR ; Copy to active config -; - LD HL,PLTSTR ; Point to platform string table - POP AF ; Recover platform id * 2 for table offset - CALL ADDHLA ; HL := Platform string index adr - LD E,(HL) ; DE := Platform string adr - INC HL - LD D,(HL) - CALL CRLF ; Formatting - CALL PRTSTR ; Display platform string +CFGSEL: + LD A,$FF ; End of table marker + CP (HL) ; Compare + JP Z,ERRHW ; Bail out if no more configs to try +; + LD BC,CFGSIZ ; Size of one entry + LD DE,CFG ; Active config structure + LDIR ; Update active config structure +; + LD A,(CURPLT) ; Get current running platform id + LD E,A ; Put in E + LD A,(PLT) ; Get platform id of loaded config + CP E ; Equal? + JR NZ,CFGSEL ; If no match keep trying +; + ; Test for hardware (sound chip detection) + CALL SLOWIO + LD DE,(PORTS) ; D := RDAT, E := RSEL + LD C,E ; Port = RSEL + LD A,2 ; Register 2 + OUT (C),A ; Select register 2 + LD C,D ; Port = RDAT + LD A,$AA ; Value = $AA + OUT (C),A ; Write $AA to register 2 + ;LD C,E ; Port = RSEL + LD A,(RIN) ; Port = RIN + LD C,A ; ... to C + IN A,(C) ; Read back value in register 2 + PUSH AF + CALL NORMIO + POP AF + ;CALL PRTHEX ; *debug* + CP $AA ; Value as written? + JR NZ,CFGSEL ; If not, keep trying configs ; - LD A,(CFG) ; RSEL port address to A - INC A ; Test for $FF - JP Z,ERRPLT ; Bail out if unsupported platform + CALL CRLF ; Formatting + LD DE,(DESC) ; Load hardware description pointer + CALL PRTSTR ; Print description ; ; Test for timer running to determine if it can be used for delay LD B,BF_SYSGET ; HBIOS: GET function @@ -123,19 +142,6 @@ SETDLY: LD (WMOD),A ; Save wait mode CALL PRTSTR ; Print it ; -; ; *DEBUG* -; LD A,',' -; CALL PRTCHR -; LD HL,CFG -; LD B,4 -;DBGLP: -; LD A,' ' -; CALL PRTCHR -; LD A,(HL) -; INC HL -; CALL PRTHEX -; DJNZ DBGLP -; ; Get CPU speed & type from RomWBW HBIOS and compute quark delay factor LD B,$F8 ; HBIOS SYSGET function 0xF8 LD C,$F0 ; CPUINFO subfunction 0xF0 @@ -146,31 +152,13 @@ SETDLY: LD (QDLY),HL ; Save result as quark delay factor ; ; Activate SCG card if applicable - LD A,(CFG+3) + LD A,(ACR) CP $FF JR Z,NOSCG LD C,A LD A,$FF OUT (C),A NOSCG: -; - ; Test for hardware (sound chip detection) - CALL SLOWIO - LD DE,(CFG) ; D := RDAT, E := RSEL - LD C,E ; Port = RSEL - LD A,2 ; Register 2 - OUT (C),A ; Select register 2 - LD C,D ; Port = RDAT - LD A,$AA ; Value = $AA - OUT (C),A ; Write $AA to register 2 - LD C,E ; Port = RSEL - IN A,(C) ; Read back value in register 2 - PUSH AF - CALL NORMIO - POP AF - ;CALL PRTHEX ; *debug* - CP $AA ; Value as written? - JP NZ,ERRHW ; If not, handle hardware error ; ; Clear heap storage LD HL,HEAP ; Point to heap start @@ -431,7 +419,7 @@ IDBIO2: ; ; SLOWCPU: - LD A,(CFG+2) ; Z180 base I/O port + LD A,(Z180) ; Z180 base I/O port CP $FF ; Check for no value RET Z ; Bail out if no value ADD A,$1E ; Apply offset of CMR register @@ -451,7 +439,7 @@ SLOWCPU: ; ; NORMCPU: - LD A,(CFG+2) ; Z180 base I/O port + LD A,(Z180) ; Z180 base I/O port CP $FF ; Check for no value RET Z ; Bail out if no value ADD A,$1E ; Apply offset of CMR register @@ -467,7 +455,7 @@ NORMCPU: ; ; SLOWIO: - LD A,(CFG+2) ; Z180 base I/O port + LD A,(Z180) ; Z180 base I/O port CP $FF ; Check for no value RET Z ; Bail out if no value ADD A,$32 ; Apply offset of DCNTL register @@ -482,7 +470,7 @@ SLOWIO: ; ; NORMIO: - LD A,(CFG+2) ; Z180 base I/O port + LD A,(Z180) ; Z180 base I/O port CP $FF ; Check for no value RET Z ; Bail out if no value ADD A,$32 ; Apply offset of DCNTL register @@ -716,25 +704,56 @@ ERR2: ; without the string ; ; CONFIG TABLE, ENTRY ORDER MATCHES HBIOS PLATFORM ID ; -CFGTBL: ; RSEL RDAT Z180 ACR - .DB $FF, $FF, $FF, $FF ; PLATFORM ID 0 IS INVALID - .DB $9A, $9B, $FF, $9C ; SBC W/ SCG - .DB $FF, $FF, $FF, $FF ; ZETA (NOT POSSIBLE) - .DB $FF, $FF, $FF, $FF ; ZETA 2 (NOT POSSIBLE) - .DB $9C, $9D, $40, $FF ; N8 W/ ONBOARD PSG - .DB $9A, $9B, $40, $9C ; MK4 W/ SCG - .DB $9A, $9B, $FF, $FF ; UNA (NOT SUPPORTED) - .DB $D8, $D0, $FF, $FF ; RCZ80 W/ RC SOUND MODULE (EB) - .DB $68, $60, $C0, $FF ; RCZ180 W/ RC SOUND MODULE (EB) - .DB $D8, $D0, $FF, $FF ; EZZ80 W/ RC SOUND MODULE (EB) - .DB $68, $60, $C0, $FF ; SCZ180 W/ RC SOUND MODULE (EB) -; -CFG: ; ACTIVE CONFIG VALUES (FROM SELECTED CFGTBL) +CFGSIZ .EQU 8 +; +CFGTBL: ; PLT RSEL RDAT RIN Z180 ACR + ; DESC + .DB $01, $9A, $9B, $9A, $FF, $9C ; SBC W/ SCG + .DW HWSTR_SCG +; + .DB $04, $9C, $9D, $9C, $40, $FF ; N8 W/ ONBOARD PSG + .DW HWSTR_N8 +; + .DB $05, $9A, $9B, $9A, $40, $9C ; MK4 W/ SCG + .DW HWSTR_SCG +; + .DB $07, $D8, $D0, $D8, $FF, $FF ; RCZ80 W/ RC SOUND MODULE (EB) + .DW HWSTR_RCEB +; + .DB $07, $D8, $D0, $D0, $FF, $FF ; RCZ80 W/ RC SOUND MODULE (MF) + .DW HWSTR_RCMF +; + .DB $08, $68, $60, $68, $C0, $FF ; RCZ180 W/ RC SOUND MODULE (EB) + .DW HWSTR_RCEB +; + .DB $08, $68, $60, $60, $C0, $FF ; RCZ180 W/ RC SOUND MODULE MFB) + .DW HWSTR_RCMF +; + .DB $09, $D8, $D0, $D8, $FF, $FF ; EZZ80 W/ RC SOUND MODULE (EB) + .DW HWSTR_RCEB +; + .DB $09, $D8, $D0, $D0, $FF, $FF ; EZZ80 W/ RC SOUND MODULE (EB) + .DW HWSTR_RCMF +; + .DB $0A, $68, $60, $68, $C0, $FF ; SCZ180 W/ RC SOUND MODULE (EB) + .DW HWSTR_RCEB +; + .DB $0A, $68, $60, $60, $C0, $FF ; SCZ180 W/ RC SOUND MODULE (MF) + .DW HWSTR_RCMF +; + .DB $FF ; END OF TABLE MARKER +; +CFG: ; ACTIVE CONFIG VALUES (FROM SELECTED CFGTBL ENTRY) +PLT .DB 0 ; RomWBW HBIOS platform id +PORTS: RSEL .DB 0 ; Register selection port RDAT .DB 0 ; Register data port +RIN .DB 0 ; Register input port Z180 .DB 0 ; Z180 base I/O port ACR .DB 0 ; Aux Ctrl Reg I/O port on SCG +DESC .DW 0 ; Hardware description string adr ; +CURPLT .DB 0 ; Current platform id reported by HBIOS QDLY .DW 0 ; quark delay factor WMOD .DB 0 ; delay mode, non-zero to use timer DCSAV .DB 0 ; for saving original Z180 DCNTL value @@ -747,7 +766,7 @@ FILTYP .DB 0 ; Sound file type (TYPPT2, TYPPT3, TYPMYM) TMP .DB 0 ; work around use of undocumented Z80 ; -MSGBAN .DB "Tune Player for RomWBW v2.2a, 02-Feb-2020",0 +MSGBAN .DB "Tune Player for RomWBW v2.3, 11-Feb-2020",0 MSGUSE .DB "Copyright (C) 2020, Wayne Warthen, GNU GPL v3",13,10 .DB "PTxPlayer Copyright (C) 2004-2007 S.V.Bulba",13,10 .DB "MYMPlay by Marq/Lieves!Tuore",13,10,13,10 @@ -764,29 +783,10 @@ MSGDLY .DB ", delay mode",0 MSGPLY .DB "Playing...",0 MSGEND .DB " Done",0 ; -PLTSTR: - .DW 0 - .DW PLTSTR_SBC - .DW PLTSTR_ZETA - .DW PLTSTR_ZETA2 - .DW PLTSTR_N8 - .DW PLTSTR_MK4 - .DW PLTSTR_UNA - .DW PLTSTR_RCZ80 - .DW PLTSTR_RCZ180 - .DW PLTSTR_EZZ80 - .DW PLTSTR_SCZ180 -; -PLTSTR_SBC .DB "SBC w/ SCG ECB Sound Card",0 -PLTSTR_ZETA .DB "Zeta -- Not Supported!!!",0 -PLTSTR_ZETA2 .DB "Zeta 2 -- Not Supported!!!",0 -PLTSTR_N8 .DB "N8 Onboard Sound System",0 -PLTSTR_MK4 .DB "Mark IV w/ SCG ECB Sound Card",0 -PLTSTR_UNA .DB "UNA -- Not Supported!!!",0 -PLTSTR_RCZ80 .DB "RC2014 Z80 w/ Sound Module (EB)",0 -PLTSTR_RCZ180 .DB "RC2014 Z180 w/ Sound Module (EB)",0 -PLTSTR_EZZ80 .DB "Easy Z80 w/ Sound Module (EB)",0 -PLTSTR_SCZ180 .DB "SC Z180 w/ Sound Module (EB)",0 +HWSTR_SCG .DB "SCG ECB Board",0 +HWSTR_N8 .DB "N8 Onboard Sound",0 +HWSTR_RCEB .DB "RC2014 Sound Module (EB)",0 +HWSTR_RCMF .DB "RC2014 Sound Module (MF)",0 ; ;=============================================================================== ; PTx Player Routines @@ -2172,7 +2172,7 @@ LOUT OUT (C),A #IF WBW DI CALL SLOWIO - LD DE,(CFG) ; D := RDAT, E := RSEL + LD DE,(PORTS) ; D := RDAT, E := RSEL XOR A ; start with reg 0 LD C,E ; point to address port LD HL,AYREGS ; start of value list @@ -2557,7 +2557,7 @@ upsg: ld a,(WMOD) ; if WMOD = 1, CPU is z180 call SLOWIO upsg1: ld hl,(psource) - ld de,(CFG) ; E := RSEL, D := RDAT + ld de,(PORTS) ; E := RSEL, D := RDAT xor a psglp: ld c,e ; C := RSEL From 84ce67a8163c3f2f6316d875fb5c4a879c74d020 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 12 Feb 2020 15:23:17 -0800 Subject: [PATCH 33/36] Update Tune.asm Updated port addresses for Marten's sound card. --- Source/Apps/Tune/Tune.asm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Apps/Tune/Tune.asm b/Source/Apps/Tune/Tune.asm index 904364f6..3355e76a 100644 --- a/Source/Apps/Tune/Tune.asm +++ b/Source/Apps/Tune/Tune.asm @@ -720,25 +720,25 @@ CFGTBL: ; PLT RSEL RDAT RIN Z180 ACR .DB $07, $D8, $D0, $D8, $FF, $FF ; RCZ80 W/ RC SOUND MODULE (EB) .DW HWSTR_RCEB ; - .DB $07, $D8, $D0, $D0, $FF, $FF ; RCZ80 W/ RC SOUND MODULE (MF) + .DB $07, $D1, $D0, $D0, $FF, $FF ; RCZ80 W/ RC SOUND MODULE (MF) .DW HWSTR_RCMF ; .DB $08, $68, $60, $68, $C0, $FF ; RCZ180 W/ RC SOUND MODULE (EB) .DW HWSTR_RCEB ; - .DB $08, $68, $60, $60, $C0, $FF ; RCZ180 W/ RC SOUND MODULE MFB) + .DB $08, $61, $60, $60, $C0, $FF ; RCZ180 W/ RC SOUND MODULE (MF) .DW HWSTR_RCMF ; .DB $09, $D8, $D0, $D8, $FF, $FF ; EZZ80 W/ RC SOUND MODULE (EB) .DW HWSTR_RCEB ; - .DB $09, $D8, $D0, $D0, $FF, $FF ; EZZ80 W/ RC SOUND MODULE (EB) + .DB $09, $D1, $D0, $D0, $FF, $FF ; EZZ80 W/ RC SOUND MODULE (EB) .DW HWSTR_RCMF ; .DB $0A, $68, $60, $68, $C0, $FF ; SCZ180 W/ RC SOUND MODULE (EB) .DW HWSTR_RCEB ; - .DB $0A, $68, $60, $60, $C0, $FF ; SCZ180 W/ RC SOUND MODULE (MF) + .DB $0A, $61, $60, $60, $C0, $FF ; SCZ180 W/ RC SOUND MODULE (MF) .DW HWSTR_RCMF ; .DB $FF ; END OF TABLE MARKER From 3da911edf4fd0324f16fcddb5ea743f2b1ce5fda Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 13 Feb 2020 16:01:19 -0800 Subject: [PATCH 34/36] BPBIOS Updates --- Source/BPBIOS/@WBW Z3ENV.txt | 2 +- Source/BPBIOS/hbios.z80 | 3 +++ Source/BPBIOS/romwbw-mk4.lib | 20 +++++++++++++++++--- Source/BPBIOS/romwbw-sim.lib | 20 +++++++++++++++++--- Source/HBIOS/asci.asm | 4 +++- Source/HBIOS/hbios.asm | 3 ++- 6 files changed, 43 insertions(+), 9 deletions(-) diff --git a/Source/BPBIOS/@WBW Z3ENV.txt b/Source/BPBIOS/@WBW Z3ENV.txt index 0b8bb617..8c17e2ca 100644 --- a/Source/BPBIOS/@WBW Z3ENV.txt +++ b/Source/BPBIOS/@WBW Z3ENV.txt @@ -75,7 +75,7 @@ should be consulted to understand these. The build process used here produces several different configurations which can be loaded at runtime. The original distributed memory segment configuration occupies the top of memory which, unfortunately, conflicts with the RomWBW HBIOS need to -occupt this space. +occupy this space. Although RomWBW HBIOS is implemented in it's own dedicated memory bank, it requires a small proxy at the top of memory which acts as a mechansim to diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index be63e92d..7899f6aa 100644 --- a/Source/BPBIOS/hbios.z80 +++ b/Source/BPBIOS/hbios.z80 @@ -194,6 +194,9 @@ HBX_ROM: IF MK4 RLCA + JR NC,HBX_BNKSEL1 + XOR 00100001B +HBX_BNKSEL1: RLCA RLCA OUT0 (CPU_BBR),A diff --git a/Source/BPBIOS/romwbw-mk4.lib b/Source/BPBIOS/romwbw-mk4.lib index 09968231..e4dcf70f 100644 --- a/Source/BPBIOS/romwbw-mk4.lib +++ b/Source/BPBIOS/romwbw-mk4.lib @@ -26,15 +26,15 @@ HBCLK EQU YES ; HBIOS clock driver ; ; Set HB_IODEV to appropriate console device ; -HB_IODEV EQU 0 +HB_IODEV EQU 0 ; Assume we want to use first HBIOS serial device ; ; Set HB_HDDEV to appropriate hard disk driver ; -HB_HDDEV EQU 2 +HB_HDDEV EQU 2 ; Assumes disk device #2 is first hard disk device ; ; Set HB_MDDEV to appropriate memory disk driver ; -HB_MDDEV EQU 0 +HB_MDDEV EQU 0 ; Assumes disk device #0 is ROM disk device ; ; RAM/ROM disk sizes expressed as count of 2K blocks ; @@ -66,3 +66,17 @@ MEMTOP EQU 0FFE0H - 1 ; Start of HBIOS 32 byte control block ELSE MEMTOP EQU HBLOC - 1 ; Start of HBIOS 512 byte proxy ENDIF + + IF INTPXY +HB_EI MACRO + ENDM +HB_DI MACRO + ENDM + ELSE +HB_EI MACRO + EI + ENDM +HB_DI MACRO + DI + ENDM + ENDIF diff --git a/Source/BPBIOS/romwbw-sim.lib b/Source/BPBIOS/romwbw-sim.lib index 61087ae5..d666295f 100644 --- a/Source/BPBIOS/romwbw-sim.lib +++ b/Source/BPBIOS/romwbw-sim.lib @@ -26,15 +26,15 @@ HBCLK EQU YES ; HBIOS clock driver ; ; Set HB_IODEV to appropriate console device ; -HB_IODEV EQU 0 +HB_IODEV EQU 0 ; Assume we want to use first HBIOS serial device ; ; Set HB_HDDEV to appropriate hard disk driver ; -HB_HDDEV EQU 2 +HB_HDDEV EQU 2 ; Assumes disk device #2 is first hard disk device ; ; Set HB_MDDEV to appropriate memory disk driver ; -HB_MDDEV EQU 0 +HB_MDDEV EQU 0 ; Assumes disk device #0 is ROM disk device ; ; RAM/ROM disk sizes expressed as count of 2K blocks ; @@ -66,3 +66,17 @@ MEMTOP EQU 0FFE0H - 1 ; Start of HBIOS 32 byte control block ELSE MEMTOP EQU HBLOC - 1 ; Start of HBIOS 512 byte proxy ENDIF + + IF INTPXY +HB_EI MACRO + ENDM +HB_DI MACRO + ENDM + ELSE +HB_EI MACRO + EI + ENDM +HB_DI MACRO + DI + ENDM + ENDIF diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index 788a705a..26a71d87 100644 --- a/Source/HBIOS/asci.asm +++ b/Source/HBIOS/asci.asm @@ -520,8 +520,10 @@ ASCI_INITGO: INC C ; ... STAT REG, B IS STILL 0 #IF (INTMODE > 0) LD A,$08 ; SET RIE BIT ON - OUT (C),A ; WRITE STAT REG +#ELSE + XOR A ; CLEAR RIE/TIE #ENDIF + OUT (C),A ; WRITE STAT REG LD A,$0E ; BUMP TO ADD A,C ; ... ASEXT REG LD C,A ; PUT IN C FOR I/O, B IS STILL 0 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 7e879f51..fa3d5471 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -775,6 +775,7 @@ HB_START: ; MASK OFF TIMER INTERRUPTS XOR A OUT0 (Z180_TCR),A + OUT0 (Z180_ITC),A ; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2) ; @@ -905,7 +906,7 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK LD ($0039),HL #ELSE ; RETI ($ED, $4D) IF NON-INTERRUPT MODE - LD HL,($0038) + LD HL,$0038 LD (HL),$ED INC HL LD (HL),$4D From 9452540c75904733dc9b11afdbd0c3f70e1d7035 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 14 Feb 2020 23:32:48 +0800 Subject: [PATCH 35/36] Update cbios.asm Change RAMF to 512 directory entries as 4Mb drive space cannot be effectively used without enough directory entries and extents to hold a large quantity of small files or a small qty of large files. --- Source/CBIOS/cbios.asm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index b0ae7c29..737280ce 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -1670,8 +1670,8 @@ DPB_RF: .DB 15 ; BLM: BLOCK MASK .DB 0 ; EXM: EXTENT MASK .DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = (4MB / 2K BLS) - 1 = 2047 - .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 - .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE + .DW 511 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255 + .DB 11111111B ; AL0: DIR BLK BIT MAP, FIRST BYTE .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA .DW 0 ; OFF: RESERVED TRACKS = 0 TRK From 437a0d39b7f366db9755e654ed59cd58d65e8316 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 14 Feb 2020 17:22:56 -0800 Subject: [PATCH 36/36] BPBIOS system segment enhancements --- Doc/NZCOM Manual.pdf | Bin 0 -> 614846 bytes Source/BPBIOS/Build.cmd | 34 +- Source/BPBIOS/Clean.cmd | 2 + Source/BPBIOS/NZFCP13/Build.cmd | 11 + Source/BPBIOS/NZFCP13/Clean.cmd | 7 + Source/BPBIOS/NZFCP13/fcp-4.zrl | Bin 0 -> 896 bytes Source/BPBIOS/NZFCP13/fcp-4t.zrl | Bin 0 -> 896 bytes Source/BPBIOS/NZFCP13/fcp-5.zrl | Bin 0 -> 1024 bytes Source/BPBIOS/NZFCP13/fcp-5t.zrl | Bin 0 -> 1024 bytes Source/BPBIOS/NZFCP13/fcp-6.zrl | Bin 0 -> 1152 bytes Source/BPBIOS/NZFCP13/fcp-6t.zrl | Bin 0 -> 1152 bytes Source/BPBIOS/NZFCP13/fcp-7t.zrl | Bin 0 -> 1408 bytes Source/BPBIOS/NZFCP13/nzfcp.doc | 89 + Source/BPBIOS/NZFCP13/nzfcp.lib | 161 ++ Source/BPBIOS/NZFCP13/nzfcp.lib.sav | 161 ++ Source/BPBIOS/NZFCP13/nzfcp13.for | 9 + Source/BPBIOS/NZFCP13/nzfcp13.z80 | 1424 +++++++++++ Source/BPBIOS/NZFCP13/z34cmn.lib | 105 + Source/BPBIOS/NZFCP13/z34mac.lib | 122 + Source/BPBIOS/WW.Z3T | Bin 0 -> 128 bytes Source/BPBIOS/Z34RCP11/Build.cmd | 11 + Source/BPBIOS/Z34RCP11/Clean.cmd | 7 + Source/BPBIOS/Z34RCP11/cledinst.com | Bin 0 -> 4992 bytes Source/BPBIOS/Z34RCP11/cledsave.com | Bin 0 -> 1024 bytes Source/BPBIOS/Z34RCP11/nzrcp.z80 | 3010 +++++++++++++++++++++++ Source/BPBIOS/Z34RCP11/rcpbase.lib | 33 + Source/BPBIOS/Z34RCP11/rcpcled.doc | 62 + Source/BPBIOS/Z34RCP11/rcpcled.lib | 1327 ++++++++++ Source/BPBIOS/Z34RCP11/rcpcls.lib | 35 + Source/BPBIOS/Z34RCP11/rcpcmd.lib | 56 + Source/BPBIOS/Z34RCP11/rcpcp.lib | 245 ++ Source/BPBIOS/Z34RCP11/rcpdir.lib | 137 ++ Source/BPBIOS/Z34RCP11/rcpecho.lib | 162 ++ Source/BPBIOS/Z34RCP11/rcpera.lib | 76 + Source/BPBIOS/Z34RCP11/rcph.lib | 119 + Source/BPBIOS/Z34RCP11/rcpid.lib | 64 + Source/BPBIOS/Z34RCP11/rcpiom.lib | 296 +++ Source/BPBIOS/Z34RCP11/rcplt.lib | 256 ++ Source/BPBIOS/Z34RCP11/rcpprot.lib | 130 + Source/BPBIOS/Z34RCP11/rcpquiet.lib | 49 + Source/BPBIOS/Z34RCP11/rcpr.lib | 108 + Source/BPBIOS/Z34RCP11/rcpreg.lib | 165 ++ Source/BPBIOS/Z34RCP11/rcpren.lib | 100 + Source/BPBIOS/Z34RCP11/rcpsp.lib | 163 ++ Source/BPBIOS/Z34RCP11/rcpsubs.lib | 1057 ++++++++ Source/BPBIOS/Z34RCP11/rcpwhl.lib | 54 + Source/BPBIOS/Z34RCP11/sysdef.lib | Bin 0 -> 2688 bytes Source/BPBIOS/Z34RCP11/z34cmn.lib | 105 + Source/BPBIOS/Z34RCP11/z34defn.lib | Bin 0 -> 1664 bytes Source/BPBIOS/Z34RCP11/z34mac.lib | 122 + Source/BPBIOS/Z34RCP11/z34rcp.lib | 515 ++++ Source/BPBIOS/Z34RCP11/z34rcp.lib.sav | 515 ++++ Source/BPBIOS/Z34RCP11/z34rcp11.doc | 429 ++++ Source/BPBIOS/Z34RCP11/z34rcp11.for | 7 + Source/BPBIOS/Z34RCP11/z34rcp11.hlp | 390 +++ Source/BPBIOS/Z34RCP11/z34rcp11.new | 136 + Source/BPBIOS/Z34RCP11/z34rcp11.z80 | 268 ++ Source/BPBIOS/Z34RCP11/z34rcp11.z80.sav | 267 ++ Source/BPBIOS/Z34RCP11/zsystem.ad | 97 + Source/BPBIOS/dph.lib | 41 +- Source/BPBIOS/z33.zex | 2 +- Source/BPBIOS/z34.zex | 2 +- Source/BPBIOS/z41.zex | 2 +- Source/Build.cmd | 2 +- Source/Images/Build.cmd | 3 +- Source/Images/d_bp.txt | 31 + Source/Images/d_bp/u0/FAT.COM | Bin 44928 -> 0 bytes Source/Images/d_bp/u0/HDIR.COM | Bin 1408 -> 0 bytes Source/Images/d_bp/u0/JETLDR.COM | Bin 0 -> 9088 bytes Source/Images/d_bp/u0/R.COM | Bin 4224 -> 0 bytes Source/Images/d_bp/u0/RSETSIMH.COM | Bin 128 -> 0 bytes Source/Images/d_bp/u0/TIMER.COM | Bin 256 -> 0 bytes Source/Images/d_bp/u0/W.COM | Bin 3968 -> 0 bytes Source/Images/d_bp/u0/Z41.ZRL | Bin 6912 -> 0 bytes Source/Images/d_bp/u0/ZCPR33.REL | Bin 2560 -> 0 bytes Source/Images/d_bp/u0/ZS203.ZRL | Bin 6912 -> 0 bytes Source/Images/d_bp/u0/ZSDOS.ZRL | Bin 4224 -> 0 bytes Source/Images/d_bp/u0/z34.rel | Bin 2816 -> 0 bytes 78 files changed, 12742 insertions(+), 39 deletions(-) create mode 100644 Doc/NZCOM Manual.pdf create mode 100644 Source/BPBIOS/NZFCP13/Build.cmd create mode 100644 Source/BPBIOS/NZFCP13/Clean.cmd create mode 100644 Source/BPBIOS/NZFCP13/fcp-4.zrl create mode 100644 Source/BPBIOS/NZFCP13/fcp-4t.zrl create mode 100644 Source/BPBIOS/NZFCP13/fcp-5.zrl create mode 100644 Source/BPBIOS/NZFCP13/fcp-5t.zrl create mode 100644 Source/BPBIOS/NZFCP13/fcp-6.zrl create mode 100644 Source/BPBIOS/NZFCP13/fcp-6t.zrl create mode 100644 Source/BPBIOS/NZFCP13/fcp-7t.zrl create mode 100644 Source/BPBIOS/NZFCP13/nzfcp.doc create mode 100644 Source/BPBIOS/NZFCP13/nzfcp.lib create mode 100644 Source/BPBIOS/NZFCP13/nzfcp.lib.sav create mode 100644 Source/BPBIOS/NZFCP13/nzfcp13.for create mode 100644 Source/BPBIOS/NZFCP13/nzfcp13.z80 create mode 100644 Source/BPBIOS/NZFCP13/z34cmn.lib create mode 100644 Source/BPBIOS/NZFCP13/z34mac.lib create mode 100644 Source/BPBIOS/WW.Z3T create mode 100644 Source/BPBIOS/Z34RCP11/Build.cmd create mode 100644 Source/BPBIOS/Z34RCP11/Clean.cmd create mode 100644 Source/BPBIOS/Z34RCP11/cledinst.com create mode 100644 Source/BPBIOS/Z34RCP11/cledsave.com create mode 100644 Source/BPBIOS/Z34RCP11/nzrcp.z80 create mode 100644 Source/BPBIOS/Z34RCP11/rcpbase.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpcled.doc create mode 100644 Source/BPBIOS/Z34RCP11/rcpcled.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpcls.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpcmd.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpcp.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpdir.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpecho.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpera.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcph.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpid.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpiom.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcplt.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpprot.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpquiet.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpr.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpreg.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpren.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpsp.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpsubs.lib create mode 100644 Source/BPBIOS/Z34RCP11/rcpwhl.lib create mode 100644 Source/BPBIOS/Z34RCP11/sysdef.lib create mode 100644 Source/BPBIOS/Z34RCP11/z34cmn.lib create mode 100644 Source/BPBIOS/Z34RCP11/z34defn.lib create mode 100644 Source/BPBIOS/Z34RCP11/z34mac.lib create mode 100644 Source/BPBIOS/Z34RCP11/z34rcp.lib create mode 100644 Source/BPBIOS/Z34RCP11/z34rcp.lib.sav create mode 100644 Source/BPBIOS/Z34RCP11/z34rcp11.doc create mode 100644 Source/BPBIOS/Z34RCP11/z34rcp11.for create mode 100644 Source/BPBIOS/Z34RCP11/z34rcp11.hlp create mode 100644 Source/BPBIOS/Z34RCP11/z34rcp11.new create mode 100644 Source/BPBIOS/Z34RCP11/z34rcp11.z80 create mode 100644 Source/BPBIOS/Z34RCP11/z34rcp11.z80.sav create mode 100644 Source/BPBIOS/Z34RCP11/zsystem.ad create mode 100644 Source/Images/d_bp.txt delete mode 100644 Source/Images/d_bp/u0/FAT.COM delete mode 100644 Source/Images/d_bp/u0/HDIR.COM create mode 100644 Source/Images/d_bp/u0/JETLDR.COM delete mode 100644 Source/Images/d_bp/u0/R.COM delete mode 100644 Source/Images/d_bp/u0/RSETSIMH.COM delete mode 100644 Source/Images/d_bp/u0/TIMER.COM delete mode 100644 Source/Images/d_bp/u0/W.COM delete mode 100644 Source/Images/d_bp/u0/Z41.ZRL delete mode 100644 Source/Images/d_bp/u0/ZCPR33.REL delete mode 100644 Source/Images/d_bp/u0/ZS203.ZRL delete mode 100644 Source/Images/d_bp/u0/ZSDOS.ZRL delete mode 100644 Source/Images/d_bp/u0/z34.rel diff --git a/Doc/NZCOM Manual.pdf b/Doc/NZCOM Manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59a62a0854a611a01cbe11fb388d4b5d5682f77a GIT binary patch literal 614846 zcmeFZcUV)~wg*ZLHAo2^HS`c#LP7!vO7A6vB2A_D-b6&CcaSbk>AhDG5$PZxT||n~ zML&r%&pzkAd%yR-@BXo}W*u{^xz?CtW{lq)yck7gVYmna$h)#SHU*@F zgJEDdOGluzG#DtVf63hjEQ+zPv%zIB7M?b)-e3t_11v6!wefQE@wBq>0wcbaD7d+L z<63xu#l9DKy1C1{`GHNr65=8-gd|uTC4!O^lf)&&P$H5jI2er(7eT<#FgW-eemHv{ z7fUb#f&SKC&ehcoM@}5|jo|6iV4#hwHJ&|u$u~AdHEmq&yzRjfNHkbf*}>V{#uF^6 zX>wN4#>&mw28{3I;R2)#qKyd}$F#@6S)w?36_B*nNM_&wu?Imn6dc)W=@Fc< zW+ui#4k*kx#FV*&D8=o`)0xYPa;Glyd1VB}7^Oy0Mo573a!i;K@2^d$VIGpO#ILT> zRh<`BE1pv3j@lb>;bO-|FkX@_GJ~ZnW;Kq(t`JXj0Bpm{heUc{fUIqz4&VB*H~L)pTvm zXu8?OUN)iGV#s^0W$T?4;8y&8JVQS97E6(2jY4W{>m-t(7{Hlo%g$3y%|JSYamVn& z2xYtb02T@X&D}fh*f0$}jy6QNsN)n&fquakq>ut0d<9sJ!f?WM)c292UOW@x!g_UU zuK<+|(PBXELcrtjV_}10@k!h-z)C`ghO5nVKCnrEy5;G_BEkxB_PnH_F6bTi5i~7n ze)1|^Z*3cxjf^n#O>O?BQB=+?bF2`Q=J__+$yTUl*w}z@kn5!W!y%t@!E&;#brIE{ z1+2;m-5uEwX`k~+JJYs?I7ghNUY(+0U?+MieN4Z<_3m4}%~z-8WGy+G^Q|{~o-7aA z;U9PtX&e+M{~HN&pJ&}rE^ z?z#1)D4Z4aB3@Y31<>5?KGMHu;|v77s}WS31Sw|P@G=l;MR~FcNNlFIJwsBwy?JoLX3v7~0w0lYdq#Dkm@-7 zX4s8rlc}aB{6sjsPd6() z8*iNSi{jQ8u&BO`pZAfNE92G)Fm8PjRffaC$RkL`g9T~Q@JZxuan z3vZjFE-HGsMdL^1PYVK`&X1wLu3Jar07dnDEWMA`F?=Z;M^W3t1-Gi<2M6NT3r{a^ z1$zrmFkB3m)wKAYLyP0GXC17)?Y(eMfD#i2!(lMkf9nVM-=~0pBmSBN1deBX198;1 zM)<_97w~(*-(W@@0slIhgg6W=fqQxh9Ce@sZaGFHB*17G8Z04!#9c5j5{_HbCE&O; z9E?JvaJ^9YN?Z@5I2etR{6+?+0`M~lL`#T)B~ag|6pkZ!#0`EJl!V0B%wO^+j$7w} zcrxNRj*jj)t`JD%(WBz?_&GSrOCpcbk~n6M+To_-=#DD~B2hT5ah;IgD{+PR#}mih zkFJ0Dvj1Oroqzd^f4Aa)hX?$m;q|k;g_q5dP>EW(So$3a3_h!9<7MUP;O_0_iJR_! zR@Hd1{x>BP_kw?xOx#EJvt*)vmP|Mt_tE^_>H1x}|D7rP-N=8I{T~lsU*Z4F!~g0$ z;6(>7*GjIqow9?g9d7FlJJPK`i@LT7Mp;Wo5GV0om*6nGVE!WVVqaA_@F!)ASKt4p z$V=cU|4n6#QzL)M&VQKtpZwGiIBkfKz$qcz{ZID9aq9Wk3;1inpUr0r!Kikw78AXbHS_KFZ*< zA#Nt|dL1Ys@k1F){LC{N_FwEbj>w3M<8(TX3{V`mpTZ}^#n51cIQ-~Q@%bN#gBnjo&)s4GLJWlR<^>nbDm)o>v8l|`|yO%PuTao;e$ z8*YPkWNpAdt%92m?tjD467kRv}D%BydeI#;qWRhA5LDZ(o2ZzK@Js zOV%BN$Px&Zlbg&#Z~&D^wmx$_H(+`=;zJmfHzXjEMuAa9YBK{#fn3BYG}iG~iiP>4KLe-SNsja=k`niv6q4Cd7&f80Al& z9bohA6|e>Bth)H^HV^DB)jI_w?soh<904wE)n{><9Um{ z8?W9=*UObW^0?il`p7|R$%>aHo=l9TCRZ;pbvv9@K67nDin>M*ISLRumHw~rZ*b_4o=og0JtDel1ES+?B6H13_8yjUbkmMEt`mxXb&IP zXQkth-j|;#GEFLR-p~mPw9Q(AJHOQ zq2OK|q2YLwDS|Vr1azySBCaYN>DcxdO&CkWfzqJu)0`N3=eb6qE=<2wu^muW8FN^e zL^aurt*h2kKk(m@p?0cbmU^)yrwZ!|vY(OLq75|#rdw68-y%vAYMEkuARrW;U-<+? zY2YKyKPh}@(lQe)y8|k`#fTI`4JDeDA=OiyRE4X@t;>a9?;yivm-HXAHEBw7eC(}? z0^M(@YCjB>y|rfB9WfnGOfPc?4TC25xZA$yelv(+xc_F*y0Q^C-?CRW`p$Aeb(lam zRk+38WE-oXnR~^?YtNp&AR4*(kx-9kB0TTFX}1ngPQAgQshRo;WuM`6<|=7dr=7gH zH@$zVN~&12KV(^p8G9-|z*5b}(9h8sNE!`=7f7x;aC?adpxi-01VDYx! z*jb}(+U}Qq6={z%BSdDy3U=OfO!Yn4>hJS0OTTal~pl)bjUNZH{g{B(HSLV5W8 zn~Xyf1~M&(O$5@mX_5_Ve)R?6snXQxo)f0}WCRP3+xc2vn7mikRT5}`yzZW3YLx7I(>1dCY5g^U&`iAB@=@2$;q&=P4h_8k><@l zB#yM-o)H@~kD;qcg@{$mv-=1qD4CS|c#tnl^XqMQRfa^KBwI*siRHBvsGsrOSP8vp zvR*yZhK5mcv6n!`-{0sZ(|(>lbTeu%La(>Dp22WU&x}&tq}s2_sGuj}0nIRb6iXkyw{w*8BuDpnZw=r6$UWq|q%hp82PS+P|m` zuYXc{_~CAsCn*^O1#g$6WQZ$ry@ciIzHg~^f+h7vK%ZK#DzS%3%XD(8e|gR ztOh-1J!of&1?UIWA806CG#Z*q-=p#Lqie!r1(8a!f?-uwF*xTg|xdG-3&^Ij^<*avVyHS z=jvp&OY0V`)s@a0*)i*kk3#0WkKF_op`mlO$$O?29fQ^BsNp@S;)`}QH(9U}if-J! zcT%@h2h$p8s9{K-8CT6IBT-D1bY5t3bfc2WbAfD=M_sozL6&+gbGFp?vdjxk!s&a% z>v&B~_TM-4_T35_N@pyfbl{f6^rTws&q=aM6xPqGpM|mBy_+QGxqfPuH@+YWEkXuI z-FHhGb|r)wH_(b*Czgrt=gdSu6-yIZq-dZ}(M@bKGQTe5%IC}zHhR2szBK1{@rfX3 zzE#Mxg)|VC1^21gl1~!HPn;Etb(oZ3?OaDq<>fSdpbRSK$YpkX8{hjzRRGQlrX9NY z>LLA=@beFgZ6=`f4sFOtPHsk?o9}HOKhG|^^hU)uC~t0k!*{*G8SCzTmL_^ofT60m z1G68#ed@6AV9qD4bm;7@m>Nl{M#fHC-0RL0<8rYTvx0hd*Hd)!yIx2 zkc3rsd21PChjT&o+y~bJ>I`!O| z6_@`>rDr7XX{QBO=Hs^xp73o|LD%z&s${UL;X?0P&PA}N+hLkW=dT;j2fy1EB)7_kCh5lKQ9% zvn(Hxelp*oF_p>v?rI_t(K<$@?)sB>yT$79fFXx>LNjKAI!Ud!XV$jn=RMwqD)j{N z56hJ&_ofZq+o-wT#{8wy{dRco*vq{FVt4=hL4idvtx7ckq6?Qd)^3IKd=ZfG~6-BR;?lXIaSBn27WBZ`u- z?w@IxY*s6{RK}YeqXa@~%(fN3DBJ_M(~*x;Td4^Xk&UcjZV+jGcq=b$)Tcwt%}eas zuH)yFs=CeB?t=727vn2ud9Y{s?u{yx4iV`^{=Zl7STCobf zLo&K{=?ezX)Ll$q*F|76ic_@IL0g|~txs#XHeFi^q$MQN`Apd39sn_Ht@CS!?V^j7 z!!blI<5%fnWDJQXY2#}CSYI;Qqadd%$PGWtE`Vu8Kl!*7(%u^gDNF?B&8fNV^f=!< zckEN9u4Rv6T>Xf)X6~Hr3{-Yjvfh}3PYM>dR3M}du*oAOwd@%8+bt5A7`?$`*?MYI zUC$#=V8?LXEkV?+U3A|X=4?iCY?FKAHm8Dq5@i^wv<0m)X$lb_iyJIjM_q47R3$^u zk}h3ZO}^YcSEI3!AC^^CI+7gHs}`y1?8q+|vM{&OI=hl_$~tjny{cz@;soD)LGnx} zea4Mm^=4T;s>yhP2F;Pld7*|B(Ebd1k}JbVLY103hLv_-JQ?l!9Dj(H_k zmqIJ{A@w00!j;~c8fQiIilF9eHVh?(BcG&8kiumdoqE}*@J2*qop+?+7du%~*T+)) zx1>VuNDu9zJ+y&AlY-q@5mQ1p6x<&S)vZw9q=|lZI;@VyYwk-ir*KMtdZz~&!@!wT zY9YO5vQ!Z%hPFz?HOW+ww3sTvt?Np9JF1r5MP&0bPD}MGz2|Mj&ma;%lLblJ`<$72 zXVZ8%ognqd+Kaj(?6do0<|JDv21qcl%-nsQ85T3tQ^gF3Vsm;YPZCmDlW2-XI9*f26nH+PU>SQvn)m@o z=iE|I3=4O(86UM(PLZ-(8XI`VNX@OO&IuxIx&o=dhTbBd5XTZHvDm)X*a1~))_UUhtHHfDvYe9(Lv@ph%las7L~k20bp{ogGqh0Y&}yVjb;S^JMtpAzX#4# zs{yEtdsC^wFH>;ae(aNKx^xZGiD5OqdV=SUq`h47wG!Q}*Fybk3{xvRH(wT+)K5ms zkB1yGwFrmQI(Jvnt%aZsLGcoSJbGi0Ck^fhsgtEw*ro>a|eIjp%oqLk@Lm?^R@bpS&szlMw^rg2`kCRBZ{o*` zwzh>Ymvwq7>S=AT*ZSOp7!CLRm-~Roo{Af<&j}DcRn^o%*^EIOI$cKz5i=&1+^rp+ zE2=%!SBpDZic-y9CvUO12om&Dw@hPoPoMG&sO7VZl7Dn;WuD%sI&4d`fyEXppBoi1 zSfuletTzJPIw3?fQGSmQ6Ng$J@Al;3Cs%~H8c4XTW!JcAmU!BB z8vOXn2UW^K>DE|C2_BtEkA_*s{2@^k2G+CiLG!9A2fifaBie%zlZZ}w@D+3OJ)7kz za)l=|M-YWA*nqFVN*t}FVPI!uZNP_HOiOz$A(VcOm0~-Ff&5cZn9dE|t6%j3_8rL2T3;yydnvGkZmqt*#Rht_OO;fp&-uO~AqD%?1`a@;{MDtFB(;E+JA3giLtd)cz-qFEo*YS7Ms!rIuCFi|9tVHV9 z-K2UF+Q&0wcRI##&glIcJx%O1+md155b%Zj2*uU9jaeaLclk=lmPYx-A=`bay2QMu zV<$l7`WrMAy64 z(kX>W(4w1Z(We|l3R+*JUI-Ap#-Mk(n46xvj32%0#C}S3-!VLa*Ls@1lJM1?y2;0&cj!F+AjGn4c}>8 z0$Boh-afc;M|}BQs?X`H5Vf~ogar#PFlMR0IbMJS#)MRN`-hso5wLY17i?KCzEH*N@q{x$gW1}SG@`1R%$RRO{!9H^tvX@rAIrK zWaThN)62h0$Nn4#$?Bd_N6=3iZqGgdJ zin{Ct7oajzFX$Vxq!kQmY7VEl?8X>jIbXd?gwC^d4u8`74yvaX1p{L!=)aKH#(3uC z-Jo)~8tHP&Yz9s4iM|WEMG!lAh3k>lrL;|02XBHT*@>`4S@k>&`J-HpXIl3a3Lk_! zdysh=%+U6l07q3d-xbhe6`ZCb$So?uHW>zTU(0cS)>UzEk5hUZF43mQt5;9OK$SY<9R~L9eUb9Hk}m| zi%*2}lFEpao?O`;ky(EdmH*_>o|JqV)yG325>!Q zbULy)cSos){L_mKQt?MVE>lISut-Nr;_jxT+;au8k_7odF=c@mVrxjAdwNNvQC!Q= z7w<}?4Zu6&OLpZ~xmN>63VzT23M@Z|{EElxj~$pLk=!Ydm)G z*;wC`8|JnTgjdIMZN@$nt_5K(ogs|nPK@Gi*(7`Rvam%c`qA^1)&~LvXRcm)ND{r; zUGuJ>c(1P@BO&UHy{Fn;+8gG%B87>DC{LrLx}DpxkA_DmG_IUqV*wNpKm=oy3zOsq zC+$G7%G`uxi`kh|0o>Giuxs!q1d%#Y#bQih)1IqIW{gyG$Jr624}i z7-R{CvX*#oy01Bk(^5mcg5$n~fLVd|tGa0rS6J?7d?VaN)f|@3NbMzt!*U7a$*pvU zQX~%ZvQYvXj55R4ZN%>@TZZOzSRt~;OA)s-CIcmMCLkGvqm=F_w%7Erf~E`$P8Hwkeha z7;*TyzKfSeOBFA+mGOQ9aZ`tXxJO zA7w#y$#jIUX&tE;Ox2V1&P%Gn(OWJ%l-r%V3{k7{H5v$NL;?7TWK^i?#_hi6RZ1+) zRWSt|{k6m{OlVya^BGi^SHwymrpbdZDwIl9AR&}|PJ+5JE^J#JjB#fM1h;ySN$lT2 z4k2RRg@sW^8QHRjlVe#Tg*okQqiZRz`QPSGXp$T zt!QE(9i{cZMj@YU=2|ttsc@6Ic#0<)0l*kp?y7g{xo-507QEFm^vrQEMlcFx>r>?0 z=b>mS@1CXW-28k#WJbMPi%D<=jEx71%G$_~LiTi>xXFu~r8}7BAIa4%%NDzESwVMM ztF46lWETjPSmil4O+PJ;TNF_9%&U$sUVdWX`HJW)gBUBRT%tE8rqWd@VEq>LW(_() zfv2riZU1=k%v6*k+)m6ef~PjR5d zSN@#-YbJh>`13)&cl@*DD0RfekLLf-=(m}FDEvy{NAF+#f!^Ln9`#>*^*CSeuO73b zZ{^>6**G`e&u<$?;pexFgMa<>w&4gI%=d`P|M2HuO!VKN`hOI@zJULmhyS0=1739g z4n9X+QwxXB@w#**mcK~+H(&cd_@e&I;4m?XBk0T#RY@H528{z9;1MiGWbrK! zxE5b)aXE?ah#x$IKQVFC;OGZmfv17OY5VW@BMj=d@*hux#;>wpbCT$k?`?8(^+34 zIoB4e?wJGR<7zH2-k5f*D~a1E^3ayj_qFp+*nMBlzM}PbXh7`t`H-#`EfU~CD_)KP z%XN94ngAHv5X3xR&fY{%I%hOO&o!vbv9{~Q-W?uUPYyuWo&Nn`)rPRNV&XP((6L~R z-A@hM^emA)`K``vvg2I-xp!fwX8C2hS#I)mjrBCt-HVZZmB z6}n_c&fOYG#tHDPy`AG|cW~DkN#JSIa zgUimrBlaKai11H-i0YGEju>my@?VphI0h*!jH(0#r`VmS7g{M9M_E;>4+GN8Hd*UM{Ob@V6r|~; z=MIY3UBaOmdzIRvH`zeIM?HR>7pev=t0Zp4+V)kr1`>eG4H4MKPeu-ms$jF7y75-m zBbZZTllN@P*3u0&yGJi3DA+uMaw7&C5XqAXjn>{{F@mjmP8V8+YpxeIlr%DWj9 z(DhQ6?FYiyVrnCx9xv_?h0(=ivzhI0J@+N0d@uqLL?rA`}4lTtV|Q2xfvNCemQ~c)7C&dhbH7(0OXO6tT^RaXocu z9XpGcg57~MSlx?ue8v)Yu_YcxL>`EU9mz=8(6WBR7nH4mWwrN8M_1-?^o|H+w`$o? z9FYgL9S>7OM2^*x@gQ^}L7Jr$`FOAaF2*OuOOB3>$Bg7V_?O55;{~XW6G&iS}bd-V$*F zEjp=RxN`rNzKz@oeOS$0H~&6M;0Yx(BM4 zO;eAhMPl9}I&a zw?)9VN+9TSjS0nqoE~9;Y_>-zkBR3pejl|nil`$5dly@MC9ZI9+W6J>#b%{W*7FXH z2f43Hl1U6^UFfm8VCT=pkF7iLC}bJwauX`(?x9r~GJE5> z{!p6Sg_nb?XVg)?<;Jv8oolzs(~g039A2L0AGufl+BODTCjz+dpET14WZ1qu7!odG zKcGUgdxC@*F35{EXz3UaZu5vsBSoJ+J1-i~8tt|%&&@t8u3)cdD$rG*SItK3z&#Nx z8o|3`dfCu&Rj|`*uOB(0Qn8d0WdRIsLeH&VH>Tj^2oNs`n3T2PoFWWyZ*bV zeJ9zBV)RN=%u3mOCsqu}ht6_Imt8t3&0|c-~RcAMy^S^mgSXB#c>Yf;XYqQ2yGiM1G*b3pbJt z8D!%lX^t5UD{6~4vA!uxtI00%!cgMlT;5DQ$8}RJk>I`3iz5xe&KgQ80ntovrsJMH zyng3($2l#(ZWbGo_NG_GtC^2)3wfqJYoL6bpUjhR`IyJvX#;M?3yL9W_fNQ$oP7a% zx}=++-mgAlopl#J!W$`E;6YQE)-{5%hYH#+=lO{WZQmuRsQih=X*1iF^8+%$B-%{ z9BXwwhSml{zUk$4fR911qFJ)mW9CEBFH}Z&mk-%1-X#RE80D=vxqShOz9p;~F*!EU z@|?*;rS9U3^tU24hJ7ouv8`__g=SqaTIB_Ut4x7|P!q^nV^qmw^TAjWp?q$FXx=<6 z@Zbdn@2IFrU+bl@?VDsID_a=Si7LMW9IE_9)i{CKyZ?FlIyjqC2Oq6{(P%T<5P@&E~FJg4FO&R!R>^w12Wvayy0% z>I!Qg%sNLC)yRik)~jMEBuprHf8R%loty5oF=$dY=xE- z)F-b+h^?GX-%?IQ|LIVD^g=+ZRD=qQmxqlsnvH@;Gw}%T^*P6P`Yq>k@E6v`s8Pb?BJ zCiGr>TAxgyY&Uu|kE!Ge-;aAB>WdNVP@$JDaiE2{e=wn>)ZOyDDl&ORIMt(czie3B zEgn!-oVvH_>tFMsA|~%XU^mcwBV)~88=N?}Sy%i5Tah9GmmR8jzDzx^v9!W>zsL6W zf#cYqyS1}`fXaSXqlI{lGLIXOtSYX@G0|QLaG^&rq*2P0N`~3Izl@A>Rn%{mztd&A z+YNAtC~XiVOHUu{zeMc_f9`sVVo@}KN?OIROgKke`1+~Hcb=vGFvVV<0cn5A4Kb1x zxpLMZ(X1?bOM(o$b|P;s zlTpdM=)LbMCt8RdPo*_asd`uZfTZXS4{4y3l@#38O2l)?$AcEeH_oK4DW7EN~q%LHJFNDWS>LO-9h0j!I(tGSh#bUhWQ%yx!gN+D( zpsAjk5CMi_IvB2*j_k=5Sep`{Uo+(@I#eK0iwQydT5yfy)SA?c6^eRtZJz|H*U--nmmk1Oi1zin6g%S?a zRU#RwNnO@){@59`0mgVJSb{oSLfKkdoC2Z4QlN(kv>sIsrSIXrWmuIk5#NC%YrDMD zlp7M0r=hJ~kt-i1ov#}Zgk|P^h_Z&VM2vi~G@lEiyBYbc%+eu2maC33qQ%jTf=>OU zDP5|iz4QN5P8<+ANdKHNB(k_(o^kDpin{$4tzVhq11e0L zU_V@p1)Kz!b&ZM9Z}1)kZ8Z{9i?q3{kwfyz&K#LYpB+F>c`xE6By{7Tnj%T zNQ|%xJ*CmmriE>WzUUrldhOIy${m^IODio$Bd*kPVqHGa6hdc zKI&u}r`1!=s4>r;6M*VQ=$i&VeSQr?YZ_+Rrv(LmuT$S*R8G;6OYi9bh`ykQ8j>Ql zcP36~jUFRU>_RvetL(j|nnF{rR&4;G>IJG&T#{TKhR^7QMz7_J_IywZa@^FQ<}wt6 z`2`7LHg=X>qcWRDSJ4&KvRxk(#}v z>t>!>fJ$6ksfVYwYmH9&DJW6}>G2rq>D6ZL1^o@7uvp5BWNro`^C{V=$xpBLNChp- z4x;0#NE4N9&h`*}nQ1x)>1?#-;U`uLheKDp&yN%c(A*DCzr_|}n-WU(nM)hPR2Jk3c&BJzA2F(rdEb=rs#i}GCjl1&c{7i%` za?*}VLR$|!b~D|q8y_KOw%Com8XEb}dk0PWjWFd~mz<#!vYpE1RuRq>eAyPGip>3PYbG zp@!UH&^t~*u4}2ISdnLyL=74OT$Z%;Aa%W$(->aQ7^X)YkQ@l*Q*Fa8=s~~?WE|Tv z3Zzf3Fi?bvSzmn9EaH+X$y9Mut;6=w$s%&*R4uzOIC2Js&WLDXx zbMC)fN2a}>3;(qB{apGz4g8+?SN9)u|2gruY5dg~f1AKRj{WD8{Vf7NI{%K1ujbg_ z)%;VpUyY^S-oHKhdSrsc#lrd7D*2lOX#eVSz+2D%{2Xw0;h$~mX#83DKR*ZDsZw#= zc~AT$fiqwKIX{0l^;@I#?>dX2C5|F2e4U&l%lNnPfcPo|&P0yCj;hhPf}=tlOW*t9 zqci-~1^l@J-vNL9pmdbL`vkt0;H}#*T(}7_oTVFgfc41qFOCx-H15nQ-t>+4l8EDk z7taJfQh_9HK{zsrC;QD@j_Ze;37qNvs3k6kx5s~H{RcNk3>^I& zF^nUC4;g_cgueq3FdS92%NJ4KX3Rt+&BI8 zx$t-VbwnLU@XvAo>(t+VnSV*<|BDpFfBDG&(FOMHoaoO-)U8}Re=nckVpaVlpGWSn zU%cJ_D!vu&!~1p|^!ou(9H8M_$$#k1_=?Z?dEq!B`Hit3?u>uw%Lw{S5S}A;e>~zZ z`VcplKhFl9j~`9H0zLlaY1u~L%RR5bLTt7Z}GlRIMM$VrEnBv;Fsxv zqs0H+^RvH1{BqCF7%>y01uC!7xsSO2SKglRjHU2;IqD~_pq@T5In`c_O%XOB5{^fb zg~&yS`I#X>lFYbBT@vjkU6u{hR`u_JL;Zz_r{2AWYnn0F(JgObW9&c5Xnyfg7-4?HL@Hd=LHEcWsDHl5n@Iu z?cVb*BDA+V`s>_62U*%j8sF@nc4OHsiKvPL@5$1n5TV*eoXeiWtE7uSGRwpLVrO9X z?n5y&AEA<(U5W+u;l%9oJg4JQCU?XvLhA+w#8&qa_v0aPeSneSb%|l^tV|M8;>rUg zdZ!xjsv zE_xpJm`~7&7@_4zAeS~&QgGS@D>d5lN}rUd>YCK(+ql=9I`PE)FXhFk+XpV_Y&s9l z%pOmYK{;1vhAXey+;%ao7va~OV!7Knt9SkQ>5#mwRlggzMv23&0hm=C*Cf?G>^@Vj zpWB*@akz8?8ZrcORM-1%v@MeKub z@YuvX&LqtTmSvUBQ73eBsHzyu5ad}>M@4V&tQq@qlzbUs_A0O(v)H-ogB)O{m9%=< zL7v37|89PM1Cr4Byj6V7X|bS!f9pQ7w6~>u@qk2!^EtZxo##Ed+pAPif|1+J^aW!A zvzLO_pNW**K#UceUniscX{UUXZDEz}Zd~=Uw@BGTp{K@* zdZT^a$4l)~Mx5e}I`hNtWCYxt+UZr^_3dXuZMB=(rEFtJ~2 z{JO_25%-)G`3&ft;sxOg+7C{IL=gC$kXKM`lvE_M0@WCqj%6_j2uE-qoE|e5b3qV_ zb9>jcnPLrcBegkhGXa`1Co(VVYsYAL8=!4Jm;$N-$&u#P?)h>9Is4DMwA<8gYLBDx zWb;3qMCi#e2$&Y{a&cq4tL5{%-sca=F@}1vz1bp_yDa1?Tys#WyyTdF19YQXexPb6 z{t8rJ7}%#ro~-Lo49M4?3%@<&9cY+zOiY|IRv#LTu7C&oc*PWB)%+4FtoAC9HIW^;ciwFj%hd6qh=Yj0`s4b z9#%@;MU}xP2wR^$?cp}$LP1Ly`U8rtJ&~daJTn8-bkDp@u^fa5*I_TP^!dUnOh-c zXS76VESho7vgl&&CF5o*QmA(KgVr<7&xlV7%eJyr(QAiCzar;hxGA0(Ib#*)rw>%5 zO~vhMkJRJ8^Dp%%#>T&^=)direp2*5a2@~Q zw&z>_pLZZX{dxbs?Gc0H@T0hYM1L!iCoWtk7g2r|`H}X8<0EEC~``u{9OLcWE4vbMYBg@-V;x;N83DfxB#A(MUS;!d&td{K%~xYh39KwOavNI zcb{ds=RLc`G#^(oN83+}uAq)6NPdnOd&pDbsj-(% z=TRz$2Dj#&Yv3?eMsn7uVz3LwF5Jd5EPA~S4_kco_y#?Z#joBqbC&hzUMiTnzp(9d zkO;ZA^L*{J4THUs?ShL(wv=v1OXDY{JIwfUds!iyoyL*Y^_Bu{ z(@Dy%hEH8oBVHf`Nj+@Glol{jC=>#abGK!Q(BjsdCKJ}zrA586KEtTf!0y`{p+O$= zOklMqr*4ourC>#hzA#^KsE(Ac@@}%iFmH!eZ?29yoRn7(Mi>$Y(WMN>e&+JzF8br) zF5;fhotM)Yk|HoOMxCMdT|7}^7nJvdj4G^zJG zP8d~~xORK)b*IT2;ci7?%-pK`APQb(&?i|{-L4!W2qbWPQm|5JNNTL*k~Mqw_0C;N z%~n3LpdLM~NJhXL;Uxcv>#f$b$b2vD>8E;&1WOP67K~VXyoHf(XQsEG^G(yIynBXS zPSXUzbn7P4b$5jyGuiHQG)zVcS8<0fwJHP6?J+jt3HO8hIY{LiQ=gx*>}o%Vd;B6n zhI5VXa=<}r%mcPtwjRyG1~N|bMGfto-MJYbwDD7`Yrupv31mP+N5SOrhxSdxf!uOzzT z(fz*qYzk9wpU>;Jj2Ap&&=PZN9P!sG`lMf?ALuL+=z6JuPRW;+11X2~k@@LY&b>K* zt#J1Bmy+nY@Z;?Y#cu;fYZ^Y9y=`2+#5tUjAVSydu{sSuJHt`F1GXF_WgmCyKpD9H z(OLK8dd14QFaqB=fma1ZirEuT{)^WLt7N-}n&cX}$Oj|}dANrDpi-L=65zeZMUr411a94ni;+jBXHqPVh`v4^r>j1*ssMAb)ww(=P8U&N)o`$2)vRSgfN6hZlnNgr5}*T$aJIiDc17&=i)J4cRuJ zvPoH%xCT`ya_2de%MHEcqpMmU?+D$fPmiw4d=gU{n}p!u2~T{ONIhH6W9byf%ouiy zp9upitdz*j6pNsy^izSCD$Yg9ZW^SQxe5-)vEEFsF`&w97AEEWaKg*+T%se1nY-dU zcFf4x6(VI)(!GQeL?22r8I^^Uk*sWDaX5GHokB&9Yr0cXb`PA=Qe1Qcvv|Ke)Xee1 zc!s#BIt&Hdc$VvX&_on;?gYgkSrvi`z&BwTPGry*9HA`bRI24C{jvmSn-ex3jh$Kya0?L(uAi+hbRaLL3DYXy z7%4oL+~fARxQmQex6PcPAoxKI|819t#ulH91y@|*QcN44tuVUrU89nA)Lz7;=v;1? zt6Y0oP~M%Ycr*8DnGoujxuG`$w#if+t)yn`H>k2^d)hLh;i6)sL;5k;io)pT*PNrV zuJV+DNirW?WzqsPQm|zjGRzV$=dlCWJ@4c(XL#}bOV@zgW^UuGoK-_)LuN@N3PUXI z4V#Ts21x(_)Xpp-yeJKLoAV&@`DBv9`ZIF4_Q?Hxj5kH#c*= zwM0XIp?>tbsS^5nG0Iqx{TY#cPyU^fFMBG?7ai05T2fz&i%(a_rm&kW>E;&snwRw!Hey+Q`Ca9gwx8Vkf&XP@KsJ<(DHJQH9et$WuT?pmHf}h_Y4XB?BO@5fo5BPN&L3`CB&w&OG;%t>o|Q-~QX1w%^#2 z|CMzHhhF~0R`nyK<9`ah{pVn2MhbuNj>6doZ(ze}LW^ zA3<+8`4-uBz^?>3ZMieV)z4B4c4{pc3u_i+MPj++3L{Np44@dWS~^?H7D1A-8+ZmGQkA@RTpt$s-?)t__f z_gPwb_vwCrINR-Sbh~cjhyzeGyxOC@=;(3UZSJ+j0WX;>7D(b8V z1z~iR*n&{5fXW`1?XZI8lW4-w-eF^!5dOq$?ZieocQ^Wc#zJpg00GQOfSq0sNz2(Y zY|#`QBQ86D%cW^e10cLyJ>{QCMD*7f_`!uadorDy2FKMenqudd;9~lHKG(I>^#h*E zhhui#^Jz+>0|Il6mKSNXk@{_w5IntP@+K7TfNIF%C z!YqkZjItj?L^Y~Ps!a%0#~YDH?y)Ugi_L7bwT@a?^&GtXO`_~QPp{GOJ69Cq$i8b- zdw7>@;ytch+=(F!6@oGp)XoooY~Jd%VFD74E-JR;&Y)>JMTkiAKLrSC9Z_?KWFCov zAteH_aKBwLe!ct{Mu}1F)uQ(tW7zD}<&5rnr9_6ZCJ3m!pI-kcXPakJBX3Ized`j7 zH68Bguyta=T(a+{&6I_2+_J`doj7BeMB%}`82a`!y_TcQ%PrMUz3#TQfLYo)Tj=B= zcDk$&204~L$2X{H#)l2+@<$?)afxqa-Q(BM^n70z>y7MRbvPM4osDNXfJAWmKF1z2 z{oYz9MD{MFK~uHaIi;1R*(bb=%C)d;^!CxFY~N&xkm3L&=SK-pc(ys6Kb9TNS@k-G zI77n9Vs5vAN&RAn-}~vcq5;pB)RE#1>m9|1tJ1S{$g<~V;>XwHn;#y(B32x~sN3)| zoFL09xO7P|^myS4rr7Z?VjOhCgFfxD!y=@kCBy|&_sjZp_{WBk_?MbFXV~6u>5PHMGbu?c-o%@pwOKYS)<*XLxdtNr)XSw5;%I>$V$n4m`fRl)er&>>rI$_L8 z>JJ?XF6b6TWGtF~ z%gt0o=FiprMbR^NZ#K(12ljxdEgUOgH&&Hr5Ew>Y9>wy+dC)1zuYJ5_G{>??SZku= zx@M|`Ad0|TEry)pdT7Qqxg-baYJSO^#oeY%n^6g~r{1zzgtPIl@d{?YuCQIy!uG@I z^R$zArZ(KaVHof~;oYMX{v<#PW&~&Liqq#tO`6!>akmOTgWzQOnQ4$(tEg_VwG?(e zEE!E@!0lC(JAWzc$YGri;Z(qi1^~-AdQ~)6_%pNRpCNXJii#&bjSqqsOV59l81xV; zA8Kh$<@=V}uvkNUQvHoSsc_9%?@i2gyjz=~&57f4e7tm%oUpzmPY5|Mi{HsguKN@K zDX?9PDu{U9RV+p>blngqJHGN*GYTebF8j%lvy_g4dt;+o1y4d;-TMZwvVDEl1C`s{ zJ_xQw#mzgykEIE4J`2yJXBef5$jT|XLx)z{LxNH*31>xBjM_?X!QBzM_4p_?;j+<& zy}(KGS2?VbqwFHfs#P`ztpbz7lmaGf90>BZ7PAO$y{De#qhY$cEbLD#GI+~!@!Y$| zhr72+aa`msn`MWo$dAjNIVCh(Tp!#U=zO6DT>&+u+SU|rBbNZZSNwGP6|sp9w@T?%bgaf>t1JH=4++BIG*D=%bs$ zN^B5SBNv~GYo9RhO3G;VDEK~m!D@atCr5F2#JWHSd9H?wiI}JyD)=jNZNA zn(#chXgL`2ue`aL;;(k{iC$~qEs=P`Cyl1_AEGPZxP>mIYk6u8YDsd}o5r8sjc440 zc?u{X#76ZTE)GH$cIe0tZr*d(0w`v_z@?V=?|379xWnP5y{HZ!i`o!ov>lJM=o4wb z*5F4U;d<-n|MH#n^9$xTQ`O)3&O$p?e{mT75ySD{G?e|U>9?!@t`5Zi2LfoSGiZ)&kG2mJ+Oi>G&}jIK%x zqmc{0WTN@EuQGpc%AZ^Dd(Pk8``=u{)#&{T+{WRr-TD9UGylPSj0Rc!VNv$?9N6es z&_6Gc{)Y~1G~4-~{nh9Q+20!Wt6f__04<2}ckSB0DpbKJLCC(Jc5Spmm3uzgt}R3x z7v3kA81$D4RWV3x{5$dZCJ>Sdz_sA%QBO1}ij^e_h4{(kyoqXa6{Q{6>f@|7Z{Uj` z+Gg^*$is(5YVQ=QopA=;64X;h)0@mD3sgpf*d*FE5NP6*@TR0{z$rUhipqP!R5Fl7 zxLQ6cf4I$yHb$wT-LE)AQjiwdFzcYy1~(9-abP0NEcm2OWjfJOpEjE;3ZV@b>XCbK ztA*kel$w;b7t#8{Y|si*Y2~|HXKd}>4Y|Z&PyT2X$)xA3X=8h*r*;q5UZ9}VVE?Du z;ERz8ieudCd27d8?0g@dJ*wRI_AWvOcYNQ+#a5VHm8o4xr53^N0v>d@D%5o%37wWU zgET!e&xCtkY0?zfarq-v?$K=cmf%dUNq<+NWDP}Oo8Zm;1reofI0t@wxmm^^rK zvjepAY_*$+$$3v`6Xk{ZT%YJ8Ip45^_y~P)B%1J~R<9w3FbM^L5Xn=aH~^NaWkNbt zArvD>ORqbm1sCd%xWFKjPFBTWO;iWZIye+Bq=S^@p7S#pp)Mm@x^Mr7gW4I>IK=fv*@JI)wVXfM$(#3%4 z%G~EQJgX}^BQ>LGf?e#2Rh`rM3d5^r4bASw&8?<{-!zZ(#GeXn=7C{x@i&0aS8JCL zC+n87roGIVvZWyi-bprG4%dSTwy|5E*|{8l46qt;BV9-doyBXOJ2X4H{g{ zRC+g;Fj5~}!a*mgXLPGtLJGLgUCMSY8Q$c)UIkjQ-|hua>g@(Ut&rNKs(BE0h;hpm zrvzfT5;M}+5x**bS$keHW@`0DdMd5C<6HMxcxBFHe5b!gCjZl%u6ow9D)#<^wKp+@ z>r$1?K|@m?=ppqHn3GAagZbf^Ei=I`D6tiTG!Bc|c??JeQtpY6_RF4oX71Igm$%rK zqElQtlNl%n&vC$>rsd<4cjD7|qtE21(UCMFLXPRH;83L<;3Q|Oki8>>1{&=e!w-Sn0Ydq8ME;ts$N*}++1Mp;l zFiUaS33dhQ$_R6hReeh`_vKhLHzv{1+qIc>f{TNwoE?mCi=xHizG;2R_G*!dw6v~w z2U{=M9YDb)H!=zv=Jk@=9N$Ww=E>TwAqc8@ps7c)kmN6kaDKp$D^JlyIpw4^D*({+ zN*KPDImz)Vru6Ygy6!%zTfuG7b}%$KP*_?*{Xl$l_D$hCbWVmq=lB`sJS7s{YlTT# zG4(a{-1x5hx?K|N1X8a!trjB|=xWr4F{v_C5?xIE1cmAI;T4A3X$t;+QnL9%eL|-> zS$+0Kvpw`!nL$}}ijx5qQU1Ao59wnOT%Iw&kzyfy;4Ez&eSG*#hhf67ByR!&)+)|f{{Ew`4>1~9}N{KW{Dxxtr8lU7k zN!cR}OAf~a4n1e2BtWrVd{xOY26>*xA&1#?){7<5);s;newT^B1#%H`Nl6H}fFl z-#JxXi(y@K*w`J{_SA1%!IZETLOt}HtglB$^`B-?g9xzQtsRdsDP{r4J7!T5zLC34 zN&}jClubnO^n1FuJuf0AU&a_JUk`?*7s9k-17y_rqUj1V1Gr~is;iy}bRN?@t!j!D zMXrcpA=g4d&Mr1*7#+8*EO{6aU7jQutDH^j;dydeF8kc4E5eR}^9eUmo&zgJ4~_uYVS4o}rn)uF+&d|S6^SKW%(objcIoourW{ZeOxP6W zXz55Uk}!D6|D>p1OFO@sH$!f8Vs?&hUW&=&Ld_2AW!E(~oP#cPTd7c!sgS(-J85e4 zuPO~SUC9Em3?`6!C8{LAT8HYVDY7L`2+Nka9-fK7jqODaa?hUFnDL0tY|=7;X=jtX zJT+fmCNt0Z=0)=rxfvdB){RM%i&{AnY!TXsZrd!;P`(ROVkC7R0wo+!T z|3T~}t!ehO_G7uxuEl`~R+k0cTE5(g@_UpBXDPRq_XBzWRG-S$#js*Uc&W2{_sY6d zN|y+CW9sx~v5d2PTBr;jkfDVyt&gaMCF|XW1Y1xS63YX#{iU^Ic9Go@L;RD*PFW$1 z__w#S2BzdT6xoVX=``b@PGrUQ zx_$SBY!q;{_v}V%g|}k*0mq8~AFx=jsL}A!<7CDf?X@6!`5)<1OE6?0tJ!PY0Smu# zlMgj%4UQhn5|-|H*eb94qTLc|GxQR7igQw!UL8qAEH3ognR)WX$AEg;UN>ts3sx{4 ze9&b5lDmu#tnTw!P=4P9E6h33^YRvYwinE-gZvonY!!s(Q{40>3-hu|b{x=pD4=tT zK$kT9leTamKqu+)^pW93h6%_l2Th|R{b31V41Jc4vb|t@L&#$kX0_7l zo-2Cds>c2GE&waEc)A=r@pB!WjiNX>Ix->RBHpTPc5+gVnE;qrN#sU@fH}V zMbIw+1OxQXK3AwbOODf%-Z)S|_4^M`OW2#^anj&o#3DVU?<&`Qm@W|^1%pXyfr(8* zyK~^amGjU$6xjI9^Ba?&DN#g-x&Pu$BNWnL~|FWY=B?xli-;?{L_M z+0vgMzRuvey?=b$h?m4=T-=JN~rtUu*Dd-C_Qv>fLStdGL2$@ak3`&&8g;L z*p}F--v$q44fG(ZR(XW2B!X)`iTEsugNI*e~GnNa{F>u%5J~m<8>oXzLGM8%X ziKjKM-V+u*&lLNP*1^#ihrX)i_qaVhC1W)`6mGGF<_%jLEfVVzC`n802#|1wgV_&> za3~pI&qNM1BdeX&ribO2uTk$`q}L6KbN2wp6f>uXAEKPaf(8hW{E5zNcPv7I*w1X4 z9sv_KB1ym!Z`Z_$P|Ou%J_X9Y4lD10RL$LMA|sQ9T>TwY++Oa9MV0g6oCXg|Y%8aR z9hs$<`m!jx?LQ<&-VZack3bcX#9th)J=J1%ij_1+e3xM-K?k|0jnB(mYhZs}CG@&1 z6htorxOT&iX7M05_Iyr4zfXV|v3U5wjeb|st6{np`AAnqiWJA-0#~wfW3C3d=I&@m z60msedwK0ZJk)(M%2?tAD(?2SsE9%eNH9>XCv4asa!0{n5F&X&x1surNmeiML`nq93YQQy#EZOXYFLtCK< zecKxckIeBhw;K$6Tt(4oh1E0mT!ax^s03rS4`blG$tzF~j`8y-^q}UmB=({UJ_?d3 z_afmVlu`N)I6#Ufo)a1@lZ}}07tc^5A+UO9K;1AgDc7}z&yRMf%o`JQ4k(&Y^Fj{Q zB%!H19+DN3^bp#WGH}^lUPi=ouQ0@bICFifentSC|xg5kmL(@q32gvvqmRCJP3KgS^q#@tUj$;$jY*U^ z*xjiZIFrj>Fpq9^i6wCLeidtDaKh)0tHQTfuO-FqrGbS43m~G?m%5BkEjtOA>q0dp zA!@ZIH~7O7@SUFn3mg4~6&Qxy_cV2k7r!WR=WIjO7*flL#@&bQTgQn%zao>e?BC}{ zY6cupL#;xI}EXfv9SF20h`T|qBB2|xb?u{u}5BY1)zGNPn;5B^#nu~Xw?%5!lhsXEF z+}?E?)icBlSUw-$f1q(Jxvx^YY*deuF;T>O2*nKf=2n*_K0VN$u70*Nzx;i8kNd58-cXHLGL&w} zvd+zlg|p4FuhJ#0;`K(iWXBtlc_oX?y^y*-$3rA)f5h`GbL~vq$|h)XNiNpsh6jdT~K zvK!U;E9*UN@;V%5+hE5~u}!fOIVv>_IR#!Rm$D-{rIkx?uL1ACD@ZQ?nO9%_TMKv5 z?ml}HEO5XLF^#PoMf<`ZE&KKOYY6CMY$8E-$G&h8;10mlX$CR?pck#MLklkxk z1}H(D&0^*rvbCExb-iukVaUy(QU9%V)*8&#DwtR)ZyDCxt7%2@+9?iPLqbhkB?vUjM=?Dz>K zMYXDKeWxM!^m0UP?Dq)l;s)ou6p2ZtC~MBZqxDBxC(XlEya{-{l^_uT^nV`edS zQbizv<6XVIhqB`O3QO1-PvFshHJ>>z3RahG_wJq- zr|Wuu5u7^4&>48fBIMnaQ|y>&s?qf=13seBqxcNqBPwQabo=tw+bL9Jl00kS6WzP) z{QQ=Y;){`Gv!;pAYP_;_y2Lg@x-=J*YfBSA{gnzQ%oLXmdH*J7j5Nd7PkD`}?O7!@ z@a1Va9mvtdlF%2$i?eVsUQbM9E;Hae;NW3&qz-XFw$%ImxROq# zhu$IWhLzel6qCd#Uj}|p#<8~3%7SDn^}b#qO6sT%g2*#}f5CZVr-_=Tq89$prvH_g z$0GlrAZ>cZN!O0wfgCQKxhS{o($3+wyn&qoHn29mXD32JF|?6G&m)(gh+ayHV}x3iQ10=$+K3^}6LuxK_=;qa zeJB-+t!Y50T8F5Z(nIsM5Kzn=?!)R$eCoA|^|P%D1BFJZZr%jw~}vP`o7G z*;Iww=c~%?0q^K@rB3y<^cUFp^V%9WN7##=!yYoyWvHK2ao8MVJE^uoa_(VlwktIuL>HZ71 z{Fhyc&R!EWy#aQpjtGm{qI`|(olQfmHrUBYZtZmKiX=TrkTNA0ZnxKMu(X9q9KE_Q z;q%+V$s|wbu19x^<@OY}qg4^kAObRryPs7V?pM9tb&_)l^B!tEdBm-QEwd>XA^Xzl zZQJ^6B1datG{P|Ey0uL&+uI9vTzb0@X7Uli+px-}mwDb`m!VyeonjfA0Vf}l`-+oWm%$%1%Gezxe%4$!Z#3m)^}6qPgTsfXoSd5Ll>*Nv{ai|& zh|%Isz<@=f$6^0=f#wf`%>_xrVfX9C)f!P!F@bra#jg&UdLtgLcN=`qB*ZF@uV}#* z@3x&c);L$nOC(tDxNAVyibt_(TI-o9^~CEF_%)G9C-wya-sp~G$-&a&0Yt{v=eMLl zQ1TuRb1UNKHm>IOm`x)4&&ysm7+c$oS-p9flMM3Zy$LQmzy%QDyiWQ^Ebs6Y5 z+su*d2fa~JS_FoFcr#p+mxS>^yO_A{CMXVm^g4EQhT$5HUNxFgTdiRss(bsyBB}N$ zEvh1&J8uJHHX{L_sn}5pSBN|+01$=9WNETHOuy$4FIqf4Y)wlM&jOh~jj9CJgE3SK z2QySyo55gl(%U$DmB6=msC2_dce_kEZD{J@nUfYG1xF2vYq&((U9lJU3G}j~OkdWp zkb5}tDdg3??V~1P9mQ>G+;i-}gM5$p3QX+4Il7KnuvQm?C?BxKWASTrSLAmG`&8_e z_h)YqnU)eRHE3vmB`gbLF0rd91Bd!qV$6Ue9#d6`>g$q7+4J3ux&Y05{lWZsc^7oe zeU{&`+izC}C%T!q41(mt*HEWQKk88M^i#J@mLq*_J3N@%ePn&02L;xNvWXY&=b63c z#$~Uu+coW&*8B*EW2&{dPfUM`3F)>dA)+tA--za`josCxSc|=}wrwlghaYI|-15ec zkz1J)?;S2iBz`C+8rHH`z-WY!!=1{`?MqkcD^TjI`ZCikGaQntKxT%qBId~GL+>fJ zV>eGEsFYh7BZnQ@>p7c^In;y%b> zUMZy_vhw8G;WHi^J7K3$mC~<-r$yQJsf@N5eJX8vMd=Tf57fA4ST0yN_gcPr9`rc0 zbcI^NlKTLlmF`LS0dJxZHXh8g8$g`vF>We<$Q)J2`qlYe$C;|4E)SHzbx2Wjs7$f1 zbVL!%^D)%4C{;t5M=?Ps0-znB*6{T}0j@D`F+DS+pLF~2SA>Ys12JsdacuersXU05ayKjD{Y{C?M?zX7R0d<21)rRIe-fgPnc z@VV{Y6BF-FvFxC{cteCkdS{c zOOMqE>;nOnc?T8K2ghT==ZEKbIF-j_2MERoVSqDrgeR1f7sn{r3nIN^@pbPubdUL2 zZI^1V8713N3crE zSG)aiM7RqNjAD#>ldU5t4m$mabibUVyx=h_Bm`VMyT`3%EFP@-{^4C zz;mx06gELj_*JCb6*wGf#J)X_g010pgsIyQtp&AhdKK?mfU%3f0Xe%UYGITyP(Mww zrS3^eyZu3+T`ivzKvg9)vuNX$SWz89OVSWy#>Od$3n9wfqQiA6+YPtCw?N@;WJ@7r zTpQ+}Ye$H3Jyu*~{9dH3ev)Gq7pctF>4|+~8JeCB%?8y=*~DG!Ie4P%t2}LArm8M}|-)J?JG5WoKlN7iZd#^;hlso{^iIn#a}qQZ}^C z?$U^tqXdSl<7tKU)FSMOB97gg?{;r(!EvAQuI z2u07zq1?PPb2)5Xtyw63X zZ8gC@1_nE4M~EXtH3xXtqRU5E(=YHA?*1dhQIxuztfRdJ8USn4sNc+~4Y{08Q}t6K zx@UI`;k}8V+<7#4-PAYSiZ3k7S_0nzQNTCsMPNmI4G=bGs^wgEAT#P8)#z%ME|~E3Fq^$uVdYpk_s!G zx5-<=!ZTG?sCQW3oaF4vCnOtk?NbU0ckRUWV6HAsVzL7sO9B3Md6=?S7Ai1wSO$^J zxDVi*E{zURPhu5kj!4D97`opbM!*)7&A6(#WBom-y!O@z)0(=7c zNE{3d`k7G2;Y6(f+A#Jl?NE?uTfX0+Z9ufC`(7cSHF4L%jb~*X zhgR?Tl6b3yQ`6RGAnnoqUea+FRKU+3v(|u#7={&@uFtdK)fxws49)A-JsAc;H zdw>OsAgF?mH?HGkkLh67%VaHgOsB##w`?05H?-oM##xF;&J<@Q=LP`B@4I#`KG)=DF0H)}0vKg%tkZ6=eU$RXFzN8Ge0Iv$$pYA? zZP)H1?xG!#?C7lA!v9NTzQBKt%;!~eL93F>|3sSnq+^kkL|eN4pr0X(Cg%8QB;!>^ z19pBBgX!>pZZ7-_#Q%T69`nz{ z?C93~6M4*4?r-EV!f5gfA+cY!zY8t;Q@Q^PX>_Gm@s}0wiwU7e7ES#APnfK$Q~@DD z`m5jHPW@H$;@96_TJY=9Z^eFI=IX>hUGMip5wU+D%|If;Xe1eWq(smH^ul8QK!sgp z3!sTdem~*oo|uRL{Z*DII)e79{Le%*^$Z%>g&xVPntrR74<`1H?*1X^iXGQ?{_cl$N{=XhKlqX}-V_C?WzH$U$mx@7X%(Tpa4d}Gm1=@l{2f3^J?K#wMfet%g0?|WAyO@CG5f7K)QR~`77 z_WyeE%gz0NMa5ba-XEOj=8s%?JUqWcT zl)tn6x%r+yXUIQKU;mh;|A7Ae`4#q`HU5`z`ECCCXQ49mU+NzwUx9y++5P@j|KxJJ z`bYnZ?e|i@@BQH}{Y?BXIqm*TY4=M7{|TwxPfoj^7rP?1yZYY%{dsh~od5FSKqvmo z!|?|YGl=)^d9Tq3!C$_Nf1?LOkMTcJ{(Gz;LjO4bk2n4gTq?hztNGENPk+~YP4!O! zs5q?GNTQSgOme6oXEAD`d>aL4GBUdmk{B$^`*fv50=fM-di^BEFiIeRR6hR-T@6%X zoEb)$Da1ts48);y#v-)nxKnvK3Zwva94^kLYByYoYhf@nSPqz{#hR$rudd{0qCgu> zh?SIyD&hzuB-qNH0Y>X{B&+p5Xj?2&W=vFK@<`LJVds1`(3Ep|6=f<%KhtKwPe({S z2~Z%wF``mTQDEyXQ-i<3fdB_s6pZX+MJM}g`xv_0T={6?!mwsCJ3-IqUK534My}g6 zhxBYWNL~(l@==`%bp#o#c}Xnj4B&*8w_V|_ossG{1ozQ`A)t#Mx$GML>Icpdp*PFm z-*B-JiPf^2Iq!aedQ`1D;-lMa+v2fP_6l&ZB@V=Rf@OO@gDT{YKDGsC7fIA_C(dDp zW1|i+~oSK0QS&qng}SY?39gQ+VLz{PPU06+G=>8ysx^@ zc~U%*-hLaPN7Ry|T25<(0=j1+XmLpnjAz2JLl4BCB|7H)h}Q{le$|%WW>Mef+Sn-3 z&ht8YPmK`c&9w$+XF{s!(auZ=XeuWgqL}2a3zX*NrfchUiZ!m{VHzi==E0Ob28srU z41cc`93L&>R0ujIuO)oXUdTV*=e(+3b6mA2!9ydzhDRoeoG-1>&)iqn?JK<=Z1}S7 zM5pGR53i*B7)73R4#Fc9S-d{5yLbxrj3qeG9qIuE>6zW^8Xx+jw z?MDnXC;NrqYcG6SsH8;D$)6JFP}PGG=PwIDV`I)@Ia)vj}<(TO=DG?4Sm9~?6+D&iwv&Lx15^%EP)7C$6?}wE>yV*AbZ^HsR8H1rZam2uYVNm z6JksORbbOENdWO(SI(}n#VQdU^J)G?4>(D>|WZ7gepDHk)W+LAhY_~TqxzurYz>+xzn zGPrY#$7Ge|J4ID4B`%tu-nJ|BHR*PAqP@SsohCbK(Oi+(P_A|BQ_z@ER^I-Bs~1%+L) zxyUu?c)HutGM>Bb&+dlQ7_5pf&wEg8{oqt(eqUC&RYAmL3d(P}CWLhi z#*}pcvXhfalbvN@``Ly@43IH03lTqIWMr>XCe54nG(}*z$+1|TXJnRxD95CQc-5pD z?^QKZj~4Las)10l%XmH6cRY}q9eL>zByjcb2(6{I0_B^eTST|zs+Hx245hns>dmDG z1w{%Cod?ayB-!vIsp!}Nr_}r!F3#l}*EtxmlG}t#!k}GHdW*HSk#FoZQif%QTUDg_ z0nv5bm7&SelcUtu2yOK{V${Z+y4b#4dO!#uDj+8~QzP(2J&Y4uvY}eWdw<05yC6&(?#o?@Q2eidWl(_9=hd_Mc|WZ z>wvrJkP3r638Z*SkQM1GXW3VYS_;)d*}Chhyw-w4$z7K*%%ObsKw$taxfyXX)ILeu zqHsw&z^dLH%v&z3w3ly7qH8V{z8A#w0GI86^J(B1Ryen^<_`)5xBO#%j7EXBrpMO; zhGs#w{tY>7|r*#ox+adN!N{Z2W_o!K5IUw^sc@0CH91HnrPCvH)t#fcX8!2wD zH?hqVQjcdbUk95Bke0T4L`~(I;oUejM%MKuOctF$k^)hD>L>>Eo0r_0j=xSw#%F}o ztc5foE_?GY3O?dTEjXA-XpAN?+Nd(5Mp0E>V|OXT^*hI!-6L|6r>-P<1>cSVM-)_f zm$K}L@Npqc<@xKmmc`~WlGg?afCY?N)VOPnZE);@!Xe0M*Yo$8%J^9&j5{i#Ne$x5 zG{DmS6oh)~I3nw&mb2z=+-%tgx{{duIJt%a-+qCW#|f1iW-oA64mv!yt5Qv)*qR5V zJ!4R&*B5-b1dm0GKCBVGV&?uBt&c5Ak@_F6O~oK(}jxUdKe{d zw^7j1{fe)6G&W5qagF>iDt1n+$Gf4{8kO>v(jd1gXJc_o97$}hnS;=!#O9Y${5+Xi zg0tcZENCwk+?==eZ`Z4*Qh`u6(Kg9=&(=?Ae4%VsVD3pSE46kxOyW0lJ(B|G*o;S| z^$=?pq#S$%lMcSIa6N9vx0I!vbrkSh+Lq@cOO9G%{iNxMrPHSJEpP#5e4s(Erd1r- z(fg4(U=%t#piU|XL(+s4RGu{h;=Vj3lefZ5Ez5U1MZW#crs&eNRD7B)@r1vbVvc1t zo(C*3br5>JMg%{L_HLc{@(5tlCOkLk^{h@v^HYnX>p2Ngy&3Yur7_IBkCShFFHv8O z&0n%SUQ7`7X7O^oTk-tSHPc1-(3iQg(2L@7pJz9sPwpHKh@Xq4?@wM>gpAJfcH8Yg z=2`PA1Ll5}&%w;EK1$=#SMD;sfoPxSE*R2aggLG~)$>j+)=&7RS-w9*LQX%1eNBqs z{hEc?eMbi~DaAK6kLcGF6Egj+o;S3=zxDEgyRK+LLD^X2a?p+Sf-DjpWT4Sv=*rN0 zr_U}8#Xz?YPE0lH*NB^>pWHh)dX74;otBP1jSO;+N1YAzeFr+CeoS?}-xbDVsXNE9 za1J>#WgVUfWtBM=PMfB%9K>O-?SEVfadKz&#`2x6!}x&J^+o;kLv5rJaiVkNXJ~n} zbfV;@tN96P4CA#MrozG4;SC0kiq%2;;>i-NVfrt`;xj<}h@)VFkOu!mdtjNlhsCH; z!8`xLM+CMwy!74^1z?m_1+$VSgOkx)w>4pm4+{y5_fJ)ABk}z?09?cDc_E_F>6o7q#mWbb0__68j;CPN4Lru-uY|onN*@AoADq24b*#7G;-wNQ(W0o`*&+Q1 zI(A*Oy#&XdAz7LxqL-9|v|sGdaZO(6xolq3METfhX1FYkGS+=?>5}ZHi-0CC@832E zsZ-dWR~wp7Coq;fxrm7;^i&JjEE8Zpv|hs#bRS18TkoJ?z0G7q6aeeyTAF+OI5zQl z1~Z>1H81?>cO+3JY_Ub_cugQ^vYR;88)W`vJ2Mv% zo#zG1i!8$04VX!0JT(jVl*SO0+@JE_H{1(RLt@w_wyA0f$p2&lam z5_lp2q~ya&;q!9jmTyvwr0;Ruisv~O)x1VbVtee>Z1)<4n|$RYwb}zbk5^WC_@U~u;8wggOfZi zqTp0IyBixUiv&te1f4WMEc#c^!_O=RDP-maQw<0$6yEZ`E~nX_G_NBu@-`j`*E0|# zP{dVW){kDTx1ryD#un!&b^48LVCjMf+@r|ahX;_cSyyM%;O<-TLe$hoXtNhL%_!Pt zoN;P3WvDl`oHHiF-^yBH{9DBH&sEoNE8)L^c>aTD1HJJ3hdbkMcr*T+VfBK4fE)ky zO7hnjT3$UHFE<}gD;qDgF6*xgN330@~frxzYB!^R|3kPRsLh-ep^b4{s&9R z{~-{X=Kn_^boi`AYES003uO@qcg0N7Q;MDzr2PJ&WS;&lDv%vq{cPx#U*RjYOD|NB zJG&sE8)GP%5a%J}nx?Qv3(36OzA+ynM1(V89QM|4-~6obG2I^B`Tf2gkfb}kRU%Cm$SN8wz@TzeRV+eG}CxHHk5w03t%aGh!m5Es*Gaf-f7 zT=-JZveBN7nGhY?%Q@QTgM}$4n+wG)poQhLCu^+EV5*+k)77bV6ji9_hg{?4nn~pa zgC~muyLjp!Oz-g~t;SD95I>-)05J5~(;_!9jFSP?TyjmqKO`D4GiTh*Sl&G_??ubFq{g=rSg8?0Pv-Yr^LXusFBoG=zJ zcDlVJ%wP4m0-|WRJ7QjakKD9-xpnl#op?%FeWO?%_E}*NccmCJ<8+0Li24OOps3aH z45ZzL|V@CoclS5w&Klb|!tmAK3IQR2A^OfxXeP8s;HwA68CQvJEp2Z@`B zxTMlIW#Q^ZEZT69&Er5dAV%*X!I~%_~rcj59cvT$oJay zl|52xdabd2k96Wr9{Si{m}P03H!gJjkRd{9)ZB6vGgmyNSa@1ZNpt?H>2B+2s{TV8 zj+f)ha4XKUA!4t(GsMV7&0MCK+}+2|DC#obEq;y7#tR6emMu}7e1_Z!rAAalT zku1h=0>rQPQ)bSgmOUnC1%&X+SnsZFiPY!x^I;;h^RI#X8PVjaE!pB(l{nD6|A^<>wvpdSHiXW70-8Yd+`AU) z-c{zS`nYox$lp(sPi|nfhcg1jt>7Hp>prByB8`t^b!4C*3paDF^POE*Cy8)A?a373 z$1oc}gXN#DkLyo2C<94%c=EGRvRgd!)ay{-Bn;wK$*16oya=q|(H zB|&;(yfV`-FH}>z&tcn3SRp9RhmJ;K60M&nbb%Sr3&Y?M8dC=iW6px99-H*-teeBf zuWIMfF$l-FYDdiv9@&!YWl%MlBQ}d!i0<-c1OTc2+M z9zP*{!AWdJXXslvP>jEH8Tq}~WwVnz&^MHS(o6wL!#{Ni(MLKPV>WG6^h}n>e4(U| z=GTZTzQLPb=tDKpZ-eI5vqu<0wL-uJy?~xjg+4oYCn9z>v4?RXII*f%rrvXQ>32&J{)L9T{S=WC$zm|nzdLy_5 zR*O$ZB|Gxcx7JPJmGgT#_k-`^vC?m7(!9?pwlD$2e>TvLi?T= zOw+#-kAhQ6{>Swxu=3pI^{t90P4aKPtlt;&SaN*nZdCIod%?tgCO_hblI?!H9)O|@I`00 zXN1?SYA!9zF7DFjzU#bQ^bfy#+&*1A@TI4%n0x$b@`r-lOOtyemE6@w0Ne=+4_5B* z$ekUHioyLG{u(v@QK)A7%v_aJZJY1+R04r4lOw#@N)aewtyuq3-zJUAv1rdz)&{Tr zXwS;ePi-6g2Q_P};%lebv)ttY@wPfu+OzmAnh_O37M_hDnEK!c4Rj2bR;1#Ibew&g zkP402fTa5|EVz4CN=q7wQ(@hwjnJl=FXN9_D^XF(!VdX5fiD@+H=M$;)ft*vg`<}l znK|n4?iRk{bG7Iq?fd2m6O{gbn04Vuiapi{cu&2yQ|6ILyEWJyLIon*fwc(M{kvA z>%bN5SZgHCN*>@{C~7=#QGQ@w|A{UNN4}uSsjdMP1yOgg)f(P;H#K`0R~4wkpNYIZ zU7D)Ggb!Aa0lm2gY=CSd&iLMZM-Y(2VK|4v2}8AA!cQ9Vd|_dsl$ zjjN&Qa>O8FSXJdfQ?en@y0jyPb8VKr9j`=m2KIz}LQn%Ls?nW8Z9V9&r9{Jj%wRo5 zQ$lzfk3z79)0a%Rx<66Z23Y#;0HH+0s7A@i*pzy*q7bGiY3sO5d;{s`JGPCDw^yU< z@GP=-8V^@55KsjUgBbUo88*rn&IkjnQ6`6V&V!n~|A)8pj%sq<);%quC7~EPDoqGI zgiu8cy+i1Tp!8lsQ$$p1fY5spklvd#0g)1V??ptUgMf4u74@>*Yp=7;KI@LN?mqY4 zzcNC?`@Q4Kn~^!6`J2z|ny!eE)tS(Kz@@nl`zRJ16RKXMFd$H&@3v%b>Urs*I4+AA zR}s6b?8oJKq{t*%IL|v(BDlP0yuTx_e^>GnMkgu(;i<<1ug|IDi!WKHvo|V}cNGHP5k%ANd07lp3l1kbolEsnYcEmrRhJys=6DYu$6KG<<8P~)wnKHu=AB6SIl$hfPS z1ip5D8#>2Vk`6rjuI@G}&0mLuC zC)IuBxm29FMrZei_!v;jr=Z3qgtr`~(dK@rX$&q0;Z2MZBpTJRyk@Aq^4u(`n*v;8 zGNf`b(=kAqX7ee?ZAY1u&_Obbi`KK`o;|q>I0E}XxsXs8>Z94RQ6ya;;M-2UXjo%R z{|VZ=RSS*+wyDIVdjjr~H{MQ7Wt|H-(wlcG(SO)i-+?^4F8|$QI3?~E^7@yQ=C5r2 z|A$2JTb)=~$=6#&-`mpLmhCsvQ$_!RiTfoc{PyCX3dt8W^8bQA{ARK2b+Lqoqm38a zZMJ_%4!_G27l7bzwQLcQf7GN!ey?_mTre2F{T*>(?Dp&NcY+il@w+qFZ#8%Ycb|)~ zkiQTqEn6E$OL=$Si{*dYfcS-lpv1*&xQloFd2he{?;khpKdSG4+S@N#MekyC+^?(t zUMRnC@B3{J7wF%whkxw!!kqcHXTR^~!eQ^%v)|>A|JdCxG5~Gqd7-vkP!7M|^q;o$ z7qrNKcBK9b8RvrN{Ow|Y8W{G^e)NBLV3^qN!qA^@)}M^v{wd>#NL<{X|K~&iG0gIx zL_o&{5x^MLL#%$8K1Prw8cP&Zs+pk8Io@k+ny!aMKxxUZNso`>vL^(tdfe zsUqFzKw(5!ufVttFFGs@*VH1@Z$*Bv(lrHxg-=3l?|Sk@Fw<5N@ymhw5Bl*cvH zDh-wM?gA(P*9XRwo50{Z0N@(?Xg!>HPh5FLOLM?>Itw69ESFM`n10$Q2FBD|SFSnU zdo2>Twv0wKPuJX$_cHM}=-O#m9rLn-Hg z<*5YO@V(@69)b;p@t@zM?k*Fh@2zw3y%1X>)-vNs34^Xvb5GFTr!67U2%*OYmbgIW z2K9^CnuPeUG14Pukdu4eR6CVaVbONXtoC zT%mSnLXxzGUVvMnmY2&m6hfRIwF{9`b@&JnRDZ@%lBb}}IEb;ZsnK0Q?X8sgkgd~e zSPpr~8%!tBz<@FJEBv+7`T83Yc#;vx+I zFQU2U8!A_E@5ToWUzmsqHb{OJ%Xf~3kx~e@ZK>Z!PcCUCB0o*PJ#bi(9&>A?<6Vjt zmy=$O{{dPt4reQ&<5@wyeh8Afg50qb2Lj+V9Z52rZG5SWhFyO zauS_fKWWA%6#Vcmh3xISB($tJ7L!Q@2^y(Sl2Q8$gswMzng^ez3~j1^?Iiqg-`8pP zZc4rRGLV(cw((+6TPZg~f@cOhA!L{OGy05NUcH!o`O*^_o$-m6l(gj;be0GKP zB0lFMh@bG;hLju=!=1QCqH~Z^ z0CDvM`phY9mk`_8@MGnQD$F9_wdsqkg+*--bqLkQ*Y>{i1tWjLz=(Az{)CRaDH&>B zwT-vQ+@KZKDJKcub?Mq}m>l}~efAQYL1M0b3l>^+#n_~7ju3-LngwCblI|cT<+iYA z8irn6;0-o8oVrrC-I4#}OhT{UxjD3DJwXa3Vu*HiZZU~1TH#3rJd@^`v!BNz& zUY?z>X@x{R7*}sDy*TTehFb=UIbC|px9U`Hgx!ki z$D(XTI&1FReps&PKwlwLYnHi2N6af8tYCag$y-^=Tv4o(6GrjL0+l01pQsJWvLy!) zG?151WibVII{+sP`neoxh7~9?v@6BY)fXdx%xKqghE~IM3p?fK2DH6%rt?C5_%gVd z6K%@NGRr7XCZR1v@$>v44_@ytc4ueXbg&Y~Z)xVnNxy|ImkjMQh#%e| zVENpv!SQlMP3gyQ62St?tPda$TOf)c)|fX;h_Al$Kj9S;J*=I;m_On3j`iN*_1yc|uMCaH(|> z0L1+^w6?^ckb}^n+YG@NCCH`9*2sQ6d#s1VTCIP}z0e2%(4@|pbR9NuvM48LvO}^M zJqf| z{<^=!@bmWOmLR!iOp^o5lYtbrAP{-;kOEf2*_q}Ueo=HwtHV+Z6*K~fC`njbIZgDK zWCXgIp;UYq_LyztoZKx!>L@FGlyHdbi+X{Vy)8YOd}s8f`A>V>l?j7g&Qu6-=Mqs9 zQ0pt*yXBrEY$Y;~#GAR1B~0}&bpbwPjHfpvuoN*16(LGHo{P$N(BlK^3_@aWhI5p$ z@I(ky3)F8bw$6Y>CX)e;6CqxdefU*h=2ycVHXmaNH8w?Vbg9lGD-R7&Er?Ff1QuXL zO|`0wlQS=`_~>d9OHVwtMNv$rsvUlO%*>!wQMdy-S|B$_9V=Re_Ruew9Ma4ZgBLQ= zxAG}sj%&-0w@d+4>PgE&vt}XfrNWfNcA#8q61<)d@rd1xM!)Y2LPlDpx_w=j@rMmN z>PPMiUU1W}#z74fluC!yrVuz>@BXk6{550Ve2?1Q~ZPIO=NA>xi{A#zCpcnFK+z-2IP!b@P10^o-R^C`Y~< zhf7zAUX>{HIQGd!UC#y3kDD^%1)_{EZBM)uya5cvt;sp-um~z3rqy?l6B(6PRjZzZ zFpM|6kdJE2%AA|?ouNq<_^G`b{5)6ur-L%*uQmqlqBK3<{OWR*6At%XYING}q}+LO z)x!tU3I(m%Q&!aEEjOJVzdY;eU1vsY79Bp~7oZUpoG+n6R{3d=m(WZe4$E-n>`3Z$ zI;CGF+bf@26y_|dz}J8ti?=E>z-}|k@`=&Ksepgdl#X2x%TPm!;_w3Amj-k%zTPw4 zeWPbtyIU-$L)I;Q5E!&0efvDVyCL97PNk#I&yN z+^1O63mmm5D99%PYx2Dls>uDoWU9(b-ePq(AT0QHMS_=s zO~FfLNRp{HbbTrBX`qqztN98t?GGjfrgz2?;6g}oGtIp2$X%@`>2_wrmmQxPU%PWz z)W^>2bw7+;K)19u7+*Vt7jo}+ElT6?wb3zSOX9t_cLh0egr$S(5rg`yr!65<1cI7s z@uJ)z(~mdKDEKN-%756 z>jypi*MY0L(WTZ z*+eD1cQXh@jnBm1ex21BCxd-&$rZKp!&eKySikLKvN!Jr?n}>Bv~E4gwv7uPT51l~ zTV++KOwF>dnxQ|#EyQiq*Ew!8>CY1ySx2{rhE9L#7JGXacj4SM;omCY{7}(q<#F66 zhtce28{f#tkH!5x?x~SQ6vV-Y3jJTKRrPl7yAyq~nIS1)V3y)oVQ%Mf8*WGEp0;v(QU<~Lv8}_Mh^_LgU);!UcQZdpSB^JCXZ`GYYVD`l%bmeWo0>^= zb2nFRzw-t$wzS8+Wd|{j_{RDiUtyX9Vl+6*$Of!d?r(l~E|;sC=O%-TeSGZke(#B7 z+q#&TwUs;0Cz*fXVI{{QHUnwsG~o{8=^H<}JG3k;OpTE35jBWg6qaGT7`fNX z%kF-AC`e~hY~8>$|E^+-jATA-AF%-Av!U&FUSd`GzVsZ09Krh@$d(n8cH)I)9q41L7pE|0AD`3rQN>>O3!AQJ*KelGHZ<}GBbfep$k=Xj)gxKx`j1iT z#y3sL8T=?RfY2njYg=N~_Y14vJSeCzpRG?(cRH&>nkvE2B_px`LX5ba1`Eb+&6}?KR zut@w+0clbJKj+70s`o#4!@Yd2CE7u$>qnOozIi_FCWO2gxyIulodoDWZ=4+^IXWL7 zC}pc9%4`ArwFnDRu__JwFO2Wn3J>Sjes3&^d8?b&v@i$v8cXxH=p?OPTgo(J*1b>Q zd35-#U^m$iKw4*HUki(N%v)%+L0kPqJROIpE_=U z>L{D&d%!h3Fmwb6Nc(9I@`t6Fkti;x-&5w5ZU!eQqNT&Oh}@M%ND4K{kZ9*3y< zxq8kD+CeIvhF#r6D=daB79X-X>1Hw%GJf9|Z z{q$Tu4P&+=DlAN$?iC%;KB(Cd%IWtFFzvEy0=l>WK!|nwqQ+6a2?0mCgTdj$!Ffkb z7)ZQVBdA*=m)g0+$yTu)<0(A!V{9w@juIl+{)cbm0VFKk8AL^6n|U3-(-D7{IZ7O& zJS|C;(1$sFM6k;ogliY{R77ELpa;xsPBX=WeQ|-8)u}Ff_$uqjsEw1cMMBfY>EFIj zQ_(Rb(%m6c3(|Ke?(SRCMX|K;NKs4j28&cdVX(bVl%a1fe?k^ z!%NEzRK0UuU<*J4;a9H~%w1iRd8k-QOgyMstIMgDC)#a)g>Z-Mr4x@(gSXi zX{#?EaD@tdRNCYltCHkMG9f8Q>OcdJz5n5W@t5U*UlIKuX~5sfJpOMQE&NIb|G4_! zO+x-@`tV0<+r{jX-_w$RGYR>xt!=-S{FfvIDTYA)?Ih%Xn3S^qDJfMjIh(c;k4*lj zF{@g!Mc#Z4R+TLYz^N;Tj8hLrO%c ziI1A|(U#QsYH^opGU=Dmclt>G1eFGr%>;Jukek1@9U*$!S+M2Iq!A8Xdhqg{gLb zoIcN0SllC}Txab-McQ1Y425JIB0>ebyn}MK7Z?kH?0Am+Fun_-4@+2{2|xro6v@O` z=M0LMsB@`?u|h@dC}($Cg_#7#b>m%R0a;7b;4E@sv3cs#Or%_9coi1QV>CR zL+Og595j^p`tg^FIL|Lcit0Hwu|W0`i_Q870lts{^|eNLv0Yn+URSGraNV+Wv+FmFBHm-Fh=rEH-zwNt9SR=QmlF>n zU(NVRdsdli^$%l(pH>8Gt@t`Z4Sj)yj-n-^^x7looZ63V+=nIk*$W3qf0Wr_Vx&Zsq?#n6lZBEP?atepB z3OUxSf1Zs@zzSDmPAbpDBbS6TmTg#Cs(R-16kRzg_r6I6SjA!)vqCo1V%&ZhqgSsu z3L}R?t|j>CGaZ82U%koU>}RE7n!0J<-*|yoG7!rBfD?j-*r$4vt~ezDS1{1dyzO&3 z5lV>;Scp`Og8|udRn@S75*oaWDq&foWc69nO?*v-c|3;meO!Ku{Aq9(?{`d*88Y?7 zQgD}4G${p|uajsVZ0vv8MOd1b9u;+H0<(3eNCJ@PU0BmckUX;SW2EscqYTU)VJDHB zO(t-rTzpMSLKt%;ge^f=zL^4+%OOXN4uKM}h5}Z&xPu6`S%XV#*#fyZhzJPehyi_%aU7iN{7spL z;Mo}O_9Y@3ryM0_|CZ8G)htipoJ&g{_!cnbwnnuPB%C{>dGnHeiH}8KIe29Y9V`bvuikLT9X}bzqMGH$tKq z)wSDdq>H{XQxP&4GW@a+*h@XmbT9k%aqay(5=vkj`ylTbqIo&=WtFTZ_NNu~l-Fk- z>EoMB(+JBDhBKuT{Kl#=@f(+_s4Hi(GVU3vPxd(}(~w@pf{S(3C*Togdkg)U#D(2)eeGF7+m3t3mGza=@(unq zJfB+TBCoOwB@F?@V6Z!3K*IKvJFjA|Sn1!ABPKPb9v$kH@`?f=tcKIp79#?{pj3C@ zI>NRKBe?kOZ4>i{Z{>^kwgzsozrRu^lv>qw(=$GfK538!>AK20KYPwdN3qYc^fI%P z=d|^*jQo?xY%@h~pF1?`1?^iW`6|rvFQ$Eb;|ZVN;$jxMYU~hHWT2i@E0vmw$C!dU z1KovhZ6M7Qhb&LJ)Y_T=Nc%UsnUu=5cy9T*%iqZQBCn-@KV4btxTo$X`ehyT-5+n_ z8ngltma7=Me8oc;OfT6F-lBxN_^wtw?%a)J5Mq{39OHj^PKH_D9)Tq;6VbwG;$+L}P;X#k&C(DobHD>VwA+RT#Md1=j$qN?I(`Q#ry z@%r$6@#W{qpUZJ-p&~TryP3BpXoNqvUN;AQ)#$$?fU6pCSalo@UkB8;0btf8X}+AT1L1j&8uUNc zh8@B)L4{R6ZDH4gd(qd%n<5=rIy{A3KY>ds5Qnlh!QTkDMo4Ta;GxREC=(QbNSGL5 zsiUo<%{|9uu@8v37cxO?`&e+D-n0NAOvWbU0+Bn+C!or-R!}1<=pPd#%LyV=QeiWz zjHz@@${yiT;#&=~Wu9F7(Rr|QvIo;gufEX~g%pszBW50P7Ba2b=_Wv<`OikW&h>|~ z)pM4+U@bSJH|^wW?+BPfO7e*g1i-x|n)$=CD*L&lk}qNwp169K;#>M+;hu_B!Zak> zJus&z7qdgQ!F(jp>g-F008p+DL9BC(gIxsR0dL8%cJHI#GIs$xdTrpF zaJwict@59jMevU{wP$scNNLh$_ZRPx*R0X7-cpY1aF+DFCT{1l=p=t;KL$5bhPYK! zObD9O+b=piC+Vc+v)!l#^Q1+FwYG%9f`Q_#-Pc$s*HH(1cC<2%kSGL62|QfYPGjAV zKb5K=N|ua?W@ztG&%6WV)KQzy8uHaHa{f)Q&02BN%OS>-kg}IGZH2?Fn`N^UC>(hJ zj_ksTHOGv+BU>CjnU_b#8-Tgam$F%W9u8N&dnhCrN5J`f-lLyYbM;VHn6J#bZM6F; ziDQ8P?p$x}qwqz8G3Qc`(nq>Tp|_m9czz4`B}RFDigxQ-c*v|U!ElSmW7C*Hg=iAl z&449^J`rjsksg@Y{-D#wM|c6*LAi%O!pNn;2`GrQ>PScr8)LjNIS`f9y$c%%=#hve zr;e({>791<%9!sZEmSC)FOLr>R{__A7OKelYaympWPVmzEF%`niP?w`Jp|GC<;0G+ zTsgpTUjRX^Fn;M>NNa|cvi0BUi?Mup6cOD8T$EzFvnvqrv) z*{rgD&~5-0_L4WpY0#x221%q@He8^Y$vF8mCncHfkN~$ZB%t zMG@!r0r((bk)}^i+`l0fyYc;C0f=7yqPKtt?80SIK$xA)AhLIjqCngwCB2c;{ zX-svn%{C}Sq>G?0`KNIKt3q9-{qfn|O)*PNDn{a(CXbj3fG=0bUd$#NSCsNLAGA0; zSPhy)R-b04H+bFRSOvANf@@b>cH`ivjV`|9jq=^dL*);QZqtq~s3?MLh$aoP`8qsF zLCQrciln2r)z-{aRlTe}Ig>RoDf2$3CfETPmdqU<+?g1MC#MYfJca2XLlW{r?-@%2 z6+p#`;6`;&qmDz(tUvEJb;qizWks9@FY5%WEhl#nb%BhX8|vN>XYirC&~OB0$%zKD zjB^VRab%`IR>Oa$+gD8*bVRUcawLB0I=v=GMgrb{=>bW)Eh@CGHe}xg$a|r=SKdX02+R9|zrlIy?fIQmsIb0SI zltamgg!J*_?K|w@ennP~fkL-csru86Ypd>OXowr(?iWnp9$HUU+dwm3SKT@5yY2f) zoS(PGz3I z+aGYcO?|^1yy3yEeTwIbq=qEzSHPbJeN4N=WFLYG2GYDj3wfzQ`nQOC7Z05@X&35^ zDDPS=iB{DvZk)?Eh++XRFY^GXb98TOs05w`M?k;33ZD0YgZUgQ!8-@Qvc|`%K%~+! z0w}FsF9I!S!yGDE2~s}d;M$;Hd=0SoPfGQFe^}UOl!1(R)U-TTqS>|%6J}Tmc85=s zcK8+LbJZzVCyk1UMcGBR=tgQ>w;DIoQsMzOQKqzJ8gY3M|KNb%cELS#nbid6m{Fqa z<8|YVafz89i4rsXrI?-%$WU;y)pt5M;YGKbwm^{m&tOerh!;^yP z5@@oG;>L?!pL)^5VFyExirJnLCYvEIkAto z@Wxx8thz{xKMLsrALGWUE%HaJRTd#d0}KQ!Py8;{*&YOptLS2{ubx@A_~`R}yixf| zmJ?{8Apg+thdJ}p8ZE5~6Nci2f#;V-?nga+&I6pWgG`4q2W=zZ1j`{HNp>atA z#mh*VX?^YaNaYrGxvBi_ygkR;E!?M5s-;hxzQxPcE=axbku0VxQRRv0p zPWXh?Y^)bVVh4cHOinM9c3q&m6J@OXNFB`Z?yZ&+L_7k9d*z=sS%&GA0_6*EGlyMj z>RkjnwZ_m_YMq0oRbovO)%%=$S_|df^dczcegN)zozBj?XR=#Yb_KPS zzM%j9@t%>sgX!|3`_mVy=HgS952kP|!JhNRvLwqTA1p90$oW`TE=}j<7&6q0Bs^qR zo|+|S#5#MwwiB$;;(M+q=@J=;ZlaakiJlDD`NsEU{b%a-C0rJJDRt=52;Ub0&KrGl zMfy4B-YMF7b_wF>7xt52CfJKQyGNv&Uav%S?GPt_1;*SYvKOn`%H{k<#DSE(+H?#?{IJfcLg8V$MrFlP zO0k&#ZNCG)k6ZB*Ro@ZJLBQcWo_8WQo>*~#@-3DTFN4&j}nD zNm&`un~$Ad#(pVteOuNjrx9t|m$iD+tMw%F%@@g-=)hnVJ#b+DM?;bi@1!?T+R@BN zH5=DvSc>FVDDMNmWf)_6oC{c!@-2pBhawGwrVm0Xkq4qULfMKagDmtZVrHpji?xZe z`$a>kX6YD%X!Uryx4A;+Fh_I?bl|N4$;*5IvD$cgFq}(_` zKbCz`V#xQoTJrcyF5>T&{SWT9Bc{En-e|yL&_n6nwKaC@;{j^6k4L5=CDy({Ziv2R zmk2?C)+QllW5W5l>Tyc&Dg7J6^8id;NeF1x{Na^9s zm!EIg;vhkxOC}U(tD8NK*)Qst{_#@>@({W*{g#Y)zTnSt4SFRt+Y4<&bQ%CcT+!Gu zKFPXAR!f6qy)>bdK_ULQxG?-kVTgvY?5F(FB}ofA8-iz;Bfm1J zmSUi80DuQwB2ty3z#P39df}~F5W;I{$IZauB;uO;MG{zxf1AO~O%#aICnuEQUsUr^ z4$x)4X|cJXu7@!pUnwZQh*vOwNvAe!C;;I^6lRHD%ub z`oNg(s^^ixVKP0j{VuN^dEVnrlI>#e%P8s~i(&^>rl)XpduO8Gjie9MBWIzU)Pka< zWD4NqZ#<^ul|Ds=m#Kn6tBJ}O9cl`n(9PHtUMEZwcP?sc8#~U!#51}Tt0hV3&y*QV zG~U!nJF-0Hy)VP zB7QnwtmnNK`~djLCC|*v@DxXVw{%e|?1r%E{M4nXo=2&M_{j2c&zpB`H9vN9vDGnr zF^+ry$`fQ8D%CnopR9q0=%p^nZ_oILk?=im6I|kZ=0`tw_4!QKhfZum)fb@ zQjtTM0Z7>|t3j1q;5(}egGLL3lVls6UJUqKpG@r!>#6YpdO&IBHEMYUQDGrl!{+Rd zfDXML)fFc)!2#t0ur)`Z(v663b23cnBR=={gz~C}n-+gi+~w88jNz)uwx{+yVs72- zzs1hZjw~A`<`xr2K2r?7Rvt850Bt+F0CB)vZgVul{i2_|+w0yitqp7@a(^6yW1SeS zCKn`{XQ|ySpo)}VIo3&~O@qdZt|+AclM#v3IB4MaZY@ zr=yA|v6!gFi$&W=j2^pM-!YBkep}d~(1#7#)PCctyeXSY5{JBc4R+f-?o;ItAp*1YD6(Wzj9FjdN_tmzMNvU`^9b$b{R{a6G6V(O{sC(9#BYLvzQo34I{`P zcl|+L(+nX%lLtJfTB~O#>VB!wOtlNK-cEWk6wstg7QKuSKqZh(kcp}oDFhtfTwcG( z^iulo)7UsrSVU07Wy(<&LpU6%LwdV98t5EcD5;NV;)%!t5+OC2A0pkx<3h;-%=&rW zlY_3jLPg<7$m-T>Bv*?f6><)po&m@~Hz{hh3;7->`HJON%jdKXm z-ip#7|KZr1!iTZiwB?X^UR5=YRToOZI%R6+<`)^H>Fk%U2Q@|}!!Ix59AsB-f8s0i=tXe7431zL%eth61CTV8auL*A<0V0DK3m4{YK;JS z*{@QZ3s9S;-52gO;InTrsI<{bUSCyK-*ITP@?b7 ze6)QE3ROHQoDwO*_4dF`Lwf7GEc&|~JOCvzAQuBwaiHC{KCsb_cW`TPS$qFel|V3C zSlkTINGqydj<^}v733C@(?Igco}=y1CJ1>D6t;>Ng`x8&S=;$PbEvqyJi0GslMqAQ zwv86}6yjj(eo46NOl|O3vfw~e*wj* zwu1mPUC2x5vJfpi4s)uDEmwIo6o?fT8 z*N4Gu4Htl?>&3LJWEE<)@tK3X)1Ek-ge{eRUdM$_J{0X)e+kQI0wJu znHLwIdaFQ&{}2rhnAC{hiJo!OnHUz9$yC#8K_3jDZ~Sz}7QxIeo&pRb;k1%I2&?Us zR}DI_dW;Y0;pWTYNRz421-+*oP$HWGWs-7qlTV2Y)PwHnOW4BZ0rWa1Lt{ zj#W-~`T}-EC)XCBOk1e zhBqMw!j@B~90H#eO3~|1!iuht5No&`&%2vbO%aMYKYIi0gu#+U`#EDYq{3el6oWp8 z?oBG!y4ws6ac>_9v1O>w(72ew?26y)meICK{B){lK&KoSq?Rt3kcNO+q7@`33e3o5h$?DA?IbF))+b!h2 zt*Scg^?K`^OjMY!Un&TAV4-#zDaqjJ@zK`S<3!y2Q(0INc@Cc3Hb(oy5AdhWu&MfVuQGw!^%FGxu1eR&Lx^~CkFg)P33-R z8-Iv4f2m6S);au3$N4o+=TB}-gi;FQ6@^rEh7i!%IC%{qi1Es7{{!7F>YaK9|0wLK zgHSTLfv=2Ps!;;CH(mr#Z;tLz;L9oN-gB1Cxuj;BcLf{S8ZuCtAXhW)DHS<$?FPgK zet^273mZ3)32u;LiSE5Z@l2@tRvaCFP%zWb^d7IOlP7B!RV03+%zfVf=c{ltCua9_`}QU-TeJ5-VHtJfb>;Y|jGtf+@T!JHQJeH@mk?ncf))Lxc{7THB|+ zh=c$%Xtbozl-@D3U{r^@RVdN2ULPqa{JkdDa&Q@8^hv#*89ea{*)g&^JjE`2GDWOe zN9-#9Rw8`;N)Ts^GC~u}u-VB9thH#i zb$~lRA|y0rmSrYo2sI=rp?p&feAgOO!@PVS_ndVpoTHTn?7^aP;hmmL+U=stXwiZ` z$Xug?x0;XXma_V#F>|oLFemQvqU?VK;;eTcd6#MeP0$(r8D14iNUwAKLl-EaMcui$ zx^dm*ys1U`>t+64{1PeuO-DL0UEi6&Q1dC{wd8)NUt> zk7YgB1DbuEk&NPEo)jq{IW0qP`7$es3%pzp+#y*zqfh~Hny48TJ0WV2U!4O_(lLjr zNfyz|--BOU5Mr6vR7oV~@N;3B49G`$k5-7V9hC&ps&?Ejyd}-=K9PJa#B4ar0S0LKj;~N;QiaGRR5O{Cl$|r4unFpIpvz9 zkaT?RsLZ;6e$4qq3}2Q(W@F~3PI>*L@-n9S#5RbwKR-e@jXP)=cPXg8R&IP`nb=c_ zF+U%e>aJ^%vc};u!sqWC@vY5ehlR;LDkD)-kk*G*At*?%?AqAkX%aam^M3#UY)A?^?oQ zTDMXavj7P%UpyjH4_qT&3chII61QG@#kase>bft7c_mxRQx_KSaCE#{m* zmh)K!Gp8YpG9A%^>;>X^WbA9%PtAU0dzi=yT%qeTj(K96TobuX2kHuo3HtD=Mjoc+ zkZB+^{w|c(lI(FoX^L+jVer-B?V?8`htNaj4?PXS%rn)tM@-v>HJp8r*R5y_{*t9P zIs$Q4#VZsqFj4ByZK*8Ep`sVfYnyJ-J*;{CFu{;SMWt6sIL)Bp(W1hdi>R-}BgLXAS8H;M<6T@J~GYPky6F+Z!SKL$0WvctE1qb?fUdtugb8r}R zgzV$(16i1n%?%ne4;N-W3oQBUnkovhYLsysr|Sl`mzYXyES3#BHirn89PnX>neP~I z+hTo5VpEP`p}A#@t)BI-0H`2nP{A(g=c4IhY=&<>aG|Vpl{MgyFC+F4|EeF-3I4P+)u_Vfor}^3*l6&Ou+gT4(MjoMn zZh=VPPD@l-hQuRC6NB+g#y1S7W({9Mh`>4QmgDMtz$F>!TQce07D)-qw=*6KuX9aQ z$~v`%?eV^M6_M_|cbHW(LhfEq-d_PM4(kqw0z7{{8gfxl5;MA+Yg^D1xpNmTR7|C~ z9jl&j+@>-v(^woqsQDaWDqQLz?3(eDO+@{visM6@ZmZ*$c01)yR5kl$XH%A{V(wW& ztvw`djOJMBQ1A*~=KhpQZH18T|~+ZLy$1VCJib$~Fpu z=(xV4(tPFF7}0|$XWj3`GwT>|V+(!fl7H=hlSS6SD~Tkf(@S;2$}>ZJA&aW-hQ1M? zcl@7~&jBV9?sQk+&lh8H{c9B8LY&`e3b)h^#=NS}nDSkjEe4-bU7j@|y4nDBRm!!%4H`zO`Xg6wfW>XSSsryE}Nb(aDU67FyUlLT@skH-W>qRCRbYu$vqk?Iyg zz}^X^bBX{1-%3~(`8-zXJO$4^8Z)_qTPRhPwp7j5i3w2)*c-H1ERbIabSZknHJYHZ zUl-M~buDvs9J|QRdT))R4jxFZ)3Kl?NFk8jPkfFLC^{m^2pEpZAv!-8SJvKmY^O=G z$B(+(wQooQnxrag0js_(E(MG&s|74j{V(d?GpfmMUE8K5Ku97bw17w_^w6tH2@ra( zqS6fkLKRU_A&}5}5fG8yOF%#bM0!U$A|leIOBd_&vYu7mXYIZA*lVx#?lHda@BQP> z9LXFr^E$8dI!*yksM_39H8**8y+)cjOR!(lkX7UG!V4O=7n-ZDimdu79$p=?Z_?mx zin40jRUF6lA}RQ%=+{ZK{X$*_55wGKAiftEH^;<&fJJ^_K+~leVV)e+-Kn(_ zS&3`Pb`<+V`A4k7*I6sLCB?u|CbQ>mgYa!_ppGWATKmKB+$*}|1yh>8 zP2G#<+{_GsRQ)(ex1d)JKt5WObo-0242MtQ{$hu6A)KMmkZFdmu4Y z+x_DuJ|vVBn@P%+S`W78J{Zwgj-VNOU8^_>$a7^!AeJPx=jbxp59c#nQQU zAio<{JtOdPHpNfsz<8EGH+uJjPM^edUAHw(s^v`VPeuQ`w6|`ESLJxc`7AnJR;0LB zMZ3}Js~5jqZSOVatiy`n~$bxhahh00rP^CLF!ED1QlFbyj#`0xQymcc^ zwq#4R2B9DYTFy=jW=L zcLi9Y^J{VHlBte@32q~n@iUkfBGCAVY{4+VU`?54rht$bA ztXi0J>-b(mus{}PXF=s|W-8<+oLUL>XrQOzx@Yt;qpKH_#jWh#y_=R01P!;tlN5Kz zuquB+D?d|V->v9%p^X_`k+KV*a_%luboQ)7h=)-!QoK&(@VoieWwVI_TV3^=gNeuG zst}3vF4Gw;!_JUKxTB7pq{xC6uIOfD_UkoxM;iYi(}JGISI3ee#}f``xkd>Vgt-SD z7bpuUR_kD?Q3m}D8ORwbGpt>>kiq{FMY3j;-kCaXvxSP-YT@0TksuFb$uzd5TY!CV zMCMlfjg$NGrt&xYLWupAz~T$Q^)WQoeqa>&$R7qS<4n*5SqlksKMywN#)z*eVsqE` zU~|~&Z{N=qOSd{_LHTmI7U>2wUvGrPu3*q2-q~`*Mkrg6Z_UFu?*?@#c#6?z@2Rsy zncL}=6<2MVd?2~TKeDR)UOxY==KlYnDDXSt>~9PFXGMYkG}?7efd98dfxnX9{$S(y z{gwYg6p)fSS6Tk|Z5)3|Ejypq`b%nA>R(gKs16g0=@EPrKqow{VzM19jzE=l(etS- zOKh(d?|^EBWqlkL<)n*@Hitdd3oqq|D}acap_+)0g+S@(E}CTb{&p|$GYSGFLu6qo z_K724*24rpA@LHj8bq@A$ide?Mi)l&t}am;#*XbGS0Db9aDZ@DPjBzOt$f4#&aA2j zB^8{Gs43O|iP2)hNJ!H@oZiGpoPJ<+zR`(}I=+A3jDa-yWOU=rZKj_i>4FGkwDyym zw<8Cv%HV-ra7ikss(8J+ZrNDlb`$0H(Zj}fK)sZ`!OM9VcN&O@=0-hnv>pN!F`kQ- zja>?$t+#cf(+iZG=ymI(@k6Y?J;<+ixTqEDakm&rc98wV|KetBkAQ=O&U* zHZMzlW~521OHd7;Kv2?o!GL+1`209>v^QK6Bu2s3$bhk9zvAnGS?tuEvVk>*$zq3J zN+K}PfV^lFCy-``2vAlJ%g%WfrvGDBZ|TVy3<`O&q)A}hsxGK8tz%LpOfGtI)ao`+ zoP_F;r6`GuZ{Rco+D{mw{52O9+sF!&w`1eoRHX zDB5BE%5I^k<6CvLnfD5iX??MHD8&#BM9<}d&0O+yV;M9|)75O~WcA1r;rFvs8BkEw z`A+0O(T#m*_nO_?+1(;WHhl&0jX5>xkvHtbD#9blxN${S>p9Ct>WAYo;s>^7Wipp9 z1I@R~uGSBX`SKwsGlsNhnZG3~xf*A`3p4U1?v08HL3jKq<}EB}L0*2i zHDkZ&YdJ4R>$^#PketTy{2dn6 z*Z1y7f0<@d@VK@p6U%3SYHAA%er^Wzeqhoy?o@RXxTu0p^Qnx>=M^{f3TEMNd@_Vq z)E6(JEn}T$yNSN#u=>DPlzL`Z?=G)Y?_~o@*x9oXc0jd#z5e;Qm>hBYu7^;7a%S8Lxrc5b7tnfmwgV*_vHg%s zj9)KmEVD_is0i?+VGqQjdjzfxDg)X)U~uA>_wcSpa`b8qMHK!ri~FxaDS!VK&M}vN zJn;YEDEup5O8Pv6{hvMW|HV<>KZw8@zl*?ZJ%wZcya;U4Q*bT<&nm#0B^x%{*heLGux!G^_-0TOS+Ck*j3v+@1jYGoVXOS=_-_z~07gXr_Ykm}XDZ#hJ zT{k6r3@>i87}m3%|8MZH06`%k|7i34>4*5+ulGOQJpU4bO5yLISO4q{;crcXzipVm zSV;fn4fB@`_s0$M2R7E^v(rC3vcV8q#NBSw0m~xxn z6Y(eTly84-nC>}~Du`UY+e`{}5!V?;Q|N|h25H-TlS)2ufnEG;OPQCSXOGW=;JY|~`7J=s`dQgcNLI6;$u8es*@y=x}F@~kwVb`t{J#wq4 zv37sK#xc-xQZ?032s;!&t!nb3=kEC814^z_{oa6f2$3Qor15jkk+blX(PD~p*aa~a zE``^gbc1lBHxvArWL&;?*kOV&krze;3xV2vXzbubo)!S$by(sW1eo`nl0rQ(>^tQ3 zzK_WdRihvBaH6`}@XxMs&95K;ss1jVTFkaAOHF|R5++eIGzO_6txPp7z z=)Qe`9K6;dwn7#Fd$K+xte$$Aqn7#k@gVYqa0MoOVeNrPnGwd+K>J`<{@1wa1LEg$ z8IGVeg$*AZtIG2UiD|je5bTcJvcD5g)Ut=q2j$z-P4M@V(p+%+J7lm~dBXy)+b=N6 zs)Qy`g&=41M#FBHcoTB(E#d7lC@fErf`$a>$iQ%jqSr-Z3L+2Fm*gapCw=W>{GQ6Z z_EMqX>1^Z&*u_eQb@%7dbslp_R(gEmC%RMo=;{mrS71L@?eQ-*;Y1`>`EWMsF|wh_ zGn>jWR(iQKO3NKOt)`1kef=XGmjHu_r5>5DJs%|Q_mZwz@5vKi@`Ka0;4Sa! z<9|N3Jx9n+YJ6vY+>d)d_+7nK>MGM5HJFaN`>Lu}0dgaS4>e)PWM(LjU`(TZ`iur{S>O8Mc@=Kw3^k zv2WfFa!Zqww6QRny!#G7tBbC*Fk)Y>jfK=;;Nnb;kl}l6R7biQdR@`MD^5(1=(8bJ<{GkiGATvF z92klXHsEkRj?RM?0pt>!E zmCzg2vWSr1#&_7M$p)xU4WF3e9IIVA8Zzom*UR|!g@tRAAO_m2u7I^G4Cjb&?lqA z@B#id-RT5BM}LaxaRjRibE=O+((@>jfFXlH1o;R=9F{|8vhV6!DrgN$Reeaem1id` zm>LmLy&kzGibGp;D^7|1mIA*l8|lL?MOb6Hp>#`JT(=^Z$|T5nT+gZRxMjpF>+l(~ zBBq|vj49V&3S+85i22}ea)uhueK{(eoKqP_=4*Om;;uG{kVQx|gVM9_Nu4XDnWP=( zGz#YX>qvPq>mm7A$8^b3ckRNJ3usUBkIA|`lEy3aw=##H-;*b&P#nm(uD{h}S|mSw zsf67rX8Sa0EIw+0R~yPEu5Q?XH2^5d3GtuMry6pZ&FEWnLV{Ex2W6AeHS~?&7L{Yq zvmwk;*239$3nV@x+WH12WpU=E!R5;mIs5_F-z_TX!!q6ZwGZiTnm({)$YImuP1Z53 zC~EH8X({;n**B4AS;i38LlGl)V`AqUDP)aifqKR<`?hY8?8D5-lFTc~hSR?2Q`C)~ zNciweLo`-9Rn(rbiXJrHd~)u^mD8hny!Kn|2GC|O$M=b zJ$%Zg7M`daqNkF8ImLQto!pgTo|hS{4{nYf&0S4mUM!eNF3q>Kwze65$~+j&ELb(v zddfTA&JyoGC59N7j#KD9)ukS!f)dA!_6?L|1Xp*Sbvtsf(rYzBb=PPc4;{EH5B0|T zLlo|x7TuRKaj;u-kqoz;mj5^c(Aw?%LOt6U)wKF1s_eu`H#0r&;&u9L%_5!bz1zR8 z@+JjN5j8O6`DG@`f)GQI=1~JKLbvKPl|y!32wWPRG?l5fpnq&rbtKL5cSoYN_>Gz=+gPz-Mk1E0`$crtnxU4ZH(tKLs>@~b)h7?%TM>`L zR7Xv1`LjeehBMZCT@nxB5A5aK^_dMG1Wk;Y59&l$;+2EfK8mDw6rO3KC~jV=Vbm_C zq!AH)Eu8SAO^Wa~mYcK1lFXEypIxJFImO9yq>6XqNpo#`aH-LVk-Qe!o2C!zt>$KB zcM`*IZ(U_fzUf1VQQ3VQ>H#d05|mS$3Ez9ZPCRnzTv8R@ofs1mWy$vwxYH+FdSI=v zUiyP~$hJIMe)ea}oyh@1lD4|-?oF-)#h;fghmoafr$>zQp#a?D<{EslMT0y6E>;{s$pUR_dI|^v_;% z|J}k!18~mPX9P>d=;pPTaj*I)Bx*&6qq*xHmDzMl7XK0BXv`16KKDE0$VUdoue)Js zv19a@w)iEq8~asXMN>%C=Zd`_wG8~i++gp)k6`hA89Yo+KU~QpRmAR2_q51!7X}Z2)=N9l~Et>Q`5`=&hDc0vNGLOqv}SXKpBEA$YPn&(rE< z3=i6yzgk^wYnYmjUsDP|IkXLuf~wiUg?zTYaH|KLIlP!y(u{AIq9<*FHM+Vr&Gn{Y z{Tivo)HW?A_fd8%)y}RurY2^9hc7!FGq9~DN83kqSLp;O)d?4>u3Kr38S*MS%!-IQ8yFV}xz*1T5rjf*ErO%~=Y9RF@TxKZmKU6M>LKG)*Q zs?1=^RoUYwM!(r63~@-l7VUKy?id|5tY3?9k)d}jKz%h9ug8A}Y}5=HyDZ42eifD? zbs6K{nF!cs$&e>6yiqiREnuR#=3bO7vvdOgGH~D&1FoLw!;h+{HE=OO)~8K*M0rP0pXY9~5s*5g4}CW#iIWNB|GJMgJOO z|9G1doTyjqu=vYXy4Sd;C|s*cdZAtGJ#of2xRwjE`)xfM9Wb0Rp^*49U8<{#vg|c`?HS88z4`vv$ z_(Gkf>Gg#S1Z@X~C;Z4MD{2t|$y>9I;GUzykI8_dN$@P68_p|eZ3XHK07D|~nz8$g zu>e{nl`JSI-Y!hFmIPq-!9k`~Geyc4Kxy^g9)frpll>AaQa6o7&h793vTr7^yKZJv z^s;=5Z}e;M=x*oo+jy6qDs_K(7rL&X5M=gCqFR6ZM{<8lk%LQ*kxi_StoslRT%9hNyF9xrPYm`r?%Dru6ADEqGQD-(l*UIr_x|Z&ZR1|(?|rByhZ7| z>qu&f(3p(dQ1W&qt#8~pLoU#8P+2Q#ivmR16%(t~s$hDL>|(Cy2U}l+f@r{Rkc5uN zNS~)eV_6{lLRLF3_uy^G)aC4zx_j0>FPn84l~fDd1p@smD~%>&xK=i6)1`?wrxN|1 zU>#L}pB+i!B|ckpe5sn%jA0s&Sz_E*3N@0(*PDSmA8$<4-3=|WZGADz(FJkRaF42M zp*-cVm*v)&e&wWvIvb7IiUP*R3Q12@+j99J+@MMylpCbCKg9Tn?@fzx*Qq!>2^NJc zkyyfCc4je|DoboHZg7>hn3%V`#Sd)A*db@rhO#a{|HQK=KGl7#i#a_4b(>DbD&^Kw zv#G12Z4)dZwbU`&8E7#1{`(%M4bg%)v4ryw0MNG>u&sX)oolOrN@01X#}|vo#i<38 z;A@>rw!qkW`RlioD0W>w38mp&h3;nM6kbcRlPhh^b6w|ReIjp$eOaa=aGNHbBSd`r z;*(1GTLc#UVRes8;e}OCTM3AJ6E?J2IEL8ZJ$OdWpUx*7g_!}#$J0U7Iafl7`E{AuWcy1A-VjUv&a zb=@2#X&A>D#eKfi{>Jm@)yo79fd!NnG&e_P$&%_jJu^K2;6bZdvwc0!b3>gkg7KQD z2sK1Y&6}|*mbV+X&)wRX(zL1J?((e$1jYPllHMxEtI|qx^={+ITF0j+BF}dC ztg}rk#9hdo`EDB;$tH_hJFnyxIal8hrS4Vz$QXX@UHAAX!bXB39EI0Zbc7&=VMdUT zPI4SepsC#92;YM|ja(3=S&E*}x|jNDNSf7@bZZd1kZE{#qM|hmuSt%O z7)KpuzT?3M@g6B25B#;gQ6TX=HD0+&q;nXnZ9`bOC$kz#QNkE4WR_o5^EAf9?fP$` z#e@i6O``f@tNlsEKg4avhd#3c)zv`>+9M%_C=>PML70 zQ?fq!di9FMLqeJalcbwm@vEN8OmUYbh_6OobiEj~fB(YyeoaN&ZNG21_7^;)8g@9? z-iOheG&vs_(RJ`B(w52LJ^R`|2jBok!AT~yty?lE5U2l7zfab`)RbW$pj zQe>rck$y5D;%D@P^XYrUVZvR_UF=iCJu|MCdS)K;X70a^s)cm!eyjl4ijzz82)WXk z9^t=ct^Fi&yn#Q|V^LqKTME0D{8Q4YX^-{!ax-WP8idOrfqzk|$($ZGL5F;)DW^Ts zrHdRga9d`ri$*sJ$3kQ5ZsJ0WRyPt5-J#SLSR%9&KqVH<0ss~puO;iOo<8{G^0A1x z>zZ4uH<5I!DZrq7zUBj@pQO!|Svk z=4yrf1cYq)*reiBjSNlZHAzS9cID#DLz-j!x;}%(!I|yr5t`aiS2v$3D)pks`-$=r zJ~EVJB2jM9UYIMpK4Q7muPFH7`-0zaMkDkXqqzf4G?tDLWuWOZr?eT)uNiVw83)Y0 zL0h^CG}#-73I~>OP9wh=8+YEN*nbq$q%n^E#K#603*?P|KyGsH9X07nsd7CEYui^( z66vpu2zG)(O_06%TG%_3MinJ{Qe>SA;_G2Ujb4MzcU+W!7*YP`ItW z#OJs|LrCciy?wlJ0#MRu+8}m15vSxC%%9k;?>_U`APHoGPmg^{lXyBpN*vtx8A!}X z-+2XMa7s?B0PWn65p#K+PvVVnyV;%U+uN%|b7P0h?1!eZ*R}{wUxehlrRr%#t~)&F z%+9Q9pWw4~Okdd7H5TX-eXozCht3ILj131;6(R8cgewzeEaIOF==a2c3CnKA>l$IQ z2h@Wl`28~~Jc`-CdR(&+=b8y#wqPne+k@xHqFC`{xBYWS0(Rf19RtIvp~RVO=4 zDb{IjhqftbOQgJBl-SMOGqj)@0u5jQX&wvxHsSuX%X`otR z(@N)YJ%ZAGrHd`TPgZIj8zwVQUmCIsjpoDGHZl|Lu zw`f?*T42mEP%~Ph#vOi`GIqB5Qnem2?sT9i@R_aRCO_2yzcZu#nlHyFXr~q`StAH_ zn~~V-j+ivt6rA5oPM56Cu_S63*9hjh`d=|TwV?Q>#z!A;^!DN?MMk*TUa@jbcb$0= zBk(-QfclDwR<$)%rjFY~sS8{$T!lGZ4RlhG`{JiHqu~2RZHL{GR{>>cqD{qdbVzbe z81C#;w}Kf1FVR&=GvYq$-QslKIa4j|_DJIHCT-}2nbFI2i5A!Q*m z7iDQ9;pU*ov>>~tCt3T5?C>|uBZ~Q`Y~%i5G(*q=p*av^&WWfIUX9j_kky3*=s^L7 zh4EL7xJ|izsCoNoKZX0Ia7Xll8JHMhf@=$qwsW`e*>d@{D@k(f$4lle z5-hM9GXhs)`E-D;#+_f#^5%xM!JTWomI9w#z_i!aqg*2fWAX=-iwrM+a+56f!~`lQ zT3K}xUg|(usu^t@hk?2!U8bT}pkRcxE9s7*fa{T^V{DOB*;82%^0LqckGNr=|0OHS zU@5sm6ZUU-7u-v3$r8Hbj@IN@CS=bMZAYEsZiYqz6}WZ$HGr6|&Mnb>#8s<| zpNz-kDCyJE!JOJ}@6E^nW4p-V`dP_g-V|1vjiW0KI=8wN^DOnSZe3O=OjN3(As;k* zD?xK4)*~)CvtK&&Q<8QUa&hgU1x<(-jg>brgd}*r&A4jb1`ujT?xbR67x&c|Qr)&G zyd3;A2Kz|@-8JLGa{@LsBk*7=kc{j{cCV@XW>XLQ25cL+^W2RptCoT~@x1i?*A$$Z z-R7^-?U#(+Cim00&&1~yZm_p8=;Q&`NZ)cS`20xz2TBkm>B_yYHecsGZ2RU*C<-i< zyDekZa-#`6R{mCdlB=knmVfokjYLJ*(Az&_kPh*DVxCP+@r_2mHoW1IxAo6Q+QsNo z1-l?J+%P^M!&rDAQmO#9NB1DY#R2DkNor-=S9a&qK?2k>Rwb-el~D%L^-z&F|M;^x zCm(n(sZ-WPUN+#Fj?k6wPVejo=Zrt)e&C;b#E&c1+1uY@#p!HoshN>xn?7t4gSN3w zG|ks6h#x*7!)|>~SatbugnGXAkgu-IHFq+meo=u_a+#tDS|7;sNhvNJ{ooo7Cm-*YO{;zWLhvdiK#T_$l#Xr-3&O;^tWL8r8^JtUO zpI4>y=Z8|rKR=a1{`s*K@-MA#slS9({?qA?zkk?2Sl0Or*k6L2{*j>cpBn9o|8ArG zKaX4e{>uL#D9K36{PThm+rJ9PVU*#dZ$z+1YyGKb9xlZW0$PX&z=?mFpbE!})40hL zCThu^hw)ThW4HFONY+K-HDFV^X{MNAA0&)^U^$7Dn`OwI5}C@=o?HBPd61^$O`WyB z=Rqcg%&}hvfPj3ax+c@%VV$c%8MEi{JVRP}nuhWP))zS-+DF;-$q&?6&3X#h)MkpV z!Qi6K4C?8X@@Ic?=dhGXdOZI* z!5UtWht=Q!s+aoo7Y?`Ti9k2FP55Ohe<0#t<(m1x^CQuv12R0Tb|*vwW%vMb2jkbT zy;UpAJw8`@~(ExxI(LHntV*jI@D1#jkP$x%5VS-zNE57uEo;i60P5r zKC|?+@LbWm{>rpt@}eq9QD&vHx`RFJfq9v{87be0rz>*PIKDBtn&{3L=gW;30Ro`N zc5EW?VB6vsFp15ncle}K4NiPv$T$RcN5FV!#ki{pNW2aWK2jqjqKmMM&Z38gC2mRQ z;?a@xWE_$d01!fOQXVH6H^$z0-;TK%_`dN#nAo!Zv)#x37MP8cZOl5y-Fk;-z%RsF zeApi?r1E;_3xEC>zRQfrGo07c*DdX%T^_Hmf5AbABRkphgg)>z`2w!9TE3GjSw_cJ zP%EC9wAOfF6+hB0KOR4!$#*Djl=7T4;iE;So`+5|c=MGpE8ruBVS3Nco2rgSYH70| ziYbU^#O~g!>^xyeFJ^#H{TK28Mf~m-`4x@j^HvOkCJ)T7@#)YTk1!K8Zl=y}w`-xFJr{{o zMVM^_H5_@j@AWS}d(~7;jN3P%T@wEx)<5yXJVxM=@t{mkVj+Wu$}e(t6J`#d681!y zEl{WnLi_D8bEld?lr*=XTBP8+?1Pj5@mD6w7WW|JNj%ihhL*g1J|T`xVSk5L9W5a@ zc0N=@`^Infzf=%eo9_qFRC_JGJl1&6;hTtq3`{9FU`j7^ji!qKI!|~9tz4|H@I7o; zX!+_aw!k19RCw`W#^dxjgYdUJYO^y86Y~&V7^QdL{!_u#MUZ;SHQ|t4DQS(waDDf9 z1XE>+(Y~{C$GAocKv3D}D0bw6`U8uj)+4D#%v}aLeevAkkD`s35Iyz<#8z+Aa}i#S zFy0_h5Gb^kFXK%D!!%;&D>(&$`-RX~AJv`)6QgcM?<`P*yDPseCr0ofDVn4pQzVC! zHA)_L;nuIYC{G#U`QGehijV=@Fw?1sJw5Gp8#>x6GEOmEi3gQHIkq7|r+Em^vZoL_ zZu?E3ncb}rnFR9$oNT^KW_z`(Ys#5~+Wlg<=l@YRk7cphN4x$dIJozFdyKLFak zYBh8(%$j|lz>2l9`-SP73zNR)4<8KHz(uQ+b>52XHya~<+=G+!}NPg zOsS9WKt2>AP8JKEtfk&`x3y7>Gifp{F#}Ov{$SLv*u>dvS2438E?J}mfn_Xr=`ZzQ z#CsmY1hwu9GjiP`*fLOrrEemhe}h`@wB<0}(bT*+qtG#!HYP@X=d(7IusEuDoEm-I z_Q6@3bq%?=ip`|^tBw*u($jpE*c0oR?-3^;tUWI;zG!6p`sx0ALc0ko?W~-d>;Q$P zgA0`0w@x8}SXJE=TRj*@FZsgh&YGTXS{oYD%Qj4!|AocogOPwL?)^M+x>k1s18t~6uQHSt*u+X{_ zFBK2q$PJdaXo)3V>p(J?tc#+5*yV!0#lkJO{P+IxfoUT_Ws;fC{cUJ&NJ=Nz3cM=4 z5>pPB8nr!A{J<-08vtr~&iXBiqprC^S|05*TD1Q@{H>CZd{1?Ta;8`XrAW&6v+V_wmsk~o8Cp{moJgJw~Jg+(x01an77Th zp9WxFn7L)1PtGEp)KjImoaU#5Y&!uhN0#NFC_!^&=QqNx%oZ1Y<4og5NNj7I9=qhE z#?MT%^)Ezho<^m+JGS-pjUlY55%7uKv*cdtR0~?#>fd*+n4P z%9W|g_2i?f!K^~2%WUUOqeQQ=LS@fo_w@&*?xN10+;(5_p>)XT?)G2rHI?%u%fz;L zD80WOQauq|(1~6$RU0k)j-MlTD zfx=>i05FT2Q>3yB*J9uN7ZOX2R$F(p9b`DSUBnKW+n?*y3>lhmqn#RpihReN$%U)+ ze{SE~xYvs#ea2`E2vQw7kwUOpi2Qo&7OKiPduX}2Tx4cM|J<+KTxC#<*#&*qi_E?- z^?8G)7rY4sob|T*eI8yG`b^-_YsD<#GToIvf3U0~|hV1es_&0a*ojzP zzMaWHR6L3g@W9!q;r5cqXbj4y2D~Y zQL_ZyBr9PUfeq9SAJkl(L`va>HqxVt$n4ZgAwVB%K#>-|tSW#Eqoq2}y>Xz`OEc!G z&^rTMR#6>F)G^r8spUnBmM}hN(RImcqIc1ADK9CS@8xd{r{(^~!#C&Iw0~&n|3kCv zf6IyeJM;Dbn)l$pwb=fnQt>}oY!&}ai|t>%3xBZK{{G7USSl*W{_~~czw12!Yj^%% zQ?^B-pCU&;?|(z)z$n4MyT6k;6xpL`PCFvIO)+(8pz!3|dvoVNj&npu;#`|4Y$dvo zQy^yo)d*hIz`v?n)D>ZrQ5gRlt0U8;B)u+0OJE{TB!N17VryzE96u)kkJUcJmWtG> za2n^PEz=h|mr5U11D)>|K z3JPHD2K^pj?SuQ6_lg~4c5H=t-5{c3wQ}Ry0E2%%yX2UPF0@vnE*xe^|4s30i~jyx zuax8wT3%DMe^N%W%lSF4Dud?$Yb_sU4*AN9A2@+F<6~k+9)M|@P($IYh}ff}1sEi? zMOUh3h-3$s#TOXu8yff=zH6*%RwVF5JE7r3@^U7gCh{g+PI=T|ApE7?)-Mw6u3gY` za6z`Hom59;An$C91BO$TqA106b}8){hS2Dm=@=tAwlFF~;2L-M0Lpwj8$L!2Iur!xPR$FHexc~?QT>$;9#qWG zQT`ns)P;O(EXwp%+~s`}1@L#uc9l3TZ>{`qpJC6CryOd_%16H**}=40bh>!_zVoib zz{CCC`N6ME?3#`IT36d77ZCH(LF}Bf-`>=^-Zo??DwH8D#+fJb4qO*2YFO~?2pw=+ zyQ}}0I{%t_nUC69hn$?7;#Vd{30+|VQ(@iW^80!!m0khM4uSv>miHx`RvL77LiSii^cKdcOjn}7+MPR ziA&GhfxUTXE!NnFVKlc?bv$#E05)md*V5Fg9Yc%O@cxttXOwQ`ZxpjmyQB2-lA~#? zMgE*W?e#-2qx5ZT>tAWd!U`}wU$+rTTtPR;X&xQ2SBfL>ZiRCm0V3eNfkI_04@T-pl+O4^>kaU2SN5T<=kCSRs=CwAO5!Ay=HX#N3A zu2GR@*4}3ztbEN>H4+meNL4-tVcew3s5z4*`CYW6z7Ep` zZjI5?1p^a=5A*u{;3h*~1B5)Ag$py)9H&lF>aYyu+&J?gSyU{wRzHj=-4$Zmd9!;z zT1M+z%{z^8R|1c}DZwp?1;7C@n zI904qgzCyFBfE{4!_;bfpZG;kgJ^c-gRhO7QQR)&l$K; znh4*!lQz-=KD|Mq9j-buNXFh%w%2r^9b#_<4Be!>{J5!JWd9!z_P+#5k*Wih55`rmmMwdUjYOU6;1H0c3Q5MESsruGWppzGTb;m5dsO&tK%%ud^^RYsW z%|Hfayp)`86YJ2~O*lVmc%!`JO}~&KCNAmqp`ZyIoV6NXvCdALj$-0%7BWAT@aOUsHO-hw)w2J zaGkD{BS+;u6?=oZC#JQv(UoyI8#an2ob5dZE{roc2s@wH(#a2CmoJien&z(7H91dA zuWU%?o!HhZ>RS+EMEt#Qb(`yAz)-rOtFgOX!a4j#GybUPz$JpQ@}>>m_&T~9r7NwZ zan<(_rctX-AWvUmJVNhO#CB9OKVG~YA9MQTp++iI99@JJ5+a*1+G`{l?JRunuxwwC}fPFIGf`_NtXt>y_SE zuKPqMuk;FjjHmo|XPxN_wEOflEnedPoZt;UCxME*t(Ny$gJtP*&9#GQ zia}lc&7DvpZRTZ=ng$N*NkJ)akgB0xWkl-J0K= zh?4y+@KG_pg8q+Nwncm1$TQWES1um|p1Hw3k2roCk=6RRS`wI^%zr>Bd@$ImJLgj@ z^%WlZ%`Jh<<-oCt>C3G<2xvXECV@1i-%>?G7ZG#toTU766Jy!9}a|vQxGieN;w(p_*UsOn~w;4-A%fsSsM7w42Yn`0+9%ZfFE<_;Y{Y zc!E4wO3Lr;F)UMZowh)%TD;G|D6qamTSBSlFV-`=qoTx% z6p;2U@pdYs4IJSWuqPg+t$mkl0peVDtxwe+(%%=gz_+}>gR3J~GkLpa|KU6>a38kV z8MvoSzfivSVPt<9a=J^;KUZj`NTJB%V-E1N5amS_g=Ix)XkgcxqHJ$2kQ zYQ!GrFX}pNT%ZmNBsNPVY}iF~ON4ynto#*)GKvnT<^pyTbt*@>J5z5h1Z%Ed?b|pC zF$t+;8QXb->Ky#!B={TO@zpTKz)>-^VXzj%1^{XXbR#ni=klX%FPG>nzh!b*lRvDv zPUPMA?rlhgDx)IGTDfAa_GnqQVVga#fF{J7al;?zQ)qE7Xgf1O&<>E-#>eWxj}mYC zs|uH6gLWP47kP7bM;!F?>#U=TZ3-9Mo!2>j)9opasW zmb~4w>fw1}TlaZfi+B%;c+Fl&B(EQOgi?8#(}ZC7i_oufO<9d5DV+4Qkohk~A2Za{ zwGAkK0U%a;e}LUZR%uaoI#6uFaz%+NFKz5f80X87^~_Hazr`Xdk~*Jh_GcMyrG))x z5<^K$S8EJ>0Zb zR~st0p7(pcKuh>-|I+RqSK7972dc)dn0#`b0f4YNB~*Fm$zNo37OVVrCWnnezv|Ws z#W$l3{hJ%>5O!Jt4H_Hw`iy)ukN9-EK!)o@375Ee&r+OC9(n7C@$*8!H?B~!MQbb` z`d$gc?~>Iz#Y?9P#hQyiGZ19aAWc@fVp)CAauL#&QXqWH;PvI=F-XEDz=9rIxF}Un z99`}M;qDw~K%-qUa)GgrdVh_Rb&hHO8o{oLs$qO|wa3K)n$jm^of$loAsSmMf)F=Q zNF9jbjxeL=bu~}C^uspbgxSy`)E{{t08HJ(-&=!s3CkaL`|3tTrh3>ima3);#s&#^KGjOGJ?zJevLZ{3rr|_RZn!~gifggDx+x}GC=;o8pg-Glh8q^Y^r->g3}<> zV%cMFW;ntD?UZXEv;<|o08gnC596#zN!D8)^iHrlNnLoO$(dYyiW%L9x-nTtMSnig zgZhtH)E5azpVrW|^EzPOdO4eEgq#O*NlzIRPW2chN(cqm;0f^8Q=e3Q)UG;PT2<&_ z*WYXH!c~joRDI+J$F6i!Rr3N$d42KkeTEPqn{T;hQMx;PH4^(P+ERSGT&0RI6+#5 zcI%E5q$EHJ)&RJHPD(IAyT!&HOZKK8?wv)(h#3yIr}Xd`rEE2Z^*2v?Yc-^ zz|JYRX6pP5j9$A5iMy#+{9RHxYxDF)@w_|JM+xvn=a9wIntLe)jK?*|2bB1;bRN&e z4Zw-dfk&?T%$oGTJ9MC|2MhDfTvMIp1*~zjh4UJeX55;ZK z530cLulx_HfSk<#WbpR?7Y$_J^9HhfPfTsocTAJVlcd#9^Si@`!3dS{J!%p9F%$PZ zFp)Q`2x;P~G+osh2C;FFgRvtlxe)cvw-?6F(mZW)d#*L-V2*R*=!dKdy%lt`p4Z)}uK3(=0@h8k9o3v=RmDP9~E)n`s^gGu@rwu*7OBAS%1 zh?G@qi(4r*Ym19Fn_FofgW0negrer#Mno$s+urDP=FgTUgn2IHk)zbr0hFpQL@GSC zqdyFHBu7e3NbsMY58ld}b4ixVK1`uvgfDRD`YC(ym-snLi$I{?RXe%=)CdP6B60A7 zQbSAb>FNDFJb)rac{I0FSvjdzxE;qytRy_*CyM*Po=uV`Cm$+No@)?&3E)+BVEInt zXMp_VctADu=QK)wRG+1K0cLTHVNh>7bw5sm#-&LsArjmCaVV_5bg_QL>y9uVCU8Ci z6gxOyzx!$xu0-iD$s%&#A8>Sqr*4s_!s|m5OeZue>fZbT+B}w!rx%rMmxt;+BgVb2 z-X9sIEAUeY%Axx3UPM27RVR(ZDsgBDufp^3tc%aGp|S4ac2(0gg2oFGgP>0mlx**+ zM~#21p<1>H6r{%Qf^C(e)z}&i!}nySwQb0KyS6S717p-@R?CA(0z-6szV_$Gj34^+ z1Ye`(9pBJP$BQVpH1Bdg>^wi$ncXFj8(7*$gttNh?z-Tjd=VKIL^R**kDrgPgcDq`M5GdfPV3Q^aDQ7TUuACxz|SqUtX6-5bi59 z&c$kn&dn-8@xiMOd@c%>Idq*|ZEo#3Agc6bn7?G-ULJz%) zp?3&HKm??h&_YK)bCYK7qmY2ThPN8jgzC2*xSEPAC++FRLo$|2{-OMzyx!$Cxj7p+2s#b znNf?~QITTbuw#)*-W!LiFQ!55fJ3Q}nD?{|c|6*t<*4yqrR*13Ua<=j{)J}}B#M() zyU{*U)gCW$H?v)zd$Y!GURli!qks$KA7qs|D2dc=NlqCiqzuiNXVi&1rYujOz)}b4 zQsO_aXn)UYSG(mlNG`8sOBvVH9OB{YbczfBt5@liE5Z7zs`0edcc6#ihh?1)E zbVr+rr`u%Bd9Gm30TVj{TX=9p5w(E61=Mlx=Jh8jl#!W*gWFl9{9yXEcbL{e)$QSl0lEFW78qu#Wb-E%71F0 zY(o9QoG%SpAdMf?egBTvPWj~s^rz{piBNpMl-eDRI!Rrm6*#08OT>(Jo1FLYn_ex> z?T_o>wQ4jI4Q&%-qyIGb@d39;3A4tJ%akvnnrT-x2Yd(|6!-pjvO$Ac3fT>K8HbPN zhS`bCa?$~RE0i~<#YX=jSYlQyRHAQu6;7A?$bop1*RHc_&N|oKfg@9tclbl6w(X2fVdR-6ZI`kKgcz}okGV4KdlBJl+Ht(5div@v- zF?cfQkNw0W02ldsL+NSr?FUcAaZErW&vT|bdajKQfRxOSZcHAfE>ZjH1D4_s|1cj0!ds-etwEGqt4Ppsnw zc*s~!I_a}KUg{;K4f1;u@{#JEM>lDM^cUy)4CW?A)(3i-Ty0>%PFrpa0(ZkJe}}~L z!TUuwCB3SPFRv$(8N&id6do6e6BBz;Q4=7VJ*eDR!jth~bY}|N=gp?nmjmh+sS4Py zGVIqohN)GGbqeqB-dl~VNcN=kBouQM$0rnH2rEW3<3g10Cx2lJ0@xOMTaQSFUZV=- zv?Xh%+Ff;tdp*4SOq#yO2smi_U{{Q;nEw4JFV*F}VpX}l-`+xE=vRvt@`T@5=T(Iq zNHaeO#WAj%OIT z`vKym67|Ea)`s1to*G&49%VQL5Ikj{5h-UWffWgcaJ$n89SLlAfu-jPy0% zU*CLT8urqZ1UsbVB)M@Dp<5V7(D&V`sD0p1qV8+J;-8C)Q@wDTd=p)Mt>5k_Cqywo z)!V0>vQvG53&eQ9Eh_nSoU9{adyI9o2qiiQpR<9n#^~c$QLx|`|1cNXxZ7hJxdz~B z9(I4%umEve>cKqExc$;-XZlK;{m8uKFWsS7o85F}W>p|kux!zsD>cVm(qZcvg)Q|% z?eX-y_C92vMA%CpVxUnW7lil*AzZ|31|lZNEHu_Y5r<0MUZ8}GiD6iuHb}y9YjB`X z%?;JLT^t+w>>4GH8A|Q4YFlPGcf4!yvT#2@Nw&2@%VDeK7lpVr1oZoB;2Y8`8i0fQK>rLoVywlzuh`fbZc*a z!V&qy1wBZJg@A39wksT@XEOx>!?{&FpmchtxHR>>Y~}p6(0>A&ju<;|jtFr>w#x#tYTCPCGOy zp(iPOWfw%jCp(F(!;~yL4QLrHzJtKZ(Qp^yK3$p)Ltv%tj`hdYMjDAJ<#PUFj4 z;n`E6jxXVnjb<_Q8sEx|VN+`3ZXqCj5XUO3ZjxlTi(+g$e*uFi0tv{TyLz~bCe4qh ztRA<&9A|$+?nI{0(ec z$SQRL4PLx`QSO&sA!)>CJHbo)I(uatccGI~c%Wb> z$(sILpT6hDFO{%0PTX$10Q+R{=kIkcU<{>sfw102roJIi{II2f7&yft4BiVjBsu{R zR(m88AItWD+IFxdsVFOy07<)r2qH2S9@tnSK18&M98((fb87#Ppu-+n0C255kZ$c%0 zpucbsb$Iaga=)Cw7uRGK3L7JWjVW4`Y-lCs<;LuJ=qnyhO;o3E-s0#+WsspE*&pqf zB|WCnCXrmM&W;XZJpENOc|anjq%JquYu3e0_Q_Vn5G$8UD;)~nM=dZlLgP-JBVBNl zecJjx=~S7+lAdmRE7Yh!?KKl1^E9l$(wtJvH+Dfu#Xn*D0>s_Iyt^6*7Z%4!wd!y#rwA{?MWyw{{EBKf zOC%{#xBw|(ony6qMXI?HH+k77&F)yR;XnXbUpg!ijy3aWG|}1HH@Ge?)z5g(8tY8F ze|N^$!*(~?DAvg+&b_#@l4LSb3*?y^^(`nyesa5ynA$Fy4V`8ZW@+X($;!M$== znSQ9*6pOQ6yLD|tZj&*241*l8zh=}t_PXj3dAuTwHTHSTiDYkmUZQJ5IekMZ)~A)eX)6qxul zpr26T79`#A!FA>d%7m(C{AGMEuw2_IkUbglH;j5OK0}OCqsEJ!Jy}Vr)8g`bc&m>d zcJB_`=83x7Kb|A>2-_o9o~c|upI+Ovuqg|aydL;wIA8)dZsW&xR2d=Y9FS%lsKbF0 zBKz&JD<>Izl*ag2fEbf@pL#ZuYqKso`=5C56Q#`(yTL;a$Aa-(Z%*# zaiNP#6C~9(7;QuGD%$aR;G*pFX>9^`dcqdP2-Ksz)8dUfa@0Zsu~GcDtAYn76u2jjRVumjLc|&q zo^9nun^TmkYO{+W%y|tolRM{o$d;h@crSNUK#fR)4M*het6^F?0IGZ7Vlray*sdoY z8$0v$6(&2{m0cmyz3{Z5aAvRYoKs=eC^W!DgDmadX{#^4m4h1xV@q_*2*?)9QK-Bs zaZ*01kZG&1xGnUkWbz8c85DIM+MN_9zVN6>A*#>_DRH7i0)h4$r^ivk!7pDm6(iBly&pSnL@9bozRYVrGM9EyQ#c!t?K??i*c2U}XnFpwsr8kl z%C6R^i?ZMoTbYZd)RUAWp=vQEu6^-Y(kDDMftQDN9wN^Jc8D63)LCCzV#c;Vug{U6 z{OUVdf2=!Z3IC{+EOk3EQlx$srS%Xp>+!H5uecd7 z`O{39@6S3P2nYJ18gLJw!9@nzf*7sm@l`2%-Y4P%xnao=N$}uG7DY00Mm%$NIFKN6 zgxP|eIfIzySGP48IWv}+fPgtT8gB^&vKkC_fz+KYzcy{Njs_X4Q7&yO#oAT|2YZR= zV2%4tH->)?J2TY38<>G-Wwo4E8{``_WakJVIiBHE>> zkvbW;_E)Wzp$cUcFZnY}RuP4(aawCkGrn;~W})42M+70$<&R*E&Y#SQ3{3Uh(`S15 zPFC@8N0M5a1LpkI+)|LoDq`M)chdWaS6mWU@kO(;ksTF`sOTq|D#QLSE@&z>#h zf^p}sy1O~M!L1e?rc*uW_>3T-ka?;6b4IWldG=_Usl)g>AaO94jQPq^ZRcj|1heSh0!V@?|FnVpDm?Xf z7ur>ql+eG81N}4o^w;$N@9@`g2_n=o0G8Y%U?nAv5-PRFvnX{}aD`F29UgxB06=N- z@K(?Dgi(A%3>x1q*!_Hy0zl+E^zGgro8yOTYV|=$S0qR3Qsy{Y)UW>N`oiRJ>b6=2 zk_{VNIhU7aiU0;oodlHzQX-|~%JAa!LTsS@IGrRm>R%*$=+ENaRxzUI4MZJX;&Bk{ zymZ6$705fe=;OG?-W4X=AFU&ZfsKB=W|h=b15qx#OHla8pdI(ipl8w z-FSkYu1+^d9wIeiBH~gXdZ8%=HI2JYQG+N9kV}0~+QfZy1xjZ6?4Tcj2ezbt0$ODu#Vh_a1ScaZT z8q7jv+hX%vF=h*M9X{?FI0cEvTr53?7)%MX%bTUyk+C2tzf%I5h?3=B+(3nZS)oNo z6^h57aS^(hQOH}GB>E#Q=O*YkF~R3Hhwm^U;jWUZEmh3D@Kc zw&)~HiOV9tTW9ZPlg@#^#4mOjQNCIldWp+Edobp(9PyUSnaa;t&LDN_;s)*Zc&ut& z{ySbglD@pb)PH{P5mHMH@@_b(rwyOpmkLwkb8 zbjtGFc2iOW-}oE9xF`|oql5vFCB)Il`{d)6ycqa1f+58*hq&;qO4a0M+|Z_7PU0OH z(V02TgCOM*4~2?e7knZsLx5{_JC}DVirVv@9J1FU@jc@$!c}JGeQ0DRVfLZ92ye)~ zJ-Cj@6U(Jcg?;bRUqNW<{Fd}{mWh{Ai*($U*|J+hBdDAXg06!?|8V>Xzm?Ls_SNS-&E zAenKymL50(K?DjMQjWCKOZZL%w>&c2HsdAu$Ph+u*v)=yz`4Xe+Zl|dR!ER0>y*4j z>?lZ+1Jw?&Todi`ifLXlke3E@-Fm%pYLAqJnR40RX_ZbuPkFu<#5YTqPf&)K3%8@QuD@Fy% z8H+YqbX_je*JjFTG|HMYubJ7tYO}S>=46k~W2@>8dds!xCVu?FzcSlKp?caXjO*&Z z(|efsCR6H>ZAKuH<#R;Cw4ADKkT3d_+zG$PLs*&yf@sdkCK8U{da%PEg3whK!6hz^ zo8nSBR}hU#JCpU?))0rs?G~Z@0T9;7v)QnYA_d+N5v_}Hs7VeM}-VyZsl6d z@~?ahc;oToRE3WHcusiV-!s(FbY35;Hx&@JDW_;Js?DvR`B1ccb*I7CrAbHg9{qK2 zZq}^U5mS0s6v!&-Dw^o8+<{h7TOv=NP!D<@5KZ$bkIdOtP&;&0QrB3|Lf#vbzhrY+ z1DRZiRUiLFH9K4$H>C5ljD;Ylzqx?D!BSagX{%#LnucTbR#`^K@;GjEx6BBR^Wfap z*t(lXJCr%|9VxAE=pB#On0=yY3Dvpro0`=y-!~7;k9ge{ z#Cvvmb=jp1Nt*6Ne4z9+6`2Vs3J{MdA&?T}rOUOChL!zz`l%8PSt`KnajCBwc+g5U zHJ)yAI6b&se!}llwQok*^|{%YKUz<7shuTBZlmaZPDI4rzL-x*qKGsa zt>vpFB5taT4`Z0WY(K(hJ)nN-os!vAm<`Xvpq;Mg99j=$ot!lUn^A%+3a~HFZwAI8EMw%+U6_3v)pLX-}^y$C766L z$_pI@(e>=n*(2`pu|~!}5`F}PV^^+{jdqr>_lG9sM3S9_d4bLQ-k)X(gL9=8S09!n z6gar}0YlSAaxX&Lz7%TkP>Ac;rV8N11;;r%mN&p7J>^=vSj~?GB?J zK6pNW0F$?>1{alHSskkinygS@8zW4wI=oyC{&79|64>$+oArh8ydoY^sP-!QPgKHXD3p8LgE6Y~9Bs`IE6_xbzKuoU>Uq9(7$)Qqh^G zemjC!d+6?(u#-(Y(m_}umS$*FWYHc7rlpM4&!M zDX5NeA#;2&p@#C)Rfwg`B0(|ZWhud%D1E_h>7w1t+Pr-^O-ME|D~V0$h=T|fM{`<3`DJD1K0rrMkWr|FeY}8D)Gp&~x$tp}uRhUMgz9O=8nkaX{CwGe zU$>siw$Uy-22+{#RnyWqKk3^*d$Ub#b7cpAjS~90e-cjrk_$(&HDs&(g=AB1H#_Dh z(tjSa&dLK?AfCUb9MrkOh~?y9*4S-PLLB9%-@sb}2ucN<3zhShJ%)pgCV-t~Da=%i zwHR;pa6&N%`$xx^jt$his5T+yp)MOn)8)l)L$&}4ye?wM#L|l$FG7@%Je>cWLPK9+ zXz1xE4NPaWFrN5|20`nQB{M2QhZYxPYZCx2&)FIFFFJ}*X1ole4N|fnp6EJ(uga9S zC1~SCgC~_JSmhLF$%eNK#^{G9i>~ciBBKx0a*ufO)|>Os5+bnQ3rFjM=c+vyboUgp zKtVi$zBAlk1@u2Eju~1{X4nYjfvzt;su-Vl-zX^2znoYXEm0)J1tgDU#^A8?s5sv! z`x3n$AiMKYAntQ%1<9b%qtZ9GceYYv_pVW$;~eq))v}%Jsi*l#!#x|FyqoN0h5S9) zt#092?kN58@n*edDS{y^s|;ghaY|o2%WzAU!v}x|x1^`q{aPN+l|}Wi4KXSWl3mYE zVWe?k&b82ug(`ICZ~;)j5#m+bZ0m;5SNmwN)iOZRzco}$$Sn*R|DqCF7fGh*L5~&I zLT$2tW!nnO9+Ow^h!R+g#&ziF2c{1&+wGl`cYMAJh7}dJ#ZWEpP)FzxC@oY!Za(jCaWpMn@CA=xQ|j)SFJa{x6I5#+1?bXwZQZ0nuo=@4rg7oKN4I&_ZS3@QkniEH?p>XLg)jcXT<*CD|liZbc20y+6vev433-TPl zEEPY|5^WfV+jt9H8t{3$W>ye-{#G&l9bubxFypHm%7ySEIASdmQM`Sm;$NpJUO$vU zHYldiESB6;MjHHnE1+ygD+M-J$m3vG9lGx*AR3X`tjj9u-7H^W4(zTqT%lg5QC4Ax zx2>p3uReP4wZY&kZgTnD)&L$8|K3Ey$Rbq5N*5Qf&iurlQ@xIkcpbh_A7eD}T19Ey znir_bH7diQ^7Q6LKG^<#KEX4d#b9>k?>u{t;w^)S=~cxUXA3`$Xess5h*#3UTG($| z=GAKH`*O2-yR$w)B!%N_Xhh?Z1d=vRgoUN+sI9ky5|r80Y^cF&F{d<7tah<7%%jIs z;Ylj*<%g@)%4Su^?x}@~z#F6B6c!mVZI0o*NO&P%_yy16ykqiBn%zMD;!b#Df%8n( zn<$i=n)nG39Yib0oJIuB`^YRbO}0yef4SiH{ps5cb7eEzEQBgc_6Hz=+xwPXpp7G& zvd2`cBl0A0L>?tyqmpXThCcgOD_t9VqU9jAnfC0tcgYcr5$uQE%X?Gnb2k^*gVD%_ z$=}|0?~AJ5FL5=3jK_%@w%%e@EnziuXORSi&{6E#0Q8f1mi+*Z#=2@~U~tVKnJub`DtTumbd`?SbYYoajc{!QIgtP%Ip4duuB>NWbwYx+C4;?sT@BPSW8kH&E)PcLspM=MWe zDXFVNEvx@H61tiNSkTzX*4xpG`608I@RcG3zrx@AJ1^irPyS=5KW>|Xm6zS06BM*@ zb@KMUx;0m`xsr^O?7VC|ozULyp3K7kaXbI92{N<{2R{Q6f>%>QSQa}xg~=k(RwuuAx>B*hR%Of!L= zvX=P60ePrSA1*e8BkO)!qIxZKT-DY;F}ulDh<+=FL;HoG(6CG=fC#@EL_tbtwbU%s zF6x!Au3dDaa?k({6UuC9yFJ5+mSXe^Wc>I}?di8~OHE!@9Zil54PetNERK#Q>tK=7 za$pIs6&5MVcMUO=LlTm)C9J@vwhoQZ3|=CO4bfPHcjK@}Ktv8=j|4-cHcyGk$)$uU zqPOpm#UAk8hw|nwHhrmfA6D84QA3z9M09q+)|$(+QRj_Til`57Sm7niqSxQ6^a94& z!JP8f!rG7It*BoCD{EWw$W+i%Fxtwzd^YmFi9iY3i0I(0ipm=;l1(}qO73(qBFX#o zm>UW9xyq;}J;pwkOeR|HD@KhBKs1>HA^^>IlBld1Y7tSubsz<}tjd3=b|>3b0{}T# z`&%Sd1CHA>0&q)u^*ylVLCs|7Gw`Sor5-h)G-kC)!P(isrdR{JWUwm_j(I}m(MoPzavvan;)r8fBIpZHZ4*TT zMQlD^wd!HIbAOvJqGzD9?$;ik;C_fj9r+oKC5j@=^rJQ_tdNJC6&+uV9fdYB7=@&v z7}}jgvp3(7iTCZwd=!}GLhtF`Xn$MGY@J#AK{NBh({l=&DN}cg@nvnizyg%`0j-k@ zznG=H6^g<*J5m`N@~ zhj04uo4;$9@h4UvfCy`0)0n2LS+fuiqwj1two6y$om%Ew6ho`*q}M*z>2SQ!!xhH` zTH`Yz`2p)ITFX#B)q;pNR#LPg#Xok~smWZUSNAQ~&>BMTr}HS)#f`!_@1&Qj_XIm@ z@2tcnjZ44tE+f}XR+4KsR2;PiFjm%3w}R3ZXt-Ihc@?A*@u z2~3|Vdze7Ek}zK!`AXGSw_K|vKhqj1(i;7iMh)DVeCGg7>4|lDXG;=W=_+mNp>$Q$ z`K9H6NBYes2f9v0H6c4+-af#Mn}%KD53&c|l=|q8YnJjlad2|L(kiEiYFi^mmv7h9 z(U`Hu2qXD2rARjF-Aq52JUkSY9hhe}G|w?{)|)S+$2QGUxFkWS2GJ~PocmceTsnu8 z`Q3KnhPFVwPjLs`RdeZ;fvy}o)D~WrEM3K-eh-2}(1j_j@Bw?g`1oF7D}G>|Ofut4 zg{*?|jz@o9LnuEwa#IuT(`cMKFcNarPSBAoGP5x$j6)Ar%w7E{$2Uao{1_|kFeDPK&Giobe)V%*S z(dv4p)c1S=|DI%#ON`D>pv#n7T)Jx0=J*2Iz@yQ0Oq5ISxgRaLOY z>1PMv0^*PnYc)jNgjh~$EgX`_DlSyM>5D2I4|!@DjVn%RDKr|ckQc}a7pYK?oVsE! zn|!-$pEdnhv_yW$SgZB{hVwSJV7hH73c5LPpE*uOh;!?-axi{qp9C=u4 z^SHa1Xaf@(IFut0Mt39}fKyp6)(4Cv(+=waZ^e~T^WTnC;a(`3dn(YF2%X7wm=PwFp|Dwy;Vr}K{-AX6mmnD3r7^v2Ze6cJWU#ToG1)z>eA+S2+=$plv%xY#q{ zPb$LYPjTjm_Fs{%Y9{G#^`4SBpD?yc4tHL)a~9l?iO{Akxc`Pq?}e>8)7i1bz#tK; zCDzO9=95forPDZPebbIn5cA}tEmpCl0R+rC^GHzSzOLK1&&x9z5*L6%-5 z5L@8;*3xo!HFt0EGiY&iy7X6RJn@mn43B{2Ww_*2bg}%<>H#2bZ!6yc9aQ(VUQBHf zKvKukM6f18xag)wL2HTG*R#fgogtUi<$A7{Rr}|Dq(G@8N`yZtHcdMBH3CgkW&iosoDJmr%HsU zk#l60*w1f6R^uK#yj-0PO?2 z&^aK`MHLD_P#-Q(UJxnpRG>+Ax9y%lhu3Ocent7x%4nyjcxS0u7bLSwJG-+S=>W1RyvDWv^x=Dtyq&esI;cT5)DRLD&-d4d|k#%6dLrT8QkzJ^*5Pl-L7= zd?oYSSYzS-MNJp^ecsFCSN045!3eS5(CD`s@^F{KF0271PcZ9ZkLys>n4ESkSv1nH zYR6juWby?u%~y1cBxa2YKUB42OtAFiEnv7Id~QwVDb&Xd=9MJ7I?a=8kZ zKP6JYDy@lv*Gu=0B$4jF^Z-gVtM-rigR=BJ4R|eE98awYx{A4%DE8)Q1zSO?x-~A+9!7oQLs)|6)b;ZR`$eSMK#SZrB+uvKiYbU)5pk=w z(MP|k?C=5=E)ksm4g-erFq03wZ8&Wg0SYZ{-i`-Y&wFbV#NQmhpwU@sKNJdJ{!@xP zq1ewmM=}A@Tia`LzaPVeABy4ij@v0jdG$1*5zjn4 zRNRyVAac63u07Fm2l`_{ssKZcbU6nQ|bzu~l|5$EANh@F~D@3z>vGl&DNFf?Ta#@73Y;2Ix|n&74UT%5=5mk51D>vK|N zi~lxz_~*Lyuf^{FSb_L|mmU76s>9!ixPQ&?U$lq_!T*;aq7eMwO(Oos68|4eB7Yn6 zzplt7u1aqI)fM@_4JeBE-@zpk+s&QgfgVQ-F_Q7;E*1B%9=6gq8(HvBGWc_{jB=Nx&N{dd%7b{Y{08`j|`tzaew#ySVjD7V7+Z< z1G&+j%gcP$3VGjj))Im=V~N^%?)VcIVlc}3Rm`#FH8D^_o25 zF>T|m&}x? zh(&A&*RhlyN`r~O=TJz@fXjB=wxuo9lERG`YT4e5UI##VQ9N=T6%K{@u_g@yfUBG(qG_u_($*9slKVsYzNr9Xnt?tP-Cn+9XFJN zGf77y_U02_6v3)+jO%?g9V<}dmW_@`M)_J*{hVHq_P0WVp>M-0b+1TF{EvlKH687n ztSiNP;wp(=OGO_3gnt^bj$Yn;{VDC4;*=HbJs91mB^9?G$G4FhEj}j$dNY-2pCzFn ztx>V?<2jTR7St{v`OfB-xXsSvxrp2mq0e_jRzO*P4(V3kmp3;B*#z6^tyb>zNUc~k z-WCAR-cyW>c~^P+bV%LDO4Sa~V(GFSf-nQ{F}4Z_^VOvMSd-$NqZJGfbzllp(cZx< zr-feL*0P%SjL6yU{A%5sp-Dx87>SHfQ<=>%_X-+){U(*VE z<7?813>fEF{9OfO5U^-U;@r0x;ro#kpPqCCfH`lqsurR` zoZ`q`255WNZCB@Ht%O*{rBqCUDHOE8hRC~;cTSg$Uwm-D=+Wg?by(Y^IXm4Sg3=SN zh|b@9?xmNb#T?#|L}?)7&%CoyNcD9Q#1ML-I&N~*gI%@(sriP(JrWd)7Dm~gHw#Xr zwRPK2KCtt$0LA*6^hq{#uh2RscraxurKJK{U0lQ0b7Al5v%46xg-O=dxjS=zvg9iY zlk`rq3Jj7RXdap4tj4DW;HKcIl6UM7;d`vPwQ(PEEWiTo1kGOb=kn^0LGK-VFkSUv zd97=Yo~uFO({t_%B^{}HcQ@`08VwZd`Jz-Dp~PE6axe}O5<^xjeFRvZ11XXz;*>Js z7e-*E_tLU=Rh%TD>(}%L{A-TXhsraK$jsrk9Pf|YHNiFlTsiYu9gF?MQn+uM(_kl2 z;@XJ)IaD;Cvw6aK-Yvk{;N~ltqG|EKP+XR&PW@24>aHB&O5gLBI5|m?o;rHJP&3*O zZuY@FO{5XlQ!onpY=Oey7aGiipyB5M9UuDv9ZkNSRC$8$M}n_nkB>6M(2w!^efPJ_ zehs9Mzf8S5SN+|>><)h*e~BcN#Paj^C9~RE&~np@^h*W0UO6GLpC41l-K-Tg$MbzA zZRuX99CT~5$nX(^ zTH5>t+k=eVXX3y1o$rVyD-1sRKI8;T@)V%(d}*-4r0vA?yM#n)L*wFiWIFy>aMWyD z-;C6O_G4sygQPf8L@%h?BdAxGNuF?$MKt!{XQ)_yc`j~lWWz9`W!CzQoPnM_MWL41 zEjJotyqyPF*+Ym=v_%vp+odIEUV*25CvroN0OV`pC3W|!W<*0UeIW|O_vuWQhTXzb z`F1W{VQ@xxwEtA1mU;0{e`=+-#K}YT2<6P#*T_togoW!!YMvj#CF2`=8YNn&T5Xl- zsTX=fFWlhz`W(o~XvcLT>yO%;EBAEi&aQ z4S@;)i1*0%_s*30)PP6Df{l5}PVolY9kHd@DCFDw1w!A5>&jnP)Vt0q_~uR9uQsg5 zk$*G1MV$SL{*+@n&hV!q>d{eTtD>F;Yh8)?Y4P)iHb$=X_uu%|CEi~<#)cVW zDC6{&=1E24sFo2ALprHg!gGA`z7hswkE+?@I+{5TlOCXoVSIMU4XF!Q<8@xwFV}+>;@+_>Fe>-iOi+$muBig66QBlPWB@^z4y#In_Z`rSZ=y*^Ne}7q- z=Tn5)2231@ZEm>#)4J`N_iKNK+3H^z47GMDp;BnQ*pfPgcXHCalNjN;dV=$Lv=SwOng! zH+~m`N2kA@5s^ek&e=+Zb_jG`4wC8g>7H4W4rLAnl@I364CfvV@OUB?_t+pU&g@mV zOVpreWaxr+6#;$&=fats?qu7~dKg3M=2zT-)Xq5T4fKG3LTv*rF!a}%KSL^sHTiki zapJ}CrChoQzkXPsT1F9NXlvEhMRfgvs#{QBl6O^K=Js|aY5Q9W6keBzJcgjNn#9kZ z6O_H5_Lb}jk0yDaxcYwJuj&XfzJRmcYC-V814`PdDuuL-?Bl-tY^=qprDLVK=Zn4u z$Pi&7!N*)pG8uNsUszgvXGxx|ESl-4`d;uVn&iqxa=E{=p7;BOWJ z>d7M-ff;e*2i>%#{k1mH;=z1v_6fpKTSR0l$P^XM!3b;sMGI)V-qYP)MCJD5{Lf=J zXiXThHyG{YvHQ3%aOCUO$)0cKs4%Pgb#Mi`LX~|q^str_)+$U;>ulIuv?UOeP};H3 z@~yU>OQ(o5gMR>J$;Q~1-OVvfd$m>;P4ZwYB~1C|->9*^?P==@P;%9|#d=Vf#JiwZ zlga0vyJXFpp^(3zP)Ay&v=3BjMQp_kF$Tjm1i5{)*=nCS1UJPug5ran@h0_=F#nhU zmoIHheg$Z<>n1AfIV8<%jX_GupG(8^rtg79Xr%z@rrhGe=KEHj_ z9{nyl!db_{Z$p{GB`ugwKt>QkGK}^w@T0|P3lG17ZPMu5PLY&{aK}P<_g>SJ%y23D z0SZLuS4KfX?{9|%9#QT3?4IT5LP*)_?(~P|P3+=tXuQc?unwMOs(UJ`BD+`pTcQJf zM7dvxKisF#AADb(*D)_qz9vg1Ptd#I$VC%h{YhYL*HaB!1w8&vME%p<1VfUWhibx5 zF*dRZtEzdBB#qp2nR^VYN4=+4aUMWc(yksP4BQc;+*^okyh&)(8Sdh~D)$@f-!g^2rv+ebKM|ctWQQ%vy zzS6O+pGTQRl;yq{Ujb6bcgL;3_cVaLt)K9gs6J+p=T8E+xg65QDl#|Eh(f=9gg4u2 z9Xj(jB@ua5&l|Ei7cJ3Web}dCvy#*hC-~?^UxVZjFihkIS;x>f)w7?wj|9~Z^w;mv za168I<{GgCd}UqVbq}kV@dqn?;a~mjhl{~SQXFLr?6n9GUxyzqph`HRzQG2j>Q1DY z=4ZX{D-?FWph^gNhYark-$n&f zbrU!q<5T{g5M(FVu}uy4tH)ueie zp@Vh%ASBLSA!}bn6yo{Q?i&gdDWSI^<6zGtLpTI+bV)~i)s0_vjMWA9D>V3OYl+L0kfeez`&*@ddz*%VNOqiyJVOXB@t_lqV+ICEAxGrCQ z)B52u%lT_&Bfmd?FBSjOzR@>A(mN{7KX+KM2WD2xOQ^8@n_$@N9)ywW%LZi`_<)l}H1 z2EH;IPU~A#ZTR;2Gwju1CZ0WE+QkwUVjeXgj1XFqvLI1fj z0Fi&!aVeV?5DMC=&4%7BjXt}Oz2<0}-&*y2xwr!?sYhE1M0&GJ1735uPHJVJw=HeddzsS8?GCCWJ^?+gHj%Tb%4TiT|= zIx64A2fh*j5P<~AuV7295{jaVmxuagVeiSW3J~VOcSXY&nhbb&&iXKfq71S|H8GD> z0Wn0xYb79Q`i~J-Xf!>kKpyK$EjM=jY&@I))|z;^Nan{PUJAag25oEK9j=v^3ylNa zj9+ickM%UQkDc0F@z@fAO^b(o8I0&i8j)_j;na)f5+tc9-9iz@Y?pZ@{7HG*fHuqu5e5{zl1vu18~gk{-6Cd@r?2 zqw6A-w;5R3MKp;-xUkL~8nDi^3GjEa}3{1soik)uS(AlTBX zoo~aUh^LdAE4L#-$=nSu4>Wwm@xkCFNOlqW`!yvQ3B+4lIExYuc~9LFeV#@SkL?6{@EPqa^)oLK@- z9tw9*1J5Dt?_t5(4b!6^%S#AB-XfUqYCPJsnR=eh|)U;PtPZ<5eXlPpf%ju7&f z?cLa;Gn^B7?2*ognxX)|QsBIu;}kCz#}isZCC@P zo=VEM=W;bHH0c>d*-aso@?qP3g+X?{=?tpHPu&gU#)fp}3O9VR+LToW<<(DR9a79o z8>>h2S65Bc4ZE7Vsnz7m3fPK^$1}JS>P__erI;H7Ul@J_0dE2T*ChFGF=tSOS}Fh$ z+c0j{|BJczj%s>ew0&s_Erb?2B7_zK1QL1?10a82k|!gC9Q_jPaY9-#I@sLwzfEESMBj zA{;@wIZ3;uT)6xya>zn`5%(sSe|a!}OUr9feaUTTdUB>T(OI|mYH4OzhAIDj-Gw=l zUh+MzNW5?M2!jNWHf$vqGn)Hu#`uwEBfe^7_HkxJGk({x_Q~<@H1T?3nuQHU%`CA; zjQbnrvtGh*-M0v#4XkUN1}6u8sb=cPSfic}hp{3OM|GSmTF6yJv8D<+4SvbOmm$WM6X+tHeufnsqP?;jJ)0mh3 zj)gbg-r_W|E~=5L6WA|cS@|)S0rF9A-;^)kWFT+&)N!LV8IrmaYVN6fOOoZp;d;%+ zbbzwy!)YD^);{ISU2of9S2T-Z`Eu82WYfGfshgS(?u+n{D>KReHeLo9b!9148#SjE z=arO?e;sVlnk8IRj~_LQT8sZu`kfN1GstJdUbTDRQxW)4{#C5>bIiv_1`8o?^#Vi& zWK6jVyhc)ey~NDIyO%Js6ph)6*1Gk)Wht@_`I&dQHrcPt={l(*qic)4$3!%b1A&_1#8&LcPt1}hI%ISKB ztRrZ_qxrnA!zB%boaMvs#y7p3zbo8{!?aquvz!-%y>)-2MP>U&xT|s;CTzb*NU?P> zxiTWIU1E38XeDxw$n^u_aS6328$XIFzmCh*d|EK_BjC!;CDwwwQU= zcJL*)(+vE&bp3ZN>=SIK`ir@zl~E8XVijx9i>7ywiqrC~3X`j>RrMaCw@_h@tvNF~o&~6jZDQ7wDLS8=uXsnX zs+g-_oEbF4lYNZ1wnZKkK`kU@^hhwIw^n%hZb;=;$*T|h#(P(Fx1TO9*ybPXt%fJY z^<6I@8@go{(`F+4f-HE|FPY(!i{49wE9>{#-mZdHj}O@*le!{jU9T7twoPq>hqxZr za%s5LH&tQ+$hag-!ih_e|H?q&r5K z$sOF=W}w=R#1-HO-kF9i8HrQDd({j}Lu_{1vxs#bA4%T^(lOp#! zD#%9r){}J`)yEgyA`eEH%m%U0uyr_Ka5&0vurJ2rWDE_ei@lzbe0nqUUi|itp;_z1 z>vW7u2|}$uM`?ZmH432TetVo>uG>*Fg+a01`%}knldUO4?UX6Y^rpor1~q=rR*3Ph zsvhcy32h>1@+t;XHTsvt1jmhPyzXh~V3{sb4R*j!CUQ)p`jQJ(OngOEG$jYbeOdG=QCqb+ExCHB`%P-gr764n^6OVRF3Eqx1v*xWS>Tz_zvi3_x4 zSU5dj9EscV(s&zYV@nJB(i`&3aD?2S7ZoW9k%%=E&3o_3uim$`>kfT5K$An|d}Z^A z>&x2mZ zo7O3Cw@S$8nx!mP-e|-2CGF9Ds%9GBF`CLOn!|K^skBR*DYR2w_l5bz#)S}c!0&Wl zMPc3WkA@z5R#gdhZbRp%Lyscr%e3_L%{6M$`8PrJyJwAwpvEe<;U%kdRtlFgM|gTS zGrG|~D4Bth#d(iqc3G+?mL6?a*mH|PNF=uh54adEGiHRsmG9E2%~rXVO#LbqwfnYf zGnIsPl3WCNc^uC|%Mr}b%3tNPWFkWm)`m=#wCCsP9-=qY=}Jr%$woaiMATS(eW+Yj z8iRbK?u8lfDa?2&3qKM-dhbIaA%Zw3cs!JTMIZvFuO}|U4-upgK~W%}GU)~b-xYei zu9b=^YW)(`L%*cLOl-@#un?bU5j)oTx`@jUoa-Aja+cGXrrpw^F0Ul!u1bpP9AEdP z3)n0~ib=&o=}dl2u9NnWN@Pi|rKj|*s?3o_=#yeG^P&m#H?q$?0o?&@<5Ki*J*_dsnu?5TKcko%sR~{&XU%jbW`W8vOTjO>2h$_ zQGfZ}P}py+g`T?fIBD1Mjqfa|oN#4B3sJhCsxzxK#cf95{}4gCa-_WLymWg*c7Y<@ z{ARCN*k(&qtNLuX-CBm6h#1S!U;%1$$@3?dACFq#9s>1^Bk3|!=G?JCg?Wyyf|V(- ziGh=~YF_3t3hsk$y38Mlc$+DT4uV4|fDa}NW4hu~`OD&{aB>**A9&%n7rr0>oU4NO=Qs<&zb^>)9XfN7DaU|vsYhjJuJ%-251pG8?giP@rGqln)O3W562 z-^C1B%_|%Dm$JnVd+n5&&P=z;ZQswfmP7Y~9Jg0qrY{Lq2lPPxDK`Tt{l`1|fA|6a z)Uo(Kt~34Dz#0GWGyYr18Gl;_{>LxypEfl9(MtGxPXQ_YSJB}A7M}6fg7LpED*Wx5 zf8CsvzMJp$AP;_7h5y3F@4udl(D?r)JtOskp0UbBcwM3Vm_cD|o;unbde>q%sIQO3+e!@UzM5yxU0cM`zO1g_j{CQ11u< zC9F+DNZ|ABo#%REtKXBRa36rRg-@rbq^4M9TS0n`u8lqF`3n#=Z+$sx5@p{rP5>n@ zKLlLwx5LpFUbGBRo4APY3)W)1ThVZ}s?jS?_h zqTyC#sR&3IJ&@C{9b;v(IqdMW9l!us(XP+&0#7gTNKG}TDqu!Kjah1|$4!0?M8d|n zt{N$hA}6b(n4Mni9V@m1(t{D~1YECjAxwW*2-n!*@ZQp(+Zt|m+0bq$8wYhI(Ta^y6qaWLE zzbeW9LDn`EV%XTJSF#ogthZzOl60BLw^grJ_2t(uYLC_$=4dv&2*lX6Fb&$>5>fc$ z-#CczY;*!zzlm(vl9lc|kVkZc>HUzd)!2@__Cm+h=!jbE>$^Iz*d5Q^QNZ(NMf&hO z(I_T{b+(mRqIxkv-)$p~Tf3hjNrT_FT5^$6V~j!XXkIq16++Fip6t{p5(Dn#1G3+_ z-c;uMKVAkfq=2 zT(hnoq$aNSQmoW!v3rdcO-HUOoE^Je%P?agRP#ixt^)7O@!0_oqtsf$Z%U^p!KwS% zSw)BF1qvUnhzOvdhzixFD3*Qf(0{}>xQHKFkA+cbTem*U*lacJ6qBPi7=EHFMWwE3 z9SxHd9(#3}ZDszk>F}cuxYs%XC6Fi@VxB2F>pIt{6CdzUORLHxm|m~yrMjQMUO#Y! zf&S1_y+K5zrSXGOQG~0$yAotFYUwxEs(Z?1uE{m2?>J5PrSWsE5Wq!5f|cumM_J+! zCOT)wPMFq@+3u%!Oq9lK`sbLLhBZ8l?$TxNg^YCJyP6TAGV$Z#~>ET8EMWk{2hnHQeO{^sSD2?lP zMt!d2rqmSn?G8cWMFTwmtT8+1FRIHgLk;M*m|613d6%V7A-dYu^{ir*H-6?$uz^S& znO|GZPk}r8Wj4*O+oPt|eifB*KQ0#un8%iKU1P4VGpBlED!$4gIVgP6!2MKYQ$Nm< zt+H!2zK^r4CMKWp6hfI^Y-{-%QiBaem^!cA+nqZvUDxMjYSYF!!Y-DeWgC{NW}x%; z>&0av#Ep8#46aEAT{YWme^ozRY`98KGZap`qU0N2Ug~$3ZRxRGZk#D!D6EdLY-}uM z%CbyVwH>wrczb3-2jNE*+#r4%$yka_IFaiTy*KZO^R}1l&j*yCPnNd7X+0c&ml84= z5fSU&h!6T)fF`m|5qMV@M-t^gKe+MYOMQ!6Td_HJ$#MpYSw9CDJVUz13}qWuto`h% z(ei^)tPofyvIf(HLO*=a+fwQu8py%&8 zTrYUK`2$`_g~}ijSvnWUmG6Kh6zj-=w(Ru|N21veWlcq#%75RCB;8bzQ1=Q|i zi9C~20Yy-%GXAAS#Yi#;vT?Zk_=xu)yhu!AxA76v_krW^Do-!^ee^+27e zO(xQCcqeWRa1Qe;dp8SDVX4o3_&@-omh<)YuR6W!2*3Kd9M=xxqCCw&53BR6WHARH z(0F43Z&+-#U;fkaK|rdIAA1fb53P1Q-S zXV`p;v>bv`5M;J4sR~$${nG4TtH0mc2|dj6`|U>Xm-Nq`j~ZxSVJ|%?QR5bW%9f*Zo0P~-?H(g?6GfJ_qnpk?zRR6@eZdvAHlXc z$B)4DMXh9$N)#OZQs7hq;zGr4cZ!SCm2P_Ih@fSRJg}mw*pHW&8 z+f_dkJ;?R=h(@dXFuFrVbe2X?^(TD(P7jstnYypt`@v&GbO|DX<~c6JQ#f+~qfc}> zMkLcolu~FBH-P&USGDKWB^MnSb9|wr+3WZq?K&Fi2Z*piP)V#x3C`!EYF9K(yE{}W zii6rM>h|~&VXPaN?4Y(OOxw@bP?RpXu4+zI;;ZwMyw0RIL842%+aPR3Sr8?~7*wAU zPEiK5-s^9N2mR2iDM*R0Okl5zGRgQ9dmY5CkL~Z&>jsw5oz}V{N6$Lrw^$KE4+g1e zck54v9PfPQC;1DNCy?a)RwM?6FzbHay7JIz_Fh=`wHlb0fsL#$(@M`fhO%jwRJszM z;XOadUT@U#cK5!1=rZDbf8`MkkwnvzP8${v=!vCWAsiafl5O8xo>ERUVo&|V9bU(G zB%Uei#|LASsF^}Rp~O&6t*|<^-=R6vngpm}JD?ZytV)UTkpH>(Y2~NHx@wmCem|S! z`tT}==4mJHkDaZR_?lgZ1p}c7Ki;=^)e_nP=18y{9Y}zR_a1N$x~*v1_iHw3x)g29 z)9{=ZImFvA#jingIQUv*YJ)SCA5*>(LRi3GUk?Umf!2G_bU$7IyA4Qw!HwCAz+Zm- zOAScx^FFC2y+)gfSPSz~2T-Yt;K#wpXus$BNdnG6)}GGg1DKrMC>Xx$7Cd2BPkHRBiRy1Glnv{Xi>~U2E?HBa-;J5MBY=%9N7V?yN%sk@o74fW?!P*i*^w@~N)zSMuxU#gsDY2D=-+DrbbdC&9!Ek3 zB9`8;*OJ+ozSj3;N14>atHV*98!I_S7yNfs=l&~b4>}W*d|juy&{#54r!L_mgjHS44( zd0R>bbA-901$hygpY+nL0Agpzp(%FFbz&6SSz5J#Ax7Ulh@rnp8Iyyas)~^o`kGAi z-Do5UMdKJ$J*9PB^r3?3J* zZiAVG^f1>XGRUMV%^XHFenGR$!o18W6a{QEy!044)-A@`3+pE%( zceZ`q==(vEL*<8|1eq4StS$iAfB(XdMCeBau@yLJ{9lZpUHOc~Mb4(Uc3<8X|t_XHbw$ zx)|U`cBWLlR%Nt_qb@b&a)(nA)$)j-N9F62C1&>8>lh5g<*DNU*mcTncB(Y>vG)4A zn)>flX2F6o-uvT$5;Gw8rP!_YQ*6-$`)k>-)xq^TV@(!g%Xj1!4z)(-LplTQ***_e zbFb@imO?C1>r7aKcUZ$hFJKK;TbIYRMRLS@OVK2FtsARf8a0X3C^l;-W(FKzIPl!Hr3GYpQAOiPe6u+}N#}n?m=)Hc}s)Xi`=40oU5xtq{YU zvdz(anaI664}XTZ=3o`Z^?LTgN({oj&Z=c`&#twsMw5^^mv2=lN%RDWTW;olVKR@l zv*7F{H-$P+3Du4`dlDoh`g!Xy>^=PeFim9=tzVBzOYrXgPkJ@`z2m`|*D)CkJXGAB zGQsc?7_w*5h7h3+DzT=DU6U1&KHyJZJqlpTyBIJ;_MIf{y$liRFCc!Q=eqVVlLYkf za#6CDJ&=h~x|tI_m(%;hl99^Nll9hFD|A&dpMu3#5_GLJ`*8Y$9S3)!#)eK-L%xPI z6mDc5+~T_7XT~*RXC^>F!<>WpOwam4HquOj=p2W~5cm46EsQme;UIbGdqy$N#94-m zk342MLkHXRwQCFFPABtsPEMkOrw6SXvvjkYUwzH=bcqB&krY24j0GG<`?>Dq3q?O@ z%L9N@n?R*`PSHIEhaL1xPyFR6ln*!W9KLjrLD{VtS0IS$Ug@{e3o9_68J?+wd-)Hd zZ!x-7`lpEUO~5_e$P1M2Vb_}}U%knId0-EPO`<%q4?if-1TyU@p4P8OG?N9TJW@VX zW$1ZJ+LOB%ROC_@0Djmn#eZPbpQAPM9qctvFlw@@vC*X@-7TJKH;1`ZM$lYOZ= zFP&&a1$rTj2wSBAi=M-DzC6}UK8Rqm)r=A?juM-}P>~JU@kh}@lj&9=u$8oyRXQ3p zk>+j?U?rWFhz5tPgNdX3Vd*qsXfg^KnhpX!82%EQ`HAne4M}hcJ94+ki!twg-|)qq{M@aLAD}%_iI)4m6@>O2kx%n zJ-~ZDE-V4A2ToC!vSkL##tw9%S^@_k)YNx=<3a!P{dT1Ezr$@@us;HBx|q5JU7$*& z@EENN)QMYY5dVL(Mfmsh(;p7uKkUMb*Z(qS7b*QmdFj9G7GA)9{}-wW@*=JE*Ovlr z`f1z@z4&`5$|0mL2*Psm2ze#cMWIX%C67>&NAfGk$RT8;6)t*Lf6!RWJc50kFG$0G zC93{?{OQkY{;zJKJWA&O{rD5JMqx6IEd(?Gof#(DYbH&51lcGy`O0&~)0P}%@q56a z(}OO`ZB$WWJn^&}CZ!(Uau925F;X4+^ahEJ&MiF`A8$|#+AcxeR!r0toRy5Wsc1=8 zuLso%z%Q*OLKT<{LoG@V*E0x=3m;FYY;m>EuZ@*-{-ZM` zI89M@E|8u504BQ<4ctW&w;Ul{SXtAwxnxN$Fj8CH05dbX4F*y~GJyPGC@!#Fl@wp! z6xa3u@Yf-6LX*n}OZ{6Iapo=i*Yn5Z&DSFOB$MwJ4S;-YTThdcA*^Id($d3c!1#oU zJth6S&?5>{{lfEK!mH%8-@8O*l@_kucN#78*PJ;^P-Y+wMO34+5~vKtTJhF_82(Ez+Ni^ zUN7r{6*G`=)`HFQDWeOE=VfP|+Nb5`3>TLaX7|uXwZL78v+u@;wbL#MX-S2vicUK2 zP3CJ1>Q-HlghQ@&b*%Ttq&4r!C;*c!n@Kd=-TE#Szx%l!iXRf5yF|0;g}ZeG-^)2^ zO>NYFZP4i9$!a)Dse6SSNA~V3i7ki$BOzV$3Ivp%<&F>%=<(4SsvS0l4ETFr<7|Go zeuE+0xW|iol2cscG4SY8;%>($=b}}W)fLC2XvEp%ZZsuH&$qqWv5$5}^8vaT=0x-! zpj$I^vXXR)zHK!F{^d}sM*_Obm~(ko)moUx&gHr}xvcPRj17B3^bdX_S{T;US`Kid zYtJa&;MK0mY3v3CaK<3lH-hbx#zGzo`JlqZf$)UG`XnbE*NP?2cP48cr;pT5DsC`r za}f-m{P^xSZb@6C!Q_+MXpGZj>w4XRx&EN>*%>5CTQUF66vl^banA9xnKg$NbM~d_ z!H>l<35Gk9yYCbG7<`12au+gX=Wt1lWq}j3^06^YNz)uER>Dg&E(#H0jg#b9izfYj zdD4b=wSyOTjq;@RgRVQLnbJw5dxC{-+~4byRYE37zgMk!%*vb06G)S@VY1>ku=eos zc96q&UI1-L3njBu@eRRl%)-ZBd~JC4sP6A&Q28s&S_x+iL}@L-!xQEmK*yN06lX>Nsr1nf$3&q?4V ze5Swmp?~9xXA-yGH>rd(rPV!ewkUT=g@HbIGnTHioA-q}C8zzAs+{)d%628c7q6Su z?{-SB{&ZSm-|bnS#cIj~L`mVpuyUzv&`X>Um1(2*?xm-sv-dTsVW~e#A1TI2X{Iwq zv-A`_VI3TuRI$82aHU_5^*!_SSd(V#Dmh9qZ#PX5CP3CBBt3MM9n>aplYc`1yA~A3 zGsZ1eU0a=9b~MG_sisKXGXMi9PfY5BDynB98;e1$Mqc_xrTq1yD*^8+gtDwNXx)w6 zP`s0&azN?_;hJp+n}*@>xEn~>K8{WwX4z7Ek9afI;yWifud(VkiOK}c5n=TV$|oL3 zu{qAgb;dBcTy24a0tmM;UJQHnb1v0oGT&Pp?O9ivPz8;>b+l7@`BxffX#~W4Lu|Q$ zIO_YIoK@}R;Gbs7G}s!U(>R=$=Vpu>p|-KF(T4HGdvM`w%gggMTF?CL3c2t};;4l! zn;nuatm6HvZ+SmhO7*X>@pYPIXWP6OwRNLKcd_@28bbC2>oP9Z!pfItZkS&&g>iSy zqZWr_-%91+X{uk}y@Y&+AzmdC1=)eEcds{gT!V4n7hC#f*%wVH{ai6$%S|eePo%bO zZq6vhl9}(dOXq>Zd6@L5IaY6%(+KFmqgI;e6V}b08XP>yh+aBHwynN_HkoG1a;lF8 z?gK^O+1-Gu3CBwZmcli>GGEvv4<70AhrK)2q9w(-PrL&>BivL`siFwaZIW0I34~Bh zS{Z({u1PxSBXC{3zjjV(WP6cU!bxMNIZpk|^O9^%QM5Y_!EtZr6xG&L6Xo6bRfz$d zA{Ik@s8b5f{PO4>veJqt1ufT3-L&h-GZv+@{;+5N-1~7+u!3`=Y-dT-uSuP}xbeeV z@qkOOaTEby{qAht!tgpj3-T!_fZrrVFPT4? z-&x8DAn>qNn>Fk2MbM5cs(s7HVl=j7YMl^$z<2t5{e?9f6P4tACQ*}t;F{FLXX>Z( zE|AFC7cXA|gk(!HW;e>jYzXCTdL#5D-K*G*peUcYU8VZYi!E~6DjqW#X$BzI_3$3v4Wdh4 zx5Q^xUI_jgivR{wrwd=^qWC~wPNr7v3@~hMweg?-Y#P9O+#K9G&-U&I`iziQ^=isv ze$gAp@H45hYi#f#5B_?mzg1Io=R0nnFN(YsXHS2*-j!gB8qUm3vb@XSl=H<>Et;gh zwCk{_-mL_eHx8cPG%48{xMguqt>Y2e)%>i~m2~P)X}y+eYEX%#%d)r69{p->_cCSE z-ZEGMH|E9!1wJi@He0+20K+uQNcV|-=0cTjA7$xpD_na#nTO|`>eaR$6dxF(c!kMU zh?7v0qj=o*=^w}oRK}<?J5;sPQ zS`zWoXzyF2g@yrCkXr76c8ygd|yn4`^B>7OA8hSns=Y^%sq-TYB%VabNsVvo6_y5iy)`7*Yu}k*Ebl%A>lw#C$>h1>Tdiv z0w^DuiZAyeR0(*6;+BHgt(# zg%%51iQRugx13k1s9HX#eDlY{svErV1o-Fu-SGg^3ZSmYqIy}=dp~pjoxE7VUB!cd zk~&ZfhN!c}u7XVxEb9F_bw>@H{T*usm-5z!!%tn(bp{`#PaHil!89D`3Z*y`i&9Uc zbBq%V0aQItH1fVpnMj}rNUf4tcm8ln51-ojJKjvMFXqb85uIdDI(54{OZ*b4(Q_i{ zW8#%!j&^!PZ|x)$9Xg(NwpJX(>kNX*cy~UUp(zE^h?R!G`O6OZm+NjWH5!|XX=9Y> zCnZ*i1lR3lP{nH?Q}8B-1Z@w05_(j3e4Ze?nT`(CeTUW%@~3lF^RSr0rh@uK{1{xH zyUbo4%w?n?EexdItZ$I5rShN3J}`Bh*(ghSinHcl0tv>xLXo`_A%R59GFS|&2MLeY ze(lfURO&bxqAeO?4gG62EwQO?xGN~3s5k2$5k7? zH`m7%8xWurO6Kunm6cEAlq+R;D#hY@HRMys$adMGbVYCPwhQDC@j#8iclb+DLvod3 zWmMS=DqGW}LNf}jv3fju7OM*`lZB~AZ~K@3Y8a#VVHgA>8*Yr0SM)zSSxm1LdJ8eO(@c@7Z^Q|fKzoH_INpZuutns4wk zq!wRKF@bi^<=N=arUpJV-alA_fSH$njX2|J<8U;$1O*L;_lKS8ZRFNU?o{~R(hhMz z2xwKVoTLdo6eP|#uNK6^zZeKD(iXk=0)(>^0A*N$GuWN9ojZLVIaB%bu6Zx%$Is7{ zxsLhM(m(hpy8N9{ij_@MHU5X9v0XI$tIC%?aD_wLK>@h*PyV3 zU)@u@?!CpT^FVoVSxM5`JZIJuHQ`dyMfoG< z+u&PvY?DO;3o17=>qL26JL?z~uAEdjnU8N8QewhyMPSJT~>*y9_)D%mz<%GJ;q zR|_(U888LHO39X0fFy>#)BAK560%wvCz(O|7i)BxJtsvTeN~}zI1P8Z<*j(Vllv%& z069q{k}b)&+)?q%C2>s$!IQ^^zM-Xbg)&v$wGEEXb#xJM>tXVpFDRT|FsvS4<+s0z&Ss=|wUophtOuY`Zs1SAIn%K+KigudDTFN@JpV zjK%BoVI}cNd8llDA@jUjY$fhRB5=)AhK;8pVp2SUEe>(lKm(4?JdAzoH)sQ--+10k5n(uT9hE374(x|?lcAL>h&g$m2Q+>Fz)xT8oVa?Z|!FXPV?`Q@BgZZ!^hk^SVw zK2&~o4av~2@TG{j;dE^?f$n6~)W=6QTHbb)IHS2;VKC|CakPmgZmh*yp48iDH0f*_ z8f{Rl`RW;A<*%$3-*stOK7d_8kJ}DpL^L>rTcKT?6|cu|_A&PQK>4LGS6yFKDL}&& zzqn3s$XjEb%@26JR>~}d{mi2HB>`J%pH(-pOsiOZuMj5m(5dw>mEI>K=(h3-Ypy#k zpn=Z0dXm$-w9!Lf&D8N$L~H7Mw`*~&iqo}_Y4f3YEA|@yL+{d|m?@;DqnEAwkB1Sj zqeBM?fUgFJT8q7H&WnL`8{BI*OZj#Xo;QL348Q!NQ!TZpjb8Imi}(P7X&y_$v?*E> zN;GcY))3H8qyqlR%FP8n&E$Z__ZfM#gU+BO<JF>>pvq2g>g+i{G$G0uud#lea=(zV4I| z`w^z`+AjAz+DhZ2xJCcm3rA3XYN+>cV5`Eni1MK=O5CR$Xi=-yjkK?l0Vxu-Hjz@J z{vN~&UyC^9qCD@}IL0OrGTZO!*6f_{TBZ4S;_Xk4!ivOdi|km6DUXnp%#(oRD8>3K zL{ILQO#2VvVr6j~c3da^*QvUd#cT40O2S4;xyOjnCjbzUOf$!Yx?bSslS`MAP z|0Mk(^gD+Z42fmcgjauaAcJ zKAOEMdvPDt8>CMo0Hkg*NTqX3rTwqt*B)cKH9&jr)&~VdRC| z_z$b_@7X=1`~?;HKU+rp*Ry*O|BczbHyRKote`;iy&|!}EFDF?DT*J|TyKX({ zWyUjK_n1 zs;iG(5d2BShSHrzMWdUthcqtaNr^q)gGp;LopVW_SkjN$>P-!QS4*Ls-tLxE6=JXJ zyZa*Cqmhd5~*F>m!|` z>tANKK$3-H#buq!_s@Be?M!ZY-QZ##Tlbs%o2aRCU?_6=rPhRv+x}ijH=^3nyPxiE z$m^Qgymz7F)bxl?mL>^=*)M?VD9Y#!fqJ_%Ma!)1)52t-Hm9+#R1(is$HHdMNVLVs zE|tQ^?gR7s{SA7`X^)&gH66HyeUf;ZZ+I-F+KKEJ6sGl`+Fb`QjrcEolCp>8lH1NG$ql+tyi*_ z-@09mzZRVU`{8kF=1Z>f`(i4h(2h^ZTTXXid*2% z>sbAr8IH^|2lKl$8q-L2^r1%^6U!BV@Qh%U2m8B~;w4u`{}^G*-TK)Ir5L@}BdV55 z4DavE-Hu{D=U9Lp=i==2M#7&x)TW8EIfQv?Ar&f7OFQ!&b!L*ZQP=^d3Qa%PE1s2t z8qFA9uGvJ3c*tSd(78u)yd08tWl&M@tmN$r>RVXp-PU>!hFCqAUZNxM51`26_s_Au zhwtmSs6MN^s^2!=e^hq;pdqJYfM%9kSEsza^F>W^9Kex_GT_dy(L)Iplgy*bTsV8M z>ut-F;Pft9DgJjblZ&ui>c}@9$>ASmZea~dqo&+}w;;ed|(mkC)6P1da zE$i&!aJ`!PV`yxjg5J2bTa}QqA;2cl_dMH?nPR_eMz&)d+jkVftlLd}Htrz#mXOYVh3A{QSD6|*dt_r@ zzy5Jek-sQT&5|sRS6WOpu}z_3_3Sp&>Wyn92F-lHrfa$LfSXb_bx#KqP+1qj$HdW) zm#>LVZ>!=e5Paz!x$FxI$3+gGn15z{W7Kyl?l6#=nbC~i!tHonsM%jRoo)9SHpx{2 z(vX7v8`1?JSCdFtv2n53%Ve3YNFDNKHl^YBY*WVbb_b=|MS(@7@9rG~Yc}+89ZFYV zHzb?JN0-~z9^c4+TNKPe`$pZFnJ%TzUds=+a7potBhC%>V0!b?sItTN(v9S@8+Y>h zYZIOs>)#41_);SudPFrr+7GkT{K&<4KC{Q%?=6@QJ`C9%?W(E{sXbqSCMC6wGUqF(1=VP zS`!RCeiEn>&nDVaMJ_$+1W5)!!dr>Uo{%Kc;2oXGVVFp~R#9YVS$+_N>*li~+W2$n z-b;pAbeSb+NzMd7Mut4&&1QExwqT$?A1!fs<&S_e%^MN zt&-zT{BWiFlkY1u%0Y&bS^dp%6o68YjSTF4C-3*?k$xszQu;aWy{P#7`HKYz7do}nj_&kY-Sf=>Y5@#g`}4zl zRFI*1lU4}I3-3KlAC8IW0Myz_b6xyn8;b!^#dPc>&D0|VKzzRu0t#qqY13mNu9Oh; zc_%xx6Pnn|8gH)CRrKn}igC1lj%TLR9GUjztVXO!@`kHpj5V;nnRdJ3rpN9H)00O* zoEn)LVbaNsO}oFO8;MKOb4LN+Q3l~10w!ZlnazM`N>_SD&2V%dK)YCo;W9v$A1{lW z=Dj0tVd~-sVa%4jY_iC_2PxGG-ncLK6m%)t42ax2p-vQZ?e8-1-%YKTj=VBhmMG}s z&SlZ!TGNV4*Ky}`klXv_K3abmP&VE&E?^9(PmmbbRPS+Y>>y#Kc-4;DGms>f)sOZz zbRH{8dcJJN*KspHL)#~IH8Odx#%ts$C%w$Memj~{o^RMy{J;XjDDB`_LNePw+%XCw z&~o9yoKEV~4Z_S=tgN@qsR<<0leq~p$*u5qapPwiP<{Nag+bQ6O6R^8MH{Z~@%MY% zUR8O#5A>01erfiu9`HF-mkqbkZufO!arj!pM@=PQVClyuyZoPVH&(;5K@j9J*i)XG z>A~+czB-$$e|tzwWQ(U3|DuiM>LP>z&MjCw;I)7 zNVcZFapiY10J*%(BAqo>*U%v0jb8}Ns7ZLGL9&=x8#UU>M7>ZYO?QM5V^y*C>T`U0 z=`pWz`M6z)m>#0xTN9R*{q3qygk3b$QjeM#=BDq0@SiY4mWHLL-s=nxxIagv#fpsQ zrh*GcT}GtsIeLk3ZEdB=*0%WbvCKyGFP=22eg_$SL8|713|}N;#?0-4S?>zddR0N;d0fEZm9-G3|Jn2$C28VKq{2%C;4sX)YOGc~Wgt0{xT6d-^n><#M{(&q^=D?CH%dMSzq8o*ARk= z+`&wwWkI3T{6QwTwn$nr;RbZPZ(6q95Ln;AB?jw$&atr{`>^*6H@05$HuEt1q}g71 zUYb6<&l(SOab8B9lfg!w8y1Hn+{l!FiLPFAr{AhiHS4kp~6i9U2}v zPd+q7bNSETgS7cI%DLhrA{sHQZ5Rx%tsDH-!E79zWx%0b{I1V(CEv(Hbaaminc!79G}FLZN@P~n{RK;o2#lnKT& zBOQE;Rf|b4nvID?8wpvf=ZH!LlUmrlI=#%Rp^k-e55=A|(N`dWm0{ha!98*d%3BUv zx9l}DS-wr*GYUQY`5QGW)z<2V^Ip`Y2~O$PaI@Zu)bDP#H+Gl9PJY-8dFV>Kx*HVZ zq>R$0eyO(@sFiPn|9?<<|K}Xn|Lg+&dzJV1NY;N#3hPh7_FtD#sQ(zlLj7woEZM)q zu>ZZt`}3Ori;R+$x!_&>XJypCZv6EAoAHC6x08v}fevU0G1*8z1_=Rl&tNSufpi*S za-C_s8T2(4AfVIaF2_j+%%15X+WYV%OZ1O{}FJqK*Sp>Hd7*{UEG< zy%C`$H=@};e3btXwr(8J%M`6(N3yFj>rSc}DAZZTOSU9M15hJ|GhQPcxTq>6PJcRr zspJgz{8z$X4v=Aosme5cB-nr@2@u)q>8GB!?Tmas|1ImzxJetDKfnFW;uZzZG6#cJ zpYgaurPAZ1>+=*y@NiLA@?69jHF<@{d8bj25sXP3C8SM@cN zHS48~g;YLZLO7rHoCJL3X6LeDX@=^^ zzY1a~9)y)2{gCR(F(~70@>U_tl)!Dk@E!H%T>AHETyIE*c-7fbpLAN7%`1lar*<-R zEJ1JxZtu=dA^l=Z2s`-q&{H{?l+k~y-#fQTL-{3 zGjGW zHrhTA_vt&S1Z@-wNe6;07C!G)y%nTxaPeDFP7Z&-J{!#|O6^UeM-6isg?sIB^?k1Q z!-;bRVl=iq5si6tn$-1U&HvgE? z(bLeW^rZbbwm(CB1GT-#)yc8Ur>@(0JFI_{wcbeZXyB&gv?%Z6pIg@(v;vI5plAwngO<M);9|nQOBysT*>Psl5T~_!QqNkLY>asgS-oOl87fN9E)BwA2 z(E-;(c`~NGz}&b5VQRU$rx^>=c@2!vKj6B~GEy{XMNzFE+yxp>B84Aa@iG|SAIqM+ zl|p`cGbY>SNv`i}5&ySR{KGsGLXbD{WQH`+4GrT9vF~{P2XpTo)nuQr>mra4Ac>TS zG?h*WA%xI7B=nlln{-0QNL5rs2)$Pk5$V#qhzLsWy(lOk(mRM?!M1tdnLTCg`OY_I z_Bng)zX{=avQ`$!^}Db8o?c8<+x;Yc%*C8umumyQ!|;;7iH?$&F{n5jW~eEU(xG=P zWbKrJaw^$@-r+%P@yv)I71%O0r9O!ubVc@?l>-wd@Oo(bP$6c!dc~2=#IG0L#XkqM zC)6ADb9M?Fy>$&|E{&~TR2aW-_Q49LD&uxxsK&UZZLwQgF5z}fnZ08j?%{wwlKc9D zY`!NrL_Q4@;(iZ<^Zp#=oa8X|oF;pv1Ji8{_1=L@;a>dD8Ff1V^aty}eRsmVzNyYh zs4NHFg-bi(Jb;G&rwZN57LHaZ@!`p~{@@SB=WyMwJ%JpAElCA{Gl3c6-R&T|69{$k4y_@f8jQS(%=EPAj*B%SCxeFa`{knZ zV_nq6(mNgm-g5_u0PjNUuO`Q^<7sb-JWu|#|sU#)eZy7V9paa3ClyBazYkbbAQ zrKy}^kW&xiQe#;D3n*oO&+!t;y!ZP2j5Pyi`QW39On&aym2@5!My*!b&M@<>t#BdL z2imhBSzffW%c1eoou$zs(^6M=DBA#y;LMI_+~OPJURhM}C~C~;dmOA@nCKSC+EP1~ zVa)2?ybW9(-pP9H6= zwD|LzdQ;{)@zK;w4@2(ZPZw2svM{{$J8FbXlgHPl<&3~ub~#^VXlOIz%Q5f7bR{oG z`$w!y?$8$<%l8-(oSQ4Cgl}f?h!^|SbBzrA}?d8qpRBu66)pQ3qbS!%AY==nRsKTkhRLrPv= zV8jCzRM@U<0IZEC2ZX!31Xj0R4vjdvmEP|5eNzB=V41sP^RDCZK}nY#b9gxMUf`G|#e&ppWyqF395+6D7v0u##& z5#eP;#@6(&Q#P7pUo8fLt$xLuO$s7@2qyXuq0mv?Kv(qJ($P3jrwz!WQwSROq}x7v zi^6T(FCwoww#mT_@5Y0~ue1|%7spn%2UOOr5hmzCIUKL^H|Ojjr&(@dG&g1LYuaFL zgIDLmf_cLf_<)XCSiMZIUj*VWl;`C%PdcDFJQ7Fk=L)jt&(bX?VVt*PcM!<-$Rm8| zk+V*D@!;%Ga!&8?{bhK10s6k9jieitg5|HDu zq)BhJqC}<-2s%T3M>R3ENk}0xl_Jw>Ee-lJs%G-XK1DTO?L2l~TV>m(D!3N4zwQab z=?6>E`2&}Edbe8o%fnR1rJ@a2H5})C&mYDJj)J4f(CDV$IDwQ}H;-g5udbIoLUAM$gZaU`YK-I6{W_; zlgKioWT>mHE4W~@_neS#kf0a!tJDa=!JJB+673;|zDfIeDg_M&wddnH1lM{&lF_xL zx0)`wki5l6UKE+iMv4j9T&!TZrv(wYHp^Mzesyl zFBZnaodF*HX_{YVLd@ z^0B*Dt5Z8ME6LeJatIXU*6FA9@La)mM5QGaiQ!k$X3W}ByR4$7#=C(CUSJS{2<80?P?R+_C`QnB<%{{ zPD~DOSMoitAB0|}<%w%(I+|WI^cRdu*|3xyuPLqNn6%SmzM*WPSO@* z-zmseLL@${?lT%rkJd3TJwaP; z`HpT6u-9OJ+>EA#s5y3{ZriUOxoD1_#lQIWcooPP)RVg$CZ%;;gKzcyPv8fbk5(Bj z!S7DcG0qAGfZ6cUBM7t7A}`7)uq%ATO>!2bXFsRDC!q#0(Rm`n-sc z&>`|`cJtBKYJNql1I>I4TIs%<%2Y3xGux$fg#`Jtc?-75^dUIPmC&?Pl9#80nT%0U z(H%2K>ALrqC~G|>LJ8rFT2D(}n7?y_wu>CA-*tQmp8U>C&n4Qvkkq~wNtbOEIu%8( zO?U3?=~heTl{K_LV)}UW&IHKN&Jt9%JnP#R)h|VbU+J@!uc@T^$m|(AMi}^R3u}8o z9rtsdwRpYhxhE(`k;!2FHd{L6E~e{BMuZJPh(Y)(|;Uzdgb18S1xlK7vG{d)}Q z4-@eJQv~(rS>fMqFCHG^(`J6b0i3>rCtIN#Y>ZSGPb|T#9%q; z=p0kG@EO$M8XxfeB)AI$M?BC8UWtwo$cYDz4{RdRrC}Km^Dy-C7sx|!6y=BHPChP{ z_?|98^rB`I0IQR=Kv)F9Q3gkB$h=<3+hJf=UdBXg)6yJ+$mWro)J3L(EcLQ7$jkD) zFE{h4ZrlFS@9w(@;B2dYFIILD+(%_`VBOKVYuGQ)rA=NJSxJj1ak|-WWyO*+CMaHP z)Qw4~DA;}be6Jn02C9bGU7FOa|jXENzuw?c~IfRL|j`7YJyUC;7Kb)R#vkIoU4#TPC7&~3fOAPlqx z{Lt^)IgIuT%+(t&mSyYl!yguoQLzp&_ZgdVvPIsjqHZ?6hzu<(P1@c;)F7We5(esz zdvF3XbNr(t5BS)pUz}60e>`(PNlR`v|2{2bTB|%(|B5xN^Bsdc^RN7E^9;>6&Ht>+!;S>W4;usYjs z_4^Gg|F6*nnTQ%tS4V0Z*8+|>SuP}*uwk>f1^LRR8%V|MAXc7{!I!fx&}@ zT>A_`Jn9t5hJb)5vyYCdpmEnt)34#aTf;xy~ z2ndUYZp$c)6nX z-Pon$Cfju{&Rl7p_c4=G0o){5NoQ(PY?)d-K%G&IVKORPcM9#o*dRzYzmU$ReXl&B zy(Dju1Lu{hA5&)0&2r=IL?M5)a4sFM$>DHOoGntb&Z_%@DObv!ivZf*^C)vQO+M9@ zYpKX?oaQ-J8(ufkK5en|151$s@B;RzW1!Y(npxLP4bXw+1_<2+8=P9u0DijXI{G*| z3=)Of$Jqo!^MPz!{?UhwbxrOKX#N-ZW&tcDDjK-wR-3ZlDnoLC@hwQX{2*3jm|faA z@WQ?LN67+=*7q<3x(~c!?`>JIK%z_6*odYP@VlW2JY*2z93} zEs0$;BkWzmQ>$@Slbc=nOp~HO>KXW%*-L`ydhVtZ-(ShZ&#nB#Kj!&R>2Q zd%j+_4YXsI?dP9xq2(5fs{_S7+)h++@BF-D43pJDIo>TIX`VFT$p!LsG71PbjbeX! zuK`k$#`(aw+o-}u72n~P%6D8T-!iaZz$vAKcrm?3h`c1nqaYT8F zJreuo)HXttUyGYzhr%w$CHnpkwy~Yy$0JCuuo{!X^yCkcP7C50@B2&Sh z>%Y~=v!-f*8;yzf9B~^L&cN;!N~+gcXZBUr${5?3IxK$Rmr|W>F)gxtgkGp zVzSpd;9|hvje#lzrW{o;chjwRrZOftUF%q+Nkb-rE<0SGeZ2D5Z3B0ShZl{mTk*4C zQ(;=|`HT)cfw4v03}xQ6b@>f-ozWd$d8ZuD<-4v6oj$vz4|tF)>z$Az;cUGbVZJwT z*Rx(hJ??&m;N*o^8SPZQ`+Fu63**=p+CX#Gf*i+2ZD>7Zje1ZU&@RV6+|8T`*S`=I zsL_|4d<#`PPP%`>_W>)Ma-W?QVRb?A1nREBTAjDrl)|kIzV$JH=eD?bjTzi<=b`&f zt(9r&Jx-$@P=%sY$-)G{>+1cV$FNMYjYaj(nWSH>!@%>xY_5bksTCdUNS>p@i>^eQmu0myVpnqn>t&GMteR9ZwLy z)_$5Df96;Fiza9f($NXuutF0{PP83jkt2bJPd{oMC`9G%{6Nj>cgIa(`B8`p9Fz}z z(nZ&Yq9eBk2)lK3q?VpZqRh>e#}!wmKh~J0ikpH);1^sgv)g_sBHmRSUfuB8ByLLS zlH$6KLoCSHQ0=l$3O$sGcEj$?iZY8bh2rO{hPPim5d!f|aY}}EsIDoa3MHS zB9UOX=O2Q7uj`fkmbK6OUWR2M@t_iUYqC5JU~NS_^n4a^<$3YDh&g_ZM>RLkInQc% z%oi75zK#}HTu}%~x<ucR zA%jl>eB4{bo4Oom3;-Dtr}?Pt<(&hUx`{%aqX?eS9P+BZR{JZ4NE}0mq33S^7v8Og z=uBCeuSO*9F^uyO%g17C)W8b`Y74t8ABl9|ol<|7_wxv^*KD`sXeSQGB>=F?kJpvT z$gg92Uc$*?h7@m?x~Gdt$5S!6s_x0o6TpzD)qWj`lTZ?hYm%tjS?H`x$@lSG1Qi|M zVV*(aRbuk8YqgnL=H#G6lebhpff*1T4vu>P?s`eW@`#U`Z6G`%;)ah0eA@Vrcw%DP z`ixm1sguQKxtpt3b?9>T_IghxOr`VN859Io_%)m|ItOK%JhfHvf1Tz_yoVT z!(~kY6WqW?JEjZuhY2~yzsrkFU0S{CdI;>9rlm!ts`OWl*cVJJmQtSXP|@)m2=E#i z7!@(y^tEVoHKIFm4tCwv(P-7aMslsl3K05D`2LnVh{>*dMDt*=5vuv;RGkOrWRN<=EKmjhOA&&2d_<4v8xric=~g z0tGkL-)*#qjC6pf( zI7+q&2^cdi8tSumXcbD+gVOscR3oxUbT!nin#;M)NJ9K5o-$g^cyweZzM3d;uawzD z3-wlD)GHdQfbB7j>@gZxZ9egG?p3BK2{A7Fl_$`jSUqPU{K&joMaO#%SNSp}9ml_> z0EvIy-Ej8xc-fhb$z^SMvhQoOh`_`qEI%Re=D^$6fC))R!zB^QJo2g`)!bEapBb;E zQD?b+-1gK3YcWve<2r5ak633@cEZ8!V2VlNN23D1!xyHNlYyYAj8wb5_cRR%guaN~ zgoNQ?F_YMynAP<}K>~sK54Pm%6 zAJ>^YuwcL{6A3d$>@Qz-#e8S3F)N?^yo z>GrY4B<8EL>u+8Fb}J!}K%Jsr;?6JI#+Vk7>^a0f6d9og;tJD^{-7&*$-Q5wt5o0U z9wq!`yx@B5lX3mgeQcrL0R;?J*2&u{+G)1n|ZdhT-ntBOJ(|vrN30BXY0D`>w*l{9GUMJm~b0H z1$lGrl2^GCb2o6d+kz26s}NnLG(V!`g|o{G(b#13a4bIV-!1 zKtsemYA7P>f8ks>000sFO<3O9;sD)4FLbqA*zh&FY8lV*pH=TK!c9HH zV}Z1H??$rR=nswTybGYL1Z$V8U$|*ii99IQm86+GMEfgV#_<)|RXU2BhUTjg^`?iny)U(ELeDgW^$zXY>mlF_ z>FDrF#A+55!*q8{o`B=R?s^8W$~{loU%f5eCWU_xjv ziND~Jf96B~ZE4im!)3Vs5+DDAyNIga@Ygi|2{VQTiW|?b@Q0N{PnZs`G2IWN&H#df2O?s)7Aa)oPWK#{}}+6kP!d(3#9(H zlS@&Q|F%c&K{OmsTqGm9YKXS<*ZGj2T90{ zdyXF{CBe`vFABl5Q~+qjI%fQXRdP(maSXEJ`HE7!i+A%;#95o@ zZUjRzflhqfpZNV{Eb|C`o53zL~vyr$q|56J`OWfJFn1<@2Ki zg%&>NfeJt+jY}TtRpIxvx!e*zloBtWZE>&jpAG#buUU%ElzOyuCa+61HFS{%F!>Bk z6_gR@oG$Mt9>6EGkYh5gay8`YGXN$bGw1Pe#W>{}1FP|a z1_a54!0lVSb8BmI(Ep?5(a{!n?NFi$+tX?1eM}Nq%67V8&Zz|x@6&G8(yow2u#{Es z!!%ca%TA71A7kQSpX;yB@QPC6fh87x05+vsyDJ5=%CV=mKEL*c7sPf8ndLfOpi2d8 zdEr^RAfHw zjv{nzeu$S5b5E*Wf2QjJe(=E?HgU^V!qo4-M!zIn+$? z`5*MK5gmP14aMPyi&TH33(f^mW-tDX^^3uI<~a(ji#p0#!T=R(UCy( z^UoHLb7?FZi6Nq8ECSB&xIfJFY~uxx8qatyrrNjt6|%+fQt{V z*baSo(p!37qD0L}WF*r*a%t%ju3*(xpqZ~USjRfAu*In7d4i_%ylYYR*(ONOjP&On z%6NsbY+qTGd{a3G4pY38W~4w9%l1`IN1t+LqdFQy=*ISBx8wB|{SmIE-7F`sEJ>pD zL!o3&@T2GmkR{_lUP!YvvUg_^@PM!VQkY2&h(FDmq-S&D6T;^6NlU? z5tPz{hZ3`V0Xh1a!Lt~EGDC-F6}WunYIo!Qo*s{jv8fyTgAH(D)zd1Vz~Dq#IB;j! zco+ED|BY&>k7ufQ;`6{WIMZY3Eix=CUaRwY}DI|1tU5 zA!qYq`2v8;W;J`ZYstW++Fpg0f)@gtmt^PlB;8IY3QkkHXgAt6$ontw_%N<=Xxm8< zTXxYL_v846w$EOx(t&OEd|lq+9Yvp)KB00{WA4k9y=S^Cmvb7I2&}%SNN;=CnV8nH ziULdz2$J3>R%HVNYLciOkt~bZ)|a}}`#7CupTt{zuSgyaQ{j8D7&vr-dAQ2t*ltwc zZQC00v^pK5Y%yp=OC`lSY8z&d?r^S4>|OF}W$7{5-lm4COkq5yoVlQuXVPB5<5a0d ztGUweP+sN-jB{=Jcj$Q?zZZ$l#ExvSTJ7*PzD_o;cT;&TYq8CE302nw)}$8Z^)LES z{T#%>zEn-;ABTy5^7SGW$ro$$^wcuYTH?ZYr8h(6pds(q)!bdQH*uFb(NUk{Z8_?{ zpDP~5INW!UJ6w&cUg!>Zap_y>t?=jNAAL;n3f^-;#&;9^uByyb>F(?GjtE`=TU0QN zZkV3Pb^89Y2h))oiC|+^U3&Ky;0-Uc-_X4ML)E&FFYlcTh+3i27RPHa!jSN}+&Vj( z-7vz;dUN)Nwwsub?z-!xcG=^cTIQrhwmfa(i})iYMUVQ=?E5y^T}9#>hbL{~S*E}_ zH56pBMP*iikWUJEXtdi&JyL&qA|??DnIh^7Yv~W=gT=Q9#%zAwuM;aHWa~ZO-p)87 z<)XLlPkyrY_Pudy&{D+)AfSAqed@AZ`iP6c$?ul|8T@VzW|yXG1}`6NUZuVjDuwwF zEf>+<1fKD2ajyN$fr-90H=@HByA7TLjGoYa+b}%MEV{%}#FV66eNNZ@hIXUXD}_AQoGx!>H7xvGv6r-&f&zv!cOIsyQ3m zd!JGP7o*MI;z93_dd6D6PDi$zYK}!m+8@-YMRK^uI1_dA)-1jPp3H3~Z%mf8pwEi}brJGI806&UP{n-$p&>;?rpGu{;fXAgGGLP8A&X;_Ia z41k_wU~%dr2!I*;vUD)n96Q|Djew#D6R)iwXiWPubs=5S*zsDUL#K`^QwZQOpYQF! zqp;|$O3czM1X%$q?z`0=Hd%WRW zr=}7_b(JM-MHat=LX4tBiQ>FA2bxM<(dDEk*zI;}26gD+>V8I_pG<5KO2~${LY^z8 z(ce{9{t3RKVp4n*Uhe7}Fr4b7ZW~6ZzGJXj!`#LHsT~)=Hw4L0>atOFUA+@qc$s;r zS&P+p>J5VTsL5|m0x2)0sVp0FUV7t+=#y&5E@f9kkW|>|P-TiFaa>_-`FXDuX6v(Y z^x{UB0GN+OatapJF!^jdrw8Vs?wf?5nCzk(TrS)c#g1YdbRd{k`QZ|6e`|?GM-_1L zl*nsE><`7l&yvF?3j)5F-4wN<#gKG^AuW_o!7yo15h{KU>Z?Id2ECyEF5vg8m~{F$ zi5QfyFGQ6`9OB{a6u>9F^h=tTq;E=!>uy>84PQ|a?OTiqm+C5X77lxPmSS`YZC%R02et*#ECJ_0f{DNtxmPrZh zeNQgJejg6?&m}Mjh1Iq?GCjKBX2TU{H1%09T&WbhBxQ;ZaUQaA{FMc=8jEQk8)UT> zcm`oa`}t}dILlZvzMN2#MXcH=^NPx9!^Bk9C?l)_;fwydqZx#K{HNR|#^x~J;08o4 zTw8BZtRI(pOLe5`vfkxSe!EY1I!n9*xdHK_7^S_W*>Tc#B2JNo99E`dL@RtwEhg-m zY2E``fy5CjbR;|p8dgzu16n5VfVTO5!4H!tUox!yuoIO=xcr- z3OBxrK5BjPliIiA39qgt=^SY8<_8uCs;3~!xgOcy2@1@!jH~hR{G5#9q*mLymbYji zL}h@DfE7pgj(oj7ntk1HNj~x-CW$ZldbE7zDfa#^?PfZ8me{LdT(UgJ?_b|HD~WKQ z5V)EV7+VtL(;4W&-${zHX)bGm=FLO;KwH;;Xp1R$&tO;6Lt6P(Y~h5^FC6~DJ&>A` zh~=N8>o=Mx)>td-RbmV8y%r2Ec<=an`)4BO%Zy3Q8d3U5nZ}VkaNhb;XZx?(zzjNt zcSY<_1Ee*j5*&NWjKMDGtAei^6e#A18gCt90$@v8jMb@e+8!1w`(|qC$|afWUv~r5 zk`fC+NdmA4{rZ{y_BL|*l$cIA$V6M6)mSUJifVI^>r)bTCn;-nfua*SfO=Y#!A;83 zX1eP@Pcp`%G2aBbdpH|!1S^G$ra`7yX5W6@El{6>c76lM4>c*S6Kx}C+4<}DoNI0w zOtJcq?E?H6#RH#NS+w`QR#joy0<=Yw)33IA3?kS zB0BX40s0#_`j?dKpXIxMpkx0r<@$q={b!i#pH#tr8*_>O&BpsX=K5<-!GDao{z}gN z33L5JiTmF$m-t!R!@n!&v4Vg+l=;~p*^5w(E-`8WW`-DbAg^j(sFy4oeZC9Mi;2lK zj3JKl+)d6W^x`?))JENB^4&!+kV%}Ap$Y!~TRKYiEFER+ki29gQM=qzC`Ouglur53 zVH`95o=vIPI5Ir8&SqSw`N5gi7t=zPcochHQYYpW5iYm)Mc`3$-bO>k^TW|DUwSX>qG1?I}cgnNSK8+{M1~fT|X$-mdu7=2Q8rm0j z!@zqlrsbp@Lh)~&55HB}lfS3Zxf3Z`#C571$IvO>WayMn`?A&xM3y-pFY^vn(F|ja z=t%bApgBij4U@VTCWnyF=d$N)TrvugY~zlXV^bNK^(j5u#QuE+x28c*4^|;z zk&bI`Gwq$6;h(BDf1@tgTYL9+bQWNS%K4Qlj1p^y+>O(~2~-ANoXPo!k&yG6$OFF* zNu#gxHVohThUk28lFTA#)!w8aev#XKw-ePe1p{M7lH+#V^W^8di)Fa8i_uP7-{><@WP%OpO32@hU=o(vR2q!yFHJ!I zxYN8emz`#UoQw-(YacmET^g@o*#A1_ogMwAKTbR!;bXmfI@dQ(eB*}fC{JrW&(Za) zNd}R)H*}yd%_$y_SsyQ$sgtN3jXYN_|7P)Lh6mv4z`XC{at~HQzS8k&^mirGg|Htzz{;NC!rEZbXd$yJE1C((`fvh>Lwv)$c*02a$n-|!tRqV-Y7 z&qgZEUB_j{I;5+U3f>vsPAEaD2NILQ83M9rEdK`D##FWe(G7u zhWyFt1l;_{AK78%z!?TGlBf-z)1Rt;bt~=Zr@q+d7lykyd>aSzjXP6oAk9*UjuhLO zJp84t)Q+OmUL~9#(sE&XNP<+%+1Y;;3{FoG#m|N@F*v@O=n0OBl)6lF6Pn^h-%J8t zy_MXo^QLH8IjteG-WU++g5UA2mQ2mBD{BSM1zc>DY+L8@a8Tn_fyYm+{uY7rV?Fu4 zTDT3qRcl)OeAUJ-*CaBF`}Dd#{KG@N3)ka2;IFVoElQ#MW^>l;E;6`c8_gJvL6 z|3gGn{prg;%G`BLl6vZOnb`UYhL18f^@NfW@eJ-BSIpebBNKfdJ4Vy%41Ov<%6weP zO2>BC2`v}h!-Yke`KC|B;;I}jrces}DpSvjs@~w}W`2M7lEXt9Ky+~9Oj*ec7uBdhVO~9(QN8ao(d#WFT~3zrx8BlgDAL*0+?$oX)%OKwOb-wO>A2=rq_ODT?PN z_bUZobeD=a%Ju!P~*|=kc@EN;_2Jh;x3{x{FdJ7 z`ztH!6ewW<7UDvN)FIbkwYosxa7F`u+ApzR)1G$5zu}c`o=yK)+|e?r(6wM=;}_nL z0laNxcJ+GZMg62(7DY?~F!yH?uK?#btG$2N+7UFq6n%eiL+?0m$%N8ax2z4ZWDR(e z>Hg@hXFiOIM2c-L8QabHUH<(RJ^$MM*1q!_=_|Rxhc}=389ingnTeqIrCPTE|9Deb zY-`N@S8%!Zb$<9@wW)9U9oaVqE?4+*Qtts~#{86B5fpBPl!p8UUtKH+F6=+taTF`# zM5ot8Z%Q51X{>?fxp8U}Jgl*1`Dao2M?o7tUb9TY%crP$ufp`(I#Q5gJQ70H2PQ*tkpfJz*~Ui?c_mnseEYnQRh+_UM9VxWaTT=s3{10x8Hi!CyOpX zbuUY(#~ae}A7VD|(T?^;_zW&wtIXPgE{%5AE z@37C%#t8e{r&X1JO1*h^-@ve6tp_|`3h{JHM!gy;{Tsh-X#nkdDaMOJ3UR$tQEKVL ztcN|Ncc?aR0^{vnL5h0)L^1NGk6CIl_U-E}%ib&+<3{G! zjDq)~gI!+2V;cM79Hj?Zj>xt`h(TSddcT9vpq?L^6Z;Q4qZ1s51I0$|<5tnv-GT-x z6}xwzLXQ$bW30WeRoeYe^xJ!B>;wDU0>v0=t`$94iUrvx3x`_SE?3fpCe!k4@UB7l z67}%I^&$m}ib=~rQB!aQRJ>sPo!%1&e)jG7A{y1ev6Wp@y9ZA7=Rtpgpq`ySEN0;2 zQAa3zOKCY`LeKAU(%DDT8yO+mO#s6U0wR^Eot+7j@e!og?+)M2b6tfp1z)X@*zpZN z&lLHNY6K~CUI;pR;-$@?X+J1D7{eqA<|Xj@$|IJa^7-oWQ4si<^bnI~Af9=tgJoN{ z69N4Nf%;Xk$v#v;3fy;m8@~Z(I6&2Yf~PLm>3l~eB?%d_2~{z3471!{4xtT=rsXO| z>s1N+@w^@IiWL$U*nfuE0U*nS1WC&cn7blrN~z*F6vH>^|JK(SAp$YY!Q~Q5JxXu#WhuvQNrFvBe=?q@`(C?!5pnjQ`V)=7A(paRIo1~;tV@XsKbT)?d8vAz^0=*z5hqBo0>g&zLnA?KJwURKb zlyU1kkrS%LNh3k&t)6I~4u+;PJTx)6W1llczJsMq!fOAT#HP~DfB_VT&;$t@C-T1N zo3nx9Fqp9_Pj^nAp526oRb;S(tGITfm-Rk$Dtrqo>92&_%&SYnx)jX{jzVAz(DKMF z;q-Jh@QFa}Sv2iPtW)I(rc5Ic`sB6T8c?{PU~!~2zvtE!$1*C)G^=Ae#rAFO#>cGS zq)X&CSLq`2Mn73z=#`<1%w4Sw>ugXXa6&Fr%bYY^IcZk(0QZePP$tvb>^Np%e_O0( zTRF3;T{yTRc4RQ|*?=mKK0#t2p%Rm46U;BOtMhd?RpxW4v%zPq-2tbW2yEC$U5pt* zG%}%GddQy!z(C>`V&Iq_nfJ`HBJR1=8s80R3*7m@6)~@0lA*8E%bOS%6_+-@_FZ=! z**A-ryni;gDCj@Y{>YZzQhvu$Whlr(=%dxg$zQ9cI_G0dSqh9-5DrtFXfwgf1u>2@ z(pPjnBz4YS$%nR|0g5LHwww7j@Dh9t#T(P=c6z7FJiibVTUS1Rr!!b4>>~-R!IB|zE1TfZk{4nlfg?N! z%2Z+KEv4|efY>XX)AW{IRfH2b0LB7O)w!!fX>}nMem_nntnB6mK~w2$gem$CVOxa3 zr%-HGamK?L^6h2-&b${tpAph3@l(>TO0;)S-Y3v$@Nqy_h;wPTb^9i`IzG1e>*1HE z3ruWxx@H?eJn<=9;IJIt)!V|`-QIt9MjNq{9&D{acNQX%+;=N`wixUsT=c zv}uQ@4XvS4{E~J}M*e2XFsLiHa*e&JsK9O<LqzBgLHDqNp;@M)hdh&z!`=vr#=!ij;UBI?&mu-i`i0okUe5 z)7O7r)N4N5VJYC3N#*L&>yGi3#D^yx6b5^F^B3^*ktI>ZcZz-6E`I2ObQdP=gQg#!&tj;@+QN=Kq;K{cCaWA1Ks+o6-6&#l8PFjr9lI`L`oj zf3|u4?Oy(UHuYD{?yTw4$KS=r|Ex${{4bv2e;&d57ag2`KIdPr?r&^LM)Ln)1grP| z?g-W&_2FxN8u56Sjs^WU6PY)Tg!W@0Ukj^_9qx-Szo6nMn;HrEVszVlB6n!z`u4&t zmJf+Hno&Rp28*T_6`x-30pOeX?=AcNcv;c>f^F`nHO$Wds>$I{>4bZpoGdT$(^)#I zMLE7Pf)g8|Fi46G>(5Asf?*VZk&AG?rt3!cj;3enY*XcgMKi4JgUS>T^})@Jj6AIP z1Z=y9Yx-*rE5F^ITplwRm|KyUp7#d(k$HYh(c7Qv88GRvnVqb=14X~^_BVP4S5@hf z746~xzA^NSmt@5IV%`qL^D5Z0V~&wij16PR>5gvW@?F?qj9xWs#N@cwrf!~5b!COe z_Dewphd5{Xe)@5O8IZvIMe6B{vnozp`1r0(Pb!7)P-1x6D}EYC`e&Bs^yt-H@u^RW zPJP3Y0k~KBDjRfjX_H$tRmR7#?FNZvYrC3Z1{Zt$(Y!_{;e4}wsS5a4Otb$fqR%!;IV|_1PJ=~Ic1~%O=?f+W~0Ly%#(^-GH_&PAZ^T)K5 zLB&-HG1YJg?pg(u+> zCM@q;Ec;SKM~i%dwM&03EKiBbmnhwHdR{ooXEg zXP@)*MtNBFKecAI#1CV3m`%-AGon0myPS`zItGWo1fSEqJA6~`WQRfR<#{U7k5p?H z$$nne!M*RwN$Iegxrg}E*{Av*tTog1e^t3?0YGW>3&EIFnAh$Dk zKhfRNNjoB!Y!-4BJ*t=9W4SC5>N{CLC1(N-Wt3&9w*hp+l$w386!%A|eI|y(1tfD!q3Q0Z}QT z_bMVPy%VZ{h=BCoZHRjKX3v`WX0JJG=FI+OpMM}Lc~^dT-s`#U`;PjFiDsG%94@~X z1CG85=}Tn@YxJW5iRbkQ2Hp95w=PZqCeYoW6B)Y}qTd(rg6*r7bA*n^4g3g4j!!F) zR#W~lb+2;P5BXVe`3aV6?xSuKHyOGcE>V;74(m)UJRBRSStonUYqr+>h4VK&zvH~T zL2c&=!_|A`ack{$eLuKGhC>gJq=~6+z$D)?8KLEtK`L519ykj%qxs0oA~xy??)4l- zSLjQ$Bc)U48M1bKw}Y0BCY=lcauIM)Tf0XEwL)0oNAJFKtvJQY{x#YRen1hbIh@N{ zC>(iHOnB>C+0ALRXao6dPjnQYotj`H?o+zV;yk{q7 z>S53yI$Xy9qMTsf79Z-9%-UI;9wR@pHTxZ%<$(XG8Mh(R31Yp)p#C6}?JYrAa!&Cm zUcCe73yln}Wxmg0$&?BeKbW_D6E2MjBXbZSL-0|hC$kNhXwzMZ43C87GaW)D==fxr z#F%zCb)dSmp`m0<>IwHkaV7#!p^0hAd05({KjO<@jD|Zj0+N+%-Z+McXWNflz3icH zK&ZMugI|2zJRer-yhkJ56Ki9t=P7Td^Il5nL>FZ0`E{Hxhsf~2NDH(HYvpYVk^j25^+E7 zehD*(^KRdrmo}M=o)@ywQ{TdF+}1Vb8m-+Wthpy&WM-8^68nN8q_CTo@9Su&q|>=TPYv8$uzenJ{q*2Sra@PNg1dNnkj2*SyOj=;W}@$ z>EF6~y4q*C{tQF53RKN;B(ogw>yZx?k&+*>Zf>)_0k{_ZidQ3JfvyHKr6~{9y=fKT zz_5}Rld4YU<(_p<0e`W|=gr}_PoCvSqkJR8gyZki@KhWvA5h?MuV9zqw>9-EhYg*JZ47#OY2RJrEn#a_^Hxar4wo zZ=vDwdCvUXme=b}7t0_P^J9I#KK+nB4E+iCcxX|neP3)0KWjKD)(|23?Z+(<8lla3 zCqsWS$(Qc$)lb)+ueVW|9wl<;-8I)jxT+MKr_^uMHMs2N!s@54t5@GPT1?7turBo) zt~Qqy>-pB?Z6uNJCmEG2zIriOvbab!ccIe(3Ia z=3ts}#Ot|@JzTF)ahj{>UilCK`01lIwu*c~I8k+@4MLkDi-u&z#q?;IbSMHFdszAo zS%!47mkswsjG;?9e*!8*MkGW6ld;R52erve_v{<$0P2k^7cadQHHb{F_5{KDMk@rE zTA!eJzt6asWH`-?deJ2)aLWjuBxY5Y?(9xU7n?|zA8RMpax5YVO+uYT z24Ggc_+U6*#87ai~X)--$DhsE9`fMFkq%1#VVMgUTBm;Il^j37z zLkR}p4Iyuo=z(=K9ODzw6-`fXN5rIiWZ4QoO3R2qlgpgI?;(o+uKnG>4-V>0)r z_{G4e7{+0z9!=N+V6Vs27`pzD=%ZL)%bs8|pYZP6w@*#+$xp8xsf(<69fvRnX|uy~ zE2ujxbuE!aR=S}{(2jKX&}?ym3h^W;5?W&KV57a+pnaUTOwW%G~?0|M&ddyzZhdO;igGZIyWho(2rMNMNVek zCt`pisS}ZONHYo*^?AJ5kzK>SFw4Fa`rU@k+P*`Q(AIbQ6gh-GCI7*B4t^t&Y$%V0 zNGiQ}mb@52%zRl96g-p_D!h#O`a_*)nt&D)3N!b;Pk6}mDfV^Ns zPNh&2l&33d*jY|DtF>n4lBMWRB4!7!N|-^U!Hb=0` zJKKU+KtwGpSOaWM8yDXI6NpFETe?r&7IgV5IO#*%;IB}RdL8P`Jpmauxkfhui%Szc zt{TslLL!)@Pts7L%&HJbdZDkjZkpZ&ks!is&VQgwUuGqwW&gWdY~pw)ggyy%niwn) z-wXn*xptYPrJ;J0#X9yZon=E(jjFY1A9jBm1KH1-|4@dw#dwri)huxz{V4SLtuY>t z+L4brMRp8Ryg1Y8a(yjgAZ_U*sByptbeJ-+&z=e|(!_li3^mb#aO;!Eb*9tIq!H@` zE%@pTaVoae*Ih9t3)`D~C~_j);RdKz>2(cbTWJ~%P`q|`#4$3uddwM95#Iv!b7(6=m$gxqvc&{Vr|DqwB29L!fJjqVt%fg+=hd5K zhiKI>BYUJUk`J8i`9lCz9Q-(GILwQ%4c!47$YDs+dKDbYAF>Q?T;PA0j-!x$Q7wJL zns-usZuzV|@T<}dBEvALRFmLG)U($8TPh-5FH5e())Z>oVPc655#Du23f zwK`-JJr1!!DarJtD`GJ8MUegs_C*D0MxYv z>2Ygkpi&mia;0LxSgPv}U+1>5Rht*SJ0@QzpWIWgkCFc6V`3c9Q4(o?o2Bugv$PB; zbkmf!$@|>Y=`1OR!&6Hvqi)ho;92S>#BY-`Ep9zSh&)~J3@MGl7-P+raSVXPDYI2I ze^Leug5Epm%rpIvu{|SphMJkenDrjWe#t|2MYCeml@1{>7K=oNPVsL^A9g$}c9ZO; z{TAGDJtkf~%F*nHTlL2$ir)1(P0NNk2GUzx&HO;QLCx^+oimRkLni?EZvLZMh5(}0 zGya-y#nF-nV#xxNVgvQ*(G6ePnDQ=9Winld@^_ve0>5XirzpnWOGj+cXS}46pxCd* zIkyZl**M-<2sU&s_P+1AxnkYg;GVSHoZ(f`TN5hm8PGN4MGO<86!TGtBNWB%Wu4yH zrsO(qbkoea{nf3I_K&)M4mi9H(6xMgo}029P8XUUFkir=L>!6HgWo8O6??!y)kB?h z=V=dLP&hvu*V|y(#~PVYRV`TI@I2+V3TMRM`?2XVnNTl7b$vrEr^297eEv=RMn#zd zr#QbgZj;-ClC55ISiQQo(61= zk>`Qc^bS#FSWksUG~|KkyW-}&3o;*}1}y^qPY>-{3(rWpwCE{+?bN%2qFtuG!p6JCp}X(xl4l7D?e6uHXsGUtP;aGP z#?*2~r}=gn;2b&9cV2o%-Y4oAJ|KHJb}rNL5h~CFh<2lWDMAM`^fNGA5bOI3&xWiUOsX*$!rp}bx) zfj@F>(AMG9|6G&1%qsp@n%sX0D*uBn_g}Kd|EVJPFJnUg0}T0ZvCn_UkpFA0=zokM z|7G3re@lYO{8LW#-!P=Sg8cu_6*&Y>h9h1ty1e<~c35XD^*<|eo1ALZ^xBt$Jp-mv zT=9&ueEA!N{e+z<(d!hLm#6@?eln|-RklRL`bHE%4G(p z_R=Zz%2p^b(qw}o2ss=sU$&Fb0#VrewZzq1fN^23kfyah(6w```uXNdSE1y4{Zj#QoXK|^~F2Y_)(aXVUw9XFm3uE*}3)tE|)T{~7(`S9u`qtMy0;^_dq0$HtNjOG! zNt|$#8JJnQM0Fe)tUze@G7#bUTYG{%nj>PLB$~qFgQksll_OYgPM&cb#!nk_5=S_Z{u@(Y)CcC}TfgZo$auEso3)*_y6U=m76zU)@3iQapgi$& z=hgK3B}pGh-S6{mk$yAksaOQ2Jssl=ERjrl#xh~io|3z=xx57}V>29ISb6ylG!?Yp zs>D;W622&=F^LK~C*$ov) zvm9Q7r}S~xKZ_;_&z(wMl|AwMO>+(1KBj$r3S~50)bn0>G)}oTpzSw(NArdNwZ^a* z-}>CxA0fi*n*&isYI2smiVE1f{f65MN^yppt3jU(Kjbn3IpyrsM--OF7T$3h(xRa` zbAImjqGHdoGiZA=(hfl&-*Z`5a^+B5KO$^GSa^Kl4MQRXvAx`?mQJ!k!`T$W1~#9t zt9y<<5Qr#gt%rrLyfygvBAlU>lO4KEXO13{5Se?I&N>g$*)fx;(3OW~u#%0qno3L9 zM5sQ^%LSSa-57^LD0?F#4PgED_=S#K=e92}(^jW(v44C{b3tOR9 zL>U#O@dd~eR+|#AL$q9K97a-6nZH=^D4n{GT|`F#_z|Q2WYVxgI3faSKFyVtzQWKs zvu5F##~yA5z;%2(`ctsr2Tdp@=QdToGCr-N(doiZm72}0ndu`Tl^4$0t>#%|S9D{Y zbGKO1%Sitx#IC%ITgps}Tz8r#gj|}3M%`F+HlqzpQsNx?s4JMvkfW6t`%}j$^*3}x zIL*~i4wX?hm$`>>1PBYUVIB(QuDCw|w}4~lbio2FAC-5B5UQ?GkwpO&3#oX@(yX6D zJxaO3Lj?7M)&(S8x??qc>`I@@)eDhpj&S-~`fUA~R`SWlwGH2oR?5Jd!@s3g`##@t ziPzrjdNUEHnK9I{Tq#?idxOtJ)lti3$_LlXB3+|JEmwGjDV#f5(Gr_-d}C;klMiZV zf^&o`T4g*F-RFq`I5G?64TyrmbUW1o>Nm8?7(lnqf+UVEQ;y|Chw`r)&z>;lWxvj^ zU1<(XkXs(^ollLfxS5=IkG>!y^e$IMRDXQhyEitdE&Q-XZp_5a^IXe6mumpeeQOdI zD$W{V-ma%gq=4niE~PKVe5*C7nzWF;opbfW&Levav;h2 zhV&&p?xSC4rc_gS>}$^Umr<`xbKh3Hhe@GXUrnEJm;?1=4EAi>tIyw~fgby{gKMtT z`Gve0@}SZ9J=dMM)TL!o$mawi=!r#-tUPve{)dd*Nsfr}tdjRxTvKE0cw<>%nF%Oc zK|}z>edX6Um;c#C2QZfSKI&VmCs9S6N~30lYuy-@uR&@CylG$2#BMxbDMwYk95Brh zw+_}-pcd5nFip!4R#Kh3T@drB+eAX|YN-K7zr0<4la903;OtM52z!3+Els|=q@S;2 z*b~2!GfgDajwOAjrq$v3h;A#<$}yN}SManQm-|F>7d5M-Uyr;R{QCIokvKb_!{!>Q zqTe#JRY*z{#bbJoDl9WqETL{Ph$$h3-fhr5XTRN;g;)P7?lM}B;A6% znV-K3K3ED*`rNLN-W}HruI=|cgsd12Zew`Y+gE(AaG%{NSHNmxjY@kQ4BX$C2p$Be zCh&Cjp!+@puB{I)H`XdGc+}`ra?4fbio9O(GyM?UP1)gN9yW73PBi=DNa&Z?wcf!7 zQa|B|Y7YJ|$b_b`kAIJ~#fSlFyUtT6eekVABdm z&yjnt=gnf)RHmc|fS z@hI7HKDF<-6Ew77@*$)$xm zQxiJ6imn{zhjkSm4qKY2&k=^%*ov~T5#wrxvKH(N=1-s7m4i93%GJ zpsA`JhmPq039fY34i)gP+#|Mj6|Dk2v6;JT9sCVp)z0FQL|^92Gd*vi?kd9Y#>*6v zX!js{SDc_}sf4(TMZ@_(gq5!WBhU-!G~uS`tf%OG_O?_hW5??qHHEU6r{u}v+W~jB zJ>dINwGv0SY7#_JNB~wn7YEH_FkGPS$fnh8q=cPUE_?AGyhti5r(E#>*!$Q5?mz~p z#+={DQQeWSFOwIw_NAHowxMb6k%(Kj3fXuKb{;o(vP43=ocf$xVdHN3@ecM@!P3& z<+R6Z)%F7bSKra4GPd%|&DPP}{&z}O13YsLqNsWJk(_xDof)SUd0)rD#RO~lcX-|= z0_yBTagmw(CuNQ>)+8@>ap>TT9)F7w5!NfQ9!mSFnPy%)F?V}Rmv?${)U2Mjd!s>c zWC9-4WQ3b?(l;tbiD8I}ncO1Ia1ppJI&;!>fD0t`z)USUh)5SyXO^e$CRMiPgV=)2ZZe{L!6?km#6^A@hpJVypL#qxlyvtRW$M~6aHYB zlHWwmT#poRNsqEhlCn{<6>JC<} zDNJs6D=bC;uG>y`G*>dPAtqAx7STF{QSdL#YGp@7zJ3%z&_=yNWV~dR!|}lEZu>*B zF6WiRVB;dungz6}p{iy#sMbb?V5UW<4W{R#i?#PXvy&2h;gwW&JK0jk*H71HT5QTM znB^LIxQ_wcjI#JqO@ms`kpB`T%Xx7Dfij0xY7`7mmq*%;pDySPh9lznoCi66)h&lN z0^BMW*0s8v_Qr)}HEAvfBwf)i5!NH2+pdmG`BE{`NW!BT^$DpM7wS)LSW0I`KvRUX zD1{IIH=}d21jnAm_7e`o#(^K=gc@`KtRd%~(PA`W6}7b9p}Ojbf$g#X@ovHQM%h^# z&$4&*G}oJ&7!T@DhEJz2M|PO5W+wRAzaf|7x=pc4MrcLBgC2T^{1W)AFVN_n9P|aZ zaZ`9kN_QdGwUS?o{(%XYKO=Cs{zq;1ES9+>hHNc=NZpc7@{eY0+O{t%EF;(mqf4`? zX3ABZLMcn;CNe};%qqn;t!yC-vpF#d&i@>|;g&iWoqaFb49II%0q%6enO=EUaU(H5 zHL>7T>IT#DPmwo)$E=>w(5lfMHDOSQpq#&@pP4Xkq47+%Td64_msX)BBkdFU>{@uk}L6fqm8E=_6VVP!j(b z#>sY?_1%Pk26eK7u+hOv(F8w_AeYP^9#3_|R2>5^0CGXw#=(+bB6O5PEm3LWdFkQ+ z8a8|IYwWEF@d&0bk@CD*PfPFbls?Ugj6(T7tt!X6P(H3VL2a?#jvTyMd<)CYaW`N| z{j|W=5$yV;;i8h#E{a>%6A*2v8yPzJNamMnORIAe#Tjf>zXD}^^T;BzAUh_oan3r3 zJ<*ZOF9W1*N}@|N>m!I%JZju}$h@k=*=L@!;`ebZFB+4z@#vA&y=#63%Z}rS=$Pl< zT2O00?Zpjr^(tKrUpS{|b`&ZU4{(CUyC3flD9zst5IXx`W}-U1*C!@F8M6pBO?jC} zjFbZj&JUHs_XE`b-At^s{}(gye*1sEme5xB4>?gO8rrj*U|L|(66&TB`PbY6&|e>@Mq6gDKy74@%z})z=!fA`6+xvDSr8EC)NPQ|FT^H z3oToNePK=n+O&=-sjMIZRcC$_=^c9fSO#|0UJ?zeYd&4?*7l zzJB;`IoN;ae*XyBUUIwtX*5>qUya6pj>gLTQ*ig+xF70rP~pEDjr~7vfa}xzzrF!( z?KwyO_CxNENkXcI)58&CSEKlqQ$ieGDBQwk)N6Euo+`v+HIp}mwj*Y_ybB|kN>${q zdz~+E%aK~`yVOK4cN@V5Tq8>FJJFNuZ{1_(B@?~LOaKMs7#7Y>JB;*ccee-ftg#yo zI}qHUim0g74Xi-K^3=ZtNoU$aHY9YG`NB}JcCa=r*X79}_ z!_{0S8DWGE2cJmcrOP(7^KKe-8N}_zrkFpIF*JaOj=br9GtG&VCgicd-*q8$0qgOu zl%t8mj&y^P`SxvXU)*hE#j8$7=~T^?KViG??p<(Q&SkbjhN^c^QGD_COr_D4LlP2t zJ1eHq;2lby!l}{Unt9P>g(VxJ^pRcL)a0x+Wm*SoBD*SfL!&Z1z;>=O^~zmUSi4>C z6Z__|q;!ZTeZ4ZZWQ~&(*n=Bz@GbomJ=i?a2!-pb878 z#HU9!ZQE_`c8}@9O#L>$4E^b*P26p@ek*TCNp~GE^5%S`;UsoMp>O_;YF<=jglbiL z>KPwB;4p8kEs38%PLDNSU1|ozJ{KIj%OCXVs!QXVTq58(!en^$a}rZ$U8a*Lec&yB zx%symHSpv1x|xRdMU~qdVoko^wXY!SufF(c%0ojPGf>3H*gPEaVJS7}rKL)N#3XMD zZHLBlfw(j2|kX^Lw&Cd04SE#Ma~WO+@Et|q;X4{RSUGGI9#Gc;!2|36z{$mtM zI+(qa`JN^7L*qO$2vB$8KA+n{K6QQ~izZ%6Jgtf-is+$;JwXCOH^ll}=@{eB{X&uD zs+1YD_pPOl0od1yoZZL<_HJpH($P-<2r#5ukJBhF=Yx8v+ig?D6Qs1p){v~Cz!=Z7 zDC}#Q2J@W^{byJ`7PDrJ^An1}{zAOqcIoWwli9hEeg za)$1PMNW&Bgm6%nzv1RTHh{6~I_-zU3G?-l!G(*)wh(w&&c zp)uO`TdFSKqrSbHmS@*9q4&8cdQnBYxtxa)+ z3EIe`0uw{S(qI|lTpx|HW{6yp&ecQrpEBvN_)hmq=gLxqLCE5*465(*vGtx&EPDj+ z{Jf_BB>rkf8@!gX=pK!HuvU(|kq5DoOUeX@&&I-@Wg9qgi=d$YZLqQC$7~~Lblzr68tBhE6Vc;uow2cK%` zr|HVhxZI3TyP7fSnr{+MLC;!$7g)K^51%r*UBcYmqGFijW&IaMEqFNcsi#ZQ z+_}uzW=w9q;@7fX&&_R)Q?500_sn_bN@1%6fy|aL!6X9UyG2Y?CJPwIUj%qPT1qix zp(S+dIp8cn%fjaC!vv4gdpGAAX~K^l=@&GZh-A(Ro@w^iuzO3U_FZ7tz`7RIlNMJ@ zbNfT6jYJpB_{&^Xe^{*%G;cT4FH zo87h@-+c~6xfouL^|@ib5}Vebl;{oLLzH%Q`X~tHy5Aq?Xkpf*HLFFj;`&c?dc;RYEDrggQ_16s z%-ei=a=Te)#~iForT67;1-_?guaN5|?Z!&}hG}Oc?9{#=V%=+^*q&BaN|IKxY zia@1KZYWfe@4!4DpDdOfX7|9C7z_`SJEL$8LXtWu88&!z;5^`Rt_=941wYa{DY zVVF*J`}Pf9>59YLa3zPB!bWilcdz_&AN;sz_)N@3-9dbS10y}fh4E;aCN71} zxavZG2Rt4KOpbS;Sbj(ANJ9Y8)pZq1lmm`(faPw5`GX*${JzNIz7KS_D*rHfB>|sz zi6v?AFQg5#YQ(YpDX<|ijzWh8WEC%3Fwm3Q&0x?JH%4;lOI;$`SQGaE4uGSL7eS(t zStU&ANlqX!%RtH*j|efxjS!Gv=#5q6W2e9&;^L)i0PKMl7FBo~81!y;8lA~I zRCw&EshSvdMKIFT8(&F*=yfN)Sy>z$-53%-ush&bDVmGScAL^mNf(CpL#fZ)OvjAMm|@mtDN5qn0gRU`rs z6Fpx~O4*MEI6q)2#vQoUb-2FeH9FhS8+uNIIvORbTOKDmY?L$723M*ei#fI__tHyw zjl4%k~g? z+;U+D?oZc<12A@TGEuc5(23HK9qbc-*dA266Tde1b+t!}z%qRH4hZ+HCYaLYkj!bmc7PQB{_#J_-}3)E^H$wt$vU|*@xg=)v~pnDd@ca%Q! zuL}@#RRQVSF+m%H7!8VPOh;EbJyMxsl%pow1MR3nB+B$dP~kgr%!r4Lg0GY3l3AD% z7~u!%)iN2Xvfv}#Vzs=&_Zs5PU~^Q`5W6?U{k(h}ZAUIGG>;aV!V9)K*eWUCs^*(| z4?fW6Dty;kUzh1@p*9v-@4PFwxzQZ@@j4Px%e>z+qYc9z}aNG zy0g(LBb_*b^TB_4SD|t& zDk@#8?37^TbOXXM2G{2x&@-L2!c5PMYK^!&qR|+{w}?`GQ{&TXuoA?;a@XPI3hAODlZGvTG+KxMDqYT zX|T1W5|H1g!M|5W%CR2CseO1NA`@F4v2XD;Z-GwH@@tEBc!7-p^bwn{jjtA`&=PaA z`O*`wfB-+qX~dw|P%@CznY44bN+t6o>tX&Bt2BdJB+AX4SH+v;urVG0VY?NfXyXHM zHM>|cm%Cmb8rq}O)HicGldRbj@Tl8Sl@O=S%pv_v-GiNXmU7@nkFKN4R$4l{xhB+4 zg!^jp8pCC<5?UrEYcOp=X(;WbTR!fqD=61pR=3W=U#sKNv5-}CTigL;CS!+4yW>E` zBG-?7)V~r!x$@K0Uc*ygu)gd$m|hE;2$Ih-^sV_OuO!j^%TvOFlf6bJg5Z>Xrc)U@ zDTc*6QpB%iJ*AUvp;+-%cX3}%lqJ}P<@?#hVaEqu0>1;IjlI$;5i0&biD3zS?-ma- z(j7{qiF}HFq*5y@ZOfRkTbVH{K@S8ydrE>(Gh~L~tjhF+5O?z*G!p(K`pr_Rfb-WX z&^1mztdb4cfyRqqdi|itBKQuqTBn} z*8>#maD!3D&m*7J$ZjKaeCF9bEdeEuWLKOFT2SZFY+rfw@vRtKKYzs_kY6bosNLh% zRo|M{@Lp)ERuM}y)iI0^)QWU>jokRIgsxOMZA4`P4F|bRoF+l1C1FITp0k@MXPl}b z*`tw|7=YkI>g4Vw8@>H?^OSrc!kfVTAh{j~$iBV$t5B@iK~_nUyF;~gq7*P@qEj1oJ(4SZfV=K-Cex=i~gKRAkIk~lnmZv@^ z%J!r0t){%TFVCV867F6(wh==P8875<+;;@2);tPhDg=Fdp+jZ3M=?*W)`)UFMXnBw z*Qp|Moj2@>y1Gs!42fY*_Plt#?bO{r`S{XDKLMro0a*8v1Sh{YHx@)`V7U;@1ph$# z&?;JKL;*9ki+F18>s9U78*hfg6EpM6GMq6yDr{PFhTOMTHUa(c$Ov=*U`}Ol_D)(eFOgQ0Av-dM!p88Z7+9FQvLlX@2qmua3S_a~sUSQYEcEYU08RHNmCq05!=^Vnm%xs&~D7OQz? z8J!lo{1WQ?Si0rX$DDNebbk_DK4=%RPxevreOwT}g$#s2_zTsjsJ1CIIRxm4LiYE| z9w0A7ETt=xhcXL~HWzIjtdK=`$zR-1rv`NXW^>2TMQJ&jdIY^@3(9DgPLbq?3Bp#y zUsEVFcBw1E^4{1RQ|AVoaC#_{GVNIM0)92Pd%r3%K1hc&UPIIIJEPyMQ??_d*ugnZ z(}B%;I3STbPiK+8PuBe7K?m7Cuq&>v*70o3ApII!4aud@AK)~`-e4icsOI&gVU>@zQ51ket!q{E)n*R7$UQjX@Pr=v1`0(6qAV2|RLQg2C@gg~|&Of;OP#ak?To6`{` zu3yK@>v%gxk zPj67ygAFiMl6OCE-e-KJ1BtBZ>^HX$wmwc7<*=Y>&ImMN#-PvB%oqKN_>~(8Ko0 zekt=gE__As$|Jg-I&wt26}eTQ4nt=kuT~AoJ*b%yra8nT_?I|968ZKkUw*VDBB>eg z5A55=hq}~8k$1F0DhD!m)%A_r$Im{B5@Z-UhltnXQD4Iu{G@a|#~u~At|DfHt^_PY zqshn3LR{{B7@288%xm1VOj}>NCfDX!H&@0n8QY}Cm!7ByEaK5MdMni$ zfsKnza+szUckj#Ik*#L@<@$zgdlR6NwHF@rYL@q8J51`B4gzU8B z#^ft(y11+IDwDFSxpO~uoGzgI=}*&-hR3ak^b=;ylDfZ3`DPv}n~8RI7i8S4xDy<+ zrI~O3%(Wnz;o4;Nr>&(mQCM1m6z%QrcW1n>E++8Zp>@Ak~HY#-;#q_~$6cP;({TH0fs4g!s zj}=%%9m02-z-1&7imJC&cwXn%mF3}RoHj`Jg23fzZ~XvEvsVQ8#$~~#qAMyjz7ah> z&*8Ajg({sWxI*ivL${)6S^eV9OWn?nYAlo=K3jd!Xl?Yox}~-1EqvT%J)+w`@dY}PL%plbd^0=+Jx>< z*zfu33%rj>dK|&bbg!vE_c=c^KLo`0wuiqfhn$Z2la+cwx*_7V%$O9EnvU)1D1XY8$`+Cx;pKRE4*o%)RmC^BC=u3qBNVZm!e%}dc&s~W-QQ) zqpCHM>j_ATV7?vOqIEZs)6G#+DJlEYv$L`grcr1lR?43ehX)p{BV-_D)aR@!okRrWTbi)zUGv z_uQZ=z$r)R`Kve)P;XMD8@Mo2b1uxn!PTe5Ev_UY+T@w+9hKg~2?drpo)_~gZp}$n zMLD{NFZ=GUUvxxj1xxi4wIpkL)@sw{T^V2IeJ?yAtE$j!;38zUrhD|tmlvmhK|4~t zF(FhKyy@X`eAXk|vCd)W(ia^+UKPWJ+UHJ*R==7(c=`0Wr~%arkCUmWHHdsW;3gUc4aTuBf7c|+Uv4=gX8UD zX)|(e4(S}HP>c-@MTM{Q)?%4?O@_WID0_!2iYErGl!PF9 znd1A?WOkJd;c?d-#EQ|nczJ?4A(7*Q{h)p!Yee45yC<1q)n9vr!nDOB(08_Koa1=Xw(lg zC($31ux+fP6x{I&NM?~}Noc)Y3j-rae}Wf9P)X8gOc=%^jncuaWn164hHdzc2PjJa z#BASzZD(`pzF(T~*&hk15Aj#;j^xmH7XmYl!!RqGQT$@>D-=9dVlo2QE5hHKMLFmD z^dT~cmDe8j1RC0dIL_vj5&C4s(Yz-O-g?B*4<4UfcYZWjdb%^``DL^@h}}w1?x)xN z{4x6TqYq0auIUA0##U@Qq(G-klLRhby6;}6OGbAdzmyXD;ff&n-aMCVm*9&t6ciWd ze|Z;lqNHOe9IylvO8mgOyL{#N@+R&Y z*>X$5kZZ@`k8{^L)0Zq?Tj#UB-Ylx~WIQ>Y*eA;u0Yt>y7GHzIx{o?KH zFB;#D8h=euBa?cS^FNBaxDS-)Um`Z*l4tTT6~8D3?5bAoj_KX)=q5KJDn~qeE&#WP zs9Dmv5cbsjJIJE%gE;J`&(tzCsz&&D0|JT`^?I!o3I{27ZNZng8 zE+7UPZy$|#G=hm#CnC!ZN0uTU>81e;*Tsx6cyJN`+n=Yswy+;BIYu>!BA)N8Bmzw+ z=^Q0@$APlFub~vCH5(gvDEU1F?&@6#MfwE0@GqK!<|yrC>@K4 zcEjB@8rb-VqZmrcojD3=<|w8c)5xjQ<<~RJAmk5%)C(YR&x)6OPJh&DF=C9yp^OM>2o*cJzf= zT_J$!{k3&H{XJneN)iq+|1)g>RhOOX{)|3RXV>8K6@zmn-|2lvrBUx(oUWSkP}eKt zKyBj?4{ATn$iKW1kJ*kN@M1kiBFEohwv;Ns7FN5>9nfSBM4)!@CBds@My%}3xc{~v~Y`>s2Z}sfj*iB!Eg~}%R2pKW5 zf}rQ#g2|-C!tTX1dams9khe$-HJwLLoZoR*+0(+Zclw8HSgW)+G6iAY4qcZN;7#gs z;@Zi%KJoIxZ{E$25Qet7UUei}sEG^D{M{${$g`uhYuR5sutxoo&E+DCrtfs%ibMYe z)rDFQ`_BWOYD)D2@z+KeC_m?KNW^N?cw2a0RefW*?ngxU7gs(SYZd*7B*#3aL8?XaI#} zcI-FR@y`zMvj~+xNVh);snNB2mJw#keVt1E8{mjZIl+g*kqE6~j%SWQ#U%T6nLf9* zZ!uzdw-1IUyuZqczg1ujP{??QB1=H&ZEEf8NQFZ)T>{j0JSGOpd;}h7HYt@xi~u?yM?eegL6&WZZiY)H_ z88E@C8as(cku%k-MQ)Kq1uZ}rjy`>8Z_-|K_YzY*lL9kbRG3`7NizvQSS^)@N=WM&mbx%u|!YpCL=Iu-J@Ek2M-*#!YrJ(*EsT>z0)n zr5J7F(ue3LjAHh&Fftbrx39Wh^d*J;{U_lTSv9^=l#A|0)!;E6#F3ofD z!KFYAg1b{nf#MDBl(v-O1h=B4Kyfc#O6@YgnLE!j=gxD^+%tFGbts_vh6Asj(e=PZ1>-Ck zpRb})gkDohTFH|ifnxjVIw5A-+7)wfS{snxXXzM!_=iFnzYvhg6ItPWf%KS#f<)O- zi`#poavtyGDt6?7weqT*cgDKOh2JT_T@~!P6<*m!rg!~nN{Co93Q>V8PL23Z8P)6O zJSi><)Y>EJ|M4u!*heH8#noU)vI}0za*RuL9AM8H4X3ADl=nh-fOuaR84Ra9jvc23 zhzbJ0G%ovz5hpmXLmCdr?!jWKOg>3)p3WGn< z!rzI+KUH!4BPaP!;c@>JGWj3cGyh*j!~NL>`u7$7Q*D;y|Lwm-Ir@18_&PXV=fFw+ z-GKQY%tZ3vWG4Tlwm|YPGyhv=B6+Qi`&XICzpu^0{?BN$;Pw+81$RAIl7xDOT!xKZ z8>y}f2=2DX!uf1_Nz#1SzkAcsdUs)iO57tEJ|9Sb4qZ3Kc2PyjSl3urn6@WY^%iO^ z8VR=~MgkB61`}=rj5-k&|D>JMrjfU1b}%a3fC&wkTh_2#^JF2j>)cD0nMlIV&(N{_ z$ba5ZFuOj_+R&9u@XFes?tBDj&DOvE3Rs;o+|oE^vQKwYueE2lQKS`*P!5Z)kpUl0 zt}1kiv~Ej^7CyJWY93Q$rc+bSw(Yt_`2jquAXxd0KzYJi>rBlkef#45F=CG)k_vAO z>R9s+Vi4bp>5)%L<669dSbNL+^E!2Hk?xiL3SIo)wOLhahgh=Ofnh}(X1KEI(Ho8Z zA?vSELa@=2{z?}|h;U(Xy7ZVsIJmXF@#C+d5x=Rsw>rY-I=Ok@asMbwTej>Qh58mN9p>GXbFvuXkDO2k;Yb| z85GtC!@Wj(*5)ora^r~%mUf>Mr&vqjZ4^fz8KdkP(J~8RIpNrb+At#acyl52+_H&wA{LtjPwWpx)H=$hcI0R@JjdSy5E{e-r zd>Ji4(?&;PX!c{M-MHme%HW`iOgcv_2Zp6k?!-6mQ`~AO|7M(s#_}$Kk$oQDn>zX; zk*f=@G+7oJU4pGwZlN4;D!AMk4;_upJVLFr?$(V)U_@;Kx9!}yRj1lu>*uHAMu$kUSEaeS6ZSAS3ZSfQu976L?p~W<#)&v(Kh>br=S|acWL1 z`Vc7nwo&Qpfj`rG@X2$bty7hjH z1rNOwVi8MJ@1eW=!nJq27Na^T@q@DXEz0FqGS7vLuhnizx=yBA|EEEs2wCTR7OE#e z{E=`AT}@bujQkPLWCQQa)W_8sK*tITSD?k%Lbs^29d(<8)7hw{TtBJUBfsXd(Nq@W zTtLToE7hwz5Vnvnz{8PHJ~i3+WX}Bin*#&wr(jIJa)2w(B}0|UF0=g|+WQ5ChrQB5 z)~XMULy;?8eA^ke)4FE~lyh(2pzG#_hN%O#Wb-l`i!3Lx1a^H)?|EdnDJ`Ba3u~Tm zGJp6G;ZT9R#~UR3hebvXe)qd@>Gb1p)x!Yp5)gL{;+E3vdk#XRcPdqYadsdR#0KLd zyzz|>-rW(btVU$$;_*-dkNZs}9`Ja3!7?uxoRM$IW_2Q*#DEUHYyIq*&sNb*QQ5=Z z>wg8)&Ifns_ zjjOsYMua%x1MY$41 zxlrhaHGpheIX_%@F72j>$R<@VND#dN5w1z0(P1r_admAhk{Cgw81WapC)Ab7a-tt-EsDJ7DN8Hn1b<5E9eR@M|gO|9OvBa=NHi1&7txR2nfw|Pt=9^v-G!OY}Bb=fZ7A_sGYuIBAqHn zjk`DG~iMuA?Hdnxnh4~}zw@xR=-Ps=1% zc}r(=yIsDv^$gXN0HXj#)WZBkCH`PbXY@PY)>vY(g1Bkx2Z!V*_4NJW%8eQ+ zOVOCgY*I_U`Sp>7+@j*C0qdfRy02>W@ZtqxTQP5L$bEXoB^bjj zyW`Go;#qVXC8wgvM(18eF;$X$tejb%u%5IlZQgid|Kb~4o@gL?g>g{N;m+Z2_B)DV zX%4#bxZ}<&4UG;9YN@BB&xH&FcAsQhsrPo@61{|c{}AvDWnS{EVAG+-vGk#gAHm|Y ziJMMYlgCkv8Bat-H4zenbzK7Bu`sr_i}yb{y6%b4V5OWTZiz}MhD+42dGpa5@_9w? z`|`p%5O$=&&-x7FPbqC=(Qr0T5h-*-L|rtVfKsgmdXE4cEQF1r6C3d~tx5$BMOUdqQL5 zR$RE&*GFF@DQZ+_p+?holYEaNPIh=Cx475$BZc;RgHj_-iVRu~FfJP|KW>44!6K{p zs>zlCOP%{6U6{w4p;lZDirrjS0ggeR!KmMr_%W~+uDh)OZ2C50yAZ;w4hQ4C-LMYh zJH>Yi$wUcNsQB09G1d6UF})>kx=)$}4ZTY_@TDPJd&Ji8z3!TyYl_w`VL*tre)4|L zzOSLG$b(vOYPCyO05J`ECKl{P>fB{8sAn&12Xd{a9(U7pyE67VdzzAf9fpQGL_I?{ zEqZ7F#0C9M5*i^kZHm8iOAUg0lYpyTOry)PRhJ~9i(Zjl1*`2(==n;Gt%9p0CmnXR zlMwj&h?d@<--3gHV#Qp{;Lq)czpA7ddj<IvS^1fBAf#d85)O%i!Su)X+NEugYh14szqI2oN77e1O( zbN4^18_z(x^LoeRbuE%Y#L4&J21$WPP#kjI7b%p;A(ZmXmjf0L>~aT3=nPTn?8+Wp zxvd5h*Ms65jHK0MKRcR>uMTUEN#}Hn3X6)&^wU_^TbmFksc2!g`SZAAJ~HeC0}brR z;Ad8~Sp6gmaf4~v!%KUTrF~p}ny`>T3f8Jvq$7TV$pMZ^^!w{aWhp};4EBKD&1Syp@C^!wn-2$to6F|`tk*QsI z^~>5*b)qgiqeib*{6V&+RiUPXSZYE&DiazQW~?VlqD6qrTvznNN!pKEw>R>BrW-0$ zkO5D%%8~-|NXf1bMs-1(fUEfZAIA)rS#)mC6FO zqXBCvY8oAmNo+}#X&UH0oz5bxMYqZJBxcE92X@haiG@5o@4q~aDcN;`?ng_8i9UWb ze1fcvxX4Jo5uJTAdKbLKtB@ROgPu%#<9 zuGnefQ(=;m25ONxsJ@Y;3P*akLSwSp%00n4VFjUTp#b*flDAacN6V!}Dma%ID7jr9 zp-XJta(SgmQLe%IGY0MF@{p70G*|I*t1nGb;sxj0b?!HWwvluUDFFpf;@39`Hf(!# zJotm4xC2u4Q@bOTjdb6q>Gr8=bN8AT*27WqD>LczS(^Y@(uP2Aok8;SBUE_VzDLqd zX-9@xyvKA(R``T8XvDfW$6G6yS(Vga;!0fK;;HBZ#@!KFF|i6P%~q9@@P%h|TzeI_ z)1X(=Qqsffg!~Ad)y3WIPaM`YXEvRUYk>MjnA7e2L#I5_#NU z&`o9*uBb&_%`RSKFcJ7WvUNS^k^e-jqpoKr^*I3$a>F8wGDTti+fxl#dBGoL&W5vqL|R~j5IbMuscDVRFTGGhI?#eEb0!^g&RAAM3&*GW|C(=u;R zu=AKU)hjcm09cUyu}n{6<&>hCihidiX-qW7l>?-x07;rYa4eN&uOd1iRqZR4V;U75d1)wX`^M+ZZrCC?8Bo9MPfoBAH(;345lb1!iZhseZ2)A}Jo zrtlE4oXD3M`2esMQtxH6Vx`J~G;GIzhi?6+ z#H@cw1th^C_g9uAs_|ceuK$ne)<3u?|ATJ%U0VosUD1BmhDz~22^i}7_pkg(TLIfwIhm4|Fr@^T>5XvrT=DA6qotyAAbRQs$Kz}{v6i?@A|gb z`CeBiaQtm5TPU!;WGwOjIEWpDp`=#@Hg zB{;X|4w3WVlu#=PMu;m)u};88p4BPLl(@CT8!idbh^HunNY*BRXsV0(^d+&V|Fm~ZmVUD5z+|#penu`&(m=@~mvD9-g!kfKP z`0f^_qm%-Ghjm!LBZXVVFro^ZIDvdd5lfX(2Xjlcz^T)SRXJ!|rDA30n=I+dkxiin zIUf@*iZ>24X;q&Ovv)sg$_~ygwp<1|QmzSqY-+MQkoB&RuCTeK5Lq*PwX%AHB@yZ% zU}OIA_3>S5Z}Tc!`xv0hhLp=l#`F=L1raW{{yJQ@2rEU4seHh@-}A{`l6IAvW>htBmk#>&@%r`_ind}=*8Jz?4Vbu}L)hETWz7*lNa9g} z{a_jIr-a2z+<7TmvHIYpyRxV+_lUiCqi8@=1i`j8F07NtJ=^Hf=t6`mkllGU+(kx^L;E=)k=Iuuw)q!#~IJ9}&UXd%RL%H6Ic`)hpI3(1_7STqP zf$8FjW#cTRM0@7cxmXPylNXEFBqBW4Q+o|l>zHM_i>!#%p2q3bZ*rv=*+3oqWZW?g z+(0aN!}_61)Z#)HaTzO%`@vIjSV;rWf{lmDSE0tD7#O8>=MR&z2f8VAnzrbvV*cKk zjkLQ_$N_jbcgW+k3egOgn;VHAJ-8#&bd+|~Jgj}l!#pkTmi5s!hX-N8SMaR5ffh`b z-v;bGM+(PYX?P8Be$pI}7iknTx=Qd5U$Mwfqx>mJRpbZGQ~(gyyp=_S08(Ik?;T|Nb|EnzNnllB_4)QTiwjqEDk zG5CB;UcWM}Pu(Dobsqr3Do(C_ELc;JB~FZ^;09e9m2upBs0cv;-2Ba9g;po+EfVXP zkAgyEj9kAgFWky$D{#-d+~r(DOG?`r5i5|k44}U_>r5rX{AW}WuvFj0U}1fxYg`x< z)*keHv+J3emL#8~I6(Dm-fO1repO^@w@u$&z1`RED@B%Sh~nO<)ZBe6*s;OM%D3PZ zcW0rX|Lz!TP{v}dRdCK0>s}N6kT0S7;7hN7KGuh{;mT!{hN%dIZr|sy@p@I+%3%K5 zE)KQNt7(8y^Xp2MY3E#VjjA}hxA(%isS{g+@AyQvWYitm=xRuG@dR&i6QKR)hjavI zg(s_vE1B-J{g(WypEYb`n0M z()14QW?zfQwPKlsjxZ#J8RbU!)I7MdcF#!4?PY&%A-^4^Ygs#sS~2KEiUKZP2c_ut zrgm0Or@q`D2_M`ywiTCkKz801W(sq*TJ)`1FuPNAA^Cgq^5)c4148tI`O%pKHUI7B zj6GsGY$j`F37+_!m4~S=qpvX!EFIrV#B0`<=X($GsTC^~c>eTY@&vr@zO{DuDf`Dz z&$Mix7Z!SoUmJ1$c+2K*yBb&HrTs_9guxu3;BW=a87v#b(lAsXsxIZn(87zK>Bf7Y9T>jC; zd#C-40CuDF=Ra@C`#mX+>@X%-+L_V*35+Dx>G9iI^W9P;f8U83w=CiNBT;0C-uoL% z`4{CzP0kr@mO6aM_BV~(w+hge1>}9XgI}J$4z^jy39PBaD_JI@XZ<4?K1ZL;Eo7{MBfVY@26GXIDnCO5nt{X@3 zAwXgYgc{_#l+UWzFpOmA&i!-y^v%i~CN&nN$ptn6;Ms9uRQ|Z-yb|x2_KjNM z^L!|KUfP4VJL`yL;LSNyvm;{Q2Z&cSr4=b>Psz}gKy#^SD?W@puYhrTZ66!{5FnD} zw{2*};x9GKC3kx|qRGagbT`SsvXSh$lo@w=J4yT0P&*24`ayl$ zgJM+oz>Mrbg^O?e=25o02m0;SndBx}u)1U(#wwI7nna&nkYgCaF&9^UHW>r9Oty`z zwsrT;y}L>Y0+@jGwLx(&LEW_!RK*nf_b71A6h~)m08Co(?q=QN@q@s_qly??+^-^8 z87~)ZOiQ*w$eAID(3i`iDn++ZlHa26W9=v@jZIxcEp9K*?LL=GAsPk!D6eA=T5@?q zQR&5lN>b8u;!q6!P;El3ea+VTTkQ*K4~xki+Yhzl2th?sXHPy2s|@liFYE9}O3MKxRysyJ1FB*$`c;_w#B(LJ_ss}Gwq zUvxfr?XQ$Yp!mHkJV7H&WZ*V~;b%v;$gqU-1{iKs(g9kn~aN{-r%~|CUKLnf3QWJC3;rfTx zrMxp0KjvgktD;@Q%0Pp6P|Y-jWJ9>}NRyy1k*Fb7D_&A9sBm(87e!5~&MInLGAm5Y zSr-GR`e2Q1Fp0e0|E<5_C9|%Nv)Oj0gq2e!F-dxteV7o4@~)-Sx8Q@^rHEaaK?swo zQ1NlyoTUnrI$qGPIh95o$vM0fRT<#N@`xVyDw1H%_tKJ+$?TKCw>O+f@Q7ybn4S zlDgVuB^Ks3u6`Rry@7Ban!~gTde{`oyi0nf|GB_=`>LnF>S>YrP)}raE%AwbZIp%c z7WM_lLV=bFP9#q9i*M3s44Mns#j#YTgD6#_kx3C#!e{Xb!pCce^U@op$(*XXBf(VC zlJ-=(>2}JtR^%N^IeYH}D~=>Rw3(@lL{WJ75qo->QJsLjVFkZHak;q52kGIjy0j#9 zyhr;ZxxsqP+OfYxH9w1c8WfeZoRioT)eNgOwL03L?IV5XM~7t`-1Rc7+$dP3h)o~( z(~}?suITO?6zj@PELu%SpYB2cxWJyRlq(I15=?|@jdPOPJ z#kg|PO5BDI&Q8UdB!yN*!m=;g43l8c=;=MYPfFY6%WcKg3bB1j=>{8O1 z7liL;7?^u0(yEHBh2JcWa>=xGY5qh=4$n_#bGZn4Pm}4Cg<6W(Fe^%T?6J*5L~CS8 zW5#Ouxv~_B+4zz#zy*Vqqha2Fv%~@;5zRKmzF$e$L@y0+%u|M!I_<*LGNvWwU}vgD z(%fefWC(L;tly8t3I<^cU~b1?*;AV21ef2QU`_i*FRi{k=_7w{~}1m#p};#_I= zf9s_jO;ouS;|e~hH6@C-dm!FSRk~L8XJSD*2695*6;>we+-N@Y&=PBz=3{-sc(}QJ z>n2K*O#gc%<}dsAzpHruSJWB($v^(S!v7#K|3OH^{~7C$`g`Bx-*rY(|E4z!@wfB; zGwb+s=HFKL_Y5d;IhlW%b^QA}qptrMoe?nW{}-K+{e7hxWx-9_z$PO!-QlYg3q{Wx zdTGuY#o6yrp*n~>@(5i=#s_4P_g7Ls*L_Ui*fiVYj{T}-Bvv;hw%!t@j2vvKp*SNL zuIi>aqJtzzC=o{%7I=<9Q;oKpLjxX_7=3U+XXcbt$WBd+)Xt;MGhd2 zxXY{(R^T?&t2eldNUZZ+>_YAxZO}#*;?QHNDYixu!i5FCv&z2dj*L-4XU(J*1bhO7|8s-0M!8p?58gt-h>j+ zrD-dV8kH~ePhb3o`dc^keai zgjn}yyQ&{~1mauiI``VS5zXKcPOH_R3_Zk~!lXY)hwReHsdT<4*}bgjOjD||V=NnZ z;4b3ywW_iT`4>al6QZw2arR35=wP9*eTLti9u>G4Nrt>?o>nq(GkZh_mWxbypaj>P zE|##XeI*H26dM=Smat2$c4xd&6|Hy$beHKToF6Yz@U~x8C1)(I6r1Vns8b+I%nzq} zRQhZ@TeYGs$Ip*Hnn#w{>~JY=s0mIeE3A-`LxHtbQK}(ZMi!BMFnJymq^?(!DRyW? z@mBOU!F(Pcqcuf(t2FSCzeymP*$t!xhX5g5jI)X$D!hb9W$DGc0w?Et90(zNvrSYF z!meApPFic;rl*@M^z#n_v4hveJQ?6HS~vy*m$T`O-VRN;(O~SuI@ELWBi#z_1&QV4 zX!{S!q?*l)U>83;VjuczlGNcZ%Tl*Us$8?nX!ena31(WBF7 zy3cPnY=~^YN%qiMXD_*@IPdYm!cEX_;4_72I9t((+T(l513q~}MHr2fD=3wa>GMtS zP}I?wEajz#Hf7U$pcrbxpp-!3gJsbK`8TPdv)%YzgnQO5RRr(8ToG+7a(rOWUGH?- zMtcUGs=k}g79TGtA+7a>X0?>w+YzdVWTuuDaMF8+yj#VkOBCJVWa?9I1P>jGl8-gc z_wfTXc$^g7p0TD9GL#tp_WSAVRfcmznHjxXjc#`PI8B1OJw+6hB(HB4^_o^7UAtwjodCu!CZV&y-RoGL+L(f)A*(6<*R79QVlJ##-n)yKJ)bj7H|k^ zJc^tKgiB_Dh!q&>3{?uPbA&w{J{zd^wtsrn*R(v3>1`Dn)Uejh0#mM!Y7CinX1TF3 z{NXp0`?O26ccm+kW*n2@ii&^EvG4f8zXA-G9lI5$Nt2jnROk{3K%49RWUU=(W#%@JH(aPjeFU4p^R;wuStfR$EU7^HwsG7lg2h(Vl>8zgN zX!m@~b(-_lG14)o(N?Dji;$FIpg3|bvR!Yy{@`dw?EWjp*@|ruPqNCd`u+8n0YuMN z(Obu-{<=I$5on=1Ud-cGWSuZx5(^owdND*YexG&9`JMrS8P|Hy5dS)O>lQs8ySVz}joJRe zySnZ6O?a?sGvh7od@LcLqVe%?*ADK|>(j=h>H;VA*Lgm?XH!3pO(nrNxb#xxt zk6;@gPX#+Fp9qC6Kl&qWD?#~{tKjSp=PX6dwe4nYY>rHSP|?%7%5A%~S0hq0SyLM; z1#I#zG{Z^M#x@bb7vXV!5YN+Q@-XDoVbHg-k?V@{og*f`9WGYlDk7klbaQ2Cz1pd7 zuKeo^dDzFiYTfHlEtg0afzq<(+esg{4`O3-A2(8biYDypDBvaWj&noUNOiRQ)3bOj&7TPKE_MB6{+zxL za-O4bpHV0MZ3X^tmvlx(^xkrtr{K;hpqiwke)`?=_MXw?nww0!T{$HDF?-2y&aTku zYQ*XqSZc^tM8tl$V6gmJ*iq1DzBAc42z`uQ3>(#X1j9bSwHJEO@F!j6k4;YPTP*5x z>>5(_>5mf{2K7_!&kfAXM;N%^aJOLuuXi-Q5|^QLtp+>UJS;pDK1$v#Ls~2Yzp5Qx}~bdU!Svwav}NN1-CdB~D4v zb&~|zmpuNM6Kk|fF`33~WU#j@(Q#xCk-XAsTP0X{=VqlQ5|tBvmu`F|aRa`oH@OL^ z5E?qB<#D9l715he+kpDeQyb~}n9(2l4kxiEx!TWEqdJSx>6GyONK{9?P6Fx8+qe}{ z;=80ZvbVw8rv2=*hu-Z;E&ynVxrW+8%4Yn8J&C3s*FcED`Y8$0c2JvZ9G?K!NqUUV zM_^X$i^+zJa)xaux8jCR!^zInRN28-?M1r~zLlLCl{kXY+0wX25c&9G^iZe~rC!~v z29@@q!9v~1me1j1l*AuuGITs~;wZH>af9^Z&)g1Buqc<7r-*#f9>JFu3GQE`6Dwmn zRyM{HB+&f5c%54v+gA3wEx-h+o-sf%LUhOxezX$r4n##{iNIK6jk2`ufAYf<=1QRI zd|mlbG@>0*P+e5fh%bcZ&D}DMp^6y!wtOp=lF;q`l`99IsYKiNNZrHoR4K45o~-MDc_IBMvfs znNk&267kQN{JeqbfgPt0RV6|xC8C7-*Y{pFON}O+54*VWsznWr9@#c4dad*ymn`z? z{py&K+D%9t!EN9>K5rkUZ-C#>u-+~q5b7VdlgP;!6T7{-`$AJgSUs7xzAXd4a!qk# ztL;5^3}SR_L~zX_ASb`Be2Ma4zEPs%wX#sXIWWf@B-S?H-IWTXgE7bkZbWpIU6I+A zfC_SjBnCaBAAfQhm3OF+>aG{v?Bn826?e!6(AlYfa8d-SaF?A*sWbvS7hM|B--@jv z>h5wRtRljn zOzblOFK%s>OxrJsWBOIQR%4z&yiD~kb2Mr0aQBv z$t`h>L^U!m`t0E-awd}p0?9|!$0tQ+z*tv(OHUIn2VPYHXVcATDPi`0ey%y7K)Kkq z=(vUDk&TF$y{Tsy`BC<2dNrwLhX&W8ocarTw*#{BEpjzNa&BPW+8=_##-xr9C8Rva z$Vinvup-j(zG{I&9cdYO5|v&@T?SF)1-r7*GLzP-_?n}w(0w3zfr>PxEWeaJf1$H} z_WSjw`7ENj%qvsJ^(H}$sDa!{i5L1#2_i3NUXOhvNSDtC5%TBaJoL3W3pRf&3CF5ss`}BZ4$s>Oyie^CjgGc-3ZL9gG>IiP@eTfvkGg4oZQvTznXc=-JRC}VM?OnQ+2LENZ=oLGzJ+DDC zFMJ$??to?1!g_iGO(_XHB6oXAH2?IiPH%=(x3N8moNJ|8kXxWnMK8HyNGL__tQq!o zsr@6O)t56jMM}%sU1kM(#-JEht=mhD>rsBY$AUgzLn~Ql)k7N8)anE>-F6Mkcd??) z*c#vM7h7`;N5BW#1COJN?1~lB8Ir08GXs+0(#XDsS$@Hu)`~1gUYAYmw^w_%C$&+6y8y55_@s6|{5pg;YW680<7`n;2^>9MxfpwI@Pm~)cN$FS1j ziGH+KK~N7C>7-KsKzBr2SIeuCpxcCsOS~k?>CCI(kuk|vm0mjv9v^DWaPf5Ws5Pt4 zHIL=LmZ_b==F{^pFQh`bkKE6_3g)`ICzL9j5#*iF^K`l<;52J^xQz znbf~&D?|K~$nQUA{qxDdOuQL8;u`&K=RD~6&Wv>I^BMjGD#8EQY(?JMz;xp*XTwRlIZVUJ7$mcBcq^)Oc(7y&C^+nGw5^xES4%3Co;x6Jke0!E zl4Pnjqz<61b4re+L$As7&`~XjCEDqeY`)uRpkgGY*FzTpIy2N+2Fl-xu?~t_+_|k+ z!RA8?kF%bs?E*>i76~W2O-S5^x+TZ~k`nNUB!@_%O>m$ZtfV@#*~dee>e7j&Dt)RM z321pFr~7Jrb<5Xs_pDy;1FE`?PELpWk*jqfa<_2!DXIZ6iFi{ET$W~Xu>UlEH>wsl z2U`nHGKe^Au{RaI*7yW~Vgcp!f@}2RT5e=FfQ8;}tk)3+{Jb575nim3MDQ3`9M(Ig z2A`bhaz$wD?aNY(Yfy~YCM0mForc7qmqd+deOO)B-b%Abi~w(Oqmd}F@7q=j@FZXW z2F+qNtw!{5U>u>D4H5P9qe2!I*bz);`X5C(CiFPsWR%sTU-SFsGK%8H5Q%qycHNI? zQJ^E=76Z>9)Uv9#KZE4R!O>`~Bb}c+#q#onRz2c5Hq!UA98N^ZW>%foD3b8p`)oU~3sy6pAar9;sD@8@!_g{hij z$@G5mTr3B$Jt$1(ltS-Ndr?Mwll3f(x~KS8yx)a8R{NL^KA-uXFOWQ~no;&6 zk}(tkAN!1mw(l#t_sm7k09^7K#=afa#T^DFVU{g0ip~2tYNK8s@-mtz{KYV%ux+P$ z1s??wvD*v%ZKYW1-i9BArXcv1oG><=Ad>?ICfO=gP@ZgP9}hmTCTk=r3R%$k6A23F_*Jz%5wuvsmDvLZ)aJfp7K zJv&j;24KVt=EI=5^4<(PUZs)A#BWO-{D{6eO$B1QZmMk>1DN(mafydfK0dc4EUjg16-C6>blXkM{g?i+SODKH%AWOe0G z1IFXVcm6oUO$!!B`=L9Qw}i_NA@uZT!6PTDz8kXV`u$Yri;FV`KI?1G;LvBEnBY*t z0YSRgWY})(t~a!lw0Cljtr$k}g8z+oLs~)*VFq2!(1AoaX(Yv#3PrAGXBvDpQDtQX zp%>;Y!bD|6Im!el(ICm|JgrtRm3J=ELPYkZB{an=8vzd=3g)3%RBaS~K|Wyl@UJFa zmo3>eQq8g|H9yOJ;&1@lWj++0Y`eI9vj31y`=~ zGt(2^j7iSl)+Z{Tq`|+6o$M?>$_uCim73>S+Nhc2$1;TWb;jHJLd|sAZZozAy4lTw zn|ZOk$PH_z{djR2$v%XNT7nh$sRWH9n|6!a$R=k@28_C{_0m#|O7KfON1>A386srv zD)^ufN=Rdb*We`XWA9bKog=_T}4T7Y5ojoUJKDFNwee+bAb#5b(oLn);zE4_Nf5?XD* zOO6jeDRR55V}GMius9O!Bq3Ew|6+lHPe7c*qG$5qHwT1D>HaU3m$6FlyoJ7J#5g}& z&^BweZ!DP(=dgt>o}~XR;aSyEm_`m--AZh$EuXiKGz_q?WYyRm{o1cN#x7TmB9U7D$F}|oA`ugrWnh=~5t>3Zzbb3%s`9S`q-cwXLLLz#d|Zih|%UHekz?8Hv<6)yfM z;iPcByT}3;4~4eYLG!v#`liRi10naHm@Pe&S&!Q3nmnBOY7!$lPK=>m2ztTUY$dn; zLp0$q*etI9%|O~4B|#VQ$8R&s*>4ZA0j7>Ww2nPzGbPT;tdaJro_+KC*&WHEq-dJ= zJnS~Q*y}>y*BCnU{kqqiKSnl~x2rGSI>PE8iblhODa6Cd?)dg95K5QkCLqL&oWnf& z!(xU191N_(SGInrH;pt>BwNg>PtqKNusfM+p(HvqsRPCWUBzr%a?63 zgJiyu{>t8%yDC{iT`>ZYDax2ZU_zNZeuCU}8kkh2?CN>_wb&&5p=AkD-pJ;O5jy8U zULdx~;;0$e+k}Y}1cQ>o+=R*8Laz?Z(ZC=*BCd$BtA;3hCwGzbp13}D`7{#ryk}q+ z>FRc=SlBSh6BiJ_L&x@-i;pV$W4vu#g7+YKNn#&#X(Izba8x0X`(WIyd<0)!>M0B! zTy{&d8_dE31XQo>tL%LrxSAkm`O?$0D!D+ zS7d^PZ_xC@Dycq9ri9p2TTN}8vgmwfSs7yNzj=@NN3|i@ZE~_zqC`fW!RmvI=eP@D+ZcsP1B;tZPA#t9Qhg0*aX}7Z~m4p#xr#sL9?Mq;f@b zbf`?wt-;DmRB-+65u`U!+&_fFhY>1xITWZ5ZSBLKNuA_0D=3uSz^t`zo>4nK%a!7B z;3TbUWtKPy9C8Ivp=LR7s~G!@A{A+Bq8@^5atsHr|zxFC!oAn z^F(cy1GV&SzstC)uU)TFIJR3ik%z`h^6UNgkimXF0HN}+00@DD~8UYC;Oie-W%^@1~nrV>bkR3=aW z5=d{fQ6nlOW;?vVNMJ)uVfCadQ=}un^C&vx+lNAalk7C@Kjh9B9D9m&;pT!IWx`V( zeGWkdyoP+dc8WU|=VO;YPZei{<9>PFy=gXZvuQQ1z#A}JH`@4J9zynVrK@G4Q`3D} zdxJ%+1phkz8&d+wNgeQY#EgEaq>cWsC^H6mF1(d)&y$WNNQ+Q%BHV`P%m^SI5<2=u zcTs>`Kp_3DnzsZ*^+ynZ`?B4r5HU8VM6)Sb8MU_e+fm4poOLICknpm`HrW<5vY$YuBdLhCJ%&|x9;!C;ex zz!_rN_gR?qYy>ul8h$5I6VHS`r*UXg?wT_d5i_p4$veFV*U(~?lMCe8HN zi#;Sd%NXaj?7nL>ghyqu8(y3|>A9H(UHam_sQVHn5WlXM!rC^$Yq%ZHp}t32Co6m8 zqp2I~x~9WT;HSrc%cOB?q-$~K4&n}csZ`|e<*s2nEx*^@kOl?{J7lLs46uPn?&CU* ziE9+8HoUegTwWrdg^)#WD`3iorh_xT*+D`;+BGJ=Of^O4u48sppxrh zX8X6uiulOnIW>}8ut5e1zjSSpU^I{nnI^VU!>I}-XDZ+*hyW2p$JyGDbL5Z^Y(tT| z;36_|ju;XG0*=u5*aA8bmq|1cSO*w{E_*`la65@|)b^tFrmg43<^|Ft+YJ*OQ;fG54NPO?K)^dx*D4?j>4l~&kl_!KT3F!?k% zJSpgQ=7D|@01%IFdoyWCX%^;exql?hi2n(`4+kH3nR8np#NVmQ!eAZD5M zHm?efRQrNwRbE-d6mN88W_m@YC=X=oit;uoMAOb^CLub;&6Ao(BR{3JQhfG#6pWC) zWGY3P4s9bkghO~uchv_`>T2xHri^$@`l9j}zNpJ4rVnS-KwA~h*~um0 z@#<%jUL@9UL0%;jq#)tPJSLS2W&ueVRkK_2HqAu+JZ!%vcgfhQ#ySqGQFB=q?WEVG z01x;aFh_AGMYzShvGsA87;F%=g&M-oo!Aq5UF`zTH*3x32s+VBo>Q zQz||coLk`{oW?a6-7H`9sA}`I0+gD|{(`Cgv;TMaOG)EzUwQ;tj^?VTC|8eP9X?w; zRXVX>5LZ}I>qk2it9vWF51dn~HtH^hRlL(4$JVxb67D+JJXubUMeR>HVr_iC*(6%R ze>Pqrd{OTR08-r4k2=|oIa!GQ%)vLe9|EnT$$7sxUU=Tgnra=1)c!>d9QXU=%6Y}a zeWhRhNca;6ov^u7^;^F~qNd4MpPeGm75Y}3MK&2{@ggLMWs}Ajyri^VJSIiG2?n*l zQb{}{9iA-w^=5^B%srfcm?a@{wcRR$PkkfQKG5y)a&87W9McriE`dhN4JXxho-0ws zPh3_{WsWyBe3G=rzp3gnlxcq>5AIPG2@Ch=Ei|fT;a?~C2ipnE^W*z|iNw>aig^kH zhutMUP@{!7 z$VC)(kYUQbe{1x5fCwP!%{NlA^x|W#!O&C%l12!dz^3?M%Mrs{jJ3u0UxAac=T)em zmRLVeC-R6%vM^qo!1#0<)toG+>rkO(o43W9`J8_TLQpiz zmBB0)ybDZj=>L4HcQ1#FvQm*hIOSPD{e5e#ec@`?Lmtu^HkOPE>`29Efy={Pm4sVp zcaGnJsP>1?+{i*BORZj)3_ZBT9|j(lSmGh?w3&MKgr6D|bz60{i{t!PEU^nyUc4^| zKP2n!AbefSS$mTy<2k}(Zt3RCID;i|V77Cvbi?LPFy6Y}SL}#QIl-BV(vJpsq?{qf z_obnbZUi%+$v~O{xaCT@Rt@DqW;XJx+GQeJY@c*R-F2tNH*FlAIp9$W>lrv)fk{ z8Gp*pyj#UyEbn&}wwEFe#fMQ<4{26Rc&cY(f(u{S0(b`U=deRTrJ1L9Cmd}vml9`+ zs`@E#ZMB`QU<`uu$G*vuEjjfKTeD?}WiitQ!W%ze3ixOuBa%W|)iM3xurTmtCS zaKF~i^W76b45;&MxHZ+RsN;8YF>XxQwMU0uhTD|VYhEKq{y8q>A6dB%hIa8QMH)x< z44#*K%X$hYcBq|h>z_G@z0dCW81QEZH%Z6rayLWqE2(1^yWvfhhI<-15|c7E}Q&HloxR7s!Zh8JsEXgbZp z9S`frJJ9qYcbywvVQ_0psOCGsfT0dU#FYYYAf7Ia&zjxv6>(&3vh8b2j0_udH zJrDRvr)xtEy_!F}Q4UJ8}PvpS#Qa@$h)MGq$e`D2NZQz`mQ`iaV{0A0*U)q?$NF0!!cx7tEq z_|NzlHlN=i$rgsIM`&XWwVb*GH+CTAAFFjfi7BmrOZJiSb{86-dF2jP}`aB=PZ`>&AOpdpHu5o5N#(1Mmszn;taZVlQMklC}Rd#hQ&_e2)x`&bGd z9F0u0jRH;{Mp#V<>2?`h9`fZGd?YmUPq}e%W)oUY_**tfZGptl$IKT<%ZAb(5(g?g7@23aMAc!Z@`{ zZU4!;nW%SO1~wm1QrcSeWxc@p_^%LUKgaqR{HGp~q2CR9+0-^xS!u;mT70xF8O9|t zf_;r^n+n+uQx36GU@jZKW1DEzph?H9X+3x;p8(Y$u+46af}aLo`xLaX5lV94S#pbh zIxG+3H;|f}z4^sd^}u&3#DSav0G@c>Q}00XaE@XIK!mNMfmGV3?oZvsYbjAh7@69G zhW4=fT4Y*1zbFhpQbfHI{lq;zE$HVw)*B5{`m|OPxBOURmc1_{bQtP9`6f9Z;k}u&gqi%J$&{abCcwQ9bh`~x9vemT#&up zwU^}&Ei_DOQ=hZqu%L#iMfIO0J#vSx^5B{}I)^;O&che!uDl4F#}pNCUUzo2v9ADD z-D!0?NN$f74}`}|xb^|$$WA$05lrWIyxrz6ymNtgw`K?Bs?&8_^SLu=@{C+tgJegp zG*ytMV>iM`3c2yLGH0U%6cqEGwQHtOhd~*r*^pK!w`+2FO)kb`6TsJhzmLSiHzeh=gZ!?^^6Qy9j7cwbu5HD!gT^|Q>=;pF-l~P`V zXotOrBoA;O>5nn%C1J299(ll-R$5lkkIXGc8Sf)Jq>QsvZPt8F_<%G5B-_^gx^9CG zd+WlUBzq^>w7)H`zIkLERc5^uIwz818As%SJ6c}u&z5luM`+j>3s3n9{sr(!9Fi7u zDk#(I(C3Hg0cVku9cjy@pOsREeGCAqB87z;EEHyo6jCUd&dX-{#zaOv(j4%K4dKZ1 z)F4MKq@SHf91kO%mFa%d%8w%yOlL z!{)HDS2EWg$1Y!liJ{;`SbR@VT2=h8llJPyp@8A>60RrNW>eI!of=UCsl5)G42O%8 z35|Pdiym#!xzp`^OLe;R01YS-xj1#L;wzP$E(`^-T7VZ_J|;=T36k9D0q)M)l z(EIun;v<73f_ci%p5_xB1R87sl_!}FH_n83QZ)ATE;|hp8z%b+cGZdcQAX1G;W-;W zmuA_UM!Y*cxE<@FqxkQ9iLH~IaljOg#>G-EiSpGBTmH)ZI``?L^{^`P7>hC(A zzZc$8f3;@$FUP+l{#LmE+rsXij8=oAC=PUsZaaRe8{hVSFkWVgL2Zozmz*2d986eFVI00gB{ zjlkEu(Y4z;C05DvW5N&)zP(Z6@3Og+*ktipkS%e;Fv(4e-hl$Bk2Kf#ZPnr#Fz!QW z85CCrrV(jdQvIhoh!!L45x{^+jIqMYmN0JMfhuaaVmU*(Vp&bG6)t$cTl`*8RV_YU zs0~qaMo6QJFccZ{^GKlUJJsFf=|6`jG1VV(-{p)YWmV?|kY+g*ry!bb;ow8Nclp4I zD@uoCcL17MMRarP8Is5-LJsM+JS2CUa>}7Lc{&+Yo04g2w4g22WmlVeA!M;;C}!ae zOQFZw!^V!A1DGcgKZYyC!WYpJ0FLYkg*X%Aj$xn*)~8$D*2jZc*~L-l8jv_sPY*yH zVKrCL+8>F&Emn$$BHz9%HGR``H{e6+jp*aP3hS~N^G6sUpCh*G~WU4-qM2#(u^6*j8o3t|)B0i4M_awboJ6F(~ zG^*bKgciU%mv?^qHNcvbfn4&XZGN}|Dl*?_`$Hw$Uo6)UsTgUQr$}r8MkVh?isNLc ztd|3|f>4ITd;m|ja0Qj)lU^T-GI+eIO9tF2Db+K(rzo(Y#urG%xlzwQQFTRO- z-Q7n~>v$sBRm4B;*`R2m-$a<36VL!bO?~>p4r1vQ7x8cz%90xb?d4!NKu^Y9)K6t( zNbYQ1{gHB&N>%<{Z7!cRxzWp(B3G*f>N=0px!13{;O1X72zpkz!(uKIExT$M+vbu0 znaYnVu+%pBdi=dy#nZt3XOL&R@0XMJqXh0P$e!6!|E6Ct(bK=xZTDc;Cxb?HP`cto zUNEz|lepr|qxdP7?0Kxoz4jJ=FdE9H+Ma)Nc>ap*a2T}!Ry9dzy|4QaAVr?bGCgxl z&Hvb*9BX9!4l8Cs%)LVrtDV?AaxZ+8y|y!8E8|vAUGUx+w3OzIN)0Na+ zcFUM5inhRiT?kDJIedF5oE2)~kbjs_r~bJek8Q}6UkE!vmqq*dSdu*Cx48EHVrC;L((v((`p+LYWu$==IPt88kG9v09zSaSHoQqtFk zIP8L&^AFys@XZN{i$i1bUt$4c*(6eLy8^k8W)G;^5kRPk*?WcicX{6J3@D#oqjjCq z70XLUsl}T+*hxHT#1_wjLK`?~+thha*7_+#QA3F&_K3&Ys_MdJ+9WdC32ZmHn!~V0 z%n{EgU{G>@yC=lyhNgkB-Ofy;%PflZ0!@1veYHUeVnVzR2MxTV#oh%*VT z#%f%C44gJ|uY0t)Uvysu{RvITb4Yo`=D&{(7VsmGM9ft@i_voB30&2@zS!?fXGGoI zK7rYG*Jm56GIPx?5g;|IH8xfkO!s7-BdtE*;;)FLKuvTo|8!5je3h9kq@_&-wxQut zhS3MB0!IcRuB`eIL#?pSR8xik@hpj(nY#p*nB=;E{WPCdH|7<}nrt%=mI_6-${ zJ(0&XJ&J)@LHVwSelfgG95p7C*gY?mjMZV+*xb0;Sn=ydG2Sw}K`s!*zwXkF9?5*0 zXACRKmgie4@W?C#9!MwTdKNj)s!eo;`%~zdqvfl&P?)mjH~ry1Y~8gWWlmOB*Nz zL~BnYZh=R_G7)NT;u+1Il27y8CUnYV4}S4ZSLMfoSxBRe=nsBg3kNXV6Li9KzdImJ z29~k(XC#F)C_uCP<(jpn3)s}Mw!>$dSw1{ixcAhr&$a#F!QpV_#rr!o*2Klc1xwdM z4e=C-F17nkvN1Vz3F>-cq#;T#T=LKSa_|Q`8G_d+$ePe)|lq4 z)Lud4b|!#jQF&MT5XL4=)*(dc`z_0gRHYj!yiqP?Sjn>di(dC&RmX2@@W;1WHZoHU zH>2j9=n(I1H>D4byr1qvEkz*W-}a9q#4$9Jvxb>C{zf0d1oV3->n`GnO1WF%uvWO& z$Jx&1CGM3z1K|*J8;vp}@t3JHNy2{ez(K1WHsQ0})%S~guQpq&k(R-gTsXIu%fN$- zpmUj*R?@q|?^$w3$2lswnwfrdJ@YayAg(f+y{R=@$z9w5<72_p+bx%re%ekg8b8nOul(P^Ou1Z+kLoX>T~j} z-4cC@tr1rbqTjk?J*uikn4qf+C>JtDkOQkKI3jfmrrPJ0SzRnjZMN!!d8KcbRjT?S zI*)odOb^qTxWAmIw>)(~2~PBL7cjXes+&S#^I5e$_=;@tF$c@rXndmTE-VfZS`49n z55QM@RBSvJW=FFREpk}{0CaBs%$W&NbEC;U{i4CC7Uk&B&~42oa!!9|Dbs$N=2ABk zN1vv0FAH}c3wMVa_>^TF_@QH&Jzw%2stor{A`hM}1ZpVxa6qa|w9!_YY$<~vcZbQ!tccp+M)7pJQBK1Yt_ z%y+yA9vU{*5#BA!?23}Hoo}Zy$0y{Q6>FUFUgTg?Ihicz6COb)z{uL zNp5Sqvcx?I{9ft@K37e-eyrOVrFc&f)6N34v@39bles@)QP`GTqo8IO`dqXn`5;$w(4)z*j-@*eNZ zsn3v-EYY8XB6qeXk|HDQm|s_m9z$OUEncOrP{4c`IpD>9&oIYP9Z)4P4?I4W6wD!` z8ky@#(r1wP9@Z_$*dwLa;7`^LNLq7YLXPR2wX2OvFbThi-+*HHBYTvX;)q8?#C47X z=AfV+=Aq&lq0g`=AS~X2rBc&AXQ$j1(O%av?ta$RCJ;}bKg_OM*Qem{TND-(q z5b^T$p~)cvz~qA#-@i60hK#MkJ2W|QsQY!txo@;czrLh?p5t1_ZdkqJm*eT>EQbn4 zdY-42xOBHmZC5TGW&54fiWl&d9x|cP3P`oG>0BQRwSXwfNaK=Lx2G#qZGMkBW378e zMb~7N>7+TTkMel~@ipDOKw$vg?v2OmZgw183Now{jQ0``eudhNphU||Icg*mj2l}V z2a_UonOT>UYcqaLR5Ij=zmYv$9!1@A@I@*IAB8gOljH-CsPBjMOco|&Mo=A}wHYZ3 z5AjXx_=(8kFOklwJ2bnUDYSl{J$mXPW|Vol{K+i5*)r9PRD4nzHtlR^J7*hvTcNT* z+sb-0D@_u=aDqt;c|2!xWJQi5&(yg%ciCjJ_%p{nbp{59%hW=72>@(KuJHN?@<}72 zC=9fTlR+YWebXeS|D`|?%xY=;x|Tw{o|mM9%QxB{DtX?PkI|}oHg+73m3aGY7+kdT zuNg_J)-*FbopYq6O1=|y8b;d}JC;kYDW>b19iA{1gFS0NbfY(b7tI@@r)!Ao4>Skuv!xJ zbW#%6xW=2oEa^w5GBV7&bC7Z2!*!HkF7s7t*8~|G0BjUxUO=&?pGX6p`UG-KJRI^> z$@D>D-{fRMzf#4!BUN4s=0mRnH}Q#?1RBO0S_EsShK%HGN?I9ym&tWC4R1QbTjjul z!bIA~0iN2X6Kdo#d1{g{eXYVcvti|O7!0f_={_3AxS47FMgj7;TaGC~koKFTaF!qw zY`+wo%&cWAP!yKcrSmr-TJiam8j<5Rl!KjVK>}@U#UHUSvl`NB{yEq7N z{n=1dd}tZdtEdcrZHY0pw*1tp6V+JC@R7u_>|zqiLNU%lT{lwG0vbQa`DzkQ+2J#@ zaTEj=FE_+w^Rk5BfLx;D%3@Gv*hW%T-yip#g`Sj-E5kRW^x}dLz-^D$eqX;mE!Xu; zgw8lSFtw#>* zO=C!J`)jiTqJ}=A3qSa%qaWv%G(<|P#A`OxbbIN4QLJL*{NYNBWKC0_?h$ro)T+-Ez{<+#6VluXwyW>eX=?9jHCBy1pZ{oI6 zC!jv>>KM31C-_A~E1gK5a}1a!b>5p9bVKupl$7y)y-|tvp??2c((GCWfZT&Fc1ppf zN)!7X2TTe#N}SRBXv~Md!#eH}VAmNSvtu}Ajiq(JWhxlUZf~XyVK?%WEcb1*nAvN{ zclT)-+?v3N%j-`yG_)M^)EVwOupB5Ebbe$*+G#pC9j!;%hCL=aTbQX!qbJ*ZR+G~HX7MS6>mhrzO1Zi?A@13VM&+7E5Jqn|80b&; zqa|9#+4`5EfCduaqwD>jZ zy^ePKWqD8MAy#v$b4lKXmHXI=oTp!DVKOUPrNtC4nVCCwD`J(q@8nyWH%Ts@u5zql z$25qCYFKJ$wk)Mr^@dfvaw^h%UV7e=?`0w1#%++jU6mTCqAsG&5VdlNO7$!1OgLh-1xN}cWW1yr&^Sm=;0C_r>V=H*Ky>`>B#|Hm z@s3XxNpfuh1q7##XlEmRB2BWmMEBm2Rf* z63G~%n?d-*34pkT!*Ugi_wu)nKAmhNmmTYkqF*|>Gu7P;ARyK3?eCdS9 zX?Dl5o_f-4A6{eXy9dUH-r=&+)cEO%JQD0Z*pK=KJkCMZ-vy{~`{Ue1>g~y+(V{M) zjy5Cyv`3!$HbNVh1`XhC2jn&#DF^Mu>D~u0c<8g6B^W>7P7W%nBBf22(A(IA#^|n4 z)>CgK&ZCZ>dTt1d$yJU4EYD6~poB^kS zdR;x#_ycY~dwz#Qe&F^k)py)RW~--+EfLETzU-q(wXzs(zM23>NQh_|WKU@KCaIA} z&Am6(2t^<6{z}aQoV6s6IGH|KQ2+6){`?HU=+aYRpr-W!VwZGxXkOb)kO*g29dtkA zr_5MX?Y5HefS|(0^PA&NgFO$A&;xv4-+VWf)XBp5+=;}?K~gZ$sEC;fU|tKP^%Sw# zHR^KVD=LoPd3{ZUJ`=St2|ov&aFCN_S3l<=`9@C54@$3ulL8f7r=__rrw6S}DfPJ> zQbcH^)@_n5mT1^c;Kg?zOxN@zuD+fIOoWbLsTGH#4bxit1vh02sjZP;iTy_0d{h~RXsn4 z#{i*ftV8|G%?=g=1ik5V%`2OQIcz}u&sMQ#EWo+Mp1pUlF>p;B)6h4WL&h{r$TpPV zX%fh363ujsNh^EA?8jS`6{k(x!eU~*-~3F=uulmga09k`Bg?cgxoqdY@WP-1jEdvFq|S8G9PXL!Opm~zS8h~)_6Fn~dKK2oCR!ptk4 z!A?MNAA1POBj7+4%IlGAoAqfM@6nhS+z!l!&|jz>caFvta}hb9+arUd%Z@v1#w8QZRRE38Ynq_v+s$iG&!rYi{%NVg?^COse-s% z%z|#s+Q>TCjQv33P~0fpfaJj)@>^`ZePW{$;xx^YAa<=jsT#UU!9h7}#6a9YHN-6l zW-=lL>wAf?P|DGcC6#kd%ZM+-3&)9SQr*1Vc;}V|-X_}FHd7AB2sa(N_^!OuLfx)3 z4Fj~=Q_TCi2>P;Wym9GZYZy9t$o!iy-a#4CkqM95q*d`)( zrk3A+`^s3S48g(H6~lLiWQi-17(&JOYl6?wd_t_QjzIXNw^j+fp~qu^61Pd`VRr5f z7wxM|Y$DxpeS7c=^Sj{&D37!o`hXkvRnTKWbTS4$evswH-&XZy>4xS$c!cSigbKQ0 zHE)UyidYn#rh0nqg$lUooyl*5t#Nb|PEhoou7v3oI z+uSn5j6Zy$Y4AX|3cZ)*9UP!`i7Vmp=Kbk9-XlLSHeGJ^#7Kk`t+}C}EI8A;F%dRR zCP&Rz{G1Rk1!qu;I|G?v#|Oi=+zcrhp85wu8qJh!+8(xK zk`xyhbMnX^1If>Ss1`TeYGx7C@E|jW-B=Qu#4~Hc**_HYKYd2Z^PpUZXk@%#f9v@!xQS{BH%8JZN09{**B&}cOUMyvS61#B z18;c^ACQI7{x+n`r?7Im6KLlx7b=og*3P?iQLGt3_vwc4i=alth79-eg~#M|O@$u$ zjPfk%q>yAaL3E`?ZtUEqp2PaAeERuURr}x)@?c?ns%aDVnt#t=$hcDDfq*K1-c>j` zlta~cx0VFN9b@G(bAoCHmTL^8J}(aXUJRkj@1WB^#J~PAn;*e0CiPdMx(G^=UF@$$oFXVGcJaT0M za`^w;(BB{CuLv6I3KhEo;fw?A0)l-U*+u@C6}y_y zxAnXlp%7P>C|5uK05um|KlUq2Pihfe+rN#(uDn30Ma*3t0$l!xf{~Pvy~=D66=j!@ zy#o0D-Nm1y|MQEKs02IpfB1;RRfx=gocfow|D2b++QA=zF{-xyj(feaVnjV~_P9PfpCa6pvLs7NY_AG7 zg5VjYo_wN8Yojc}m9@_6pBs^Ak(GoY1zG;Vte_bOUXPp_@q;Fz>}_#4H~uSZ5510S z^O9ld-{^(c+-np|9o*!4cu@!vir3#N)jEMkXds?JFqwhe9x(A4l)di|F3($*$y+UH zU*Rwa$|hp!tJ0Yv24$+G=huv|61xG$aDj@@3E8bG0J4p#W{d%EqBe%W&D>3ysivZq z?z1D!kmM;ftwZ+EMV!ggVJ5;9ZzGj?$Av6iZ}m`{DOrp&e;;Qg4YjFIQz78i7obK! zF5w}({h~ax-nX#si3`LTV?UQ}+?{$`=*6pF$);b)&O1cJhrR-Z_bgrmC%Vp{7?ob; zpRr)Mtj${x+R0!jb?HLOe_)lGEytz^dLz1UW5f;%D(_DbRT(A0%0zPpY)VyMw?<*o=vJiF5~ z4p6a>;y5*z?wmfg8zfCX%cQT`~=OaaW>5oH(HPFaXJ5@yWxzGfc{)dK=ZChq=~gA<7Pl~io#U_ z^QtgkWd2xLy=EvW{B^hceq_Bj4}tkrU4IFQ%CwCWYv-ryugW#29H9Mm)mQEu7~7t_ zPmKpIAMoa%B-nU5(&eRjsH1hDr^A+G-VFc-R1>*Pns_Pg6@l%C^T;)LR)Xb3*))}o zc^>(&u%DZ=+_*Gt&@>DYj;r83rvfp$jM^{~i)w#Jt_wPpP zvPqvSns7{?ni|LwU)hW7dX4z$lF3X`}SQin? zKutU(&H)epRY^C$6LI2NiS z_GxUi=EjjDk%^g9b$yyh%*dwAy1Wxa^SgLi@@~FtpvOmx{pu&F6VW!d)WSXV^1O?C zEAn7}!cYd|yvr!l%WY>p<#uViQ))wjA^)M4Yq(zg&1=N-9_ul^twCMOlkBcm*h&s| z3ZIF!EX`fXu_hq9B#LZ%`W&Lv! zj>{oK@@aGDLiC;4==2MDa;uQ%@xFR@PTwdbC9=W$Dp^xQy1mH)hB$jZ8L+7X?xcDu zv+>!0?*+mMNz_tVnR^e+LQKmimYxg9J=5MXG1ac#LFJ$Qusn#eOrtS!qwnjZj?BCj z8^-`?1S#W}IDI9ja;OkEkA&+p&xN=@E0If%tiTUiz!k55)Y^ENMy7}QqMU9wjOY?P z?1>;MbJDZZYY;nCLf0FzoNJB?^$ud}QY6dMUpc zJMK#y8}In`b9fIBRcf>yBc(xBCS676LgkhQ*@?e-m(*Izsffm8ty_O-_a>MlxESon zNsD#I>#Gb~2uOa^=stP;pcXs_z{j&T_MQ74!=3D3@V?;}c>c&`Y%b=cjDG1rf6O6x z2D`5`)?9yeOZ}rFW%%B&o~sSaleSR@eo@yb$&JY zgflhEG$Jm&Q|S6>EZXv;7tz5QX;SP>-QEy#!EhqsP%>Zli|4?v>zUp5q6XL57V2U? zhRd>#_33(K#gC(s5o4*vlZx}5PY~B)MJs8dT(l^k8hvfd(1=F7-5pv~mR)@zYi3%J zSi;2o%hJbVz7b(N9Q^c&BVBOT3CdK;(mKY$W1dhSYg>u2-ftYtikalB)}~Rd7GXSu zCC9`fAii9}+(k&co>mT!X-f^w%!ALl9`ZVcD+1!I#x9wG^PX#abFw*zoDm zOn!iNV~zu(t#v$_b3s@#sqKaB7NjWM&a0&1RZ{K9&>nOw+CMU<^;y{XQm?GD?&Py| za~cx_wUX9}EB_Tm!E@L10XzSbm^_n_fm-lu9!rS{E{-iXy19Ly+*6Y3F4?qN;fasi zOl>#kOZh3ptk}VQ^()*Ii92^~vr_3L*?R>QLS56$*Dz4x$B_<8b8FE$!#T;GM=MNu zZvOqB@6Boo>AAKJpSluEZNl6-R>J%hrE;QEoeHSm5&KF_koSm9w?35Tefc2=t(n9w z8U65@8-lHF{!D4b^|3L|4S%a1R*;CG-WY2Yf4=L_7kgC5nqFpbBj1{M+V50B#i4XUmTyTo6QSXXE2|1qZSpHYVY;dqUw*P*ETJ_&ZWEZWanW-IU?TY9?LX7$t zI@fQoRv1SHh=*8n4sF7@qz>TFY<7}hO$4@1x8d#vu!8%^9=Y_{!J3y6V^y`}zI!oI z1IVT|yU+&El$rtK!NC6Z=hW>Fp^$5{MzZoM`E5|e$wjm{Vm;&Hu;pXo z--NN!kv+(y%8EaQu|$|FYk9lGB@U2@U=(*G&W5!&l?wCh59O*@dz#xGR5sEB@txHX&;RF9gBvz!n%_VZ$lkt6!LwQIpRsRu9`-s6<(D^I(ISj*V#FP`0a7k6q z+{?29Muu9hs;8jJ^?0}VIF4%DTiivx#TXg*$OA^1>1GD$R0A4^VY$PpLwLK7%&Jtf zMA9o(puy0h)HM-k*_Eb~>LY)Oh(eiotT>)GRsG5&?G1NPgj-={7G(Y~@G&Za#_-nE^Ncag_zOJ_NauD1^R)%=(XEBN#iyWobANJ7+g&Ll-yA8_g z>5cNQBuR8Jkqe}By?JM>SI(!IoaM`=F-ll5&`LjN3w(d=aqEwvs)Iv!vC-G2w}2_z z3^9{gBPGge!`pdviMHB@Qk$P>yhc(PPtc;tXLC~{n5u#yW|2)vnp0raYzM>pC5hFM z9Un#5eywc#nDqO-BiaX;8qJl$#+PVUDY>NTkS4G=+hCc)C0PZ+A?TqI)99q0T>tH& z>{(VDq-pF-docWhGVx2oXqg z-r3ukk}wsDF>L40WcMjA4no2A7U-LAJ1y9~eRRK{f#D!cdLbnP08cz1$P=jEkiR^s zd}G1#d3Nh33-H^Z?VXG4P0Kl-l$!V(7VivV2hatN#Y9BR!-F#qPj^=5KC0v!SBY5~ zAy4E|M+qa-F9z0iw6n&l_nekdgj3*HO;L&5xw4`DSW?*3_inW;Z8y{O8|a?0N&ibL zKz}1{_shaU$&z(VZj;i$+%F>s(nsFuwKp!yZgX!lSe=4Z1+tvU0W;~}|v|E-*|IZ(c z(cCQb{Bt7vPjhd7R2=o(s`1(eW516XrnYIt;4JPyQ&cu;7%;2?8R3<%ic~KnL z|CD2paPv-NMPd@aknW9(koz0lCP~W0VuP{hJ9!cs5eOl1je0{4G|~_(w)O*FEV#Sa zp@{PNWu5&U5^Q*yt#F8LjYbuIA$ARvS4UA6#*^eEMP}%g$(eSZSk0~_H>miv%03f^ zGeaKvsbZ(_9Ya%x@9f$HYO^=9)FX`8j4^!bJJ;0~ifC@;X^I%R8Z+)y3E)JX9>*zu z73y+1;fZMujp!#Rtt~S9b_H zjw9E#CES`agMC$mG)K5bsK!7y;`f^jZa2of11f$4f+#F?;%Q)%~a#-hP)A(@HB1!p7? z4v_9Z+cKvSkK&<#D=Ozi{si`>o&#F*rlBQp?fs4R@2Jg0B6~y8k;V>DKZroVR6xY# z3x#aV%lOMx|Do3Q5k4mMk#7&4QkWuh9GXp%eXOanQ)zlt6{`0~6Z3>KN=zxUjUf&Q zbrF8~I&$lcst#o`qh=N+9=dNTTD}g1?|ip3hK6(!b`{|$2#QhR(J|czf~)QpHUZ*a z>LP3F_{Bn^Qr?@udD@OEa@W~$dqb`114%``X3sQYA+Spe4!`DKbv$JntLba>=QmR* z`9g)Aerb?7b5jn^MX4w8w#D=!gQGlBf^v2mJ-dB0fvlo88P1>2g zOgv#`;<^T91xmXChWe$-arWCulSRnRR+rqo?@r+n!~83aG(U8MgkF1GG>QBOW*-aW zd9+xoRr5$z&+Mi|aKy5?O=7sjs-$XHP;dt=U$h5I^pJRs4TXJEU)-wX*1f^v+Cy{c-!LQ@! zV@20nR7%C;w@3YihjPPsN_)4>@T=FtKn9yY0#-)|GC6)|hM@r_v_h(st>n=mT z&t!%AN3)QH@4~!}-Z!4L;+{M?{8ZGZl1u8W2&r4A$nSS4oFiJzpOR?l z9m^Az8qi(23;^nf*f}nb@O3+8F$Sy1#s_qnS$UatP)=RUv)JF^A2g9ZkuN(EVxpZnKNel9`;j(>5jQ4@ z2)eF1X?-{l_Ky07$Oq zk67S#n?uT3WTab;sTU-eH9ya>Vxjj|Ps6sH;Q&9*3O0Eu{k5kLMX!ujZUCx#iVoe76w2d(f)4vmMdx?Z_TL;v<9`cyc@iDG@V=O?lu-Q0 ziKsVvc4=sCpld00U7`S+&m;sb!2Lk|U51@yTo zlX!JpqU2&(OHV|z;nwY2RU|;4>8fQ7Pfn4O_EJwlK;=EW=UH~_nBd605}z*3Ydbq0 zQA(TKxg$2yXJYpfOCOIz*%_O2Kd~XV{lVy{n@UYaP96C<1;OC#5nYKxe=S0~a58_gJ_q zIRQUINdh)>TT2=f?Te*sNE&d|tRpFOFIz{;ksN1U+1|X_M@aD;p zLO1r&erV|CAPd>p?~cu$WVJVldZrsA(8+$>j_&VITx;2NJ0ZBCl$~xVevBBchx@5f zd)mgUx_8>iM#42+x+fddRPUvnHe!ef02IQKGQxUo>|?6DS^aWqbtaQRY; zJ)QcO|-|U4=AGY!WnalPW|jw|9Cz2yU1fw~li@pdh~q z$*h*&?3LJ+$f*d65c3mJYkt3X(+kjNIG|27K+j`$p~SluYLdJwfq7A1pV|n4m=t5D zG1{0Rk18S?@%KtyTQe}QLeKIObv-p#h@_xX-5Ofce{aAJH(h%SZVuUY1!!+|A@nFD zHw#lYE7bfW{J4Sb5u>_$zwc2^>e}yEQ79DaM+?r<5U$sUV}`}2U1sR6%Zlo&7|hEW z7wTNwXiFNF`CrVvXE>aFqwcK^#^^)zdyGD#cY-iR8-vknMDIi=NTLo#?=3|)7`;R! zMDLx5h=}Mx5G_*fU&1_KqOG zxmM1;8oyXT-iX%qRsM}FKRt2#+mX*-$31@o#{wY&9HonKA?ArN2au{PGpZ!Z z8k`0n+)$x(mBHs}$`o}w*Li`#gr#V8rH}T_)b1MAxgG7U93V|{rS+0lGbrwEZp;7J z+D!pC2@xcc1RkXTX2YxjixT0{Y!E)=9GB1cFHJ)@LgA?Fuvv{ELQKRD>zLp77 zMmYh3Z3s))^t@9`8^tJtByJMqGak0>@@Gg9?dOy}MxGc51nI?ExrRrjX`lrrsRIOQ{st zeuqQW5Sa>fT-TY%LL2szgaNM`@pU72i20Uife{x>8dWYbDXtIbGn#4pD394sxs;zj z$#xSZrz;zjnF*}$JxNYl_P8-1wt7G`%d~Y`F`5#f&vz|rFJNz-A_?Mrwr>28%9NH5 z&L!uMoR32+p$0GB#zvIAZOD9GNJB6l^(J&n)SWzE0wTY;+Mp)MDpJK{dduii$T-~L zt@>GgwrA_EJ=Wu&ZP~En{P~-hQV&3Jw>gXp|lA%h3&gGwt78Ls%WO||** z{zh(I)tgs8`I9kv%o%Ke6#CW8xigJNgy*F`Wu+oUa`!Wp45febPg)|+cCZ2Ktz(AHqK(k<^A$3b9xz^b9(fT_XnNmi2O zWeU$Ds_mP3I>mZHjC2XE#A1@=b>yaOM(X5=5+%^Cnv@q?{@zH!E8YR7rzKK>ZcBei z78ER->beOFrb=MXmMouk)rn|#h_){W1|!Ch{g!Xm!~C)xG${VpXBaYJ>|^H{6dq?!du8|kWCt?$sm+dNGedS zAe5R#m0G$H3a)e%^U`!N&^qVhn0Y}DsARMmBX4IgcaGK*nm4WVGKNC7*I>E{hIq$LUj z`QW8`ZZw!setbw?vtu;_aWu!|{0tT_coXq$c78bIPBEG z4B;NELNuCO!%IaW3DKpu2}3TLCy`K;hS z)#dSCcNWUhX#-ns$3%7BfPZ>pP40XX96V=lgNPxVhk-4sM70fa9|%R^0&Ywwy<)5^ zjQ--=hQ;idq-Wkn3aY+jE<6^G9eUCslefUU$YAYL_$JB(*>kIvEYN|vtZX2^FjLJW@3Xii+jG9~b|0H2M%XlL9C-c|mi^>!=QV4YR_ANK z)Hl68yaw7o*zz`!%#p&IH+~F8TP3RQJZV4r2GslQ2geYaM~l8UMv#n9%O*bI_!WQm z`%`6!V4PFst_e`8!lUx z-p(fjE9Attn_eAGDd#_tf_E-Zf*<+N_#J>%n%~;;w-o}bN|gw4KW|PAc|@QYvr0Ug zZ`KIw47UaEij2;wgY~Wgq6d)y%OM}RpS>Jz(p>i+tyUS|9H`O=)Kcat2QJq&lz4To zL`zS(<{*Pf8^8<_Fp7ri4;8G!mThNR#jfpa$Y!h8r z_!^DTr7^YSxNP2JuIE4D7WiOWZhyyYHaPSa z@s&#D8a>AN?+o7@Xg){(tZ4a7$$g{0dxPEK!A_;W&Zpd@53H_vb;jcDeBWQ2P=@7D zVNI(FUvzV!TpFpKxP88gD7% zuhB%^7RG{4KCbZ?VJ1+W23w3+)9xx1jt#WwYiC~$l_`IH68|iJHhnZLfvCFzB;coa1zu?E1i-QO z-pEPKN$k zOT+l2>nFuZ+9>Uxzc4M0v`L_=TeGQ)fJZBw)j;)Apn6?|BinwTKWEzb3ru^h^;6PZvpI`16X#I zNA<=j`%8dc2p^Sb?G0(|sJl1N)}@6dclxJlA?hZ5U2GfpV7_t_Cb@zsDTqfMdYVS>?+!`sF}<47H`dFZw$;glJt{37XZV=umN`A*5{3xZt0F}6^D6JCpvURiJ5)mEndt4hF zwghjCfb6URFv#2%FQs|A%+GcwhA}4Ou>RU<%Q!!eZS|WioHJyHi(97m<5uzo$;9KP z_-G7n9v>MxOXZpL=T$)Rn|rh!%M3J~JEXW#r@WA<{lZa9k)%E|L&(WyR!p2Ib4tsf zngH{ZsOcg6!?dgLHleAMV}RZ&O4Rjz1#AY(!HmX^J5@ZdUI_V{Zk1nIMGffSIUPxnj?Lzm+e_VBapB~Pzof%|mG7hO)@ld%IU;oe zu=fQ#8+vuA70*FWOv@B0%S_zJ)OrV0hm|fCl{Ip@Zkv>AP`2~70cp+%x7OX^GL%;p z;_5VS)lqE*$4@ShtZh{i=u^+{Bcl@f>#^%us#W1Q@iqU^0-9`sLdJvH!J>15eU1A~ zK3ZqTQSObZ$n8)1noNzXnu!>Jr((N2+N0dcga^ni*nK>k0k%{Jnx-toiuLw&YmSRH zs+zg5{=7Yi(eh4l8bh9^XpN)c}ZJ$>4W!3x1ihc+{7Q!Autu;vl& zILG-xkcYaz_jyijO(0eU0CK66MpuHqIiKqzvX$wKG5();f~ZwoKq~D3ql!gk={i+8 zAeyqHVTf`A=_5#HkYxPO5?E>ktI%&9g-a8@w*7YCt5Hm%wsV_COA}}y7kn3#($0Qf ze4iZ|rPOlpUBQU1`AMN8DQm}8QEyIoBUwFuR?x}#E^h;^=H;?|Cppal)to@(24AxA zkOYIA7z7Jse1ZpBmx!@cxx|D(j)I(Br~^vyP`?*}F0hVT%B4mxX}dC#QcqXQ{fTkrBokWAf;H+@q|iBH8f#GApE)z0v1NapcX(2dM}tXl(l~>%vYd^j z_WmVLd^U=tCFc{9Fo`!0sU2Ya#qD#>)%m<(2_3&l)cwu=rFxix^ zXQ^eu@Bjf7-6~I)wCK2$HK9=t9m2z_grcz^vFtv7(S0w3-zeUC zHQ&UPqHP%RR*lLG%8&mdVZy~2iZKQD*WEM9Br#l=RCK2WG%=b6JL4$ohHiCw+p zt+mtbfKvoWAul=Z#VEiNHT4G_KoTiS8*??C5~nBf2dT+j$Y`I1I@` zVzKLi(!JxIUxjh}Rh|+GotmCH15oKqfn-#Y1Pu1egU~fp4M_=TaaOj99S$g&MQ>c` zF_gt_mGet+-{o7nl|kj2>6AW>iyO=~ne&t3E9x4*NSWi5AcN8Njw2T)NS&z+JG8`o zC4NwV=p=unYd;KKWZgHY2ZfdlUu#qO_L2Zl@ieo*T_QsNH?BcOP{=*^-OI^sdvbiO zB1so0B)2K*)&F45}q=01EM|Dg~eXay*THf@w$6%YPe+!!3l z4HVGBK1H_R6tBn1;8x(m)2+9LV~0vBAIri5q2td#;f>p0O7xR<#?uL*2HE*q_W+w;i+EkDQ%`n{O@bc^^KE z;Ol=LoHtf42Y*%_!E8}UolsdPVx}c)`Uz`Jc?$_De>g^^`}{>d1K&py#C4R$#5Vfj zq!I4P;qyfZDtP;m&t&}O8!9$Y4GVD+x9Qs0JSC;Iz(Iwl_vGqaf}{(mDniX`eAxYF zWukoVCslv0Nr1E0Eaz^PxlY5B6}Io}Zx-u)^?2SR)ll?2(Z)yr7iGyK;M+MEub0=e zC;J2^n%tL2naIrXYD+->t0+IXbZ=e~QSO-7@cQYvT=;QjnXxcqLGUB=%?HOt5h^Qy zyVA`i4ey(e#5?eCM$x0-v?AU3Z(;s2AJ&Vg!Ux)5F}@@L6eMc175OF?8(s6}=7MD# zAwtO-5t0y+mt1!{Fotq{qsmm*`j4v^T1{8+&|RXTKs83sRDm03$D5K zU)8>8PRZ#BV07=N4?-COVemUD3x+qTpZ3Xu9|ZeaAil-Qba|}XzeclGY@6e52YP7uGNKTNGMfa&C@epJ zGwKMZALR_BGdxl)Aew3L$c%~mWkp50R# z6XTVAT&y>E=p;Cw==;M`ENrSXR7oKXn?eC7mRR^A+Imt$6RlZmbD_yN^%0>;=bj zB`0Mp-0$YP851k0QQ^M_r0xFV?Ps*HXZ|CyR9nKPMiJ-RGvnXd3#Jq43>cwpoVfh` z{Ma2M{c@u2aF<*JO-w8~6SJXAn-=9d{_?H}_?I#d>X-cUQnjrs!W{20lP0m+F=b1$ ziLoLmHfoz$!$Bjf^QE7J(H~ky_SWnGy~Iv1QXQ!VR{R{{NDiIxL~#NrQMGk-!YiFI z@Xa98uGBvFF;4L#y$Yq~Qni(y#-o9X-4~egRrUsHn|BN?2UlbAlKtz(FXHPDj3NCZ zIa_Sg>0z_Kq#7saJJV?En8nA?6@`?9MHQwSSiOa2#g^uqjSP|t(p)HmiSyTTs)3Qp zY}kpbJsH*Om8;HPo}3ewhE~KXTSMzQM%ldG_88Soz^@+aj_C!lUds$Uu?k}BAse0N zX18eCCC*pAgC-8RD7y9bFuzrrX&#Ij-mSRLH8^j%uB0QWywjD8TlNT2Sz2~p?8?X? zd8Q;@w5cG8nd<2rJT%QGYdmqKLXYukcCa^E#KoGnbZ#Cnrp|~K#gy!=uvYO!67!+Y`Z@9AMReHh0OTeug?{=PN`w4qR|5{9 zkKQbUxJ=~Xy(MDgBYBk*VM4USn*1ugYbQ*m6pAPOpcXmXU(uZk6f~K_q+on*vE*Q| zTPF9@ilFvhcnDNQNsdD09;?F*jY}QY_3C z7bvcGFP0>}Kf;2Y-(u*`2hbbCV>Ul_pyd1uuXd)VibpjAkK*1AWl^^Mp(pilS^}pA z?RjB12vQW9{KZo{h+Up6Zh_*F}~^P-*ez#_FCrP~CJvOY7&GF&=gv|FC*B<`z~Bdk+vy5n9MMX{!SloCkW+FD2eKvq8bNN@;s;m0ncv%akEt!wR^c+OmgtSwvCg zlV51C-Ain)$b6@|K%rlKvYVF6}^+?ywM_Rw@!|D>WkzTliXryzly zT@cX#UINrc$Dm&$`%~&(;||9fV~wFJ{I=_bcb{L~68t1w9r4{ov)^!hS*yZnqLb$1 z<0A{}&t$CEo0bMY!F}3Qb>5Rns#(21i#HCj$u*B<#m(bd)&nYLarrevNAPDdtd zw#6hw^Zu|DIM2m6fc7KVOhWsC_RYHfM12FgYyunaln-o-3r~jwp3pdw=iYCkno*)U z7Je7!F5h@L#Pr;DntNf@V7z}0zwse}yRr^*9vy$D*b4%Ieh)tI=J?~qA?7I=Jx%6M z_Cg`Orj6kq_2fA-dRk_`Xx|59U=W+?Q#vlCBZG?z%H7!o-!%pbZyQnw z{i4+)7`FH2-pJcs(3uQz)BZGG?`rKuyC1zHxpG6k%y#Qy9dK_-SMJVOp%Kd|%|>8; zmbVpEOlANvuhoGz^nFawolyYckfg~A?2p94ZFavxH7cjIt-sy)c7VSTg|^vLE!>=U9 z|FnKrmTj)v#jJ8|H@((Yy5l(BPF>yC@RoW>RKnNqe&2}R@k5#RErl}C%ZN%WG&5Pf zz?{Y+ldX-%hsw%3AwAgTVIGl1l~r-s$* zrSr0)Q7t~3iKTdicJpyHOxG|M`(ba_Z23s52SKwL@WcepnF9)~>AIf)2obd4uXpUp z-)UFUT#j;7PNRRxg_Kdyqb^w&#-0<-JcpKIiS*11PpnA~Xhh-f(f+2AV#xSC>MC zq0{#?o;ODDfx8dw6us1e-x3J_hS6_c+O{PQpGWvsY2afyIF_R^md4%;Xg4zhB$krR6nC)yV5E;}n`j8wroiG)k6#pPp ztm8K>0)QK=M6wV*$4Pw-ByXA`^HWvTsG(?r>aOF-4Lz;*v@|LwbzQ+$w6?axd_o#< zI((LpcEPvJdF|Qn%Fc%XobT;s+PEFoc+Gt!N~!Vq%Uhen7)mKgwJIkUk?@Um{HAfz zMqCnEjP@L|+6yJF>Fx~R`&eC|;}jm>zrQM}V_N~n)y_r?FjEh-StUKBt@3jk8of<8 zH`h0_5+!RkHIWDO=YRAwL&-+Vz7E<_Qulv|IT%66_l@rZxT7l>LgvoPOWPIu+k~ ziL9jkBda+mF5uH1p7feHf8CUq4i^Lhd1I z>nI8X5Nqulx929q+Z}h$?{nG&pe_PngbhASKBX( zSljYS54KNFdBwoDtd?`g@v zKtizm)7nj%qc~TvO+SRNpFW-XtwX!%YTqOeGR@;Ljmaj_ zsU+z^DA!AvEcR^?~g;{X)q7tA#0nKWThr&{Q=|K)P6USc47^q3uUyyT0JPJ za;R7Dd&2^9q9jOyU$je+TGNd_fg=dp>~L|w*tQoe!FzH=rMt57E3ruSmbX@@!h7t>qL<7RPN%Q@rcAUW}^ zbY&W4Um`z2RLeoOAsmtjR3lK9B&b#E_yw*!7MLN`p(N*3L2irm%y0?p-%*PXBPa64 zOF%HZRYqB;h;0SzevGMEl({Ibi63Wvi83P$8cz=>8gjv4-rr%$x1>re^>$A5f#G=y zib9M{7``q9(p*fOl>X>3aA(q|Nn~=tVc6D`a9BZ*yB&vm11i%O3()b@(HNuiz=J=W z>%1{Knaj`z2T0uX$x-RZnVVwvjKa{VO)#bZoSKc7W7r~ikBafxO`%E*w3|Kn^u07X z>Kd}C=Zh)iuB7)2_2g!eWMaV%bSw7)I2vIUeysZtIeKls&I zNhvu*WJC%p$+SgCxANujcqI5kUG4F$=3>(HQ=6ZSuX#XiYcW?_{5B6?JTxQgv{U|; z`EhN=lC8)Pm4M{WaxH{(|EAc+frMt1l#yLI`c^FLH`I{eFNrr@C=CBmO*e+iuDL_$>b{GQZsD+EtvdMt%cz;^qD0 z#>0rEuI2a+7pEH!GV8!7vj{$P3qSNqTHc7ToW*nXV@$8eDE-u3#V(DnKxB8`f5`S0tKsq24V zpZt^v`M0i(`M+EnwUFVGrZQ-(41LoSu~|$U@1{H80F-d-?&&qAmUNsVu1Z}A!yof)UQ0kU@O@rY4Wu3lcE z9#h`Ir4%aK;2B##HqQcdsz`?@45|4>eFz|DId z;%bvxpWBx6>?LJa)S|XZ2S18B!ETLUceW9WkP~WqFi%atA!EN`lK>k@$z}bY8lky^Sr0F zXP{E_KoHW@L1Wp-(0uzIRRVNIx1RGajV3mbd`|{9oh_OLA$fD3!g0<=8+& z14e^>YNBsxw0Q4vM>5}na;6G83GJst%D_}x`^#-!Wnd;M=Q91{5*^;mX62)3dMpBh z^Y1({<+GN|qy;d{SABngka?`ozuLKxr1bcr?pAcd9)`7-IQi#eH998FB`IAF7z=ic z-jS0+v~M+GF8LwevX312EXHism;2~wPMSVv)ya592u5+>C=8>hiQC&y8UrF5hR7Kw z&FK20)h0_}Qr3xzs9JOi7>SV{9c>@=q+}DM4YTKzZuC-njOZ^%UGI~ycf3}oJY>FE z%~RsbF;jo)J6oNx-uW1txtJ|6^bz@pWo~?LPe!j6U4ualbS<&PGhMGjE*PJT(P4w_ z2TK9!l?q?_m0u(=c_m)KGd@m);xv zUFE|bS>xdgwgjIG`aL*y!Enr`P9!d+#f|PgqG|3A2>BsfRlTtz8lVkR3D%ePQyQu3lC(scRfeB??&xsf+$<4ORyq2P zhn!#YcazIv5}RiUK=Vt8YKRghncm$V!xhSBs@i3SBgFcxk++?u)j{;CW8(`r@`nxV z)4um%~vuFY#Qu(0DhNr?x64@sN}hX`kquv zpq#PUOD}SI^mm~vyEL8!Jksao(o2Xhbsmpf*o0^|d5JZ6U^LJfKQ}C@9Y@1{rsDw* z_GLHgL*cLN%%i*5x^(I{p zg(eC}8sy^}pLlcjLhGGaAZkKwjb z6)=KSs+9Wm;&;IQCyxBl&a6xxqeuJAsr=5C#ukOsG0lCE;9MtW>#iqaen~h%vMvkj zltolxj&h%8WCM&GrEOSPC>qDD$s$E(Mc4OO*!)p#Dz08rL{@*qC5h$rz&DLEZn+%P zABvMqkc5*54vpJEgUhwXPQcRiy! zDfokrUsKH%&b68&OPhIA-O8anMUmbnea`jYR}GhogMz+%(pO==!^!%3Bei)?YR0jQ z&5BJME}}}RZ6DB3Xw9D?-%Y4i1a2lq?;9=EuL(&M%`D0`1*TJGWad+cy4Z~BwVt$+ znl5p95UPtX%Zgg%WbcX=QmuPmHzF6m`P4hchE9DY*Y$GVT@$;0K&HVvzC*P?ikHjw z-qEt24|(Xp4H{-u?O=N3S{aR;3;wLXTpV>*VMf^u(PlDrtEh(NF5?9_Y7v|e9Zo3uoYICv||G&%xMM@K)1o*ISJ z=dN@m!M>dn_)nYn(7tp2P-V*kMswyGJ2UFMBJ26p^og2XHay}=HFtlq%=!-?ahYSC z#8t(9n}){0zMsSkRFuSp=NY9pNSvbbrV+}3Rot+!p)IVquwmo9;H6W@Tnci|P~&K!t(>IwEf*hOhD%o3-5a7F z65jTgWZviaYMGd>FyA7?D^p?!s{p~W;C#t~DnD-yNK}=(7zxl{I-3pBF*kAzzJ12L z3!A=Ud@RG-otRxJH)P;4&g&WJ({8J}j(KQU$yJ2^U6{v5W{;z@60uor2C#ch9}N1M zB+POisI9RL+)_v1EoNjS@^*t8kW{j9RohfQrb~PuAfBW&Z&bD8b{md3i`!#kiJ752#|Dt?b4$gzE&oR{FG_!Zpm~EMN%vzF8(W58b)mz!~N_%Nor1q*^NgHTAQow(5a({OM{+= zC@#D260wwt3P(SATAYo8#p&0b^G}dqK-;bLho;7QOb_@@8>?rZk6DUnDt=`V+!u8T zqHSC@*-$v4bhHtCnGipW#3Ri1V$%0?aE=N|+Q!%k)`U&6;&_ECs$$|QRPi2X1lD{7 zANH!+wF9lgLs9kyd)~VfbxIK@ry*mhXMUU%=?TyCj7jX$YWlI$$){z^Ti5ZE5GH7# zWvjK6h*oeUzaFlO6I>GM< z?S@H3wAc~$aFjxzrth@=Jaogx-}(HKg??&|cD?c%PTj?H`$qlP>GISnr1aPb$nY+z z4X73IbR*wZV&@SVH3ay;GAU+KrpfG#pCuo)*ezVv1XkQ;R)OL@01)1roMYwv8UldO|6hQ%A zW$}yn&7QTSp!%iotMm$mBuAyj(oh!b!jb0?@=F`0<}m%PB0Zpl|LwgUQ8J$?U%r- z1i5g%Ym-~T<00ZvaS47b(OOlu#~CLzAg@v7icbn7l>kgh2@o*@*};YM`ff>mce~y; z#ZU_B*cA(&`~S;>9&&Ml*058 zNg}(*%RIESC-c!=R!FcKM{Igkm!{s}boUc*1DB-eS zc>DZM)6aS3#;Hk)KbI;eRw|GBs8v~UySB+w(aWG_Q^c4QCC@80O;7kNQ?^FK)g~D5 zvpsSB(X#>R(3bQVg&!V7-C%2+*AQJZyXP1gmg3h$vy`n9M#9tuY+`;sdZpL963cYJ zB*~#MTS%RamCM?5Yi$-gQc&k7@Imb51Ou#~4-O~d%mev`*6rm}46GnV(m^lt2-nNI zj8>XIUqfugCO{3^0GNQe3(T)zFX+zDrDMXAhm^J%L8@4LTMq^cWJcm$inU53SCQ=? znqzZqafGL)jfty_pY!mK2}3oAd+~*wE}iFhGc%Jzm@s6L=JRTUc=(wt{X3KI!u)Qg zxOfh=`7?th-qGk=zB03fj zA9SlY>q6sAsS`-nx&3UzM`W4C?0fy7eQ$dAP}5D@oSsv$w-6F_xMVW(`YxwIr}9aN z&_>rJzyRxCV{cgH>B?;Z9YUebRa0ca3{IjcO+uNq@Vcd*nkw;Z_OD~5_P~5c#>wKA zWe}l87s;&nJXdug~f{$QAg13ipstI#E{+1gV z6+ruB11~4EsKT(!l)#r^iCQle-<+tSHFy=_e9GQV;{C1G^Wwc$jQ+8xTr;P0+>Zgj zX1T+A{n;k1UjnG7h0<~Gjx#^HNNIN&Ti1%DiMZ?4aue$K+ld>cH9fkNvO(h=l_&Ro zp)8h@Pwc0KjVl!Fgznn4K5cj!(YAWv!OFk7^AvzzAp;cL+H{Ys&ek?U;vjX{)Z_6CR&1Gv?;wQvHn7) z3{5?$wZgay?^rmiW|IEJfKq>@UC!PH_%LkvTz8?Am61tO=9$v^6RKD$+sX#Ti_JT3 znZ#a*8S-fW_N{JEm?_i#D=E)3BQCBvK#OJgXVZ-M<#?U2#D~4ZdW_tr%ssQ9EN##) zQ0F~xh#gFlJin*G^*xSK>c7Yhnb3JrQnZpf`rPd4-t z%KQo)eExIp4vkQQ2omWJ-@c4s*q%}ueE-DfM=ecp;&~}l4}AOin2j&bqs#5|w@cTa-p8}!r*F4v755^w9DK?sX=NuZ$(y9h zCk4r|JlX)LWMa6mepJcu;(8nvFXY;2EJc*r(V<@R0iDX1Xkf`J) zA}|nY3~{M4rrzB=fXZWaJ@B$p5J9$5L1wGBPli7)H0-i z$oPnahI)JScX+zDphDw4HPvMWo_g(bP8-y@=m`5YBt3_G=saF&sojd7)t2EacNntK zu>hpE7ZppwRfa612Ya-rX71|zklk2{nwv4#t*qx+ zY@0{rJoLhO*~wK-lsV4JAC7NviZgdE*}5txduDSkFd*M2nCv6_8a_B?ftW0?OO^d93fz zmh_jtmU(!pq@{$EM_e@k1H;aiGL%bAb}wLpZIY<4fputGWX_ zBCeFZe5g=Gy7}QI&@-cH8d({kP0!EL`=E+=lOZ$y-U-}pnT6V@g6<6O(GwMqvoY8i zZ6?qH2DTsz2;W#Ld(`>at(%rV2)&h4xEfB=J23eYrKx89C;D^c*7CjcCtn5LxFoN4 zzr0fb3r)6FejBMK{4X@35vVp?^^qk|7UkZn3KwU?ee_9ecTHRrfbBs%NUNECxZ zWW?-CZGS9{RejxD9>l?MDlFWE_tT@;sm~ErH0oHZp?8mVmw1R&_)5tf3!WVTwpNQa z?=j40u2d?(OYXe;^YrWWtuAIhqxfpsdw4pxFRiJCGOAW#4BmT%IXWKh7z*sG6d_kp zxbv=6W$UfSeqQ9bx10~J!pl{;*Zr>{9|A{O^oXWjufHGqv72muf87GC)W0RxTTaKOA!qIBRIa=}cQQ&{BVE!w={73BhpNO6Rms#__vBLd_2IhadTlQbg zm;cI&|M6A+HDCT;CAj}{b6nxS*&P2D9p3-oL;mZU|1QCmx$blRZzs6_eFn4t|0aVu zI*@28RUpbfGF;B~x%2jm>*ccE+R6}oXvqz@Q#e06HAUR~dMw-PA0DP3m*7T-%8*y( z9NYSr?~=w>q&Qp*3g*;Ht}Sv_X%xKrU%|fMltyjC2Nhc^@mW9qkiXQ z`?c4jVl}5xLb5SVMQ?fNr3$hD4*eeiFJR*#88`9J9%*qx;4sUp83pfG-CjRduT+mG zz)FqR93>blf*(91%tVZzB~Z(lFAfo3>v|i+i}zW|uLZ<|@pQI1oU**E#+{=d)s}l2 zH3*?XQssWTP^q$YjFgT#GV6N647jp5!Wh>rfocu}a~e3PIS_RKyC7_xLbfGY3B)l> z6vPJe9Sz6@TVpV&obw5rR4c3Vt7+qygKH#{KuoMb`OZ6rx3BjubdWw`lZx2nZ1Wbr zX`tLB8nf=op|t0Ws5b_lt$dv(?d=3F27#zd)GkJC*(vDZ%@znrQAZ&lBCL_RH@Ca^ zwneTF2LphCw_Dyg;9!bh^K8=j>zH~SpORjArPAUe-2#{J@R!wau=dwfVbS;-HnXoL zT6CP>PoKtI2#$*newLg3nrtGrfkr#9t%+oOqP3ua>C8WzWb zM7NBKp#baJ&(7=s^Nq~A8a_WZ;#NYrq6;nkH@Tdw*t_*;AW0BUj^m>5?M?lTPSmYR z97B)Yt<6pw8MI$unVH3#Jy$u0>3FZv*RN6TuTVx?cPF(iDcvCNy?-%`zNZc@$G%e6 z6zg`hU7x@W)T8UgeBUZP!UNPh)$?3d&EGQ|krJl6)>v)$58(RUaGp#Zl8Ag8$;68v#L>09uq|TjO%wsn$;hV6GIrLVO5iX zGUA__W0VIso@&(X-ny&SnJ@q7DWj2}F+X#bm;ieagbDL!QrUCHefxj5<1pVl3v8aGLHxBY^CaS8rQ>t5zwB3MbN9l~a=j z8@!!S4F2_!i*VPT@?;#FvCM90^^}}=Ya&)a%sLCj<<1Aa$!2+y$DI>-@9@i;KN8A0 z4I_PnDpEtWc*V+`i$`w>m`S(1g%%R4Z;H%48XpYKp;mvcL;(_G&-@xweuGEFdM-Lf zOC}jG`^nY8xZ+IwWQ8q{uPiH7v?3<1ZD;j)Fi4t(r?N&Ud?ID+-WPKHktSCcXWrUG zx8~v-7OSS&NmpX6mR%L!%z=7!-wTAdSC#PVeWb{fG_Cu;Cd>A}+WlA)4AAlbgq`R_ zYse(gV?~N{!js=Hw!r<`+vM{WX>6P^N_E#*Ut&X6WfBuWNK+%0nXzn|eG8lQ`GR+h z)+RYjh}ysM3gwKcW*E4oC183j-4ceW>xL^Yijwr7KH8f#6*N1rPJ(MZdb=?`!&@OH zHrKJv?u_!w%_WH#9ZEYwskg;{LU2H;EExNm<6)GuF{d8oo_<>Rj>b(aP0}xs+~bThYBw-m9{( zkOP&2Ce}t5Q7P?9s$8~xTgwcYAdjsP$^J5@r@`N2?-m^kT5&}*xV#P)%^K$(bRDaV znE}Z1uWKZyZQhW|qz%Ms0p1`pA0zJIGZM)eHr7G=mEJWziNf(jI0ghixE8Y9siF0b zwrRXyZ2LLZ{7T5yxJd>8sQe|EZ~Ar4rdX_WE=@>xsSk4KBvs>{78AAfwZiG3QC?lH zJG2{pr#L%}RmBBaV27YgdN90PyUIdT!t9^t28FDphzSLI7R1Lsc|GjAGK=B5EmG3@ z?faW<$o@lku14FzW;Bom2%>!<$o9k~IOv8}S2sUt z)|8|PZSgHY%*#!}pmw~9#iId77&csmueySitW3N$C^ytQo| z_ev*P9is?~hz-$ZDZWQJA#AE8m+X`tIsFd3)IK?CRv_7{CiUHD{8 zisR{Aa7b~ct|FCiPh1z{SGK2B4A^{EYWL2|b}e^P z=kiasA&x$3>&C-Y7rqR*%K6=5Q(^^dI4GT(uo!hE=iLT9pQ6So?CE@gyko~T@F(A% z@{~#xp$Mn}0)zmecSK6)5JE2k(g{cj9RZb2=tVk$q4!=yupqs65D^sVUAov0 z=Y99Qv(GvE%$&J$;12f*#*QUcY#N!-1VYN zGDUU<)C)KmDV1JVhv$uIY^7Uk)5o<>@H$u>y4?%oi$qUdom6jV@%q(MFhrtixr@iT zxyJA@Z1-39QotM$n}2i&nvwcsxusV(EWoM#UL=Hq zYQp|#TA5K~0n3=kxbXsdpA3b5Sr7e4*$eO=7W=#xDma4mpCC%-ef*kiV@sLIjelDADaXWaqzi;^6oM~9|5;L>I=-{+u#?yV!$hzM?HJ?%(`o5bh{ z01@hZ4FA`wRoFm{=^(&H6-Jeqw;pd9Fa?<=Sz#UfmBtlykt`Mvb5$hj!rY7eO&gD% zQ1q?6yyK}Nc9I0qf696kynzaE?5+f$ZcUQ^X)k>RUhPQ|u+6V%G{KEk^fKL22j-XB z&m}{1N?;n;k;Id&Fo#u*k%;f4t2M>v&-olHhBY-J)>0!4H5@B#VZ{m#kUn(r@n)WM zL}6)9$aRcp3N5B0q*Ij0bqH_mCt~+UBm(Q#453za+rb$azj;!KV#!qDR?e0;*P)@@ zuO_7Gy zwU@}&W(KY4cc}vDLMWW_q=i1fj~gg??DwG#{4O-rUPp2j9R6gcbKBbKVQZ17eFjV@ zsF9kTk;I`_!7zbKn>MSdAGvXewpUq0o~}x*;$Y=NrID2;F2Un?BgzNCFHSG0oUh^z z-|*p@%`q?N8(*a>&C>8;yHOiYN>_7ZZcv|cJSJHN_VUmU8-kl#6W4D_NBnWv=cI?3 z=C{O2joX2ahVmU0MUC(vWX43)+GhbWWPNJ>Hm=g(9qkDt4Rme}vo4cLwbTzo)AIr< zeDK^)BwgKNju?^kAWw#=xvJXa)C(cHCDm~~(OH{w1m$c{c)R48@p zL-8JX3*w&S=yRA8So}xtv|d|u67B*Tr#_GM(Htk>sR;hUs#VOqzr;@ogL=N|YEv53 zBtv=<;)mCyp5>4sM0{;b!{r)3e2j@x@ay|3?noCG$w;QM$UJX5wb=Ps`J8$n zqN!d?L+$q5k4M_4Bjp9;b2kmfQMqX=Voe=F=f8YLky_C;sMs}7)PL|0bT(1vY%|cBq zozJiKRP2W{!ot9qLc7D1Xj{bG9O|+O|zl zzlG$h(4e6^El4xs{!yxLOrd}3r>Do>Y`d4rSgG`|0g&yeU@hCj`JJ;!jzPB>VO6=> zSYf`SB7rIgJ>J*o%*t3d^G&?eu(yuFh@H`%{m=N-bpgdK{*Nq?becGZdeX7u#+gjo z^zA5bka38tux=+lJ~y_6O^jJv_cu|^H&;Kpwd3=8Fx6B&3O|7YJ(c9H?lU71QcSlg zV}8Kv6eSo%5F7}V6cf2mG^1k_Ay(_)x&6TAb)Fx|DF{Y&-6ub+biN5^QS{x;x!aK+^jN&P`hFh#6h&$cxlVWemTUtyc6y* zdwV(5N~IKGg>|PER6KdyJ?ZP23#aksG(>wKO}U}=U%#*aUSfh_CBin!;UW3;4d&SX z>DF{I$Rwq_eGK_ysttmEd?)riuso7|ZH4%xPi#j_Te$H8SeZ%3qdQ5*C6Xc$pEJH1 zMG;m?HFMrKa8DZ$Ew6Q+Ii$?plOvb(5HPR=U{#5iM5-e zA(zQopxFz@CwlsvvwYzuRF$Mg_6|1{QG};+G&CkW=6ZR;>ZGDf-WD!@WlTgKI^yRt zGm?tOo{J**rz%Tlk7gt*MR`|gb_Q`V83Yru<+At60`*IL8?xdMk_#s?ISG}K zjjIzY_HsFc`ES(;Y9&u8anW##^lYWoMBaWGa?7#_M?U)qcMO5&lX`Nf zK1;4sgM5Go=KcAL49iKVEG(Oxp4YwKTOk=RqF>?CEx07UG;Yt zndc%TSeY6Atzkwj55{O~b^AB(XI6lY^}_q5pE}XuZc0N`o3gu{+|=73S1xptl*Z+E zuf8n7(K3V9kcUz)g!G=4M2xlQr`2Xi%~c=Fo!=;xer!z9e+yZ-0CblWa!-rY2r!_} zmzaus`I1!dV@%M4D5pZ0*`(j31@VmZ6K4uXzJ-rq<}98OY|zJw{-{Up35BvVLobjm zADQ(lszceHKS!MF$$D#kM9q@@(r=^3zc>wXMIXGs%FsDhA8cc@tV9nk=v8QsR8;Hg zV>Q{W{9fJ_=BDe+dxaisd>`97Tm>%J5iOM5Z2QRm+`@BCslRpe@AF8b=L32k>y@R8 z0LF?0mP3Z0s;~%>y@lyQDsLO{;jiIIM$hRe0+OB(vGU6ezjfi0>!eMeJ1TJVt+ly# z;ZCDQd~cV_6FNCzs4Y4 zypkGxv%yZbFRm(L?YU6HlTwsV((S&H#Wq8V3!urJwLkWheAVKFHTs_@ZXT(6PO04i zQA48HryRcVzM7*VItxE(3K%D=hy}>41#CZXWuXJbjG+-E|Ivtr%zuya{*?g!hhgUb zXt(@#8Rh@b6aT-POa9lo;WGbgH(cibup2J%Z@K2b=U)GD=Kq{aN?cnw|Nl&uvR@l5 zYol(laE~Oai_%xVm#6%2y@b}Wv*;%MY-c0g1NI{vT{(m`p)b2dCs9RZM-rKqodp*u z0N?S&l{&-4Kg6;MG`=WWV4g!?+SS40b}F;^98?3nX5feZ<6G;`Tjq8J8k&pc;OMZa zzrsgXSwa*zl0O4YJJ;&Mc8XxGxb`n3q9AGfnG_2-XgvnNdq@=&0U#kv?Mr%K?UTgt zT&grhTqTMCKFV2lghcfmGiQyrJ8W2mfN_2nV^=NDHgGbA2Jo%dl)h6+3&KbwMe0)A zs8tj4qj-Yx&B065={#0+Xw10{x|~)toEFUsIo1*)18Ryyip^rBLzW& z7&|{`pTiCA)`)PA-4JN7oH)?^f_lXqW7pY_=sFW0V-=2kKqZpod76H%6Q6j_CY*YQ zUVd_xvFB{k4znM2NRioHr;X9TeW|$ll@-;ZaeAY&Y)zqA- z#iMIWswFObWDO5K7CneTBz|>jcnTJkiDo{%5*K`z*QFsKB4gQPLfqUbJ9DnI9gN9( zm0r7iF&@yQH`j0e3vPrMyCG;alfJiFvqc_mAY)jk5DLM;*E*3d_qrf)Vo^!vC zhG(xA+_S%;!_|M0?pc*hbjVVuU(p#dvL{v{m|!JD8MU7$XPoxQ-mUgzV-qMwYsDDt zGfgx(2HbmFJ2ER`Uz>dPEPY33@lOUs+qm0Xz0=HXjHByp%K2*&+iT|IPv zv)2>K+W4Q^y;DZ+#}}~bu0L4MIO&IHbQP6g9@WR>`yI(JV)Lb$H$ouG91qX@qdg+cgDh z$@@VKDLeMX)+VEMKGBTtUvA6aQVoSrM{H;I2mgHka+2FlNsSEr<}+IQcRtVBJCK$B z#CNr$Z2Oa3Vi$+FIMRA2j&!pRGw_t*Hyz9nKT_%ioR{cpk&-uU^9n?f)NMbiT)vW; zlE$Goc}OHk7>-Qc`q+eVdt0@_~~fiib|5UVFOrvIp?UW@P>dT(2>9?)MKTHNT`HeWxM6CmSlzQqHk>qIIvIK~*VJq~3B! zj9&}}L7315vxXZ`MBl7|1OY#(@<&-b7%S3R^lV>Gi?G(#6??gR%e>UmA-?pMK(1*k zTAvjfP4v!1ZL>IeddHB0pKJjpGtNw8(1M`%XD>GNXMd+0oO#q(ti82mh>^9nIy3I) zowB^a0rS(-&WsjU_cIvL#h7c#PTnz|Gsq)-nd`Zk8|f0xQtoG^5zE>}>QE$jPb=RO zk*p7I-X@uoXU?eGsUNp>|HwXaDfeKbG)C3|$Wa0l(PdVbZCyG{O*9qrg{DTDC^c6J z@mcJwPK}W!G8%lp2WZWyjX1uq33eY8BTTXIvHljPf&J7V6Ok_t3vw&xPZN)WJVW`H zVd%N0u|q}A=B^)!V^uQb&^7LPGPe}v3)7r=+kDb6D>vdH>1^XN9>bT<(4VL>;GXa^ zL+7a{I&}W|wnepB(Vth8zdXO zBW6E;q*REFl_XX<&ceQFHkJ((wzHJ8#D53sqO8$rsmSNuTapW##jShvclk$$Dx>Th zO;yv6G8wI_g)Nx}I6(v?gIXbrboGQP+$qMRhgNbX`97TLz}{py^1c(r#8;1#`w*G4 zWfS@csEmaC@sg217R=Oz)5XYLasig370c2hWkkudAdqVYG|y*xC&QUhcwga_HU!e<`Gip<6P_ zl?@eA`hs3%hkxU|2{a;a(}tveNWK==wA1i$R42lI6nZ=#Y>e(xY#vX4{~*N^2SzEG zBM4Mn$G+i>QmBRQyyv7-{S%+I*+uM+b}gst%%WrL)nLzWW!CGZF$n+{`nniup4sp? z9X3b4hE4^Pg$WkC$(*CbhvzTr3JLv1E?3q0w9E+bcQoC0Ap8{Lz2EDiD@C5_k7nR# z>yq-!AUVt}b@iAnXEAM}d(gxtnq<@Ie@l!mIQzz)Yi?J|T9vh2&5MB7mNl8xQpR#o zR01?BFXJF*rlIa0O@&jPmPW3nB$wC>8&mUO@dsA(iR=7-4r?yh-46HjJKP>0)?Mh% zdIqP{ztEyz33(9s^%gRXTXy$D_eAT$>jLc;oJFtbURK@q52%OzK6;~(tNeUHT&>}c zy&ZGuJDIE83Dxus1oC|z)BDk8eg-uz#*dUHhb3LTfh1pEMWn0ezciL9@J?1p{o0{< z{OLmV@g17dH~wtQdq3GjX_6MA7en2tNZ;Btq*K4FO6Z{CZ0m`5o&J)UPjgrPY0%uL z(5%7v&Z`6J-NR6t)KQ(h=JEV4@%*j(e&-==(pm4N9K+ai$CvcK>_?P*6L!)~=K}A0 z9s-CVd;rgiEqp@a+53mZ@9BmP3dn>J;stePHf+ zQg}*dyzs9f)i+j$_Lw0Ql6);#r4KY#YOCfGPK@IYTinPoQdb8jqH8lJHJC|Cv^PcAh8X z!FX4fy)MgobwAhC);h*(?ksa9!thXH z@Q85lV)$vPX$Pi6NYbCt?D)ktAC=akx86h!K!#&}c@ELs*Z1?7=8dNoC5cr(pr=aH zX8y%ZG^c(#sfzI{|5M15NRH6uN;w~>;~gX$iavH+B%gDha@;&RKSu_P;S?2A2_eI_ z9)u-uQ`qt3M_MrUK_gO6lLlBV74{V~U#YS{qV$y{S+`D=9r(&}awMe}Bq*vWqD}IH z9_KdXjNcg09ybo|X%2yn$Tvl}k&?Y1>%UQYgr$qA=JMgETEnapJb389mF|6UmceSB zPgBzSuGd1mLFi)&_=$?6V56t^2$#Ed1Mh9ta;jsezKBNDqcVDekNTl{x@IX}6D>XOiDD(xbmN9v?@~ebvW#PDYe?eq>EBHKAX=YQSv|YtdmD zT2n$OYyaLH?U=4h z_@|;h*1pqfByg6W(kKm?o>cK|Edj5a9L}fL9vdnbzw8ujJs57s(+qM}D1mR}8+0C( zZ#_RxK#&5|`?Ca~wsvd9HvP>VWnyyVXADk1diSGHr;1w?Z$0Kzk=5(r<>Cv1H4`O`tWm|-6zhl_Zz(nL zqthyiGmZufUG2TM2yyGL4Ps}~#p_GDM@&yZsp+noap=bF87KE!j)~(YkVJAwEzdamlj!vz5$y!{b>DnC=^nX_-n&((|iNZY`vksC36EZqY$b$rh4L zj4VyeOv)i%n!4F)IoXM>7`MWinBXwpWdv;25=7@*Mrl@zck(NKeFmmeFOuz9?N{3P z7Ngj&ejK8H>1sP-3!HKFv}x0sa}wC)sh+juRdm-$eyeF~zqTsZh70wdHq8*Wi#ao6 zCfgRcoF}r}(na;Cr0?j;J#=G^Pr4zHx*R<#_pOzj9luFJx2qa+j3LkZM*I0LU)C>z zkBH6~@btc#S1!b-pPshbZrVsV&BCcw(4R2uY|zbaS(L{T8ZfNgOLj%pXa@lpknfNQ()AP_R9;jEXn=SXoq zY8XM7=3^9;s`o4Hj)!7c4B^>k;z#L;JI?_966AD!1C7JpLp_O}ic4!MCMk0J)Nehu zh;0%#M9A44^iq>m!{T~LJv5CpY;D(4l)9&Hc`o#PKj3xD7V#3W2c=JAn;&})IqRfQ zGfvYes5BcJfL(`yM>?wFJ>$d@TwzKE>gs1&-!8ic{veK(e7zfk_IPywtPaG^)^4cN8Zh~=0}dzt76`7P+^k2 zy;{wc2)@X`EQS7%xSW<4a&tFY(740bnAH*f{#1VcpCKo_9$d1Hyjq%3oo!srzt=nD zF1ZAxwf{tM-`*@9SWg7E7}&koE3PDps|Fc5k+p#0y`eMVPdz7a00!Kx33_kEd1>G6 zS^4i2-n-(!hme+?y;$9z(6jj)x?5n_#lzv&h_JcPgCJduP8tti+PGg7Xy*P0qF`q} z9z1PuNmI7F;$&@sfUnAo_FA0tO@?7jIqzP8MGEKE)}n`%9>(79&{%)_sWxfTt?3-G zGpv4^UoY~LHpYGKd#60T-}{L84@B`$TL=xjIbC}~6{hWY{#`H3Q^KVIL@q)`G>Fmc z79*CmuZ9@$0c$ed=AjS)(`lrIcjmZYKnRyVtv zGZTQeH9*&OJ*SwEq0#2*RxZy|M6l96hx`#U-h@h02{~E1xr(%@GZL|_Jb(JxC zDPbhGRHDf!v9OjdM`!@D`V4G{XbqwH`R%Hiz+&-#gYf-dXpT!k z#sAql7FL&rO8m3HEUf+?a(n+yqj)_OBPs?J|7S=0`uBeroBcoPi2tMC{jUV?Kh5x6 zV|4!}P5hTfQRd%T)c;kFqQrl&{_>AA|EH`>QdC0vKb@8RA2WR9B>!JBeE-qPYh}^( z$}2QqxTBLGwW~? zRzkZXa(!zlTsfYb_Ab^Tq9KtRXV{sTJZg9IP1+75T>)2%Cs0HLl^4Tje6c@9#PTo1 zJM>TgyK3>78*_}#)wx(dozW=-MeMeB0I0$DT)*MMv23C26U$d@Lo=-R_<@|g zg93=J$F^%7UzAoDR1Z33AnJO07zns#?_6BCakf_0Q~+l?lAIjs&!-V@>sdffoKby7 zYywHHuO$hyxzejfeHMjfL=pW__!1QhQ!-F;Q127;Yn}rz>>H^ytY@gawwhK@83tq; z^MHg;{H}fjSWL`VjM^NHw1wBPA0JDK%^GO|?J^BZJHJ7DRbu>E4b&FjDIK!Z%kZ4} zuQ}W~j24`DYUCwmK7aliBcuH{66Fnef{GrEezT%&5K)3bSI;PW3S5k-sYTamzQ565 zUvMX`u0znKU*%ip#SQNIH{lVToiyC7%_?f&m zS4H5yROm=wj^2peJLyl;wav;2>T%=x;>B}mtz|phte*z$emXEe%y%Y@pbd1JZ8)&{x>dID_o=z1-!j;W|ix=@L zJZ9Y`WmCpV+8g}dfb)?!Iebjx(#cY(UpL}rtMZRhqr3-q^xVxNvE#>!;0Zkp?abQh zN>IWqTVr7>ZTc*KR8U-`PY8m$xhs5HS#Q7?vTO{+y7@qh?y#VaSGe5}YP*z!+oMEu zI_c?2MN4#HE4MjF`#c1#S>`TR%9UAD9t0uhKsz8H~W~5oQPZY0g%@c^PC!s zwyrg!myMADFuD?PHqg5_wI6+9;q;PQ_eU=`YJlCEM@(8es|di{Xae#x$88V#hX7Jl z9yXdZ?`mKu1X#juGMcFLBKmg_p&Aej<4)_&QKnyIgOt`O$AiPmirPoL0$_*TWd`}w zzz_?%5|!kxX>B%>4JOq_V~IrM_)>dhwG*yY(>`!>#o`C?6HnuxQLKkUk=%&rkB$;@ zrddCYw~g6VHC^PvYIsqBY09HgygkoeXZwttV{P^S+;kT zg8fbb3G5$=ZY%f}U|OmI{%k!SHZv9a(#hAuQFsSqUl(>mrsnCxd4qJ7bJ4+~LB((} z35wv;%K*-&kS|-awhF$0^%vb3*2vo9Twn-N+7iYQS5gYHY104U5p3BiH zfxghpjgnhD&7vKc{wU$*rd6=ouw+PP+3iLbahYuKD#NCLb0^jG;Bs(#tO_?nP364h zBWTIvdA8ezq{1Zi8Id)U-(G0*rOj4na^=tQ)7k50U3s71Xp?7`@~`k0-A@)Ql8sJu z%&VgTy>5OO$n>jWMCBb6-_1fA|HJr0&q$_gnPlmF*$88NVRhVW(ddgP4wJgHg4al1 zmNKI0goMWlPy*{sse|Lln_$6r!&=T#_tV00QZQ>$yK^2?)lI_&kJT~uT+>I}*?ez3 z8UWOjft*}c9a{0?i*Kvni&zCt$sp^9c1oOr{ok<6VUjZXL%+6u!p#WIQGeS;9Ir?! zmzc;2Q=3C)YY+EwgMZzo-9ECS{Kl;d6BA;w;+hOd_c#SbS&dWH+x6Bysm&4CdV}q= z_aI+-ynU48wW^=u7~(=vM&9$GqTEkoiAI;Lr035k0M#|u2nH`jdi_{VI=DYj9FI?5 zs{R$Zr5HoU;e8DCPlfqTA!z83qJUq%@kGzbD@f~hvZGCRrve_riE?ma8K6a2nF1$I zs(gXI=J@8Cg$h~VPo>JCE-wK^$n0eohG1|?T@X6z7 z`E{QP61p@y=%aG5e6{b46wcUpUM*W&KCIs}73%33MGI>%1502L+8q&xkKZ^+k&_f| z(PEu9Q-(_+9Z*D6VTidaXihN zX#lx4hUpn_oNN%b;EtAG88YpUw(*X~1Yan{+9}$tfTT5rU85-S((FKJiWBv7G^SpMFrOrPSDvJyl(!!w^~ID=TW?J&;<@Tq&H*)&dt%TJ}4 z;aS52mQ562)q=~^fqzVl|IpQ4z^P{mtf(Q>hikP)GuR)WV>wY7TCKrDt3c&R;s2EX zCf!1zPM1&}4-<5&&~T73zSbI)JYNEd(oyh_=IG#$rY;wJf&C7~vGBSP32Rm{QQ*C} z_VQp{58UIww-{EG`n-9tm(3esT#`?=wb0=LdI;Sm-L?;qm6$L)P~W? z6!Vh!$HtPV8+t_MeO}iR8sTd6J@z2~N|8E#1CRFJM)_$Zhxsmeh%ePA9S9#)M?2R( zE}xc6rt(jwNkB7Fjz<`k-4!G8=Tb$~s^A)?g9c7`b>8o)d;#VKKK$Oeq;>9kD$ z)qUuQp=z+GM$L_FYl()SGu z$PxeL;Q$LdzZD86qG=@aa%mDPp(hhs6L4KuJs}_~7Q!iVmWsz!D*A95u^eiYsy_Ns z5QT_=_uvayjbj(F_}oLjrBzC93lcf&Oev)Bw9()QO{TJi$2a5HTlUnEBA)L|W(SPt zi@(?#E(*hvlRX7o1E^sy4EYsQ6T%Yf>UcZ`P`aY(L&K+~VR6<|*ILKd*?Fd%J{0q{!?;OZXsuQQQUHp_)nlb=tyAx|%J|gp3!||)zgh z5CF;35K2dl9)EjGd8X~d5Hi+Nl4g|`6Q|K?25RQkh81D1MqG~L^pvLLi%b#2j0{pV z`su%MEw8cz0yMg8dY=Ui#gwfnb6e`;y%vFkWL7I z%ZrBY{f?x2r1H~Yb8a{-EZcS<$QY9b9OgJTf2e2YB~_2%`jY^02Dz^24_f8%v<6_s z_C9oWV{5H4tkekibj6x9SxU(K*OK zvxo`n02<3p6}b4CmZz=KP>;fTy}JuftA&d(H6NAm#X-q}W*Wade~JWxSy^2&UzF>a zg3r^?R;>W7_rwo9`?vo-h*!&?A`vrrl+-Go{yxDOD;1XY_s%X`d(ihlHO{J76iwBe zp{g9UuPa&(T#`a)|M^Y9tWKdhdq4A>WlTnBIla1+kji$<`#^!Ffc1vqc5JRK0I-g8 zlBJR(x~Fse(wU>*VCR14?NT*U*W%JHGHn0o?`*h>&CC!u?9=skCJEkfEdlrY8QXYoQ)1!t@{o~DeY)2wgIo`ECxZ&4r7!aHRBN$Ot z`G2dZV)=8DBabL+H7eZ=8LX&2{qj7pEp+`99cCab%JENur^cjR8MmJRR}`m;9PGta z462lz*BRt_7aEa#T`h;NruA_Bqgoyc|F>#+(lMy`U)Az>N-hd2E{nJJAkB~-F2Uu^ zWXS;vHcrwWQ7#BMX)l-O9cypMMsqn|DZ$)@c)%*Izb8uiS(JIP&S1^qBZ{+BC%TX= zLxR%mNFDaGo>lz1f*N7NZgtiV;Fs9(_`$~pxA|K&w#SbNE6PzKD35cY4bR!>%R6EL z+ye4;^pW(a42vri(5z_)wW`4Xpp%02EwkxRys!9fCzkw8U>V!>T=*=hFth$?pn=70 zs7)`q$Y}mslE^+|KNSQsUg2lyw5It&mk15eFmSmC6gC42eK&^U607SL9As8|wI-}T z1x`^E1qTbZ-nr=}_x)wZW5Uq83I{pc9yNNsl+_-P?ZDZ=Ks}DVZWJ3fR$)1|5{l z5LUSN4cg4OCQy(S<3^KtHfL8_T!CBh1}i;>}U$4Ih(`g_u_%WmS= z?#i{aoJEW>BpE=a4IRR0L6X$S_V9!h)Qv{Z8)F2SO_2N;EmLIy zv8W@7@EG{SkIbaRXi9i8fnrHw42U~=dYNMAp%LNN-3en!Wk5$$fb=b)qJNk(H6bGT ziNLd$JA|HV#01n%+@@nI`oUsPeFQp%@e;`u=#r-^i8d@sP+uxiTlR!Y;0_pQqWwOb zl(LVz+#zgWTtCHw=SGxgCO!9eWc@|;I(oOFsAMt)qIJF;wZwxfsGtMSzDI*2mEt7F zyL>JbC*`ZFl<34aRsf`oLl9b_eP#$aGNj`#fVKm}Ea%lTb5f0FR4VBS*G2Bvan}&N zgS{iNWGz+hwoQ&t6309v2iroPgPRQNSmdWZ7M_XYx;#J2B%h0|c2R5Mzt!&R=DqEj zjF=I5>$TS=Fnm3v!v^#WKB|&K9?u+U2^|l#boGLaPY^}b1(fPOKdRaICm3Hzzw$hD zfmP3D#6U*HY933CBrMKK$B5$>rBrH{zEJ`_E)X|>ZgZc-K=WdV}hKC|wj$D-M79mzb!QzAdN*3}O5Dw(`|a z!kW+&!$)alD`|?>w}~Gg^@3MWJ2wRMC3{Dzm!(CCU#z^>ANhhfM3l;>>OBH@5toI( z@A|q|=OTNQ;%#GhlIYB0@~+J8rljam{lX->>l$ zyaRVb^5GkwfzNDr0RX|eTN2LSKY3d|ejqfM5gC-Y>OCv}u3Pq2dg*sPZ&buS6?uM? zVc4ke8Bm)UEFT!Lso%5V5N%)}cPHyjAO68r zNc^jz8ZMuS9!-5JuzyxNke4KlAnDxH3J{MpTuyQwHY)3=RSJAuuI<};Ul0o+H+#zM zaAPvE%u?&!X`X4R_l!?W82hvD+&2uOTtrUF71+Yu9PlMlp=4iDZ^*23ED=XLoqSRl zeDVACeD!TXhC+5G=wANZm;um}SHBj8IW7QoJ#^_)U?zvWp)<}*uU|ZQ?K^%WC$U5n z2F-uH>ORP0Bf~rgHjOB|E+iANkCW;>#ExfR`qr={fM08cNc!1+Eq`6HKL~* z%6y#iguG<`b+@x zlC{mlqgpHE^`L*eaaUF99#t9~hAYr#z9Rr%ZhSB^;y)O{g)P$!P3c=B(pT!cX&2rR zJJ9{vFgRR~8)o|WzyT09@w_xl1)o=M-$fGBxn?3T2IyCcN2>dnWVw(Ok zv97@dHvaHG8Hw7F6Bhx6C!V*J?DL(P;^CJPtQwHJ zh^AHs@ntW+wZK+k>jeGt#h8O$;v7Lg8;*QY#d~wfg!bsac+nTt2 z4at@I>xW+46zf$9@)`Bwa};`i!u!lht+MXd7o zFd8cz^LQtl8mPCQMUzqdW_?srZjYlwTfKs0IZ$1dx^`QW8S97i?16wTS43sJbU%)vvhq}+4Hq5 zw&M!x51xi)2S>pS_$RZ^-)5tsHS%=Mrz4F%=c!H#R~-6=KEAmf`=rylh`;fVZoiU> z?pk`RF@D)lKd{lXj3B8Maj`9@Bt%e#Yn&T4gNZ!3O`9Ld}#6tU=u1UjvnCHKgF zJ>5uhgsbp6yQ=_*N-5m>0o5a=NYf%!%hK&NWv)v-WW7wuSij5G&jWKoBqDeC$7kCK z?d`n^8Zi(I51`EB@18MqD%XWw!@8~Z1RSUPn0g;hV!ZYYPWDsZcx^W{s`A!K_m(cs zGqvPZ;5JT~J0t#jkOqhPOWS<6LgE);!^mR+WV?|tR2@~;{D;pGq4w;sVX1ZN95MDM zvi~vecsX{Ht3P(^>-L0Eyq{3_D8#{$Mro8X4v#K=_M=kqM|}M6CT%bBHKEB@W|MtU z4H>_NhOWDm%Qe87eWJ$x=BS9)4ba90c5gvNg`6T5ASgyjNEb*#f1tD9#2si7&4AX6 z--&du3A(oySGOhLClAODTmx*%#&!*CKQ~-vL_kdjz1d>|D5m0wrmWOcZAUe~13lJc zR0{!LZ{EfP!+8-OoaF>;@l=MC6o=(KTeb5O0phxi&R#e|eN-rB$CKZOf(PFgh4{S< zN*KpZ#%e#^%bHSO@UdT}CAYV4#`(suR_<2%XsGc;Sp^lB@e-Cz=rn7%qC{OTpp*l1 zN|tj;{uBc}a8(UredOCJpUbbMYG^LMW;@=)qsrYY@ zFnEkrWzgBzl}5BeH&Z1i7EX8x)NaHYzLJ1A3$3g9muSD+R1m9_CjENA-`^~twjy8hNPz+*Khz*UXsn33#+{(QjrKyf zBrsZem1q4jX$O9-)OR-v?x@B5aO%;b^JgWG2Nb6W!esn)@^UvwKrQc7AVew~AC&eD zt+f+>uRpwjTN|go0@9EC>1jpvX-_sp{GnaA)Xz#xOQEe`pz$gff^M@+w$ZK!KT*OU zZ9PZ_$9ZW#-IK7I(*MlNZLg>s`uc=lHRTS=B%{>fJYDafp9Zl^Dy=jIDGXd6)ZxRB zmLClgj^bW*bYC5G>2=8kP-kPIzrQa1!UZJh3(m*(Wb^F>@Qs1@aD|6ad&u(@>@9g1 zVV(5R%?XjXxjkvztM5J`S(QM9(?hn(c?_ z+>4n^qQ0A~$(ffU^S3_LY_4YWF5ys~{1U}7)NFCRr_C zNijTbsf=%*jTWCsSBor+t0)kuekjU&CKKz84sb3TbXPKn6s}Ti(Hj)5fpm(^35_`a zdWtSzZ@jDy5U37*nD*Ju9b37Zs_#`>hT03OQVfQiW~lc%jVmLB)aRPT5o?}C)uQ@Q zLD?eh?L*mYt_9{a#o8OcrI0ZQLlFrk-P}EFI{sF)yK|hRSR%8YaU;P`W8527?@PJ@ zvR$ko@^uFSRhoPaGqtZBeeYlka@d==`7$PWJs<5Xe7C??10TmCWT{P5+PeB;rDs9<$}Og0R$N5B;z^8 zEyHcEEaGQ&jq^`YZS{jPq6o__r2`TX_0}M|m*Z^sL)hAR=!qmU$X^O!N=&s@TWxai zD-9WTbUs{}yn^7!b|I-eAWcTNuX`4or@DVKhmYuN#4f0qYbCZXl0+`Xk8hx54;lR7 z$rZb`cV!Yy^x^8+u>$@+jYIObF+hDt&&6afI4H$SXR46Z4xsbWb2SgpokL+L$^k!u zllXGS_&llF<-CxR?jBPfRsW0`L&c{BQbetU&Bz=uIT#HzIR_2(biRm;H_y;j;GXH< zgeIaCl$dA?)rbVzXaxI^#e65{A!0u8VXcqN=`nug33_EI^%yRvM5$Ol=H zes*i%YEp{e{v?GYqHfOH36wT)cMJ$?GoT z)4>`Tyy!@6SmDKHUmSz90h`5U|BxhX{p@uF`B5uC^fLpu-fXyknMAyG?dgR^CCk~B zB=l_$*>750d$1#X1N_3tD22AAo?f~??+uX|7SGj@t7>)xhT#mPKFC+wE1R}I{Z8sZ zg3nk>yIW2ydg)cV+YTp1MF(4C$w|f#%7{AipfQfl*`4!!N(<5pZ^^$mueDQKS~;$^ zwFEtH>6LE*_FG=KR$Gx6Tof zuxo0Rf|9-RpVVmQ>c3H=421uM8kG-*_L^13q(rYVz#$tNp7A_mEl&<=z5c_Xd??8`O`OMw7 zCQvxn0BJH`E<@eHJ>G5>fl_|S<}HUSG$cIlto*tssUPV$+}p3T^k)>|1nYueKgy4( z0ft;_uhfafwzmCqy8tP1S_K;ysR189CRbGP?5|DmXufa1c$@N7X> zSW}pT24%HM!@o*3kcIM+xWnSDx-D~~@@VrDvB+r1Azmj`hPK8zx`Hj+hpG7f zx!;zRvWm7n8N{K$qZ_H_?S*elG~}zRHOKo1UsRI)Q)k!!8^6^ET1>YAH z`;Ta~S3!W{G}cHCeT#k|g>s5>;X1mU)_t=s zv%Gfo12A**5k0?l#cuBL+Tpt3uuD@7eH*6XlQ*C2Yk``C7w476Ychi)?ny7822zQl z^QXzVhi@9;jfUzIhtYp~zJ)$PYJG^>-Nu-L((9dxKrW>+QgyED=!Xs^BbWnl%#5;7Y;@xQ7 z4Jl$`*X1Hfw_Lrmm4|@mjEt&MPK3cU`Wih9MT0ybu#%>ta7a=PLx6)p*Hdss6Mk=~ zv$u^_FqpgSeP>Ya3z)}!EfIqjV0N~H&4qa&E2d{?1Y#XloE{ThBvVak5b|pF-22Sq zHyx^tehXbEimUobHBVhRs_F%fUFgU`Hc_*~fGH@F;Y#}G4|$Jbxs`Sps5H{L7?#WK zKN6=W+K9Dg^mn(^>v|=Iw9||K@*eW}^mp_i<&a z*&YU!N{e1bdNLao_=xJ+QBV2z!8qoLeLh^wIu8{e zx;R%n4WBc>GPCUxicbH0Fl0#rCLi?xZ$>FiMqJyt@y7=`S}vD6J=7V;Ne1`p4ziZ9 zzPuw7tiM;RN1r9vz&f~}ICHaL+DQ~LPnM-`n)+HCT49yo>7iZ=A$xCp?Z*1!1xTcI z0XWjWh;fgtUEmyK6ElbbX^D!ov+=w?06$pme}Q6Myq>g}wkIz!_o1ckw!#S5P6F%qkGuru^zwSgK8%bp3 zW4Sin@Z+9zDBY|tU~p+agWom+j#sQ9;Vj?EvN|$;u5oe|cxcJ$mCeq*3%=t?P{b$O zT>M2p?%0SzphnXltW#o{!qV6V@}4Iqd_(#pJcSEC?z;@7)Q{4rhT}fPl&uN%)pIvq zIqHE|=r9{$ZyKFFfdW+RkE|ntuNApOirL@UCi%5~Qi!AvfAGEBpmeiw(Gx7lQhQU8 z6D4-8{mx#L{mvBQok-zVj{JVRguv{;=K}jY#3pqw+eDEDc{Eg#2|41zPlcx)arz=C zOd(8Zfcl~sSlY+?L0H(W-)el9II%KC; z{pRtO9aH>ak~CaG^fyg-d)0cf%DoP-)VE6A_gM`mZBoB}0218D;yN0b??1aIsc-q? zT`b)-cdcjY>o=b@t+Jw3?aTw=-4LN~nH)>AM{m;dG%C@5v8gjIifK2~>B>uVcqp9}^+a)Xxj@2ue@Zw5&Ed zV}zKiPZWKn`R;T^o;w8gE&#a~vhT(7Q)#3=y?sk0V*4>a z=_)$MnOHMJ@ul~ePK)hbu?=N)aQ!#|xn5*h>mosLG20tr?309!C4qJanejBStadl< z2UcQba}7oLcw29u#TY-O+r0E=E}DN&7T(#B{C)d#06QtoP)!tk|qpe*K zd&nOOZ=!1SXnD(0PQ$tUZ$w`8_TDUV(_CXA73YGIP z!i8)VgUC{kF1;Ng;lawW@*eCqnfA#OpIU9izH(Wg5W6aH>-;T>I&N!Usi8Ndl8{Vk z6H&H2OqouASy$S+uwv!+3q?4f0$*mK zWr6~SM{(OQaFv~b4ZvAU&~Z;qtoBVY;q zJOxLnOdv1{_KDQXl9dnR;1=1Ec)5(A{Mbz3S~e+NZYEuB<;G>}8SS{-m>;d~r$($y zzjX~C4*$Gg8>-RIb#gAS&6MG~6#X?}(wl2u*h*nzcz8rKk&x-PdlASrA3m4;Vlq7| z_Q*h|wSM-}mVlCdSDqs}+omad-S_*wB5y9@DlQ|2*L@RwuIr*a*>SVt4eYq0@X4B* z+-DB30tZ7u!tXGw+)Oz2w_Bf%r_2*QYGtxLoj!xmQ35co_eCWeQw@pgJYV!+nvyp4 znB!x6HG6ee5}gf0a#uW{s$N~mxh8Sb+vk^0e*a3(ubg9xiCiiWGAffRnY9xl2z z#ad03F5t`vpX-rKv*X`kvR9!NOZ%CSfO&D)>!hGC`gRa-G_;&(@;!V}o=O`Sqi zk;M4;L(7BU44RQ_OyAi zqEnL-XSNFNN%nk0B)UEN`}upGR2iSb9oy{V&pCfoM_jcIE?FTsXFGXTY^ECACH`m18WfBqd7jb$V@s=q$Bo;YN_1V46PVZ*pk5mXS|}z9(L!M_KLhS^E8Cbr!hyeR(uMUe1N@8m-r&YV_IC=1r{AJ@I-P9qyUPgFT#wt@ z+CtoXh4A~j2jw&hE14<=%nGll(D;Gdvtx0+8XABy1+BrNl;nFvV7C*{ff2DQX^mg- z`|Coi%ze827f-^T4yvDKxQOf43-Px{ygvz*3<(R}?^I=y!|sm?w4RNhd7a+W)C|5w z#mZeg33elyk@rc0(m` zzliq`&365`qsEN%=LV*l^c)58gC(&U#46cuoURPftq^?)!H|L7c$W}W6`rE`t;SbB zD-QCk_w(!Sw>`?Pu@MW3f?O?WxcJaOzBMxxWgv%IaTTgEdOWiaFEJB8*pv`5S20i{ zN4cv8Kl$Xx&vH1jg(Cl`RPp*+op<u{fOG|mq)`f zZ9y^HFfzMb64q?#onB%>-h9hZ(kPs#6sw!>wO&$KWS?OK?ehq=&4^TtZPu$u!ud$` zcabq0C1n#)v>~&u(JS1c6Z0g=j zE(EndQIZiM3!V5JD*>dTHYD}z%KmCdM}{* zAa}b#9`d<@nz(-VL#!tQw@w3-sEmt*kLXlDlgrN;y@PdqJOKF!$?lN5)Pxc8^WbriLh)sFJOXKM0mporT^|#XD<2& zB((cGB;1E69sc)ZW(NXPt-cgE{Za}h&`Z3;rZUOCUHO=+`XD9U!K=^-8|)eC1(V5! ztpPv(I{Ijx7NVY_3(0-F>wzhHO>sOJXpNAnf(34=rp-q+^cj?rMD;P7DgXF9P)}(R zN%2TxO%bvw@LBLz9KX8R-FC-r)-_>EM1GW$d_#pl$AN@<4}qmIak2BT?kLu6Rzm)i zqmA(9y!weUF)o<(XEoq|K#qUoZGU09 ze+@bQf2w2tm%a1<{bloilZOBGE&n`n{Ht01AIS0VTJnE6op}Er7V-ar9RK#rf4tql zBS$ewafyE#IsOaj#Q#b8ozBO}6n&osO%@q0K;kThNgrazS9UBnslJUVt~5@^s+6Kh zBhQda26`N?V!u5qQ(yMtA@fi}=&t|wbYjzOI+0^OHFSkh9$)~3r4`qZ5=V`mi8T34 zx@N{BqH`Z8RLe*(C4QE674tQCIX1H z8cQ?YZsfTQ>7-zm(hT7xnShtl?nbsYmgKGC{#mWk4>DblFlMOk* z5>7gulY7$otQcd+SZAm@W(ne4R(!=5psJ6T{7R5tpl?`sBD80{6(HorCIG_lq!Jr* z(Kr@Bagk#ONE|)cA%jkkeIe@&_$l{L_k_`Z{gK*9lg$23ou@ULvk&vBH1>;=yv0p_ zn*7z0Pt${TbzQf?>eR~FxlB-uyl?;jNlR&!uF{f}^jV&@v;l%hp9tFCS@mvKK9@upOedBF;JYn1&f>iZ%_$MiBx(L z#bUxln0>pAxG};|leRtkM%oBzK*eJv+jrhW|Ni)16+7}%Np#qoh;gs#ok#avy@?f0 zCsNU|vLmv%+f^ZP^cS4uT$X5M!dC&WBS3$TtD5<_Zd8LgWeIQB0AUeMT1zYTOZui2 zF!)fKVH)`RsiYdenAfITDf@=rtD+9W6$yCzd%o=q@Lc8A$30ct(#MOBw4mG@)!qh? z!lb*1ai~vVt$0#IrJn=q+5w=?Ao$^{Z94(BpLaN0`_LPHka|1DOwQJshx01{G84v# zbcsvKt#;?c;u?lbj}QG3k61&C*rM=kmtUR5xb5-K6B^SMFbBuF$KSarEJs5(i+$S1BzVnt;7fS6aiSzX;*pHu^FsQQ~O(@291 zX)hp>T2g9?>c-cc3*ki_sB6@>ls@Bqi4)*gzrGu5r9B7NP%2@$Lf(PxFgv^aK{sIG z)sTS`AtncGNYW;KrcPT+232BON-{r2*uMu3bv=b4I^S;mLUD{N<5B!;da7KA4JHs;NsJ6(_~E`DYhLJCn_wEP3S3DR77-dW*`8+c=I|><2z7tz;E-0ZTG1 zDVeXd5|I)OUKutEZcAJ2@#+A0=4)P>cs`%$GTVX>qSgZPrTa5B`Y_$mM=_TB-nRQ8 z-O}x+(I@d#&&aJlD{72bxQd|f`(8akB#n25cWO zsXoE}Y3zT;grnNOoOFXN`l3xg)!h7+FQW7>Y5Dh1VmXj`;-mC5DH{G@1B{}Kwtks@ zRTk+no?mn-={aYXO?b2s>V5tiFg=CXMUg(J{W${iAvIXrg$;fUVR!5Jq0HoL{=6#i zTJJcWUPAkOT!4xju==a4fdG5v*sn^-`X-unx84eLzvkTGG+2wj)ga}D-n;y=L+yJ< zoinLL`q$`~FKxWCR>57V$hH~ilMiiKBJb>YWX>J4X@2D1fcfP|gc)EnTuwQgl*N zp3B4i3;fsKj0qhbBVvrlBnk2kZT$-p0YV7=m!FMHJG|ObmPiweM+!&u1()uqaHfD~ z3$I@H9+W#eSV~A*O}#lJgfyZ2?d1(bqs7kLTC2R|Y|a@gd8#9>+pRooSbNUuIaGaK z6xCmM)M@6m-f!RV!G*UR}6 z^Iwnkh0!oYX^P*5FKY5Z9GSB2-QFZ?@fz6hvf%=?#y{1ZRon+vqqy-@D}Osm0P0!I z2`B;MFbN8#A_$6G75=?wZ_Z_(k7uC^qmwbhBsse9+8gt6d~gxrSLTiQr9N1$-(3&$ z^A|MGgS`N8@qH})J?|5+J(jsZmQY3MXFz~>6IK6B=hR|jG?ka+WuzaPWbh$RX5xrKoYT_w&(_C?k@1zebRCs#09X!SzD&vzSm|d>g177WVh>Yq}L>M>b4Fm84O38 zQ;%+xBm}g&{8k5rjFPI*OvX@ZgwHzI&(!}jJ_LifY2MuwfaX{6iEuJ{6e_Z~GQ@vj~njbKnqkp5~Dq$S%Sq#4P~rJDW6nRgqgO4j~Dl2mF-^B`7{`E@aBgc`A=ow&RPMp$4KseE}M? zW0%I5d1wcJc*pi8%%zEyvolpCBz`;G$E)%K4ca9+GQR0j8l{jlaFxnc9*NSY<2(Ic zbG14IyCIe68uPLpam0Xet3sk5QQfGi&JRv<$a-IZSF`H5T$sDxQ{B*GcN0+gH#mw2 z!hW?hhLaNBml?*pIxwoa9V^DB&Dl-J3;LmEj^*diW%iQq?)NRn%?Swl$%^d*Ag2<% z#7f#ma5cHBi;a(ZPk`jxvV05sp1(JQkehk{X6FUqfEFKUp75*E_xjU@8oxG8Q8QpX zQdM6WR*%t5F=59*CQ_Ao@sajJM7vRUIV8Xi^)JDxaN|Q`f%jQs;VA%lMTabaE=Hrp z5^VQgTgW-miBp3|uEowvx8d>P08bxAm~4AQ$7SWC16_$0#Wo-<S|zl=Kj$$&QplpUi=BJC(=tW7XHw!=OKvR!U>-;%D_59 z{2kS^2LvSb2ySYjW+d5pf!cIuM2HPdiSMna2S9{qEWFV^{gokCKI(3b_2DOw)flK^ zRdePi?d97VRBY#nwnrGN^4lMAk@zw#N^m>-=2trws3+JPq^gtvG(8$wiol#L=pc;au1|_sWDX&or$g&e#ZeSNi(gf3+ zUV$2Ym8Ke5YC0<-MZF(gX~f>PvVKNuj9ztx|4G;G%5Y+CjdHPW&$FQ_nMs0er&i<4 zrlWjYJvRQvRsIL6@VArtuS@)YNfrL9xIvs%;_uql+toQ?)_-^n{?jtu|L$QrQQ^NW z%>DI-|12vI75=NX`0uPhRQMma{=XVey8quL4u5~N@`M5q$NZ_Ghk*(Qr4~VIWl^PCGZ`5o6*Y;HE?Na{g$0iKh(W22BdB6aW}WzG zNjbhOwmOPKY1D2BgPf5>o9(dq7sn^uNu#t{IfexT!aVFQqC{Ibj1Lc8%EfibfkB2w z1lBdsEf7)WN&mN!<9!oa^8&MtjBT~%4exm}$X2#e(ZnS5PFIe?^UEFhc%m0D&u;vu z|Fr9*v|+|TpFnTESpN1sAM15!&>xJ1F3uYcKR|xO3eQ_Tdf&lA*R}zK?0ih36#g3* zrFF8^PzXH5K&CIn=;r~@Ba#5B&=CAnw9gx7AS0LHh@`9cQnC6_R4F47&3mgbWdK%c zuhRp^abD4qUU-J}Uhvk3qQaQ64wV zqK+zZdwwE7svTY$G(f2487?h1i)X~f52U$i1t9$l3c1F@?}(QynaE@_@g6{z;Um>k zoZ21ou;$;YfEgF6m$A!GDQP3f-89O5w+etSKk4s?XA53WVn>*&3$C-b!v`9-i{Ok}S*lJ~RemX(* zxZYRFxzae{!R!~OqpgkI)@?m*!iLVW7w0COOUs4=#rgO}7fp}%!r9S5?tgqGn_)6w zdQ-thu?8T7R)fa~F`h1fitrc=f)aK|0YCjtj?oF$5b;$hS$?o(9`_8Qd;uT<_lY5H zCz4cvzT`!3bMSViC)~^*#9E#fUN8g~!>NTD`Z|Qquc{uQcp%CNqJ_ZbKVHf9Y2a-d ziCTb0m$lL6>iW9|M#F$_&tYb`hv0N(($MB3Or5$8m$LH%LDMtPZZ=SkB>-3AM4hEq&n9ow zU~N3_x!|L&;CI|5mjeM4$So^t@;Am5(hoMBo9^4}WsK(M@8MIif^%C$F-e%1m27?@LG6k>VUo6k`eC z$;V;CCEpQAQJ`l|eY^#D=TAqs*cHn-vx-J2U=us+qD9L`(J_S(ZQf#$S5m`#ye!AD zV>AVkcCqs?X%3gXbM}Mb5V>q7=PB7~(W0Hpx5hd57+q(<{AD>seSWr-BCF4+K@3@d zof-2$V+Z~cYC^>0i5X_Pm{(R{dNQmdWq-oc%hV)3sYNRbPg9IqD{~HDa?stc@|m+T zwGmTfwQ`&jn634j24Av``J$!EqK70_>k8|BAqEn1JuwfmaKx3~gH7i0NR{Wwm*PEg z;Wju)<=e6u7?gT2V$#(-v{rX4$HiWmlY^y2_AH)%GvXdRsaILBIi{L_#O-Noir9-H z&-UmPt@o*mQZUOinz}EbrPGIy0}Bpr^Ns$r&Dhwx;R^Cs{c_GA!~c||n9Zj{^Bkmw z)QUI?NPF8XU`}Tx60%tePw%hG&6>|r;_q47c7+Lw+2$1hY7kr$Nxt3CD8T8Cp zfz~|K`d&_zPeVj4`UqfI15C-W^SC@ zRO~NTB;&-$Y#HodEH?%WgF^TSO8oR@*X-J6@p@}m9%wL5hRTeHsyY~b7W&{jI$go> zyU_GmJo}?bkr-NHMys9R#vw-eVK)5Skk3r5VQ1l{^0}xbvo{7>g$|k0OuPftK{baJ z($agKyMq+Pd+{ov2?_Lsp}sn0=|Ax$s*l@UCLVdSC0&<5@&gYO!nU>e7b@$RsD#tE?hjS z6_0zM(&y{R3$_OL-0>yU66^n-s9DqY{1lin?Q6Q2E`ncfD$Xy7pRdBRmi2g)J|Z4z z8w_)C78WmZQ<;6OC%4a~w1X&MxtVZt58?kvW<Dz1J6!^w#i%L#Q7KacBdZJ zChO}ln#$&{k8xs5^Ql~{#(%UxI|N6T#U4Sd3ki)p7ra3;p^^iH6b0A7qpr9DJ~{a~ z&axsEGQ4*W1s*t)r%X1!d`B#8QgAiNm~klE)Qdfh$h&yy#+|0tCrFS)7m{H;OP<-e z-JtGFr2oEy`2FutqfLj#zS2u>4I&N@6wR^bnQ+$_RFV{zX+rRGOvhs6NMe|5U(f;b zhJ0H52=kCcL3;NxS|DE#<&%!nnSc|N^4tZcSlQO=?5FTF4Y4+Zq(m_{N{v<%8*jXQKDe-c_jZQey0o|-5P*{jA{o>hZ5`CqMF`8tbTY{J7MxwtKo7Gs)}1l! zae>pqrrBlEQ+2)ZlnEU{rOMm}l^^g$)u^Ff+uw+|B+F8P7C??mjGx zPi+s2?R&Gs(PJ13Du3KpbsnnOCg6ASfB1fXR9>Q`vcZnx=b{1U2PYsI3XIpEfduaWzv4aXK(kClOO3PMx9@ zdG+TUk|=<&RJ`76RRAOX(yc$!iXM_p+Pm58jpiGA1zeLWJ@sqcAP-ft-vfQIa1P%) zNn3K9R=}k3>5(vzOlm=Nx*>5dh(*3pIN-*8o`SaawzyjWm3F3xU#uQ{gVU5EBzEHz zFi3(w`2bd0XHu$cxFJQFETIR0cSdet)uyT;E^<{D&Wpf^w)i-uRy7dss_vC-puauv-2>4)cn;X-8wi{p#B=$=@m z@!}+)vT>#A{*3V03x6Zw;%0F`<#bOKIZ$|5wrO78B#*ozG`e~xw)Iqy#3y+Xj?sQ- zNLZj7siue0q@pPIm|OYGtI%@Jz`ubJbFcQ_f=TMDX8CsBlvAlSzD6b#kn2nb*CrZV z2oa>TPSk5_8(0naw7%Z{Es8gqfKW}MQ3xNPbjoc%iz+iQ-Fh0ni{40x-)>j}UR zYY-Mw+1Y*4XD1ZDEqVqCIzP_YH8>DY8BF1ofI8sQrdjxD3JV5-P>6j~o#;l4iu+u< zQCf@+fdZXOo&7IrbgfeCU7$M})TC6(Aqk}{kEpTf*-=v?L4m5!Q6v`P+nAgyi}1<& z46#GRHNz3w>)~TY5$?amO0Rloc2UjJ4!pl*5gTG2_~MH|WfWYLBEQZ|N-0@JE#)J} zkN||sS*j+qIU!}(Y3<{%N86yW;3!M556+>^6zLwhsnXum5Lbfk{UODV} zp5qk!{PB{YYdi}cwrXK(g^;1uBlDxu`cPV-g5eUp1MfE_PNg2?(svrZNXS%Xq@|0}t{f2nBw^W5OC4%2^dgTDihe?4RHk4OHejDe`|e-dW? zd&c0t@c)U70TrS+iNqQTR)fus7Clf&#GwMLq*}cs7|2HRPs3>AR( z5;AaG5Sw4l{(J4sP5E^Ex4d1Y1sMOCkSXByBI{CvUDZ13S&q?gUBL#(kaymL`-N2{VkXTPB`;c3g%DsM&{N zVefDDW#WhvljJ0e=q7;@g9+6bMKqb25?~%Bg0T~9C2s}U`zyWjTa2{r^0_scrMeR# zuMo2(q;paWKwe582KJIt+oe7~3uqC*a5tTT>LtTJM^L9!izc7^| zqEXxEA3d{Dj+O5g33mGBwa(EZf_m|_Pfpdjlmy zFckBOkjTjLKN2uweh_96@cy&zc{v5M3A|8V)Guu5@XGfl#&+DUS9PBJT%CGjusW&iVU=6| zee(3m|MT?6RQW3?h4~Yj>GKKZ@r&h^YbYPUbX$0A-{w-LzBYne1Bx0yI$KbqwU6#s z?9X<4s~Ef+TXNX_ZsA)ttT0A@NOIzttthl*P3b^U(+X1s%uBw4Lwn+XjKY|YiU+K#zcrS{u`rlToI@%Ou; zY0QK{j|}5M2a03Br(w(8L2kj~^r9{F8!YzmQHS#BuLiqjgaduJE&7qhlj~{tmf$m2 z5SDwgolt8BXt(i}}UKVH>M*?pG}|5Ealy`O`#@wZd%Dgo88Ft#lzQEBX@i$ z=jvTCt758}D&HMhIg6vPAJ5ISo&sr3E(#;&^o&+K?{HP<>RES|SBx?tn^W5F@jdaM z>FgE~z4W1D@G~$BD1~1~nk6o{CvwgrCfyT#b!TOjky-*-8ZfVXlM7|GZd`=Y+G*xd zmVbw(=>y}l$CPcWaB`lmEH!|zFreFzixe=p;!gN}&=fdy@Z1Jta3uUDDa~6HihF8T zV9yuiNcK&%z0KfR=Ci;m)7}mEmTP5}gFwUqh~|qXI7)w)RiGaIRAc0|rW&9EuiuK&`A1OIfy_|Y zA0v#>Pd8i*lih7y>rsG#=~NxN$d!~LP4hC^0p%&v3_F#Up3S4;nGs2a3E-uocmPtW zyK|mPJrvcc61;KMlDGTt?K#yLjHzkStz zWwW^g?>wu9+V{s^Op?^l*^^5F`3P{`bKSea6UqoG21d;&U~x z^R#uh`~$y@C)B@G%~H5EpxmocF1*Xzis2-lI0-O(3_(;2Sonq-VH5Sb32S-Eh+c4I zM~rlbd7cu3qCq^_OFT{ZNZ_AkH%~`8=gR8Ekg>6o>S7=*3nDr=k=_s%J&)l^!s)%x z(DFr$jv$dIk<`Ogd)6Sm70yOqj_3mHJ_RuI1q!M1Wwc1AM9pbK>9e3Yr-iJS&IEzP z8n8r6r<-4?(Eez+`cTPXroNoiEx06?e|xgM$VymO=7oLp0x?Pav|Ny82`}Y}g8d5M zwir&#bG=Kg+&64m!w!xbJ(fi;A z;M<5OCO~8Qh+YJC)N?n6W@PefObknuOh{vT5)tdnZgg+inisZtI$2LyXeZU9jOFuS z>lhvav7biTBaFzEDAvJD{t*ca z_v~d=x)9C+5pc+M^ZqQ{$9HbHU|>>lFbu2<;KOhX58dsFVlf>!e~?H+>@Q7Pt)%1h z9Us>rq#`SnQu|T3aqksAb)Vf)qIh5Qb-sH0qI<42l^D#`ELRl4Us8D4q6pC<0v(w> zPpvjiDKa$V*;KvKrI%x4PGlw~@)JPw4FUKF z_3gSRh&PUmr`2vA!cfpINYeq}!iFE&Nd|G~o%%il^5}y5KtKL%lau3*5;M(WMUkYe zNo05!(ya!v6K5wNR#b%ZemNJBx`#lxkJTY;Q$UEBX4n%YCpWxq5+&Trv-Yei6v8Wh zdRbjCvJFf4DX1GP=SZRD5tM;=#q65FM9`c*zGkQP5lDo1mCW#)w3?4YQM*hu13DV& z`UhwDGK7;+%Y@7nfXrLiigenk7{4(|Fe`|t<>$(OFmjY(XHZdUWvU&H6a$}I++xrmb-Mcts>v>{Xe z1i{W+AmGrZ1mc)oV;r#?0tU}15 zh7kpHMP@w3VXmF05+FuOZAOg)2#g0NV*B!jQxb(WA6-fPv1^frSQ5bT+L^K8MQ2Mn zZ>5=fMPVX+(jDZYVfHAmN!mJ%jFriW+!`-0Zn64xCsJ9@)9Cp3pFE2`RY%S~PTMdp z+$iDr`Km(GDL76o6dYZplDcoIaqZS_%NmZTboqL}R7BnWkPI)v_7%z{$r42|&0A## zr^8oDvqNap^@78_V)ywt==?7ti7BE_Y7e}wdhvBxZFdhmGTn9;b2OlVo+csU^xYWJ?xt&x5AmX@=Hx-;i4(pD9Vf{AC=-#slNH~@3<1ys=8pqpySV(1CN9a z9=!x+H)TV>5z7$11^;VEvo?nmX|5Hr-%y+H8+zBYCA?zB#5f*|C$y2}M#|*QY&)bH znYDB*`N_$CO9uDX7iud5dP4wf-SMsRmQ!w zBK$5}0iOlLAyG$iF)WA^ISAfH1QPtr=){H3!j7WG7m2d>ZhzobB=uypSbtE7o>wzI z7Bm!PpcbPo{#iTf56ALUJNEM5NDjAv_OxAbS%;VUPw%HLQx6!Sg^@Mp^XbbbOYro< zKv0$;@sQp?h2D-Rm@6w)O{T>_m>r0*H&2X!avIJ&rETp{rPE3aPu1fMEpi|Vy_nU0 z%J`}pWQTE{AY(1Y(&XAH<&?1Mx#n{4plh99m=1HX(L2__L^0?$xjSzkKCO=}H9_&& zZpO!w@<#d4m-IDg3G0=28LJ*tRitO-$uA6sa()KvD?hCzWoyY0b-f)rvv{(66fv>O zC~+u|qgldqCp~mC5jPyFv@wgZ|NAb`Bi`IcZb%7^Xg13^Hx+T?EuRw=agf_X^-{{) zC3X?K)bg!=TVf9m_{S1^=nmw+?*hpnScd|NwJhB9%tUh=)YP+=HJjZ(Ljq zQ%bfiUaUIorlnaITrFGIUxoqdN)Blg%l`S>zdc5Dslo@p<-xByqE#6}3iJM~IXspk+?bE8_nl?!BX$Z1=Qnq=W!T zqy(fYgce$W5PFf`OXyX4Z&Ia-)X*XHA|SnYkR~X-gx(YpkuFUH6h-9md3pA;XV2`J z{msm~=Uwyt#l6DHbzfPmm3494$9ewJyOAs%2oQGChj zUW-FJaSRfZm>3(+dm}7>qr7E3iz2b7rK0m9NAZaWI4?P~;@Gz^dvM;KP;J+-ibN}m zM2BiLup&t@u4%+o9ck+--T-Q8SY1_-=z-y{vY;8+OnXIO%Ef#pgs?7K8HVoxw$svg zA4pZzbqGGlRqS2i$-SxuKvDq8aAg~BHuogi*UzuJo=UThoQ{%u3q?F$_7;N1p&6@YLbQgX83ZVO{R&6O7s9nBi zIP4wJ%jw!Z2w<2VkfK#7fXWsyHNZI76wfQJErUCSxa=z0_{^3Jjw65AUkGX|Jr?*D z|2!8e7gHx_Lvw7Hh!#Ak^y5A^|6#;earonH32um?Fy{VLIbe}lH?`>nma%{G_At!< zNv}8r)TH0?n3Yo_UqC&W1r)@CR|&~(im@b*53uz{tP}}nX#gS-9vi^=0CvgU;loj;p7S7bLieA!T-6q75VSPEwDX>Z3!iik5(H)>2eA0 zfU~3n*>9;Xp$%Yfm56ReEIXnY|DW|rZK8VmBuezi&0~gieKjZ(k+?$5`1_fCI&p%;RC05_?L%;oja(H6T-1&T5GMP9YXL_uKDe%xd$b9C zB-lG!yiF;@R~NUw^(q4EIG%i4e~JdfTb6PquA}f3dK;3lA0I=&P&C@_c_SG$C4Q9y z@Xws@i-IETR(l|+8Cd%Ip(yNdzsEjWvd3+TV~=+Z&#Wt@3H|m?6Kh-LD-}2WGsy6! zhQ-P))ppwS*jtg5wN+fJ!Q4D0vLEo^4GCf~ED6@O=@^^zN{rYo*>;))yYW2V8u;>)Qc(O1t~WfS9)~__K8joT+At8sMaN&F7z-dG z0HNsAC?yU%FcJAv%-u&*cj+*EvQq;6CAj@9LE*=?`^$~g^w+HeiLA_vjbgT4-OJ4A zUwlWxDk_4g;f3)Y)!hgOaFo5l6)~^#BAFJirdQ_@DkN!#m{-eN$09(#a_Kgo^ekuX zX0-(aV9w1~2&32RCc=G)>v)D<-jOC8`#ipbYW9xB(?oo0O-SC=H$2YS_)p~|(N%yuS*;}cV&rDV=}7Jy_>N9g zYk*tN<5|OSKZ>DR!^w#fw2-b0I-ga)&SR4&YljKFbb?%Lp%O+F|6VyqYQ(cvJ^itb zXwUTlsSS!bx<5~ZR1v}zjb*q)Dpj0-+YAXWrqQJ~=r)X~)~A~PtZi2?lv*sxdK?~8 zA$(pN&xp1Cy4V} zAX{MEg-W{e1N_4I(4yex=6eUkx$X7urv@n>gI7cYzJ@mFQAVg9@NsJI&}WgWn`#tu zaoNY9B{T7Y)Pds6A_*WWqdn9_uonO$<;1OFAA_QmZE_om6hp z*cDhP3|32shJH1?b9|DJOf3FopWcFfmWgaLs5@fmGdk#_@0x?8#dkpa9MyIZtywjK zJnX8z!z0uJCR@KCJ$kR-MTq&*rw35U^_DxCCX>R-$zgcUdX!4On$9zoqJoK^dCOd< z{fnR&F$I12MnLl(aY7^I)@zp^v52%x)k!96`tTj^sTA&Knw!R3Cz0rnd9QoE4$U=!WEZD^5@QauQ{3!vN-+D%8yi2k1%u@$Ebms(wmsUmc(|bEskcV6+VRuv@RRi~9q;|ya>;qNk%8W&hi{2(;!qf`ae4); z1W2xs&dGXb=CdlCFua-x^O?-ct>MRX!PZW5L-}+ojhv1;# z`N@8VJo(c&z_&X5PVI9Zwb9P)g2@KOTk@*qC+EKdEc7k6M z6W&WUtQ~u-L^htHYCXX9RTx6LQBT^)-sS1eR)_BIO-brI9ZZI;u{K3tL83p#B>+B> zd#4Ob@N$9@v-h>J{msV%#DjWj>pdIeALBeX$#N%RtGi$@4AHMo9#C|GBg9ESZkQJl z2X%_PhPdKKM`8KrMdG)nY>4=vPHYISlL`DwVZbjWd+tw1ZMow$Ly$5`)}42Z63H%r zxS8fch&4?n6`NF}Rh6+nQ#agjPt$mFrwMCMa6aZ7?$;oqFw`tI(hrziQW!na*-ipg zZWX3sC)lm62M?%kxE|$HwYSaHXRB@`ljw8phur2eyQFfK%$CxS;3zDhFz}z@4nIF}v5;_T?%&x*DG-)I9$-p^T z7i2W$R;)6)OjESp`0vPi6(NrNs*lw<@u8nRuduZ<5_a%jK|R50i z>T{*ho85F|axzth=8DrJ1ZOWIxsZUjARM1LFYb&4!aGU0zKtyk$CnaqR4hAgB;;zA zi&PEO@YFm#O*sWbalGaCmB>z?^JH^Rry4ck9KEaGu35L_yU%dw?XJSPH4slIp}XE zZ~Q6Ys@gAg$Kdx`qiXqd6MZahTSGkUJe<5#Xa+tX8UCjHL?7li@af7bN${?~D z$?RxyjI;PQ75~)hv8aXF?dq_hx135yGtOi1*LcL%wddjJBfI7?;JPfK*vb&43nx@8 zq0yOuN`!PTZo6G?DaE_&CkMNz`p`2CqP4IJ2|2f-BM7<5?clJb#vhcQ5OJT`sz2!1 zqsG#8w3rue8>~P3C_5)4+fKnpIND5qCu%yqZN%G;hx8Uba}DT5S$ zskPYf;{b1V?r4%MUpZaDY6CPJPooZ(q3+rpnS^Y&YQbat9}|B;uqYWHf(0} z6;yvXdm#hSt}~LKdhAAc#ocqiqSTvpU7|+pnrna8SELKb;pvX{9GU^CPg5mxI5n_p zGMn*E_=};Hf5+MR2w(CTUU$x(%L&%W+o6j*R-{Y61dY+~_8)^cUI(k>cx0YWd(HSG zMguY7-6!M0;eT!Bkt$#Gx163Ur1db-hW2w za;BKy?1hs?8;y2GHE7!@_Zz`f*+v!TJpv6s0+ed!49e(ll!qHQk%g#1xwgT)=n6QgUJitS3`vc!vgWT3`sSLTGKkYr2s>zjS7KMBkQ$;htp<);jceG+&n5e(@P~ zy^L3t=03MNEw&u_Y30AGOcFVXGT81N|ccR=M@A=yY_*aVLd$Wdy zi@h(i`3*Aqvx*#fv!y>q4I*!D`{&PpdHv7(B9VV)0+Gl+0U8qd=iZP)e+>pAh5j`C z{zyD3JoNYUW4>7t%#XJ5ak#k_{&V%e+udL8_z!mXukZSYj7#u8h7$$wF;+4FywasAUpM*qu_At2g7*p~T+_+6BF>K%KxK{D$uS3!pH^ZuHbwvy7% z62Jf|?{o~Rhk*w_iVK%!UAF0UY9bY&K}b)AQ4k#e2se29$w?t}eJ4YqhoN(uqPlqh z#yJpBk-i)v41gXJ0q!L$ehIHnl(uwEG`wZ$HJH0l0ZiI*0|l z^!k*}Y+J>p(_p<&kovy$mdd8=RJl|u^Z{|VT3hKsPlL5>8u6_t&*LhR1?3s|Z7Jm@ z1h$s^_uiY1^>S{ZP_gQl30~;+x)!&U0l6!>4v^Yx5!W)k)X3H2@#B?p(l|=Z!N^L%z59H5wqzNm>!`IwDF2i z$8)W0HeJOG05T#UL4hpl`w}a@S-cX4Nl@+%z$9}8MYBTjp*VOc*R8g$&Gs##R;L;b zcOH%oN|eYRu75rA4Wq9^MUHEpj8LH_N`|bVW z)T1V`#T-!!g9q+J0V(}ZnQSRr)y0RmRIp2}c8%_DTi<&rslxHUEjfcJ62$k!(pWR< z<+TStaPmeBK=Jc?b+|$SxXki9N^{Z6FUk~R9D?sC?u;<0yIGRH*U36>ePSIg9i+3? ztmsoZJPG?vMwRw=em@S&B6y?yRm$L zt8uqZK07i(c1htN(Pl7h*6&E9f9z|Mb{m^|Tv~GwCUtpNK z{>j6gVsnqOm0?I41mc>oXKS8@XWzQc8v7NqK%K>R`_iK{O{z%y7fcSku-BY!!1U@QJoSB+}+W9n&v$W zC1g&gnuMl#w30`Pw%wgL)DZFFN)v^~&^J>rb{1#SZ4Ib|{jg>DpnX71IU6fvN#QmW z?u`9$UIe9^L+o2doM7t&Wco-w!cO|9{{IDs-e51Y0t1FR*LV`DS0 zczWqJ!SuRJ3^y~r9gyssFRH*c!l+JoVyRam-?+M7m?F5Fw=vgD!Rc{+aAy&X`% zNX?*p$|%6)?Ta2TOYd)izqpgwzfs!!QHvW}XQAd?di_DZ|4{v>WzD#c0E=xa6D9YZ z!TsW~=Y|b_*iZXWvFPsQTm@r(qOIQW$`;0V^Za06epvRjr&{f@=PlVshB>>9chQHm z)@|-R0i_rBqdDUncP;9cqi8H$$4DngNi{@Wl?*5WBgo0pd5-VM)N7DeO_{(lKkVHNI!^RzaxmN=AC1vqq*f4Wkrh;C4u2A zsx(h&Y5s@ATjz6K1+rIxala#As@L>UAsMVswGB=P`4Ho~k}`<6e&Zy>O5KKtR7t*W zt-*&lM2U!f4*7|JeNWDgQD<~OG*>KkkBNZ$;Yf2Wn2AQS{&4b1gX8XA5$APKT~<82 z>6vpbW23QF$PB*@Uju(Gk)m9|Q6M+F5~IZK18eGlM(vKc%$ywGjRyib6da@lVq6xf zckqUdO`n#%PaZ6HR*3G*v9?SqBWsnj6uD@oxu@iK+O%97rvBY&F<#F&?aLdfb``h2 zki69hS-x83`QP!kWPWiXg!`s{T|UjOe|<9yE}*}P=({*E>1VX4DU-}e-a6e-S1jek zN)L5~Z%v3@ki_Rk5P8v3PLTpRI8BdhYg-wZzo?_w|*x1e7y4+I86qVFlG&!llojpQv$l5W7{X88Va9Rsr@fpJEA?y zqvx(B_EBtH*Kf&>#|W2J<7&AGv%Qm5c?p80BXebK_ut^0jg!`R?baIVkhWD3w3^80 z(YGlO3EEzymRwf!<=(d{;N@pQbi;3Gi9~6&M`ba6wDO}8F(UF#bJ}EhwsSE6U7Yr* z9aH$)5Z1?Zh%mD$mYD5|8@6&{r|qZ=_<7{|dI*()ljTc=KB(%D+4>p}+t(@GSB&f- zCcqguKgK8cRfd!*bMNnx$Jh@hkQ@d}sX4*Q0qa`{vI{1zw;kP^Q)~#sWJ`Mh2buSW zmsu-<4bw&3D+zTet(Awf_3U7?AEjiJXw;bpMHftDbXCW7wPVCwL?QaRx-A+zN~>}-agVS~kjg7wJ=c44@q zBN^rRMNug(sb;@k-)<*~-T%&5ijjS3f;vo$|DZM#};@Qx0*WUXiYC~S3jd<%nj@?wJd+%H$K)Jry_Yn#_I zqyMngonEmF2cR^II5HyU`DR#qyakD3<@tmcOL|$ZCsoyR+UTS*T1rHw>^phxP4Eu= zIbN4fi_8vVtuw8s$ZNV!#03C0A*A@#-s=t#;aByB!SYuJ_enjmf$gJqC-@?XOI?|5 zVkZ~WGsQ2Kj7ae+C>uFeV8A|ka;}qSyj1`TA89kC7KjWb}G7dsV6uDiMTBHI8AtVKA9XQNh8(Ws%y zli{9?@{Z~g^4GKU&f(U?MkJc$hyuTTq1z&GydCY*gmzNy1xJk3H!uJ3cTOT)Ok{gv z_+JM&GnGC!+IW9wtKe>gVO42zTnL?XC(nQNyWddd+?Z&y+2)HeeuL8VmieX2Y%Vv! zUrMuzASElkISw(hPl8di%#jL?til=wPAE0BS&B5lrw^hXS3$;jRuu_uI3EKHcbooK z?ZqJBj!T|$SF=O`p4V)__A|NBSYzh>;8}ei{4$%iCzjlv&iha;w=yeUMHrrQf2KYS zG|QwNhtnIb(e&b~YUG#2TGSYlsgS2c#X&Ti(=X)cc98vhybn0w4mfUJh*RC!oKd=O2ZQY4zO24LGV_1~p!d#c=f)>;&8c{8l zBxDYP;X`4oU`hSUc$HC%3^;!rMnYV-zUc0Cp|I1b5Cj%Z^j$6rl?4Yzwwl`<~&ec9%*cQ}9@aSHy%c+p1eN$K^YRhw7u)4zTZNb$KVJ zy0@~Yh}T2ee&Ksq+Y6Dc3GMS3tiR%(r)twTxQr@CxS>gR7EM4$x;Lk6<7b0CH*VDn z`X(*;kf0I{(YYqswVhaIE@8dEanh!fN4r~BO(}Z*T?*V;o=*tMXDGa5m&49xDoh-s z9^EDvo&vtkOD6s?#-}XxGM@K(;k|L1nJD)!Nb$xXRpXvBnf^54awD3D`&Z*WT(nL- zOxrfBoG*w??cPW3QuT{x?Gs4hG-QssHQ4V>^5YT%%RYZR7XRy0O)v1FpKUF-QgbSq z|5VYiXh1so_4E`j|Z;!Go)tHR0`$$Z~ zvBVc`ZY}XR&=x%5NQRzUEr4 z{Dk<>Yz)47Vg&AAJD_sQQy^?3K7G=9Z!G?$-6ETtt<1_AQj~YzJZ&YjrTPi$HpN>M z=gjg_ zLT?YJ>lO3VDAFdTe*OHw#gu+4Nen z70ob=Fw9$d{aAM4@XXIt``C`15yT>FhKIG4DAg@)4%9+4vC$_1n$z5|9_9=~Vuta{ zJ|tE%WG=8MrH(C!jwR0++{)rH6rzy3e~p<^9fdXx1z(OQ*E!pd4m9!53k=xEuKk{r zI&QlJ#`;{NhUVISU5kt#<6XxP@Ujxekn5u*rZ8I`p%Ioz=W&!+$mIX zXJQ*@^ulxbknB%fkmE;0H|b|D#;yfYpTa&^X-`wqP$qeA@@bqiZEIBECh05kHSLre zpAPUNnKcyg4xoX8zmor?C?vtV@bxX~IaLU~MEe)BFH$iS)fpfO_g1N0(zgcHc+S5#WD>TP= zV%!yY3Mk1BF<&@3PG}mw&BGoGb?(L?GVG8H~*#)(+-atY@jg_|l&7;-K zb_~{PX>Ld2X7)Q*DJXSto8KZqX{u7>fc&A|$Ij41OXHd82qudIwkMC@;}-pk>yBF2 zXq#Eox2|4#!`5;4;}pq9XD3lE!Zszj4+Z3Zy77LPb`u8v_}o#)%YeuT;pz~4;pL2z zJ+t5Kj$uf={*kn)Re|$tdkBSUOTg`Wyxbqkppv6BiTj8M#`PE)S?n1Zn^r2{;J^aX zGFQmyQ{4o`*^zOYnl~n%+j;_FLFx;ekzB1Z89mdq0RCP^`gfm)(4yvbNv!wh+EyG^ zZ9(qTl^teVxePIjv_6avTB&bjIa{wJwz$K|tOm;udO-b@jJPm%i!H9qE-SFY9mny4 z^K>|^tuZAv#0x%Nh1_}`kq5NJYwx*-HnT7~CbMZw!U?LP;%PIe>>&~4t;P0MB|h(z zST-giqi2Z+6cPM$(c|?imT{?E=$P2797QV1PLs4SrH6T>k;`VuvuSq$;VTSMQAOvO zB}b}Wv{32u>za8=e_McV8-E#nsK$BWeYQ`E)h7L;TlS3hEz-vA=Rn9kXW zev{$P-;CJO(5zWl?0T>{5%4bIv+pl0?L$~&Z*@!8+nzHPEs66dnf%^2hrTRx@qBbU zD{{0Ao(xJLkazl}uC}quE;rzpmh?!i+ervQQ0Jus#@yo9< z<7^6N+Qb6efMq$BDi#L2}EzMM1$OQ#YLh3lAz(JC=sY)jWhr0*8AJnV7@fv#O5x<3G^koqU4RNHVWfoT_M8ApF z-iY#}H7PDBR|e!xbHup2js8m0%>7Miz=KZKz&m*Qxvj_c5?yLcs6dI&0lQpYvT4KW z(;|~o5M@3#;p>k*p{uP0*B%riOA~6~9C7EcHwz;-pICoWpPXTLN0{<`=AGTjsltPJ zkkYvteKaIK$~0TkUq&D|^8+7QkmHN9+VULi#6z|bW7)%+oV9WtV+-*#+wciG$%QYW zpX)S;1Y{=(LIQMQx0qryEQK|RArAaZy-_q3ABwjRLK@|Q0yXEj@yna;^CURQc={&} zeP@-|wF@vnF!o5{pVL|oE&D;2ms#(~K5g;7REo3zk>fC~lo=;l@8alHldwh2&mQJ^ z%jfA^Xi*^l*JXE+2M-EeCFD8cXF0R7c#X*wo!>^f-XdJ)D{9P}lr&oi z)gu;3P`<%hBKb+(^Y-6P4-kGQ8BcsnYuNVCp((>X29eveQCAJ^&FncyBQ7 zLdMRMRhX0l+cMsNSz7<;wa`n7Nv0Uz%fdh>(`%i=9k0;MKzxsE`7=RicWqbzL zc7|E3wy2B;4pY_&3*%&H#Vg+L^%sM2PnYEQj1z4$Wo#O{g1UD9UFn+wcpj5 zIhCs?oVy5>r&vq3gp!utlWITQ)+G~gMJAzQJ?YmVgTdor>DAGjlAZEsxG*$r8dr(&t!c7L;G;@mkh|kwY?Xi5cZ?ML<1qWTGw}cI(fog|GYI~3p_so~ z6n}RH|I?TF=g;8(pv_qDk2U|p8T=+H^WPQ*;#k-fP~`Rkcfgn-LA*h3=Gb9duae?9 zSz(6cm?1fAc(q5QQqrkBg|#d{Yvv}0Z*F*kNoFF30BHJ0D-roLfGT1R=L1btwzDZN zcIQH5k)St=yFA4hMz)5y8!TG|Q*Qp<4E$OY2InSKVYQLV)Dwi#jyG{dF>pHwHM-+omS?+PPj}(f2JQnF9%grJ=p2gW;OBiRT77gMm z*95nBOVOL3Du2QjFFu4a@tJ!JymC>$c|5u2w!dZ#XEi?oWH`Kt@M>QeA%6N8wHeW6 z-bgGFqfP>7mM@>1L+?CrOHe9Zf2eFC$HwR&gq8CQ3*wkx1=DPm)V+)U#~uc2qOV5wC>ZTa~k`zRdr(POMEFknRE?h*deGW zxBB6`n3D9353ww=GcPf>s?jGzbx}3U&3gD7?}_T_+M(dOL)mrZy72MxF{HUOZ9}@E z<1rC9cz~O)70b;weJcX6i98&J z=+|4_*PidW8do_(JJEp37+oai&im0X1$ByD(_&dNSeawSLj*G9G|&BLiOGG{5FOyv z%L=}_P+vjT64_yB%Sk~YZ@0cwovAv7Ew%!16y3WrhVZyUBdVQI1AR{M<+*9YQME-m zragELIz6Ni;4=2D!L|Z0S#LSOMa8!0v#_nvMcdf0Kw*LroT}Uq&@DIlfU(J3YmbG9 z4Vk|cQgxw0P3}A0Q~Xp=Fd%U@J}9&?Z|!>dqTYM}uh-dks#(8TN&Tl>1N1H*sk}Yn zcjjsdX>f#YqYV9xjb|5L-_4|5zq9-x)l=_KJ^z!|0=~omNK}iZ1dt;A!C9A{?c-A% zsq6O=z#I7w6^BvwKM7oY{j69UE~&iDrf08dpja+7Ew~Em5nyAUyin%DH z#V2E^lcGvUD(Jefk*2J!y85?HAI8z1%ZL*F9mKyB~%S2R; z2gh1NIk+F|lNYLFKVXsRhfE5Q+<~*FP-tYnZu07P-GgrPtP#Jdd^7Pdexg&>bnNb6 zF}I>?A!TiIB^3x?*qr(1D>ozMuJ(4Uqzcn{Vdv@t{R4j!XW9)&%aoVwg`?}q8m`aU)|J`0ppm? z>7!cT+O|8nPvqZfs1Dm1Vhe~9oDLik+e$WbMJFmRkjt|hnHj<1$qB2xx$t7}{Dh9? ztS2A6pDTC@O06mxwgCG-ZIH>RYLuO`mN9)>U7F&=o>4 z(IcP}UO_-;3bGs~hUmroES->lW?OB4lg1I90-kt4q^h&@4t@$|BKNR#hQ!R9yht{h z)CX{FAPWlC+KxP8Tp^WB%gWcyW&gZtDAP+Qd1vF8IC{DM_<#1m-X5>b6*>^|U zw7%Wu8QJU1x(+WL{p4FdGJrQwHYe)$2s3tZ?LEVq66-4%bcfW2H`DIEb-RyHpSoq| zYdnvt#0cZk{^LeQElo=(>@kI-`wTUU6OeoJ9$UDhDYWY$NI;c7mph@^rL~_Z;~=?+ zYe6+Lh`Deo-7BU_SG@4SBdIvQBJsSnPZRIDQ4aVH3|%b5&#oiG)QC3qF!^ol+ggZQ z4JD>r?wN`EVtlFGZ1wV+_KtFq31n*_g1iTB8JvAJym?b+ei&)2#)Sa|zK zbHBiXlZqhH3*~X-ZIV`SE*L z>QDOl3^Xqkcqw!6iX|}_ekn$0{d{ps#X32SF|G zRoFtj9vS_X#)H}XW&O8ndiDM5`OJ$qv9cB4rExx_knS;vYEeV1^XD*#WTLs;2ez?L zyt(Yxc!HckQ(BQgkT>h-Xi8d9k3DDld)exk8wfH9n_S? z*w@W$LEiROr-#MsUEeKtVOw`0`YxL6smP~^-jRX1BffmJ48>Ds9z=`Yy31b-E0Jqw znYyl$Q$Ut5O^DpnpdX*DBbd34)+$j0Kq{X$q@KR6ukm}ITyUP9R@PYLv zPwRC{ny;SZ3GgrxChv~GN}t~E`V1Ku(9(+Ak;o0)U=poY%4cxpfcID3D}T(|OYKK) zkxw|AjB%XEW&lu74JA;EB;99Gg+=!#kjv*P5eTd1gDY2BMIwd1DTF;RJ{ae;v!@)FWZt<&sp(fh)d zggID;RxY{6Q{zf$7TqBNUa6T(ZO>)OvG3BW;`i3Yh;+;roMctPgVN zX-&1#&2qkMwr1)^U#V~b=b|I^t-TPD@U3Y9nJIVP?M924UW;fSKjIE^wouZ2P#ym- zm8nZKm(ih;SHtLCWghFK^3Z*y{m}4*qqtwcv-?>MpNj2lhym}4I`qD2aIW7C9EXHS z${!vRjRLHFlrUk43d_g14o!8K3#;n`d!IPCm&ERsgclmjJYzmrxqs7zQ|#(GXQJ+e z5Uf+Q@#JofBoAO$C&HI)#`{lb_8*q)|J9LMkoiwO{QpD%{);sHx7+`>sWtL%KJDMA zHS(_l?>`$O|7-64?-bj=toiRw%qS7D|Gr}TKaP>B;Qt$HJ!~gIpS+d!FEMfg)34+= zG4ceZGF>_5NHn)eeYCFXFj}t#G+HJoyE>u`C978m%q?BCgHpJQ;me6-xHj7YMOd)K zdEN{VzVF^0gh@(WWXj@tT$03Y&>Z#XY8Dy*sn`I(j-@_~pQfG+6BTFhNFx-Rj5)Vh z2_J(Kk;kKadbv|nx8+oo@b9r%s&T|YVp(glfod=y9=#=-0>|NJjP1E$yN96Xukkk&87z_3S@XP25fS;T94L z7^pLgW=SEiEi9k7gf_(us^)eORUgrFlflCE=7>sq9<>5(1NCt6gQY92BmhH4r^@!Ki4hv^)v3eZQGMp zu#gE_5Wyn5Bha`Ry(87g66XUYi-@EU7SdpzWNwe+jf+vm^}Z6ooZG51YJP#Wag(M| zzT^Yix(?F=Hp{*Eh*}y@^XO&|a?Bt!MqIFVk&lB`&9Al>3h^C6bwcb)hjB?|uG^|a z1hC-=w7c`3V2Zx8IVTZ83qvQg9hHzO3@Ru?Zrc&hqOGR0cE+w(&4k0VAmYEM z6NTbHai_un#M|jcn!#Vx=|&_26uhn9_4*7d%1Kae|H=XPSNe`c4lnP zAcRFWM5u{~=+Q)`rD|vmAO@ksN4WX+DE7zURqgwB3a(M!lO)oSD@JFGK1(UL+C`hU zmkJ{nsZ(aSS&R0A9qf4s9zAqrL&2^bHOhT-9Hk?go9*rFhCS0frNubADtnV7bO7A7 zlpN05##@0XG`UvU;Q2n&M+u=^5Mwda@n|mNQdVW7dQLN%E|D^XSf@Wl$=3`W zF{t4-XJ(6xdu@VGi@r^DJSrHuk6R}5D9jK9Lb2}CyWCA|RPVPqJ7|X4pZ1jUI!^%h z5>B(-NWIC|pjFQSMO%^t<$Q8Z&sFRAjpq1ZP}-PTv96U$?lxeA6xVF?*?rX`w_?6- zy{RrH^@&}eW`=qQMk$L2CY}y z(k3KPTv3WyeQZkXT}Z8bR%))}Pa5sj=}WX7A8q&q{fL2_i>}`H-`VCjI4rzmBMI!I znb#&7nM#|cw&FUH3(Q|`?WC*elw|C2XfYDN>K&eT)2Zq`6TT80xM+8C7S}IfcO9q8 zGc~0y=0X}eSib|{yV16C0cws}mX2WNRn$hMqsYL>XbVu8-(FxE3Tn{#&an1~pb-?= zy&AvTxl5l`NwsQ6=%#X?k55LU(`;GCkU@G-m?=TsGu=GihHQn-rl1o~1Ve*ArjhtY zX<>IPdsPe!^3XtdN(sFeWAN9>dZX61@TvP0O(`FG)l0=a44s^?Yp@F-Vd)YhM(>k- zM2aB0LLd#4J4Gkb6Ur!`J&VIS@y0|I*A|=5S^Cee6YnJb?(|7dK1!lf$Xo+hzm+5! zhYoS|xe#i@-sTQ}qL|mZ_JKeYq|HjdPc_OQO|`@;H%1rF@y}6X;RUUFh@e@uc6Go> zV8-G`&TQUGF=F5r<2LrmK+tdEkc!SUUxdu1xm-_q%wj&AfWGKfPsj>zypz`N zTf4ujJC45l3^O6qMj+X5yr=dy_chHZSpd`jq3x}M+J5wWZ!94|5-d=>5G*(Zw-zV3 z6^a*k30kO7G`Ld=6lk#E6e|VVQk>x40;Lp};8Jht<(%F9?YYmKJNMk(eg4Z|nS5uG z$$Z}OdhdE)Ewmu+Hz+^mCNzD9I_d=sEOEg>3oJf38^k=FW!)uKPilj~kg5jrmCm+Que{bn^Uj+WvhlBy42XJ1mZ-*1NC`MJgM7jVzVE39sx z4%*0lM>#`kCIL4M!)KNZBQ^EBjs@%5QiJQDu;Vy3Q_|oeki)ykDZKjJqBGB9-<7u` zHy-fAAR`EC$}~|7rB&*B1yF+@Rlp^3^eQ^CRm1j^7f7JGumDIX(K;sGcZ%DiSrmdx zG%AvezLV5}zd_|$fU*EY)1)}IGIDp&6wet=2n9L=oS^{KQYt5G+E?-2KykjVV`&vQ zi%QndZ{P-^Q0s#v4ql?$fGT|Xui*8QG%es=K#J3bptHfUL+pc-sr4hoy)`#CxaVe% z-=#Y|6rPk+wF66Bbu;$Yq>TqgQw4I@XlQMx9f3;=Yi|9)+ZzrgAhj5c+*w33)fQd8 zl;YEnSj)HY-40J*`h6!%jo=fqFK^cOXo13CwsOe@YW@&P7|AxB4WBV~FaJ(WhaKyB zX9_V3impxU?ucihr?r_>@C#s~0F?&!X`hdAo0O5aLXF|Wm^34Ylai+1i^_4}2nX7y zjDDc_l9uz*8`=Wr9OAc)jjqbWD?Gxp*>8(ai?fxujC2iV^2Y} z^Avi&Sx?uKw%UQU8H0O-o+&FZ)c_S0_2b7sf%e7-M2><@>F^|+^_cyDr`O}>avKvze<+^|cvaPy z7A_zgjr^yORFUqZ4uyITMGPlAd~RKy)EHNEz4U*blinLUc=U#Va|8tr_&g}-Lmbm0 z`zO7&Fjo|_2UkMU{mDQl z&2gpt_3dMBT~%^pUqPX{wjBoH7+zkjR34-{B{yd_)jS0t0{I-j!8i4%MaghfFf`-A zy|Oj#?o}u~zAWoPbQ@`P@`My=DaIRmmz!L{Y^79kgL4(XjEJzN>-QXp2r!wcflA8l z-X?8jWewliupFO`qIJD=l zw0D&-{p5`l5{Q1E0BQvx#rmy9GHj#pBu1vO$ql7`tCnG>c@84h$QEd49DygRO8>;P zr%zlW_$um~u@lU5w=>{gz}D2)?$YYu+p zPZDZ)^qHUId%DH9bTzbp#$`Izi)g9qd7hh(Gv|%qAivz z1&S|hV4v87{*%yLYDrQHk+IgdpS+)|qYrG@{l<2%U5B zGa7BmeL8XyZV7XidfP)+&8o$jacx2z%Dj#p)n zw8F!N&w-VUBjogSel7u(9E6F8@{#ox{%xJX3Y(K#y7PT^=B7>2rm31^3lyS;eNd!9 zRe)4g)=Ls3;y!oPXGsv}0U`r(6q@}GQLqyrLaTQJmyssD9ii4NYx0}l&D1rdS75h0 zUwY8K;)!`QAD56a@iaKEd)GQ=IjX-v`PTd$$mxT`Gr;@FyC^p4>SDJvVw>S3s!Wt) zQ|{j9Lg}E9OOvQ5OK!?1o%U`0(O_Sn*8NA3C6DlZkyJxu3lu=77o6m-?8s!Z98I=n ze$bQxlv0~Py0vwm@jP??fu#(Uc`whCKfYle9UyXpU_um%DQ>ezFvj!Y-u~UeFsE9+ zc=$=~o>Tz&U_ajBqZmv0QOXzW0%Wz%DJ~K$(rc9{o1`;%=slNZ^y}$YT#}9~OT32& zH*d;V?8&xZ>aL|kWMBd`C>6Ezwrcfm?cDF^lWcinK5;%YIV7$2q-5dpX>!IDn7sO> z17~LYJ4;LubONzC8pRJ+?n*;rHXSohh~4$`aiM{z_8%CfQ^SiOHq5 zlxWGtl;RhtLWLunwa$eXL_;;DfM9njo=FeGfqMDHv}Q3nk05?Hy@zn(ZLRONM}0)2 z_0dr68ZE0rk1sT*9X@zSFF7e|UT{j)@ll|@8+UKT!(mN{Tp)j#zV4z-?-Q3i=CM5V zs~CqGipbhn209rPbW#0LGdVWAP4{XD^qW~*{18JhQwd`w_MSSA5g_VGVuLsVcS&_O zJgA}+i3>ovUUMReM8JJ72#~JfElvy0#b&lw>PAr$sxi<9d2WgHIg;7`x@q1Q8 z$5?z@tid7%@BVrOo#j^P1psG>0iQk929IvZpvNjb`{&l2iu2^Y1_Xdi#Q;&w3a7DV z+((jhKBW>ZN=I6yb(Y15}M>d%6Kk~ZsKpO^F z6p?JfqnvMGTRa1zzKmN}C|W|B#FDvrWFFSUuC6xhAs=mYFAY8H@PG;4_N4{-bvuB5 z4=4PPJpD3#!t2i|J4Wjhh>Fp}^$m^QO^M;7E_`X}1tvbhro`|hynC^oVI{P{y3hrg zq%zx{5MELhcCS_TdAl3x^xHco>BdMbW$A2XBtzx9PXW2>QJ$6ypr>JabC=-6@PN=| zj|Xwqr`n47(1wLjT;4IVQuV%}TN=K`zlr(@KWO4OLl^fuI@T!m7clLJaC8r8nsi5T z`QR?p_h67%?Vpk*|1Ny}rI-Cvhx?zCCI7b&>VMzq{(IT}ug~$X>vn%dOaD{1`*)}M zzpUH+yHoy;X;b7stONbW{*ILRRmJ~bcDg}8I7vwXNd6jBt51TAkDew`6UeQKjr5Uc zrYdn&_o1V6kETf`Ar5D&q>?P`Co}CYU~-OT93XW>wfZ2g8EJ9Ts*K#fiA~npFzLpo z=K=>6_R+%SNb08|X%8)M^6&;fGRLw|LAk&Z??%tpaRGfO2G5 zxgUZrNv}ff79E5&PMxc}BuB+hoH?bmv6m;$R-6ffJ5g1c3%uIj!NyuLAvVaEQ=DkW z3VE!r+<9`E66^$AcKphww@Y*wFO*<>XPFF6~MafHrQv*yEB zRovZcQgsSa16;dFeCOOWPiH>AuKy6$&y%u#&?PQH1&%4JW@Tgn^fdZ0W9ss%Mqc|Y zI|)J$)?;WntCTn}%{>`twh|A0`%y_+kE%jqojH|Spl}jFM8}7fimizj31S`K>KoYZ}p|ki=b=QV4-ALVTh}1z-G}8?o6Vp2=3wKNM*; zm4WFgw>ZaepphB>3=T#*QCt7-Ywz!2?4lrcUkHkAiJ z;t(q!#ULWBrm=?hm&bf|h3HC3WQEARq53vcBDO(yk0p*Y=Tv>Mh10rYF}ofsX-rqh zZp)de;=x2t>(gN|e{zB4@0V`X@sr5NHoK$O6Wd)l_9eqv(tzIBL`JZu=8sHVYnX|* z&H3Cn7_?nEQT~&2QH$!WUG6DXz{o3ZEgsbY&Jo+3)*A?mobmTUW=;CH1DrF998I0B zxtd+a%Ns-mMyaZ_3J6=lY7I3R7M$&uLw<@fAx)Kck>J{H6CY*bNE7$!vid~6IC=wI z9e|YMv9~}w;0WeDD}#ky?akp*<47a7ymgl5epWb+UT#FyxA|Q+vy1ZL{0vOVp4K*n zgu9wD1-1dkJ>E`kwTQ*K_Yf*=iWdWvy zJ1bI}p5m&$&DvF;SkF>p(bGrQ94aV!l8;?{&KR0wF(a9+(Z>EI=90|NZO+kxOye!T zjxP~E#(G-NvAg1!p@Q?I>2RaNQlXo}H;J*Fl1ZN8xDn(Y1Jx+h{e)S$?fljvvA%aC z=X|AR?-^^Khc6iUI7UR8bIIB?On=;CX|UTAqK9<^pN^~aFi^42%!Q+=-L$*#NV{k$ z{w#ltTKhNK9j=(inIne&LKM7|EtYmF}@xxIoeb>R%1r#;t6RG697>(#99W>-fnc3(?g^ zcvnrJmCHMGnvsxp`Q@LLF~!A(b|u4=I{dCmjeav(E+gn!L021hftFuPQ_PPThJORS z&b}DG)EF0cW7RE{WM8?7Z+NGwKYo{9wQ^iRA?@in=e?=K?x8`Yj`#X>yTon9G+H+Kom2i8Ff z0`Get@-Xvx-?GS-vhdz#ue`%E&ZgVx<|uhme@$hEl~mUg=(>fp5n#NS@q_~jqHPAl zi$Tma#x8(~$9Ub{@1jb(9Y~os$^))X#TaFN;e49dvDR@5xK>8(u1f#{I7ygBAP$tTn7}#N$pLOE)c%3uMmx-tA^T7uej1 z37?Z&onNP?vl&YZse?aQ-~czEr%ndpT0>4*zUK;B01=nN;C$acaq)#eY3oAr1*EEOC3zQBfnedUr3+laQfAQ={8b3bOywqP-W=oA0OzUx$f6})HfZ9m z)JH(VYfQe2y#tuRFK!ygl9h07hxQOMjS&5Y9*vC|0VS-+HT;W zi>2AyfoPJ?{>$f1OR5Q|D-gtyaxj@L--hICp%aGmso9ikKJzR{h(Z3*j8gGP$?+R; zcDgJu6ZaUzX}n!ux~5)QX6U%E@Vc_C2OtV#|lpQ$KrClkn?nslsIpsrxPh+dZnrQ2NJ{+JJh`P2=^~mv%Gv zn%#~bWO?NUG7eKR(*oJ|34Jd>JL0L11MO2R}ZF+$LZLgu?%MpvWhGeSJKo=h^wNIwHpJTkiW z&KBodo?dx&28{cep)u?}Gv;Yvz`GOmkgqPiPQOh5L&MO+?oZzr<}}RBxc4F|??@z< zhCI?4{TOj0@MrqMWfDfed*yEQ<>ipa&xwe9v4igCEN!lGhCVQ0eT}OqlNsfuT^gKw zZ#!b_o4z;S9mM8_Q$s>J$*>;YXY-1;$<(xd2EZLT@G5afBYLV({gp>8b*7F~;Jh+Z z(WDB1k5l;bOP}>UP+Hd?vWpj$c>}APFR=a4%Gg06ho%h{&!Mnp;9#n@ZEAI?U)B0_ zZ57gp(y1ca3sopJ~C(@Ov;zw$dyl6H2+S4=L7(3!kDY}h}wwc z&9TGuG}DUyZ;DB;qtu1Fn9{^mV=E&E2%=p8Ydwtt=BZre74-SL9mLju_|jtjoTjw$ zRqX{}J@>Ru4%bg4IH(59$m?SPI{op$Xy6HtJP#xz|W~wf(E!=U}f-`c$%Yoi&8f73L7_eKeCn5Aq#Xg zcQqh_a0p!Y2737DClFb#aQbt>6DfFMA-z{S01o`!#uGFJIV5Ke)NUg9x=$**13oD~ zF?CO(_xR$lM#pC%4yyv3=;7!E&xTg7ESVK}-q2L2WgM(!y}&b7k~k0(zR%Bpq^n1E z8(7!aGqA@U-D;KgC5NOSGSSadz=r>nM#k_BwTg@3HZ`Rg(Z=c)2iR}NjAT%^mRc(T z09wz{2~3DS7xXb_rMoIsw@B#bA<-k_|F}-CAC%%IU!UxrD$m+`R_1g z(+s)&NTej&7WZW3*)}v!XTEt)#Ypd8lintdVlBJgh zGvC}$dZ0%86GhS?6coqKG+0DC$fG^#6O9vh*0|*g52nn>I;x6i^xHo20*S32CGjWy ziHiqGgZ2$8OiIJy^tJxG*M2`A}C1`b;W&|*WiM8K3j|5k$F z`mRs^52(Ws#b?`m=#33gXR@R2dfs4Lx^GWCP+1hqz~Fg7l4l+Z0LV3&?NGbXjE9{Ek2Rf*w@GqjE;FMHKxth$57g5j>Ci|na(5Ib?}oUd6RnWLME|^H7yDO zrG_vOR>-?DVIr_t_YHcbfzu+zV31d2-%Tk7_qrO1`Gl9qUu%XF0HVLaY(?K$7q($D zrOVAyrmf55y^c64&0lJs-OI-8lY3kH_;-_o6NZF%hLZVwJVrr-GrsO=L*R1!@v>jr zKCjHNr9*&ajkdyPsOh^*Pm6qSN-NKUVJ~Tf_KT|ed2x!;X_I}@fTOXO;BVR3SznDU z1fqyG_)y6V3E>Y5L69sE8Nb;vg`{C}gK0x#Ly3*#4qqtX`sDq;l8A1iXRaucaYsB7 zg3{xmGBGPR_#$}3L?sPW7%kx zTte8CdeoFmKE`$O&=>uhMANBMCTSmI1BT}yZU*MOW;1&jn zW6J!~U27*kZ^0H?ihy{`!sVX1Tr%BVMy6e7PCq;jif&E~i)cD`mWg{DpL5c!Rrurl zRIUk-cuEnU(Ts=BI5=!ZN-7vgB*yh`>VHc~Ib$;-0Kr>@1~{@!x8sNZ2L9ZxlW;Em=;fe@h#QX~}a+{TuG@Dh~C3>-qlAFcbgIH~i}X{&nf)uSUUt zN-zILQ2ei#4E_m~5cv-ki2smYB;_P!{$=Uqza5#v{1+or3Xr5i#5GIIse~qO5CLEC z-;566n|J8T@KNVdMXt-R*&Oxx5HlsC8B+pdO+zW){jI)mD@=*+$?eKpf@;J*VOLbb z;hOH60WX7_fZHRO7?A`|MHq9PdZudE1wzKIsjzTDGPM!LKCV=v+CCY;0s#PeV!87q z2K_Z(oko^bj>FiFxC7d;1c9?3&5BDX>~L3F5?C$samHDDJd|_y5&+pynU+dehhYQ~ zRBTzVwkuR>WV}W~8z@t|jk!Ti(FtXo^}>u8Y*JVtE2c^xQQO-StqQK~QQ6&4@{3%R z*UHE+mWUJOzPGMyzCadgrb?ON1%>#)RF?AWoEjbwf>}c z0_R~qtR)#WFTm<*s8s465oss@7!|_N0YA@x)yPs}kFa8b!u0AIk6CUKl?2$?QB8~z z74yx~Qqs~^=NxcW&51nqDjGQKeaoE=xp3tjZrVQ>YD!ymVi`TUk5Ft7p1bR=*W7u~ z3C;SDETK2<;f5c!2#!$_nUUL4eL)%K!B*ny6k`%yQ?sEgf7a)WjTHf0HF)ulU!IQ1ZdeJAn!iurbg6spSQX$< zDP8dcMy2Y3Q<^M8e6X#C&D$7aN^=M?NMfHT51eJE?kex3oxn zIac!WE&Guk&xLy_Gj0~g-OzTLmci1TP4xoToYmj`yJ5rS%S+V#pcmtMqpzP)7*lyC z{Am_5b|x07t<-{{qw;)SYDZ;#oO9oQYck~@b}85C;=iNw9ss*WuSTfxrPmy94So60 zG^9>JAfeX4+|JkhP^ntz@nfA^z93~woDkPz#|8_pPcLkKOMfsjR9(Zp`1atu9iPi# z)gQ*s`AYH2JxW&i1YmE=y_d%;1})E2I&Y{HH`^UyiZuZ+VITkw%4X6 zA|q#M{?i=0X5#|@NhFp=4U39B)-{U*`m^i(%J<^YJ0Sn*r^%R3*? zY7^#)@!})T(tW5T`Aql=wK(^fzlq4jOMK!ZGIg(Muyvl&a926hN@jw zplQ8o_UA-SL`tT-ixwzl(Aw1{k%Y|DJ3A2(GcqR-8(GY-{^4u#^UO;v=GY5o&2H1}cGjUR^8nAAa7(IJjt| zv>P$v+jdP(uIg#hfR=!vR)q(AKtCY_Y8nvCI6L-ow`R+s@ka)5Bi7AG(9UkhvsYqC zF1MQGW5Q{sL4F=mV?Dqq3FN3_s1`}9b~U6BB?rGo$v}C%-~MTRgoHF|q;?19Q8{f9 zWKh7Y@F}`aVD?RC`8lB<>=dCZO7x1u%J{xZ4pgbxq0@Xj*lEmJS~x04qH+VC3XKbl zBCl({jU5>TLirl-3w z2qgv74WZCq-=umX4=ymefRV~~{oWQZgMaCdBelviG6<&u9^20k=19SMK^Bsa8Ea); z4pv>4S}8GuqNje`SLGM>NeRN$)_z}vJ$YjrYFc>7%$Sju2VZidVaZjzYmtogz8{p! zq4sKK`E){LKNErL&z-wC%fkx9zxNGQ^geZZHvc=bJh)Spi6aoQpXjgB5&qm%>8=rA zf!}wW>G?OeF#~U4*%)u!v%aM^?$hKD{>MpO8;BE|JzwFd*OIO8a#`(!_%jA(uUQ7! zc%%o>y9kG8Fuv0mIZYD+@Xlm6nlXhOUu3(1!Iw_Cg-nJ{Chq#E4$;28Z2wwAJk53X z*ZUF%44y_W{Y|v8hn@$mm$I6E=8&DM%{CLc_q3yxT58^QQQ`5AjH2=*1%_|j%BPKz zKqiLV^1i(!_szZxloAtZG-8wfUcflDhXBA#k+J2??eXatIopn&TcSaBoix#V0(qZ8 zs#r4abbQanhk?RQTl_N7Y_gbl5iZugmj?Q$zKTN3b)@&BMD?N)%k($`%=qp^AAiyu zF<>hL{Xkb1Bunjis0Z9(e0t}$;NIl&R+VJgdEw8{a-p5iAuBzK^9Hk|e9}2#FR~_Y zpgGuX-&3xC5!%uCRS&L(JZICsG1Hgs4xafbGmGIv z)4flkg`NTRWfeLBg8ap)Kl)6P348B(MU3M5izWM(*wtgBZnk0`FWe4Mt|nQ(>E_ly zbFu|D#5^jeU=P{aqG+C5aWc_WC2affR;^d*S4p!5x-E7*otigDWO?}2oa0$hh|ucX z&*G@w3#XyU#s2tami9icFW#zAhc~{(zT3)feF){zjK4kf5|vA(%y`#(pr}r~?IGPo zs9);zmNI@%q^e%cLHqtIhiHRWnUx9?0p=YO)gb`i_Rlh52l>bC^LsL(-JGPMbSTru-Le#RKc27Vgr6jKZ<^x2f$zR=@!%Xa{L^APmVCi(dBB!s zdVKN|`7x{>Tj^iuy;?^RS#y?@MK~6J2vMp&Ze14Zyny!qf=qQBAPl!NlyRZ%LJJj~ z)}Er@JcqJ|^)bRJp|0K&8xAwU;6hIy%qaISQ89FPA0Z>vi5$M`C0sWY3&c`>`QzpF z=Xq|WQNc$sC5p%aNbpi%FyYB!7LR*Nx1H&>&A^k;x@B z^^sj2HixuJ*)qh}@)WQG!B)K0lN8${B)+E8@6-z?rzEA^+^voNaE?Q5SncQ%1J@F+W2|t`jl`@lh!_6CbF^oBE(4(rVo7B zHVx0fnf)+E+NW5DYMM0)>Y!=oyjRbsvoh6z9deVWGz2t-KJubc*d4F_AGOnU7M}i zZCBa&*VXuj;#r^~X+rtofzdwU2)Y?b!BIhEa($x}I+I{kdZdjABKQ3YCNf1PS=Vo0 zT;czbS;6iZ556N2GNcyYvyd}hRBQnwgex$KF)f9^B(Z-B&zaPHl>$&^%{;XZN$Fdz z%zN5?C^c=TCZa*82~&okf^-FkYc!2*rT`6T3`Y~_kHKT6^?Y{TU0rc@=9zJ}p)N^@ z8D~<5C2E$KG9nOv2TQZYE&t~{%`5ve8^mXX3-pC$QhRA^=ay+w#QuH~9*znz=h zcDlzdSuB8iNo5#V4lb46L+JK*h4_csO`zUG0dnPC6`Oe*aUbDEv>-Y$B6@3em1Lym^LOR{Zo5EVO^hwnt%}Y^ge3aP06B|!Hxlv9Cws+XI*sX5~a<=ht0YOxE1!+rK#ZUx|oSiKao6YjfT4@PZ{hU#GV76Wg+L7@(6-?wj zp?&~W8G(8nDBrq8tm4Jfu>KR>=zRef$>9^o5#)Z}<|q6^rMz*=OF_Ob&F;j0@MLhl z0j*54xyJ9tuSGe1#L~;FA!~?GQ(r3Itdcth*#7c%%Q}n znOb3W{>0XO**0WX6JV`3*A*1i=d`sZ%{T7paxaZw#D}EoNlO*n!SUpAE4pHPHdI~S zdenC6H4f7CcAOr{FFLm!R=elh@qX?OFw++DPR_`64V+(3Vwy~|8+Wvl49PtMHIzf? zJ+NmvNF@ug+Q6ljM!|^U#Kuw*#k;K9Q*aiL5$!@%2;fo>1!n>o5fNu(vI{4S5^l-q zqGn2dtXpo_xh~?79LlBM%)OznNoD*pOG{lRx`+{J=7H4MOZWN`8_;bVL;}O|pS{o) z(05oqDf{+zU`(kzOj}3e?nWKBycku+B&RL&uEDabbkE2i?G`x$UY+%+1_Ap7q)LxO z_(YQi$wc~K0(~#geTZZ|EioD;VOc1}#y3Sxbo9Gev(QYB;lf;C8y7&K)rkSE7Oc5% zVNq-6l^~wW*b*}R-n$J6chW83N7Uwy`0Po7hr%_g+!}LkfWNFtI8{j0dHPMPnQl_u zP2TWtyBs0CCceIKqj?u87@I?6O!004aIHq{8bbJq@WNL~$K1$&4l+RgLskE3q9D-U z*~~TgY79ZlSVN0b?3Qa-Fy}vydHlbL6#oM`kpHbd_AiSOl7E%8{!@(jcQN6=ngfyj zC)6?I-`?}zrINqI2=Oc2!vBvs5Spt11{nAs6A5wfX*||WJv9j!tRTW>Ez1hlBwL>< z_d#%F54TDb8aCO&EE3D<0_fVMSg(G;SphKI->C>FDL)2qJPF2x`1R2>3PD<)+04i# z<{JQGE%;R-Y>zzEp0AJVwT6p0O9G%w;%`K;%+)6TR6a>|K+KTK-Art|k1X>xnnf7M zO>{Tfq;=smO^Y>#8A>ku&25$ zs_@2vC8FtxK5nlab8d&r2Xb@^4EBHL>sM5!!dED+)`=%w>Q3fRm>kuCq)u*^NQTCvOZ#1j0 z=1o0()kMB)#%G>y;3U#5O~>S3k-_Vp3^!4L;QC#8E@BNkMSby7{c&~SSGBab19(_J zf;3~FOVaCnu+-3;P$B;I)|CIXv>C6YKPL1d_gd4^rNjgnwzQCWeaz; zp**#!Gk=Nk^duQXl&0L)&-!CNasR<<3|Fl%bN}H}V39mn;}!xW8c3K&s@y_mXo&Wa z9EvBh2Ph)E^qPgJ?i`viM zqd=uvLqhfKj1{?yzBQE&Qv>;wl+UNZkf^cL*W|*C&1)(eKa`z|ik@}N@m$Xj=5qeX zA;8KW)tq)4lSt4D> z8;djK!_1x8;}H*0iwc+pnr~4xw%%eAEn;+p*Lbe`JSbmUv2s+vQU-!j6}+7{8`cB) z!5E|AlOfesP){oezq?xUHOIU>c`>^xo4vjbxaF%Xtc$}R_ZV=&6RYwyt^?9;0P6};C((Y)WMT zUmcAbfwbJ~9=?mej3k+vc@L!*)dBBu=CoVW$pPSFSzD`=5^wKyP)51R_BubKyjD__ zIdMjl6D|VSR1FUXT7Zfza-m>>_m1d?5o*kQ5RyV(sRO8S5x1=mB&Seun_z?wDkGnu zWXn8>wtJlQQp_+0px}OMzh@f@X1OKlo$#i!)A-%zEIoA6c=?a6FH%!eb=W6cbeb_l zXib_|`iiOY5Azf4cuDe9DSH^ASn|C{Qazu`2qTts7770D9ddd6bmqe#b&1MfdAUQz z`$oebq%7~<)7(iJA&JXoU!>xX>aLi=ydTT9>cu4|N@rD)Wku7NR{JA*)r~0z@9<0Q zT1eKf=xhEK>dnxknB%)YnIE8D)c-1bX5x;xH5s~!Yw&Rktln(+5pvgOLZjv*Y>+&s zb36eeMwsEc|6;&{DUM7`)X}euP7@)HkQOB%)jC zny?Ge^O26`nYifC0K4ZVZ;!llQkxQypNRf_XH-&uzOWWRtgjR=zRPUo8&JHB zJ{s=0Ex8aV0Idhytkf8zB=*u2*eNQAjwHNbdSmC37ouCeF>}|%R61RkL0l4SF-98c z(O=TxSL_m-b}BBQ?DK+O`iZJ%G2?Yz?AV)+&9mX~(mdFeSWBU_%cj6|Nm|7VtvN7U=AI_{fBZl&4 zD+V|k?;NS42K0Dq*E7b`xw-Cu9jCN4Ql{u+612d^E#2&b+mBHS&9x)^kJ! z0u^@3^4E`e+eES~8C2gy^w8!mEHkZiJLKB%GY*Ht4!_-y+gp_kRX^*7d}BD(K!@n* zL6836vZ@>I&%IoQEytLpG>%YTDn<{$(oX1*hsadnJ6R=OhEGxvk!;x{+5sAkllXq2B8d;gQ` z@`M{rX+r9+?syjk`iU@BoM2Ght0tct-V|}+uiIRqO;)AM<+kOWM-4YbEmYNxtma&N zqV9_beF5fJAhpOoW^f;byjZyTEab5nyD8nN!SWbeYu(|90e$yixWu(Zj-l(}qUBG1 zcDI*#hDpb`nYUh8sYHf5xRKIEQb6i3|Ee!Vvl!sG=IRT|xs!Ps6sit+;q+a? zsezvUz)6i=E%!ZKTw|i=8vJHt>QA*`RK@LfjW+h`(&nUypIv&kUgj#-chqImZF1Xr&9Auqjwox%5J6Y(FoI*MlITp)^e&=n6t2X90SMh!d9b3=VVd!SKo>L?b9H7A|N^(>k!u zC3@K-q$Hl;;&>pVJ-YBf#U}|xNat}%7Ov_d*gDjw$icC1Cv^q=(}YxPOQ@y9cn>7O z!t?PD9CxrLyo|akO9+DXXDv!~68PKnUM?+aX!-~lS!nad>)(3dNvBwW22p_kGG%8* zAC~zl4sheGS?bQ><1Tpm9eRIvYK^ony(mXaDaN;SU#$V( zn-nyJ^mnW3C&}paWen0h3DtbUFi=G<6n5Y+7}_MPEE@O9VD#bs~KkHcVJ_1 zVy%bub+?SrRyhDfF}sb0fR_cg>s(#3Sw*@G1`I=tIYPY+(fo$%gY#@!M{i2o1Npt6 zqSqKQ-FErf=FqX~{K56&W3l227Z6=_wHxQvOIh4>f>(2Y`iHH&|Et6MKf=WL`(WK)pYUJ5ss0Mm z|8-MI{QNi6|q@XQd(3}Tvl9y^KVao z%Ok|siBn4UpHSrf{+|Een@UdVU%#pT`v$Mte~pRpKW6au6aHrK9?xZ}miEiTSOP*f ziu&C%;`tZ$3&+2*KC`q&z6^?cP0IIYd>6*_ zbFr{w<^q8{ZGL)eSvH98^!0Gr?dtLHTX{1%YRxLr$3*xFHMA)l2hbqgGUG^_mj-VN zp*Q8*jTDwoyQ0+Rm@(-emcRF=30ZH%k`lsjW@Z&fm9zFXVwKhJ&D_{QSXupnTAIcTy)}z) z40aj-bj;?yjslN%k2PeMA6$Vk)RRfyijwV~rBRJqzi%k*#$|^@v*maraTn@YXn|PHpHA7I>zjC@q_>xQC)5)6g5LcmDx%UW0 z{I#m%P9K#gH@FodE?1iO>xnA1Tk}5bVl`EVj$kOF=&crt*zl0^36!C)P zFE2W%8l`rP`nyLAf*B>AaEEPp%(W4}**uRMVVJ|XB)u~b1TY&~G*w2aw8=oY8A;@+ z;e-J>Bzysn?BLFrk%PvBZM_7PV9|qA&f+sN;8&WpFKzO6ZU08#xHndI=BB?`yS`vA zdrXR2k%ivh{@qO;F!2bRQg~DxWAi;#zOH&6*ulLcc;%Oq=er>@%)IdatSeS8Z0mIm z`qt$`=Y~wLJX?Ig$I>%2tR_tLYqGx^r8AN>ZW$dIx6d*a@c!#r>NX4{y1W<-{Cd!& zJf4Fv!C=I9-tFi;Z%JfDN^o=2e?-?K3a6XN^>>JW-#9yPz8;mLpO9ZFx54y1xzt-U zzUn0+aF1lBqyDb@cN7kO5a*D?c6-Vgrqa$?p~oa8ieWl$g8A6wj-CRD-_ggT)Y!O` z7?p;byl=GA&0?oBV~EOkpFN>FpHb!2@swJ8dMm0#%mrWjrf0>2h*%pbjWGz%Q9b$y_*dT|_L51)N-pOqNJ3 zBbPgbtqFl{h)jz!YLb#WZwB8FAR5#ntqGe_AQn9_Cd3W!GtQDgv{4+A>ZH$koHhd- zk%EGQtpSKtBpg6N$DQfUiKmZQP3-PYlFaI2%C?$@42`X-I~@d@aCIwdAr-{(v#G9< zX%g`Zgl^EfO?o3zINqR`V+#hMSU`Z1RvfCxBEXZwnYzaZFg&QWs4PzanOz~FuVUP7 z6cnyTJH>WQW0EF4coc}|kR=t^b{a{Ml<-xE$!AOemlsZAQ5^AoEv3c8g@>MI)lw#{ z28w#60PH}PdUrXOwtDFYR5wD91m_37meX}}48`2Xf5@xnId2#_H7MC3x;vFWAJu$X zHpiHQht+8dP(NHQ=v9`9$};tCQa+6h-({^V|E88g!@^Ft>dIB(YaCg=sSu?5*;LWe z5FBAA_%#Nm#^B{gS}6R06#689r3O7p(q?k^T|%nHP^{P1be3);4y8BcSh1M`E! z*Hwd-LkS0jIzBh}d+sDxn2D*%8cSfw_suw0gSAXqHvEj$u`+$P6gA`x)wBn*y!-F- zyq4)wwW=@oGeeXN&+b*wgq9L;Gc^T<9Xm*K=RkE-Ai0rYOLa5KENb-41AuD?&%16= z8m-9-O!o-;Zd&+C->6Ce-`cxbpKpByvlx{Ak7vP_u3{e^*6?p|_6b1I@H$PXN92B4 z8RA~eUW$A;$NjeR6Snn1WvehAmO}6&?WwCSVD2fUtA2HsBcrPt2qRf^L1p>jP#i$q zKw5l0b06zDHO^;}Xh^a<4F&qBFIploN}r0)Y9H#2zk&6WeB_!njGHnYubi1*HC&Hw zek)LT^ensuI_AWqveuzVY8^&N()k%6MJSy9#WI-lVL|)sbbB88GVTN2B%;oBqXo{L z@}gE&U@}FjbcfA~Ma@HH*Hfw(Ib0-_`m%#}&{u7J_mmzw5xMl1JZGp;n>bQ-K}`9% zBN_uEj_7oKZbnUK?3{3y?NvQtg3Qch) z=eJNV+4&gZzasW=^Wj_N{%pEW#CIaD-BW$SZum$*%1Yg)OYRzXnewxe;FMq}?QIQT zsjo-40>FxUmvh-TcGC)ap4-dG&BQDW*i`3jJIJT8zaLY-^D1uO?fDHzmfQ--qoLas zj%`0QYR|vFI=`MfeZgplcp|su!O?l~n@-y>jac=hRbEf`Hrh6&BYfuYt_&HkqF?eu z;5>!&P!Ux?Np`d%QdR={d1ViAz0i4YS2$(Pz;r7U}%fTc<7SIOBM-!B^WZjtaL& zr$R~@5Bk-R)zi?Dc3DfQWf%Vhsm7mc-&@a-+=8V6`>}yWy$fD0*~#1b0=k~Mu^S_Z z!WhO8b?EV~LN4fH+LbXWgRh|ie6&Xc_GD_`rO8<}O%%}VA2vaxXWr%`;9kC zV@q^sMyZz+O3!kuvUHp|fAOJxh;ZuV==pk$sPr>r^4Wu-P1*DjWK2?58RP4+u-RnB ziQ03J0nWd^;Kl)V!r(?Eb#9279QR)9IauqfmNAvqt&av_r*NewsroBC*jad&Hg{J_ zUoABa-SEMQ{E?r+A)j`_Y9aMIjVffE+8)3VTnM3=NN@qyohb+s_D#T@qpvlvgNFm6 zH{zCXU{9j7?fRj?)uf|UvW3{Vq<{u0K&d8!XI&x5aznLfOqF5m#-LhSXw$?!!+H*= z2FkEjxWPM1cWBwfh*ANYg^O`gYqHng8#970$8+OFBd4N#Q&N++ufE{VYjhu~N3JHQ z&ANSJp4MO5Sze7lh}D%_6N*ga$4N5kXv?3f=~2L}mctHnH5>+D@ntx(}C8ui9zIRMPg zxil^&Y_fuxMg#Q+mCUhQE=LEP@s)>fQr0%I+-zniiF*RqpVB)C&OKF0tgy%Nb!QOd zq{~h@Djwhk!$igw2x)oc2@3K)jcWd10A+|SAwj2d8mA4W5wbp^fkPSx2P6->V8gMn zQ$I4})`{E74RDjl#wnbx^(L4Sm{}@;u2DLl?mW9erWo=gF3OlB-tv$jz+JVoioIN1)i%eYWx?d4f7~Im^S~A}vXbf2~#@6}v{jlxfmY zLMkH?WDK07QmOf0)V+03+ke8YO$iB>puuSi1PKno1GGqR3oZppaS84%ZE*?iQlPlI zTPej|QlJzl#obCNrSfZEcK3Jo?9SQe%${f8ch0>3F<}Cq?+n9auFrMf_v9j|L?=|8 z*NrbmcfG$Qm=7`sNrZo5Q|+SI^q<;MtOGC}4Jmp0{8~q^)hN=;+mIUA8_!QMq#lYj z8bs}_Hv7t>QiilNOrDjmlBq?}hUH7rm}zTgA(BsnJI*_BB|y5FW~49_q8T zv5G$KNGxk45Bhw@$D`)00dc#4cmZb@zs~T0ihN#{xqvtQRt?7Mv>J}_W-RvAAC;g} zn<2!Z%LPYC+UZ0I18lk~%!n{nF<8Khz3-$vqw@lb+Ks*ZRd~}obWFY%PKH;)N3JY~ z+hBISpCiXPRohE-vOF1g*4t#QVWCR{>&mFNa1!Gi7DEWI;!Ur%K!Y)ml#kOc4sH3_-)oVntJyH>g@ykj`k(~p(TZH!8VGTn+`i9A z`+(o_q7uW7ednr=%q;68iT@$xl{K!NrZBjaTk#knwqG#amF>hO^Nx`(4j>xKd?XAPW3mXIPng-+-9+pc7ezYq&_N-2yUsH+#& zHNBo2ECBqVR)34<6I6P7*wGdsv?oDOp)05`Dm2-mUCbsiFKE$(vsO|Nq|jI@u{2 z;>a0q{?ru%DYo4tDM*#AH!23*VQ=s&fX%EoALj*LfK_0g;mdY()ID6!CHi3lS_;dSeC)eDV>JI4K;K0D6Mx{pi45uU#uJs7>;D`XLm;z0 zAg=}Em95r%iW;^N>JX3+#2${`D?mHbfqXQ+Du$qABb0fpaZQ|ULiGChy;@srH=4Rv zA;{1p)SGy&kh+4QJ4`(Zs&Gc{(K33{B0yi!maD=9r0TG()G&y3WtIU1iGP|o6P03^ zeiN5xKgX*%;~D||&?Fv*Nbke|t6CXnFBzL`X_%yTzUB#X>j z;M1Xfc)uAn#PvTRQK}LEFpSnV-&Cbg-%}IgF@{R6$ZF0ySHHpvD3aSI^h*d$f@d9k ztJ7|8WvzR8^+}9i;r-(9&mYVt-^dS;#*6acWwUBZWesGg3{J~Lx}y(!>_5M# z=*cIIJP63=RWwmspo^btf|L(W>EP%7tQD?`ZHV-+9~(Ot1g@QWcMLe(Lxw256jrNo7yAofC7JD;X=Jd;51L`D-QuIg^ z?KNvvq{{3kRxlV0o{tI0a zt1jpWl_yI2O`>^6jeDs)pB{XveW03zB`9iZ!ZDXpwvnk+Fv%2GSiX@nfV+tsv88lW z8I7rWHWfN4=~t!P?CpRn)wZFMlzgS!4*dKPj?gg7p#kZNhI+{guuoU4P+l$lVk$+O z=<#Z)ORC#vtAk?E7BfSDxhnOe;3hRpO6jmb;pEnwL!sH?4M&#Qo7C@iOzMg+jeC6H~0 zf(|%Y`LXhpIU7o$PT}GzD5QR+n$x5B=ySP@Y6cb`uwC67hLM1l^!IFLe&p6d+}Tyj zPCwKOaRL1R4tg|`3BoM`Dl#d`qsLR>_OjKeExUC6H?y;(R|FJ!o5$!~alBjJNa&ls zS+gxgpRII+fVeTSjXs}9JlU=OK(rG6>4w>;wxbtRGNmLZ??tR18PZ1S2RZ#zlLN@7 zVoGCH*D@Lf_iUi2H*=wIWv$FnEKE9RZCzb($+0F&-xOZtxr3kZ2x$_5Pdo$9!a0RD&OIVWL6o=_J)#U67 zsLf086$}r1O{2jXLlU9PXQ{Io7)s(~tH-xL9fwdY+S&a4R76RhWKim^%OmDnFs#%* zz;J+ub|9e0O=;~OZ`B(L6LDCD>}7=wMUA}6i7{~TH(jc@gU21dPLj@z*9E&14^+Lw zhRhMuL~Q<4Z&#A(N`sq^R>b6;jMIrZJYSilKFED>Pn_C>fyT#Kmrh(ap3{-}4mipI zLyC##=lRMoOjN+Seb4%<+fKW4C$D9QZUnGIl2GmYuJ>RpzXWomOqB&};q=kl!87&t z6wz(h4fBCT`nrBc;+I>@sdLd@iBjd?_;INBlM&D>)-q*(maG8o5%9U)kNYL%kJf`l z0Gdur)``4&yQpQJ!n`S+@B*xw>f>FaJ1X|cv-^H;Z*_G|D?2v%=zUA&7sjeh?p9Ze z48m!y);>zI8H9QNH00*oUD~6C=w|OtG-X^JWzs@+Ps*|7cSiRO>`&V*27~(+nwS0h z4ccWgY8MWkA6}F`%=SBg+?sGZy}(7x=upV4_`^5`Tl=WVsWi{|R?L}J9KPZ_c?=;T zrp7K^VsplJWh;J*?YE!P!?sw`<9~b@#IH%N6M5Y;3S=p8F8VYVEDXYvE`V-Kcg8Pp zF?~k7wzG)s>`>%=3S%rtm6{cTL3!xuX<=KOrGcR(f^eR^a)I1O$dDMKLP_3x+mIQl zuO^1kO1@Usd6|0ZVy-gO4~mz5OFh8ZR@8bMPXHDwMGaXU67;HywyR+&LuPBlKIfd| zl{57y7K4(u59azgkHq)hH|vtBh3v^5lbuYc252 zx1TRk4aGJ*W}K6MFfA^aO?IbsFlA{6v9+4^l3xfJ#4Qjyq>ArR?eH(j)|q<*J2%#6 z`0gWrMOyaCZ7-|S@5b%-O=0wkpREPYb0>Bv92ZQ~p3Z3r1GG8chBs9b^bqr0)@q)L zmopLIeZFx&-yQTJtm~9&pAw+u=4uh&P^0t3lW&i9{Q$0@SmYL|4PN}_O#E_Bwe>9e z*;-PN?@8PT4MjXuDj`Ks-Y^+AA%QZ1-}l-MYR>#w!CqOHnINPVkj(edBgdF)blRn*;#|klJZhX^9s5FIBtD4zeHa1Sd z)22>M@W^raXn`3RrH0pE=jF;b$2XX8@&d0irJOyPh~u)*4z=e}#RlLs)CG+s98ZMS z5$_pH9+*6_+V(i^8!PVum;I7SmUEce%^I~2D~cQq-l0s|RCfztBMJhY&QQg-+-v|y z+JEQyB;I(OrtHCd5B3ZZMIYr_Wj)biH~?X++%AvcGXtnMPG#{1WAus5^sR9?0jtAO zP09XZ3QZy-`~+h>GlT8l48xpGqwlCNhi8f%>(Mpd_PAB8>n{o=`6@Tl?s0AvRmibP z^F3zUNU&eyuB+ChcnXiHTaRZsSsV9-2L+f%9o(eUpjs2dj=T3pX%gWZ?hnrDL z-M|&0@R-P#P_y4t0BMR5l_6Q~Y4Y;9aOI3DOB;^ow!OJ!u+BPp3&Sb$XvPszEsS#aDe#=p4I?ac$*Z?O-gsw7DTEeAOi_yEjpOF9U;YOCDFe>W z!P}$wl=N^yvllM(wq}Tq<9jK;ZE#!&ClN6vmuN1a3OAt*F4!FlTb52GnLI92Q^}Ao zKv!DVVYu*>IK5oCOGQ0Xz9~NyZ8lM?9ejm1jEdD^aKwl>ap2YaEzeDxU?6m{*6Gou z;>QL2B5COZgQe{DX$tj1ilc$&LeImhRwFMb!A}76NOGpm9d$^|va70=~P z>nE%g?e{TyZ89W(=LJ z@^-EAvZo@yvY_j#m2I}|$p!{p z`J^?7ezT|3MgUxGlUkHct-2!oQZ?!Z2ITbtBz+S-xm+%C>v4H_xO3Y!@xH9@szj#M z*4T>K-i3Q1E~D9EEC-5+KK|)hbb44 z$g!k8d{fgEshQDVr1J6|tP*<`&T>DF`1=|k|_DCU6-!^uMkB#ECt9nAlN zK7qoM$6Z>eQ-8709QsAiuUxP7mh&kNjyL7VT_*On*axpYz!`hvSeOpY>mOmYX|H^#$Z)1jkGT{FuX81FM4-wR}^LF?3va!3_uKqKk z|Bq98B7afT|ARSei9dt$|AZO-L3{rnm_bZfO6=dp4F9DFtf_HSEeB@{65q@2k*r~Z%b_@ ztHc(-5!qeY)X&q z2Z)vt5d#Gml5i}71lLF8Tz{*t)|L_|0m*6Ft*%`{OV`#hrF6#?s@k^S2ftk(sY%q6 zysEAC@mh?WVClax&TFU{I#^4d-;MyVZLUO++2nS|r%2i}^3R~{M-y2!U=$*}CEh$T zCyrk2l2mDr&+o@GEB|gebaYI7(d(O-%(|d@*mo7h`Rx56nF~OH`cqV-)hS$VKiHZ%@*I)R0J>Gefd1eSox-)=Hnror z*8Ycb&jNV*Ng*Ney62M+_5PMs3H9r`Zgp+-Uq?0i1SRXh!jg)EW`Ss2HxfooCgpM~ zmR?G;*{75rl(Y5dZfjxxhx(&J)G{N8EVkkGag9ySWDkIYzvk7Cvb8TR(n7k8c7nmf z-J(Gqp|L7Vh`sv*i7sJj!lVo<~b@%zmmw%MPx>*L7G}5P-kGa%ZC5 zOVIO#an|<99hY%nxzg+6aObc2A#+dV3XnH$&kr(sPjA*mihC@!NxJhSo@!~ybWzVr z%vfbWCoH|aeggUQW0Yb?g*iers+EOZ1G-k7McKe#Muji#XmE)ZX47`0rAQ(`N^@Nt z>?_a|-B^{8yt|y?K|jDTLjl@5Rb6cz;Orzg_|2<3naaPR3H0vIMo<1=m+bS&4cGT= zj9ZtAT7F=$svXy;EUTp7MX!idv2$o-g*mj*o1^q4J)=iQ-VKJ#yp4<96_8bvLo-dk zNe%&_L`Dg3_Cj1%5!|LJ>0UCBH`QKZaj&wP#r#GrHC^sgNDj+Jb<^E7_4Ji5eU&ef z&TH~G5L6Px9F~zVxR^spdec7{m9%>sz`f?6O9bR3BZAIWJybl znUWdaag#h+YUZOI*85*98xNj;DjinvTQ`p_@Riw9V$L7Q2hSgxhAJx^h8dJ>QzIQ; z&dYb>=Ma%NifkcRaZfYUrsN+&N1uJ7BxvyqpJYf?wa{Cym(HYEjP(+Q)$=@QH3;&w zV3b9U?r)6YuiWC^T6Np`r47Dcq zL-hAO1eR5*?aX3X{PIUuk%SLWC%cMVI>H5XbZmQ+yD@S^nycJ{v=nN$ioK#T%xh(^ z4}cFpdA7|GpZA-HTRKs;N2jsm_s~T_@JqxUG}3@n3KT8e`cMmOx)nTit(E0ZTBhTwUr4oU4VhH{QY(S=dh;=|Y3p7S z(LYlV2+f<5YviDFgn9y3(RSz&epruy?k-xOWx0fU6{ z!isIP5!?OSsC_D6(SxOy6`a*N(|)o2C#>J?E+>6<`Kaz(p4HrYx2E27dVQcdy(c$( zp(V&J-tZ-^tidg3bO%2+V`WQLt_P{+nx2wZ?n7{|KeIF6X-f9#oqI(CUoVFamcCkA z+{Uz=4sema}g#Ay*lMq@_EeX^sX7c}4Hk%r4jHN$At zlJs+a@@Dl`ygyhH?j?}!E1)OstB_fB=*zS!o7}5YJYSmhrZP{1*omhOR+J%li=kOI-<7LKq{Ndr?{t4jqi2xqwcVM zk+uuetIiJ^tqy=TPl=WXQFo+V__(YToLQU<4Ia?%Xe_9wh}ST_gE9(1WRyvxAcYTRSb|{89(Es%-*@~qv`^^ zj0GJ{oMZI|kHyQ^c?l~Kv+~T@f9%QCksZDM(L3V=@BIN|`}{tEUNz8RezaJ@o z3vQeG)Yi59$GV=u(=@~VyDFSP4a9fkI*ZaY+>MNC#^mxG_kaf?){{^2siSW%GpF3M zi~JQ?bXKN2|KKy7_PT#-w|8AU`c>=6X;MI3yE2j4kM=k&9lPysN7lkA`JiA-q#IGx zP*8uV9u9-`I_s0FH{)F&#*|%Vsej*%`BlgtdR+DqAEH@Rp8uom)iKOftiSQRrL51&SLM}Jp6xr1N6sua~O zB-dC98Lac}&3(Aq9%L4Y z4mm!IP`p*#m6f2Z4TpLio2#JKQTV4|&Ow2793&X0i5eBQ->yJo7f!v(2?G2ays1Zj z)|}CfhbPG%HI=y!_13YHZL;rTgITjB zvwa&IVpLThPUL)2XW&>rDR*470>3A~-5aV-p?RbiXg?_F2nvbo;GZ&+!}8>p_d`Yp zFJNYZ4&&acf-DzEMC|!-1s*u|I>hAR~?3$y8fHymwgRdRnpa9MnrLB30e)vUifPu%eA)l~6r zJi-QJM=Dh7%Mcj$c*<*!eY`Mvp1iocdmfH>c<`zF(u0>THQPuT^!m z<*(SX$A||=-k|0SP?5`1Zrfum?reh7l5h2@PFS{ECR6`#A z^Z4R=s+ql_Xn9m!L(YM=DdicVs@#bbZ2y8y#Z2Qu?n!a1WvpMw!2&$0B}>FeAbv4y zq@5eVMpj)UcT&sVS~GD{k-2XfYOVfwRy`w`U49OpsTTf>Ulr15$A~S#hMs_j_n^sI z2pC2-5hLlTp*XU;;df6pnqS2IXGyR}uU#o$k_oUiTiFX|Sp0~ArsPZ|B@7eAc5yGf z?AOe|DOtfPWNI=nHj~xs;q4}Zl_n0SeV8+wvZvLN(*=xE%gnB=LslJytRA;l=oGsc z;U7uaDNZ?Y^F|Q#>^3t%MwE9iGzIj*+bL%jZ5FO?nYZdz5l9Mk9_ATs{Fo$RzAYugQHKlCm>CnJnKkqTG4(}i} z8;^}qow)fBx1e^(=>~&;_a#8`<;iFi2%ky*wq50mrpOm*RVy!sktStTQT?@chSB9Rv? za1hkEsK`9qf(U;>_(_S;B}4p6>+=8+8oT}==PXrQ_XxFEws(v_<9qosFOS==w*$l@ zP|vcda=vZ)u|=nwKwc@PvIj;sYQd;UqWXXN=c``4#jzp1iJDz*$U`S+OH^EHzsLHEsQ*4X2s<}Ngs=ktl7FUv^2VuB#Iy=(`y^^-{_xNYBEoGjdRKSpwx35?kXmS*&tq8m z&)DhSbXt@08PPQ1>Bmr!C!eg2qt8N4pzlmc9&?b2xAyyx3Hb!><9dSI-^Ih=sA=pF3yR~UTA`Nv?yLukx2(u zJ^Uy=EHnb#6|28i5~F?#rfeCYn@4XbY6}kCK^1B@2hYi3-;b_b-j`_gVC9 z=|bO9v~W15qYB=2<$~tyWxU{RSd_ktR=?=u&eSQQb2T&L^6}z5e*R?1@puL*Mfy6F z5Zd8y9j@FI7TaEqWmMP9EsA|zK2K~bseyLpCV7yS1dUW%UoBynu0p0tQ|XPs-m7?2 zbYFIqP;V8Q#VxmIsRnWIn!}$`9jNw=snKCND_2EkPUsT5hHH_@b*1ij( zk$WaL`@w3p(^;Su}7nh>S-vI&(&0qN*?LLQ%kSgZo=1b{DZS)R^#BO1bLg0*W^*n ztJjB~U!?X@-<0Whs1~yrKfg~}u+VbgA2V0HNlahFuHu_wPLtW4nr7%>&kA)no|B*!zI|# z)VyGT)I`;I95hpOHumaeQGtFDD%V47b}V(88$uxU+el$qHYi_(xRK`rc=!QtD7YP* z@4hp8)a)p5o^O|3z-i z`^GNQaI*EjNuMD^{svPKqJL}aK#2Zr5C$Ro=j%5cEq{Tv2(iB<&k$mN)5Z{De|ff> z*Tw%#v?2bSYyOKEr|9l`lhwPy(l-zN$jk2L>py?WKY43^{f+5?ka8ZYGGpOa1g$Sg@$H z+Nhq`qA|!Q|Mq>|@uKX?(D?eB)e8D!lJm?KCnF&r(){Z zZME?jT>*v2txF*bUp%@CujRqc*CGZV()YyX5?v~eHDGe<3%fV32zfuBrYZ?u;xP?) zu-E`(<@Dd<$vf680#R?mS@Qc8W}~^V9z7zGbrr|`Kos?*ifr@PTe+7Jl(xZ}K*}V0 zdNI%DN6f8L!K0$>ZcmKF+Qz%9S`tX;?Ks;Tz2ml}s*-pFhVe0oeL|@{<}$vGPg~9N;XUdV?*tzs z>}%R>>LDJy6Z48XG2~4Qv7-NjmC+h+7;s6>F2Yri@xiCIA0gmkv_`TRplgy~frZfq3^{y4V3+WKZ> z*Qj;EhlKH2OvUsoS~05T??e1_9bKm?4JukuZWw@v2U+1PU1en3ZNo#cVAc0KG+bHU z`A?n#`Tyw5-6Jrw>;~AMISsygNBebhdBHqE?Q5rU!ndX6XWp79I$CteJe~I^XZOkJ zB3tMmScOb!@|_)os8s@qf&hkP84pFzvrI*g;89MelgYR?vs5cL=6kh}8$3?G{-_#R zTgbp1e36iztcaZ^Zc!4ka-Rw}l@gBVPqNF%vs|7DoBVbz`E{_({D+dRM?Rxy`F!{| zjt=xlk6t8d8;91oddSnkTy3M7NcWvYiqn9RhRZw=!l&*McVNr5j;m)+a|nhQY`X{dhgO4SyL;NCT7 z0w}uL*=y{}IKR2=hyFX}QiSMLrkb4Y$EA!)$n@8DkN^GLH=H z(*eTYlJGF*x_46u5H+bMm%|AL=jJHj3;0zBB$ctSNL7Lct9kKTqIZ_Zj+RB!L+BYjNS z6DpOYog^&sR<)N)=1Ro^kD1fCO<&S7IJ}C|lz6!BYssyrrMl2?@V+@%*QifSs+9KA zkV<~})pGVK{9E!MC!S|bp>hA2Rd`2($0JWDx6s5Yl)xU(ccD<&uy275bZMHVp}Af! z`USZ(_C%jc|BytC6*+yu%|>R)PN4h_o*NU2k)#>$$}~LpNFSx?coev?cn@`^b{G^g z*vbuR%0P8A!bo1@O9Ra%s~!mHI=-n1i6~F4Y)+;>*Y5K};K&)75@oqg z17RNKkdPsYYG2>`{Ta;G-YTqiF9 z?{;ERBcuxVqhrui^HO9dgtL^J^=w z4qWtVY~B14uk{^qf6Nj^t&f6Z#nq2}#JEUqrc){~su`%F9ZuZWO1AXDpwM_EMy)Mt zRz1bKYjZ%8=fDrQi47rUha{@9p_Q?6OUS)~Qu1=(*z_y8H88i=P41BB$OKpu3a{%D zJwtvBM(-9IgT~Bvocu21!o^`#Z<5lY-Ix3+%pkmOpa|65o?B)pHY;|1cFU+mc~GqZ z*S3z~Id`tK@{9mock#}*Kj6~1WeZBc78P!aEfP7NWQd6j^IsnxlK^u!69Vi z*Jp&mB`VtS;sBK_jsnP;oM zpQ%bGj=yo18A}QB1%1FP6)mdlq(j;7vg56wNm@PK_yuUC$oI#cglc9~c}tV7ZPK~< z(UJgT9wiBendOOf8bAcxUwsNLOmEv1Ek5!Gk-%%NxZB+BP5uNewZc+FEQ7(G6vxy3 zKw;;azHJQ+eJXC{KLkJ>(N`$Qn!4)ur+m{DV*uDu$&?+VJ2pJB{BSLm6kb%~+Bi9! zFv&0I51jZF%I@LLJE#v#_)QS7wBM7fxXnevwu4Y#^th)FL8{kH@|?Pfk&W^uMV9a= zmo%PB5nplFO{x`z@Ar8W@YqUCEo#hF4B2FyPq4x9LaQ2!`I{N;l5C1utq)U#Aqbys zQC00YR7xdy((oCGxgnmATqZhwgxXGS4Sdf_k;@wpgxNClmLB`8D@l!iR~jg}Ebij1 z%Qz5-K{$;92TQ8QC_0P3gRPcuFb%oVEOzb}P&ZXQ<%aE3e4q#ovD2(LULDfbn}oXP zO~D+qj@1gBs^2@CUl2N^D>->Rp`(mUh>EJz+^$8P&T$BQqm95FMX_twPs1JP?zi|kCbgdvCihr ztZW{C@P|vC+*9UqOS>Za=G=gA`z*;fes5~ucPhhAG5wx`_}79Z4Cibb>9|Vp za;ot5>n-Q+VZq4*9Vz^ifrih8wX5C0XRf#ueP7j?Egjbc{1U~EWSii4QGR!{1$bQ6 ztIvwf!hJrJJ=%LAbgumsxN<)Ys z_a);Ejrc7&^Id6)b9To=S(&1kdw^{`s4@O}2Ak8MLtq)RzDXyyJw;CB5J+m9u`c<* z+b2i6Ds7Oq$O}LfaoMnKK&~XfUci<+4tvCAqhnbxe!`UwKJ+%75jbf*<}m^S2Rh2= ztBTVTv4d{elHp!q4TJzTd7n}v8ny`Q*2p473p`gn@Px)#jjM_)VdDab&=U>1tioFZ z?*#I*e0iEU**Yg^UM0GAoIgftkraIHJ2hFwK$V%|ICjGJ(Hi%0F|vGs?+=W;4+81k z;Vg?~%TcC9hQ)=Kk7J5BBZJX5ec0ZMIf(> zrBt%BQw^{LGgEN!(wla+4quK${9O`>L}}L@;Q+!#D`W`HEXahQ{yRS0jp0Zdk%zsO~9dVNEGSV^1XE+Yz4=@Fd} zN9!ii5QV|fH$sx*9g(g-0%)6HC<3U0hu#6c+#5OEP-9Z;(ohut^;);Y8Iu`3LI8%? zlF?}Jf=Xc~o*@T30Su&(x*C7rfs&8a$mCgb>6n#5A}zRpMr!!d+-|)1oUsI?DwS3hYf1W`GkD@EBH08B zqy5tF9Xz}_Xz=7$xKW*`EhDTYd|if&g2j4Rb5Tul-d#-a7w#BzCK9nODC1`xJ zrm1F=F=xOymG7M@icvy7)9mvA)yDnuv1t&hPZjl##lNv&A4>tGwX)FsB$|Gk`@LjE z`OJ}2Mi-~NYM|wMZDE6gCQHg`Y7#_-`a!G{%>-h%KS9i$X=$Q_i|ImMsdsTn5)_O3 z3@$ei^$E-^*pdH3tTV&-QMsb3@`bAXmab-;MbyO~;oJM%OgT(lQMbIVV$Q#A`agAD z+5K7U0TJIXn_d<9GzhwtLs8Nm^uU&;Y~XCP&3V3+Jif3Z(Z$z%hWUj6cVXP!js+6#Twf_q7q@d^zW;Nh}+ z`m)IHHkL1XO# z3f{n04r9aDH<-hQgu?Onoqyel`S3Ub?`GLGlDgjs^#sUzB7Y&Hr#I)H>k z$HWyI4b1a?(Uw(y|(hK1kBku$}vm1c17QFG#vVggbRq0KxAqr7E-w=9vNd zZu#=qC#<~3r!V|z3&MolAyGhWj^?cWw9Q_LiVs|wTy{`PUCkR?@Lm1>0&V=j6JX&@ zv#Dfs;mS{2tS!Y6r<|ATmI0?6;U(>hK3n&JiG7fk6kVng*$mV(Tjl)3y5dq=WUgy6 zfOO2KE`kzV;Cv_2+xdRh;NZLWW3SCMD5L~nNu%_Pi7_lCTXb2bkkH(pc{PPIyb+xu zIO|Jbi2`kQ>9NX8(|2*ZXHRNi@luY=n^BQ}IL@`9L*)CM zLZR*8xE)=nwGWJIa3A^H5dr6z85bS5u=?=nW~#`Iq`)6eOl!3u(WYz}Ld*8f3QLLO_flieW(_YA8}36titUmE z?Iee?g^yhY z<*YEZJ>)XL+i=!+o5>1>*DF&@hDhaw_ky;G()YL z1?`93N)bACoj;~72pAex8jK2#6Sb9Z5np8{n5y>;YKXtoj zmvSEGYiYaTd_}@@MrcaE#_05Zu_>n{zEr+WE{w~(D5OCA_2es0)+LwGJ!=7*@(f0A z_(PSz7L9SG<&cfb-Uj9#?SLhuX_$42G4+&xli>w}ZggRW#67dXzMY``ypMEj=V;=B zZsAX{wS+s_4M%x_&pprknHW|pQsL{H40PiV#t9vAy4J=PHT>2kySry(^5&v$p`P7w zGMZQp(#E&XKbX%Qed2eaS@;^V`J}Tq^4k?7Ks;(AutXFTCvfePwy`6lasT8C$(>}X zQjYVN7UAXoh7~O9M@ZQ+@AFSDrC+$&D%N~y4LqHZdZ3q8mVK-gggnagz+6B6q5)(Y zX}mI@Xu&gRmYXZDe7Vhhrs2G?;atQ~?0d6ob{Pt1+29M3`a@OgTO=a)z_^Uvz@73n ztJqGbNPyZe;fO5TnQ7EvP#78XHTkeS%rZosV6_;H?DHTb&6;wz6}Ra+sqKZpcfmUy zNyBTx+p~59Y=5BF`s)uW!7==6z|rAXKgdzCSFa)1O-ZvKLikVwhPAz48Duw6;d zwVku_p7y3dM(qjzF(OamJ6QuO>kncVIz}3UeWr1)}f%Se> zikjr`ELrEp4@qRUO4=B8ltZ}Dg|dPnL8vJRPaqK|u=lgJ;?R_{AjgKARN;&?!d@1$ zE;oy(ALS_Pq@0YuDw&uSwoMBhS76gAniS~&Uc3GMh#uL0wH3?G%MJnU5CHq%(l;#2 zO%2gnXR$|TV9_SuRl9)oH8}DH*z~zF*(>_~UdZ08n#Tm*);o&E`$X}tC~nzTPps!BVurc!ol{tn?~~?!n;+pGfw%R4-H`)tPK4`_lnq3 z;$`VEeVesRAjtlfHp{njqaTfZYNgI?9O=x1Zi#4c+o}1kZANDO0A57+Nb)>vFzv)i zC{+)`<@t&^DUUEhKwy2%!9EW#8>go`skAlT3s?*)LdF!G0n~br!gHlk78Me&1rVJHbP?Zb~-v391J~wIHI2fF~~D9r*mh>+<}y4Nibspq8FxH4mt6 zieM%OrXbMmS^{%|vll&v6{#*jIx#br;dnw}f5UxZ|tdo>a}dHtdXX zrn-#XQT+ZunEpWw&%SGbu=Oem3cCjx<}l*b!SbTE&M999uj{v0Mk z;DdaSqWh-7WX3^mDn&J2uTP*a5T9!8aa96dF(bJdl+!`4_&pr8yeEf3d z6D5@$IKlBNt;o8ZS5oMwJHnTWR7%2NpGpM|+d73NxL)n;V_x#p`^r?>h`3L;faZL` zBMK-fB^(hbGLQrJ|8Vz~L2WIH`ZtyUAqf_o(%=x>wG;^uJV>bl8+Qo~Eu|Df2(HBn zYzS__rC2Fe+@(<3jXRW5N?U3#``q*2_uO~Rf9BkC=YDwKZ<)!=nyfYXu-3Dl-|u16 zn3uiPD5W_yd`DWjW&0@-_Q7z?R6DLlny;OkD#X)|4*)*R&$#@(*9#bdmeRLK;dzhV zuQ>N-;^&*tuc-h#V}fhH@|?cmmsR~p+(tWHH-=5TTSvvKkWc>V6_N^-JlYVpz?rVX*7 zAnB)FP9>vzv2f3w*+%ErUcK+UA@H}rBfC@gMw7DmnTH(E7I`lbvI+5bwtqG|paKW# z!?nu1=doTj37d`TGx+wkp{@ulHBS;~117YV>P!GpsTWcOVE}7s)P?HMh%IR0C_EyK zDngxvjEbt&kyM?)pQ#QX{BiX*O7QT7I|1fEP~+xTL8Qy5CXEXcxwK^n#;wEL5M#ko zWfAcYGQ93xgN+t=5<~c?#Rx6*q<&tvHPfY!l81T2;j3J$n4l)aQ@1r?izIWlv8z8) z(J`Gq1Jx5TrY*YX0pB8&=-5?UBi~ckq$zw{apUN@6hklLrh1PwqNUs7zN|dL_KG5J<*~~TZg(1 z8|t2OPfJq;Z0?}q5N|@haM?Xz2hx>wFRMzicK})%1hgFu*c#SGS{cSzMY|PzAkTJQ zTW!U42G1KS_NVA#@&ShP#n(zH6uf)9Bi&-7Qa7Qf944oLs&Xup->Em|$Ot-^r_SE;R; zA9$^_Dmn=(Wy0e7IUYpLT2O^>0Te=$G*SHGX3_00QhQ_c;JKx2H$Jr&s&7H0Ng{+T z)Cr{)CA1N{;k6s9P^KgGFW?tDICmV^p0}Z?C8;SvSv+DMT7~cjGw*u@M(Z54yD8|g z=uy(fL}fL)p5}skw?p`ZA!kSHhL6HO57>*)`d70G^8|$H5*kMfs(AGR4HP$ksR5RX zjkS_hmgPP{^>h2q+Jb+0=#_CBEN(D13Nb1Lim-Vu!FZMfJ>=&y&CR{~n$x{{9uIgM z>;SjRYHZYZpw1X+Vd7%3ke(pbt>UE|8VZ}BvxZ1Gru7Ym%GAD=4HJ==K}PLMZpTrr zYc^dWE>nQ^KE2@-j?_B#AtX3}@*Y zE<0RED}h=tCinTJd(^U}A=)|S8pJW=Wq*wz?)n2ZQeTHl8v$YUvz=j;QX;=0KXef-ga)BC_rVf+qHt{@2$!9a& z4~4KqOMZEDJu9G%x5#0G>YooS{Vm}6D;N5wY1Ka;TKWeoxEx&S|4cytH|CfA6mUtw z|D*nN_3?iVr2Sj7>aR2W*ORZmmz1vBRo($tovJIg_R8`7KLTkL|A|ffZ^!)muluX_ zBz2Xs{eRcjrL%DrrR`I4TCX>GyzaP^iH`rv*HunV&BYU8s1WBRK#v-57m`K~X+{~h z61|r};7>1!FYe|}#erNPPp!tPV62}yepC$A)hvM^Pltb)+}Ey})h474hB=uDo{5B3 zQa&iHYt5J3`8>kc@x2u8bcWZ?`0C2=7PJ*I}E7{MmO&S=-3Lwfs^I3f&A{+*a z(n^|8UsoS5yNO_*-H$GccY$h6kEz0-$2H2!i4(8ylec=C(Ss}3)mKUorg_Sh3hxaZ zm|{Sp>dON&G?;IicDX@YEp<)itVwm%B_;B{ZzQi;QH+l400vQna+3E}6JINoP@=47 zm+kmX_e0ceh@sR*+#lmp%^fH0saExygCG2l;jO;o1rxx!=1+1reeNkR-FTny`uIhq zqz1J2WrQpHOT8u?Rt@1JE@hN-N#;o#cp6ikkfa>11&j(blE*#CYY+jN^`5nh8-~~? zN>IVQ^I}M!3iZm$b_*Lx@#GE(P(Q)M34+EQIDZkR8K~H$hrjs6%@$g)=4r zsL*_sq*{B-xF?ZwY5<1g8AAZ$`EJnItj9425Rq~EO*dFS?o!?X`NJP)H&7V?pi9HC zTZ%H(4ajBihfsTEe1V_IlizSx@BEdxHR+eyom58CIT9 z4C_o4Z|N5R$ks>0ffUa#l5+8~^dGRD+w|ma{75CUPgR2fcTebjZFAgG@o({;e0}+?L7b%6N(4QaEc2>}iu1j-6j2+QM8jrFt0A zRT}_+S@^6hK7@FWNN`vAv9EkH!uA&?(G~LG?NL#Vv5|D8?c$wjAFGO8%jUe^oARW5 zgU}5az8_(_U?56#6In!)!hbq}!EG3~-bW^XjD$a&NGnkS7hjuf9`OzyKfX5Fau1Ra zDXs2#%0AX7nN%@=Wwe48M3Mw!=~C)a{7$Wvv&;pui(xX#rY6)M?X;POh+mLC3*`CI z@o3JdsJzj;_xgRPn$TMmy}aUsU@^)lm-nk64D9dob6cm{Leqn}^QhEEqH;;(Z19%GXvi z;^H17#q|XFEKOKg4agPnU*iUwzkAx9Mc95clocQHAxV9n2`trNHF)h+5dC$K+nw8hL;I9+v z!S7VFFkR=CHtZ%QR@Quh9DP!#B+|^JhYs;BS3;rHdT{LZns;{HPE}Hpo^EZ=ph#okhzkB&1i-E#85Afy~-dO3Xm1 zaz^3f`)%EnEKst;=~bT2m1FXmmSgpu@NUtwKw&|y*n73xk_pmGAdkDxBg?7FNBFFLgL|;pV>sai2GT)}s zdw_F%6CPtmC_?BW9yrI#vcXQ2M2{Sq`<^0wpXg~f6Q>m&^ERJJ8AOScFIza~yimCF z^){^(nY>OS+2C=H=Ja9Ctr$L+Fy_<;f~@mw^6|7Ni5Apd8e!+#%T}l?)5lSK+ZlIC zP^q@hJ49lZ6`ce7z9-Dxb{Mf$$<0K@y*;a~xIJ2I3u3~jE}J!$`15YaHpEFWAXKXA zSTc4aEF$H7p?7*z569)?wxCGNoj8qk!4Y1Vu~=WzD>kp!7dlJgxG9n8wQH-=apzD? zk+|f*S70HI24;~VnmI!`xiF+V{k5#KWOQ>-_F15O&TCHY+gg;U{W8<9L=QEi{hSc+ zQ_jY65dm|i&X3mlr;@fSRhO(Vcg9CUunhFOmn?Likag_q42x4!vn;qhN#SB~ z#3ZXz&&Q??_=E(xndhu0pXg!DsyRnIw?-0m%Jn8d3&65TDp-1YL#ch$bpEnN8iTm^NOCPvB(xW zx_6O^YU9#E)%Qv2mF<#|jr}EBG4JFtd=IOen;r430|Y}l1F}QhFZJ2xeR`5&v(8HP z)B`#}1BR&h$jOqQs}ufI-i@D2T)%7yJ%U`wZJG&HBmC7zv4oCK_I2d7WqA?pc!Wn^N$_u@fpnA{THOCH$$dA24BYe5~(W^=+Rfk)lG^joG z%^fZJNKIedeo`2={QD2y@0(?1j!70jCYhha8D{&mR>e&*mzB8}x+AC<7JM3`QmC|T zeb^n9kI;VFK2@va7rNf+J2Qklz@+wW=XEKZN_AxKmhz78`3Ox(I%Mx067f;ESzap= zI{kt!rDADQ)qONiL$s=*?iCA45yIz;*u*bsnIWaDl&Pha;rq;{9p8q^wt48J1&L-G zAyM(HL0gf_dl)Uc&p@2Lepqq zyjoS^a9##gKeEfPJJ6N4Sz$gPnS`AXqG+BVqzi3z@)){{iAsl2WC}In@{tWNmm30; z7C#PFGi$BMt5=lhI#NpB($U6&iJt^qg68-u+z)0r-6EeHBSYhCw)Pd>t23jke@5xU zglEgtX2SoVyn~v(yyf{|F~KpRT-NGDgPZD$R^fyB9lX)D^yh1k ztI2qLqK?&tfA$Gj^QIUu+^{#qXbZC!A|f*zHGAAwPsOYfbnIjC-=FhY4wbhcoT%mL zf{go*99-MvHM@LDboykN5cZ`a#x5jVy%tix=v)utZ4dHJj&9Fn7`);`dlpH9L<6v3 z_Y>H6-{EiGJZnQ&)9k)njO|fr@5PYWMpECc1-JBczRMfPsFBU7nPL?x=jC08(21jm zlzU5?J$zcq0eYc)ChOGB?M;|cZL}?LdVl1x8hrmXhA94xCYceX%$su{X?-ZYlYaH6~qo8DQfaMVK;ew!3}!|6Z|2Q)E&ooknJSoBu%B{7OQvrtAUUa zXz=x!l|JI2J=ulaq4JF7ZO4%cm6o-~16ExZTptFy6zog%S`q#h;U>O$Ta-)SdSo)* z+|?Ah=wPEiH-akkb+|CbNYHR$E1ezAAf>Dkrrx7dYukHDx|2IbrD2G*mFNBUxv{h$ z&60;Df7~<)hZqyupxNpduE#U`NQO3^nX*gTSY2$$4CR_A$;weu<`-sG6rBO-n}?~& zE0fjNG18WXJGk|nGk-whZbSZq`!`f3w6l=*;-NA=87(u3lNYpv~?;j zjnfr*iPf@sJ6yv|6b|Sn8|}@iq%#)RfF_o=x1D zeKn$GDI%)(nH5tpl};E*I~_8dUj?Zsp1l@>TpF0W@_KD2hBB`ylt-E=-iyyNWCTzP zHiq+S3Kb4LCe$G)&y7-85!%j6mK3Dw|94zY_P>kE{X^vQUy4fqYthZ$Ft-1GbR+lI z>f2w@jojZ$NB{1)w&LGQPygsZ``a=9-_ebOX9&9=9=*JM)6 zYhtWh!zD*dHD=ZbhKf_)0R)@jxcOlqH%Y7NpETQo?XAbxvO74Av{E&&BSD-Xh`jdx3sJ{bhc=wX+AIqy<;)&|Z!&R)w8>Gq8%CWyV`{CIhdlh+86ap)L@ zI+?7yn?F+i?f!o8BpZ&VaC~3oNjv(m3G7J6+K@PB4})&%9}Ph!74NYDHHynxyXu9| z@>fkG_4&5yX|#gMdJ5*9CK`qQq`BU=s@!c%Lnw)cesN9$kQcYJ@t{=&U|RiPBiNv? zs06${S=9S1>FADMo949SRTU`Zk+O*L|sR~50RHz1Lr7o$EtLa$MF4|H3>43XGv-4g7Pv_A-h^_ zsjNL1UVpci`g2l|2p8wAB-H={*;)alnKkO#hhT ztc2G~nQFXTkG%{hpWN3&SU{z$=1~W)R3isl2=}^0yV0mm|rFF zWnOu$DZtV;G=*DxZRxzB`b!>+Q6l|X6T0O3lAYL2@oW-P^SK2|pMolEBk@ zCbV8@U#x2JRz*Nm$ybx9i%7rxY1+57onzHj}X4Mk!^M5pTjv!?}U=LCgbcT2CC$9 zrtJ!>4f>fm#O9y=GW~FWP)=*ppv4t-w7?a|d|2e2zI)5}O=ye9$1<{U&+rAt{1IR9!K?*J?E^zy@_fF0cThN9`vVn-XPp zn?rgSIMsEjQ#pk#-(OFA?r1yBKizPa9hbhR1U%JyS}XscMUzUB6796A(OA¿g# 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

WCG{JapVVtFf^$#%Nd)wP=@5rt4nvz>#SUB}o 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 literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/Build.cmd b/Source/BPBIOS/Build.cmd index fdc9df0f..76a44e01 100644 --- a/Source/BPBIOS/Build.cmd +++ b/Source/BPBIOS/Build.cmd @@ -3,6 +3,8 @@ setlocal setlocal & cd ZCPR33 && call Build || exit /b 1 & endlocal +setlocal & cd Z34RCP11 && call Build || exit /b 1 & endlocal +setlocal & cd NZFCP13 && call Build || exit /b 1 & endlocal set PATH=%PATH%;..\..\Tools\zx;..\..\Tools\cpmtools; @@ -26,22 +28,22 @@ call :makebp 41nbnk rem pause -cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:ws*.* - -cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.img -cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.img 0: - -cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.rel -cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.rel 0: - -rem cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.dat -rem cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.dat 0: - -cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.zex -cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.zex 0: - -cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:myterm.z3t -cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img myterm.z3t 0:myterm.z3t +rem cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:ws*.* +rem +rem cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.img +rem cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.img 0: +rem +rem cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.rel +rem cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.rel 0: +rem +rem rem cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.dat +rem rem cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.dat 0: +rem +rem cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:*.zex +rem cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img *.zex 0: +rem +rem cpmrm.exe -f wbw_hd0 ../../Binary/hd_bp.img 0:myterm.z3t +rem cpmcp.exe -f wbw_hd0 ../../Binary/hd_bp.img myterm.z3t 0:myterm.z3t goto :eof diff --git a/Source/BPBIOS/Clean.cmd b/Source/BPBIOS/Clean.cmd index 62c3210f..5bcf9d9e 100644 --- a/Source/BPBIOS/Clean.cmd +++ b/Source/BPBIOS/Clean.cmd @@ -10,3 +10,5 @@ if exist zcpr33*.rel del zcpr33*.rel if exist *.bak del *.bak setlocal & cd ZCPR33 && call Clean.cmd & endlocal +setlocal & cd Z34RCP11 && call Clean.cmd & endlocal +setlocal & cd NZFCP13 && call Clean.cmd & endlocal diff --git a/Source/BPBIOS/NZFCP13/Build.cmd b/Source/BPBIOS/NZFCP13/Build.cmd new file mode 100644 index 00000000..2c53cfd9 --- /dev/null +++ b/Source/BPBIOS/NZFCP13/Build.cmd @@ -0,0 +1,11 @@ +@echo off +setlocal + +set PATH=%PATH%;..\..\..\Tools\zx;..\..\..\Tools\cpmtools; + +set ZXBINDIR=../../../tools/cpm/bin/ +set ZXLIBDIR=../../../tools/cpm/lib/ +set ZXINCDIR=../../../tools/cpm/include/ + +zx Z80ASM -nzfcp13/MF +rem zx ZMAC -nzfcp13.z80 -/P diff --git a/Source/BPBIOS/NZFCP13/Clean.cmd b/Source/BPBIOS/NZFCP13/Clean.cmd new file mode 100644 index 00000000..a088f4e8 --- /dev/null +++ b/Source/BPBIOS/NZFCP13/Clean.cmd @@ -0,0 +1,7 @@ +@echo off +setlocal + +if exist *.prn del *.prn +if exist *.lst del *.lst +if exist *.err del *.err +if exist *.rel del *.rel diff --git a/Source/BPBIOS/NZFCP13/fcp-4.zrl b/Source/BPBIOS/NZFCP13/fcp-4.zrl new file mode 100644 index 0000000000000000000000000000000000000000..a6f2c9a2f99f39f2fa499c58992916501f2798b1 GIT binary patch literal 896 zcmYjOO-NKx6h8O8nWy>lOe}d#AZL6M&s?Y#rh`A|IAcT38*^q#1)GFS1$9J6%oa~> zBw|~4(PC;LQ3TRvc0x!vqrOF9D;Hs+kgFm!LwM7@PDFQc@AsX1&-uP{?r*QVBYi>u zP9h%tb|lR~Fc`X-LH=M{26){qeuT$;C)k{y|(fCZ^b|-i{8Q>M)Pw5W3i#==mct$ z6a83flwvH3qx}PYvHo(N9zriZY?ww*=Xi7+JzYZ+G4$zUlQGo8!@~$K0M7JWWv$s* zHKgxA4$3G0n14s+Yqn>1lDX}p?Z{5gP0 zHwoJoh}eeNCfy>k9v$6H8FAUG336!Kr2E9aUW?z^^DQFgKRqoYY1xaKoxyoxOIEBm zasX?zfK)pv7zyo?<*X7_< zuWa)CY}C3d_41~;b2bZ#YlPjBv@Egfgm$!D1A7sxo9pZoNqKAO8E8|M8nbxpvhv9_ z0v0N9*Dxedk}vSO4G~#pr)wG_GOpO65iH|$6j^+nN9ok*#96;7C%q01Baw70t3}A0 z%~B2ZK~(vos_I2$kI(vig(l6_7ECEZ{nVX!oBF77af$!O77^x754+DBPwkj=o7i?z zhRSW7OB^e|c0YeO+?$EW0<-et{m1Q;1pw*8m4W2Sxk}vpOlrAAz#683rqWd{Q(sYD|i3^ literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/NZFCP13/fcp-4t.zrl b/Source/BPBIOS/NZFCP13/fcp-4t.zrl new file mode 100644 index 0000000000000000000000000000000000000000..8d3cb48ca1ec8f4cf1ee75a89f9e6a71710d5821 GIT binary patch literal 896 zcmYjPTTc@~6h5=N?b0G^K#XgR$QL4IA{Sy25VSta~N_fiUSK-gAXbzm57tYdkO_6j8`UmNu*bXuJPBbOnz6t<(B5ZyuKP&1Y~}i zeU>%y08o&XRP3=Dtt&iVIa%w*3OMC2sqS>@T3TB0chcjF3t>t-7oSAiI`%CB_}W?y WM%yXHAD2{BRZ+eo(PrNG-}(awOD`t? literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/NZFCP13/fcp-5.zrl b/Source/BPBIOS/NZFCP13/fcp-5.zrl new file mode 100644 index 0000000000000000000000000000000000000000..a245621226e01d22cc5d645b3028bb3a28b75924 GIT binary patch literal 1024 zcmX|9UuauZ9R8hiliN0J;zD)aMHs)kt8#0RrB!Mc)|56&(&&0)n#^{^5v#^nNSfGW zb`iPTp@e`BzUhl1@ud@)bovrO7-&&@7p^$bA->2~TJb?~*w%?~Pb|#<4*+{O8>F{C+=ccpSJi_|`eG8BAcRRQgvM)fe<=JN-a0|#j0l~J$ zsvvN8$VwpCzE~Xu+bYX~V0&aQ0EINNQ9?Kg5i&W$jt~+~u!jhV%(7`d&NGdWxW=9( zL_5RYA|xGV?-DXM%`OuW9tV&dCTkP2CD#Zz#y}EH)SvgfF?6~I6E_9PYDZ*;B^)!ud0$zhu~ zwuW0F8^CoICL=Nfy{SHI$$mkR_I0JH`Ybtc*c!(_<#XUIfY|T5hG}K+&|PWDdk%b~ zY@0YO9m$}{ejyZHCObqax;t`pW8Y*O9GuByj+8q$3k1VYV9n#fMk6r7Nz6%z>La7m4y9Csdf8wEW z$x#B2tPKIxo14r}CPm=Bb>*i2N6YnX;zGTCsm@~3@4-AYQS=LuV1x)L6XvXXL81)4P)D6bJVeI z=!*Twdz*Kqzjl83a)0+?#zVQuJD=aUWmo{v9=)1kgCv%`0Pcg!m_jBSN&aO{2C-K@nq!iHIh`AXJH;jJ}ZK zcjeX%Ziq24y6esas*#b*!i8&74H{#JpWp{gTJKPGrJKpQ=iPViIrq&%G`z3aK>>dD zL=p#jiXKR%I(C=P-c+mvqTyY?ned(x==$5VE1pc1xOiJn@gm#yI!~R#R^Ev%Lza~`Ufc$TBe=K)%o{BZ0mJEB>;vY_6@9=wDqSyO1(j6S{x59iOsYcbYj}RJA(C109UM|_+f;_c$q62sG6__W*vK6 zjT%(#IOmEmm1mmxM{IAPtm68jjAE2c7&5{Ikf!TrTB^nfKu9Pc6A9)XdOSQ6uK>(3 z0Fs>&ZA7X%0>RDV3&;hVlNwh92<0q?C+wY3?uvPkjB=%z6Ke=H=1cXw0$vSfMuEz# z_R8#s0@vQQK*3(L;q#(=Ejo*7Z9VIR#8wE}+3DaTy@oFdKH@&z){k4-OI_DjYHz%p z%jyl~N>k;CMw>?tj>q)#8zvrlyJ(>D6$ew)jryU?&Kk=LtGHxlHh{l*M@+Y|VrFJN zNJ(9rb%mco6-Em@s8%ao8JfA@6|DppNhw;!;I3Hi?Nz6gf7m?6!Dn8D0&Bvnk8u^3 z;YD3Wf*|UKHvUkd#;(@0hOe;QVCCB92i5u0bz+M6?7~w{8*`yifU+D~y8*`P5Q?!z zib6Ui`6+RR$Rl{LSkuY5!=tVE5_m!0;a)4TBwveS1UrHyOa44p(83Dsqvw*$?Z#Ze zt|zLBNhS}eJSRiwGR(eLgGl5ZFQ`vlia1-^Q#?BEymp02rPq$Fdwzw_gbLn3?zW}$wR5}0v literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/NZFCP13/fcp-6.zrl b/Source/BPBIOS/NZFCP13/fcp-6.zrl new file mode 100644 index 0000000000000000000000000000000000000000..6aa1aea92537db7ed8945cbedcfa3ff33a6e128c GIT binary patch literal 1152 zcmX|9;ZIvt6hHUA_Q47*BW&|g<8~jvwCIivelVt(o@x-fD6p4qbAn5P=uj22of}#IKec@QVS__{{maoI7 z0GIul?CjK7>U@qIJK;G&hU2|i$q>iA(UT-Lz^kXp zFsF7~ESnq4OiUAcVS1Fb=q)6dArqsik=&?D98VB_Ci2Euiuhyc>=X$^vbkAuv3r&T z2BtEclcBNc90^CW7jh(eW_+9s1X9x^;UCG8!BeB7;{>h)>>GZOPjBH330nh6m|)+4 z#ElU4B}l>`dk-Y;k+2*{!X0}bBw?71fh3%=6ktdY)`<`&eF*hN*mDT^W6Xt6Aj0~2 z9AM{p9AXm)g`?~eLeVqq3xpDW_BBF-r`Y#MhT|9%i@}ayw5~27uyleV8_b2}Hi}EW zqJVXwQV+$;>-r}%oZkR2*xQ%~7nVY#)?ky^5zS0&74;=YkYYz-)?jnkTJn%TxqK2! z_N$d^WLmpStsEY~mi4xhPXO3pA#_Y-pcm*1rs|e7Wlz@%)M=`oLuNO5q@IJuG{|+% zTO^@1?SG>5HJ$@!2a~YX)Cp=bSPjO+W-vET_DZ{aanE2sqQehwD$oC}rUBJ~ujh}? zlxMu}fH_QM^R!Y=>kWpnh1SdERTjaR?pFD(41)9Fwo!BAI5-;a7*@F5MejKdtaK~_ zCk18GyC8#9P}YR1PN*7ry-T?%+Sd|#wms_VSyC5j;7}*tI$UDD z?;|VM%xD!_l#hKiqP9=@*_#HFC|A7mbAV0t9$zds)QO;V-UV1Mtg_>%R|YVR{DzZ)dubG?rfTb9`*5eIoP^b(O9{Ly42=1<6k|K Bi7WsB literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/NZFCP13/fcp-6t.zrl b/Source/BPBIOS/NZFCP13/fcp-6t.zrl new file mode 100644 index 0000000000000000000000000000000000000000..b75fbfb7d8116519c533ec0a8243b3565c12caec GIT binary patch literal 1152 zcmZ`%T}&KR6h8OP>?|xW?LxKV8qFQ1X+}uOwi?`S`6=D*ZdO>f-7SikhG2>-NtZ!D zDaK5>Aq!fbYJBoVstGanf%?#FA4n4*O&QlQ`q0J)6SFqd7=yN2v}&C73~PMzW$t&* zob%o9eCPfVi<~HbLjnF8jP^c1Sav}sbE><7l9_k~#3IN3%|v=Cp#Q(3V~JFzl1m&P zEMJ6A0M18@vFY)V?5mUP;Nj3=HjwG6^F@qYZfNw(M7Yk!5-}F-$wXN!!TJ$*^&V%b zG-gk-0SxPWsj9G&_O)yICJLjvK~gI1xJ#NhRSDK=r`WIIV~mFn$#T_fq~52zW8$?}Ok9 z;zJ;yCdT_gaMf@F1XmzWg5WCS-9Vu$$^C>xQv3-*qG^7VklsEXBN99#fFjzQ6SAS^ z35czrNH$*}QnOBr9hM7g;>Av#E^U|}PhtEXfX%N`{45Y5&Z=y_Lgij#bki~y<(N+8 zQ`0stQcp3&?qT@~73wbR&`5gKlI}ssiMY{R?C{SK0F_JNAtG#Dar5vQKSCfp2S5sI z{Bv?p{sk)_j?S%5mA&CNz!}gb=cH1r*V_CH5%pTB zyv~;i)gM&i2NJk3g!2-#6qN76IdGWry#&Z(YPW-5JH9Vd=jP{U=6PKCsRJC-3fvBc z{EjbJr{;rDn>XJ20>zevH42K$!lZCzJq0jkzf z+5+hNRU{KyDH2_#q_oEWCY~w$u@lqPt(Rsy@jYOJr`>+1k|m`^BqLbyVMS7PiAgBo zG3B1Cl5BP3T!H=@vW%0gz9_SG52!P+`J)`bM9Fdo^~!q?7b-p_VvE)to3Byvj%8}@ gJKa-wsQkWp>&Euo^Mf+Q%KNKdl`IDU%Ku0A4+#r^g#Z8m literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/NZFCP13/fcp-7t.zrl b/Source/BPBIOS/NZFCP13/fcp-7t.zrl new file mode 100644 index 0000000000000000000000000000000000000000..8a12be0980ae8cc2fe710862833d185d82b8c5ce GIT binary patch literal 1408 zcmb_b|4&<06hHUg_7w^|EX?gulX)L+SstLHn~J4U7<4Tw8|_9x3T8H_h?qhVIvK{i zaYG8~{t5g+V$2rMUut49!^k3)Jfp^uWxtrZKw=EKZ){VOSMR09zrbJa`8zcW^XecjI~!d1F5mGq477Sd=*X_4$P8lR&2`Ke)AYt+(oijEJD45f$bM0zjfIo+>~j?h4KY+{mL@Xyd-&tz(n z2IHesX&QbeGI2glBYnvv?Fo)d(cZw&1noaLJe=gkX&)~-nM$R7;n0ylv>QGKC>?x` zPr}9@r_2N*2(hn#a8i_g0Ys2xGe9_B$|isarfdO-AkT(@2-fU%z|c!s2SVJ4Ak^N? z>JSP<*$W5-dsv*GarP=g;Rs726zOB1Ak-URml5he$+Ad-=Lsk_lT~80u4WL}nn00E zR)eJm9dESe1T5>^Xw&i1y7B2Ww=V;jEI{~CgGnbXFcK45TvmRobIfKk-;O?m7qVW9&Y%TLwkdCVPai zphq#LWox_|+BMnN=-}Nil|#R(V}Qz_wQc8f<$&*9um*L>I;)iHi+?yV+%W`@u z)QktpGpYB#gOO#wkz3vq#v#OgSjg?^&u5%d*^A&dvg_`vS~V2|c4&t7W=i>4)3m3Q zZK3>=4Z5`8t(;bH%XI%@r}kds(u&xQE@EHEab4@@N}+^HcfdMCZN5w+l(zUgHG^Bk zmpKBqsHSY0>}dinF1B;IO0E>-X{pKjFkdZ&@aFj{nCw}xY0U)FKaR~)aQHp|i+FkJ zEo^hm!j1Zj4cxr0>iJ8CYNLv8h{JkGC*{h$<*NKU_3S2g7}hrwH?66203~aj+9l8r ztGpQD8j0E{e~n$j_Gx~xXXDkKSLWLIZt?`X-~6!XMfqA@4Dkq0ky2@%N}NKCa!0U4 zJEwSG?)de+@vjc-4PTvwt>0ufZ!Mn_jXLCg9A}Gj3WpYRw@r42*lyDuw>|^E8 a){X1C+ZPiu=8<<-f5_)704V&Q|NlQrxxP^V literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/NZFCP13/nzfcp.doc b/Source/BPBIOS/NZFCP13/nzfcp.doc new file mode 100644 index 00000000..1eb1b0ab --- /dev/null +++ b/Source/BPBIOS/NZFCP13/nzfcp.doc @@ -0,0 +1,89 @@ + Z-Relocatable Flow Control Packages + 11 October 89 by Carson Wilson + +The seven pre-compiled Flow Control Packages (FCP's) in this library may be +loaded directly to Z System with NZ-COM, Z3PLUS, or JetLDR, provided +sufficient space has been allocated to the FCP segment. The FCP's come in two +flavors. Files named FCP-nT.ZRL implement extended flow control processing +when needed using a program named IF.COM at the root of your path, or at +directory A0 if there is no path. Files named simply FCP-n.ZRL rely +exclusively on memory-based processing. The "n" in the filename indicates the +total number of records required by each package. The standard number of +records for both NZ-COM and Z3PLUS is currently 5, so if you wish to load a +larger FCP you must reconfigure your system with MKZCM or by editing your .Z3P +file. For general help with flow control commands, see the file IF.HLP, or +section 3.2.2 of your NZ-COM or Z3PLUS manual. + +While IF.COM allows options not available in memory-resident flow-control +processing, fully resident versions free the user from the requirement that +IF.COM be present during flow control processing. Resident processing is also +somewhat faster due to the need to load IF.COM from disk for each flow control +command. Finally, the ability to locate and load the transient IF.COM +requires considerable code space in the resident code itself. Generally, +IF.COM is best used on fixed-disk systems, while resident processing is more +suited to floppy-based systems. + +The options included in fully resident versions were selected somewhat +differently than those of those using IF.COM. Criteria, in order of +precedence, were as follows: + +Transient Versions Resident Versions +------------------ ----------------- +1. Is the feature available in 1. How useful is the feature? + IF.COM? 2. How much memory does the feature +2. Does the feature require disk require? + access? +3. How useful is the feature? +4. How much memory does the feature + require? + +The tables below summarize the size and features of each flavor of FCP. Each +package includes only the features appearing above it. For example, +FCP-5T.ZRL (the default FCP for both NZ-COM and Z3PLUS) contains only ZIF, +IFQ, OR, AND, negation, ERROR, and NULL. Size is expressed as records plus +remaining bytes required by the FCP. As FCP space is allocated in record +units only, I have attempted to include only combinations which leave as +little remaining space possible. Sizes without corresponding filenames are +included for reference purposes only. + +FEATURES OF TRANSIENT (IF.COM) FCPS SIZE(RECS+BYTES) FILE NAME +----------------------------------------------------------------------------- +ZIF - unconditionally clear IF states? +IFQ - show current if status? 3+124 FCP-4T.ZRL +OR - set state at current level? 4+25 +AND - reset state at current level? +Allow negation of conditions? +ERROR - test program error flag? +NULL - test for no file name? 4+84 FCP-5T.ZRL +REG - test register values? 5+16 +AMBIG - test for "?" in file spec? +COMPR - test for compressed filespec? += - test tokens for equality? 5+92 FCP-6T.ZRL +INPUT - test user input? 6+25 +Allow "IF T" and "IF F" forms? +WHEEL - test wheel byte? +TCAP - test whether TCAP loaded? +EXIST - test for file existence? 6+106 FCP-7T.ZRL +EMPTY - test files for contents? 7+10 + + +FEATURES OF RESIDENT FCPS SIZE(RECS+BYTES) FILE NAME +----------------------------------------------------------------------------- +ZIF - unconditionally clear IF states? +IFQ - show current if status? +OR - set state at current level? +AND - reset state at current level? +Allow negation of conditions? +NULL - test for no file name? +INPUT - test user input? += - test tokens for equality? +ERROR - test program error flag? +Allow "IF T" and "IF F" forms? +EXIST - test for file existence? 3+123 FCP-4.ZRL +AMBIG - test for "?" in file spec? +COMPR - test for compressed filespec? +REG - test register values? +WHEEL - test wheel byte? +TCAP - test whether TCAP loaded? 4+113 FCP-5.ZRL +EMPTY - test files for contents? 5+17 FCP-6.ZRL + \ No newline at end of file diff --git a/Source/BPBIOS/NZFCP13/nzfcp.lib b/Source/BPBIOS/NZFCP13/nzfcp.lib new file mode 100644 index 00000000..db55f33f --- /dev/null +++ b/Source/BPBIOS/NZFCP13/nzfcp.lib @@ -0,0 +1,161 @@ +; Module: NZFCP.LIB +; Author: Carson Wilson +; Version: 1.3 +; Date: 9 Oct 89 +; Changes: Prompts for options if SLR true. + +; This module is a set of configuration options for the flow control package +; code in NZFCP.Z80. The options are not fully commented here; see +; "ZCPR3, The Manual" for a detailed discussion of most of them. + + +; * * * * * * N O T I C E * * * * * * +; +; The main code in Z33FCP.Z80 has been written with relative jump instructions +; for minimum code size. If the options below are changed, then some of the +; jumps may become out-of-range. You will then have to change the code based +; on the error messages you get from your assembler. I cannot think of any +; way to handle the jumps automatically (macros fail because the jump distances +; cannot be resolved fully even in two passes of the assembler). If you want +; to play things really safe, you can do a global search and replace to change +; all occurrences of the JR instruction to JP (but note that this change is +; irreversible). I prefer to live with this nuisance so that I can get the +; most out of the code. +; +; Another possible way to clear up a problem with a relative jump that is out +; of range is to take the block of code with the labels IFCTRUE and IFCFALSE +; and move it up or down in the code. It is placed somewhere in the middle of +; the resident options, so that the options can reach those entry points with +; a relative jump. You should try to place that code near the middle of the +; options which you have enabled. +; +; Jay Sage (May 17, 1987) + +;============================================================================= +; +; M A C R O S +; +;============================================================================= + +; SLR assemblers allow selection of options during assembly. + +SLR equ no + + if SLR + +y equ yes +n equ no + +select macro option default comment + .accept comment,option ; Prompt user for selection + endm + + .printx + .printx Answer "Y" to include, "N" to exclude commands: + .printx + + else + +select macro option default comment +option equ default ; Use selections from file + endm + endif ; SLR + +; ------------------------------------------------------------------------- + +; Command names + +; The CTABLE macro, which constructs the command dispatch table, includes a +; line for each command, the first parameter of which is the name of the +; command. These names may be changed if you wish. But make sure that you +; do not use a name that is longer than the maximum allowed length. If you +; do, the name will be truncated and a nonfatal error will occur during +; assembly. DO NOT CHANGE ANY PARAMETER OTHER THAN THE COMMAND NAME. Lower +; case letters will be converted to upper case. The macro COMMAND is defined +; in Z34MAC.LIB. + +cmdsize equ 4 ; Maximum length of command names + +; Command table name, enable, wheel, jump_addr + ; [ DO NOT CHANGE THESE PARAMETERS ] +ctable macro +ifcmd: command if, yes, no, ifstart + command and, andopt, no, andstart + command or, oropt, no, orstart + command else, yes, no, ifelse + command fi, yes, no, ifend + command ifq, ifqopt, no, ifstat0 + command xif, yes, no, ifexit + command zif, zifopt, no, ifzero + endm + +;----------------------------------------------------------------------------- + +; General configuration options + +NOISE equ no ; Don't display if-state messages + +select COMIF no 'Enable transient IF processing? ' + +PATHROOT equ yes ; Find transient IF in root of path + +ifdrv equ 'A' ; Drive to use if PATHROOT is off or + ; ..if the path is empty +ifusr equ 0 ; User to use if PATHROOT is off or + ; ..if the path is empty + +; --------------------------------------------------------------------- + +; Command inclusion options + +select ZIFOPT yes 'ZIF - unconditionally clear IF states? ' +select IFQOPT yes 'IFQ - show current if status? ' +select OROPT yes 'OR - set state at current level? ' +select ANDOPT yes 'AND - reset state at current level? ' + +;----------------------------------------------------------------------------- + +; If Condition Options + + if COMIF ; Different precedence if transient IF available. +select IFONEG yes 'Allow negation of conditions? ' +negchar equ '~' ; Character to use if negation allowed +select IFOERROR yes 'ERROR - test program error flag? ' +select IFONULL yes 'NULL - test for no file name? ' +select IFOREG yes 'REG - test register values? ' +select IFAMBIG yes 'AMBIG - test for "?" in file spec? ' +select IFCOMPR yes 'COMPR - test for compressed filespec? ' +select IFOEQ yes '= - test tokens for equality? ' +select IFOINPUT yes 'INPUT - test user input? ' +XEQOPT equ yes ; Test only first token for equal sign +select IFOTRUE yes 'Allow "IF T" and "IF F" forms? ' +select IFOWHEEL no 'WHEEL - test wheel byte? ' +select IFOTCAP no 'TCAP - test whether TCAP loaded? ' +select IFOEXIST yes 'EXIST - test for file existence? ' +select IFOEMPTY yes 'EMPTY - test files for contents? ' + else +select IFONEG yes 'Allow negation of conditions? ' +negchar equ '~' ; Character to use if negation allowed +select IFONULL yes 'NULL - test for no file name? ' +select IFOINPUT yes 'INPUT - test user input? ' +select IFOEQ yes '= - test tokens for equality? ' +XEQOPT equ yes ; Test only first token for equal sign +select IFOERROR yes 'ERROR - test program error flag? ' +select IFOTRUE yes 'Allow "IF T" and "IF F" forms? ' +select IFOEXIST yes 'EXIST - test for file existence? ' +select IFAMBIG no 'AMBIG - test for "?" in file spec? ' +select IFCOMPR no 'COMPR - test for compressed filespec? ' +select IFOREG no 'REG - test register values? ' +select IFOWHEEL no 'WHEEL - test wheel byte? ' +select IFOTCAP no 'TCAP - test whether TCAP loaded? ' +select IFOEMPTY no 'EMPTY - test files for contents? ' + endif ; COMIF + +; Miscellaneous configuration information + +curusr equ z3msg+2eh ; Current logged user address +curdr equ z3msg+2fh ; Current logged drive address +curint equ '$' ; Path symbol for current drive/user + +; END of NZFCP.LIB + \ No newline at end of file diff --git a/Source/BPBIOS/NZFCP13/nzfcp.lib.sav b/Source/BPBIOS/NZFCP13/nzfcp.lib.sav new file mode 100644 index 00000000..18f557f8 --- /dev/null +++ b/Source/BPBIOS/NZFCP13/nzfcp.lib.sav @@ -0,0 +1,161 @@ +; Module: NZFCP.LIB +; Author: Carson Wilson +; Version: 1.3 +; Date: 9 Oct 89 +; Changes: Prompts for options if SLR true. + +; This module is a set of configuration options for the flow control package +; code in NZFCP.Z80. The options are not fully commented here; see +; "ZCPR3, The Manual" for a detailed discussion of most of them. + + +; * * * * * * N O T I C E * * * * * * +; +; The main code in Z33FCP.Z80 has been written with relative jump instructions +; for minimum code size. If the options below are changed, then some of the +; jumps may become out-of-range. You will then have to change the code based +; on the error messages you get from your assembler. I cannot think of any +; way to handle the jumps automatically (macros fail because the jump distances +; cannot be resolved fully even in two passes of the assembler). If you want +; to play things really safe, you can do a global search and replace to change +; all occurrences of the JR instruction to JP (but note that this change is +; irreversible). I prefer to live with this nuisance so that I can get the +; most out of the code. +; +; Another possible way to clear up a problem with a relative jump that is out +; of range is to take the block of code with the labels IFCTRUE and IFCFALSE +; and move it up or down in the code. It is placed somewhere in the middle of +; the resident options, so that the options can reach those entry points with +; a relative jump. You should try to place that code near the middle of the +; options which you have enabled. +; +; Jay Sage (May 17, 1987) + +;============================================================================= +; +; M A C R O S +; +;============================================================================= + +; SLR assemblers allow selection of options during assembly. + +SLR equ yes + + if SLR + +y equ yes +n equ no + +select macro option default comment + .accept comment,option ; Prompt user for selection + endm + + .printx + .printx Answer "Y" to include, "N" to exclude commands: + .printx + + else + +select macro option default comment +option equ default ; Use selections from file + endm + endif ; SLR + +; ------------------------------------------------------------------------- + +; Command names + +; The CTABLE macro, which constructs the command dispatch table, includes a +; line for each command, the first parameter of which is the name of the +; command. These names may be changed if you wish. But make sure that you +; do not use a name that is longer than the maximum allowed length. If you +; do, the name will be truncated and a nonfatal error will occur during +; assembly. DO NOT CHANGE ANY PARAMETER OTHER THAN THE COMMAND NAME. Lower +; case letters will be converted to upper case. The macro COMMAND is defined +; in Z34MAC.LIB. + +cmdsize equ 4 ; Maximum length of command names + +; Command table name, enable, wheel, jump_addr + ; [ DO NOT CHANGE THESE PARAMETERS ] +ctable macro +ifcmd: command if, yes, no, ifstart + command and, andopt, no, andstart + command or, oropt, no, orstart + command else, yes, no, ifelse + command fi, yes, no, ifend + command ifq, ifqopt, no, ifstat0 + command xif, yes, no, ifexit + command zif, zifopt, no, ifzero + endm + +;----------------------------------------------------------------------------- + +; General configuration options + +NOISE equ no ; Don't display if-state messages + +select COMIF no 'Enable transient IF processing? ' + +PATHROOT equ yes ; Find transient IF in root of path + +ifdrv equ 'A' ; Drive to use if PATHROOT is off or + ; ..if the path is empty +ifusr equ 0 ; User to use if PATHROOT is off or + ; ..if the path is empty + +; --------------------------------------------------------------------- + +; Command inclusion options + +select ZIFOPT yes 'ZIF - unconditionally clear IF states? ' +select IFQOPT yes 'IFQ - show current if status? ' +select OROPT yes 'OR - set state at current level? ' +select ANDOPT yes 'AND - reset state at current level? ' + +;----------------------------------------------------------------------------- + +; If Condition Options + + if COMIF ; Different precedence if transient IF available. +select IFONEG yes 'Allow negation of conditions? ' +negchar equ '~' ; Character to use if negation allowed +select IFOERROR yes 'ERROR - test program error flag? ' +select IFONULL yes 'NULL - test for no file name? ' +select IFOREG yes 'REG - test register values? ' +select IFAMBIG yes 'AMBIG - test for "?" in file spec? ' +select IFCOMPR yes 'COMPR - test for compressed filespec? ' +select IFOEQ yes '= - test tokens for equality? ' +select IFOINPUT yes 'INPUT - test user input? ' +XEQOPT equ yes ; Test only first token for equal sign +select IFOTRUE yes 'Allow "IF T" and "IF F" forms? ' +select IFOWHEEL no 'WHEEL - test wheel byte? ' +select IFOTCAP no 'TCAP - test whether TCAP loaded? ' +select IFOEXIST yes 'EXIST - test for file existence? ' +select IFOEMPTY yes 'EMPTY - test files for contents? ' + else +select IFONEG yes 'Allow negation of conditions? ' +negchar equ '~' ; Character to use if negation allowed +select IFONULL yes 'NULL - test for no file name? ' +select IFOINPUT yes 'INPUT - test user input? ' +select IFOEQ yes '= - test tokens for equality? ' +XEQOPT equ yes ; Test only first token for equal sign +select IFOERROR yes 'ERROR - test program error flag? ' +select IFOTRUE yes 'Allow "IF T" and "IF F" forms? ' +select IFOEXIST yes 'EXIST - test for file existence? ' +select IFAMBIG yes 'AMBIG - test for "?" in file spec? ' +select IFCOMPR yes 'COMPR - test for compressed filespec? ' +select IFOREG yes 'REG - test register values? ' +select IFOWHEEL no 'WHEEL - test wheel byte? ' +select IFOTCAP no 'TCAP - test whether TCAP loaded? ' +select IFOEMPTY yes 'EMPTY - test files for contents? ' + endif ; COMIF + +; Miscellaneous configuration information + +curusr equ z3msg+2eh ; Current logged user address +curdr equ z3msg+2fh ; Current logged drive address +curint equ '$' ; Path symbol for current drive/user + +; END of NZFCP.LIB + \ No newline at end of file diff --git a/Source/BPBIOS/NZFCP13/nzfcp13.for b/Source/BPBIOS/NZFCP13/nzfcp13.for new file mode 100644 index 00000000..40fb0c2c --- /dev/null +++ b/Source/BPBIOS/NZFCP13/nzfcp13.for @@ -0,0 +1,9 @@ +Source code plus the compiled Flow Control Packages (FCP's) +distributed in FCP.LBR as part of the Z System. The precompiled +modules are in Z-Relocatable form, and must be loaded with JetLDR, +NZCOM, or Z3PLUS. Now features interactive assembly of code +a-la-Z34RCP11 under the SLR or ZMAC assemblers. Macro now reports +length of resulting FCP in records and bytes following assembly. +JetLDR signons also automatically generated. 9/15/90 Carson Wilson + + \ No newline at end of file diff --git a/Source/BPBIOS/NZFCP13/nzfcp13.z80 b/Source/BPBIOS/NZFCP13/nzfcp13.z80 new file mode 100644 index 00000000..fe700554 --- /dev/null +++ b/Source/BPBIOS/NZFCP13/nzfcp13.z80 @@ -0,0 +1,1424 @@ + +; Program: NZFCP +; Date: October 9, 1989 +; Author: Carson Wilson +; Version: 1.3 +; Changes: Updated & improved JetLDR signon. +; Changed four JR's to JP's. + +; Date: August 21, 1988 +; Author: Carson Wilson +; Version: 1.2 + +; Derived from: + +; Date: April 1988 +; Name changed and code modified for NZ-COM. + +; Derived from: + +; PROGRAM: Z34FCP +; AUTHOR: Jay Sage +; VERSION: 1.0 +; DATE: May 25, 1987 +; DERIVATION: FCP10 by Jay Sage (ZSIG) + +; ZCPR34 is copyright 1987 by Jay P. Sage. All rights reserved. End-user +; distribution and duplication permitted for non-commercial purposes only. +; Any commercial use of ZCPR34, defined as any situation where the duplicator +; recieves revenue by duplicating or distributing ZCPR34 by itself or in +; conjunction with any hardware or software product, is expressly prohibited +; unless authorized in writing by Jay P. Sage. + +;============================================================================= +; +; R E V I S I O N H I S T O R Y +; +;============================================================================= +; +; 21 Aug 88 Added JetLDR signon description. +; IF IN now prints ' (Y/N)? ', and accepts only Y or y or +; N or n. +; Added macro code to show FCP length following assembly. +; +; Carson Wilson. +; +; 6 April 88 Handles latest Type 4 IF.COM +; 1.2 Changed command tail loader to accept :IF. Joe Wright +; +; 12/31/87 Modified for use with Z34CMN.LIB for NZ-COM. Joe Wright. +; 1.1 +; +; 05/25/87 Created ZCPR33 version from the code I released through ZSIG. +; 1.0 This code differs only in the more efficient way in which it +; determines if it was invoked with a directory prefix that +; signals that the transient IF.COM should be used to process +; the IF command. This permits the user to force the use of a +; more powerful option processor in the transient IF.COM than in +; the resident code. Option bytes were added after the end of +; the resident option dispatch table so that SHOW can report +; configuration options to the user. +; +; FCP10 notes +; +; The transient processor can now be loaded at an address other +; than 100h so as not to interfere with code loaded in the TPA. +; Then the GO command can normally be used even after IF.COM is +; used to process the flow test. If the LOADCHK equate +; is true then the FCP will verify that the transient +; processor has been loaded to the page in memory for which +; it was assembled. If loaded to the wrong page, it will +; be reloaded to the correct one. +; +; The test for the form ARG1=ARG2 was tightened up so as not to +; be confused by an equal sign in some later part of the command +; tail (e.g., "IF REG 1 = 2"). Now only the first token +; (contiguous string of characters) is checked. This extra code +; is under the control of the XEQOPT equate. The only option +; that is still a problem is the COMIF form '~='. Since the '=' +; is in the first token, this 'not equal' condition cannot be +; distinguished from an equality test against the character '~'. +; The solution is to turn off equality testing in the resident FCP +; or to use the alternative COMIF options 'NE' or '~EQ' for this +; test. +; +; Added optional commands AND and OR. These work like IF except +; that they affect the current IF level rather than going one +; level deeper. +; +; Added optional command ZIF to zero out all IF states no matter +; whether current state is true or false (XIF only works if state +; is true. +; +; Added new optional command IFQ (if-query) and enhanced the +; IFSTAT code that is invoked when the NOISE equate is true. +; In both cases, the entire tree of IF states is now shown, +; starting with the current level. For example, IFQ might result +; in the display "IF FTT" (we are at third IF level and it is +; false; the second and first IF levels are true). If the +; current IF level is 0, then the display is "IF None". +; +; Added two new resident options: AMBIGUOUS (AM) returns true if +; the file specification in the second token has a '?' (or '*') +; in it; COMPRESSED (CO) returns true if the file specificaton in +; the second token has a 'Z' or a 'Q' in the second character of +; the file type. +; +; Howard Goldstein contributed significantly to the development +; of this code. Bridger Mitchell also offered helpful +; suggestions. +; +; Jay Sage +; +; Notes from earlier SYSFCP revisions +; +; 09/12/85 Fixed bug in my code used when IF.COM is found in a specified +; drive/user area. The values of CDISK and CUSER were not being +; set, and as a result the user was not returned to the correct +; directory. The EXIST and EMPTY tests did not work correctly +; unless a DIR: or DU: was given explicitly with each file name. +; Jay Sage + +; 08/29/85 Reorganized code so that COMIF code handles only those +; options not in the table of local IF functions. Also changed +; code to allow searching for IF.COM in a specified directory +; instead of using the ROOT of the path. Also renamed macros +; to make code ZAS compatible. +; Jay Sage + +; 07/21/85 Corrected reversed sensing of program error flag in the +; IF ERROR test. +; Jay Sage + +; 01/02/85 Revised to correct a bug in the IF EMPTY test. First, the +; current record byte was not being set to zero before trying +; to read from the file. Secondly, the test for error was not +; testing for FF but for 00. My BDOS does not return 0 for +; success. It seems to return 00, 01, 02, or 03. This made the +; file appear to be empty. +; Jay Sage + + +;============================================================================= +; +; M A C R O S A N D E Q U A T E S +; +;============================================================================= + + name ('FCP') + +; External macro references + + maclib Z34CMN.LIB ; Source of system addresses + maclib NZFCP.LIB ; Source of configuration options + maclib Z34MAC.LIB ; Z34 macros + +; Equates section + +version equ 13 + +lf equ 0ah +cr equ 0dh +bell equ 07h + +base equ 0 +wboot equ base+0000h ; CP/M warm boot address +udflag equ base+0004h ; User num in high nybble, disk in low +bdos equ base+0005h ; BDOS function call entry point +tfcb equ base+005ch ; Default FCB buffer +fcb1 equ tfcb ; 1st and 2nd FCBs +fcb2 equ tfcb+16 +tbuff equ base+0080h ; Default disk I/O buffer +tpa equ base+0100h ; Base of TPA + + +;============================================================================= +; +; J e t L D R S I G N - O N +; +;============================================================================= + +; This prints an extended ID message upon loading with JetLDR. +; These are NOT the command names. + + COM /_ID_/ + + db 'Copyright 1989 ZSA',cr,lf + db 'Commands:',cr,lf + db ' IF ELSE FI XIF ' + + if andopt + db 'AND ' + endif + if oropt + db 'OR ' + endif + if ifqopt + db 'IFQ ' + endif + if zifopt + db 'ZIF ' + endif + + db cr,lf,'Options' + if ifoneg + db ' (use "',negchar,'" to negate)' + endif + if noise + db '; (noise)' + endif + db ':',cr,lf + + if ifotrue + db ' T F ' + endif + if ifambig + db 'AMbig ' + endif + if ifcompr + db 'COmpr ' + endif + if ifoempty + db 'EMpty ' + endif + if ifoeq + db 'x=y ' + endif + if ifoerror + db 'ERror ' + endif + if ifoexist + db 'EXist ' + endif + if ifoinput + db 'INput ' + endif + if ifonull + db 'NUll ' + endif + if iforeg + db 'REgs ' + endif + if ifotcap + db 'TCap ' + endif + if ifowheel + db 'WHeel ' + endif + + if comif + db cr,lf,' Use ' + if pathroot + db 'root:' + endif + db 'IF.COM' + endif + + db 0 ; End of JetLDR sign-on message + + CSEG + +;============================================================================= + +; Start of code + +start: + db 'Z3FCP' ; Flag for Package Loader + +;============================================================================= +; +; C O M M A N D T A B L E +; +;============================================================================= + +; The command name table is structured as follows: +; +; The first byte is the number of characters in each command name. +; Next come records consisting of command names followed by entry +; point addresses for the code to process the command. Finally, +; there is a null to indicate the end of the dispatch table. + + db cmdsize ; Size of text entries +ctab: ctable ; Macro defined in NZFCP.LIB + db 0 + +;============================================================================= +; +; I F C O N D I T I O N O P T I O N S +; +;============================================================================= + +condtab: + + if ifotrue + db 'T ' ; TRUE + dw ifctrue + db 'F ' ; FALSE + dw ifcfalse + endif ; ifotrue + + if ifambig ; Ambiguous file spec + db 'AM' + dw ifcambig + endif ; ifambig + + if ifcompr ; Squeezed or crunched + db 'CO' + dw ifccompr + endif ; ifcompr + + if ifoempty + db 'EM' ; File empty + dw ifcempty + endif ; ifoempty + + if ifoerror + db 'ER' ; Error message + dw ifcerror + endif ; ifoerror + + if ifoexist + db 'EX' ; File exists + dw ifcex + endif ; ifoexist + + if ifoinput + db 'IN' ; User input + dw ifcinput + endif ; ifoinput + + if ifonull + db 'NU' + dw ifcnull + endif ; ifonull + + if ifotcap ; Z3 TCAP available + db 'TC' + dw ifctcap + endif ; ifotcap + + if ifowheel ; Wheel Byte + db 'WH' + dw ifcwheel + endif ; ifowheel + + db 0 + +; Option bytes: these option bytes can be used to convey information to +; programs such as SHOW. The first one is used to reduce the chance of +; misinterpreting data from an earlier version of the FCP that does not +; have the option bytes. The next byte tells if COMIF has been activated +; and if the root of the path will be used as the directory in which to look +; for IF.COM. If PATHROOT is not selected (or if the path is empty), then +; the specified drive/user will be used. The overflow bit in case the user +; number is greater than 15 is kept in bit 2 of the second option byte. The +; combined user/drive value is kept in the third option byte. + +highuser defl ifusr gt 15 + +opt0: db 34h ; ZCPR34 version ID +opt1: optflag highuser,pathroot,comif +opt2: db ( ifusr and 0fh ) shl 4 + ( ifdrv - 'A' ) ; user/drive flag + +;============================================================================= +; +; C O M M A N D P R O C E S S I N G C O D E +; +;============================================================================= + +; Command: ZIF +; +; This command zeros out the IF system no matter what the current +; level IF state is. + + if zifopt + +ifzero: + if noise + call nl ; Print new line + endif ; noise + + jr ifexit1 + + endif ; zifopt + +;----------------------------------------------------------------------------- + +; Command: XIF +; +; If current IF state is true, XIF terminates all IFs, restoring a basic +; TRUE state. + +ifexit: + if noise + call nl ; Print new line + endif ; noise + + call iftest ; See if current IF is running and FALSE + + if noise + jr z,ifstat ; Abort with status message if so + else ; not noise + ret z ; Or just return if false + endif ; noise + +ifexit1: + ld hl,z3msg+1 ; Pt to IF flag + ld (hl),0 ; Zero IF flag + jr ifendmsg ; Print message + +;----------------------------------------------------------------------------- + +; Command: FI +; +; FI decrements to the previous IF level. It does this by shifting the +; current-if-bit in the first 'if' message in the Z3MSG buffer right one +; position. + +ifend: + if noise + call nl ; Print new line + endif ; noise + +; ld hl,z3msg+1 ; Point to IF flag +; ld a,(hl) ; Get it +; or a ; No IF active? + + call msgbf1 + dec hl ; Save a byte over the three lines above + + jr z,ifnderr + +ifendmsg: + if noise + call print + dc 'To ' ; Prefix to status display + endif ; noise + + srl (hl) ; Adjust active bit + + if noise + jr nz,ifstat ; Print status if IF still active + endif ; noise + +ifnderr: + if noise + + call print ; Print message + dc 'No ' + jp prif + + else ; not noise + + ret + + endif ; noise + +;----------------------------------------------------------------------------- + +; Command: ELSE +; +; ELSE complements the Active Bit for the Current IF provided the +; previous IF state was true. If the previous state was false, the +; command is flushed. +; +; This is accomplished according to the following algorithm. If the +; current IF is 0 (no IF) or 1 (one IF), then take the previous state +; to be true and perform the toggle. Otherwise, test the previous +; IF level condition and toggle only if it is true. + +ifelse: + if noise and (not ifqopt) + call nl ; Print new line + endif ; noise and (not ifqopt) + + call msgbf1 ; Get current if + ld b,a ; Save in B + srl a ; Back up if pointer bit to previous IF level + jr z,iftog ; If no previous IF level, go to toggle code + and (hl) ; Determine state of previous IF level + + if noise + if ifqopt + jr z,ifstat0 ; Print status on new line + else + jr z,ifstat ; If false, just print status + endif ; Ifqopt + else ; not noise + ret z ; Or simply return + endif ; noise + +iftog: + ld a,(hl) ; Get if-status message byte + xor b ; Flip current state + ld (hl),a ; Put result back in message byte + ; ..and fall thru to print status + + if not noise + ret + endif + +;----------------------------------------------------------------------------- + +; Indicate if current IF is True or False + +ifstat0: + call nl +ifstat: + call prif ; Print 'IF ' + call msgbf1 ; Get current if byte and set flags + ld b,a ; Get it into B + jr nz,ifstat1 ; Nz means if active + + call print + dc 'None' + ret + +ifstat1: + ld a,(hl) ; Get if-status message byte + and b ; Mask in currently active IF level status + ld c,'F' ; Load with false indicator + jr z,ifstat2 ; If current IF is false, jump + ld c,'T' ; Else, load with true indicator +ifstat2: + ld a,c + call conout + + srl b ; Drop one IF level + jr nz,ifstat1 ; Loop through all IF states + ret + +;------------------------- + +; Output CRLF + +nl: call print + dc cr,lf + ret + +;----------------------------------------------------------------------------- + +; Command: OR + +; This command performs a logical or operation by updating the +; if state without going to a new level. If there are active +; IFs and the current state is true, we do nothing. Else we back +; up one level and fall through to normal IF processing. + + if oropt + +orstart: + call msgbf1 ; Get if active byte + jr z,backup ; Treat like if if no IFs active + and (hl) ; Check current state + jr z,backup ; Current STATE false so go proecess + + if noise + jr ifstat0 ; Else return and show status + else + ret ; Or just return + + endif ; Noise + endif ; Oropt + +;----------------------------------------------------------------------------- + +; Command: AND + +; This command performs a logical and operation by updating the +; if state without going to a new level. If there are active +; IFs and the current state is false, we do nothing. Else we back +; up one level and fall through to normal IF processing. + + if andopt + +andstart: + call iftest ; Test for IF running and false + if noise + jr z,ifstat0 ; Condition met, show status & return + else + ret z ; Condition met, return + endif ; Noise + endif ; Andopt + +; Common stuff for and and or + + if andopt or oropt + +backup: + dec hl ; Pt to flag byte + srl (hl) ; Drop back one level +; +; Poke "IF" into external fcb for transient +; + if comif +pokefcb: + ld de,extfcb+1 ; Pt to external fcb + ld hl,ifcmd ; Pointer to IF command in table + ld bc,cmdsize ; Length + ldir ; Move it in + + endif ; comif + +; Fall through to IF PROCESSING + endif ;Andopt or oropt + +;----------------------------------------------------------------------------- + +; FCP Command: IF +; +; If current IF state is false, then advance to next level and set it +; to false also. If current IF state is true, then test condition and +; set the next level accordingly. + +ifstart: + if not ifqopt + + ld a,(extfcb) ; NZ if explicit + ld hl,tbuff + or (hl) + jp z,ifstat0 ; Report IF status + + endif ; not ifqopt + +ifstrt: + if noise + call nl ; Print new line + endif ; noise + + call iftest ; See if current IF is running and FALSE + jP z,ifcf ; Yes, do the right thing + +; Test for presence of colon in command. If colon present, then go directly +; to COMIF processing. + + if comif + ld a,(extfcb) ; Check drive byte of external FCB + or a ; If it is zero, no colon was present + jp nz,runcomif ; If colon, go to comif processing + ; Else fall through to resident processing + endif ; comif + +;----------------------------------------------------------------------------- +; +; R E S I D E N T C O M M A N D P R O C E S S I N G +; +;----------------------------------------------------------------------------- + +resident: + +; Test for Equality if Equal Sign in Token + + if ifoeq + + ld hl,tbuff+1 + + if xeqopt ; Extended equal testing + +skipsp: ; Skip over any space to first token + ld a,(hl) + or a ; Check for end of tail + jr z,ifck0 ; If so , go on + cp ' '+1 ; Test for space or control character + jr nc,tsteq ; If not, we are at first token + inc hl ; Otherwise advance to next character + jr skipsp ; ..and continue testing + + endif ; xeqopt + +tsteq: + ld a,(hl) ; Get character from command tail + inc hl ; Point to next one + or a ; EOL? + jr z,ifck0 ; Continue if so + + if xeqopt + cp ' '+1 ; End of token? + jr c,ifck0 ; If so, go on + endif ; xeqopt + + cp '=' ; Found '=' ? + jr nz,tsteq ; If not, continue scan + + ld hl,fcb1+1 ; Else, get ready to compare FCBs + ld de,fcb2+1 + ld b,11 ; 11 bytes +eqtest: + ld a,(de) ; Compare + cp (hl) + jr nz,ifcf + inc hl ; Pt to next + inc de + djnz eqtest + jr ifct + + endif ; ifoeq + + +ifck0: + ld de,fcb1+1 ; Point to first character in FCB1 + + if ifoneg + ld a,(de) ; Get it + ld (negflag),a ; Set negate flag + cp negchar ; Is it a negate? + jr nz,ifck1 ; If not, go on + inc de ; Else point to character after negchar +ifck1: + endif ; ifoneg + + if iforeg ; REGISTERS + call regtest ; Test for register value + jr nz,runreg + endif ; iforeg + + call condtest ; Test of condition match + jr nz,runcond ; If found, process condition + + if comif + jp runcomif ; If function not found in table, use transient + else + + call print ; Beep to indicate error + dc bell + + if noise + jp ifstat ; No condition, display current condition + else ; no noise + ret + endif ; noise + endif ; comif + +;----------------------------------------------------------------------------- +; +; Process register - register value is in A +; +;----------------------------------------------------------------------------- + + if iforeg +runreg: + push af ; Save value + call getnum ; Extract value in FCB2 as a number + pop af ; Get value + cp b ; Compare against extracted value + jr jrtrue ; True if match; false if not + endif ; iforeg + +;----------------------------------------------------------------------------- +; +; Process conditional test - address of conditional routine is in HL +; +;----------------------------------------------------------------------------- + +runcond: + jp (hl) ; "call" routine pted to by HL + +;============================================================================= +; +; R E S I D E N T C O N D I T I O N O P T I O N S +; +;============================================================================= + +; Condition: AMBIGUOUS + + if ifambig + +ifcambig: + ld hl,fcb2+1 ; Scan FCB2 for a '?' character + ld bc,11 ; Characters to scan + ld a,'?' ; Reference character + cpir + jr jrtrue ; True if '?' found; false if not + + endif ; ifambig + +;----------------------------------------------------------------------------- + +; Condition: COMPRESSED + + if ifcompr + +ifccompr: + ld a,(fcb2+10) ; Get middle character of file type + cp 'Z' ; Crunched + jr z,ifctrue + cp 'Q' ; Squeezed + jr jrtrue + + endif ; ifcompr + +;----------------------------------------------------------------------------- + +; Condition: TRUE +; IFCTRUE enables an active IF +; Condition: FALSE +; IFCFALSE enables an inactive IF + + if ifoempty or ifoerror or ifoexist or ifowheel +jrfalse: + jr z,ifcfalse + endif ; Ifoempty or ifoerror or ifoexist or ifowheel + +ifctrue: + + if ifoneg + call negtest ; Test for negate + jr z,ifcf + endif ; ifoneg + +ifct: + ld b,0ffh ; Active + jp ifset + + if iforeg or ifambig or ifcompr or ifoinput or ifonull +jrtrue: + jr z,ifctrue + endif ; Iforeg or ifambig or ifcompr or ifoinput or ifonull + +ifcfalse: + + if ifoneg + call negtest ; Test for negate + jr z,ifct + endif ; ifoneg + +ifcf: + ld b,0 ; Inactive + jp ifset + +;----------------------------------------------------------------------------- + +; Condition: EMPTY filename.typ + + if ifoempty +ifcempty: + call tlog ; Log into FCB2's DU + ld de,fcb2 ; Pt to fcb2 + ld c,15 ; Open file + push de ; Save fcb ptr + call bdos + pop de + inc a ; Not found? + jr z,ifctrue + ld c,20 ; Try to read a record + xor a ; set cr value to zero + ld (fcb2+32),a ; to attempt to read first record + call bdos + or a ; 0=OK + jr jrfalse ; true if no read + endif ; ifoempty + +;----------------------------------------------------------------------------- + +; Condition: ERROR + + if ifoerror +ifcerror: + ld a,(z3msg+6) ; Get error byte + or a ; 0=FALSE (no error registered) + jr jrfalse + endif ; ifoerror + +;----------------------------------------------------------------------------- + +; Condition: EXIST filename.typ + + if ifoexist +ifcex: + call tlog ; Log into DU + ld de,fcb2 ; Pt to fcb + ld c,17 ; Search for first + call bdos + inc a ; Set zero if error + jr jrfalse + endif ; Ifoexist + +;----------------------------------------------------------------------------- + +; Condition: INPUT (from user) + +; Modified to say " (Y/N)? ", and accept ONLY Y or y or N or n +; Carson Wilson 3/1/88 + + if ifoinput +ifcinput: + call print + dc ' (Y/N)? ' +ifcinp1: + ld hl,z3msg+7 ; Pt to ZEX message byte + ld (hl),10b ; Suspend ZEX input + push hl ; Save ptr to ZEX message byte +ifcinp2: + ld e,0ffh + ld c,6 ; Direct input from console + call bdos + or a ; Any input yet? + jr z,ifcinp2 ; Nope, try again + + pop hl ; Get ptr to ZEX message byte + ld (hl),0 ; Return ZEX to normal processing + and 5fh ; Mask and capitalize user input + cp 'Y' + jr nz,testN ; No, check if 'N' + call conout ; Display 'Y' + jr ifctrue ; Process as true +testN: + cp 'N' + jr nz,notN ; Not 'N' or 'n' + call conout ; Display 'N' + jr ifcfalse ; Process as false +notN: + ld a,bell ; Protest! + call conout + jr ifcinp1 ; Force either Y or y or N or n + + endif ; ifoinput + +;----------------------------------------------------------------------------- + +; Condition: NULL (2nd file name) + + if ifonull +ifcnull: + ld a,(fcb2+1) ; Get first char of 2nd file name + cp ' ' ; Space = null + jr jrtrue + endif ; ifonull + +;----------------------------------------------------------------------------- + +; Condition: TCAP + + if ifotcap +ifctcap: + ld a,(z3env+80h) ; Get first char of Z3 TCAP Entry + cp ' '+1 ; Space or less = none + jP c,ifcfalse + jP ifctrue + endif ; ifotcap + +;----------------------------------------------------------------------------- + +; Condition: WHEEL + + if ifowheel +ifcwheel: + ld hl,(z3env+29h) ; Get address of wheel byte + ld a,(hl) ; Get byte + or a ; Test for true + jP jrfalse ; False if 0 + endif ; ifowheel + +;============================================================================= +; +; S U P P O R T R O U T I N E S +; +;============================================================================= + +; Convert chars in FCB2 into a number in B + + if iforeg +getnum: + ld b,0 ; Set number + ld hl,fcb2+1 ; Pt to first char +getn1: + ld a,(hl) ; Get char + inc hl ; Pt to next + sub '0' ; Convert to binary + ret c ; Done if error + cp 10 ; Range? + ret nc ; Done if out of range + ld c,a ; Value in C + ld a,b ; A=old value + add a,a ; *2 + add a,a ; *4 + add a,b ; *5 + add a,a ; *10 + add a,c ; Add in new digit value + ld b,a ; Result in B + jr getn1 ; Continue processing + endif ; iforeg + +;----------------------------------------------------------------------------- + +; Log into DU in FCB2 + + if ifoexist or ifoempty + +tlog: + ld a,(fcb2) ; Get disk + or a ; Current? + jr nz,tlog1 + ld c,25 ; Get disk + call bdos + inc a ; Increment for following decrement +tlog1: + dec a ; A=0 + ld e,a ; Disk in E + ld c,14 + call bdos + ld a,(fcb2+13) ; Pt to user + ld e,a + ld c,32 ; Set user + jp bdos + + endif ; ifoexist or ifoempty + +;----------------------------------------------------------------------------- + +; Test of Negate Flag = negchar + + if ifoneg +negtest: +negflag equ $+1 ; Pointer for in-the-code modification + ld a,0 ; 2nd byte is filled in + cp negchar ; Test for No + ret + endif ; ifoneg + +;----------------------------------------------------------------------------- + +; Test FCB1 against a single digit (0-9) +; Return with register value in A and NZ if so + + if iforeg +regtest: + ld a,(de) ; Get digit + sub '0' + jr c,zret ; Z flag for no digit + cp 10 ; Range? + jr nc,zret ; Z flag for no digit + ld hl,z3msg+30h ; Pt to registers + add a,l ; Pt to register + ld l,a + ld a,h ; Add in H + adc 0 + ld h,a + xor a ; Set NZ + dec a + ld a,(hl) ; Get register value + ret +zret: + xor a ; Set Z + ret + endif ; iforeg + +;----------------------------------------------------------------------------- + +; Test to see if a current IF is running and if it is FALSE +; If so, return with Zero Flag Set (Z) +; If not, return with Zero Flag Clear (NZ) +; Affect only HL and PSW + +iftest: + call msgbf1 ; Test for active IF + jr z,ifok ; No active IF + and (hl) ; Check active flag + ret z ; Return Z since IF running and FALSE +ifok: + or 255 ; Return NZ for OK + ret + +msgbf1: + ld hl,z3msg+1 ; Get IF active flag + ld a,(hl) + inc hl ; Pt to If status byte + or a ; Set z if no IF active + ret + +;----------------------------------------------------------------------------- + +; Test FCB1 against condition table (must have 2-char entries) +; Return with routine address in HL if match and NZ flag + +condtest: + ld hl,condtab ; Pt to table +condt1: + ld a,(hl) ; End of table? + or a + ret z + ld a,(de) ; Get char + cp (hl) ; Comppare entries + inc hl ; Pt to next + inc de + jr nz,condt2 + ld a,(de) ; Get 2nd char + cp (hl) ; Compare + jr nz,condt2 + inc hl ; Pt to address + ld a,(hl) ; Get address in HL + inc hl + ld h,(hl) + ld l,a ; HL = address + jr ifok ; Set NZ for OK +condt2: + inc hl ; Pt to next entry + inc hl ; Skip over addr + inc hl + dec de ; Pt to 1st char of condition + jr condt1 + +;----------------------------------------------------------------------------- + +; Turn on next IF level +; B register is 0 if level is inactive, 0FFH if level is active + +ifset: +; ld hl,z3msg+1 ; Get IF flag +; ld a,(hl) +; or a ; If no if at all, start 1st one + + call msgbf1 + dec hl + + jr z,ifset1 +ifset0: + add a,a ; Advance to next level + jr c,iferr ; Check for overflow (8 IFs max) + ld (hl),a ; Set IF byte + jr ifset2 +ifset1: + inc a ; A=1 + ld (hl),a ; Set 1st IF +ifset2: + ld d,a ; Get IF byte + and b ; Set interested bit + ld b,a + inc hl ; Pt to active flag + ld a,d ; Complement IF byte + cpl + and (hl) ; Mask in only uninterested bits + or b ; Mask in interested bit + ld (hl),a ; Save result + + if noise + jp ifstat ; Print status and exit + else + ret ; Or just exit + endif ; noise + +iferr: + call print ; Beep to indicate overflow + dc bell + ret + +;============================================================================= +; +; T R A N S I E N T I F P R O C E S S I N G +; +;============================================================================= + + + if comif + +runcomif: + +; First we have to find IF.COM + + ld bc,100h*(ifdrv-'A')+ifusr ; Values to use if null path + + if pathroot + + ld hl,(expath) ; Point to symbolic path (indirect) +fndroot: + ld a,(hl) ; Check for end of path + or a + jr z,froot2 ; If end, branch + +; Process Next Path Element + + cp curint ; Current disk/user symbol? + jr nz,froot0 ; If not, branch + ld a,(curdr) ; Get current disk + inc a ; Compensate for following decrement +froot0: + dec a ; Shift to range 0..15 + ld b,a ; Set disk + inc hl ; Point to user in path + ld a,(hl) ; Get user + cp curint ; Current drive/user symbol? + jr nz,froot1 ; If not, branch + ld a,(curusr) ; Get current user +froot1: + ld c,a ; Set user + inc hl ; Point to next element in symbolic path + jr fndroot + +; Done with Search - BC Contains ROOT DU (or specified DU if path is empty) + + endif ; pathroot + +froot2: + call logbc ; Log into IF.COM's directory + +; Try to Open File IF.COM + + ld de,extfcb ; Point to command FCB + xor a + ld (de),a ; Force current drive + ld c,15 ; Open file + call bdos + inc a + jr nz,ifload ; Branch if file found + +; IF.COM not found - process as IF F + +ifnotfnd: + call iferr ; Ring bell + call reset ; Return home + jp ifcf + +; Load File IF.COM + +ifload: + call defdma ; First record to tbuff + call readcmd ; Read 1st record from IF.COM + jr nz,ifnotfnd ; If eof, treat as if file not found + + ld (extfcb+32),a ; Start from scratch (record 0) + ld a,(tbuff+8) + cp 3 + jr c,ifnotfnd ; Only Types 3 and 4 are acceptable + + call loadif ; Load IF.COM and set IFADR appropriately +; +; Build the command tail at tbuff +; + ld de,tbuff ; Point DE to tbuff + push de ; Save it for later + ld hl,(z3msg+4) ; Points into MCL buffer +; +; Advance HL to first 'space' after IF or .IF or :IF +; +advsp: inc hl + ld a,(hl) + cp ' '+1 ; Carry if space or null + jr nc,advsp + + ld c,0 ; Clear a counter + +putt: inc de ; Advance tbuff pointer + ld a,(hl) ; From MCL + ld (de),a ; To tbuff + inc hl ; Advance MCL pointer + or a ; Check for null + jr z,putx ; End of command line + cp ';' ; Command separator + jr z,putx ; End of command + inc c ; Count it up + jr putt ; Next.. + +putx: xor a ; Get a null + ld (de),a ; Terminate the line in tbuff + pop hl ; Beginning of tbuff + ld (hl),c ; Character count +; +; Pick up the execution address for Type 3 or 4 +; + ld hl,(ifadr) ; Load address + ld a,(hl) ; First byte at load address + cp 0c7h ; Test for RST 0 + jr nz,runif ; Nope, execute it + ld (hl),0c3h ; Plug in a JP +; +; Arrive here to execute IF.COM +; +runif: ld hl,z3env ; Pass environment in HL + db 0c3h ; JP instruction +ifadr: dw 0 ; Load/Execution address of IF.COM + +; +; Load IF.COM +; +loadif: + ld hl,(tbuff+11) ; Type 3 load address + jr z,loada ; Load as Type 3 +; +; Assume Type 4 (or higher) +; + ld hl,extfcb+32 ; Point to CR of extfcb + ld (hl),2 ; Set up for record 2 + push hl ; Save the pointer + call readcmd ; Get it into tbuff + pop hl + jp nz,ifnotfnd ; Too short + ld (hl),a ; Record 0 again + ld hl,(tbuff+11) ; Size word + push hl ; Save it + call readcmd ; Read record 0 again + pop bc ; Size + ld de,(ccp) ; CCP start + ld hl,z3env + dec a ; Phony fullget flag + call tbuff+9 ; Call Type 4 loader + push hl ; Save load address + call readcmd ; Read record 1 to tbuff (point to record 2) + pop hl ; Load address +; +loada: ld (ifadr),hl ; Save it +; +; Load IF.COM to (HL) until end of file, reset DMA and DU and return +; +load: push hl ; Save loading address + call setdma ; According to HL + call readcmd ; Read a record from file + pop hl ; Get current loading address back + jr nz,reset ; End of file + ld de,128 ; Advance it by one record + add hl,de + jr load ; Back to read some more + +; Reset DMA and Current DU + +reset: call defdma + ld bc,(curusr) ; Return home + +; Log Into DU in BC + +logbc: ld e,b ; Set disk + push bc + ld c,14 ; Select disk + call bdos + pop bc + ld e,c ; Set user + ld c,32 ; Select user + jp bdos + + +; Set default DMA address + +defdma: ld hl,tbuff + +; Set DMA to address according to HL + +setdma: push hl ; Save it + ex de,hl ; To DE + ld c,26 ; Set DMA command + call bdos ; Do it + pop hl ; DMA address + ret + +; Read a record from file in EXTFCB + +readcmd: + ld de,extfcb + ld c,20 + call bdos + or a ; Set NZ if error (end of file) + ret + + endif ; comif + +;============================================================================= +; +; U T I L I T Y S U B R O U T I N E S +; +;============================================================================= + +; Print "IF " + +prif: + call print + dc 'IF ' + ret + +;----------------------------------------------------------------------------- + +; Print String (terminated in 0 or MSB Set) at Return Address + +print: + ex (sp),hl ; Get address + call print1 + ex (sp),hl ; Put address + ret + +; Print String (terminated by MSB Set) pted to by HL + +print1: + ld a,(hl) ; Done? + inc hl ; Pt to next + call conout ; Print char + or a ; Set msb flag (m) + ret m ; Msb terminator + jr print1 + +;----------------------------------------------------------------------------- + +; Console Output Routine + +conout: + push hl ; Save regs + push de + push bc + push af + and 7fh ; Clear msb + ld e,a ; Char in E + ld c,2 ; Output + call bdos + pop af ; Get regs + pop bc + pop de + pop hl + ret + +;============================================================================= +; +; Display current length in records +; +prtval macro m1,v1,m2,v2,m3 + .radix 10 + .printx m1 v1 m2 v2 m3 + endm + +length equ $ - start +recs equ length / 128 +bytes equ length mod 128 + + .printx + prtval ,%recs,,%bytes, + .printx + + end + +; End of NZFCP.Z80 + \ No newline at end of file diff --git a/Source/BPBIOS/NZFCP13/z34cmn.lib b/Source/BPBIOS/NZFCP13/z34cmn.lib new file mode 100644 index 00000000..ad8c8cec --- /dev/null +++ b/Source/BPBIOS/NZFCP13/z34cmn.lib @@ -0,0 +1,105 @@ +; +; Library: Z34CMN.LIB +; Author: Carson Wilson +; Version: 1.2 +; Date: 16 June 1988 +; Changes: Renamed CRT0 to LINS for NZCOM compatibility. +; Added CUSR " " " + +; Author: Carson Wilson +; Version: 1.1 +; Date: 12 June 1988 +; Changes: Added CDRV for various Z34RCP commands. +; Added CRT0 for Z34RCP TYPE command. +; Added Z3TCAP and CLRSCR for Z34RCP CLS command. +; Added QUIET for ZCPR34 time in prompt. +; Added RSDMSG for ZCPR34 time in prompt. + +; Library: Z34CMN.LIB +; Author: Joe Wright +; Date: 23 March 1988 + +; As a replacement for Z3BASE.LIB, some usual equates. + +base equ 0 ; Base Page + +false equ 0 +true equ not false + +no equ false +yes equ true + +off equ false +on equ true + +; Named COMMON declarations start here. For compatibility, these +; are the same names used by Bridger Mitchell's JetLDR. + + common /_ENV_/ +z3env: ; Z3 Environment descriptor +z3envs equ yes ; There is one + +expath equ z3env+9 ; Address of External Path +expaths equ 10 ; Maximum 10 elements for MPATH + +rcp equ z3env+0ch ; Address of RCP +rcps equ yes ; Used as existence test, not size + +fcp equ z3env+12h ; Address of FCB +fcps equ yes ; Used as existence test, not size + +z3ndir equ z3env+15h ; Address of NDR +z3ndirs equ yes ; Used as existence test, not size + +quiet equ z3env+28h ; Quiet flag address + +z3whl equ z3env+29h ; Wheel byte address +z3whls equ yes ; There is a wheel + +lins equ z3env+33h ; CRT text lines address + +ccp equ z3env+3fh ; CCP entry +ccps equ z3env+41h ; Size + +dos equ z3env+42h ; DOS entry (+6) +doss equ z3env+44h ; Size + +bio equ z3env+45h ; BIO entry + +z3tcap equ z3env+80h ; TCAP address + +clrscr equ z3env+97h ; Clear screen string address + + common /_SSTK_/ +shstk: ; Top of Shell stack +shstks equ yes ; There is a shell stack + + common /_MSG_/ +z3msg: ; Message buffer +z3msgs equ yes ; There is one + +cusr equ z3msg+2eh ; Current user +cdrv equ z3msg+2fh ; Current drive + +rsdmsg equ z3msg+3ah ; Reserved bytes + + common /_FCB_/ +extfcb: ; External file control block +extfcbs equ yes ; There is one + + common /_MCL_/ +z3cl: ; Multiple command line +z3cls equ yes ; There is one + + common /_XSTK_/ +extstk: ; External stack +extstks equ yes ; There is one + + common /_BIOS_/ +bios: + + cseg ; Select Code Segment + +; End of Z34CMN.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/NZFCP13/z34mac.lib b/Source/BPBIOS/NZFCP13/z34mac.lib new file mode 100644 index 00000000..8ab3ffbe --- /dev/null +++ b/Source/BPBIOS/NZFCP13/z34mac.lib @@ -0,0 +1,122 @@ + +; Z33MAC.LIB : Macros for use with ZCPR33 + +; General purpose macros + +putreg macro + push hl ; Save registers in order + push de + push bc + endm + +getreg macro + pop bc ; Restore registers in order + pop de + pop hl + endm + +swap macro + rrca ; Exchange nibbles + rrca + rrca + rrca + endm + +;---------------------------------------- + +; Macro for forming option bytes + +; This macro generates a byte with bits corresponding to up to 8 option +; flags. The bits are filled in the order of the parameters and are right +; justified in the byte. + +optflag macro f1,f2,f3,f4,f5,f6,f7,f8 + +flag defl 0 ;; initial value + + irp temp, + + if not nul temp +flag defl flag shl 1 + if temp +flag defl flag or 1 + endif ;;temp + endif ;;not nul temp + + endm ;; irp + + defb low flag + + endm ;; optflag + +;----------------------------------------------------------------------------- + +; Command table entry definition macro + +; Macro to form an entry for one command in the table. The first parameter is +; the name to be used for the command (no quotes); the second parameter is the +; flag that indicates whether or not the command is to be enabled; the third +; parameter is the wheel control flag; and the last parameter is the jump +; address to the code that carries out the command. The command names are +; automatically padded out to the correct length (they will be truncated and +; an error message will result if a command name is too long). The characters +; in the command name are automatically converted to upper case. + +command macro cmdname,enableflag,wheelflag,address + + if enableflag ;; Generate command only if enabled + +whlmask defl wheelflag ;; Initialize variables +count defl cmdsize ;; Initialize to size of each command name + + irpc char,cmdname ;; Repeat over letters in command name + +count defl count - 1 ;; Count down characters in name + + if [ count lt cmdsize ] + + ;; If character is lower case, convert to upper case + + if [ '&char' ge 'a' ] and [ '&char' le 'z' ] + + if whlmask + defb [ '&char' and 5fh ] + 80h + else ;;not whlmask + defb [ '&char' and 5fh ] + endif ;;whlmask + + else ;;not lower case + + if whlmask + defb '&char' + 80h ;; If controlled by wheel, set high bit + else ;;not whlmask + defb '&char' ;; If not restricted, leave high bit clear + endif ;;whlmask + + endif ;;lower case + + endif ;;[ count lt cmdsize ] + +whlmask defl false ;; Turn off high-bit setting after first char + + endm ;irpc + + ;; Pad command name with blanks + + if [ count gt cmdsize ] ;; If we underflowed + *** Command name "&cmdname" is too long / truncated *** + else + rept count + defb ' ' + endm + endif ;[ count gt cmdsize ] + + dw address ;; Dispatch address for command + + endif ;enable + + endm ;command + +; End Z33MAC.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/WW.Z3T b/Source/BPBIOS/WW.Z3T new file mode 100644 index 0000000000000000000000000000000000000000..004cc957de530cb7f514fad115d83dd0a428540f GIT binary patch literal 128 zcmWFw(KR(PRe*r_1_4$H7GVYk2I**P59w$lFCarTQ#Hj}HN^wS^af(XTp*DPR$}N2 z;`;yz1F%AuTm}PEa}yxnEDuQ78)pIy(lp=$5;pum9XZ*#S%npeiREQ^r6oW<2mk;N CgBZU6 literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/Z34RCP11/Build.cmd b/Source/BPBIOS/Z34RCP11/Build.cmd new file mode 100644 index 00000000..1323b95f --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/Build.cmd @@ -0,0 +1,11 @@ +@echo off +setlocal + +set PATH=%PATH%;..\..\..\Tools\zx;..\..\..\Tools\cpmtools; + +set ZXBINDIR=../../../tools/cpm/bin/ +set ZXLIBDIR=../../../tools/cpm/lib/ +set ZXINCDIR=../../../tools/cpm/include/ + +rem zx Z80ASM -z34rcp11/MF +zx ZMAC -z34rcp11.z80 -/P diff --git a/Source/BPBIOS/Z34RCP11/Clean.cmd b/Source/BPBIOS/Z34RCP11/Clean.cmd new file mode 100644 index 00000000..a088f4e8 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/Clean.cmd @@ -0,0 +1,7 @@ +@echo off +setlocal + +if exist *.prn del *.prn +if exist *.lst del *.lst +if exist *.err del *.err +if exist *.rel del *.rel diff --git a/Source/BPBIOS/Z34RCP11/cledinst.com b/Source/BPBIOS/Z34RCP11/cledinst.com new file mode 100644 index 0000000000000000000000000000000000000000..c26a3cf02c007453704ae76535470281de8a2ed1 GIT binary patch literal 4992 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 literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/Z34RCP11/nzrcp.z80 b/Source/BPBIOS/Z34RCP11/nzrcp.z80 new file mode 100644 index 00000000..52b844e3 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/nzrcp.z80 @@ -0,0 +1,3010 @@ + +; New Name: NZRCP.Z80 Joe Wright July 1987 + +; Program: Z34RCP +; Version: 1.0 +; Description: Resident Command Package (RCP) for ZCPR34 +; Author: Jay Sage +; Date: March 1, 1987 +; Derivation: SYSRCP (Richard Conn) and many other contributions + +; ZCPR34 is copyright 1987 by Jay P. Sage. All rights reserved. End-user +; distribution and duplication permitted for non-commercial purposes only. +; Any commercial use of ZCPR34, defined as any situation where the duplicator +; recieves revenue by duplicating or distributing ZCPR34 by itself or in +; conjunction with any hardware or software product, is expressly prohibited +; unless authorized in writing by Jay P. Sage. + +version equ 2 +subver equ 4 + +; Vers 2.4 - Add whlchk subroutine for indirect addressing of wheel byte. +; 4 Apr 88 - Fixed command list routines. +; Joe Wright - Inhibit SPOP if there is no shell. Allow shstks = 1. + +; Vers 2.3 - Reset command, after calling F37, jumps to 0. +; 22 Feb 88 + +; Vers 2.2 - Modified for use of Z34CMN.LIB and NZ-COM. +; 31 Dec 87 +; Joe Wright + + +; Vers 2.1 - R command uses ZRDOS function 37 to reset drives. +; 6 Sep 87 - WHL command changed, WHLQ disappears. +; Joe Wright - REG command expanded. Add REG E (program error byte) +; - SPOP command added. Pops the shell stack + +;============================================================================= +; +; D E F I N I T I O N S S E C T I O N +; +;============================================================================= + + name ('RCP') + + maclib z34cmn.lib ; Defines ZCPR system addresses + maclib z34defn.lib ; Defines offsets in Z34 command processor + maclib z34mac.lib ; Macros + maclib sysdef.lib ; Common logic, sys, ascii defines + maclib nzrcp.lib ; Defines command options + +;============================================================================= +; +; E N T R Y C O D E S E C T I O N +; +;============================================================================= + +start: + db 'Z3RCP' ; Package ID + + +;---------------------------------------- + +; Command table + + db cmdsize ; Length of each command name + cmdtbl ; Dispatch table from Z33RCP.LIB + db 0 ; Marks end of command jump table + + +;---------------------------------------- + +; Name of RCP + +; This block allows the 'H' command and/or the SHOW utility to display a name +; and version number for this RCP as well as the commands that are supported. + +rcpname: + idstring ; From macro in Z33RCP.LIB + +; Include only those code sections that are required. + +; include rcph ; 'H' help (command list) command + page + +; RCP-H.Z80 'H' Command + +;============================================================================= +; +; H E L P C O M M A N D +; +;============================================================================= + +; This command displays a list of all resident commands that are supported, +; including those in the CPR (command processor), RCP, and FCP. + +clist: + +; Print the CPR-resident command names + + if listcpr + + call print ; Print "CPR" + db lf + db 'CP','R'+80h +; + ld hl,(ccp) ; CCP location from Z3ENV + ld de,offcmd ; Offset to CPR command table + add hl,de + call cmdlist ; Display the list of commands + + endif ;listcpr + +; Print the FCP-resident command names + + if listfcp + + ld hl,(fcp) + ld a,h + or l + jr z,rcplist ; No FCP + + ld a,(hl) + or a + jr z,rcplist ; FCP removed + + call print ; Print header for FCP + db lf + db 'FC','P'+80h + ld de,5 + add hl,de ; Point to FCP command table + call cmdlist + + endif ;listfcp + +; Print the RCP-resident command names + +rcplist: + if listrcp + + call crlf ; Skip a line + ld hl,rcpname ; Print RCP name + call printhl + ld hl,start+5 ; Point to RCP command table + + else + + ret + + endif ;listrcp + + ; Fall through to CMDLIST + +;---------------------------------------- + +; Subroutine to display list of commands in a command table (code above +; falls through to this routine -- do not move it). The commands are +; displayed 5 per line with 8 character spaces allowed for each command +; (subject to equates below). + +cmdlist: + call crlf ; Start with new line + ld e,(hl) ; Get size of each command name into DE + ld d,0 + inc hl ; Point to name of first command + ld c,cmdsline ; Set names-per-line value + +cmdlist1: + ld a,(hl) ; Get first character of the command name + or a ; See if it is null + jr nz,cmdlist1a ; If not, continue + ld a,cmdsline ; See if we are already on a new line + cp c + call nz,crlf ; If not, skip a line + ret + +cmdlist1a: + if noshow ; Option to suppress wheel-limited cmds + rla ; Shift high bit of name into carry bit + jr nc,cmdlist2 ; If not restricted, go on + call whlchk ; Check wheel byte + jr nz,cmdlist2 ; If wheel set, continue as usual + add hl,de ; Otherwise skip this command + jr cmdlist5 + endif + +; Print leading spaces between names + +cmdlist2: + ld a,cmdspace ; Spacing between command names + sub e ; Less length of each command name + ld b,a + ld a,' ' +cmdlist3: + call conout + djnz cmdlist3 + +; Print name of command + + ld b,e ; Length of each name into B +cmdlist4: + ld a,(hl) ; Get command name character + call conout + inc hl ; Point to next + djnz cmdlist4 + + dec c ; Decrement count of names on this line + jr nz,cmdlist5 ; Branch if room for more names + call crlf ; Otherwise, end this line and + ld c,cmdsline ; ..reset count for another line of commands + +; Skip to next command name + +cmdlist5: + inc hl ; Skip jump vector + inc hl + jr cmdlist1 ; Back to process next name + +; End RCP-H.Z80 + +;============================================================================= +; +; P O P S H E L L S T A C K C O M M A N D +; +;============================================================================= + +; +; POP the Shell Stack +; + if spopon + +; Pop the shell stack + +spop: ld hl,(z3env+1eh) ; SHSTK (indirect) + ld a,h + or l + ret z ; No shell stack + + ex de,hl ; SHSTK to DE + ld hl,(z3env+20h) ; SHSTKS to L, SHSIZE to H + push hl ; Save SHSIZE + xor a ; Your basic null in A + ld b,l + dec b ; SHSTKS-1 in B + jr z,sp0a ; Clear one entry + + push de ; Save SHSTK + ld e,h ; SHSIZE to E + ld d,a ; Clear D + ld h,a ; Clear H.. + ld l,a ; ..and L +sp0: add hl,de ; Multiply SHSIZE*(SHSTKS-1) + djnz sp0 + ld b,h + ld c,l ; Length to BC + ex de,hl ; SHSIZE to HL + pop de ; Get SHSTK (destination) + add hl,de ; SHSTK+SHSIZE to HL (Source) + ldir + +sp0a: pop bc ; Get SHSIZE in B +sp1: ld (de),a ; Clear last entry + inc de + djnz sp1 + ret + endif ; SPOPON + + + if clson +; include rcpcls ; 'CLS' clear screen command + page + +; RCP-CLS.Z80 'CLS' Command + +;============================================================================= +; +; C L E A R S C R E E N C O M M A N D +; +;============================================================================= + +; Command: CLS +; Function: To clear the CRT screen +; Comments: The setting of the CLSTCAP equate determines whether this +; command uses the TCAP information or not. If not, it uses the +; clear-screen string passed in macro CLSSTR. That string should +; end with the high bit set. + +cls: + if clstcap ; If using TCAP for clear screen string + + ld a,(z3env+80h) ; Get beginning of tcap + cp ' '+1 ; See if blank or perhaps null + jr nc,cls1 ; If not, go to clear screen code + call print ; If blank, then give error message + db ' No TCA','P'+80h + ret + +cls1: ld hl,z3env+97h ; Point to beginning of clear screen string + jp printhl ; Display it + + else ; Not using tcap + + call print + clsstr ; String from Z33RCP.LIB + ret + + endif ;clstcap + +; End RCP-CLS.Z80 + + endif ;clson + + if reson +; include rcpr ; 'R' disk reset command + page + +; RCP-R.Z80 'R' command + +;============================================================================= +; +; D I S K R E S E T C O M M A N D +; +;============================================================================= + +; Command: RESET +; Function: Reset the disk system +; Comments: ZRDOS does not require a disk system reset when disks are +; changed, but directory programs will not show the correct +; size if this is not done. It is also good practice. Since +; no warm boot performed, the disk in drive A need not have the +; operating system on it. +; Ver 2.1 Now logs all drives off and forces fixed and ram disks to +; re-log. +reset: + if resmsg ; If displaying a reset message + call print ; Report action + dc ' Reset' + endif ;resmsg + + ld de,-1 ; All 16 drives + ld c,37 ; Disks reset ZRDOS function + call bdos + ld c,13 ; Reset disk system + jp bdos + +; End RCP-R.Z80 + + endif ;reson + + if tston +; include rcptst ; 'TST' error test command + page + +; RCP-TST.Z80 'TST' Command + +;============================================================================= +; +; E R R O R T E S T C O M M A N D +; +;============================================================================= + +; Command: TST +; Function: To set the message buffer program error flag based on +; error count reported by M80 or L80 +; Syntax: TST PN where PN is (at least) the first letter of M80 or L80 + +testerr: + +; Check for name of program to test + + ld a,(fcb1+1) ; Get first character in program name + + if testm80 + ld hl,m80f ; Preset for m80 test counts + ld de,m80w + cp 'M' + jr z,testcount + endif ; Testm80 + + if testf80 + ld hl,f80f + ld de,f80w + cp 'F' + jr z,testcount + endif ; Testf80 + +; If no match, give error message + + call print + db 'bad nam','e'+80h + +testcount: + ld a,(hl) ; Test first error count word + inc hl + or (hl) + ex de,hl ; Test second word + or (hl) + inc hl + or (hl) + ld hl,z3msg+6 ; Point to program error flag + ld (hl),0 ; Clear it + ret z ; If counts were zero, we are done + ld (hl),0ffh ; Else set the error flag + ret + +; End RCP-TST.Z80 + + endif ;tston + + if spaceon +; include rcpsp ; 'SP' space on disk command + page + +; RCP-SP.Z80 'SP' Command + +;============================================================================= +; +; D I S K S P A C E C O M M A N D +; +;============================================================================= + +; Command: SP +; Function: Shows space remaining on designated drive +; Syntax: SP [DIR:|DU:] +; Comments: This code can be called by several other RCP commands so that +; they can show the space remaining on the disk after their +; operation. + + if [erasp or cpsp or dirsp] +crspace: ; Used to call space after other subroutines + call crlf ; Start new line + endif ;[erasp or cpsp or dirsp] + +space: + ld a,(fcb1) ; Determine requested drive + or a ; If drive explicitly selected + jr nz,space1 ; ..then skip + + ld c,25 ; BDOS get current drive function + call bdos + inc a ; Shift to range 1..16 + +space1: + dec a ; Shift to range 0..15 + ld e,a ; Save in E for selecting disk below + add 'A' ; Convert to letter and + ld (seldrv),a ; save in message string below + ld c,14 ; BDOS select disk function + call bdos ; Not needed if no drive selected, but smallest + ; ..possible code size this way. + +; Here we extract the following disk parameter information from the disk +; parameter block (DPB): +; BLKSHF: block shift factor (1 byte) +; BLKMAX: max number of blocks on disk (2 bytes) + +dparams: + ld c,31 ; BDOS get disk parameters function + call bdos + inc hl ; Advance to block shift factor byte + inc hl + ld a,(hl) ; Get value and + ld (blkshf),a ; ..save it in code below + inc hl ; Advance to max block number word + inc hl + inc hl + ld e,(hl) ; Get value into HL + inc hl + ld d,(hl) + inc de ; Add 1 for max number of blocks + +; Compute amount of free space left on disk + +dfree: + ld c,27 ; BDOS get allocation vector function + push de ; Save BLKMAX value + call bdos ; Get allocation vector into HL + ld b,h ; Copy allocation vector to BC + ld c,l + pop hl ; Restore MAXBLK value to HL + ld de,0 ; Inititialize count of free blocks + +; At this point we have +; BC = allocation vector address +; DE = free block count +; HL = number of blocks on disk + +free1: + push bc ; Save allocation address + ld a,(bc) ; Get bit pattern of allocation byte + ld b,8 ; Set to process 8 blocks +free2: + rla ; Rotate allocated block bit into carry flag + jr c,free3 ; If set (bit=1), block is allocated + inc de ; If not set, block is not allocated, so + ; ..increment free block count +free3: + ld c,a ; Save remaining allocation bits in C + dec hl ; Count down number of blocks on disk + ld a,l ; See if we are down to zero + or h + jr z,free4 ; Branch if no more blocks to check + ld a,c ; Get back current allocation bit pattern + djnz free2 ; Loop through 8 bits + pop bc ; Get pointer to allocation vector + inc bc ; Point to next allocation byte + jr free1 ; Continue by processing next allocation byte + +free4: + pop bc ; Clean up stack + ex de,hl ; Free block count to HL +blkshf equ $+1 ; Pointer for in-the-code modification + ld a,0 ; Get block shift factor + sub 3 ; Convert to log base 2 of K per block + jr z,free6 ; Done if single density (1k per block) + +; Convert for blocks of more than 1K each + +free5: + add hl,hl + dec a + jr nz,free5 + +; At this point HL = amount of free space on disk in K + +free6: + call print + db ' Space on ' +seldrv: db 0 ; Modified above to contain drive letter + db ':',[' '+80h] + +; Display decimal value of HL + + ld b,0 ; Initialize count of digits already printed + ld de,10000 ; Divisor in DE + call decdsp ; Print digit (or space if leading '0') + ld de,1000 + call decdsp + call decdsp3 ; Display hundreds, tens, and units + ld a,'K' + jp conout ; Final return from space routine + +; End RCP-SP.Z80 + + endif ;spaceon + + if diron +; include rcpdir ; 'DIR' directory command + page + +; RCP-DIR.Z80 'DIR' Command + +;============================================================================= +; +; D I R E C T O R Y D I S P L A Y C O M M A N D +; +;============================================================================= + +; Command: DIR +; Function: Display a directory of the files on disk +; Syntax: DIR Displays the DIR files +; DIR S Displays the SYS files +; DIR A Display both DIR and SYS files +; DIR /S Equivalent to DIR *.* S +; DIR /A Equivalent to DIR *.* A + +dir: + call retsave ; Save return address and set stack + +; See if FCB should be made wild (all '?') + + ld hl,fcb1+1 ; Point to file name in FCP + ld a,(hl) ; Get first character of filename + + if slashchk ; Allow "DIR /S" and "DIR /A" formats + cp '/' ; If name does not start with '/' + jr nz,dir01 ; ..branch and process normally + inc hl ; Point to second character + ld a,(hl) ; Get option character after slash + ld (fcb2+1),a ; ..and put it into second FCB + dec hl ; Back to first character + ld a,' ' ; Simulate empty FCB + endif ;slashchk + +dir01: + ld b,11 ; Prepare to fill FCB name and type with '?' + cp ' ' ; See if no file spec given + ld a,'?' ; Get ready to fill with '?' + call z,fillp ; ..carry out fill + + if nosys ; Suppress-SYS-file-if-no-wheel option + call whlchk ; Check wheel byte + jr z,dirnly ; If wheel off, ignore options + endif + + ld a,(fcb2+1) ; Get first char of 2nd file name + ld b,1 ; Set for both dir and sys files + cp allflag ; SYS and DIR flag specifier? + jr z,dirpr ; Got system specifier + dec b ; B=0 for sys files only + cp sysflag ; SYS only? + jr z,dirpr + +dirnly: ld b,80h ; Must be dir-only selection + +; DIRECTORY PRINT ROUTINE; ON ENTRY, B REG IS SET AS FOLLOWS: +; 0 FOR ONLY SYSTEM FILES, 80H FOR ONLY DIR FILES, 1 FOR BOTH +; +dirpr: + ld a,b ; Get systst flag + call getdir ; Load and sort directory + jp z,prfnf ; Print no file message + ld e,width ; Count down to 0 +; +; ENTRY PRINT LOOP; ON ENTRY, HL PTS TO FILES SELECTED (TERMINATED BY 0) +; AND E IS ENTRY COUNTER +; +dir3: + ld a,(hl) ; Check for done + or a + if dirsp and spaceon + jp z,spaexit ; Show space when done + else + jp z,exit ; Exit if done + endif ; Dirsp and spaceon + ld a,e ; Get entry counter + or a ; Output if 4 entries printed in line + jr nz,dir3a ; Continue + call crlf ; New line + ld e,width ; Reset entry count + ld a,e ; Get entry count +dir3a cp width ; First entry? + jr z,dir4 + call print +; + if wide +; + db ' ' ; 2 spaces + db fence ; Then fence char + db ' '+80h ; Then 1 more space +; + else +; + db ' ' ; Space + db fence+80h ; Then fence char +; + endif ; Wide +; +dir4: + call prfn ; Print file name + call break ; Check for abort + dec e ; Decrement entry counter + jr dir3 + +; End RCP-DIR.Z80 + + endif ;diron + + if eraon +; include rcpera ; 'ERA' erase command + page + +; RCP-ERA.Z80 'ERA' Command + +;============================================================================= +; +; E R A S E C O M M A N D +; +;============================================================================= + +;Command: ERA +;Function: Erase files +;Forms: +; ERA Erase Specified files and print their names +; ERA I Erase Specified files and print their names, but ask +; for verification before Erase is done + +era: + call retsave + ld a,(fcb2+1) ; Get eraflg if it's there + ld (eraflg),a ; Save it as a flag + ld a,1 ; Dir files only + call getdir ; Load directory of files + jp z,prfnf ; Abort if no files +; +; MAIN ERASE LOOP +; +era1: + call break ; See if user wants to stop + push hl ; Save ptr to file + call prfn ; Print its name + ld (nxtfile),hl ; Save ptr to next file + pop hl ; Get ptr to this file + call rotest ; Test file pted to by hl for r/o + jr nz,era3 +eraflg equ $+1 ; Address of flag + ld a,0 ; 2nd byte is flag + cp 'I' ; Is it an inspect option? + jr nz,era2 ; Skip prompt if it is not + call eraq ; Erase? + jr nz,era3 ; Skip if not +era2: + ld de,fcb1+1 ; Copy into fcb1 + ld b,11 ; 11 bytes + call blkmov + call initfcb1 ; Init fcb + ld c,19 ; Delete file + call bdos +era3: + ld hl,(nxtfile) ; Hl pts to next file + ld a,(hl) ; Get char + or a ; Done? + if erasp and spaceon + jp z,spaexit + else + jp z,exit + endif ; Erasp and spaceon + call crlf ; New line + jr era1 + +; End RCP-ERA.Z80 + + endif ;eraon + + if lton +; include rcplt ; 'LIST' and 'TYPE' commands + page + +; RCP-LT.Z80 + +;============================================================================= +; +; L I S T A N D T Y P E C O M M A N D S +; +;============================================================================= + +;Command: LIST +;Function: Print out specified file on the LST: Device +;Forms: +; LIST Print file (NO Paging) +;Notes: +; The flags which apply to TYPE do not take effect with LIST + + if liston +list: +; +; CHECK FOR WHEEL APPROVAL IF OPTION ENABLED + + + call retsave + ld a,0ffh ; Turn on printer flag + jr type0 + endif ;liston + +;Command: TYPE +;Function: Print out specified file on the CON: Device +;Forms: +; TYPE Print file +; TYPE P Print file with paging flag +;Notes: +; The flag PGDFLG defines the letter which toggles the paging +; facility (P in the forms section above) +; The flag PGDFLT determines if TYPE is to page by default +; (PGDFLT=TRUE if TYPE pages by default); combined with +; PGDFLG, the following events occur -- +; If PGDFLT = TRUE, PGDFLG turns OFF paging +; If PGDFLT = FALSE, PGDFLG turns ON paging +; +type: +; +; CHECK FOR WHEEL APPROVAL IF OPTION ENABLED +; +; + call retsave + xor a ; Turn off printer flag +; +; ENTRY POINT FOR CPR LIST FUNCTION (LIST) +; +type0: + if liston + ld (prflg),a ; Set flag + endif ; Liston + + ld a,(fcb2+1) ; Get page flag + ld (pgflg),a ; Save it as a flag + ld a,1 ; Select dir files + call getdir ; Allow ambiguous files (HL points to buffer) + jp z,prfnf ; No files + jr typex2 + + ; Entry point for successive files +typex: + ld hl,(nxtfile) ; Get ptr to next file + ld a,(hl) ; Any files? + or a + jp z,exit + + if liston + ld a,(prflg) ; Check for list output + or a ; 0=type + jr z,typex1 + ld a,cr ; Bol on printer + call lcout + ld a,ff ; Form feed the printer + call lcout + jr typex2 + endif ; Liston + +typex1: +; LDA PAGCNT ; If we've just done so, + push hl + ld hl,(pagcnt) + ld a,(hl) + pop hl + cp nlines-2 ; Don't type another + call nz,pagebreak ; Page break message +typex2: + ld de,fcb1+1 ; Copy into fcb1 + ld b,11 ; 11 bytes + call blkmov + ld (nxtfile),hl ; Set ptr to next file + call initfcb1 ; Init fcb1 + ld c,15 ; Open file + call bdos + inc a ; Set error flag + jp z,prfnf ; Abort if error +; MVI A,NLINES-2 ; Set line count +; STA PAGCNT + ld hl,(pagcnt) + ld (hl),nlines-2 + ld a,cr ; New line + call lcout + ld a,lf + call lcout + ld bc,080h ; Set char position and tab count + ; (b=0=tab, c=080h=char position) +; +; MAIN LOOP FOR LOADING NEXT BLOCK +; +type2: + ld a,c ; Get char count + cp 80h + jr c,type3 +; PUSH H ; Read next block + push bc + ld de,fcb1 ; Pt to fcb + ld c,20 ; Read record + call bdos + or a ; Set flags + pop bc +; POP H + jr nz,typex ; End of file? + ld c,0 ; Set char count + ld hl,tbuff ; Pt to first char +; +; MAIN LOOP FOR PRINTING CHARS IN TBUFF +; +type3: + ld a,(hl) ; Get next char + and 7fh ; Mask out msb + cp 1ah ; End of file (^z)? + jr z,typex ; Next file if so +; +; OUTPUT CHAR TO CON: OR LST: DEVICE WITH TABULATION +; + cp cr ; Reset tab count? + jr z,type4 + cp lf ; Reset tab count? + jr z,type4 + cp tab ; Tab? + jr z,type5 +; +; OUTPUT CHAR AND INCREMENT CHAR COUNT +; + call lcout ; Output char + inc b ; Increment tab count + jr type6 +; +; OUTPUT OR AND RESET TAB COUNT +; +type4: + call lcout ; Output or + ld b,0 ; Reset tab counter + jr type6 +; +; TABULATE +; +type5: + ld a,' ' ; + call lcout + inc b ; Incr pos count + ld a,b + and 7 + jr nz,type5 +; +; CONTINUE PROCESSING +; +type6: + inc c ; Increment char count + inc hl ; Pt to next char + call break ; Check for abort + jp z,typex ; Skip + jr type2 +; +; SEND OUTPUT TO LST: OR CON:, AS PER THE FLAG +; RETURN WITH Z IF ABORT +; +lcout: + push hl ; Save regs + push bc + ld e,a ; Char in e + ld c,2 ; Output to con: + if liston +prflg equ $+1 ; Pointer for in-the-code modification + ld a,0 ; 2nd byte is the print flag + or a ; 0=type + jr z,lc1 + ld c,5 ; Output to lst: + endif ; Liston + +lc1: + push de ; Save char + call bdos ; Output char in e + pop de ; Get char + ld a,e + cp lf + jr nz,lc2 + if liston + ld a,(prflg) ; Output to lst:? + or a ; Nz = yes + jr nz,lc2 + endif ; Liston +; +; CHECK FOR PAGING +; +; LXI H,PAGCNT ; Count down + ld hl,(pagcnt) + dec (hl) + jr nz,lc2 ; Jump if not end of page + ld (hl),nlines-2 ; Refill counter +pgflg equ $+1 ; Pointer to in-the-code buffer + ld a,0 ; 2nd byte is the paging flag + cp pgdflg ; Page default override option wanted? +; + if pgdflt ; If paging is default +; + jr z,lc2 ; Pgdflg means no paging +; + else +; + jr nz,lc2 ; Pgdflg means page +; + endif ; Pgdflt +; + call pagebreak ; Print page break message + jp z,typex ; Z to skip +lc2: + pop bc ; Restore regs + pop hl + ret +; +; PRINT PAGE BREAK MESSAGE AND GET USER INPUT +; ABORT IF ^C, RZ IF ^X +; +pagebreak: + push hl ; Save hl + call print + db cr,lf,' Typing',' '+80h + ld hl,fcb1+1 ; Print file name + call prfn + call dash ; Print dash + call conin ; Get input + pop hl ; Restore hl + push af + call crlf ; New line + pop af + jp break1 +; +; End RCP-LT.Z80 + + endif ;lton + + if renon +; include rcpren ; 'REN' rename command + page + +; RCP-REN.Z80 + +;Section 5E +;Command: REN +;Function: To change the name of an existing file +;Forms: +; REN = Perform function +; +ren: +; +; CHECK FOR WHEEL APPROVAL IF OPTION ENABLED +; + + call retsave +; +; +; STEP 1: CHECK FOR FILE 2 BEING AMBIGUOUS +; + ld hl,fcb2+1 ; Can't be ambiguous + call ambchk1 +; +; STEP 2: LOG INTO USER AREA +; + call logusr ; Log into user area of fcb1 +; +; STEP 3: SEE IF OLD FILE IS R/O +; + ld hl,fcb1 ; Pt to 1st fcb + push hl + ld de,fcb2 ; Pt to 2nd file + push de ; Save ptr + ld a,(hl) ; Get 1st's drive + ld (de),a ; Stuff into second fcb + ld c,17 ; Look for file + call bdos + inc a + jp z,prfnf + call getsbit ; Get ptr to entry in tbuff + ex de,hl ; Hl pts to entry + inc hl ; Pt to fn + call rotest ; See if file is r/o + jp nz,exit +; +; STEP 4: SEE IF NEW FILE ALREADY EXISTS +; EXTEST PERFORMS A NUMBER OF CHECKS: +; 1) AMBIGUITY +; 2) R/O +; 3) IF FILE EXISTS AND NOT R/O, PERMISSION TO DELETE +; + call extest + jp z,exit ; R/o or no permission +; +; STEP 5: EXCHANGE FILE NAME FIELDS FOR RENAME +; + pop de ; Pt to old + pop hl ; Pt to new + push hl ; Save ptr + ld b,12 ; 12 bytes + call iswap1 +; +; STEP 6: RENAME THE FILE +; + pop de ; Get ptr to fcb + ld c,23 ; Rename + call bdos + inc a ; Set zero flag if error + jp z,prfnf ; Print no source file message + jp exit +; +; +; End RCP-REN.Z80 + + endif ;renon + + if proton +; include rcpprot ; 'PROT' file attribute setting command + page + +; RCP-PROT.Z80 + +;Section 5F +;Command: PROT +;Function: To set the attributes of a file (R/O and SYS) +; +;Form: +; PROT afn RSI +;If either R or S are omitted, the file is made R/W or DIR, resp; +;R and S may be in any order. If I is present, Inspection is enabled. + +att: + call retsave + xor a ; Set no inspect + ld (inspect),a + ld hl,0 ; Set r/o and sys attributes off + ld de,fcb2+1 ; Pt to attributes + ld b,3 ; 3 chars max +att1: + ld a,(de) ; Get char + inc de ; Pt to next + cp 'I' ; Inspect? + jr z,atti + cp 'R' ; Set r/o? + jr z,attr + cp 'S' ; Set sys? + jr z,atts +att2: + djnz att1 + jr att3 +atti: + ld (inspect),a ; Set flag + jr att2 +attr: + ld h,80h ; Set r/o bit + jr att2 +atts: + ld l,80h ; Set sys bit + jr att2 +att3: + ld (fatt),hl ; Save file attributes + ld a,1 ; Select dir and sys files + call getdir ; Load directory + jp z,prfnf ; No file error + jr att5 +att4: + ld hl,(nxtfile) ; Pt to next file + ld a,(hl) ; End of list? + or a + jp z,exit + call crlf ; New line +att5: + call break ; Check for possible abort + push hl ; Save ptr to current file + call prfn ; Print its name + ld (nxtfile),hl ; Save ptr to next file + call print + db ' Set to R','/'+80h + ld hl,(fatt) ; Get attributes + ld c,'W' ; Assume r/w + ld a,h ; Get r/o bit + or a + jr z,att6 + ld c,'O' ; Set r/o +att6: + ld a,c ; Get char + call conout + ld a,l ; Get sys flag + or a ; Set flag + jr z,att7 + call print + db ' and SY','S'+80h +att7: +inspect equ $+1 ; Ptr for in-the-code modification + ld a,0 ; Get inspect flag + or a ; Z=no + pop hl ; Get ptr to current file + jr z,att8 + call eraq1 ; Ask for y/n + jr nz,att4 ; Advance to next file if not y +att8: + ld de,fcb1+1 ; Copy into fcb1 + ld b,11 ; 11 bytes + call blkmov +fatt equ $+1 ; Ptr for in-the-code modification + ld hl,0 ; Get attributes + dec de ; Pt to sys byte + dec de + ld a,l ; Get sys flag + call attset ; Set attribute correctly + dec de ; Pt to r/o byte + ld a,h ; Get r/o flag + call attset + ld de,fcb1 ; Pt to fcb + ld c,30 ; Set attributes + call bdos + jr att4 +attset: + or a ; 0=clear attribute + jr z,attst1 + ld a,(de) ; Get byte + or 80h ; Set attribute + ld (de),a + ret +attst1: + ld a,(de) ; Get byte + and 7fh ; Clear attribute + ld (de),a + ret +; +; End RCP-PROT.Z80 + + endif ;proton + + if cpon +; include rcpcp ; 'CP' file copying command + +; RCP-CP.Z80 + +;============================================================================= +; +; F I L E C O P Y C O M M A N D +; +;============================================================================= + +; Command: CP +; Function: Copy a file from one place to another +; Syntax: CP destfile=srcfile +; CP srcfile +; Comments: Both file specifications can include a directory specification. +; If only one file name is given, then the current directory and +; the source file name are assumed for the destination. + +copy: + call retsave + +; If new is blank, make it the same name and type as old + + ld de,fcb1+1 ; Point to destination file name + ld a,(de) ; Get first character + cp ' ' ; If not blank (no name) + jr nz,copy0 ; ..then branch to copy + + ld hl,fcb2+1 ; Copy source name into destination FCB + ld b,11 ; Name and type are 11 bytes + call blkmov + +; See if destination is same as source, and abort if so + +copy0: + ld hl,fcb1 ; Set up pointers to two files + ld de,fcb2 + push hl + push de + inc hl ; Point to names of files + inc de + ld b,13 ; Compare 13 bytes (name, type, and user #) +copy1: + call comp + jr nz,copy2 ; If they differ, go on with copy + + ld c,25 ; Get-current-disk BDOS function + call bdos ; Get it in case no drive given explicitly + inc a ; Shift to range 1..16 + ld b,a ; ..and keep value in B + pop de ; Restore pointers to FCBs + pop hl + ld a,(de) ; Get drive of source file + ld c,a ; ..and save it in C + or a ; Is it default drive? + jr nz,copy1a ; Branch if drive made explicit + ld c,b ; Otherwise, copy default drive into C +copy1a: + ld a,(hl) ; Get drive of destination file + or a ; Is it default drive? + jr nz,copy1b ; Branch if drive made explicit + ld a,b ; Otherwise, get current drive +copy1b: + cp c ; Compare the two drives specified + jr nz,copy3 ; Branch if they are different + jr cperr ; Branch to error code if they are the same + +copy2: + pop de ; Clean up the stack + pop hl + +; Make note of the user numbers of the two files + +copy3: + ld a,(fcb1+13) ; Get destination user number + ld (usrdest),a + ld a,(fcb2+13) ; Get source user number + ld (usrsrc),a + +; Set up new FCB for source file and open the source + + call define ; Define buffer addresses dynamically + ld hl,(srcfcb) ; Get address to use for new source FCB + push hl + ex de,hl ; Copy file data to new FCB + ld b,12 + call blkmov + call logsrc ; Log in user number of source file + pop hl ; Initialize the source file FCB + call initfcb2 + ld c,15 ; Open file + call bdos + inc a ; Check for error + jp z,prfnf ; Branch if file not found + +; Make sure destination file does not already exist + + call logdest ; Log into destination s user area + call extest ; Test for existence of file + jp z,exit ; Branch if it exists + +; Create destination file + + ld de,fcb1 ; Point to destination FCB + ld c,22 ; BDOS make-file function + call bdos + inc a ; Test for error (no directory space) + jr nz,copy5 ; Branch if OK + +; Report file error + +cperr: + call print + db ' Copy','?'+80h + jp exit + +; Copy source to destination with buffering + +;++++++++++ this should be done by changing DMA address to save all the +; buffer swapping + +copy5: + call logsrc ; Log in source user area + ld b,0 ; Initialize counter + ld hl,(cbuff) ; Initialize buffer pointer + +copy5a: + push hl ; Save address and counter + push bc + ld hl,(srcfcb) ; Point to source file FCB + ex de,hl ; Put it in DE for BDOS call + ld c,20 ; BDOS read-sequential function + call bdos + pop bc ; Get counter and address + pop de + or a ; Read Ok? + jr nz,copy5b ; Branch if end of file + + push bc ; Save counter + ld hl,tbuff ; Copy from 80h to buffer + ld b,128 ; 128 bytes + call blkmov + ex de,hl ; HL points to next buffer address + pop bc ; Get counter back + inc b ; Increment it + ld a,b ; See if buffer full + cp cpblocks + jr nz,copy5a ; If not, go back for more + +copy5b: + ld a,b ; Get count of blocks loaded into buffer + or a ; Are there any? + jr z,copy6 ; Branch if not (we are done) + + push bc ; Save count + call logdest ; Log into destination user number +cbuff equ $+1 ; Pointer for in-the-code modification + ld hl,0 ; Point to beginning of copy buffer +copy5c: + ld de,tbuff ; Copy into tbuff + ld b,128 ; 128 bytes + call blkmov + push hl ; Save pointer to next block + ld de,fcb1 ; Point to destination file FCB + ld c,21 ; Write the block + call bdos + or a + jr nz,cperr ; Branch on error (disk full of write error) + pop hl ; Get back pointer to next block + pop bc ; Get count +; djnz copy5 ; Work through the blocks + dec b ; + jr z,copy5 ; + push bc ; Save count + jr copy5c ; Back for another bufferful + +; Close the destination file + +copy6: + call logdest ; Log into destination user number + ld de,fcb1 ; Point to destination FCB + ld c,16 ; Close file + call bdos + call print + db ' Don','e'+80h + + if cpsp and spaceon + jp spaexit ; Report space remaining on destination drive + else + jp exit + endif ;cpsp and spaceon + +; Log into user number of source file + +logsrc: +usrsrc equ $+1 ; Pointer for in-the-code modification + ld a,0 ; Get user number + jr setusrrel ; Local jump to save code + +; Log into user number of destination file + +logdest: +usrdest equ $+1 ; Pointer for in-the-code modification + ld a,0 ; Get user number +setusrrel: + jp setusr + +; End RCP-CP.Z80 + + endif ;cpon + + if peekon or pokeon or porton +; include rcpiom ; 'PEEK', 'POKE', 'PORT' commands + page + +; RCP-IOM.Z80 + +; Command: PEEK +; Function: Display memory contents +; +; Form: +; PEEK startadr 256 bytes displayed +; PEEK startadr endadr range of bytes displayed + + if peekon + +peek: + call retsave + + ld hl,tbuff+1 ; Find first number +nxtpeek equ $+1 ; Pointer for in-the-code modification + ld de,100h ; Default peek address if none + call sksp ; Skip to first token (if any) + call nz,hexnum ; Get start address if any + + push de ; Save starting address + ld bc,255 ; Compute default ending address + ex de,hl + add hl,bc + + if peekchk ; Check for overflow + jr nc,peek0 ; If no overflow past FFFF, go on + ld hl,0ffffh ; Else use FFFF as ending address +peek0: + endif ;peekchk + + ex de,hl ; End address in DE + call sksp ; Skip to next token (if any) + call nz,hexnum ; Get 2nd number in DE (else default) + +peek1: + pop hl ; HL is start address, DE is end address + + if peekhdr + + push hl ; Save starting address again + ld b,8 ; Output leading spaces +peek0a: + call print + db ' '+80h + djnz peek0a + + ld b,16 ; Display 16 column headers +peek0b: + ld a,l + and 03h + call z,spac + + call spac + call spac + ld a,l ; Get low byte of address + and 0fh ; Display low hex digit + call pah + inc hl + djnz peek0b + + if peekbdr + call crlf + ld b,8 +peek0c: + call print + db ' '+80h + djnz peek0c + ld b,16 +peek0d: + ld a,l + and 3 + call z,spac + inc l + call print + db ' -', '-'+80h + djnz peek0d + endif ;peekbdr + + pop hl ; Restore starting address + + endif ;peekhdr + + ld c,0ffh ; Use C as continue flag + call peek2 ; Do peek + ld (nxtpeek),hl ; Set continued peek address + jp exit + +peek2: + ld a,c ; Check continuation flag + or a ; + ret z ; + +; Print line header + +peek2a: + call crlf ; New line + ld a,h ; Print address + call pashc + ld a,l + call pahc + call dash ; Print leader + ld b,16 ; 16 bytes to display + push hl ; Save start address + + ; Print hex values for 16 bytes + +peek3: + ld a,l + and 03h + call z,spac + + ld a,(hl) ; Get next byte + call pashc ; Print with leading space + + ; Check for last address + ; If c is already 0, leave it that way. + ; Otherwise check for end address and if so + ; Set c to zero. + + ld a,c ; See if continue flag already cleared + or a + jr z,peek3a ; If so, skip test + ld a,h + sub a,d ; See if h = d + ld c,a + ld a,l + sub a,e ; See if l = e + or c ; Combine two tests + ld c,a + +peek3a: inc hl ; Pt to next + djnz peek3 + + ; Print ascii equivalents for 16 bytes + + pop hl ; Pt to first address again + ld b,16 ; 16 bytes + call print ; Space and fence + db ' ' + db fence+80h + push bc ; Save flag in c +peek4: + ld a,(hl) ; Get next byte + ld c,'.' ; Assume dot + and 7fh ; Mask it + cp ' ' ; Dot if less than space + jr c,peek5 + cp 7fh ; Don't print del + jr z,peek5 + ld c,a ; Char in c +peek5: + ld a,c ; Get char + call conout ; Send it + inc hl ; Pt to next + djnz peek4 + + call print ; Closing fence + db fence+80h + pop bc ; Get flag in c back + call break ; Allow abort + jr peek2 + + endif ; Peekon +; +; PRINT A AS 2 HEX CHARS +; PASHC - LEADING SPACE +; + if peekon or [pokeon and not pokeq] or porton +pashc: + push af ; Save a + call spac + pop af +pahc: + push af + rrca ; Exchange nybbles + rrca + rrca + rrca + call pah ; Print hex char + pop af +pah: + and 0fh ; Mask + add a,'0' ; Convert to ascii + cp '9'+1 ; Letter? + jr c,pah1 + add a,7 ; Adjust to letter +pah1: + jp conout +; + endif ; Peekon or [pokeon and not pokeq] or porton +; +;Section 5I +;Command: POKE +;Function: Place Values into Memory +; +;Form: +; POKE startadr val1 val2 ... +; + if pokeon +poke: + call retsave + ld hl,tbuff+1 ; Pt to first char + call sksp ; Skip to non-blank + jr z,noargs ; Arg error + call hexnum ; Convert to number + + if not pokeq + call print + db ' Pok','e'+80h + call adrat ; Print at message + endif + +; LOOP FOR STORING HEX VALUES SEQUENTIALLY VIA POKE + +poke1: + push de ; Save address + call sksp ; Skip to non-blank + jp z,exit ; Done + cp '"' ; Quoted text? + jr z,poke2 + call hexnum ; Get number + ld a,e ; Get low + pop de ; Get address + ld (de),a ; Store number + inc de ; Pt to next + jr poke1 +; +; STORE ASCII CHARS +; +poke2: + pop de ; Get next address + inc hl ; Pt to next char +poke3: + ld a,(hl) ; Get next char + or a ; Done? + jp z,exit + ld (de),a ; Put char + inc hl ; Pt to next + inc de + jr poke3 + + endif ; Pokeon +; +; No Argument Error +; + + if pokeon or porton + +noargs: + call print + db ' Arg','?'+80h + jp exit +; + endif ; Pokeon or porton + +; +;Section 5I+ +;Command: PORT +;Function: Display or Set I/O Port Data +; +;Form: +; PORT addr - read port and display value +; PORT addr value - output value to port +; + if porton +port: + call retsave + ld hl,tbuff+1 ; Find first number + call sksp ; Skip to first command-line token + jr z,noargs ; Abort if no port address given + call hexnum ; Get start address into de + push hl ; Save pointer to command tail + ld hl,portaddr ; Modify code + ld (hl),e ; Move specified port addr into place + dec hl ; Point to opcode position + ld (hl),0dbh ; Poke 'in' opcode + ex (sp),hl ; Get tail pointer back while saving this one + call print ; Print header + db ' Por','t'+80h + ld a,e + call pashc ; Print port address + call sksp ; Skip to possible second value + jr z,portin ; Proceed with port input + + call hexnum ; Get 2nd number in de + ex (sp),hl ; Get pointer to opcode back + ld (hl),0d3h ; Poke 'out' opcode + call print + db ': OU','T'+80h + ld a,e ; Get value to output + jr paddr + +portin: call print + db ': I','N'+80h + xor a ; Make sure high port address = 0 (for HD64180) +paddr: ld b,0 ; ..for both IN and OUT instructions +opcode: + db 0 ; Opcode for IN or OUT inserted by code above +portaddr: + db 0 ; Port address inserted by code above + call pashc + pop hl ; Clean up stack + jp exit + + endif ; Porton + +; End RCP-IOM.Z80 + + endif ;peekon or pokeon or porton + + if regon +; include rcpreg ; 'REG' register operation commands + page + +; RCP-REG.Z80 + +; +;Section 5J +;Command: REG +;Function: Manipulate Memory Registers +; +;Forms: +; REG D or REG <-- Display 10 Register Values +; REG Mreg <-- Decrement Register Value +; REG Preg <-- Increment Register Value +; REG Sreg value <-- Set Register Value +; +; Vers 2.1 Joe Wright +; +; REG reg <-- Display a single register value +; +; REG numbers now range from 0 to 31, although only the first ten are +; displayed with REG D. +; +; REG now treats the program error byte as register E. +; +register: + ld de,fcb1+2 ; Pt to first arg + ld a,(de) ; Get possible digit + call regptr ; Pt HL to potential register + dec de ; Point to command + ld a,(de) + cp 'S' ; Set? + jr z,rset + cp 'P' ; Plus? + jr z,rinc + cp 'M' ; Minus? + jr z,rdec + cp ' ' + jr z,rshow + cp 'D' + jr z,rshow + call regptr + jp regout + +; INCREMENT REGISTER VALUE +; HL PTS TO MEMORY REGISTER ON INPUT + +rinc: + inc (hl) ; Increment it + jr regout ; Print result + +; DECREMENT REGISTER VALUE +; HL PTS TO MEMORY REGISTER ON INPUT + +rdec: + dec (hl) ; Decrement value + jr regout ; Print result + +; Show first ten registers and Program Error byte +; +rshow: + call rshow10 + ld hl,z3msg+6 + jp regout + +rshow10: + xor a ; Select register 0 + ld b,a ; Counter set to 0 in B + call regp1 ; HL pts to register 0 +rshow1: + ld a,b ; Get counter value + cp 10 ; First ten registers + ret z ; Exit if done + push bc ; Save counter + push hl ; Save pointer + call regout ; Print register value + pop hl ; Get pointer + pop bc ; Get counter + inc b ; Increment counter + ld a,b ; Check for new line + and 3 + call z,crlf ; Newline after fourth display + inc hl ; Pt to next register + jr rshow1 + +; SET REGISTER VALUE +; HL PTS TO REGISTER ON INPUT + +rset: + ld de,fcb2+1 ; Pt to value + call de2bin ; Eval string at DE to binary in B + ld (hl),b ; Set value + +; Enter with HL pointing to the register. HL is maintained. +; +regout: + call print + db ' Reg',' '+80h + ld de,z3msg+30h ; Register 0 + sbc hl,de ; Register number in HL + ld a,l + cp 32 ; A numbered Register? + jr c,rego0 ; Yep + call print + db ' ','E'+80h + jr rego1 ; Report + +rego0: push hl + push de + ld b,0 ; Suppress zeros + call decdsp2 ; Report register number + pop de + pop hl + +rego1: add hl,de ; HL points to register again + call print + db ' =',' '+80h + ld l,(hl) + xor a + ld h,a + ld b,a ; Suppress leading zeros + jp decdsp3 ; Display value + +; Evaluate decimal string at DE to binary in B +; +de2bin: + ld b,0 ; Init value to zero +de2b: + ld a,(de) ; Get this digit + inc de ; Pt to next + sub '0' ; Convert to binary + ret c ; A space, finished + cp 10 ; Range? + ret nc ; Not decimal, finished + ld c,a ; Digit in c + ld a,b ; Multiply old by 10 + add a,a ; *2 + add a,a ; *4 + add a,b ; *5 + add a,a ; *10 + add a,c ; Add in new digit + ld b,a ; Result in b + jr de2b ; Again + +; SET HL TO POINT TO MEMORY REGISTER WHOSE INDEX IS PTED TO BY HL +; ON INPUT, A CONTAINS REGISTER CHAR +; ON OUTPUT, HL = ADDRESS OF MEMORY REGISTER (REG 0 ASSUMED IF ERROR) + +regptr: + ld hl,z3msg+6 ; The E register + cp 'E' + ret z + push de + call de2bin ; Get register number in B + pop de + ld a,b + cp 32 ; Range 0-31 + ld a,0 + jr nc,regp1 ; Out of range, use 0 + ld a,b ; Value in A +regp1: + ld hl,z3msg+30h ; Pt to memory registers + add a,l ; Pt to proper register + ld l,a + ret ; No chance of crossing page boundary +; +; End RCP-REG.Z80 + + endif ;regon + + if whlon or whlqon +; include rcpwhl ; 'WHL' and 'WHLQ' commands + page +; +;Section 5K +;Command: WHL/WHLQ +;Function: Set the Wheel Byte on or off +; +;If WHLQUIET equate is true, then RCP does not report wheel status with WHL +;command. +; +;Form: +; WHL -- turn Wheel Byte OFF +; WHL password -- turn Wheel Byte ON if password is correct +; WHLQ -- find out status of Wheel Byte +; +; Vers 2.1 Changes the function a little as follows: +; +; WHL -- Report Wheel Status (no WHLQ) +; WHL password -- Set Wheel ON if password is correct +; -- Set Wheel OFF if password incorrect +whl: + ld hl,fcb1+1 ; Pt to first char + ld a,(hl) ; Get it + + if not whlqon + cp ' ' + jr z,whlmsg ; Report wheel status if no password + endif + + ld de,whlpass + ld b,8 ; Check 8 chars + call comp ; Compare + jr nz,whloff ; Set wheel OFF if incorrect password + +; TURN ON WHEEL BYTE + + ld a,0ffh ; Turn on wheel byte + jr whlset + +; TURN OFF WHEEL BYTE + +whloff: + xor a ; Turn off wheel byte +whlset: + ld hl,(z3whl) ; Indirect from z3env + ld (hl),a +whlq: + if whlquiet + ret + endif + +; PRINT WHEEL BYTE MESSAGE + + if not whlquiet + +whlmsg: + call print + dc ' Wheel ' + call whlchk ; Check wheel byte + jr z,offm + call print + dc 'On' + ret +offm: + call print + dc 'Off' + ret + + endif ;[not whlquiet] or whlqon + + +; WHEEL PASSWORD DEFINED FROM SYSRCP.LIB FILE + + db 'Z'-'@' ; Leading ^z to block attempt to type rcp file +whlpass: + wpass ; Use macro +; +; End RCP-WHL.Z80 + + endif ;whlon + + if echoon +; include rcpecho ; 'ECHO' command + page + +; RCP-ECHO.Z80 + +;============================================================================= +; +; E C H O T E X T T O S C R E E N A N D P R I N T E R +; +;============================================================================= + +; Command: ECHO +; Function: Echo text to console or printer + +echo: + xor a ; Lower case flag setting + + if upcase ; If upper case default + dec a + endif ;upcase + + ld (casefl),a ; Store flag in code below + + ld hl,tbuff+1 ; Point to first character + call getchar ; Get first character (should be blank) + ; If none, exit from routine + + if echolst + call getchar ; Get first char after leading blank + ld b,a ; Save first char as list output flag + cp '$' ; Print flag? + jr z,echo2 ; If so, go on + dec hl ; Else backup one character + endif ; Echolst + +; LOOP TO ECHO CHARS + +echo2: call getchar + + if echolst + cp ff ; Form feed? + jr z,echo3 + endif ;echolst + + cp '^' + jr nz,echo2a ; Not control character prefix + call getchar ; Get next character + and 1fh ; Convert to control character + jr echo2d ; Echo it + +echo2a: cp cmdchar ; Case shift prefix? + jr nz,echo2d ; No, normal echo + call getchar ; Get next character + cp ucasechar ; Up-shift character? + jr z,echo2c ; Store non-zero value in case flag + +echo2b: cp lcasechar ; Lower-case character? + jr nz,echo2d ; No, echo the character as is + xor a ; Else, clear case flag +echo2c: ld (casefl),a + jr echo2 ; On to next character + +echo2d: + call echout ; Send char + jr echo2 + +; FORM FEED - SEND NEW LINE FOLLOWED BY FORM FEED IF PRINTER OUTPUT + + if echolst +echo3: + ld a,b ; Check for printer output + cp '$' + jr nz,echoff ; Send form feed normally if not printer + call echonl ; Send new line + ld a,ff ; Send form feed + jr echout + +; SEND FORM FEED CHAR TO CONSOLE + +echoff: + ld a,ff ; Get char + jr echo2d + endif ;echolst + +; END OF PRINT LOOP - CHECK FOR PRINTER TERMINATION + +echo4: + if not echolst + + ret + + else + + ld a,b ; Get list mode flag + cp '$' + ret nz ; Done if no printer output + +; OUTPUT A NEW LINE + +echonl: + ld a,cr ; Output new line on printer + call echout + ld a,lf ; Fall thru to echout + + endif ;not echolst + +; OUTPUT CHAR TO PRINTER OR CONSOLE + +echout: + ld c,a ; Char in c + + cp 'A' ; If less than 'a' + jr c,echouta ; Leave as is + cp 'Z'+1 ; If greater than 'z' + jr nc,echouta ; Leave as is + add 20h ; Else convert to lower case +echouta: + ld d,a ; Save lower case version in d +casefl equ $+1 ; Pointer for in-the-code modification + ld a,0 + or a + jr nz,echoutb ; If upper case selected, go on as is + ld c,d ; Else substitute lower case version +echoutb: + + push hl ; Save hl + push bc ; Save bc + ld de,0ch-3 ; Offset for console output + + if echolst + ld a,b ; Check for printer output + cp '$' + jr nz,echout1 + inc de ; Add 3 for printer offset + inc de + inc de + endif ;echolst + +; OUTPUT CHAR IN C WITH BIOS OFFSET IN DE + +echout1: + call biout ; Bios output + pop bc ; Restore bc,hl + pop hl + ret + +; Get a character from the command tail buffer + +getchar: + ld a,(hl) ; Get character + inc hl ; Point to next one + or a ; Check for end of string + ret nz ; If not end, return + pop hl ; Else, clean up stack + jr echo4 ; And exit from routine + +; OUTPUT CHAR IN C TO BIOS WITH OFFSET IN DE + +biout: + ld hl,(wboot+1) ; Get address of warm boot + add hl,de ; Pt to routine + jp (hl) ; Jump to it + +; End RCP-ECHO.Z80 + + endif ;echoon + +; include rcpsubs ; File of subroutines + page + +; RCPSUBS.Z80 Subroutines for Z33RCP.Z80 + + +;----------------------------------------------------------------------------- + +; Display decimal digit routines + +;-------------------- + +; Display hundreds, tens, and units digits (assumes flag in B has been set) + + if regon or spaceon + +decdsp3: + ld de,100 ; Display hundreds + call decdsp +decdsp2: + ld de,10 ; Display tens + call decdsp + ld a,l ; Get remaining units value + add '0' ; Convert to character + jr conout ; Print it and return + +;-------------------- + +; Routine to print any single digit + +; Actually, this routine displays the value of HL divided by DE and leaves the +; remainder in HL. In computing the character to display, it assumes that the +; result of the division will be a decimal digit. If the result is zero, the +; value in the B register, which is the number of digits already printed, is +; checked. If it is zero, a space is printed instead of a leading '0'. If it +; is not zero, the '0' is printed. Whenever any digit (not a space) is +; printed, the value in B is incremented. + +decdsp: + ld c,'0'-1 ; Initialize digit count + xor a ; Clear carry flag + +decdsp1: + inc c ; Pre-increment the digit + sbc hl,de ; Subtract DE from HL + jr nc,decdsp1 + + add hl,de ; Add back in to produce remainder + ld a,c ; Get decimal digit + cp '0' ; Check for leading 0 + jr nz,decdout ; If not 0, proceed to display it + ld a,b ; Digit printed already? + or a + ld a,' ' ; Possible space for calling routine to print +; ret z ; If no digit printed, return zero flag set + jr z,conout ; Print leading space +decdout: + inc b ; Indicate digit printed + ld a,c ; Else print real digit + ; Fall through to CONOUT + + endif ;regon or spaceon + +;----------------------------------------------------------------------------- + +; Console Output Routine + +conout: + putreg ; Save all register except AF + push af ; Save AF, too + and 7fh ; Mask out MSB + ld e,a ; Transfer character to E + ld c,2 ; BDOS conout function number + call bdos + pop af + getreg ; Restore registers +note: ; Use this RET for NOTE command + ret + + if peekon or [pokeon and not pokeq] or porton +spac: ld a,' ' + jr conout + endif ; peekon or [pokeon and not pokeq] or porton + + +;----------------------------------------------------------------------------- + +; String printing routines + +;-------------------- + +; Print string following call (terminated with null or character with the +; high bit set) + +print: + ex (sp),hl ; Get address + call printhl + ex (sp),hl ; Put address + ret + +;-------------------- + +; Print string pointed to by HL (terminated with null or character with the +; high bit set) + +printhl: + ld a,(hl) ; Get next character + inc hl ; Point to following one + or a ; See if null terminator + ret z ; If so, we are done + call conout ; Display the character + ret m ; We are done if MSB is set (negative number) + jr printhl ; Back for more + +;----------------------------------------------------------------------------- + +; OUTPUT NEW LINE TO CON: + +crlf: + call print + db cr,lf+80h + ret + +; CONSOLE INPUT + + if eraon or lton or proton or renon or cpon + +conin: + push hl ; Save regs + push de + push bc + ld c,1 ; Input + call bdos + pop bc ; Get regs + pop de + pop hl + and 7fh ; Mask msb + cp 61h + ret c + and 5fh ; To upper case + ret + + endif ; Eraon or lton or proton or renon or cpon +; +; SAVE RETURN ADDRESS +; +retsave: + pop de ; Get return address + pop hl ; Get return address to zcpr3 + ld (z3ret),hl ; Save it + push hl ; Put return address to zcpr3 back + push de ; Put return address back + ret + +; + if spaceon and [dirsp or cpsp or erasp] +spaexit: + call crspace ; Show space remaining + endif ; Spaceon and [dirsp or cpsp or erasp] +; +; EXIT TO ZCPR3 +; +exit: +z3ret equ $+1 ; Pointer to in-the-code modification + jp 0 ; Return address + +; +; PRINT A DASH +; + if lton or peekon +dash: + call print + db ' -',' '+80h + ret +; + endif ; Lton or peekon +; +; PRINT ADDRESS MESSAGE +; PRINT ADDRESS IN DE +; + if peekon or pokeon + if not pokeq +adrat: + call print + db ' at',' '+80h + ld a,d ; Print high + call pahc + ld a,e ; Print low + jp pahc + + endif ; Not pokeq + endif ; Peekon or pokeon + + if peekon or pokeon or porton +; +; EXTRACT HEXADECIMAL NUMBER FROM LINE PTED TO BY HL +; RETURN WITH VALUE IN DE AND HL PTING TO OFFENDING CHAR +; +hexnum: + ld de,0 ; De=accumulated value +hnum1: + ld a,(hl) ; Get char + cp ' '+1 ; Done? + ret c ; Return if space or less + inc hl ; Pt to next + sub '0' ; Convert to binary + jr c,numerr ; Return and done if error + cp 10 ; 0-9? + jr c,hnum2 + sub 7 ; A-f? + cp 10h ; Error? + jr nc,numerr +hnum2: + push hl ; Save pointer + ex de,hl + add hl,hl + add hl,hl + add hl,hl + add hl,hl ; DE x16 to HL + ld e,a + ld d,0 + add hl,de + ex de,hl ; DE = DE * 16 + A + pop hl ; Get the pointer + jr hnum1 ; Try again +; +; NUMBER ERROR +; +numerr: + call print + db ' Num','?'+80h + jp exit +; +; SKIP TO NEXT NON-BLANK +; +sksp: + ld a,(hl) ; Get char + inc hl ; Pt to next + cp ' ' ; Skip spaces + jr z,sksp + dec hl ; Pt to good char + or a ; Set eol flag + ret +; + endif ; Peekon or pokeon or porton + +;----------------------------------------------------------------------------- + +; Test File in FCB for unambiguity and existence, ask user to delete if so +; Return with Z flag set if R/O or no permission to delete +; + if renon or cpon +extest: + call ambchk ; Ambiguous file names not allowed + call searf ; Look for specified file + jr z,exok ; Ok if not found + call getsbit ; Position into dir + inc de ; Pt to file name + ex de,hl ; Hl pts to file name + push hl ; Save ptr to file name + call prfn ; Print file name + pop hl + call rotest ; Check for r/o + jr nz,exer + call eraq ; Erase? + jr nz,exer ; Restart as error if no + ld de,fcb1 ; Pt to fcb1 + ld c,19 ; Delete file + call bdos +exok: + xor a + dec a ; Nz = ok + ret +exer: + xor a ; Error flag - file is r/o or no permission + ret + +; +; CHECK FOR AMBIGUOUS FILE NAME IN FCB1 +; RETURN Z IF SO +; +ambchk: + ld hl,fcb1+1 ; Pt to fcb +; +; CHECK FOR AMBIGUOUS FILE NAME PTED TO BY HL +; +ambchk1: + push hl + ld b,11 ; 11 bytes +amb1: + ld a,(hl) ; Get char + and 7fh ; Mask + cp '?' + jr z,amb2 + inc hl ; Pt to next + djnz amb1 + dec b ; Set nz flag + pop de + ret +amb2: + pop hl ; Pt to file name + call prfn + call print + db ' is AF','N'+80h + jp exit +; + endif ; Renon or cpon +; +; TEST FILE PTED TO BY HL FOR R/O +; NZ IF R/O +; + if renon or cpon or eraon +; +rotest: + push hl ; Advance to r/o byte + ld bc,8 ; Pt to 9th byte + add hl,bc + ld a,(hl) ; Get it + and 80h ; Mask bit + push af + ld hl,romsg + call nz,printhl ; Print if nz + pop af ; Get flag + pop hl ; Get ptr + ret +romsg: + db ' is R/','O'+80h +; +; CHECK USER TO SEE IF HE APPROVES ERASE OF FILE +; RETURN WITH Z IF YES +; +eraq: + call print + db ' - Eras','e'+80h + endif ; Renon or cpon or eraon + + if renon or cpon or eraon or proton +eraq1: + call print + db ' (Y/N/Q)?',' '+80h + call conin ; Get response + cp 'Q' ; Quit command? + jp z,exit + cp 'Y' ; Key on yes + ret +; + endif ; Renon or cpon or eraon or proton +; +; INIT FCB1, RETURN WITH DE PTING TO FCB1 +; + if eraon or lton or cpon +initfcb1: + ld hl,fcb1 ; Pt to fcb +initfcb2: + push hl ; Save ptr + ld bc,12 ; Pt to first byte + add hl,bc + ld b,24 ; Zero 24 bytes + xor a ; Zero fill + call fillp ; Fill memory + pop de ; Pt to fcb + ret +; + endif ; Eraon or lton or cpon +; + if eraon or lton or cpon or diron + +fillp: + ld (hl),a ; Store byte + inc hl ; Pt to next + djnz fillp ; Count down + ret +; + endif ; Eraon or lton or cpon or diron + +; +; CHECK FOR USER INPUT; IF ^C, RETURN WITH Z +; + if diron or lton or eraon or proton or peekon + +break: + push hl ; Save regs + push de + push bc + ld c,11 ; Console status check + call bdos + or a + ld c,1 ; Get char if any + call nz,bdos + pop bc ; Restore regs + pop de + pop hl +break1: cp ctrlc ; Check for abort + jp z,exit ; Exit + cp ctrlx ; Skip? + ret + endif ; Diron or lton or eraon or proton or peekon + +; AFTER A SEARCH, RETURN NZ SET IF DESIRED TYPE OF FILE FOUND, Z IF NOT +; THIS ALGORITHM LOOKS AT THE SYSTEM BIT OF THE LOCATED FILE; THIS +; BIT IS SET TO 1 IF THE FILE IS A SYSTEM FILE AND 0 IF NOT A SYSTEM +; FILE. THE FOLLOWING EXCLUSIVE OR MASKS ARE APPLIED TO RETURN Z OR NZ +; AS REQUIRED BY THE CALLING PROGRAM: +; +; SYSTEM BYTE: X 0 0 0 0 0 0 0 (AFTER 80H MASK, X=1 IF SYS, 0 IF DIR) +; +; SYS-ONLY : 0 0 0 0 0 0 0 0 (XOR 0 = 0 if X=0, = 80H if X=1) +; DIR-ONLY : 1 0 0 0 0 0 0 0 (XOR 80H = 80h if X=0, = 0 if X=1) +; BOTH : 0 0 0 0 0 0 0 1 (XOR 1 = 81H or 1H, NZ in both cases) + + if diron or eraon or lton or proton or cpon or renon + +getsbit: + dec a ; Adjust to returned value + rrca ; Convert number to offset into tbuff + rrca + rrca + and 60h + ld de,tbuff ; Pt to buffer + add a,e ; Add entry offset to base addr + ld e,a ; Result in e + push de ; Save ptr in de + add 10 ; Add offset of 10 to pt to system byte + ld e,a ; Set address + ld a,(de) ; Get byte + pop de ; Get ptr in de + and 80h ; Look at only system bit +systst equ $+1 ; In-the-code variable + xor 0 ; If systst=0, sys only; if systst=80h, dir + ; Only; if systst=1, both sys and dir + ret ; Nz if ok, z if not ok +; +; +; COPY HL TO DE FOR B BYTES +; +blkmov: + ld a,(hl) ; Get + ld (de),a ; Put + inc hl ; Pt to next + inc de + djnz blkmov ; Loop + ret + +; +; PRINT FILE NOT FOUND MESSAGE +; +prfnf: + call print + db ' No File','s'+80h + jp exit + +; LOG INTO USER AREA CONTAINED IN FCB1 +; +logusr: + ld a,(fcb1+13) ; Get user number +setusr: + ld e,a + ld c,32 ; Use bdos fct + jp bdos + +; +; PRINT FILE NAME PTED TO BY HL +; +prfn: + call print ; Leading space + db ' '+80h + ld b,8 ; 8 chars + call prfn1 + call print + db '.'+80h ; Dot + ld b,3 ; 3 chars +prfn1: + ld a,(hl) ; Get char + inc hl ; Pt to next + call conout ; Print char + djnz prfn1 ; Count down + ret + +; +; SEARCH FOR FIRST +; +searf: + push bc ; Save counter + push hl ; Save hl + ld c,17 ; Search for first function +searf1: + ld de,fcb1 ; Pt to fcb + call bdos + inc a ; Set zero flag for error return + pop hl ; Get hl + pop bc ; Get counter + ret + + endif ; Diron or eraon or lton or proton or cpon or renon + +;----------------------------------------------------------------------------- + +; Define buffers as high as possible in TPA for the following groups +; of commands: +; COPY needs SRCFCB and CBUFF +; LIST/TYPE needs PAGCNT and DIRBUF +; ERA, PROT, and DIR commands. needs DIRBUF +; If DIRBUF is defined, its value is in HL on return from this code. The DE +; register pair is not changed by the code, but the BC pair is affected. + +dirbufon equ lton or diron or eraon or proton + + if dirbufon +dirbuf: ds 2 ; Address for directory buffer + endif ;dirbufon + + if cpon +srcfcb: ds 2 ; Address of source file FCB (CBUFF address + ; ..is in the code) + endif ;cpon + + if lton +pagcnt: ds 2 ; Address for page counter + endif ;lton + + + if cpon or lton or eraon or proton or diron + +define: + push de + ld hl,(bdos+1) ; Get bottom of BDOS + ex de,hl ; ..into DE + ld hl,(1) ; Get BIOS warmboot address into HL + ld bc,-[0e00h+800h+3] ; Offset to command processor address + add hl,bc + +; Now we have to compare and pick the lower address as the top of TPA + + push hl ; Save CPR address while comparing + xor a ; Clear the carry flag + sbc hl,de ; Compute (CPR-BDOS) + pop hl ; Restore CPR address + jr c,define1 ; Branch if BDOS address is higher (use CPR) + ex de,hl ; Otherwise use BDOS address +define1: + + if lton + dec hl ; Put PAGCNT in first free byte at top of TPA + ld (pagcnt),hl + endif ;lton + + if cpon + ld de,-36 ; Calculate place for SRCFCB for copy command + add hl,de + ld (srcfcb),hl + if dirbufon + push hl ; Save if needed below + endif ;dirbufon + ld de,-[cpblocks*128] ; CBUFF can use same space as DIRBUF + add hl,de + ld (cbuff),hl + if dirbufon + pop hl + endif ;dirbufon + endif ;cpon + + if dirbufon + ld de,-[maxdirs*11] ; Space for directory buffer + add hl,de + ld (dirbuf),hl + endif + + pop de + ret + + endif ;cpon or dirbufon + +;----------------------------------------------------------------------------- + +; +; SEARCH FOR NEXT +; + if diron or eraon or lton or proton + +searn: + push bc ; Save counter + push hl ; Save hl + ld c,18 ; Search for next function + jr searf1 + +; LOAD DIRECTORY AND SORT IT +; ON INPUT, A=SYSTST FLAG (0=SYS, 1=DIR, 80H=BOTH) +; DIRECTORY IS LOADED INTO BUFFER AT TOP OF TPA +; RETURN WITH ZERO SET IF NO MATCH AND HL PTS TO 1ST ENTRY IF MATCH + +direrr: + call print + db 'DIR Ovf','l'+80h + jp exit + +getdir: + ld (systst),a ; Set system test flag + call logusr ; Log into user area of fcb1 + +; LXI H,DIRBUF ; Pt to dir buffer + call define ; Define buffer addresses + ld (hl),0 ; Set empty + ld bc,0 ; Set counter + call searf ; Look for match + ret z ; Return if not found +; +; STEP 1: LOAD DIRECTORY +; +gd1: + push bc ; Save counter + call getsbit ; Check for system ok + pop bc + jr z,gd2 ; Not ok, so skip + push bc ; Save counter + inc de ; Pt to file name + ex de,hl ; Hl pts to file name, de pts to buffer + ld b,11 ; Copy 11 bytes + call blkmov ; Do copy + pop bc ; Get counter + inc bc ; Increment counter + ld hl,maxdirs-1 ; See if count equals or exceeds MAXDIRS + ld a,b ; Check high bytes + sub a,h + jr c,gd1a ; If carry set, we are OK + ld a,c ; Check low bytes + sub a,l + jr nc,direrr ; If no carry, jump to error message +gd1a: + ex de,hl ; Hl pts to next buffer location +gd2: + call searn ; Look for next + jr nz,gd1 + ld (hl),0 ; Store ending 0 +; LXI H,DIRBUF ; Pt to dir buffer + ld hl,(dirbuf) ; Pt to dir buffer + ld a,(hl) ; Check for empty + or a + ret z +; +; STEP 2: SORT DIRECTORY +; + if sorton + push hl ; Save ptr to dirbuf for return + call diralpha ; Sort + pop hl + endif + xor a ; Set nz flag for ok + dec a + ret + +; +; DIRALPHA -- ALPHABETIZES DIRECTORY IN DIRBUF; BC CONTAINS +; THE NUMBER OF FILES IN THE DIRECTORY +; +diralpha: +; +; SHELL SORT -- +; THIS SORT ROUTINE IS ADAPTED FROM "SOFTWARE TOOLS" +; BY KERNIGAN AND PLAUGHER, PAGE 106. COPYRIGHT, 1976, ADDISON-WESLEY. +; + ld h,b ; Hl=bc=file count + ld l,c + ld (n),hl ; Set "N" + ld (gap),hl ; Set initial gap to n for first division by 2 + +; FOR (GAP = N/2; GAP > 0; GAP = GAP/2) +srtl0: + or a ; Clear carry +gap equ $+1 ; Pointer for in-the-code modification + ld hl,0 ; Get previous gap + ld a,h ; Rotate right to divide by 2 + rra + ld h,a + ld a,l + rra + ld l,a + +; TEST FOR ZERO + or h + ret z ; Done with sort if gap = 0 + + ld (gap),hl ; Set value of gap + ld (ii),hl ; Set ii=gap for following loop + +; FOR (II = GAP + 1; II <= N; II = II + 1) +srtl1: +ii equ $+1 ; Pointer for in-the-code modification + ld hl,0 ; Add 1 to ii + inc hl + ld (ii),hl + +; TEST FOR II <= N + ex de,hl ; Ii is in de +n equ $+1 ; Pointer for in-the-code modification + ld hl,0 ; Number of items to sort + ld a,l ; Compare by subtraction + sub a,e + ld a,h + sbc a,d ; Carry set means ii > n + jr c,srtl0 ; Don't do for loop if ii > n + + ex de,hl ; Set jj = ii initially for first subtraction of gap + ld (jj),hl + +; FOR (JJ = II - GAP; JJ > 0; JJ = JJ - GAP) +srtl2: + ld hl,(gap) ; Get gap + ex de,hl ; In de +jj equ $+1 ; Pointer for in-the-code modification + ld hl,0 ; Get jj + ld a,l ; Compute jj - gap + sub a,e + ld l,a + ld a,h + sbc a,d + ld h,a + ld (jj),hl ; Jj = jj - gap + jr c,srtl1 ; If carry from subtractions, jj < 0 and abort + or l ; Jj=0? + + jr z,srtl1 ; If zero, jj=0 and abort + +; SET JG = JJ + GAP + ex de,hl ; Jj in de + ld hl,(gap) ; Get gap + add hl,de ; Jj + gap + ld (jg),hl ; Jg = jj + gap + +; IF (V(JJ) <= V(JG)) + call icompare ; J in de, jg in hl + +; ... THEN BREAK + jr c,srtl1 + +; ... ELSE EXCHANGE + ld hl,(jj) ; Swap jj, jg + ex de,hl +jg equ $+1 ; Pointer for in-the-code modification + ld hl,0 + call iswap ; Jj in de, jg in hl + +; END OF INNER-MOST FOR LOOP + jr srtl2 + +; +; SWAP (Exchange) the elements whose indexes are in HL and DE +; +iswap: + call ipos ; Compute position from index + ex de,hl + call ipos ; Compute 2nd element position from index + ld b,11 ; 11 bytes to flip + endif ; Diron or eraon or lton or proton + + if diron or eraon or lton or proton or renon +iswap1: + ld a,(de) ; Get bytes + ld c,(hl) + ld (hl),a ; Put bytes + ld a,c + ld (de),a + inc hl ; Pt to next + inc de + djnz iswap1 + ret + endif ; Diron or eraon or lton or proton or renon + + if diron or eraon or lton or proton +; +; ICOMPARE compares the entry pointed to by the pointer pointed to by HL +; with that pointed to by DE (1st level indirect addressing); on entry, +; HL and DE contain the numbers of the elements to compare (1, 2, ...); +; on exit, Carry Set means ((DE)) < ((HL)), Zero Set means ((HL)) = ((DE)), +; and Non-Zero and No-Carry means ((DE)) > ((HL)) +; +icompare: + call ipos ; Get position of first element + ex de,hl + call ipos ; Get position of 2nd element + ex de,hl +; +; COMPARE DIR ENTRY PTED TO BY HL WITH THAT PTED TO BY DE; +; NO NET EFFECT ON HL, DE; RET W/CARRY SET MEANS DE/>> to indicate state) + ^W - recall command lines from history stack + ^E - recall history in reverse direction + + +Installation: + + The installation program, CLEDINST, allows you to set up the editor +to your preference. The RCP can be installed directly in memory or in a disk +file -- RCPxxx.ZRL or a system configuration saved with SNAP or NZBLITZ. +CLEDINST also serves as a "help" utility by displaying the current command +bindings. Type "CLEDINST //" for help with CLEDINST.COM. + + +History Tool: + + CLEDSAVE writes the contents of the history stack to a text file on disk. +The file can be reloaded later (CLEDSAVE L), or composed in advance +with a text editor, then loaded. If the file is too large for the history +stack, as many commmand lines as fit are loaded. + + CLEDSAVE is useful as in a startup alias to load frequently used command +lines from an easily altered file. For example: + +Alias: START + +A15: +CLEDSYS <- load SNAP image of ENV,TCAP,RCP,FCP,NDR,QUIET,&PATH +CLEDSAVE CLED.VAR L <- load precomposed command lines into CLED +CLED <- turn the shell on +... <- rest of startup line runs before CLED gets control + +For help with CLEDSAVE.COM, type "CLEDSAVE //". + + You may also use SNAP or NZBLITZ to save the system segment image with +command lines already loaded (turn SAVE OFF first.) + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpcled.lib b/Source/BPBIOS/Z34RCP11/rcpcled.lib new file mode 100644 index 00000000..6c2879a7 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpcled.lib @@ -0,0 +1,1327 @@ + page + +; Library: RCPCLED for Z34RCP +; Author: Carson Wilson (modifications only) +; Version: 1.3b +; Date: October 8, 1989 +; Changes: Civilian time now prints "12" instead of "0" for midnight hour. +; Put Z3PLUS time display capability back in. +; Z3PLUS time display disabled if date = 01/01/78 (no clock). +; Added Rob Friefeld's fix to SAVE_LINE. +; +; Author: rdf +; Version: 1.3a +; Date: October 2, 1989 +; Changes: Changed order of installable highlight codes and history buffer +; addresses to simplify installing a ZRL file. Changed version +; number to guarantee compatibility with accessory programs. +; Option to print user number zero at prompt. +; Time string separator installable. + +; Author: Carson Wilson (modifications only) +; Version: 1.2 B +; Date: September 29, 1989 +; Changes: Made ">>" the prompt when previous commands are NOT being +; overwritten. +; Changed line edit commands to be closer to CP/M Plus. +; Shortened the clock read code (ZSDOS allows straight +; DateStamper calls). +; Uses DEFINE from RCPSUBS.LIB to save space. +; Does not print prompt user number if at user zero. +; Optional installable highlight codes for time in prompt. +; Time prompt shortened to "hh.mm" for easier reading. + +; Author: Rob Friefeld +; Version: 1.2 a +; Date: September 20, 1989 + +; Syntax: CLED [/] if "/", then run for one command line only +; e.g. from a shell like ZFILER + +; +; ===== D E F I N I T I O N S S E C T I O N ===================== +; + +clver equ 13 ; Version number (Install program compat.) +clrev equ 'b' ; Revision (Does not affect config.) + +del equ 7fh ; not in sysdef.lib + +; +;===== C O N F I G U R A T I O N A R E A ======================== +; + +; The installation program and buffer loader depend on the configuration +; of this data structure. It should not be changed. + +shname: db 'CLED',0 ; Name put on shell stack +versid: db clver ; CLED version +ddsep: db dudir_sep ; DU:DIR separator char +ins_flag: db clins ; Yes = insert mode +minsave: db clmin ; Discard line =< this +era_flag: db clera ; Erase stored line on exit +save_flag: db clsav ; Save command lines +tim_sep: db timesep ; Time string separator + +; --------------------------- + +; Command list for RCPCLED, Version 1.3 +; Set bit 7 to use a command with meta key + +cmd_list: + db 'Q' ; Meta key 1 + db 'H' ; Backspace + db 'S' ; Cursor left + db 'D' ; Cursor right + db 'A' ; Word left + db 'F' ; Word right + db 'B' ; Line end/ start + dc 'S' ; Line start + dc 'D' ; Line end + db 'G' ; Delete char + db DEL ; Delete left + db 'T' ; Delete word + db 'L' ; Delete word left + db 'X' ; Delete to SOL + db 'Y' ; Delete line + db 'K' ; Delete to EOL + db 'V' ; Toggle insert + db 'P' ; Enter control + db 'W' ; Recall line + db 'E' ; Recall reverse + db 'M' ; Execute line + db '[' ; ESC menu + +cmdlen equ $ - cmd_list + +; --------------------------- +; Highlight on/off codes for time display (installable) +; +stndout: db 0,0,0,0 ; Must terminate with hibit or binary 0 +stndend: db 0,0,0,0 ; Ditto + +; --------------------------- +; 4 bytes are used here for the information of the history save/load tool, +; CLEDSAVE + +histaddr: dw history ; Pointer to history buffer +histsz: dw histsize ; Buffer size + +; +;===== M A I N C O D E S E C T I O N ======================== +; +cled: + call define ; Set pointer to free mem + ld de,-lbufwid-1 + add hl,de + ld (line),hl ; Set line buffer location + xor a + ld (hl),a ; Zero line + ld hl,history ; History stack + ld (recall_ptr),hl ; Init position pointer to start + + ld a,(fcb+1) ; Check command line option + cp '/' + jr z,cledit ; Go right to editing + + ld a,(z3msg+3) ; QSHELL + dec a ; <> 1 on manual invocation + jr z,cledit ; Skip installation + +; +;===== S H E L L I N S T A L L A T I O N ========================= +; +sh_inst: + ld hl,shname + call shpush ; Z = OK + ret z + call print ; Complain about stack and cancel + dc cr,lf,'SH STK' ; Full or non-existent + ret + +; +;===== L I N E E D I T =========================================== +; + +; This is the main entry point for the shell +; 1 - Display prompt +; 2 - Get user input +; 3 - Reset shell bit +; 4 - Run command line + + +; Subtask 1 -- +cledit: + call prompt ; Display system prompt + +;---------------------------------------- +; Subtask 2 -- + +; The editor returns NZ if the shell pop command has been given. If not, it +; returns the character count of the command line in B. + + call EDIT + +;---------------------------------------- +; Subtask 3 -- + push af ; Save return code + xor a + ld (z3msg+3),a ; PUTCST + pop af + +;---------------------------------------- +; Subtask 4 -- + jp nz,shpop ; Quit shell + +; Here we load the MCL directly from the line buffer. On OVFL, loop to edit. + +loadcl: + ld a,(z3cl+2) ; MCL size + inc b ; B contains line count, include terminating 0 + cp b ; Compare to line size + jr nc,loadcl1 ; OK + +mclerr: + call print + dc cr,lf,'OVFL',cr,lf + jp cledit + +loadcl1: + ld de,z3cl+4 ; Set MCL pointer to start + ld (z3cl),de + + ld hl,(line) + ld c,b + ld b,0 + ldir ; Move line buff to MCL + ret ; Run it + + +; +;===== S U B R O U T I N E S ======================================= +; + +; Prompt -- PRINT a DU:DIR prompt. +; +prompt: + if systime + call print_time + endif + + ld bc,(cusr) ; GDEFDU + ld a,b ; Drive + add a,'A' ; Make it a letter + call conout ; Write it + ld a,c ; Get user + + if puser0 + call pusr ; Write it + else + or a + call nz,pusr ; Write it IF NONZERO + endif ;puser0 + + call dutdir ; Get the ndr + jr z,prompt1 + ld a,(ddsep) ; DU:DIR separator + call conout + ld b,8 ; Eight chars max +nameloop: + ld a,(hl) ; Get the first char + cp ' ' + call nz,conout ; Write it if not blank + inc hl + djnz nameloop + +prompt1: + call prompt2 + ld a,(save_flag) ; If save is OFF, prompt is >> + or a + ret nz +prompt2: + call print + dc '>' + ret + +; PUSR -- Convert user # in A to decimal and print +; +pusr: + ld hl,10 shl 8 + '0'-1 ; H=10, L='0'-1 + cp h ; User < 10 ? + jr c,pusr1 +pusr0: + inc l ; Advance character for user number tens digit + sub h + jr nc,pusr0 + add a,h + ld h,a ; Keep low digit of user number in H + ld a,l ; Display tens digit + call conout + ld a,h ; Ready to process units digit +pusr1: + jp decout ; Routine in RCPSUBS.LIB +; add '0' +;pusr2: +; jp conout + +; Console input without echo + +cin: + push hl + push de + push bc +cin1: ld c,dirconf ; DCIO + ld e,-1 + call bdos + or a + jr z,cin1 + pop bc + pop de + pop hl + ret + +; +;===== E D I T O R S E C T I O N ================================ +; + +; Date: October 2, 1989 + +; Entry is EDIT +; Return Z = Execute command line, NZ = Quit shell, B = char count of line + +; Initialize to on-line environment. +; While editing, HL -> current position in LINE, B = char count, +; C = cursor position (0 .. count), DE = scratch + +edit: + ld hl,(line) ; Init to start of line + xor a + ld b,a ; Line count = 0 + ld c,a ; Cursor pos = 0 + + push hl ; There may already be a line here + dec b ; Accumulate possible char count in B +edit1: + inc b + cp (hl) ; A = 0 + inc hl + jr nz,edit1 ; Loop until 0 terminator +edit2: + pop hl ; Point to line again + call zline ; Zero the remainder of LINE buffer + call ptail ; Print the line from cursor position + +;-------------------------------------------------------------------- + +; EDIT COMMAND LOOP + +; Get a char. If it is text, enter it. If it is a control, scan the +; CMD_LIST for a match. If found, compute offset into jump table and go. +; A "shifted" key (high bit set in table) is matched after the "meta-key" +; has been entered. + +ecmd: + exx ; Main regs must be preserved + ld hl,ecmd ; Save address so a return comes back here + push hl + +no_match: + call cin ; Next key... + cp 'C'-'@' ; Warm boot? + jp z,0000h + + ld hl,meta_flag ; Shift flag + or (hl) ; Mask in possible high bit + ld (hl),0 ; Reset flag + exx ; Recover main regs + + cp 20h ; Test key + jr c,control_key ; Not text + cp del ; This control char > text chars + jp c,enter ; Input text + +control_key: + call menuinp ; Convert control char to cap + + exx ; Must preserve main regs + ld hl,cmd_list ; Scan command list + ld bc,cmdlen + cpir + jr nz,no_match + ld hl,cmd_vector + ld a,cmdlen-1 ; Point to address in vector table + sub c + add a,a + ld c,a + add hl,bc + ld c,(hl) + inc hl + ld b,(hl) + ld (cjump),bc ; Address to jump to + exx ; Restore regs! + +cjump equ $+1 + jp 0 + + +; Convert a control key entry to cap char + +menuinp: + push af + and 80h ; Keep high bit + ld e,a + pop af + and 7fh + call ucase + or e ; Restore high bit + ret + +; Mark meta-key flag + +meta_key1: + ld a,10000000b + ld (meta_flag),a + ret + +meta_flag: db 0 ; Initial value 0 = no shift + + +; Jump table for commands + +cmd_vector: + dw meta_key1 ; Shift key + dw bsp ; Backspace + dw bsp ; Cursor left + dw fsp ; Cursor right + dw bwrd ; Left word + dw fwrd ; Right word + dw linend ; To EOL + dw linbeg ; To SOL + dw linend1 ; To EOL/SOL + dw delete ; Delete char + dw delft ; Delete char left + dw delwrd ; Delete word right + dw delwlft ; Delete word left + dw delsol ; Delete to start of line + dw dline ; Delete line + dw deleol ; Delete to end of line + dw instog ; Toggle insert + dw ctl_entry ; Enter control char + dw recall_back ; Scroll back in history + dw recall_fwrd ; Scroll ahead in history + dw eds$ex ; Execute line + dw esc_menu ; Submenu + +;-------------------------------------------------------------------- + +; ON-LINE ROUTINES, EDITING CURRENT LINE IN LINE BUFFER + +; WHILE ON LINE: +; B = CHAR COUNT (0..lbufwid) C = CURSOR POSITION (0..lbufwid) +; HL = MEM POSITION + + +; Backspace +; Return Z = backspace not done, NZ = all OK + +bsp: + xor a + cp c ; Cursor pos + ret z ; At start + dec hl ; Back up in mem + dec c ; Cursor pos back +bspace: + ld a,bs ; Back up on screen + or a ; Must ret nz + jp conout + + +; Forward space +; Return Z = not done + +fsp: + ld a,(hl) + or a + ret z ; At EOL + inc hl + inc c + jp pctl ; Screen advance by reprinting char + + +; Back word + +bwrd: + call bsp ; Backspace + ret z ; Nowhere to go + ld a,(hl) + cp ' ' + jr z,bwrd ; Backspace over blanks + dec hl ; Now backspace until next wordsep + call wrdsep ; Look at char before this position + inc hl + jr nz,bwrd + ret + +; Forward word + +fwrd: + call wrdsep ; Are we on a word separator? + jr z,fwrd1 ; Yes + call fsp ; No, advance until we find one + jr fwrd + +fwrd1: call fsp ; Word sep found, advance 1 more space + ld a,(hl) ; Are we on a blank? + cp ' ' + jr z,fwrd1 ; Don't quit on a blank + ret + + +; Delete char left + +delft: + call bsp ; Backspace and fall through to delete + + +; Delete char + +delete: + call delmem ; In memory + jp ptail ; Refresh screen from cursor position + +; Delete to start of line + +delsol: + ld a,c ; Get cursor pos + or a + ret z ; Already at start + cp b + jr z,dline ; At end, so delete entire line (quicker) + ld e,a ; Cursor pos = # chars to delete + call linbeg ; Go to start +delcmd1: + call delmem ; Delete first char in memory + dec e ; Loop counter + jr nz,delcmd1 + jp ptail ; Now update screen + + +; Delete word left + +delwlft: + call bwrd ; Back a word and fall thru ... + + +; Delete word right + +delwrd: + call wrdsep ; On a word sep? + jr z,delete ; Yes, kill it + ld a,b ; Compare line count to cursor pos + cp c + jr z,delete ; On last char of line +delwrd1: + call delmem ; Delete in mem, let screen catch up later + jr delwrd ; Go until word sep found + + +; Delete line + +dline: + call linbeg ; Position at line start and fall thru ... + +; Delete to eoln + +deleol: + call ereol ; Clear on screen + ld b,c ; Char count = current position + jp zline ; Zero line tail in mem + +; Insert/overwrite toggle + +instog: + ld a,(ins_flag) ; Flag 0 -> owrt + cpl + ld (ins_flag),a + ret + +; Enter a control + +ctl_entry: + call cin + and 1fh ; Fall thru to normal char entry + +; Enter a char + +enter: + ex af,af' ; Save char + ld a,b ; At eoln? + cp c + jr z,ovrwrt ; Yes, no need for insert mode + ld a,(ins_flag) ; Which mode are we in? + or a ; 0 = overwrite, nz = insert + jr nz,insert + + +; Enter char in overwrite mode + +ovrwrt: + ld a,b ; Char count + cp lbufwid-2 ; Line full? + jr c,ovr1 ; No + cp c ; At EOLN? + ret z ; Accept no more chars + +ovr1: ex af,af' ; Recover char + ld (hl),a ; Put char in place + call fsp ; Advance by printing it + ld a,b ; Char count -> a + cp c + ret nc ; No need to incr char count inside line + inc b ; Else add to count + ret + +; Enter char in insert mode + +insert: + ld a,b ; Line full? + cp lbufwid-2 + ret nc + +insrt: + ld a,b ; At eoln? + sub c ; A = # chars to eoln + jr z,ovr1 ; Yes, really want overwrite + call insmem ; Push chars down to make room + ex af,af' ; Recover new char + ld (hl),a ; Place char in line + call ptail ; Reprint entire line from here + inc b ; Inc char count + jp fsp ; Advance cursor + + +; Line end/start toggle + +linend: ; Go to eoln or, if there, to start of line + ld a,b + cp c + jr z,linbeg + +linend1: + call fsp ; Print ahead until EOL + jr nz,linend1 + ret + +linbeg: + call bsp ; Backspace until start + jr nz,linbeg + ret + + +; Compare current char to list of word separators + +wrdsep: + push hl + push bc + ld bc,wrdseplen + ld a,(hl) + ld hl,wrdseps + cpir + pop bc + pop hl + ret + +wrdseps: + db 0,' ,;:.' ; Punctuation word separators +wrdseplen equ $ - wrdseps + + +; Delete current char from line + +delmem: + ld (hl),0 ; Terminal 0 or char to be deleted + ld a,b + sub c ; A = (count-position) = chars from end + ret z ; At eoln, no char + dec b + ret z ; Single char line + dec a + ret z ; On last char, just deleted it +delmem1: + inc a ; To move terminal 0 in + push hl + push de + push bc + ld d,h ; Dest is current pos + ld e,l + inc hl ; Source, terminal 0 + ld c,a ; Count, line tail + ld b,0 + ldir ; Block move + pop bc + pop de + pop hl + ret + +; Insert a char in line + +insmem: + push bc ; Make room for char in line + push de + ld c,a ; Bc = # chars to move + ld b,0 + add hl,bc ; Dest is new eoln + ld d,h ; Now in DE + ld e,l + dec hl ; Source is current eoln + lddr ; Tail move + pop de + pop bc ; Recover char count, crs pos info + inc hl ; Hl to next char + ret + + +; Print line tail from cursor position, return to position + +ptail: + push hl ; Save mem pos + push bc ; Save screen pos + call linend1 ; Print ahead to end of line + call ereol ; Clean off danglers +ptail1: + ld a,c ; End of line cursor pos + pop bc + pop hl + sub c ; Current cursor pos + ret z ; At end of line already + ld e,a ; Loop counter +ptail2: + call bspace ; Else back up to where we were + dec e + jr nz,ptail2 + ret + + +; Print a char, turn a control char into a cap char + +pctl: + push af + cp 20h + jr nc,pctl1 + add '@' +pctl1: call conout + pop af + ret + + +; Convert char or control key to upper case + +ucase: + cp ' ' + jr nc,notctl + add '@' +notctl: cp 'a' + ret c ; Not a lowercase + cp 'z'+1 + ret nc ; Not a lowercase + sub ' ' ; Yes, a lowercase + ret + + +; Zero line tail + +zline: + push hl + push bc + ld hl,(line) ; HL -> start of line + ld c,b ; BC = char count + ld b,0 + add hl,bc ; HL -> EOLN + ld a,lbufwid + sub c + dec a + jr z,zline0 + ld b,a ; # of 0's + xor a +zline1: + ld (hl),a + inc hl + djnz zline1 +zline0: + pop bc + pop hl + ret + + +; ESC key pressed - get submenu command + +esc_menu: + call cin + call ucase + cp 'Q' ; Quit + jr z,edquit + cp 'S' ; Toggle Save + ret nz ; Loop if none of these + +; Toggle recording state +; - Alter line prompt to > if save ON, >> if save OFF + +save_tog: + ld a,(save_flag) ; Flip flag byte + cpl + ld (save_flag),a + call crlf + call prompt ; Print new prompt string + pop af ; Lift ecmd from stack + jp edit ; Restart + + +; Exit editor + +eds$ex: + pop af ; Lift ECMD from stack + ld a,(save_flag) ; Are we recording? + or a + ret z ; Nope + + ld a,(minsave) ; Is line worth keeping? + cp b + push bc + call c,save_line + pop bc + +edn$ex: + xor a ; Return Z + ret + + +; Exit and pop shell + +edquit: + pop af ; Lift ECMD from stack + xor a ; Return NZ + dec a + ret + + +; --------------------------- + +; HISTORY STACK ROUTINES for RCPCLED, Version 1.2 + +;Each command line is pushed onto the history stack before execution. As the +;older ones overflow, they are eliminated. The last character of each line +;has the high bit set. The buffer terminates with a 0. +;The history stack is internal to the RCP, but could be implemented in an RSX + +; Save new line to stack +; - This routine called only on exit, so on-line regs not preserved. +; - Push contents down by size of current line +; - Move line buffer to start of stack +; - Terminate line with high bit set +; - Terminate history with 0 after last complete line +; - If current line is too big for buffer size chosen, do nothing + +save_line: + ld c,b ; Line size from b to bc + xor a + ld b,a + push bc + ld hl,HISTSIZE + sbc hl,bc ; Buffer size - line length + jr z,savel_err ; Not enough room + jr c,savel_err ; Definitely not enough room! + push hl + ld hl,hbuf_top + push hl + sbc hl,bc ; hl -> bufftop - line size + pop de ; de -> bufftop + pop bc ; bc = buffsize - line size + lddr ; tail move + + pop bc ; Recover line size in bc + ex de,hl + inc de ; de -> buffstart + ld hl,(line) ; Move in line + ldir + dec de + ex de,hl + set 7,(hl) ; Tag line terminus + + ld hl,hbuf_top ; Terminate history after last complete line +savel1: + dec hl ; Back up to EOLN + bit 7,(hl) + jr z,savel1 ; Loop until hi-bit encountered + inc hl + ld (hl),0 + ret + +savel_err: + pop af ; Lift BC push + ret + +; Recall command history, newest -> oldest +; - recall_ptr is init to start of buffer on each CLED invocation +; - return with pointer updated to next line + +recall_back: + call check_recall ; Is there anything in buffer? + ret nc ; No + +; Transfer from recall pointer to line buffer +; - enter hl @ recall_ptr +; - return ptr -> start of next command if no OVFL + +rc_back1: + ld de,(line) ; Destination for move +rc_back1a: + ld a,(hl) + or a + jr z,recall_quit ; Buff end + ldi + bit 7,a + jr z,rc_back1a + + ld (recall_ptr),hl ; Update ptr now + ex de,hl ; Point to end of line in line buffer + ld (hl),0 ; Terminate it + dec hl + res 7,(hl) ; Fix high bit from storage + + pop af ; Lift ecmd from stack + jp edit ; Restart on this line + +recall_quit0: + pop af ; Lift subroutine call from stack +recall_quit: + exx ; Recover main regs + ret ; Back to editing + + +; Recall command history, oldest -> newest + +recall_fwrd: + call check_recall ; Anything in buffer? + ret nc ; No + call rc_fwrd1 ; Move to previous line + call rc_fwrd1 ; Don't repeat line on direction rev + jr rc_back1 ; Now same code as recall_back + +rc_fwrd1: + dec hl ; Initially, HL -> next line to recall + ld de,history ; Underflow address +rc_fwrd1a: + push hl ; Compute position relative to top + xor a + sbc hl,de + pop hl + ret z ; Quit when start of buff reached + jr c,recall_quit0 ; Underflow + dec hl ; Going backwards in buffer + bit 7,(hl) + jr z,rc_fwrd1a + inc hl ; Point to char past command terminator + ret + + +; Check to see if anything in recall buffer yet +; - Ret NC = no, main regs preserved +; - Else switch main regs to alt, ret HL @ recall buffer line + +check_recall: + ld a,(history) ; Is anything in buffer yet? + or a + ret z ; Nope + call linbeg + exx + ld hl,(recall_ptr) + scf + ret + +; --------------------------- + +; Routine: EREOL function for Z34RCP +; Author: Rob Friefeld +; Version: 1.0 +; Date: September 19, 1989 +; +; Entry: EREOL +; Function: To clear to end of line +; Comments: The setting of the ERLTCAP equate determines whether this +; command uses the TCAP information or not. If not, it uses the +; ereol string passed in macro CLR_EOL. That string should +; end with the high bit set. The setting of the ERLQUICK equate +; determines whether to simply output the TCAP string for this +; function or to interpret it as does Rick Conn's VLIB version. +; Uses RCPSUBS.LIB routines CONOUT and PRINTHL. + + +; ------------------------------------------------------------------- + + if [not erltcap] +; Erase to end of line. Return NZ. + +ereol: call print + clr_eol +; or -1 ; For VLIB compatibility + ret + + + else + if erlquick + +; --------------------------- + +; This version just prints the EREOL string: no delay, no interpretation. + +ereol: + push hl + ld hl,z3tcap+17h ; CLS string + xor a ; Skip to EREOL string +ereol1: cp (hl) ; Skip once + inc hl + jr nz,ereol1 +ereol2: cp (hl) ; Skip twice + inc hl + jr nz,ereol2 + call printhl ; Print it + pop hl + ret + +; --------------------------- + +; This is a disassembly of EREOL from VLIB + else + +ereol: + push bc + push de + push hl + ld hl,z3tcap+16h ; Point to ereol delay + ld d,(hl) + inc hl + call vidskp + call vidskp + call vidout + pop hl + pop de + pop bc + xor a + dec a + ret + +vidskp: + ld a,(hl) + inc hl + or a + ret z + cp '\' + jr nz,vidskp + inc hl + jr vidskp + +vidout: + ld a,(hl) + or a + jr z,vid2 + inc hl + cp '\' + jr nz,vid1 + ld a,(hl) +vid1: + call conout + jr vidout + +vid2: + ld a,d + or a + ret z + ld c,a + ld hl,z3env+2bh ; Processor speed + ld a,(hl) + or a + jr nz,vidl1 + ld a,4 +vidl1: + ld b,a + push bc + call vdelay + pop bc + dec c + jr nz,vidl2 + ret +vdelay: + call vdel1 + djnz vdelay + ret +vdel1: + ld c,20 +vdel1a: + ex (sp),hl + ex (sp),hl + dec c + jr nz,vdel1a + ret + + endif ;erlquick + endif ;not erltcap + +; +;===== Z 3 L I B R O U T I N E S ================================ +; + +; Disassembly of Z3LIB routines DUTDIR, SHPUSH, SHPOP +; For use with CLED RCP segment ONLY +; Does not save regs as does Z3LIB, and has less env error checking +; rdf 10/2/89 + +DUTDIR: + ld a,z3ndirs ; No NDR + or a + ret z + + ld hl,(z3ndir) + inc b +dutdir1: + ld a,(hl) + or a + jr nz,dutdir2 + dec b + xor a + ret +dutdir2: + cp b + inc hl + jr nz,dutdir3 + ld a,(hl) + cp c + jr nz,dutdir3 + inc hl + dec b + xor a + dec a + ret +dutdir3: + push bc + ld bc,11h + add hl,bc + pop bc + jr dutdir1 + + +shpop: + +; *** +;Special function for RCPCLED -- null saved command line + ld a,(era_flag) ; Erase? + or a + jr z,eflag1 ; Z = NO + xor a + ld (history),a +eflag1: +; *** + +;shpop: + call getsh ; HL -> stack, DE = size, B = entries + ret z ; No stack + ld c,e ; Entry size + ld a,(hl) + or a + ret z ; Empty + ex de,hl + add hl,de ; HL -> next entry, DE -> first entry + xor a +shpop1: + ld (de),a ; Zero entry + dec b + ret z ; Successful exit, no more entries + push bc ; Pop next entry + ld b,0 + ldir + pop bc + jr shpop1 + + +shpush: + push hl ; Save string pointer + call getsh + jr z,shpush_err1 ; No stack + +shpush3: + ld a,(hl) ; Look for free entry + or a + jr z,shpush4 + add hl,de + djnz shpush3 + jr shpush_err2 ; Stack full +shpush4: + call getsh ; Point to top of stack + push bc +shpush5: + dec b + jr z,shpush6 + add hl,de + jr shpush5 +shpush6: + pop bc + ld c,e + dec hl + ex de,hl + add hl,de ; HL -> (entry-1) + size, DE -> (entry-1) + ex de,hl +shpush7: + ld a,b + cp 1 + jr z,shpush8 + dec b + push bc + ld b,0 + lddr + pop bc + jr shpush7 +shpush8: + call getsh + pop de + ex de,hl +shpush9: + ld a,(hl) + ldi + or a + jr nz,shpush9 + +shpushx: + ret + +shpush_err1: +; ld a,1 ; No stack +; jr shpush_err + +shpush_err2: + ld a,2 ; Stack full +shpush_err: + pop hl + or a + ret + + +; Get shell stack entry +; Return HL -> top of stack +; DE = entry size +; C = unchanged +; B = # entries +; A = # entries +; Z = no entries +getsh: +getsh2: + ld hl,(z3env+1eh) ; Stack + ld a,(z3env+20h) ; # entries + ld b,a + ld de,(z3env+21h) ; Entry size in E + ld d,0 + or a + ret + +; +;===== C L O C K R E A D I N G ================================== +; + + if systime + +; Print system time from DateStamper, ZS/ZDDOS/Z3PLUS clock + +; Entry point +; Print the string with leading '0' suppression +; Format: "h.mm " or "hh.mm " + +print_time: + +; 1. Test for DateStamper/ZSDOS/Z3PLUS and read clock if present + + ld c,12 ; Return version + ld e,'D' ; DateStamper test + call bdos + ld a,l ; Version # + cp 30h ; Z3PLUS? + jr nc,time1 ; Yes + ld a,h + cp 'D' + ret nz ; No clock + +; 2. Get time + + ld hl,time2 + push hl ; Return address on stack + push de ; Clock address on stack + ld hl,dtbuf ; Point to buffer + ret ; Call clock, return to time2 +time1: ; Z3PLUS entry point + ld c,105 ; CP/M Plus get time + ld de,dtbuf+1 + push de + call bdos + pop hl + ld a,(hl) + inc hl + ld b,(hl) + dec a + or b + ret z ; No clock if date = 0001 +time2: + +; 3. Turn highlight on, if present + + ld hl,stndout + call printhl + + ld hl,dtbuf+3 ; Point to hours + +; 4. Convert military time to civilian, if selected + + if civtim + ld a,(hl) ; Hours + or a ; Midnight? + jr nz,time3 ; No + ld a,24h ; Yes, say "12" +time3: sub 13h ; Time past 12:59 pm? + jr c,time4 ; No, don't change + daa ; Decimal adjust + inc a ; Yes, xlate to 12-hour + daa + ld (hl),a ; ..and patch in. + endif ; civtim + +; 5. Display time + +time4: + xor a + call pmbcd ; Print hours as 1 or 2 digits + ld a,(tim_sep) ; Print separator between hours, minutes + call conout + inc hl ; Point to minutes + ld a,80h ; Say print leading 0 + call pmbcd ; Print minutes as 2 digits + +; 2. Turn highlight off, if present + + ld hl,stndend + call printhl + jp spac ; Space before rest of prompt + +; +;===== D A T A ==================================================== +; + +; Buffer for date/time for read/write system clock + +dtbuf: ds 6 + + endif ;systime + + +line ds 2 ; Pointer to line buffer +recall_ptr ds 2 ; History position pointer +history ds HISTSIZE,0 ; History buffer +hbuf_top: equ $-1 + +; End RCPCLED.LIB + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpcls.lib b/Source/BPBIOS/Z34RCP11/rcpcls.lib new file mode 100644 index 00000000..e6264137 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpcls.lib @@ -0,0 +1,35 @@ + page + +; Library: RCPCLS for Z34RCP +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: CLS +; Function: To clear the CRT screen +; Comments: The setting of the CLSTCAP equate determines whether this +; command uses the TCAP information or not. If not, it uses the +; clear-screen string passed in macro CLSSTR. That string should +; end with the high bit set. + +cls: + if clstcap ; If using TCAP for clear screen string + ld a,(z3tcap) ; TCAP address from Z34CMN.LIB + cp ' '+1 ; See if blank + jr nc,cls1 ; If not, go to clear screen code + jp crlf ; If blank, just do CRLF +cls1: + ld hl,clrscr ; Address from Z34CMN.LIB + jp printhl ; Display it + + else ; Not using tcap + + call print + clsstr ; String from Z34RCP.LIB + ret + + endif ;clstcap + +; End RCPCLS.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpcmd.lib b/Source/BPBIOS/Z34RCP11/rcpcmd.lib new file mode 100644 index 00000000..58a54e78 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpcmd.lib @@ -0,0 +1,56 @@ + page + +; Library: RCPCMD for Z34RCP +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; Description: Command Table and Custom Commands for Z34-RCP + +; This is the customization file for the ZCPR Version 3.4 resident command +; package. Use it to add your own custom commands to the RCP. + +; Give each of your custom commands a unique label and command name. Then +; add the command name(s) to the macro CUSTTBL, below, and append the code +; for the commands to the end of this file. + +; CUSTTBL - Custom commands table. +; +; Add one line to CUSTTBL for each of your custom commands. Each line +; must be of the form: +; +; COMMAND name, TRUE, wheel, label +; +; Where COMMAND and TRUE appear as-is, and "name", "wheel", and "label" +; are created by the user. "Name" is a name of four characters or less used +; to invoke the command, in upper case. "Wheel" is "true" to protect the +; command from non-wheel users, "false" otherwise. "Label" marks the +; beginning of the custom code. For example, to create a wheel- +; protected command named "DIR" which calls the code at label "directory", +; CUSTTBL appears as follows: +; +;custtbl macro +; command DIR, true, true, directory +; endm + +custtbl macro +;; command ____, true, ____, _______ ; Template for custom commands + endm + +; ------------------------------ + +; RCP command dispatch table + + db cmdsize ; Length of each command name + cmdtbl ; Dispatch table from Z34RCP.LIB + custtbl ; Optional custom commands + db 0 ; Marks end of command jump table + +; -------------------------------------------------- + +; Insert label(s) and code for custom RCP commands here: + +; + +; END RCPCMD.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpcp.lib b/Source/BPBIOS/Z34RCP11/rcpcp.lib new file mode 100644 index 00000000..6ec69f48 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpcp.lib @@ -0,0 +1,245 @@ + page + +; Library: RCPCP for Z34RCP +; Author: Carson Wilson +; Version: 1.3 +; Date: August 11, 1989 +; Changes: Responds dynamically to QUIET flag, eliminating "noise." + +; Version: 1.2 +; Date: December 30, 1988 +; Changes: Now works properly with CP/M Plus. +; Moved SETDMA to common routines. + +; Author: Carson Wilson +; Version: 1.1 +; Date: August 4, 1988 +; Changes: Now initializes FCB1 before calling SetFStp, allowing +; stamp setting of multiple-extent files. +; +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: CP +; Function: Copy a file from one place to another +; Syntax: If FCBSWAP false: +; CP destfile=srcfile, CP =srcfile +; If FCBSWAP true: +; CP srcfile destfile, CP srcfile +; If TESTEQ and FCBSWAP true: +; Both of the above forms work +; +; Comments: Both file specifications can include a directory specification. +; If only one file name is given, then the current directory and +; the source file name are assumed for the destination. + +; +; New ZSDOS/DosDisk BDOS standard functions: +; +GetFStp equ 102 ; Get file stamp function +SetFStp equ 103 ; Set file stamp function + +copy: + call retsave + call dirchek ; Test bad directory + + if leftright + call fcbswap ; Exchange fcb1 with fcb2 + endif + +; If new is blank, make it the same name and type as old + + ld de,fcb1+1 ; Point to destination file name + ld a,(de) ; Get first character + cp ' ' ; If not blank (no name) + jr nz,copy0 ; ..then branch to copy + ld hl,fcb2+1 ; Copy source name into destination FCB + ld b,11 ; Name and type are 11 bytes + call blkmov + +; See if destination is same as source, and abort if so + +copy0: + ld hl,fcb1 ; Set up pointers to two files + ld de,fcb2 + push hl + push de + inc hl ; Point to names of files + inc de + ld b,13 ; Compare 13 bytes (name, type, and user #) +copy1: call comp + jr nz,copy2 ; If they differ, go on with copy + ld a,(cdrv) ; ZCPR current drive + inc a ; Shift to range 1..16 + ld b,a ; ..and keep value in B + pop de ; Restore pointers to FCBs + pop hl + ld a,(de) ; Get drive of source file + ld c,a ; ..and save it in C + or a ; Is it default drive? + jr nz,copy1a ; Branch if drive made explicit + ld c,b ; Otherwise, copy default drive into C +copy1a: ld a,(hl) ; Get drive of destination file + or a ; Is it default drive? + jr nz,copy1b ; Branch if drive made explicit + ld a,b ; Otherwise, get current drive +copy1b: cp c ; Compare the two drives specified + jr nz,copy3 ; Branch if they are different + jp duperr ; Tell EH duplicate filespecs +copy2: + pop de ; Clean up the stack + pop hl + +; Make note of the user numbers of the two files + +copy3: + ld a,(fcb1+13) ; Get destination user number + ld (usrdest),a + ld a,(fcb2+13) ; Get source user number + ld (usrsrc),a + +; Set up new FCB for source file and open the source + + call define ; Define buffer addresses dynamically +srcfcb equ $+1 + ld hl,0 ; Get address to use for new source FCB + push hl + ex de,hl ; Copy file data to new FCB + ld b,12 + call blkmov + call logsrc ; Log in user number of source file + pop hl ; Initialize the source file FCB + call initfcb2 + ld c,15 ; Open source file + call bdos + inc a ; Check for error + jp z,noflerr ; File not found error handler + + if StpCall + call cpmver + jr nc,copy4 ; Don't do this if CP/M Plus +stpbuf equ $+1 + ld de,0 + call setdma ; Set DMA to date buffer + ld de,(srcfcb) + ld c,GetFStp ; Get stamp (if any) to DMA + call bdos + ld (gotstp),a ; Store result + ld de,tbuff ; Restore DMA + call setdma ; ..for search +copy4: + endif ; StpCall + +; Make sure destination file does not already exist + + call logdest ; Log into destination user area + call extest ; Test for existence of file in fcb1 + jp z,exit ; Branch if it exists and user says no + +; Create destination file + + ld de,fcb1 ; Point to destination FCB + ld c,22 ; BDOS make-file function + call bdos + inc a ; Test for error (no directory space) + jp z,fulerr ; Invoke EH if not OK + +; Copy source to destination + +copy5: call logsrc ; Log in source user area + ld b,0 ; Initialize counter + ld de,(cbuff) ; Initialize buffer pointer +copy5a: push de ; Save address and counter + push bc + call setdma ; Set DMA to cbuff+(b*128) + ld de,(srcfcb) ; Point to source file FCB + ld c,20 ; BDOS read-sequential function + call bdos + pop bc ; Get counter and address + pop de + or a ; Read Ok? + jr nz,copy5b ; Branch if end of file + ld hl,128 ; Point DE to next buffer address + add hl,de + ex de,hl + inc b ; Increment counter + ld a,b ; See if buffer full + cp cpblocks + jr nz,copy5a ; If not, go back for more +copy5b: ld a,b ; Get count of blocks loaded into buffer + or a ; Are there any? + jr z,copy6 ; Branch if not (we are done) + push bc ; Save count + call logdest ; Log into destination user number +cbuff equ $+1 ; Pointer for in-the-code modification + ld de,0 ; Point to beginning of copy buffer +copy5c: push de ; Save buffer address + call setdma ; Set dma to buffer + ld de,fcb1 ; Point to destination file FCB + ld c,21 ; Sequential write the block + call bdos + or a ; Get result + jp nz,fulerr ; Invoke EH (disk full or write error) + pop de ; Get buffer address & balance stack + pop bc ; Get count + dec b ; Buffer empty? + jr z,copy5 ; Yes. Back for refill + push bc ; No. Save count + ld hl,128 + add hl,de + ex de,hl ; DE points to next buffer address + jr copy5c ; Back for another sector to write + +; Close the destination file + +copy6: call logdest ; Log into destination user number + ld de,fcb1 ; Point to destination FCB + ld c,16 ; Close file + call bdos + inc a ; 0ffh --> 0 if error + jp z,fulerr ; Invoke EH + + if StpCall +gotstp equ $+1 + ld a,0 ; File had stamp? + dec a ; 1 --> 0 = yes + jr nz,noset ; No + ld de,(stpbuf) ; Point to buffer + call setdma ; Set DMA + call initfcb1 ; Init. for SetFStp, point to dest. + ld c,SetFStp ; Set file's stamp + call bdos ; CCP restores DMA +noset: + endif ; StpCall + + ld a,(quiet) + or a + jr nz,qcpdone + call print + db ' Don','e'+80h +qcpdone: + if cpsp and spaceon + jp spaexit ; Report space remaining on destination drive + else + jp exit + endif ;cpsp and spaceon + +; Log into user number of source file + +logsrc: +usrsrc equ $+1 ; Pointer for in-the-code modification + ld a,0 ; Get user number + jr setusrrel ; Local jump to save code + +; Log into user number of destination file + +logdest: +usrdest equ $+1 ; Pointer for in-the-code modification + ld a,0 ; Get user number +setusrrel: + jp setusr + +; End RCPCP.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpdir.lib b/Source/BPBIOS/Z34RCP11/rcpdir.lib new file mode 100644 index 00000000..76c08bc3 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpdir.lib @@ -0,0 +1,137 @@ + page + +; Library: RCPDIR for Z34RCP +; Author: Carson Wilson +; Version: 1.0 +; Date: August 6, 1989 +; Changes: Now allows "DIR [dir:].aft" as well as "DIR [dir:]*.aft" +; to show all files of a given file extentsion, +; e.g., "d .?80" gives all .Z80 and .180 files. +; +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: DIR +; Function: Display a directory of the files on disk +; Syntax: DIR [dir:afn] Displays the DIR files +; DIR [dir:afn] S Displays the SYS files +; DIR [dir:afn] A Display both DIR and SYS files +; +; If slashchk is true: +; +; DIR [dir:]/S Equivalent to DIR [dir:]*.* S +; DIR [dir:]/A Equivalent to DIR [dir:]*.* A + +dir: + call retsave ; Save return address and set stack + +; See if FCB should be made wild (all '?') + + ld hl,fcb1+1 ; Point to file name in FCP + ld a,(hl) ; Get first character of filename + + if slashchk ; Allow "DIR /S" and "DIR /A" formats + cp '/' ; If name does not start with '/' + jr nz,dir01 ; ..branch and process normally + inc hl ; Point to second character + ld a,(hl) ; Get option character after slash + ld (fcb2+1),a ; ..and put it into second FCB + dec hl ; Back to first character + ld a,' ' ; Simulate empty FCB + endif ;slashchk + +dir01: + cp ' ' ; See if no file spec given + jr nz,dir02 ; Spec given + + ld b,8 ; Wildcard name + ld a,(fcb1+9) + cp ' ' ; Wildcard type? + jr nz,dir01a ; No + ld b,11 ; Yes. Fill name and type. +dir01a: ld a,'?' ; Get ready to fill with '?' + call fillp ; ..carry out fill +dir02: + if nosys ; Suppress-SYS-file-if-no-wheel option + call getwhl ; Get wheel status + jr z,dirnly ; If wheel off, ignore options + endif + + ld a,(fcb2+1) ; Get first char of 2nd file name + ld b,1 ; Set for both dir and sys files + cp allflag ; SYS and DIR flag specifier? + jr z,dirpr ; Got system specifier + dec b ; B=0 for sys files only + cp sysflag ; SYS only? + jr z,dirpr + +dirnly: ld b,80h ; Must be dir-only selection + +; DIRECTORY PRINT ROUTINE +; On entry, B reg is set as follows: +; 0 for only system files, 80h for only dir files, 1 for both +; +dirpr: + ld a,b ; Get systst flag + call getdir ; Load and sort directory + jp z,prfnf ; Print no file message + if wide + ld e,5 + else + ld e,4 ; Count down to 0 + endif ; wide +; +; ENTRY PRINT LOOP +; On entry, HL pts to files selected (terminated by 0) +; and E is entry counter +; +dir3: + ld a,(hl) ; Check for done + or a + if dirsp and spaceon + jp z,spaexit ; Show space when done + else + jp z,exit ; Exit if done + endif ; Dirsp and spaceon + ld a,e ; Get entry counter + or a ; Output CRLF if 4 or 5 entries printed in line + jr nz,dir3a ; Continue + call crlf ; New line + if wide + ld e,5 + else + ld e,4 ; Reset entry count + endif ; wide + + ld a,e ; Get entry count +dir3a: + if wide + cp 5 + else + cp 4 ; First entry? + endif ; wide + + jr z,dir4 + call print +; + if wide +; + db ' ' ; 2 spaces + db ' '+80h ; Then 1 more space +; + else +; + db ' ' ; Space + db fence+80h ; Then fence char +; + endif ; Wide +; +dir4: + call prfn ; Print file name + call break ; Check for abort + dec e ; Decrement entry counter + jr dir3 + +; End RCPDIR.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpecho.lib b/Source/BPBIOS/Z34RCP11/rcpecho.lib new file mode 100644 index 00000000..ffe56183 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpecho.lib @@ -0,0 +1,162 @@ + page + +; Library: RCPECHO for Z34RCP +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: ECHO +; Function: Echo text to console or printer + +echo: + xor a ; Lower case/printer off flag setting + ld (crtfl),a ; Printer off by default + + if upcase ; If upper case default + dec a + endif ;upcase + + ld (casefl),a ; Store flag in code below + ld hl,tbuff+1 ; Point to first character + call getchar ; Get first character (should be blank) + ; If none, exit from routine + +; Loop to echo chars + +echo2: call getchar + + if echolst + cp ff ; Form feed? + jr z,echo3 + endif ;echolst + + cp '^' + jr nz,echo2a ; Not control character prefix + call getchar ; Get next character + and 1fh ; Convert to control character + jr echo2e ; Echo it +echo2a: + cp cmdchar ; Case shift prefix? + jr nz,echo2e ; No, normal echo + call getchar ; Get next character + + if echolst + cp prtchar ; Turn printer on? + jr z,echo2b ; Store non-zero in crt flag + cp crtchar ; Turn printer off? + jr nz,echo2c ; No, test for shift characters + xor a ; Yes, clear crt flag +echo2b: ld (crtfl),a + jr echo2 ; On to next character +echo2c: + endif ; echolst + + cp ucasechar ; Up-shift character? + jr z,echo2d ; Store non-zero value in case flag + cp lcasechar ; Lower-case character? + jr nz,echo2e ; No, echo the character as is + xor a ; Else, clear case flag +echo2d: ld (casefl),a + jr echo2 ; On to next character +echo2e: + call echout ; Send char + jr echo2 + +; Form feed - send new line followed by form feed if printer output + + if echolst +echo3: + ld a,(crtfl) ; Check for printer output + or a ; Non-zero? + jr z,echoff ; No, send form feed normally + call echonl ; Send new line + ld a,ff ; Send form feed + jr echout + +; Send form feed char to console + +echoff: + ld a,ff ; Get char + jr echo2e + endif ;echolst + +; End of print loop - check for printer termination + +echo4: + if not echolst + ret + + else + ld a,(crtfl) ; Get list mode flag + or a + ret z ; Done if no printer output + +; Output a new line + +echonl: + ld a,cr ; Output new line on printer + call echout + ld a,lf ; Fall thru to echout + endif ; not echolst + +; Output char to printer or console + +echout: + ld c,a ; Char in c + cp 'A' ; If less than 'A' + jr c,echouta ; Leave as is + cp 'Z'+1 ; If greater than 'Z' + jr nc,echouta ; Leave as is + add 20h ; Else convert to lower case +echouta: + ld d,a ; Save lower case version in d +casefl equ $+1 ; Pointer for in-the-code modification + ld a,0 + or a ; Upper case? + jr nz,echoutb ; If upper case selected, go on as is + ld c,d ; Else substitute lower case version +echoutb: + + push hl ; Save hl + push bc ; Save bc + ld de,0ch-3 ; Offset for BIOS console output + + if echolst + +crtfl equ $+1 + ld a,0 + or a ; Printer? + jr z,echout1 ; No + inc de ; Offset for BIOS printer output + inc de + inc de + endif ;echolst + +; Output char in C with BIOS offset in DE + +echout1: + call biout ; Bios output + pop bc ; Restore bc,hl + pop hl + ret + +; Get a character from the command tail buffer + +getchar: + ld a,(hl) ; Get character + inc hl ; Point to next one + or a ; Check for end of string + ret nz ; If not end, return + pop hl ; Else, clean up stack + jr echo4 ; And exit from routine + +; Output char in C to BIOS with offset in DE + +biout: + ld hl,(wboot+1) ; Get address of warm boot + add hl,de ; Pt to routine + jp (hl) ; Jump to it + +; End RCPECHO.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpera.lib b/Source/BPBIOS/Z34RCP11/rcpera.lib new file mode 100644 index 00000000..776becb8 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpera.lib @@ -0,0 +1,76 @@ + page + +; Library: RCPERA for Z34RCP +; Author: Carson Wilson +; Version: 1.2 +; Date: Sept. 15, 1989 +; Changes: Chains to error handler with flag set to invoke transient ERA +; if a read only file is encountered. Propose error code +; 17 decimal for "file read only" error. +; +; Version: 1.1 +; Date: August 12, 1989 +; Changes: Now responds dynamically to QUIET flag, eliminating "noise". +; NOTE: if QUIET is active, using the inspect option or trying +; to erase R/O files will give meaningless messages. Use +; the PROT command to set R/O files to R/W first in order to +; erase them quietly. +; +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: ERA +; Function: Erase files +; Forms: +; ERA Erase Specified files and print their names +; ERA o Erase Specified files and print their names, but ask +; for verification before Erase is done + +era: + call retsave + ld a,(fcb2+1) ; Get eraflg if it's there + ld (eraflg),a ; Save it as a flag + ld a,1 ; Dir files only + call getdir ; Load directory of files + jp z,prfnf ; Abort if no files +; +; Main erase loop +; +era1: call break ; See if user wants to stop + call qplug ; Turn of output if quiet + push hl ; Save ptr to file + call prfn ; Print its name + ld (nxtfile),hl ; Save ptr to next file + pop hl ; Get ptr to this file + call unplug ; Turn output on + call rotest ; Test file pted to by hl for r/o + ld a,17 ; Proposed file R/O error code + ld b,00010000b ; EH flag to invoke transient + jp nz,errex1 ; Chain to transient if R/O +eraflg equ $+1 ; Address of flag + ld a,0 ; 2nd byte is flag + cp ' ' ; Is it an inspect option? + jr z,era2 ; Skip prompt if it is not + call eraq ; Erase? + jr nz,era3 ; Skip if not +era2: ld de,fcb1+1 ; Copy into fcb1 + ld b,11 ; 11 bytes + call blkmov + call initfcb1 ; Init fcb + ld c,19 ; Delete file + call bdos +era3: ld hl,(nxtfile) ; Hl pts to next file + ld a,(hl) ; Get char + or a ; Done? + if erasp and spaceon + jp z,spaexit + else + jp z,exit + endif ; Erasp and spaceon + call crlf ; New line + jr era1 + +; End RCPERA.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcph.lib b/Source/BPBIOS/Z34RCP11/rcph.lib new file mode 100644 index 00000000..34cae928 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcph.lib @@ -0,0 +1,119 @@ + page + +; Library: RCPH for Z34RCP +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: HELP +; Function: This command displays a list of all resident commands that +; are supported, including those in the CPR (command processor), +; RCP, and FCP. +; +; Syntax: H + +clist: + +; Print the FCP-resident command names + + if listfcp + call print ; Print header for FCP + db lf + db 'FC','P'+80h + ld hl,(fcp) ; Get FCP address dynamically from ENV + ld a,h ; See if still there + or l + jr z,nofcp ; FCP has been removed + ld bc,5 ; Calculate address of FCP command table + add hl,bc + call cmdlist ; Display list of commands +nofcp: + endif ;listfcp + +; Print the CPR-resident command names + + if listcpr + call print ; Print "CPR" + db cr,lf ; Need CR if no FCP + db 'CP','R'+80h + ld hl,(ccp) ; Get CCP address from ENV + ld bc,offcmd ; Point to command table in CPR + add hl,bc + call cmdlist ; Display the list of commands + endif ;listcpr + +; Print the RCP-resident command names + + call crlf ; Skip a line + ld hl,rcpname ; Print RCP name + call printhl + ld hl,RCPbegin+5 ; Point to RCP command table + ; Fall through to CMDLIST + +;---------------------------------------- + +; Subroutine to display list of commands in a command table (code above +; falls through to this routine -- do not move it). The commands are +; displayed 5 per line with 8 character spaces allowed for each command +; (subject to equates below). + +cmdlist: + call crlf ; Start with new line + ld e,(hl) ; Get size of each command name into DE + ld d,0 + inc hl ; Point to name of first command + ld c,cmdsline ; Set names-per-line value +cmdlist1: + ld a,(hl) ; Get first character of the command name + or a ; See if it is null + jr nz,cmdlist1a ; If not, continue + ld a,cmdsline ; See if we are already on a new line + cp c + call nz,crlf ; If not, skip a line + ret + +cmdlist1a: + if noshow ; Option to suppress wheel-limited cmds + rla ; Shift high bit of name into carry bit + jr nc,cmdlist2 ; If not restricted, go on + call getwhl ; Otherwise, check wheel byte + or a + jr nz,cmdlist2 ; If wheel set, continue as usual + add hl,de ; Otherwise skip this command + jr cmdlist5 + endif + +; Print leading spaces between names + +cmdlist2: + ld a,cmdspace ; Spacing between command names + sub e ; Less length of each command name + ld b,a +cmdlist3: + call spac + djnz cmdlist3 + +; Print name of command + + ld b,e ; Length of each name into B +cmdlist4: + ld a,(hl) ; Get command name character + call conout + inc hl ; Point to next + djnz cmdlist4 + + dec c ; Decrement count of names on this line + jr nz,cmdlist5 ; Branch if room for more names + call crlf ; Otherwise, end this line and + ld c,cmdsline ; ..reset count for another line of commands + +; Skip to next command name + +cmdlist5: + inc hl ; Skip jump vector + inc hl + jr cmdlist1 ; Back to process next name + +; End RCPH.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpid.lib b/Source/BPBIOS/Z34RCP11/rcpid.lib new file mode 100644 index 00000000..dfbacaf2 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpid.lib @@ -0,0 +1,64 @@ + page + +; Library: RCPID for Z34RCP +; Author: Carson Wilson +; Version: 1.0 +; Date: September 29, 1989 +; Changes: ID appended with 'C' if CLED is present +; +; Author: Carson Wilson +; Version: 1.0 +; Date: September 14, 1988 +; +; Function: Build the name of the RCP and append it at the end of the +; file at label RCPID. This serves two purposes: first it +; allows the 'H' command to describe which RCP is active, +; second, the string identifies the actual end of the RCP +; in memory. +; +; ------------------------------------------------------------------------ + +; Macros to build RCP ID for Help command + +; Under SLR and compatible assemblers, the RCP name reflects the +; RCP size, e.g., "RCP-21F" means the RCP occupies 21 records. + + if SLR +rcpid macro +rcplen defl RCPend - RCPbegin +fulrecs equ rcplen / 128 ; Full records +lastr equ [rcplen mod 128 + 127]/128 ; Last record, if any +ttlrecs equ fulrecs + lastr + + db 'RCP-' + db ttlrecs / 10 + '0' ; Tens of records + db ttlrecs mod 10 + '0' ; Ones + db rcptype ; 'F', 'H', etc. from RCP.LIB + if cledon + db 'C' ; Distinguish CLED versions + endif + db 0 ; ID string terminator + endm + + else ; Non-SLR +rcpid macro + db 'RCP-' + db rcptype + db 0 + endm + endif ; SLR + +; ----------------------------------------------------------------------- + +; Name of RCP + +; This block allows the 'H' command and/or the SHOW utility to display a name +; and version number for this RCP as well as the commands that are supported. +; It also generates a unique string marking the end of the RCP module. + +rcpname: + rcpid + +; End of RCPID.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpiom.lib b/Source/BPBIOS/Z34RCP11/rcpiom.lib new file mode 100644 index 00000000..d85e553d --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpiom.lib @@ -0,0 +1,296 @@ + page + +; Library: RCPIOM for Z34RCP +; Author: Carson Wilson +; Version: 1.1 +; Date: August 12, 1989 +; Changes: POKE and PORT now respond dynamically to QUIET flag, +; eliminating "noise." + +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Commands: PEEK, POKE, and PORT + +; ------------------------------------------------------------------ +; +; Command: PEEK +; Function: Display memory contents +; +; Form: +; PEEK startadr 128 bytes displayed +; PEEK startadr endadr Range of bytes displayed + + if peekon +peek: + call retsave + ld hl,tbuff+1 ; Find first number +nxtpeek equ $+1 ; Pointer for in-the-code modification + ld de,100h ; Default peek address if none + call sksp ; Skip to first token (if any) + call nz,hexnum ; Get start address if any + push de ; Save starting address + ld bc,peeklen ; Compute default ending address + ex de,hl + add hl,bc + + if peekchk ; Check for overflow + jr nc,peek0 ; If no overflow past FFFF, go on + ld hl,0ffffh ; Else use FFFF as ending address +peek0: + endif ;peekchk + + ex de,hl ; End address in DE + call sksp ; Skip to next token (if any) + call nz,hexnum ; Get 2nd number in DE (else default) +peek1: pop hl ; HL is start address, DE is end address + + if peekhdr + push hl ; Save starting address again + ld b,8 ; Output leading spaces +peek0a: call spac + djnz peek0a + ld b,16 ; Display 16 column headers +peek0b: ld a,l ; Get low byte of address + and 0fh ; Display low hex digit + call pashc + inc hl + djnz peek0b +; +; Display header for ASCII area +; + call print + db ' ',' '+80H ; Space over to ASCII area + pop hl ; Get address + push hl + ld b,16 ; Display 16 chars. ASCII header +peek0b1:ld a,l ; Get byte + and 0fh ; Mask + call pah ; Print ASCII char. + inc hl ; Next byte + djnz peek0b1 + + if peekbdr + call crlf + ld b,8 +peek0c: call spac ; Print leading spaces + djnz peek0c + ld b,16 +peek0d: call print + db ' -','-'+80h + djnz peek0d + +; Print border at ASCII area + + call print + db ' ',' '+80h ; Space to ASCII border + ld b,16 ; 16 dashes +peek0e: call print + db '-'+80h + djnz peek0e + endif ;peekbdr + + pop hl ; Restore starting address + endif ;peekhdr + + ld c,0ffh ; Use C as continue flag + call peek2 ; Do peek + ld (nxtpeek),hl ; Set continued peek address + jp exit +peek2: + ld a,c ; Check continuation flag + or a + ret z + +; Print line header + +peek2a: call crlf ; New line + ld a,h ; Print address + call pashc + ld a,l + call pahc + call dash ; Print leader + ld b,16 ; 16 bytes to display + push hl ; Save start address + +; Print hex values for 16 bytes + +peek3: ld a,(hl) ; Get next byte + call pashc ; Print with leading space + +; Check for last address. If C is already 0, leave it that way. +; Otherwise check for end address and if so set C to zero. + + ld a,c ; See if continue flag already cleared + or a + jr z,peek3a ; If so, skip test + ld a,h + sub a,d ; See if h = d + ld c,a + ld a,l + sub a,e ; See if l = e + or c ; Combine two tests + ld c,a +peek3a: inc hl ; Pt to next + djnz peek3 + +; Print ASCII equivalents for 16 bytes + + pop hl ; Pt to first address again + ld b,16 ; 16 bytes + call print ; Space and fence + db ' ' + db fence+80h + push bc ; Save flag in c +peek4: ld a,(hl) ; Get next byte + ld c,'.' ; Assume dot + and 7fh ; Mask it + cp ' ' ; Dot if less than space + jr c,peek5 + cp 7fh ; Don't print del + jr z,peek5 + ld c,a ; Char in c +peek5: ld a,c ; Get char + call conout ; Send it + inc hl ; Pt to next + djnz peek4 + call print ; Closing fence + db fence+80h + pop bc ; Get flag in c back + call break ; Allow abort + jr peek2 + endif ; Peekon + +; PAHC - Print A as 2 hex chars +; PASHC - With leading space + + if peekon or pokeon or porton +pashc: + push af ; Save A + call spac + pop af +pahc: push bc ; Save bc + ld c,a ; Byte in c + rrca ; Exchange nybbles + rrca + rrca + rrca + call pah ; Print hex char + ld a,c ; Get low + pop bc ; Restore bc and fall thru to pah +pah: and 0fh ; Mask + add '0' ; Convert to ascii + cp '9'+1 ; Letter? + jr c,pah1 + add 7 ; Adjust to letter +pah1: jp conout + endif ; Peekon or pokeon or porton + +; -------------------------------------------------------------------- +; +; Command: POKE +; Function: Place Values into Memory +; +; Form: +; POKE startadr val1 val2 ... +; + if pokeon +poke: + call retsave + ld hl,tbuff+1 ; Pt to first char + call sksp ; Skip to non-blank + jp z,numerr ; Numerical error + call hexnum ; Convert to number + call qplug ; Shut off output if quiet + call print + db ' Pok','e'+80h + call adrat ; Print at message (quiet sensitive) + call unplug ; Turn on output + +; Loop for storing hex values sequentially via POKE + +poke1: push de ; Save address + call sksp ; Skip to non-blank + jp z,exit ; Done + cp '"' ; Quoted text? + jr z,poke2 + call hexnum ; Get number + ld a,e ; Get low + pop de ; Get address + ld (de),a ; Store number + inc de ; Pt to next + jr poke1 + +; Store ASCII chars. + +poke2: pop de ; Get next address + inc hl ; Pt to next char +poke3: ld a,(hl) ; Get next char + or a ; Done? + jp z,exit + ld (de),a ; Put char + inc hl ; Pt to next + inc de + jr poke3 + + endif ; Pokeon + +; ------------------------------------------------------------------- +; +; Command: PORT +; Function: Display or Set I/O Port Data +; +; Forms: +; PORT addr - Read port and display value +; PORT addr value - Output value to port +; + if porton +port: + call retsave + ld hl,tbuff+1 ; Find first number + call sksp ; Skip to first command-line token + jp z,numerr ; Numerical error + call hexnum ; Get start address into de + push hl ; Save pointer to command tail + ld hl,portadl ; Modify code + ld (hl),e ; Move specified port addr into place + dec hl ; Point to opcode position + ld (hl),0dbh ; Poke 'in' opcode + dec hl + ld (hl),d ; Save MSB for port address + inc hl + ex (sp),hl ; Get tail pointer back while saving this one + call qplug ; Shut off output if quiet + call print ; Print header + db ' Por','t'+80h + ld a,e + call pashc ; Print port address + call sksp ; Skip to possible second value + jr z,portin ; Proceed with port input + call hexnum ; Get 2nd number in de + ex (sp),hl ; Get pointer to opcode back + ld (hl),0d3h ; Poke 'out' opcode + call print + db ': OU','T'+80h + ld a,e ; Get value to output + jr paddr +portin: + call print + db ': I','N'+80h + xor a ; Make sure high port address = 0 (for hd64180) +portadh equ $+1 +paddr: ld b,0 ; ..for both in and out instructions +opcode: + db 0 ; Opcode for in or out inserted by code above +portadl: + db 0 ; Port address inserted by code above + call pashc + call unplug ; Turn on output + pop hl ; Clean up stack + jp exit + + endif ; Porton + +; End RCPIOM.Z80 + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcplt.lib b/Source/BPBIOS/Z34RCP11/rcplt.lib new file mode 100644 index 00000000..98d6b0ba --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcplt.lib @@ -0,0 +1,256 @@ + page + +; Library: RCPLT for Z34RCP +; Author: Carson Wilson +; Version: 1.1 +; Date: August 26, 1989 +; Changes: Some WordStar characters caused garbage to appear on the +; screen. Now filters control characters other than CR, +; TAB, and LF. Thanks to Gene Pizzetta for this suggestion. +; +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Commands: LIST and TYPE + +; ---------------------------------------------------------------- +; +; Command: LIST +; Function: Print out specified file on the LST: Device +; Forms: +; LIST Do form feed +; LIST Print file(s) (NO Paging) +; Notes: +; The flags which apply to TYPE do not take effect with LIST +; The tab expansion code is required for LST: output. + + if liston +list: + ld a,(fcb1+1) ; Get filename or ' ' from command + ld (prflg),a ; List flag (A can't be 0) + cp ' ' ; Null command? + jp z,lstff ; Yes, do form feed and return + jr type0 ; No, send file to LST: + endif ;liston + +; -------------------------------------------------------------------- +; +; Command: TYPE +; Function: Print out specified file on the CON: Device +; Forms: +; TYPE Print file +; TYPE P Print file with paging flag +; Notes: +; The flag PGDFLG defines the letter which toggles the paging +; facility (P in the forms section above) +; The flag PGDFLT determines if TYPE is to page by default +; (PGDFLT=TRUE if TYPE pages by default); combined with +; PGDFLG, the following events occur -- +; If PGDFLT = TRUE, PGDFLG turns OFF paging +; If PGDFLT = FALSE, PGDFLG turns ON paging + +type: + if liston + xor a ; Turn off printer flag + ld (prflg),a ; Set flag + endif ; Liston + +; Entry point for list function (LIST) + +type0: call retsave ; Save return address + ld a,(fcb2+1) ; Get page flag from command + ld (pgflg),a ; Store it + ld a,1 ; Select dir files + call getdir ; Allow ambiguous files (HL points to buffer) + jp z,noflerr ; EH no files error + ld a,(lins) ; Set line count + ld (pagcnt),a + jr typex1 + +; Entry point for successive files + +typex0: pop hl ; Balance stack for skip + pop hl ; ..to next file command (^X) +typex: ld hl,(nxtfile) ; Get ptr to next file + ld a,(hl) ; Any files? + or a + jp z,exit + + if liston + ld a,(prflg) ; Check for lst: output + or a ; 0=type + jr z,typex1 + ld a,cr ; Bol on printer + call lcout + call lstff ; Form feed the printer +; fall thru + endif ; Liston + + ; Entry point for 1st file +typex1: ld de,fcb1+1 ; Copy into fcb1 + ld b,11 ; 11 bytes + call blkmov + ld (nxtfile),hl ; Set ptr to next file + call initfcb1 ; Init fcb1 + ld c,15 ; Open file + call bdos + inc a ; Set error flag + jp z,noflerr ; EH no files error + ld a,cr ; New line + call lcout + ld a,lf + call lcout + ld bc,080h ; Set char position and tab count + ; (b=0=tab, c=080h=char position) + +; Main loop for loading next block + +type2: ld a,c ; Get char count + cp 80h + jr c,type3 + call break + push bc ; Read next block + ld de,fcb1 ; Pt to fcb + ld c,20 ; Read record + call bdos + or a ; Set flags + pop bc + jr nz,typex ; End of file? + ld c,0 ; Set char count + ld hl,tbuff ; Pt to first char + +; Main loop for printing chars in tbuff + +type3: ld a,(hl) ; Get next char + and 7fh ; Mask out msb + cp 1ah ; End of file (^z)? + jr z,typex ; Next file if so + +; Output char to CON: or LST: device with tabulation + + cp cr ; Reset tab count? + jr z,type4 + cp lf ; Reset tab count? + jr z,type4 + cp tab ; Tab? + jr z,type5 + cp ' ' ; Skip other ctls. + jr c,type6 + +; Output char and increment char count + + call lcout ; Output char + inc b ; Increment tab count + jr type6 + +; Output or and reset tab count + +type4: call lcout ; Output or + ld b,0 ; Reset tab counter + jr type6 + +; Tabulate + +type5: ld a,' ' ; + call lcout + inc b ; Incr pos count + ld a,b + and 7 + jr nz,type5 + +; Continue processing + +type6: + inc c ; Increment char count + inc hl ; Pt to next char + jr type2 + +; Send a formfeed to LST:. Assumes PRFLG <> 0. + +lstff: + ld a,ff ; formfeed +; fall thru + +; Send output to LST: or CON:, as per the flag +; Return with Z if abort + +lcout: push hl ; Save regs + push bc + ld e,a ; Char in e + ld c,2 ; Output to con: + + if liston +prflg equ $+1 ; Pointer for in-the-code modification + ld a,0 ; 2nd byte is the print flag + or a ; 0=type + jr z,lc1 + ld c,5 ; Output to lst: + endif ; Liston + +lc1: push de ; Save char + call bdos ; Output char in e + pop de ; Get char + ld a,e + cp lf ; New line? + jr nz,lc2 ; No, return + call break ; Check for abort + jp z,typex0 ; Skip if ^X + + if liston + ld a,(prflg) ; Output to lst:? + or a ; Nz = yes + jr nz,lc2 + endif ; Liston + +; New line, so check for paging + + ld hl,pagcnt + dec (hl) + jr nz,lc2 ; Jump if not end of page + ld a,(lins) + ld (hl),a ; Reset counter +pgflg equ $+1 ; Pointer to in-the-code buffer + ld a,0 ; 2nd byte is the paging flag + cp pgdflg ; Page default override option wanted? + + if pgdflt ; If paging is default + jr z,lc2 ; Pgdflg means no paging + else + jr nz,lc2 ; Pgdflg means page + endif ; Pgdflt + + push hl ; Save hl + call print + db cr,lf,' Typing',' '+80h + ld hl,fcb1+1 ; Print file name + call prfn + call dash ; Print dash + call conin ; Get input + pop hl ; Restore hl + call break1 ; Set Z flag or abort + push af ; Save results + + if typecls and clson + call cls ; Clear between screens + else + call crlf + endif + + pop af ; Get results + jp z,typex0 ; Control-X, so skip to next file + cp ctrlz ; If Control-Z, + jr nz,lc2 + ld a,pgdflg ; Switch to non-default + ld (pgflg),a ; ..paging mode +lc2: pop bc ; Restore regs + pop hl + ret + +; Storage for line counter + +pagcnt: + ds 1 + +; End RCPLT.LIB + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpprot.lib b/Source/BPBIOS/Z34RCP11/rcpprot.lib new file mode 100644 index 00000000..4e8a5479 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpprot.lib @@ -0,0 +1,130 @@ + page + +; Library: RCPPROT for Z34RCP +; Author: Carson Wilson +; Version: 1.1 +; Date: August 12, 1989 +; Changes: Now responds dynamically to QUIET flag, eliminating "noise." + +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: PROT +; Function: To set the attributes of a file (R/O, SYS, and ARC) +; Form: PROT afn RSAI +; Comments: If R, S, or A are omitted, the file is made R/W, DIR, or +; modified, respectively. R, S, A, and I may be in any order. +; If I is present, Inspection is enabled. + +att: + call retsave + call dirchek ; Test bad directory + xor a ; Set no inspect + ld (inspect),a + ld hl,0 ; Set r/o and sys attributes off + ld c,0 ; Set Arc attribute off + ld de,fcb2+1 ; Pt to attributes + ld b,4 ; 4 chars max +att1: + ld a,(de) ; Get char + inc de ; Pt to next + cp 'I' ; Inspect? + jr z,atti + cp 'R' ; Set r/o? + jr z,attr + cp 'S' ; Set sys? + jr z,atts + cp 'A' + jr z,atta +att2: + djnz att1 + jr att3 +atti: + ld (inspect),a ; Set flag + jr att2 +attr: + ld h,a ; Save R/O flag + jr att2 +atts: + ld l,a ; Save SYS flag + jr att2 +atta: + ld c,a ; Save ARC + jr att2 +att3: + ld (fatt2),hl ; Save file attributes + ld a,c + ld (fatt1),a ; Save Arc attribute + ld a,1 ; Select dir and sys files + call getdir ; Load directory + jp z,noflerr ; Tell error handler no file + jr att5 +att4: + ld hl,(nxtfile) ; Pt to next file + ld a,(hl) ; End of list? + or a + jp z,exit + call crlf ; New line +att5: call break ; Check for possible abort + call qplug ; Turn off output if quiet + push hl ; Save ptr to current file + call prfn ; Print its name + ld (nxtfile),hl ; Save ptr to next file + call print + db ' Set to R','/'+80h + ld hl,(fatt2) ; Get attributes + ld c,'W' ; Assume r/w + ld a,h ; Get r/o bit + or a + jr z,att6 + ld c,'O' ; Set r/o +att6: ld a,c ; Get char + call conout + ld a,l ; Get sys flag + or a ; Set flag + jr z,att7 + call print + db ', SY','S'+80h +att7: ld a,(fatt1) + or a + jr z,att7a + call print + db ', AR','C'+80h +att7a: call unplug ; Turn output on +inspect equ $+1 ; Ptr for in-the-code modification + ld a,0 ; Get inspect flag + or a ; Z=no + pop hl ; Get ptr to current file + jr z,att8 + call eraq1 ; Ask for y/n + jr nz,att4 ; Advance to next file if not y +att8: ld de,fcb1+1 ; Copy into fcb1 + ld b,11 ; 11 bytes + call blkmov + ex de,hl + dec hl ; Pt to archive byte +fatt1 equ $+1 + ld a,0 + call attset + dec hl ; Pt to sys byte +fatt2 equ $+1 ; Ptr for in-the-code modification + ld de,0 ; Get attributes + ld a,e ; Get sys flag + call attset ; Set attribute correctly + dec hl ; Pt to r/o byte + ld a,d ; Get r/o flag + call attset + ld de,fcb1 ; Pt to fcb + ld c,30 ; Set attributes + call bdos + jp att4 +attset: + res 7,(hl) ; Clear attribute + or a + ret z ; 0=clear attribute + set 7,(hl) ; Set attribute + ret + +; End RCPPROT.LIB + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpquiet.lib b/Source/BPBIOS/Z34RCP11/rcpquiet.lib new file mode 100644 index 00000000..9269d241 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpquiet.lib @@ -0,0 +1,49 @@ + page + +; Library: RCPQUIET for Z34RCP +; Author: Carson Wilson +; Version: 1.1 +; Date: August 6, 1989 +; Changes: Now "Q R[eset]" and "Q S[et]" just reset and set quiet status +; without showing it, and Q alone (or with any other character, +; e.g., "Q ?") always just shows status. +; Forms: +; Q - Display quiet flag (always) +; Q s - Set quiet flag ON +; Q r - Set quiet flag OFF +; +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: Q +; Function: Set the Quiet flag on or off +; Comments: If QQUIET equate is true, then RCP does not report +; quiet status with the Q command. +; Forms: +; Q - Display quiet flag (if QQUIET false) +; Q s - Set quiet flag ON +; Q r - Set quiet flag OFF + +quset: + ld a,(fcb1+1) ; Get first char + ld b,1 ; Prepare to turn on + cp 'S' ; S-et quiet (ON) + jr z,quset1 + ld b,0 ; Prepare to turn off + cp 'R' ; R-eset quiet (OFF) + jr nz,qmsg ; Neither S nor R, so display +quset1: + ld a,b + ld (quiet),a + ret + +qmsg: +; Print Quiet Flag Message + + ld a,(quiet) + jp tella ; Say " On" or " Off" and return + +; End RCPQUIET.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpr.lib b/Source/BPBIOS/Z34RCP11/rcpr.lib new file mode 100644 index 00000000..e29a4f37 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpr.lib @@ -0,0 +1,108 @@ + page + +; Library: RCPR for Z34RCP +; Author: Carson Wilson +; Version: 1.5 +; Date: August 30, 1989 +; Changes: Minor bug fix as suggested by Howard Goldstein. +; +; Version: 1.4 +; Date: August 26, 1989 +; Changes: Now performs reset 37 for ALL drives under CP/M 2.2 or ZRDOS +; to ensure that fast fixed disks are reset under ZRDOS, then +; exits with reset 13 to compensate for bugs in ZRDOS/CP/M 2.2 +; reset 37. Still resets individual drives selectively under +; CP/M Plus and ZS/ZDDOS. + +; Version: 1.3 +; Date: August 11, 1989 +; Changes: Now responds dynamically to QUIET flag, eliminating "noise." +; Now performs reset 37 in ALL cases, reset 13 as well if not +; CP/M Plus or ZSDOS (per suggestion by Howard Goldstein). + +; Version: 1.2 +; Date: December 30, 1988 +; Changes: Now resets single drives under Z3PLUS. + +; Version: 1.1 +; Date: September 11, 1988 +; Changes: Fixed bug which failed to detect ZRDOS. ZRDOS' function +; 37, like CP/M's, is not reliable. + +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: RESET +; Function: Reset the disk system +; Forms: R [d: or dir:] - ZSDOS or CP/M Plus +; R - CP/M 2.2 or ZRDOS +; Comments: ZRDOS does not require a disk system reset when disks are +; changed, but directory programs will not show the correct +; size if this is not done. It is also good practice. Since +; no warm boot is performed, the disk in drive A need not have +; the operating system on it. +; +; Under ZSDOS or CP/M Plus, individual drives may be reset, and +; if RESETSP is true, space remaining is also given. If +; the fast hard disk reset capability is enabled under ZSDOS, +; any "fast" fixed disks are also reset at this time. +; +; NOTE: It is necessary to reset a legal directory or DU when there are +; protected directories. + +reset: ld a,(quiet) + or a ; Skip message if quiet + jr nz,QReset + call print ; Report action + db ' Rese','t'+80h +QReset: call cpmver ; CP/M Plus? + jr nc,reset0 ; Yes + ld c,48 + call bdos ; ZRDOS or CP/M? + ld a,h + or a + jr nz,reset0 ; No, assume bug-free F37 + ld de,0ffffh ; Yes, reset ALL drives, both ways + ld c,37 + call bdos + ld c,13 + jp bdos ; Yes, do regular reset + +; Reset individual drive(s) + +reset0: call dirchek ; Abort with error if illegal drivespec + ld a,(fcb1) ; Use default drive? + or a + jr nz,reset1 ; No, use drive from FCB1 + ld a,(cdrv) ; Yes, get ZCPR 3.3 current drive byte + inc a ; Shift range to 1..16 +reset1: ld hl,1 ; Map drive "A:" +reset2: dec a ; Done yet? + jr z,reset3 ; Yes + add hl,hl ; No, shift vector to next drive + jr reset2 + +; Check for fixed disks + +reset3: push hl ; Save current or specified vector + ld c,39 + call bdos ; ZSDOS return fixed disks in HL + pop de ; Restore vector + ld a,d + or h ; Add any fixed disks + ld d,a + ld a,e + or l + ld e,a + ld c,37 ; Reset individual drive(s) + + if spaceon and resetsp + call bdos + jp crspace ; Show space remaining (QUIET sensitive) + else + jp bdos ; Do reset and return + endif + +; End RCPR.LIB + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpreg.lib b/Source/BPBIOS/Z34RCP11/rcpreg.lib new file mode 100644 index 00000000..d73eee05 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpreg.lib @@ -0,0 +1,165 @@ + page + +; Library: RCPREG for Z34RCP +; Version: 1.1 +; Date: August 11, 1989 +; Changes: Register Set, Decrement, and Increment commands now respond +; dynamically to QUIET flag, eliminating "noise." + +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: REG +; Function: Manipulate Memory Registers +; +; Forms: +; REG D or REG <-- Display 10 Register Values +; REG Mreg <-- Decrement Register Value +; REG Preg <-- Increment Register Value +; REG Sreg value <-- Set Register Value +; +; Vers 2.1 Joe Wright +; +; REG reg <-- Display a single register value +; +; REG numbers now range from 0 to 31, although only the first ten are +; displayed with REG D. +; +; REG now treats the program error byte as register E. +; +register: + ld de,fcb1+2 ; Pt to first arg + ld a,(de) ; Get possible digit + call regptr ; Pt hl to potential register + dec de ; Point to command + ld a,(de) + cp 'S' ; Set? + jr z,rset + cp 'P' ; Plus? + jr z,rinc + cp 'M' ; Minus? + jr z,rdec + cp ' ' + jr z,rshow + cp 'D' + jr z,rshow + call regptr + jp regout + +; Increment register value +; HL pts to memory register on input + +rinc: inc (hl) ; Increment it + jr Qregout ; Print result + +; Decrement register value +; HL pts to memory register on input + +rdec: dec (hl) ; Decrement value + jr Qregout ; Print result + +; Show first ten registers and Program Error byte + +rshow: call rshow10 + ld hl,z3msg+6 + jp regout + +rshow10:xor a ; Select register 0 + ld b,a ; Counter set to 0 in b + call regp1 ; Hl pts to register 0 +rshow1: ld a,b ; Get counter value + cp 10 ; First ten registers + ret z ; Exit if done + push bc ; Save counter + push hl ; Save pointer + call regout ; Print register value + pop hl ; Get pointer + pop bc ; Get counter + inc b ; Increment counter + ld a,b ; Check for new line + and 3 + call z,crlf ; Newline after fourth display + inc hl ; Pt to next register + jr rshow1 + +; Set register value +; HL pts to register on input + +rset: + ld de,fcb2+1 ; Pt to value + call de2bin ; Eval string at de to binary in b + ld (hl),b ; Set value + +; Enter with HL pointing to the register. HL is maintained. +; +qregout:ld a,(quiet) + or a + ret nz +regout: call print + db ' Reg',' '+80h + ld de,z3msg+30h ; Register 0 + sbc hl,de ; Register number in hl + ld a,l + cp 32 ; A numbered register? + jr c,rego0 ; Yep + call print + db ' ','E'+80h + jr rego1 ; Report + +rego0: push hl + push de + ld b,0 ; Suppress zeros + call decdsp2 ; Report register number + pop de + pop hl +rego1: add hl,de ; Hl points to register again + call print + db ' =',' '+80h + ld l,(hl) + xor a + ld h,a + ld b,a ; Suppress leading zeros + jp decdsp3 ; Display value + +; Evaluate decimal string at DE to binary in B + +de2bin: ld b,0 ; Init value to zero +de2b: ld a,(de) ; Get this digit + inc de ; Pt to next + sub '0' ; Convert to binary + ret c ; A space, finished + cp 10 ; Range? + ret nc ; Not decimal, finished + ld c,a ; Digit in c + ld a,b ; Multiply old by 10 + add a,a ; *2 + add a,a ; *4 + add a,b ; *5 + add a,a ; *10 + add a,c ; Add in new digit + ld b,a ; Result in b + jr de2b ; Again + +; Set HL to point to memory register whose index is pted to by HL +; On input, A contains register char +; On output, HL = address of memory register (reg 0 assumed if error) + +regptr: ld hl,z3msg+6 ; The e register + cp 'E' + ret z + push de + call de2bin ; Get register number in b + pop de + ld a,b + cp 32 ; Range 0-31 + ld a,0 + jr nc,regp1 ; Out of range, use 0 + ld a,b ; Value in a +regp1: ld hl,z3msg+30h ; Pt to memory registers + add a,l ; Pt to proper register + ld l,a + ret ; No chance of crossing page boundary + +; End RCPREG.LIB + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpren.lib b/Source/BPBIOS/Z34RCP11/rcpren.lib new file mode 100644 index 00000000..6947bad2 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpren.lib @@ -0,0 +1,100 @@ + page + +; Library: RCPREN for Z34RCP +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: REN +; Function: To change the name of an existing file +; Forms: +; LEFTRIGHT false: +; REN = +; LEFTRIGHT true: +; REN +; LEFTRIGHT and TESTEQ both true: +; Either of the above forms may be used. + +ren: + call retsave + call dirchek ; Test bad dirspec + + if leftright + call fcbswap ; Exchange command line fcb's + endif +; +; STEP 1: See if old name is ambiguous +; + ld hl,fcb2+1 ; Can't be ambiguous + call ambchk1 +; +; STEP 2: Log into user area +; +; If dirspec given at old name, use it +; else use dirspec (or default) given at new name. + + ld hl,fcb1 ; Pt to new name + push hl + ld de,fcb2 ; Pt to old name + push de ; Save ptr + ld a,(de) ; Test if dirspec issued + or a ; ..at old name + jr z,ren1 ; No, use user at new name + ld (hl),a ; Stuff drive into new file + ld a,(fcb2+13) ; Yes, log to user area + call setusr ; ..of old name + jr ren2 +; +; Use dirspec at new name (none given at old name) +; +ren1: + ld a,(hl) ; Stuff drive of new name + ld (de),a ; ..into old name + call logusr ; Log to user at new name +ren2: +; +; STEP 3: See if old file is R/O +; + pop de ; Restore ptr to old FCB + push de ; Save it again + ld c,17 ; Look for old file + call bdos + inc a + jr z,rnxit + call getsbit ; Match found, get ptr to entry in tbuff + ex de,hl ; Hl pts to entry + inc hl ; Pt to fn + call rotest ; See if file is r/o + jr nz,rnxit1 ; Abort if so +; +; STEP 4: See if new file already exists +; EXTEST performs a number of checks: +; 1) Ambiguity +; 2) R/O +; 3) If file exists and not R/O, permission to delete +; + call extest + jr z,rnxit1 ; R/o or no permission +; +; STEP 5: Exchange file name fields for rename +; + pop de ; Pt to old + pop hl ; Pt to new + push hl ; Save ptr + ld b,12 ; 12 bytes + call iswap1 +; +; STEP 6: Rename the file +; + pop de ; Get ptr to FCB + ld c,23 ; Rename + call bdos + inc a ; Set zero flag if error +rnxit: + jp z,noflerr ; EH print no source file message +rnxit1: + jp exit + +; End RCPREN.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpsp.lib b/Source/BPBIOS/Z34RCP11/rcpsp.lib new file mode 100644 index 00000000..0fc5ecf6 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpsp.lib @@ -0,0 +1,163 @@ + page + +; Library: RCPSP for Z34RCP +; Author: Carson Wilson +; Version: 1.2 +; Date: August 11, 1989 +; Changes: CRSPACE does nothing if QUIET is true. +; +; Author: Carson Wilson +; Version: 1.1 +; Date: December 30, 1988 +; Changes: Calls CPMVER common routine. +; Sets DMA to TBUFF for CP/M Plus in case we chained to SP. + +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Command: SP +; Function: Shows space remaining on designated drive +; Syntax: SP [DIR:|DU:] +; Comments: This code can be called by several other RCP commands so that +; they can show the space remaining on the disk after their +; operation. + +; Now works with CP/M Plus. + + if [erasp or cpsp or dirsp] +crspace: ; Used to call space after other subroutines + ld a,(quiet) + or a ; Skip if we're being quiet + ret nz + call crlf ; Start new line + jr space0 ; Skip directory check + endif ;[erasp or cpsp or dirsp] +space: + call dirchek ; Abort to EH on bad dirspec +space0: ld a,(fcb1) ; Determine requested drive + or a ; If drive explicitly selected + jr nz,space1 ; ..then skip + ld a,(cdrv) ; Get current drive from ZCPR 3.4 + inc a ; Shift to range 1..16 + +space1: + dec a ; Shift to range 0..15 + ld e,a ; Save in E for selecting disk below + add a,'A' ; Convert to letter and + ld (seldrv),a ; save in message string below + ld c,14 ; BDOS select disk function + call bdos ; Not needed if no drive selected, but smallest + ; ..possible code size this way. + +; Here we extract the following disk parameter information from the disk +; parameter block (DPB): +; BLKSHF: block shift factor (1 byte) +; BLKMAX: max number of blocks on disk (2 bytes) + + call cpmver ; What BDOS is running? + jr nc,isplus + ld c,31 ; BDOS get disk parameters function + call bdos + inc hl ; Advance to block shift factor byte + inc hl + ld a,(hl) ; Get value and + ld (blkshf),a ; ..save it in code below + inc hl ; Advance to max block number word + inc hl + inc hl + ld e,(hl) ; Get value into HL + inc hl + ld d,(hl) + inc de ; Add 1 for max number of blocks + +; Compute amount of free space left on disk + +dfree: + ld c,27 ; BDOS get allocation vector function + push de ; Save BLKMAX value + call bdos ; Get allocation vector into HL + ld b,h ; Copy allocation vector to BC + ld c,l + pop hl ; Restore BLKMAX value to HL + ld de,0 ; Inititialize count of free blocks + +; At this point we have +; BC = allocation vector address +; DE = free block count +; HL = number of blocks on disk + +free1: push bc ; Save allocation address + ld a,(bc) ; Get bit pattern of allocation byte + ld b,8 ; Set to process 8 blocks +free2: rla ; Rotate allocated block bit into carry flag + jr c,free3 ; If set (bit=1), block is allocated + inc de ; If not set, block is not allocated, so + ; ..increment free block count +free3: ld c,a ; Save remaining allocation bits in C + dec hl ; Count down number of blocks on disk + ld a,l ; See if we are down to zero + or h + jr z,free4 ; Branch if no more blocks to check + ld a,c ; Get back current allocation bit pattern + djnz free2 ; Loop through 8 bits + pop bc ; Get pointer to allocation vector + inc bc ; Point to next allocation byte + jr free1 ; Continue by processing next allocation byte + +free4: pop bc ; Clean up stack + ex de,hl ; Free block count to HL +blkshf equ $+1 ; Pointer for in-the-code modification + ld a,0 ; Get block shift factor + sub 3 ; Convert to log base 2 of K per block + jr z,free6 ; Done if single density (1k per block) + +; Convert for blocks of more than 1K each + +free5: add hl,hl + dec a + jr nz,free5 + +; At this point HL = amount of free space on disk in K + +; Display decimal value of HL + +free6: ld b,0 ; Initialize count of digits already printed + ld de,10000 ; Divisor in DE + call decdsp ; Print digit (or space if leading '0') + ld de,1000 + call decdsp + call decdsp3 ; Display hundreds, tens, and units + + call print + db 'k free on ' +seldrv: db 0 ; Modified above to contain drive letter + db ':'+80h + ret + +; CP/M Plus free space calculation + +isplus: ld de,tbuff ; We may have chained to SP + call setdma + ld a,(seldrv) ; Get drive letter + sub 'A' ; Convert to BDOS call value + ld e,a + ld c,2eh ; Get free space call + call bdos + +; Convert 3 byte count of records to K + + ld b,3 ; Total amount to shift +c3fre1: ld hl,tbuff+2 ; Point to buffer start + rr (hl) + dec hl + rr (hl) + dec hl + rr (hl) + djnz c3fre1 + ld hl,(tbuff) ; Get free mod 65536k + jr free6 + +; End RCPSP.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/rcpsubs.lib b/Source/BPBIOS/Z34RCP11/rcpsubs.lib new file mode 100644 index 00000000..3879e9a2 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/rcpsubs.lib @@ -0,0 +1,1057 @@ + page + +; Library: RCPSUBS for Z34RCP +; Author: Carson Wilson +; Version: 1.4 +; Date: October 4, 1989 +; Changes: Added modifications by Rob Friefeld for CLED. +; +; Version: 1.3 +; Date: Sept. 8, 1989 +; Changes: Added ERREX1 routine. RCP now sets bit 4 of the command +; status flag on ambiguous file name errors. Intelligent +; error handlers can interpret this bit and chain to +; more sophisticated transient programs of the same name, +; much the same as CP/M Plus. +; +; Version: 1.2 +; Date: August 12, 1989 +; Changes: Added QPLUG and UNPLUG routines for QUIET operation. + +; Author: Carson Wilson +; Version: 1.1 +; Date: December 30, 1988 +; Changes: Added CPMVER routine to detect CP/M Plus. +; Expanded ZSDOS datestamp buffer to full 128 bytes. +; Now gets CCP address from Z34CMN.LIB instead of calculating +; it from BIOS address, since NZCOM allows nonstandard length +; CCP segments (suggested by Howard Goldstein). + +; Author: Carson Wilson +; Version: 1.0 +; Date: June 15, 1988 +; +; Subroutines for Z34RCP.Z80 + +; ---------------------------------------- + +; Routines to chain to Error Handler (EH) + +; 1. Error codes (from ZCPR34.LBR) + +; ZCPR34 uses the error byte at the beginning of the message buffer as a flag +; to show what kind of error occurred. Advanced error handlers will be able +; to help the user further by suggesting the possible cause of the error. + +ecbaddir equ 2 ; Bad directory specification -- logging of + ; ..user number beyond legal range, + ; ..nonexistent named directory +ecambig equ 8 ; Ambiguous file specification where not + ; ..allowed (SAVE, GET, REN) +ecbadnum equ 9 ; Bad numerical value -- not a number where + ; ..number expected, number out of range +ecnofile equ 10 ; File not found -- REN, TYPE, LIST could not + ; ..find a specified file +ecdiskfull equ 11 ; Disk directory or data area full + ; ..(DOS write error) +ectpafull equ 12 ; TPA overflow error +ecdupspec equ 16 ; Duplicate filespecs (COPY, RENAME) + +; 2. Error Routines + + if cpon or renon or lton or proton +NoFlErr: ; File missing + ld a,ecnofile ; File not found error + jr errexit ; Chain to error handler + endif ; cpon or renon or lton or proton + + if cpon +FulErr: ; Disk or directory full (BDOS write error) + ld a,ecdiskfull ; Disk or data area full + jr errexit ; Chain to error handler +DupErr: ; Duplicate file specs + ld a,ecdupspec ; Duplicate filespec error + jr errexit ; Chain to error handler + endif ; cpon +; +; Check for illegal directory specification under ZCPR 3.4. +; DirChek assumes that FCB's have not been altered since they were +; set by the CCP. Therefore DirChek is called before other BDOS calls. + + if cpon or lton or renon or diron or eraon or proton or reson or spaceon +DirChek: + ld a,(fcb1+15) ; Z34 sets these to non zero + ld hl,fcb2+15 ; ..if illegal dirspecs. found + or (hl) + ret z ; Return if OK + ld a,ecbaddir ; Bad dir. error code +; fall thru + endif +; +; Set error type, then set error, ECP, and external program bits of command +; status flag to tell CCP to go straight to EH. + +ErrExit: + ld b,0 +ErrEx1: ld ix,z3msg ; Point to message buffer + ld (ix+0),a ; First set error type in error byte + ld a,00001110b ; Tell CCP External, No ECP, Error, No shell + or b ; Add any specified bits + ld (ix+3),A ; Set bits in command status flag + jp exit ; Return to CCP + +; ------------------------------------------------------------- + +; Routine to get wheel byte - Returns wheel in A with flags set + +getwhl: + push hl + ld hl,(z3whl) ; Get wheel address from ENV + ld a,(hl) ; Read wheel byte + and a ; Set flags + pop hl + ret + +; ------------------------------ + + if systime ; Time in CLED prompt +; +; PMBCD - Print byte at (HL) to console as 1 or 2 BCD digits. +; +; Entry: A = 80h for leading zero's +; A = 0h for no leading zero's +; +pmbcd: + rld ; Get hi nibble (HL) to low nibble A + or a ; For HD64180 + call nz,decout ; Display if low or high of A not zero + rld ; Get low nibble (HL), from above +decout: + and 00001111b ; Mask high nibble + add a,'0' ; Convert to character + jr conout + endif ; systime + +; Display decimal digit routines + +; Display hundreds, tens, and units digits (assumes flag in B has been set) + + if regon or spaceon +decdsp3: + ld de,100 ; Display hundreds + call decdsp +decdsp2: + ld de,10 ; Display tens + call decdsp + ld a,l ; Get remaining units value +decdsp4: + add a,'0' ; Convert to character + jr conout ; Print it and return + +; --------------------------------- + +; Routine to print any single digit + +; Actually, this routine displays the value of HL divided by DE and leaves the +; remainder in HL. In computing the character to display, it assumes that the +; result of the division will be a decimal digit. If the result is zero, the +; value in the B register, which is the number of digits already printed, is +; checked. If it is zero, a space is printed instead of a leading '0'. If it +; is not zero, the '0' is printed. Whenever any digit (not a space) is +; printed, the value in B is incremented. + + +decdsp: + ld c,'0'-1 ; Initialize digit count + xor a ; Clear carry flag + +decdsp1: + inc c ; Pre-increment the digit + sbc hl,de ; Subtract DE from HL + jr nc,decdsp1 + + add hl,de ; Add back in to produce remainder + ld a,c ; Get decimal digit + cp '0' ; Check for leading 0 + jr nz,decdout ; If not 0, proceed to display it + ld a,b ; Digit printed already? + or a + jr z,spac ; Print leading space if not +decdout: + ld a,c ; Else print real digit + inc b ; Indicate digit printed + jr conout + endif ; regon or spaceon + +; ------------ + +; Print a dash + + if lton or peekon +dash: call print + db ' -',' '+80h + ret + endif ; Lton or peekon + +; ------------------------- + +; Shut off output in QUIET is set. Return Z if QUIET, NZ otherwise. +; Uses: AF + +qplug: + ld a,(quiet) + or a + ret z + ld a,0C9h ; "RET" +qplug1: ld (plug),a + ret + +; -------------------------- + +; Turn on output + +unplug: xor a + jr qplug1 + + +; ------------- + +; Print a space + +spac: ld a,' ' + +; fall thru + +; Console Output Routine + +conout: +plug: db 00h ; Goes to 0C9h to turn off output + putreg ; Save all registers except AF + push af ; Save AF, too + and 7fh ; Mask out MSB + ld e,a ; Transfer character to E + ld c,2 ; BDOS conout function number + call bdos + pop af + getreg ; Restore registers +note: ; Use this RET for NOTE command + ret + +; ------------------------ + +; String printing routines + +; Print string following call (terminated with null or character with the +; high bit set) + +print: + ex (sp),hl ; Get address + call printhl + ex (sp),hl ; Put address + ret + + if whlon or quieton +; +; Routine to say "On" if A is non-zero or "Off" if A is zero. +; Called by WHL and Q commands. + +onmsg: + dc ' On' +offmsg: + dc ' Off' +tella: + ld hl,offmsg ; Prepare to say Off + or a + jr z,printhl ; Say it if A=0 + ld hl,onmsg ; Say On + +; fall thru ; Display message and return + + endif ; whlon or quieton + +; Print string pointed to by HL (terminated with null or character with the +; high bit set) + +printhl: + ld a,(hl) ; Get next character + inc hl ; Point to following one + or a ; See if null terminator + ret z ; If so, we are done + call conout ; Display the character + ret m ; We are done if MSB is set (negative number) + jr printhl ; Back for more + +; ------------------------ + +; Output new line to CON: + +crlf: + call print + db cr,lf+80h + ret + +; Console input + + if eraon or lton or proton or renon or cpon +conin: + push hl ; Save regs + push de + push bc + ld c,1 ; Input + call bdos + pop bc ; Get regs + pop de + pop hl + and 7fh ; Mask msb + cp 61h + ret c + and 5fh ; To upper case + ret + endif ; Eraon or lton or proton or renon or cpon + +; ------------------- + +; Save return address + +retsave: + pop de ; Get return address + pop hl ; Get return address to zcpr3 + ld (z3ret),hl ; Save it + push hl ; Put return address to zcpr3 back + push de ; Put return address back + ret + +; ------------------------------- + +; Test file pted to by HL for R/O +; NZ if R/O + + if renon or cpon or eraon +rotest: + push hl ; Advance to r/o byte + ld bc,8 ; Pt to 9th byte + add hl,bc + ld a,(hl) ; Get it + and 80h ; Mask bit + push af + ld hl,romsg + call nz,printhl ; Print if nz + pop af ; Get flag + pop hl ; Get ptr + ret +romsg: + db ' is R/','O'+80h + +; ----------------------------------------------- + +; Check user to see if he approves erase of file +; Return with Z if yes + +eraq: + call print + db ' - Eras','e'+80h + endif ; Renon or cpon or eraon + + if renon or cpon or eraon or proton +eraq1: + call print + db ' (Y/N/Q)? N',88h ; 88h = backspace + call conin ; Get response + cp 'Q' ; Quit command? + jr z,exit + cp 'Y' ; Key on yes + ret + endif ; Renon or cpon or eraon or proton + +; ------------------------------------- + +; Give space on current disk and return + + if spaceon and [dirsp or cpsp or erasp or resetsp] +spaexit: + call crspace ; Show space remaining +; fall thru + endif ; spaceon and [dirsp or cpsp or erasp or resetsp] + +; +; Exit to ZCPR3 +; +exit: +z3ret equ $+1 ; Pointer to in-the-code modification + ld hl,0 ; Return address + jp (hl) ; Goto ZCPR3 + +; -------------------------------------------------------- + +; Check for user input; if ^X, return with Z, abort if ^C + + if diron or lton or eraon or proton or peekon +break: + push hl ; Save regs + push de + push bc + ld c,11 ; Console status check + call bdos + or a + ld c,1 ; Get char if any + call nz,bdos + pop bc ; Restore regs + pop de + pop hl +break1: cp ctrlc ; Check for abort + jr z,exit ; Exit + cp ctrlx ; Skip? + ret + endif ; Diron or lton or eraon or proton or peekon + +; --------------------- + +; Print address in DE + + if peekon or pokeon +adrat: + call print + db ' at',' '+80h + ld a,d ; Print high + call pahc + ld a,e ; Print low + jp pahc + endif ; Peekon or pokeon + +; -------------------------------------------------- + +; Extract hexadecimal number from line pted to by HL +; Return with value in DE and HL pting to offending char + + if peekon or pokeon or porton +hexnum: + ld de,0 ; De=accumulated value +hnum1: + ld a,(hl) ; Get char + cp ' '+1 ; Done? + ret c ; Return if space or less + inc hl ; Pt to next + sub '0' ; Convert to binary + jr c,numerr ; Return and done if error + cp 10 ; 0-9? + jr c,hnum2 + sub 7 ; A-f? + cp 10h ; Error? + jr nc,numerr +hnum2: + push hl ; Save pointer + ex de,hl + add hl,hl + add hl,hl + add hl,hl + add hl,hl ; De x16 to hl + ld e,a + ld d,0 + add hl,de + ex de,hl ; De = de * 16 + a + pop hl ; Get the pointer + jr hnum1 ; Try again +; +; Number error +; +numerr: + ld a,ecbadnum ; Numeric error + jp errexit ; Chain to error handler + +; Skip to next non-blank + +sksp: + ld a,(hl) ; Get char + inc hl ; Pt to next + cp ' ' ; Skip spaces + jr z,sksp + dec hl ; Pt to good char + or a ; Set eol flag + ret + endif ; Peekon or pokeon or porton + +; ------------------------------------------------------------------------ + +; Test File in FCB for unambiguity and existence, ask user to delete if so +; Return with Z flag set if R/O or no permission to delete + + if renon or cpon +extest: + call ambchk ; Ambiguous file names not allowed + call searf ; Look for specified file + jr z,exok ; Ok if not found + call getsbit ; Position into dir + inc de ; Pt to file name + ex de,hl ; Hl pts to file name + push hl ; Save ptr to file name + call prfn ; Print file name + pop hl + call rotest ; Check for r/o + jr nz,exer + call eraq ; Erase? + jr nz,exer ; Restart as error if no + ld de,fcb1 ; Pt to fcb1 + ld c,19 ; Delete file + call bdos +exok: xor a + dec a ; Nz = ok + ret +exer: + xor a ; Error flag - file is r/o or no permission + ret + +; Check for ambiguous file name in FCB1 +; Return z if so + +ambchk: + ld hl,fcb1+1 ; Pt to fcb + +; Check for ambiguous file name pted to by HL + +ambchk1: + push hl + ld b,11 ; 11 bytes +amb1: ld a,(hl) ; Get char + and 7fh ; Mask + cp '?' + jr z,amb2 + inc hl ; Pt to next + djnz amb1 + dec b ; Set nz flag + pop de + ret +amb2: + pop hl ; Pt to file name + ld a,ecambig ; Ambiguous name error + ld b,00010000b ; Bit 4 tells EH to load transient + jp ErrEx1 ; Chain to error handler + endif ; Renon or cpon + +; --------------------------------------- + +; Init FCB1, return with DE pting to FCB1 + + if eraon or lton or cpon +initfcb1: + ld hl,fcb1 ; Pt to fcb +initfcb2: + push hl ; Save ptr + ld bc,12 ; Pt to first byte + add hl,bc + ld b,24 ; Zero 24 bytes + xor a ; Zero fill + call fillp ; Fill memory + pop de ; Pt to fcb + ret + endif ; Eraon or lton or cpon + +; Fill a region with byte in A + + if eraon or lton or cpon or diron +fillp: + ld (hl),a ; Store byte + inc hl ; Pt to next + djnz fillp ; Count down + ret + endif ; Eraon or lton or cpon or diron + +; --------------------------------------------------------------------- + +; After a search, return NZ set if desired type of file found, Z if not. +; This algorithm looks at the system bit of the located file; this +; bit is set to 1 if the file is a system file and 0 if not a system +; file. The following exclusive or masks are applied to return Z or NZ +; as required by the calling routine: +; +; SYSTEM BYTE: X 0 0 0 0 0 0 0 (AFTER 80H MASK, X=1 IF SYS, 0 IF DIR) +; +; SYS-ONLY : 0 0 0 0 0 0 0 0 (XOR 0 = 0 if X=0, = 80H if X=1) +; DIR-ONLY : 1 0 0 0 0 0 0 0 (XOR 80H = 80h if X=0, = 0 if X=1) +; BOTH : 0 0 0 0 0 0 0 1 (XOR 1 = 81H or 1H, NZ in both cases) + + if diron or eraon or lton or proton or cpon or renon +getsbit: + dec a ; Adjust to returned value + rrca ; Convert number to offset into tbuff + rrca + rrca + and 60h + ld de,tbuff ; Pt to buffer + add a,e ; Add entry offset to base addr + ld e,a ; Result in e + push de ; Save ptr in de + add a,10 ; Add offset of 10 to pt to system byte + ld e,a ; Set address + ld a,(de) ; Get byte + pop de ; Get ptr in de + and 80h ; Look at only system bit +systst equ $+1 ; In-the-code variable + xor 0 ; If systst=0, sys only; if systst=80h, dir + ; Only; if systst=1, both sys and dir + ret ; Nz if ok, z if not ok + +; Log into user area contained in FCB1 + +logusr: + ld a,(fcb1+13) ; Get user number +setusr: + ld e,a + ld c,32 ; Use bdos fct + jp bdos + +; Print file name pted to by HL + +prfn: + call spac ; Leading space + ld b,8 ; 8 chars + call prfn1 + call print + db '.'+80h ; Dot + ld b,3 ; 3 chars +prfn1: ld a,(hl) ; Get char + inc hl ; Pt to next + call conout ; Print char + djnz prfn1 ; Count down + ret + +; Search for first + +searf: + push bc ; Save counter + push hl ; Save hl + call dirchek ; Check bad dirspec + ld c,17 ; Search for first function +searf1: ld de,fcb1 ; Pt to fcb + call bdos + inc a ; Set zero flag for error return + pop hl ; Get hl + pop bc ; Get counter + ret + endif ; Diron or eraon or lton or proton or cpon or renon + +; ------------------------- + +; Copy HL to DE for B bytes + + if diron or eraon or lton or proton or cpon +blkmov: + ld a,(hl) ; Get + ld (de),a ; Put + inc hl ; Pt to next + inc de + djnz blkmov ; Loop + ret + endif ; Diron or eraon or lton or proton or cpon + +; ----------------------------- + +; Print file not found message + + if diron or eraon +prfnf: + call print + db ' No File','s'+80h + jp exit + endif ; Diron or eraon + +; ------------------------------------------------------------------ + +; Define buffers as high as possible in TPA for the following groups +; of commands: +; +; COPY needs SRCFCB, CBUFF, STPBUF (if STPCALL) +; ERA, PROT, LIST/TYPE need DIRBUF and NXTFILE +; DIR needs DIRBUF +; +; If DIRBUF is defined, its value is in HL on return from this code. The DE +; register pair is not changed by the code, but the BC pair is affected. + +dirbufon equ lton or eraon or proton or diron + + if dirbufon +dirbuf: ds 2 ; Address for directory buffer + endif ; dirbufon + + if lton or eraon or proton +nxtfile: ds 2 ; Ptr to next file in list + endif ; eraon or lton or proton + + if cpon or dirbufon or cledon +define: + push de + ld hl,(bdos+1) ; Get bottom of BDOS + ex de,hl ; ..into DE + ld hl,(ccp) ; From Z34CMN.LIB + +; Now we have to compare and pick the lower address as the top of TPA + + push hl ; Save CPR address while comparing + xor a ; Clear the carry flag + sbc hl,de ; Compute (CPR-BDOS) + pop hl ; Restore CPR address + jr c,define1 ; Branch if BDOS address is higher (use CPR) + ex de,hl ; Otherwise use BDOS address +define1: + if cpon + ld de,-36 ; Calculate place for SRCFCB for copy command + add hl,de + ld (srcfcb),hl + + if stpcall + ld de,-128 + add hl,de ; Buffer for datestamps + ld (stpbuf),hl + endif ; stpcall + + if dirbufon + push hl ; Save if needed below + endif ; dirbufon + + ld de,-[cpblocks*128] ; CBUFF can use same space as DIRBUF + add hl,de + ld (cbuff),hl + + if dirbufon + pop hl + endif ; dirbufon + + endif ; cpon + + if dirbufon + ld de,-[maxdirs*11] ; Space for directory buffer + add hl,de + ld (dirbuf),hl + endif ; dirbufon + + pop de + ret + + endif ; cpon or dirbufon or cledon + +; --------------- + +; Search for next + + if diron or eraon or lton or proton +searn: + push bc ; Save counter + push hl ; Save hl + ld c,18 ; Search for next function + jr searf1 + +; Load directory and sort it +; On input, A=SYSTST flag (0=SYS, 1=DIR, 80H=BOTH) +; Directory is loaded into buffer at top of TPA +; Return with ZERO set if no match and HL pts to 1st entry if match + +direrr: + ld a,ectpafull ; Chain to error handler + jp errexit + +getdir: + ld (systst),a ; Set system test flag + call logusr ; Log into user area of fcb1 + call define ; Define buffer addresses + ld (hl),0 ; Set empty + ld bc,0 ; Set counter + call searf ; Look for match + ret z ; Return if not found + +; Step 1: Load directory + +gd1: + push bc ; Save counter + call getsbit ; Check for system ok + pop bc + jr z,gd2 ; Not ok, so skip + push bc ; Save counter + inc de ; Pt to file name + ex de,hl ; Hl pts to file name, de pts to buffer + ld b,11 ; Copy 11 bytes + call blkmov ; Do copy + pop bc ; Get counter + inc bc ; Increment counter + ld hl,maxdirs-1 ; See if count equals or exceeds MAXDIRS + ld a,b ; Check high bytes + sub h + jr c,gd1a ; If carry set, we are OK + ld a,c ; Check low bytes + sub l + jr nc,direrr ; If no carry, jump to error message +gd1a: ex de,hl ; Hl pts to next buffer location +gd2: call searn ; Look for next + jr nz,gd1 + ld (hl),0 ; Store ending 0 + ld hl,(dirbuf) ; Pt to dir buffer + ld a,(hl) ; Check for empty + or a + ret z + +; Step 2: Sort directory + + if dsort + push hl ; Save ptr to dirbuf for return + call diralpha ; Sort + pop hl + endif + + xor a ; Set nz flag for ok + dec a + ret + + +; DIRALPHA -- Alphabetizes directory in DIRBUF; BC contains +; the number of files in the directory +; + if dsort +diralpha: +; +; SHELL SORT -- +; This sort routine is adapted from "Software Tools" +; by Kernigan and Plaugher, page 106. Copyright, 1976, Addison-Wesley. +; + ld h,b ; Hl=bc=file count + ld l,c + ld (num),hl ; Set "NUM" + ld (gap),hl ; Set initial gap to n for first division by 2 + +; For (gap = num/2; gap > 0; gap = gap/2) + +srtl0: +gap equ $+1 ; Pointer for in-the-code modification + ld hl,0 ; Get previous gap + or a ; Clear carry + rr h ; Rotate right to divide by 2 + rr l + + ld a,l ; Test for zero + or h + ret z ; Done with sort if gap = 0 + + ld (gap),hl ; Set value of gap + push hl + pop ix ; Set ix=gap for following loop + +; For (ix = gap + 1; ix <= num; ix = ix + 1) + +srtl1: + inc ix ; Add 1 to ix + push ix + pop de ; IX is in DE + +; Test for ix <= num + +num equ $+1 ; Pointer for in-the-code modification + ld hl,0 ; Number of items to sort + ld a,l ; Compare by subtraction + sub e + ld a,h + sbc a,d ; Carry set means ix > n + jr c,srtl0 ; Don't do for loop if ix > n + ex de,hl ; Set jj = ix initially for first + ; ..subtraction of gap + ld (jj),hl + +; For (jj = ix - gap; jj > 0; jj = jj - gap) + +srtl2: + ld de,(gap) +jj equ $+1 ; Pointer for in-the-code modification + ld hl,0 ; Get jj + + sbc hl,de ; Compute JJ - GAP + ld a,h + ld (jj),hl ; Jj = jj - gap + jr c,srtl1 ; If carry from subtractions, jj < 0 and abort + or l ; Jj=0? + jr z,srtl1 ; If zero, jj=0 and abort + +; Set iy = jj + gap + + ex de,hl ; Jj in de + ld hl,(gap) ; Get gap + add hl,de ; Jj + gap + push hl + pop iy ; IY = iy + gap + +; If (v(jj) <= v(iy)) + + call icompare ; JJ in de, iy in hl + +; ...then break + + jr c,srtl1 + +; ...else exchange + + ld de,(jj) ; Swap jj, iy + push iy + pop hl + call iswap ; Jj in de, iy in hl + +; End of inner-most for loop + + jr srtl2 + +; +; SWAP (Exchange) the elements whose indexes are in HL and DE +; +iswap: + call ipos ; Compute position from index + ex de,hl + call ipos ; Compute 2nd element position from index + ld b,11 ; 11 bytes to flip + endif ; Dsort + endif ; Diron or eraon or lton or proton + + if diron or eraon or lton or proton or renon or (cpon and leftright) +iswap1: + ld a,(de) ; Get bytes + ld c,(hl) + ex de,hl + ld (de),a ; Put bytes + ld (hl),c + inc hl ; Pt to next + inc de + djnz iswap1 + ret + endif ; Diron or eraon or lton or proton or renon + ; ..or (cpon and leftright) + + if leftright and (cpon or renon) +; +; FCBSWAP exchanges 16 byte FCB1 with FCB2 from the command line. +; This allows COPY and REN commands to execute left to right, +; e.g., "cp source dest". Costs 10 bytes. +; +; If TESTEQ is true, then commands containing '=' still execute right +; to left, e.g., "cp dest=source". Costs 11 bytes additional. +; +fcbswap: + if testeq + xor a ; Zero B + ld b,a + ld hl,80h ; Point to command line, length + ld c,(hl) ; Set up for CPIR + ld a,'=' ; Search for '=' + cpir ; '=' found in command? + ret z ; Yes, don't swap + endif ; Testeq + + ld de,fcb1 ; Point to command fcb's + ld hl,fcb2 + ld b,16 ; Exchange them + jr iswap1 + endif ; leftright and (cpon or renon) + + if diron or eraon or lton or proton + if dsort +; +; ICOMPARE compares the entry pointed to by the pointer pointed to by HL +; with that pointed to by DE (1st level indirect addressing); on entry, +; HL and DE contain the numbers of the elements to compare (1, 2, ...); +; on exit, Carry Set means ((DE)) < ((HL)), Zero Set means ((HL)) = ((DE)), +; and Non-Zero and No-Carry means ((DE)) > ((HL)) +; +icompare: + call ipos ; Get position of first element + ex de,hl + call ipos ; Get position of 2nd element + ex de,hl +; +; Compare dir entry pted to by HL with that pted to by DE; +; No net effect on HL, DE; ret w/CARRY set means DE2Ziw#n@L`+ePQ zzE*olb`c15)vKyk)m3GG3j9fAMUNDEWQX_n;VgKhMeI7{xSl`r6F;2Az3!()&8b>Z zv&m~J@}*$ng`V@Gpe_5xiPbgVE{hi`Sh?P_HHXDcRBOSuHE~wwTu@Vy;4C9nW-!Xj z2EQS2_$C`ptEwof=e%4~##ecnH+fao^vngP6e^xJJfr0c&~?7uAr$|s5iD(_MYG{s zT8U~)Pxd?-)4s_IIN-JPKQBN4{y8sz;an17StkG5Z0bglYAT@9YP;oSLscog(oXOd z7XqPAtmt_IR=@%Pb_~Cof9HY~#Q)sq-&vs@AUsX>+nsa-wBXx&+OH)Oy{>vBR0yQO?a?_iJ=Ij-)nfb>m)lzL?q5_V~Wn4g5H1PbjS8 zpIPEQ=Fw!~wdxz`=yWuVUKdf0)+XY9aidw-!c7_2jork#^E59655imj$P>}SxqCb! zyd8wGd$33NI0Dtf`J+A`@z=es8(Am3JFo%53haXbbgU#f78c=d-DGY>_d44#;>EXEIY$H{0@0cqo;O9u zt$9QH8fygO#)uCDUlS&6kG8|wn#WHqe60CIM`xh(-}=YOGQqLmbpM3$ZxfVK-IHM$ zl3K0%Y>6#1MCaP}JaA_UaIFED0nBC7r5R?t{(*zTV2V#y|R8fu(2+5yE3MF6^%jNlFcjTrh_elo*P+b%8cfRO#l& z7aLiz?faLT4J*M;qCkh}Tm3=*_r4a{Dr(P+&id|| zNGIF(&O~?G@a{|$X;E}0(l^?Vl}Iso2tDr*{6QN$oEbc6(Nim$Xa~l%?9$;-K56P5 zOI4R9mTnB=Mk^b(l#T;U*08j+$V*&5&!h_LMXi5ZtMJI$9#pm_Z#Y_&GJ$o!=6K#W zdr>OFmYxW+<&v^8<%QI^ScB59X>Alsx6B6BYOu-+j5d_^)Y9I~mJ^9Xp%gmw|dr!etJUGP<-)w<%++BvC(%%s=-^_Tzi F^EdOcj^6+P literal 0 HcmV?d00001 diff --git a/Source/BPBIOS/Z34RCP11/z34cmn.lib b/Source/BPBIOS/Z34RCP11/z34cmn.lib new file mode 100644 index 00000000..ad8c8cec --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/z34cmn.lib @@ -0,0 +1,105 @@ +; +; Library: Z34CMN.LIB +; Author: Carson Wilson +; Version: 1.2 +; Date: 16 June 1988 +; Changes: Renamed CRT0 to LINS for NZCOM compatibility. +; Added CUSR " " " + +; Author: Carson Wilson +; Version: 1.1 +; Date: 12 June 1988 +; Changes: Added CDRV for various Z34RCP commands. +; Added CRT0 for Z34RCP TYPE command. +; Added Z3TCAP and CLRSCR for Z34RCP CLS command. +; Added QUIET for ZCPR34 time in prompt. +; Added RSDMSG for ZCPR34 time in prompt. + +; Library: Z34CMN.LIB +; Author: Joe Wright +; Date: 23 March 1988 + +; As a replacement for Z3BASE.LIB, some usual equates. + +base equ 0 ; Base Page + +false equ 0 +true equ not false + +no equ false +yes equ true + +off equ false +on equ true + +; Named COMMON declarations start here. For compatibility, these +; are the same names used by Bridger Mitchell's JetLDR. + + common /_ENV_/ +z3env: ; Z3 Environment descriptor +z3envs equ yes ; There is one + +expath equ z3env+9 ; Address of External Path +expaths equ 10 ; Maximum 10 elements for MPATH + +rcp equ z3env+0ch ; Address of RCP +rcps equ yes ; Used as existence test, not size + +fcp equ z3env+12h ; Address of FCB +fcps equ yes ; Used as existence test, not size + +z3ndir equ z3env+15h ; Address of NDR +z3ndirs equ yes ; Used as existence test, not size + +quiet equ z3env+28h ; Quiet flag address + +z3whl equ z3env+29h ; Wheel byte address +z3whls equ yes ; There is a wheel + +lins equ z3env+33h ; CRT text lines address + +ccp equ z3env+3fh ; CCP entry +ccps equ z3env+41h ; Size + +dos equ z3env+42h ; DOS entry (+6) +doss equ z3env+44h ; Size + +bio equ z3env+45h ; BIO entry + +z3tcap equ z3env+80h ; TCAP address + +clrscr equ z3env+97h ; Clear screen string address + + common /_SSTK_/ +shstk: ; Top of Shell stack +shstks equ yes ; There is a shell stack + + common /_MSG_/ +z3msg: ; Message buffer +z3msgs equ yes ; There is one + +cusr equ z3msg+2eh ; Current user +cdrv equ z3msg+2fh ; Current drive + +rsdmsg equ z3msg+3ah ; Reserved bytes + + common /_FCB_/ +extfcb: ; External file control block +extfcbs equ yes ; There is one + + common /_MCL_/ +z3cl: ; Multiple command line +z3cls equ yes ; There is one + + common /_XSTK_/ +extstk: ; External stack +extstks equ yes ; There is one + + common /_BIOS_/ +bios: + + cseg ; Select Code Segment + +; End of Z34CMN.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/z34defn.lib b/Source/BPBIOS/Z34RCP11/z34defn.lib new file mode 100644 index 0000000000000000000000000000000000000000..683fc32215df2f25c9bdeae6d120c5596ce38d75 GIT binary patch literal 1664 zcmb_c%W@kb5X@Do(huasC&W_h9DK4BA96_Il9H-aZY&Qi_Fc5>8IS`NcxK#>MU8p8U*G z5)4T^L?FXCfE0wr2GrekI;orw1P(i~rOt~S^`@5#9o(5%qjX4Fc2Ca_yZuv6;2G7J zVZH8Bw0BZJ`|ZPze1jc%xzN|n%<)JyCxH%A?z1)q79555^dQI(r4%k3q{U1)4YXLo zxI2}&a)e5@(K)DraHme_1&iJlg&47T7ca&0bZ7tj@%y)51X!)~fyjv-vhK~tq1iBTQK=!L@_g(Mw;j=&mN2j9|L74-~ylGc{RYoHdR zC#ilIZH>}m^dvJ8_X6tA9rJ?G6CU%2R%5idc*2+sZ5sNHfUc2>HA;)YX;9dije@~uXE!%3a(QCoW3LK!)2Y5 zqQy9W|Dvp=VXQTF1orAjF-=Nl31l8xj2l2h@aIx$QnVPo048}}W3(8Z0EUgl&=R9! x^aGxRYG + + if not nul temp +flag defl flag shl 1 + if temp +flag defl flag or 1 + endif ;;temp + endif ;;not nul temp + + endm ;; irp + + defb low flag + + endm ;; optflag + +;----------------------------------------------------------------------------- + +; Command table entry definition macro + +; Macro to form an entry for one command in the table. The first parameter is +; the name to be used for the command (no quotes); the second parameter is the +; flag that indicates whether or not the command is to be enabled; the third +; parameter is the wheel control flag; and the last parameter is the jump +; address to the code that carries out the command. The command names are +; automatically padded out to the correct length (they will be truncated and +; an error message will result if a command name is too long). The characters +; in the command name are automatically converted to upper case. + +command macro cmdname,enableflag,wheelflag,address + + if enableflag ;; Generate command only if enabled + +whlmask defl wheelflag ;; Initialize variables +count defl cmdsize ;; Initialize to size of each command name + + irpc char,cmdname ;; Repeat over letters in command name + +count defl count - 1 ;; Count down characters in name + + if [ count lt cmdsize ] + + ;; If character is lower case, convert to upper case + + if [ '&char' ge 'a' ] and [ '&char' le 'z' ] + + if whlmask + defb [ '&char' and 5fh ] + 80h + else ;;not whlmask + defb [ '&char' and 5fh ] + endif ;;whlmask + + else ;;not lower case + + if whlmask + defb '&char' + 80h ;; If controlled by wheel, set high bit + else ;;not whlmask + defb '&char' ;; If not restricted, leave high bit clear + endif ;;whlmask + + endif ;;lower case + + endif ;;[ count lt cmdsize ] + +whlmask defl false ;; Turn off high-bit setting after first char + + endm ;irpc + + ;; Pad command name with blanks + + if [ count gt cmdsize ] ;; If we underflowed + *** Command name "&cmdname" is too long / truncated *** + else + rept count + defb ' ' + endm + endif ;[ count gt cmdsize ] + + dw address ;; Dispatch address for command + + endif ;enable + + endm ;command + +; End Z33MAC.LIB + + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/z34rcp.lib b/Source/BPBIOS/Z34RCP11/z34rcp.lib new file mode 100644 index 00000000..74908d54 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/z34rcp.lib @@ -0,0 +1,515 @@ + +; File: Z34RCP.LIB +; Description: Resident Command Package (RCP) for ZCPR34 +; Version: 1.4 +; Author: Carson Wilson +; Date: October 4, 1989 +; Changes: Added PUSER0 equate suggested by Rob Friefeld. +; +; Version: 1.3 +; Author: Carson Wilson +; Date: September 29, 1989 +; Changes: Added CLED (Command Line Editor Shell) command options +; and equates. +; +; Version: 1.2 +; Author: Carson Wilson +; Date: August 11, 1989 +; Changes: Removed several "quiet" conditional assembly equates as +; we are now sensing the QUIET flag instead. +; Changed default of WHLQUIET to false. +; +; Version: 1.1 +; Author: Carson Wilson +; Date: July 10, 1989 +; Changes: Changed 'S' command name to 'SP'. +; Removed wheel protection from 'Q' command and set QQUIET +; on by default. +; Changed command order. + +; Version: 1.0 +; Author: Carson Wilson +; Date: June 15, 1988 + +; This is the configuration file for the ZCPR Version 3.4 resident command +; package. You should read through this file and set the equates according +; to the features you want to implement. Since most systems have a limited +; amount of space for the resident command package, it will probably be +; impossible to include all features. + +; If you are using an SLR or equivalent assembler, you will be prompted +; at assembly time for which commands to include in the RCP. + +;============================================================================= +; +; A S S E M B L Y O P T I O N S +; +;============================================================================= + +; SLR controls whether special pseudo-ops such as ".printx" and ".accept", +; and complex macros are used at assembly time. For SLR Systems or compatible +; macro assemblers, set this equate to true. + +SLR equ false + +; RCPTYPE is the final character of the RCP name in the H(elp) command, +; and determines the order in which commands are added. + + if SLR +Y equ true +N equ false +H equ 'H' +F equ 'F' + +.accept 'Enter "F" for floppy, "H" for fixed disk version: ',rcptype + else +rcptype equ 'H' ; Floppy disk version + endif ; SLR + +; ZRL controls whether named common labels are used in the code. To create +; absolute code, modify RCPBASE.LIB to reflect your system's addresses, set +; ZRL to false and instruct your assembler to generate absolute code (either +; a .COM or .HEX file). +; +; To create a relocatable file for use with Bridger Mitchell's JetLDR or +; Joe Wright's NZCOM, you must use an assembler which recognizes named +; common blocks. If your assembler has this capability, set ZRL to true +; and instruct the assembler to generate relocatable (.REL) code. + +ZRL equ true + +;============================================================================= +; +; M A C R O S +; +;============================================================================= + +; SLR assemblers allow selection of options during assembly. + + if SLR + +select macro option default comment + .accept comment,option ; Prompt user for selection + endm + + .printx + .printx Answer "Y" to include, "N" to exclude commands: + .printx + + else + +select macro option default comment +option equ default ; Use selections from file + endm + endif ; SLR + +;============================================================================= +; +; R E S I D E N T C O M M A N D S S E L E C T I O N +; +;============================================================================= + +; Commands to include in the resident command package + +; There are some interrelations between a number of the possible resident +; commands. Some are so close (LIST and TYPE) that a single equate controls +; both functions. Others like DIR and ERA share code (both display file +; listings). It is efficient to select or deselect them together. + +; If you are using an SLR or compatible assembler, you will be prompted +; at assembly time for command selections. Otherwise, select commands to +; be included by setting each SELECT macro below to yes or no. + +select CLEDON no 'CLED - command line editor shell? ' +select CLSON yes 'CLS - clear screen? ' +select RESON yes 'R - reset disk system? ' +select SPACEON yes 'SP - show space remaining on disk? ' + + if RCPTYPE='F' ; Assemble in floppy order +select DIRON yes 'D - disk directory? ' +select ERAON yes 'ERA - erase files? ' +select ECHOON yes 'ECHO - send text to screen or printer? ' +select RENON yes 'REN - rename files? ' +select CPON yes 'CP - copy file? ' +select LTON yes 'TYPE - display file on console? ' +select POKEON yes 'POKE - set memory? ' +select PEEKON yes 'PEEK - view memory? ' + else ; Assemble in fixed-disk order +select ECHOON yes 'ECHO - send text to screen or printer? ' +select POKEON yes 'POKE - set memory? ' +select PEEKON yes 'PEEK - view memory? ' +select QUIETON yes 'Q - set or clear quiet status? ' +select DIRON yes 'D - disk directory? ' +select ERAON no 'ERA - erase files? ' +select RENON no 'REN - rename files? ' +select CPON no 'CP - copy file? ' +select LTON yes 'TYPE - display file on console? ' + endif ; RCPTYPE='F' + + if LTON +select LISTON no 'LIST - list to printer? ' + else ; allowed only if TYPE is enabled +LISTON equ no + endif + + if RCPTYPE='F' ; Assemble in floppy order +select QUIETON yes 'Q - set or clear quiet status? ' + endif + +select PROTON no 'PROT - set file attributes? ' +select NOTEON no 'NOTE - command-line comment? ' +select REGON no 'REG - set and display user registers? ' +select WHLON no 'WHL - set or clear wheel status? ' +select PORTON no 'PORT - view and set I/O ports? ' + +;============================================================================= +; +; W H E E L P R O T E C T I O N +; +;============================================================================= + +; To prevent unauthorized users from performing certain dangerous or sensitive +; operations on the computer, ZCPR34 provides the capability of disabling the +; operation of certain commands when the wheel byte is off. In ZCPR30, an +; attempt to use one of these wheel-protected commands when the wheel byte was +; off resulted in an error message. In ZCPR34 things work differently. In the +; same situation, the command simply disappears. In this way a transient +; program or extended command processor function can take over and deal with +; the attempt to use the command in a much more flexible way. +; +; Wheel-protected commands in ZCPR30 had extra code to intercept the function +; and disable it. In ZCPR34, wheel protection is enabled and disabled in a +; different way. To wheel-protect a command the high bit of the first +; character in the command name is set. The command table scanner in ZCPR34 +; will not recognize these commands when the wheel byte is off. Since the same +; command scanner is used to scan the commands in the RCP and FCP (flow control +; package), commands there can be wheel protected in the same way. For skilled +; computer operators it is very easy to use a debugger, file patcher, or disk +; utility to enable and disable wheel protection without having to reassemble +; the CPR, RCP, or FCP. +; +; Because of the way the command scanner works, once wheel protection is +; implemented in the CCP, there is no further code penalty in protecting RCP +; commands. Therefore, we recommend protecting all possibly sensitive +; commands or none. + +wcled equ no ; CLED +wcp equ yes ; CP +wdir equ no ; DIR +wera equ yes ; ERA +wlist equ yes ; LIST +wpeek equ yes ; PEEK +wpoke equ yes ; POKE +wport equ yes ; PORT +wprot equ yes ; PROT +wquiet equ no ; QUIET +wreg equ yes ; REG +wren equ yes ; REN +wspop equ yes ; SPOP +wtype equ yes ; TYPE +whrc equ no ; H + +wheel defl wcp or wdir or wera or wlist or wpeek or wpoke or wport +wheel defl wheel or wprot or wreg or wren or wtype or whrc + +;============================================================================= +; +; C O M M A N D O P T I O N S +; +;============================================================================= + +; Options affecting several commands + +; DSORT includes code to sort file entries for the D, TYPE, LIST, ERA, +; and PROT commands. + +dsort equ yes + +; LEFTRIGHT affects the COPY and RENAME commands. If yes, add code to allow +; CP and REN operations work from left to right, and CP to accept a +; single filespec as its source. +; Examples: +; B0>ren b1:old.nam new.nam Renames B1:old.nam to B1:new.nam +; B0>cp a15:that.fil Copies A15:that.fil to B0: +; B0>cp source.fil dest.fil Copies source.fil to dest.fil + +leftright equ yes + +; If LEFTRIGHT is yes, setting TESTEQ to yes also allows CP and REN commands +; to be processed from right to left if they contain an equal sign ("="). +; Costs 11 bytes. +; Example: +; B0>cp dest.fil=source.fil Copies source.fil to dest.fil + +testeq equ yes + +;----------------------------------------------------------------------------- + +; 'CLS' command + +; This command clears the console screen. It can either use a fixed string +; (for shorter code if the same terminal is always used) or use the TCAP +; entry for automatic adaptation to any terminal. + +clstcap equ true ; Use TCAP for clear-screen string + +; If CLSTCAP is not enabled, then the string below must be provided and +; it must end with a character with the high bit set + + if not clstcap +clsstr macro + db 'Z'-'@'+80h ; Control-Z to clear screen + endm + endif ;not clstcap + +typecls equ true ; Clear between screens when typing files + +;----------------------------------------------------------------------------- + +; 'CP' command + +; This command copies a single file. The destination file can have a different +; name from the source file. Set the size of the memory buffer in K below (do +; not change the second definition). The copy buffer is placed at the top of +; the TPA, where it will generally not interfere with subsequent use of the GO +; command to rerun a program loaded in the TPA. + +cpblocks defl 16 ; Size of copy buffer in K + +cpblocks defl cpblocks * 8 ; Convert to number of records + +; If you will be using a BDOS or RSX which supports new functions 102 (Get +; Stamp) and 103 (Set Stamp), set STPCALL to true, and datestamps of files +; will be preserved across copies. The "last access" stamps of both copies +; are set to the time the copy took place if access stamping is enabled. + +stpcall equ true ; Copy file stamps with functions 102/3 + +;----------------------------------------------------------------------------- + +; 'DIR' command + +; This command displays a sorted listing of the files in a directory. The +; file name buffer is allocated at the top of the TPA so as not to modify +; any program loaded in low memory. Consequently, the size of the buffer +; must be set in advance. + + +maxdirs equ 256 ; Maximum number of names in directory buffer + +nosys equ yes ; suppress 'A' and 'S' options if wheel off + +slashchk equ yes ; allow "DIR /S" or "DIR /A" formats (costs + ; about 12 bytes) + +allflag equ 'A' ; Option character for showing + ; all file (both SYS and DIR) +sysflag equ 'S' ; Option character for showing + ; SYS files only +sortnt equ yes ; Sort file by name then type +wide equ yes ; Make display for 80-column screen +fence equ '|' ; Character to use as fence between columns + ; ..if WIDE is false. + +;----------------------------------------------------------------------------- + +; 'ECHO' command + +; This command sends characters to the console or list device. If ECHOLST is +; enabled, then code is included for sending characters to the LST device. +; Characters normally go the the console device and are normally upper or lower +; case depending on the setting of UPCASE. The command line can have special +; command sequences to toggle the case of the output and to change the +; destination between the console and printer. Any other character following +; the command character will be sent as is. For the normal setting of the +; equates below (upcase/yes, cmdchar/%, prtchar/P, crtchar/C, lcasech/>, +; and ucasech/<) an example command line would be: +; A0:ROOT>ECHO T%>HIS IS A TEST^M^J^IDONE%PONE, TWO, %' ; Character after CASECHAR that toggles + ; subsequent output to lower case + +; ---------------------------------------------------------------------------- + +; 'H' command + +; This command displays a list of the resident commands implemented in the +; system. FCP, CPR, and RCP commands can be displayed. The basic command is +; not optional; it is always included. + +listcpr equ yes ; Include list of CPR-resident commands in + ; display (highly recommended) + +listfcp equ yes ; Include list of FCP-resident commands in + ; display (recommended if there is room) + +noshow equ yes ; Suppress listing commands that are wheel- + ; restricted unless wheel byte is set (i.e., + ; don't show commands that won't run) + +cmdsline equ 5 ; Number of commands on each line of display + +cmdspace equ 8 ; Space in display for each command name + +;----------------------------------------------------------------------------- + +; 'LIST' and 'TYPE' commands + +pgdflt equ yes ; Default to paging of console output + +pgdflg equ 'P' ; Character to toggle paging status + +;---------------------------------------- + +; 'PEEK' command + +peekhdr equ yes ; Label columns in PEEK display + +peekbdr equ yes ; Include line of hyphens under labels + +peekchk equ yes ; If yes, the ending address will be tested to + ; prevent overflow past FFFF (costs 5 bytes) + +peeklen equ 127 ; Display 1 record (128 bytes) as default. + ; PEEK displays in increments of 16 bytes. + ; You may set PEEKLEN for 0 to 65525. + +;---------------------------------------- + +; 'S' command + +; Print disk space with other commands (recommended) + +dirsp equ true ; Show space after DIR +erasp equ true ; Show space after ERA +cpsp equ true ; Show space after CP +resetsp equ true ; Show space after R + +;---------------------------------------- + +; 'WHL' command + +whlquiet equ false ; If true, don't report wheel state with + ; .."WHL password" command (costs 1 byte) + +wpass macro + db 'SYSTEM ' + endm + +;---------------------------------------- + +; 'CLED' command +; +; Command line editing takes place in the line buffer. It does not take up +; room in the RCP. The editor will handle a 255 byte line. Although that +; is larger than the maximum command line size, it allows you to edit a long +; line without deleting something first. The history is kept inside the RCP, +; so its size will depend upon how many other RCP commands are enabled. +; HISTSIZE should be at least as large as the multiple command line buffer +; (204 bytes). + +lbufwid equ 255 ; Line buffer size, byte +histsize equ 204 ; History buffer size, word + +; CLERA controls whether to null the internal history when CLED is exited, or +; to leave it for the next run. Secure systems will want to set it to YES. + +clera equ no ; Erase history on terminating shell + +; CLMIN sets the cutoff for discarding short lines from history recording. +; A setting of 3 would discard a command such as DIR. + +clmin equ 5 ; Discard lines which do not exceed this + +clins equ yes ; Initial insert state ON +clsav equ yes ; Initial history recording ON + +; The appearance of the command line prompt may include the system time if a +; DateStamper or ZS/ZDDOS clock is implemented. The DU:DIR separator character +; can be changed to indicate that CLED is running. + +dudir_sep equ '/' ; DU:DIR separator char +puser0 equ no ; Print user #0 in prompt +systime equ yes ; Include system time in prompt + + if systime +civtim equ yes ; Yes for 12-hr civil time vs. 24-hr military +timesep equ '.' ; Separator between hours and minutes + endif + +; The editor must use EREOL. The VLIB routine to send the EREOL sequence +; to the terminal needs to test for a video delay and the presence of the "/" +; quote character. Most terminals can just print the TCAP sequence as is. If +; that doesn't work, set ERLQUICK to NO. If you are using only one terminal, +; it will be most efficient to set ERLTCAP to NO and use the CLR_EOL macro. + +erltcap equ yes ; Use TCAP routine vs macro + + if erltcap +erlquick equ yes ; Use simplified TCAP routine + else + +clr_eol macro ; Define terminal specific string + dc 1bh,'T' ; ...set high bit on last character + endm + + endif ;erltcap + +;----------------------------------------------------------------------------- + +; Command names + +; The CTABLE macro, which constructs the command dispatch table, includes a +; line for each command, the first parameter of which is the name of the +; command. These names may be changed if you wish. But make sure that you +; do not use a name that is longer than the maximum allowed length. If you +; do, the name will be truncated and a nonfatal error will occur during +; assembly. DO NOT CHANGE ANY PARAMETER OTHER THAN THE COMMAND NAME. Lower +; case letters will be converted to upper case. The macro COMMAND is defined +; in Z34MAC.LIB. + +cmdsize equ 4 ; Length of each command name + +cmdtbl macro + command CLED, cledon, wcled, cled + command CLS, clson, false, cls + command CP, cpon, wcp, copy + command D, diron, wdir, dir + command ECHO, echoon, false, echo + command ERA, eraon, wera, era + command H, true, whrc, clist + command LIST, liston, wlist, list + command NOTE, noteon, false, note + command P, peekon, wpeek, peek + command POKE, pokeon, wpoke, poke + command PORT, porton, wport, port + command PROT, proton, wprot, att + command Q, quieton,wquiet, quset + command R, reson, false, reset + command REG, regon, wreg, register + command REN, renon, wren, ren + command SP, spaceon,false, space + command SPOP, cledon, wspop, shpop + command TYPE, lton, wtype, type + command WHL, whlon, false, whl + endm + +; END Z34RCP.LIB + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/z34rcp.lib.sav b/Source/BPBIOS/Z34RCP11/z34rcp.lib.sav new file mode 100644 index 00000000..a0272445 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/z34rcp.lib.sav @@ -0,0 +1,515 @@ + +; File: Z34RCP.LIB +; Description: Resident Command Package (RCP) for ZCPR34 +; Version: 1.4 +; Author: Carson Wilson +; Date: October 4, 1989 +; Changes: Added PUSER0 equate suggested by Rob Friefeld. +; +; Version: 1.3 +; Author: Carson Wilson +; Date: September 29, 1989 +; Changes: Added CLED (Command Line Editor Shell) command options +; and equates. +; +; Version: 1.2 +; Author: Carson Wilson +; Date: August 11, 1989 +; Changes: Removed several "quiet" conditional assembly equates as +; we are now sensing the QUIET flag instead. +; Changed default of WHLQUIET to false. +; +; Version: 1.1 +; Author: Carson Wilson +; Date: July 10, 1989 +; Changes: Changed 'S' command name to 'SP'. +; Removed wheel protection from 'Q' command and set QQUIET +; on by default. +; Changed command order. + +; Version: 1.0 +; Author: Carson Wilson +; Date: June 15, 1988 + +; This is the configuration file for the ZCPR Version 3.4 resident command +; package. You should read through this file and set the equates according +; to the features you want to implement. Since most systems have a limited +; amount of space for the resident command package, it will probably be +; impossible to include all features. + +; If you are using an SLR or equivalent assembler, you will be prompted +; at assembly time for which commands to include in the RCP. + +;============================================================================= +; +; A S S E M B L Y O P T I O N S +; +;============================================================================= + +; SLR controls whether special pseudo-ops such as ".printx" and ".accept", +; and complex macros are used at assembly time. For SLR Systems or compatible +; macro assemblers, set this equate to true. + +SLR equ true + +; RCPTYPE is the final character of the RCP name in the H(elp) command, +; and determines the order in which commands are added. + + if SLR +Y equ true +N equ false +H equ 'H' +F equ 'F' + +.accept 'Enter "F" for floppy, "H" for fixed disk version: ',rcptype + else +rcptype equ 'F' ; Floppy disk version + endif ; SLR + +; ZRL controls whether named common labels are used in the code. To create +; absolute code, modify RCPBASE.LIB to reflect your system's addresses, set +; ZRL to false and instruct your assembler to generate absolute code (either +; a .COM or .HEX file). +; +; To create a relocatable file for use with Bridger Mitchell's JetLDR or +; Joe Wright's NZCOM, you must use an assembler which recognizes named +; common blocks. If your assembler has this capability, set ZRL to true +; and instruct the assembler to generate relocatable (.REL) code. + +ZRL equ true + +;============================================================================= +; +; M A C R O S +; +;============================================================================= + +; SLR assemblers allow selection of options during assembly. + + if SLR + +select macro option default comment + .accept comment,option ; Prompt user for selection + endm + + .printx + .printx Answer "Y" to include, "N" to exclude commands: + .printx + + else + +select macro option default comment +option equ default ; Use selections from file + endm + endif ; SLR + +;============================================================================= +; +; R E S I D E N T C O M M A N D S S E L E C T I O N +; +;============================================================================= + +; Commands to include in the resident command package + +; There are some interrelations between a number of the possible resident +; commands. Some are so close (LIST and TYPE) that a single equate controls +; both functions. Others like DIR and ERA share code (both display file +; listings). It is efficient to select or deselect them together. + +; If you are using an SLR or compatible assembler, you will be prompted +; at assembly time for command selections. Otherwise, select commands to +; be included by setting each SELECT macro below to yes or no. + +select CLEDON no 'CLED - command line editor shell? ' +select CLSON yes 'CLS - clear screen? ' +select RESON yes 'R - reset disk system? ' +select SPACEON yes 'SP - show space remaining on disk? ' + + if RCPTYPE='F' ; Assemble in floppy order +select DIRON yes 'D - disk directory? ' +select ERAON yes 'ERA - erase files? ' +select ECHOON yes 'ECHO - send text to screen or printer? ' +select RENON yes 'REN - rename files? ' +select CPON yes 'CP - copy file? ' +select LTON yes 'TYPE - display file on console? ' +select POKEON yes 'POKE - set memory? ' +select PEEKON yes 'PEEK - view memory? ' + else ; Assemble in fixed-disk order +select ECHOON yes 'ECHO - send text to screen or printer? ' +select POKEON yes 'POKE - set memory? ' +select PEEKON yes 'PEEK - view memory? ' +select QUIETON yes 'Q - set or clear quiet status? ' +select DIRON yes 'D - disk directory? ' +select ERAON yes 'ERA - erase files? ' +select RENON yes 'REN - rename files? ' +select CPON yes 'CP - copy file? ' +select LTON yes 'TYPE - display file on console? ' + endif ; RCPTYPE='F' + + if LTON +select LISTON no 'LIST - list to printer? ' + else ; allowed only if TYPE is enabled +LISTON equ no + endif + + if RCPTYPE='F' ; Assemble in floppy order +select QUIETON yes 'Q - set or clear quiet status? ' + endif + +select PROTON no 'PROT - set file attributes? ' +select NOTEON no 'NOTE - command-line comment? ' +select REGON no 'REG - set and display user registers? ' +select WHLON no 'WHL - set or clear wheel status? ' +select PORTON no 'PORT - view and set I/O ports? ' + +;============================================================================= +; +; W H E E L P R O T E C T I O N +; +;============================================================================= + +; To prevent unauthorized users from performing certain dangerous or sensitive +; operations on the computer, ZCPR34 provides the capability of disabling the +; operation of certain commands when the wheel byte is off. In ZCPR30, an +; attempt to use one of these wheel-protected commands when the wheel byte was +; off resulted in an error message. In ZCPR34 things work differently. In the +; same situation, the command simply disappears. In this way a transient +; program or extended command processor function can take over and deal with +; the attempt to use the command in a much more flexible way. +; +; Wheel-protected commands in ZCPR30 had extra code to intercept the function +; and disable it. In ZCPR34, wheel protection is enabled and disabled in a +; different way. To wheel-protect a command the high bit of the first +; character in the command name is set. The command table scanner in ZCPR34 +; will not recognize these commands when the wheel byte is off. Since the same +; command scanner is used to scan the commands in the RCP and FCP (flow control +; package), commands there can be wheel protected in the same way. For skilled +; computer operators it is very easy to use a debugger, file patcher, or disk +; utility to enable and disable wheel protection without having to reassemble +; the CPR, RCP, or FCP. +; +; Because of the way the command scanner works, once wheel protection is +; implemented in the CCP, there is no further code penalty in protecting RCP +; commands. Therefore, we recommend protecting all possibly sensitive +; commands or none. + +wcled equ no ; CLED +wcp equ yes ; CP +wdir equ no ; DIR +wera equ yes ; ERA +wlist equ yes ; LIST +wpeek equ yes ; PEEK +wpoke equ yes ; POKE +wport equ yes ; PORT +wprot equ yes ; PROT +wquiet equ no ; QUIET +wreg equ yes ; REG +wren equ yes ; REN +wspop equ yes ; SPOP +wtype equ yes ; TYPE +whrc equ no ; H + +wheel defl wcp or wdir or wera or wlist or wpeek or wpoke or wport +wheel defl wheel or wprot or wreg or wren or wtype or whrc + +;============================================================================= +; +; C O M M A N D O P T I O N S +; +;============================================================================= + +; Options affecting several commands + +; DSORT includes code to sort file entries for the D, TYPE, LIST, ERA, +; and PROT commands. + +dsort equ yes + +; LEFTRIGHT affects the COPY and RENAME commands. If yes, add code to allow +; CP and REN operations work from left to right, and CP to accept a +; single filespec as its source. +; Examples: +; B0>ren b1:old.nam new.nam Renames B1:old.nam to B1:new.nam +; B0>cp a15:that.fil Copies A15:that.fil to B0: +; B0>cp source.fil dest.fil Copies source.fil to dest.fil + +leftright equ yes + +; If LEFTRIGHT is yes, setting TESTEQ to yes also allows CP and REN commands +; to be processed from right to left if they contain an equal sign ("="). +; Costs 11 bytes. +; Example: +; B0>cp dest.fil=source.fil Copies source.fil to dest.fil + +testeq equ yes + +;----------------------------------------------------------------------------- + +; 'CLS' command + +; This command clears the console screen. It can either use a fixed string +; (for shorter code if the same terminal is always used) or use the TCAP +; entry for automatic adaptation to any terminal. + +clstcap equ true ; Use TCAP for clear-screen string + +; If CLSTCAP is not enabled, then the string below must be provided and +; it must end with a character with the high bit set + + if not clstcap +clsstr macro + db 'Z'-'@'+80h ; Control-Z to clear screen + endm + endif ;not clstcap + +typecls equ true ; Clear between screens when typing files + +;----------------------------------------------------------------------------- + +; 'CP' command + +; This command copies a single file. The destination file can have a different +; name from the source file. Set the size of the memory buffer in K below (do +; not change the second definition). The copy buffer is placed at the top of +; the TPA, where it will generally not interfere with subsequent use of the GO +; command to rerun a program loaded in the TPA. + +cpblocks defl 16 ; Size of copy buffer in K + +cpblocks defl cpblocks * 8 ; Convert to number of records + +; If you will be using a BDOS or RSX which supports new functions 102 (Get +; Stamp) and 103 (Set Stamp), set STPCALL to true, and datestamps of files +; will be preserved across copies. The "last access" stamps of both copies +; are set to the time the copy took place if access stamping is enabled. + +stpcall equ true ; Copy file stamps with functions 102/3 + +;----------------------------------------------------------------------------- + +; 'DIR' command + +; This command displays a sorted listing of the files in a directory. The +; file name buffer is allocated at the top of the TPA so as not to modify +; any program loaded in low memory. Consequently, the size of the buffer +; must be set in advance. + + +maxdirs equ 256 ; Maximum number of names in directory buffer + +nosys equ yes ; suppress 'A' and 'S' options if wheel off + +slashchk equ yes ; allow "DIR /S" or "DIR /A" formats (costs + ; about 12 bytes) + +allflag equ 'A' ; Option character for showing + ; all file (both SYS and DIR) +sysflag equ 'S' ; Option character for showing + ; SYS files only +sortnt equ yes ; Sort file by name then type +wide equ yes ; Make display for 80-column screen +fence equ '|' ; Character to use as fence between columns + ; ..if WIDE is false. + +;----------------------------------------------------------------------------- + +; 'ECHO' command + +; This command sends characters to the console or list device. If ECHOLST is +; enabled, then code is included for sending characters to the LST device. +; Characters normally go the the console device and are normally upper or lower +; case depending on the setting of UPCASE. The command line can have special +; command sequences to toggle the case of the output and to change the +; destination between the console and printer. Any other character following +; the command character will be sent as is. For the normal setting of the +; equates below (upcase/yes, cmdchar/%, prtchar/P, crtchar/C, lcasech/>, +; and ucasech/<) an example command line would be: +; A0:ROOT>ECHO T%>HIS IS A TEST^M^J^IDONE%PONE, TWO, %' ; Character after CASECHAR that toggles + ; subsequent output to lower case + +; ---------------------------------------------------------------------------- + +; 'H' command + +; This command displays a list of the resident commands implemented in the +; system. FCP, CPR, and RCP commands can be displayed. The basic command is +; not optional; it is always included. + +listcpr equ yes ; Include list of CPR-resident commands in + ; display (highly recommended) + +listfcp equ yes ; Include list of FCP-resident commands in + ; display (recommended if there is room) + +noshow equ yes ; Suppress listing commands that are wheel- + ; restricted unless wheel byte is set (i.e., + ; don't show commands that won't run) + +cmdsline equ 5 ; Number of commands on each line of display + +cmdspace equ 8 ; Space in display for each command name + +;----------------------------------------------------------------------------- + +; 'LIST' and 'TYPE' commands + +pgdflt equ yes ; Default to paging of console output + +pgdflg equ 'P' ; Character to toggle paging status + +;---------------------------------------- + +; 'PEEK' command + +peekhdr equ yes ; Label columns in PEEK display + +peekbdr equ yes ; Include line of hyphens under labels + +peekchk equ yes ; If yes, the ending address will be tested to + ; prevent overflow past FFFF (costs 5 bytes) + +peeklen equ 127 ; Display 1 record (128 bytes) as default. + ; PEEK displays in increments of 16 bytes. + ; You may set PEEKLEN for 0 to 65525. + +;---------------------------------------- + +; 'S' command + +; Print disk space with other commands (recommended) + +dirsp equ true ; Show space after DIR +erasp equ true ; Show space after ERA +cpsp equ true ; Show space after CP +resetsp equ true ; Show space after R + +;---------------------------------------- + +; 'WHL' command + +whlquiet equ false ; If true, don't report wheel state with + ; .."WHL password" command (costs 1 byte) + +wpass macro + db 'SYSTEM ' + endm + +;---------------------------------------- + +; 'CLED' command +; +; Command line editing takes place in the line buffer. It does not take up +; room in the RCP. The editor will handle a 255 byte line. Although that +; is larger than the maximum command line size, it allows you to edit a long +; line without deleting something first. The history is kept inside the RCP, +; so its size will depend upon how many other RCP commands are enabled. +; HISTSIZE should be at least as large as the multiple command line buffer +; (204 bytes). + +lbufwid equ 255 ; Line buffer size, byte +histsize equ 204 ; History buffer size, word + +; CLERA controls whether to null the internal history when CLED is exited, or +; to leave it for the next run. Secure systems will want to set it to YES. + +clera equ no ; Erase history on terminating shell + +; CLMIN sets the cutoff for discarding short lines from history recording. +; A setting of 3 would discard a command such as DIR. + +clmin equ 5 ; Discard lines which do not exceed this + +clins equ yes ; Initial insert state ON +clsav equ yes ; Initial history recording ON + +; The appearance of the command line prompt may include the system time if a +; DateStamper or ZS/ZDDOS clock is implemented. The DU:DIR separator character +; can be changed to indicate that CLED is running. + +dudir_sep equ '/' ; DU:DIR separator char +puser0 equ no ; Print user #0 in prompt +systime equ yes ; Include system time in prompt + + if systime +civtim equ yes ; Yes for 12-hr civil time vs. 24-hr military +timesep equ '.' ; Separator between hours and minutes + endif + +; The editor must use EREOL. The VLIB routine to send the EREOL sequence +; to the terminal needs to test for a video delay and the presence of the "/" +; quote character. Most terminals can just print the TCAP sequence as is. If +; that doesn't work, set ERLQUICK to NO. If you are using only one terminal, +; it will be most efficient to set ERLTCAP to NO and use the CLR_EOL macro. + +erltcap equ yes ; Use TCAP routine vs macro + + if erltcap +erlquick equ yes ; Use simplified TCAP routine + else + +clr_eol macro ; Define terminal specific string + dc 1bh,'T' ; ...set high bit on last character + endm + + endif ;erltcap + +;----------------------------------------------------------------------------- + +; Command names + +; The CTABLE macro, which constructs the command dispatch table, includes a +; line for each command, the first parameter of which is the name of the +; command. These names may be changed if you wish. But make sure that you +; do not use a name that is longer than the maximum allowed length. If you +; do, the name will be truncated and a nonfatal error will occur during +; assembly. DO NOT CHANGE ANY PARAMETER OTHER THAN THE COMMAND NAME. Lower +; case letters will be converted to upper case. The macro COMMAND is defined +; in Z34MAC.LIB. + +cmdsize equ 4 ; Length of each command name + +cmdtbl macro + command CLED, cledon, wcled, cled + command CLS, clson, false, cls + command CP, cpon, wcp, copy + command D, diron, wdir, dir + command ECHO, echoon, false, echo + command ERA, eraon, wera, era + command H, true, whrc, clist + command LIST, liston, wlist, list + command NOTE, noteon, false, note + command P, peekon, wpeek, peek + command POKE, pokeon, wpoke, poke + command PORT, porton, wport, port + command PROT, proton, wprot, att + command Q, quieton,wquiet, quset + command R, reson, false, reset + command REG, regon, wreg, register + command REN, renon, wren, ren + command SP, spaceon,false, space + command SPOP, cledon, wspop, shpop + command TYPE, lton, wtype, type + command WHL, whlon, false, whl + endm + +; END Z34RCP.LIB + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/z34rcp11.doc b/Source/BPBIOS/Z34RCP11/z34rcp11.doc new file mode 100644 index 00000000..92195c5d --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/z34rcp11.doc @@ -0,0 +1,429 @@ + + ZCPR Version 3.4 Resident Command Package + Source Code + + Revised Documentation for Version 1.1 + October 7, 1989 by Carson Wilson + + Version 1.0 Documentation + June 17, 1988 by Carson Wilson + + + Contents + -------- + + 1. Files in this Library. + + 2. Purpose of the Resident Command Package. + + 2.1. "Resident" vs. "Transient" Commands. + + 2.2. The Z-System Resident Command Package. + + 2.2.1. Design Philosophy of the Z34 RCP. + + 3. Structure and Operation of the RCP Segment. + + 4. Generating an RCP for your System. + + 4.1. The Z-Relocatable Approach. + + 4.1.1. NZCOM and JetLDR. + 4.1.2. Z-Relocatable (ZRL) Code + + 4.2. The Assembly Approach. + + 4.2.1. Note on Assemblers. + 4.2.2. Assembly to Absolute Code. + 4.2.3. Assembly to Z-Relocatable Code. + 4.2.4. Adding Custom Commands to Z34RCP. + + 5. Legal Use of These Files. + + + +1. Files in this Library. + +This library of files contains the assembler source code and +accompanying documentation for the Z-System Resident Command +Package (RCP). To use Z34RCP you must be running ZCPR versions +3.3 or above. For pre-assembled Z-Relocatable (ZRL) RCPs, see +RCPZRL11.LBR. Z34RCP11.LBR consists of the following files +(uncompress with UNCR.COM, QL.COM or LBRE.COM): + +CLEDINST.CZM - Installer for CLED command. +CLEDSAVE.CZM - Command file utility for CLED. +RCPCLED .DZC - Documentation on CLED. +RCPBASE .LZB - Used to assemble an absolute address RCP. +RCPCMD .LZB - Used to include custom commands in the RCP. +RCP?????.LZB - Code modules for the standard RCP commands. +SYSDEF .LZB - Commonly used equates. +Z34CMN .LZB - Used to assemble Z-Relocatable RCP's. +Z34DEFN .LZB - Offsets in the ZCPR 3.4 code. +Z34MAC .LZB - Assembler macros. +Z34RCP11.DZC - This file. +Z34RCP11.FOR - Short description of the library. +Z34RCP11.HZP - Help file for the RCP, gives command syntax and + examples. +Z34RCP .LZB - Used to select features when assembling the RCP. +Z34RCP11.NZW - Changes since Z34RCP10.LBR. Intended for former + RCP users, this will be only of passing interest + to new users. +Z34RCP11.ZZ0 - Main file for assembling the RCP. +ZSYSTEM .AZ - General information about Z System. + + +2. Purpose of the Resident Command Package. + + 2.1. "Resident" vs. "Transient" Commands. + +Most of the commands used under CP/M and Z-System are "transient" +commands. The machine code for these commands (or "programs") is +stored in "command files," whose file type is normally .COM. +Thus, the machine code for WordStar is stored in a file called +"WS.COM". + +To run WordStar, the user issues the command "WS" at the command +line, the operating system loads WS.COM from the disk drive to +memory, and WS.COM takes over control of the computer. If the +user then exits WordStar and issues another command, the +operating system can load another command file from the disk, +reusing the area of memory previously occupied by WordStar. + +Recycling memory in this way makes personal computers quite +versatile, as the number of commands available to the user is +only limited to the number of command files stored on disk. +There are some drawbacks to this approach, however. Although +disk-based commands conserve memory by recycling it, they must be +loaded from disk each time they operate. This creates its own +costs in terms of speed of execution, disk storage space, and +memory reallocation. + +The most obvious disadvantage of loading a file from disk each +time a command is issued is that it takes time to find and load +disk files. Especially with floppy diskettes, the amount of time +which elapses after the command is issued and before the command +executes is significant. A second drawback to disk-based +commands is that commands will not execute unless their machine +code is available on the disk system. This means that the user +must know what command files are available on disk before issuing +commands. The final disadvantage of disk file based commands is +that some commands (e.g., SAVE) require that the area of memory +normally overwritten by command files (known as the "Transient +Program Area" or TPA) be preserved. + +In answer to these difficulties, the creators of CP/M designed +some of its commands as "built-in" commands. The DIR, REN, SAVE, +ERA, USER, and TYPE commands of CP/M 2.2 remain in memory and can +be issued without loading machine code files from disk. Thus, +the DIR command provides a disk directory regardless of whether +the command file "DIR.COM" is present on disk, and the SAVE +command saves the contents of memory at 100 hex to a disk file. +Residing permanently in memory, these commands are simple in +order to leave memory for disk-based commands to load in. + + 2.2. The Z-System Resident Command Package. + +The creators of Z-System have followed the resident command +philosophy of CP/M, extending and enhancing the capabilities of +resident commands with the Z-System Resident Command Package. +Under CP/M 2.2, resident commands are tightly integrated with the +operating system. The user is therefore limited to a fixed set +of resident commands. The code in the Z-System Resident Command +Package is much more loosely linked with the operating system. + +The RCP occupies a section of protected memory, but how that +memory is used is only very loosely constrained. The Z-System +resident command package may be tailored for a wide variety of +installations, and easily altered within a single installation. + + 2.2.1. Design Philosophy of the Z34 RCP. + +Though any set of commands which will fit in the RCP memory area +can be loaded as an RCP, a standard set of Z-System RCP commands +have evolved over the years. Distributed as the standard +Z-System RCP, this set of commands consists of universal, +single-purpose commands modeled after the resident command set of +CP/M 2.2, such as DIR, REN, and ERA. + +Keeping these commands simple both conserves memory and allows +their use in custom command scripts. None of the standard RCP +commands require interaction on the part of the user--they +perform a single function and quit. Aliases or other command +scripts which build complex commands from simple RCP commands +therefore retain complete control over the user interface. + +However, the standard RCP forms only one of many alternative uses +to which the Z-System RCP memory segment may be put. Since the +RCP memory is protected, it can be used by background programs +which continue to function even while other applications have +been loaded into the transient program area. Several such +programs, including key-redefiners, screen-trapping programs, +background numeric calculators, program assembly environments, +and memory utilities have been developed. + +Until Z34RCP, all but the most advanced users had to surrender +their entire RCP to use the custom commands, even if the commands +needed far less than the available RCP space. Thus, to use a +key-redefinition RCP, one was forced to give up all of his other +RCP commands. Z34RCP solves this problem by acting as a base to +which programmers may easily add code. By modifying the standard +file RCPCMD.LIB, programmers can implement and distribute custom +RCP commands which may be installed by those with only basic +knowledge of assembly language. See "Adding Custom Commands," +below, for details. + + +3. Structure and Operation of the RCP Segment. + +Typically, the Resident Command Package occupies 2 kilobytes of +memory, protected above the system's Basic Input Output System +(BIOS). Its internal structure is very simple, consisting of the +five byte string "Z3RCP", a table of command names and their +addresses within the RCP, and the machine code of the commands +themselves. This means that an RCP of a given length can contain +any number of resident commands which will fit in 2k, from one +large program to many shorter programs. + +Further, since the RCP is independent of the rest of the +operating system, the resident commands may be changed at will. +On system startup, a default RCP is loaded into memory. +Thereafter the RCP's commands remain active until the system is +turned off or another RCP is loaded. + +Using loader programs to load the RCP to memory allows another +important ability--it can exchange RCPs during a single session. +By allowing users to change their RCPs "on-the-fly," loader +programs provide some of the benefits of transient commands even +while preserving the benefits of resident commands. In fact, +even what portion of memory is allocated to the RCP can be +altered in this way by advanced users! (see the Z-System User's +Manual for more on this). + + +4. Generating an RCP for your System. + +Since Z80 computers come with a wide variety of operating system +environments, it is impossible for a single segment of machine +code function as a universal RCP. Due to differences in +operating system and hardware design, the size and location of +memory available to the Z-System RCP vary widely. Until +Z34RCP, this meant that each type of Z80 computer required an RCP +segment assembled specifically for that computer. + +Now, however, there are two basic means by which you may generate +an RCP for your system. The simplest route is to load already- +assembled Z-Relocatable code modules. This technique is +recommended for beginners and those with little experience in +assembly language. See RCPZRL11.LBR for pre-assembled RCP +modules. For more experienced users with an interest in +customizing or their RCPs or adding their own commands, custom +assembly of the files in this library is also an option. + + 4.1. The Z-Relocatable Approach. + + 4.1.1. NZCOM and JetLDR. + +LDR.COM, the familiar Z-System segment loader first introduced by +Rick Conn as a means of loading the various segments of the ZCPR +environment from disk to memory, required that system segments be +assembled to run only at system-specific addresses. For example, +if the system's RCP started at FA00 hex, only an RCP assembled to +run at that starting address would function on the system. +Therefore, separate SYS.RCP files were needed for each computer +installation. + +Thanks to several advanced loader utilities, namely NZCOM by Joe +Wright and JetLDR and Z3PLUS by Bridger Mitchell, custom- +assembling an RCP for a given target machine is no longer +necessary. These three programs can load specially assembled RCP +segments (known as Z-ReLocatable or "ZRL" segments) to any area +of memory. Z-System users now need only obtain previously +assembled RCP segments, much as they need only obtain assembled +.COM or .OBJ files to run transient programs. + +Using information in the system's environmental descriptor, +advanced loaders load pre-assembled segments to the proper +addresses in any system. The only remaining constraint is the +amount of memory allocated to the RCP. While the standard RCP +size is 2 kilobytes, many Z-System installations vary +considerably from this standard, so it is still necessary to +ensure that a ZRL segment does not exceed available RCP memory. +Fortunately, this is taken care of automatically by the advanced +loader programs. + +Using NZCOM or JetLDR, it is possible to load an RCP directly +from RCPZRL11.LBR. See NZCOM or JetLDR documentation for full +instructions on how to load Z-Relocatable RCPs with these +programs. + + 4.1.2. Z-Relocatable (ZRL) Code + +The technique used by NZCOM and JetLDR to load a single RCP to +any address in memory involves relocatable code. Relocatable +code has been used for years by the "linker" programs available +to assembly language programmers. Since only portions of a given +Z80 machine code routine are specific to one memory address, it +is possible to create "relocatable" files of Z80 routines (known +by their file type .REL) containing all but the address-specific +codes. These files can then be very quickly relocated (or +"linked") by a linker program to operate at any memory address. + +Z-Relocatable code is simply a more sophisticated form of +relocatable code. ZRL files contain separately labeled segments, +known as "named common blocks." Where normal relocatable code is +all linked to operate at one address at a time by the linker +program, named common blocks allow the linker to distinguish +between different sections of the file and to link each "block" +to operate at a different address. + +This represents a major step forwards in user convenience, and +will certainly lead to more innovative work using the ZCPR system +segments. There is a minor drawback, however, inherent in the +form of assembly required by NZCOM and JetLDR. Before the advent +of these two programs, system segments were equivalent to .COM +files which were assembled to operate at addresses other than the +standard 100 hex. The ability to load a single system segment to +any address depends partially on the form of the assembled system +segment itself. + +While public domain assemblers will produce absolute object +files, more sophisticated assemblers, such as SLR's Z80ASM (a +bargain at $50) are required to assemble code with named common +addresses. NZCOM and JetLDR thus greatly reduce the time needed +by most users to install Z-System segments, but those wishing to +assemble Z-Relocatable segments will probably need a commercial +assembler. + + 4.2. The Assembly Approach. + +Those with knowledge of assembly language may opt to assemble +their own custom RCPs, including only the commands and options +which match their exact requirements. Z34RCP.LBR contains the +complete source to the ZCPR 3.4 RCP. The file Z34RCP.Z80 +contains include statements to combine the various library files +during assembly. The file Z34RCP.LIB contains all of the equates +controlling assembly time options, and should be edited before +assembling Z34RCP.Z80. + + 4.2.1. Note on Assemblers. + +The development work on Z34RCP was done exclusively with the SLR +Systems line of Z80 assemblers. Hence, some of the source code +is unavoidably specific to SLR and compatible assemblers. Those +using incompatible assemblers such as public-domain Z80 +assemblers should set the SLR equate in Z34RCP.LIB to FALSE. +This removes most SLR-specific pseudo-ops, but some additional +editing of the source files may be required for error-free +assembly. Unless your assembler can handle named common blocks, +you will also want to set the ZRL equate in Z34RCP.LIB to FALSE. + + 4.2.2. Assembly to Absolute Code. + +If you are assembling a custom RCP for use at one memory address +only, or if your assembler can't handle named common blocks, you +can set the ZRL equate in Z34RCP.LIB to FALSE, and instruct your +assembler to produce absolute code (either a .HEX or a .COM file). + +Before generating absolute code you must set addresses in the +file RCPBASE.LIB for the particular installation. Once you have +set these addresses, you may proceed to assemble Z34RCP.Z80 to +either Z34RCP.COM or Z34RCP.HEX. If your assembler generated a +.HEX file, use LOAD.COM to convert Z34RCP.HEX to Z34RCP.COM. + +If you are running a version of ZCPR prior to 3.4, you must now +alter two bytes in your Z-System environment segment to point to +your system's CCP address. The bytes at offset 39 and 40 hex +(formerly containing "width of printer 2" and "lines on printer +2") should contain a 2-byte address of your system's CCP, most +significant byte last. + +Z34RCP.COM may now be renamed to SYS.RCP and loaded with the Z- +System loader program LDR.COM or Bridger Mitchell's JetLDR. + + 4.2.3. Assembly to Z-Relocatable Code. + +Unlike absolute RCP segments, Z-Relocatable segments may be +loaded to ANY address, provided enough RCP space to contain them +is available. To assemble a Z-Relocatable RCP, you will need an +assembler which can handle named common blocks (see 4.2.1 above). +Set the ZRL equate in Z34RCP.LIB to TRUE, and instruct your +assembler to produce a relocatable (.REL) file. The resulting +Z34RCP.REL may then be renamed to Z34RCP.ZRL and loaded with +NZCOM, Z3PLUS, JetLDR. + + 4.2.4. Adding Custom Commands to Z34RCP. + +As mentioned above, I have designed Z34RCP as a base to which +custom RCP commands may readily be added. All code and command +names for custom commands may be included in RCPCMD.LIB. +Thereafter, whenever the RCP is assembled the commands added to +RCPCMD.LIB will be included automatically. To remove the custom +commands, just replace the modified RCPCMD.LIB with an unmodified +copy. See RCPCMD.LIB for detailed instructions on how to add +code and command names. + +RCPCMD.LIB also facilitates distribution of custom commands to be +included by others in their RCPs. Simply distribute a copy of +your modified RCPCMD.LIB along with instructions on how to use +your custom commands. Users may then easily include the new +commands by substituting your modified RCPCMD.LIB for their +original copy and reassembling their RCPs. + +Of course, users of NZCOM, Z3PLUS, or JetLDR may simply trade +custom RCPs in Z-Relocatable form and dispense with the need for +any assembly work on the part of the user. All three of these +advanced loaders are available from Z Systems Associates (see +below). + + +5. Legal Use of These Files. + +Z34RCP is copyright 1989 by Z Systems Associates (ZSA), all +rights reserved. Any commercial use of Z34RCP, defined as any +situation where the duplicator recieves revenue by duplicating or +distributing Z34RCP by itself or in conjunction with any hardware +or software product, is expressly prohibited unless authorized in +writing by ZSA. + +Except for the file RCPCMD.LIB (see 4.2.4 above), you may +redistribute Z34RCP.LBR in its present form only. I encourage +you to explore the source code, suggest improvements, and +document errors. However, please obtain permission from Z +Systems Associates before redistributing any of these files in +altered form. This will prevent confusion by allowing your work +to be coordinated with the efforts of others. + +The Z Systems Associates are: + + Sage Microsystems East + Selling & Supporting the Best in 8-Bit Software + 1435 Centre St., Newton Centre, MA 02159-2469 + Voice: 617/965-3552 (9:00am - 11:30pm) + Modem: 617/965-7259 (password = DDT)(MABOS on PC-Pursuit) + +and: + + Plu*Perfect Systems + "==World-Class Software" + 410 23rd Street, Santa Monica, CA 90402 + Voice: 213/393-6105 (evenings) + Modem: 213/670-9465 (leave message for "Bridger Mitchell") + +For more information on Z System, check at the above bulletin +board systems, or consult The Computer Journal for excellent +articles on ZCPR and CP/M. The Computer Journal is published six +times a year by Publishing Consultants, 190 Sullivan Crossroad, +Columbia Falls, MT 59912, phone 406/257-9119. An issue averages +forty pages with few ads. Subscription rates are $16 for one +year (6 issues), or $28 for two years (12 issues) in the U.S., +$22 for one year Canada and Mexico, and $24 (surface) for one +year in other countries. + + +Carson Wilson is the operator of: + + Antelope Freeway Remote Access System + Chicago, 312-764-5162 + 300-1200-2400 Baud, 24 Hours + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/z34rcp11.for b/Source/BPBIOS/Z34RCP11/z34rcp11.for new file mode 100644 index 00000000..c60e1910 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/z34rcp11.for @@ -0,0 +1,7 @@ +Z-System Resident Command Package (RCP) in source code form, version +1.1. Complete Z80 source code to the RCP plus documentation, for +ZCPR versions 3.3 and above. Adds several exciting new commands and +features and fixes various bugs in the previous release. See +companion file RCPZRL11.LBR for pre-compiled RCP modules which may +be loaded with NZ-COM, Z3PLUS, or JetLDR. + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/z34rcp11.hlp b/Source/BPBIOS/Z34RCP11/z34rcp11.hlp new file mode 100644 index 00000000..991d5d71 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/z34rcp11.hlp @@ -0,0 +1,390 @@ + The RCP Commands + CLED/SPOP Command Line Editor  + CLS Clear the CRT screen  + CP Copy a File  + D Display Directory  + ECHO Echo Command Tail  + ERA Erase Files  + H Display Available Commands  + LIST/TYPE Display a File on Printer/CRT + NOTE Comment  + P/POKE Display/Alter Memory  + PORT Input/Output to system ports  + PROT Protect Files  + Q Alter or Query the Quiet Flag + R Reset Disk  + REG ZCPR3 Register Display/Alter  + REN Rename a File  + SP Display Disk Space Remaining  + WHL Alter or Query Wheel Byte  +:Thå RCÐ Commands + + + Thå   standarä ZCPR³ Systeí Residenô Commanä  Packagå  (RCP© +distributeä  witè thå ZCPR³ systeí containó á numbeò oæ  residenô +commandó  whicè  maù bå enableä (dependinç oî systeí  memorù  anä +securitù  characteristics©  aô thå discretioî oæ  thå  installer® +Usagå oæ thå RCÐ commandó ió describeä iî thió HELÐ file. + + Thå  RCÐ commandó residå iî memorù ratheò thaî beinç  loadeä +froí  disk¬ anä thereforå operatå verù efficientlù anä arå  disë­ +independent®   Oî thå otheò hand¬ duå tï memorù constraints¬  thå +RCÐ commandó arå ofteî lesó powerfuì thaî theiò transienô prograí +counterparts® + + + + Iæ aî erroò occurs¬ thå RCÐ commandó generallù chaiî tï  thå +installeä erroò handler¬ providinç á detaileä reporô oæ thå erroò +anä  allowinç thå commanä tï bå editeä oò aborted® Iæ  nï  erroò +handleò  ió  installed¬  thå commanä whicè causeä  thå  erroò  ió +echoeä tï thå screen¬ followeä bù á questioî mark. + + Alì RCÐ commandó arå installatioî-dependent¬ anä manù maù bå +configureä  aô  assemblù timå tï perforí  iî  slightlù  differenô +ways®   Thå  exampleó giveî iî thió HELÐ filå arå  baseä  oî  thå +distributeä seô oæ options® Seå sourcå codå filå Z34RCP.LIÂ  foò +morå detailó oî commanä anä optioî selection. + +:CLED anä SPOÐ Commands + Transient Counterparts: LSÈ anä SPOP + + Thå  CLEÄ commanä invokeó á speciaì prograí  whicè  provideó +WordStaò-likå editinç oæ commandó aô thå systeí prompt® Iô  alsï +allowó yoõ tï recalì thå lasô severaì commandó invokeä witè  onlù +onå keystroke® Finally¬ iæ available¬ CLEÄ displayó thå  currenô +systeí timå tï thå lefô oæ youò prompt® Thå syntaø is: + + CLED - invoke as shell + CLED / - invoke for next command only + + + + Thå SPOÐ commanä "pops¢ thå toð shelì froí thå shelì  stack¬ +sï thaô iô nï longeò loadó afteò everù command® Thió commanä  ió +rarelù  needed¬  anä ió includeä onlù witè versionó  oæ  thå  RCÐ +includinç CLEÄ (seå above)® Thå syntaø ió simply: + + SPOP +:CLS Command + Transient Counterpart: None + + Thå  CLÓ  commanä  clearó  thå  terminaì  screen¬   removinç +displayó  whicè  mighô  havå beeî lefô bù  previouó  commandó  oò +programs® Thå syntaø is: + + CLS + +:CP Command + Transient Counterpart: MCOPY + + Thå  CÐ  commanä copieó onå filå froí onå DÕ tï  anotheò  oò +intï  thå samå DÕ undeò á differenô name® Iæ functionó 10²  (geô +stamp©  anä 10³ (seô stamp© arå supporteä bù aî RSØ oò DOS¬  filå +datestampó arå preserveä acrosó copies® Thå syntaø is: + + CP dir:ufn1 dir:ufn2 -- ufn1 to ufn2 + CP dir:ufn1 -- ufn1 to current dir: + CP dir:ufn2=dir:ufn1 -- ufn1 to ufn2 + + Examples: + + CP f1.txt f2.txt + CP b0:f1.txt a15: + CP root:f1.txt + +:D Command + Transient Counterpart: DIR, XD, XDIR + + Thå   Ä   commanä  displayó  thå  directorù  oæ   fileó   iî +alphabeticaì ordeò acrosó thå lineó tï thå user® Thå syntaø is: + + D dir:afn.aft o + D .aft o + D /o + + Options (wheel only) are: + + S - Display System Files Only + A - Display Both Non-System and System Files + + Examples: + + D /a + D root:myfile.txt Š D .com + +:ECHO Command + Transient Counterpart: ECHO + + ECHÏ   ió usefuì iî issuinç botè messageó (tï thå  user¬ +saù withiî á commanä filå durinç execution© anä escapå sequences® +Bù  uså oæ thå %¾ anä %¼ parameters¬ ECHÏ caî senä itó outpuô  iî +combinationó  oæ uppeò anä loweò case® Bù uså oæ thå %Ð  anä  %Ã +parameters¬  ECHÏ  outpuô  caî  bå  toggleä  betweeî  screeî  anä +printer®   ECHÏ  useó  BIOÓ  calls¬  sï  alì  controì  characteró +(entereä aó ^character© arå passeä exactly® Hence¬ consolå-leveì +programminç oæ sucè deviceó (CRTó anä printers© ió possible. + + Examples: + ECHO %Pthis is a test%Cof echo%P + -- "THIS IS A TEST" goes to the printer + "OF ECHO" goes to the console + (trailing %P flushes printer buffer) + + ECHO t%>his is a % + prtdec ,%recs,,%bytes, + prtdec ; Trailing CRLF + endm + + else ; Non-SLR assemblers +include macro filename + $include filename&.lib + endm + endif ; SLR + + + if ZRL + +; ============================================================================= + +; J e t L D R I D S E C T I O N + +; ============================================================================= + +; Macro to build ID block message for JetLDR. Max. length is ~256 chars. + +optcnt defl 0 ; Options counter + +option macro string1,enable1,string2,enable2 + + if enable1 ;; Skip if command not present + if [optcnt mod 4] eq 0 + db cr,lf ;; New line every four options + endif + optcnt defl optcnt + 1 ;; Increment options counter + count defl 0 ;; Initialize character count + + irpc char,string1 ;; Count and define characters + count defl count + 1 + db '&char' + endm ; irpc + + if not nul enable2 ;; Sub-option label present + if enable2 ;; Sub-option enabled + db ' (' ;; Begin sub-opt description + irpc char,string2 ;; Count and define characters + count defl count + 1 + db '&char' + endm ; irpc + db ')' ;; End sub-opt description + count defl count + 3 ;; For ' ()' + endif ; enable2 + endif ; not nul enable2 + + if [optcnt mod 4] ne 0 + count defl 11 - count + rept count + db ' ' ;; Pad to 11 spaces + endm ; rept + endif ; [optcnt mod 4] ne 0 + + endif ; enable1 + endm ; option macro + +; --------------------------------------------------------- + + COM /_ID_/ ; JetLDR ID block + db 'Copr. 1989 ZSA. Enabled Commands:' + option Cled,cledon + option Cls,clson,TC,clstcap + option Cp,cpon,stp,stpcall + option Dir,diron,sp, + option Echo,echoon,lst,echolst + option Era,eraon,sp, + option Help,true + option List,liston + option Note,noteon + option Peek,peekon,hdr,peekhdr + ; option Poke,pokeon,q,pokeq + option Poke,pokeon + option Port,porton + option Protect,proton + option Quiet,quieton + option Register,regon + option Rename,renon + option Reset,reson,sp, + option Space,spaceon + option Spop,cledon + option Type,lton,cls, + option Wheel,whlon,q,whlquiet + db 0 ; ID string terminator + +;============================================================================= +; +; E N T R Y C O D E S E C T I O N +; +;============================================================================= + + cseg + else + org z3rcp + endif ; ZRL + +RCPbegin: + db 'Z3RCP' ; Package ID + + include RCPcmd ; Command table and custom commands + + include RCPsubs ; File of subroutines + + include RCPh ; 'H' help (command list) command + +; Include only selected code sections. + + if cledon ; 'CLED' and 'SPOP' commands + include RCPcled + endif ;cledon + + if clson + include RCPcls ; 'CLS' clear screen command + endif ;clson + + if reson + include RCPr ; 'R' disk reset command + endif ;reson + + if spaceon + include RCPsp ; 'SP' space on disk command + endif ;spaceon + + if diron + include RCPdir ; 'DIR' directory command + endif ;diron + + if eraon + include RCPera ; 'ERA' erase command + endif ;eraon + + if renon + include RCPren ; 'REN' rename command + endif ;renon + + if cpon + include RCPcp ; 'CP' file copying command + endif ;cpon + + if echoon + include RCPecho ; 'ECHO' command + endif ;echoon + + if quieton + include RCPquiet ; 'Q' quiet flag + endif ;quieton + + if lton + include RCPlt ; 'LIST' and 'TYPE' commands + endif ;lton + + if proton + include RCPprot ; 'PROT' file attribute setting command + endif ;proton + + if peekon or pokeon or porton + include RCPiom ; 'PEEK', 'POKE', 'PORT' commands + endif ;peekon or pokeon or porton + + if regon + include RCPreg ; 'REG' register operation commands + endif ;regon + + if whlon + include RCPwhl ; 'WHL' command + endif ;whlon + + include RCPid ; Add ID string (must come last) + +RCPend: ; Used to calculate length + end + +; End of Z34RCP.Z80 + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/z34rcp11.z80.sav b/Source/BPBIOS/Z34RCP11/z34rcp11.z80.sav new file mode 100644 index 00000000..7af6b875 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/z34rcp11.z80.sav @@ -0,0 +1,267 @@ + +; Program: Z34RCP +; Description: Resident Command Package (RCP) for ZCPR34 +; Version: 1.3 +; Author: Carson Wilson +; Date: September 13, 1989 +; Changes: Added CLED (command line editor shell) command. +; To save space, JetLDR ID section no longer pads end of each +; line. (JetLDR allows only 256 bytes maximum in its +; description field). + +; Version: 1.2 +; Author: Carson Wilson +; Date: July 9, 1989 +; Changes: Uses spaces instead of tabs in JetLDR displays. +; Copyright now ZSA. + +; Version: 1.1 +; Author: Carson Wilson +; Date: September 14, 1988 +; Changes: RCPID macro called from RCPID.LIB so that the final INCLUDE +; macro call gives total size of the RCP, including the ID +; string, with SLR assemblers. +; Label WHLQ changed to WHLQUIET in Option macro to match +; Z34HDR.LIB equate. + +; Version: 1.0 +; Author: Carson Wilson +; Date: June 15, 1988 + +; Derivation: SYSRCP (Richard Conn) + +; Z34RCP is copyright 1989 by Z Systems Associates. All rights reserved. +; End-user distribution and duplication permitted for non-commercial purposes +; only. Any commercial use of Z34RCP, defined as any situation where the +; duplicator recieves revenue by duplicating or distributing Z34RCP by itself +; or in conjunction with any hardware or software product, is expressly +; prohibited unless authorized in writing by Z Systems Associates. + +;============================================================================= +; +; D E F I N I T I O N S S E C T I O N +; +;============================================================================= + + maclib sysdef.lib ; Common logic, sys, ascii defines + maclib z34defn.lib ; Defines offsets in Z34 command processor + maclib z34mac.lib ; Macros + maclib z34rcp.lib ; Defines command options + + if ZRL + maclib z34cmn.lib ; Defines universal ZCPR named common blocks + else + maclib rcpbase.lib ; Defines addresses for one system + endif + + name RCP11 ; Declare module name + +; ============================================================================ + +; M A C R O S S E C T I O N + +; ============================================================================ + +; Macros to include module file and print module length. +; Under SLR and compatible assemblers, a running account of current RCP +; size and bytes added will be given for each module. +; +; For other assemblers you may have to either modify the non-SLR include +; macro or use a text editor to read in the actual contents of each file +; in place of the include statement. + + if SLR +; +; General purpose macro to display decimal values and messages +; +prtdec macro m1,m2,m3,m4,m5 + .radix 10 ; Decimal output + .printx m1 m2 m3 m4 m5 ; Print to screen + endm +; +; Macro to include modules and display lengths. +; +include macro filename +before defl $ + $include filename&.lib +after defl $ +modlen defl after - before ; Module length +rcplen defl after - RCPbegin ; RCP length +recs defl rcplen / 128 ; ..in records +bytes defl rcplen mod 128 ; ..and additional bytes + prtdec %modlen, + prtdec ,%recs,,%bytes, + prtdec ; Trailing CRLF + endm + + else ; Non-SLR assemblers +include macro filename + $include filename&.lib + endm + endif ; SLR + + + if ZRL + +; ============================================================================= + +; J e t L D R I D S E C T I O N + +; ============================================================================= + +; Macro to build ID block message for JetLDR. Max. length is ~256 chars. + +optcnt defl 0 ; Options counter + +option macro string1,enable1,string2,enable2 + + if enable1 ;; Skip if command not present + if [optcnt mod 4] eq 0 + db cr,lf ;; New line every four options + endif + optcnt defl optcnt + 1 ;; Increment options counter + count defl 0 ;; Initialize character count + + irpc char,string1 ;; Count and define characters + count defl count + 1 + db '&char' + endm ; irpc + + if not nul enable2 ;; Sub-option label present + if enable2 ;; Sub-option enabled + db ' (' ;; Begin sub-opt description + irpc char,string2 ;; Count and define characters + count defl count + 1 + db '&char' + endm ; irpc + db ')' ;; End sub-opt description + count defl count + 3 ;; For ' ()' + endif ; enable2 + endif ; not nul enable2 + + if [optcnt mod 4] ne 0 + count defl 11 - count + rept count + db ' ' ;; Pad to 11 spaces + endm ; rept + endif ; [optcnt mod 4] ne 0 + + endif ; enable1 + endm ; option macro + +; --------------------------------------------------------- + + COM /_ID_/ ; JetLDR ID block + db 'Copr. 1989 ZSA. Enabled Commands:' + option Cled,cledon + option Cls,clson,TC,clstcap + option Cp,cpon,stp,stpcall + option Dir,diron,sp, + option Echo,echoon,lst,echolst + option Era,eraon,sp, + option Help,true + option List,liston + option Note,noteon + option Peek,peekon,hdr,peekhdr + option Poke,pokeon,q,pokeq + option Port,porton + option Protect,proton + option Quiet,quieton + option Register,regon + option Rename,renon + option Reset,reson,sp, + option Space,spaceon + option Spop,cledon + option Type,lton,cls, + option Wheel,whlon,q,whlquiet + db 0 ; ID string terminator + +;============================================================================= +; +; E N T R Y C O D E S E C T I O N +; +;============================================================================= + + cseg + else + org z3rcp + endif ; ZRL + +RCPbegin: + db 'Z3RCP' ; Package ID + + include RCPcmd ; Command table and custom commands + + include RCPsubs ; File of subroutines + + include RCPh ; 'H' help (command list) command + +; Include only selected code sections. + + if cledon ; 'CLED' and 'SPOP' commands + include RCPcled + endif ;cledon + + if clson + include RCPcls ; 'CLS' clear screen command + endif ;clson + + if reson + include RCPr ; 'R' disk reset command + endif ;reson + + if spaceon + include RCPsp ; 'SP' space on disk command + endif ;spaceon + + if diron + include RCPdir ; 'DIR' directory command + endif ;diron + + if eraon + include RCPera ; 'ERA' erase command + endif ;eraon + + if renon + include RCPren ; 'REN' rename command + endif ;renon + + if cpon + include RCPcp ; 'CP' file copying command + endif ;cpon + + if echoon + include RCPecho ; 'ECHO' command + endif ;echoon + + if quieton + include RCPquiet ; 'Q' quiet flag + endif ;quieton + + if lton + include RCPlt ; 'LIST' and 'TYPE' commands + endif ;lton + + if proton + include RCPprot ; 'PROT' file attribute setting command + endif ;proton + + if peekon or pokeon or porton + include RCPiom ; 'PEEK', 'POKE', 'PORT' commands + endif ;peekon or pokeon or porton + + if regon + include RCPreg ; 'REG' register operation commands + endif ;regon + + if whlon + include RCPwhl ; 'WHL' command + endif ;whlon + + include RCPid ; Add ID string (must come last) + +RCPend: ; Used to calculate length + end + +; End of Z34RCP.Z80 + \ No newline at end of file diff --git a/Source/BPBIOS/Z34RCP11/zsystem.ad b/Source/BPBIOS/Z34RCP11/zsystem.ad new file mode 100644 index 00000000..5231a575 --- /dev/null +++ b/Source/BPBIOS/Z34RCP11/zsystem.ad @@ -0,0 +1,97 @@ + + Z System Upgrades CP/M + +Z System is first-rate, state-of-the-art software for your CP/M machine. +ZCPR has been with us for over five years now, and has enhanced computer +productivity for thousands of CP/M users. Z System is now a mature +replacement for CP/M 2.2 or CP/M Plus, yet is "backward compatible" with +almost all programs written for CP/M. This means that you can still run +the CP/M programs you now use, yet take advantage of greatly increased +power and performance at the same time. + +NZ-COM and Z3PLUS form the heart of Z System. They replace the most +visible parts of CP/M 2.2 and CP/M Plus respectively, adding enhanced +command processing, named directories, vastly improved resident +commands, flow control processing, error handling, and much more. But +it isn't necessary to master all of these (at least at first!) to take +advantage of NZ-COM and Z3PLUS. In fact, though both packages come with +several disks of software and excellent manuals, almost anyone can +install either of these packages on their CP/M computer in just a few +minutes' time. The price for either NZ-COM or Z3PLUS is $69.95 plus $3 +shipping. + +The next step up in sophistication for CP/M 2.2 users is ZSDOS. ZSDOS +replaces the less visible portion of CP/M 2.2 which controls program +input and output. Through clever coding and exhaustive testing, the +authors of ZSDOS offer significant improvements in performance, safety, +and versatility for CP/M 2.2, including file time and date stamping, +file archiving for faster backups, public files (accessable from all +user areas), path access to files, and improved error messages and +handling. As with NZ-COM and Z3PLUS, ZSDOS installation is completely +menu-driven. ZSDOS comes with a collection of state-of-the-art utility +programs and a 140 page manual to help you make the most of the extended +features. ZSDOS costs $75 ($60 when purchased with NZ-COM) plus $3 +shipping. + +Another path to system enhancement for CP/M 2.2 users with hard or RAM +disks is available in the form of BackGrounder ii (BGii). BGii allows +you to "suspend" any program at the touch of a button and use a wide +range of resident commands such as DIR, REN, ERA, CALC, or TYPE. Then +hit the button again and BGii quickly returns you to the program you +suspended, right where you left off. Or use BGii's SWAP command and +you're back at the CP/M prompt, ready to run any other CP/M program. +When you're through, SWAP again and BGii returns you to your original +program, exactly as you left it! Advanced "Cut" and "Paste" commands +are also available for many terminals, allowing you to transfer sections +of screen directly from one program to another. Print spooling, +advanced key redefinition and recording capabilities, and a beautifully +designed 140-page user's manual are included. Installation is +menu-driven and easy. BGii is compatible with either ZCPR or CP/M 2.2, +and costs $75.00 plus $3 shipping. + +Last but not least is DosDisk, a small but powerful program which allows +you to read or write DIRECTLY to MS-DOS disks with your CP/M computer. +No more file transfers--simply insert a standard MS-DOS DSDD diskette in +your CP/M machine, type "DosDisk :", and away you go--all files +on the diskette are now accessable by all of your CP/M programs--even +files in MS-DOS subdirectories! DosDisk comes with a handsome 38-page +user's manual, and is available preconfigured for most machines at just +$30.00 plus $3 shipping. DosDisk is compatible with either ZCPR or +CP/M 2.2. + +These and other fine products for CP/M and CP/M Plus are available from +users groups around the country, or directly from Z Systems Associates. +Sizeable discounts for users' groups are also available from Z Systems +Associates through the Z Plan. The Z Systems Associates are: + + Sage Microsystems East + Selling & Supporting the Best in 8-Bit Software + 1435 Centre St., Newton Centre, MA 02159-2469 + Voice: 617/965-3552 (9:00am - 11:30pm) + Modem: 617/965-7259 (password = DDT)(MABOS on PC-Pursuit) + + Same-day shipping of most products with modem download and support + available. Order by phone, mail, or modem. Shipping and handling $4 + per order (USA). Check, VISA, or MasterCard. Specify exact disk format. + +and: + + Plu*Perfect Systems + "==World-Class Software" + 410 23rd Street, Santa Monica, CA 90402 + Voice: 213/393-6105 (evenings) + Modem: 213/670-9465 (leave message for "Bridger Mitchell") + + To order: Specify product, operating system, computer, 5 1/4" disk + format. Enclose check, adding $3 shipping ($5 foreign) + 6.5% tax in + California. Enclose invoice if upgrading BGii or ZRDOS. + +For more information on Z System, check at the above bulletin board +systems, or consult The Computer Journal for excellent articles on ZCPR +and CP/M. The Computer Journal is published six times a year by +Publishing Consultants, 190 Sullivan Crossroad, Columbia Falls, MT +59912, phone 406/257-9119. An issue averages forty pages with few ads. +Subscription rates are $16 for one year (6 issues), or $28 for two years +(12 issues) in the U.S., $22 for one year Canada and Mexico, and $24 +(surface) for one year in other countries. + \ No newline at end of file diff --git a/Source/BPBIOS/dph.lib b/Source/BPBIOS/dph.lib index 72f39fef..1f6021e6 100644 --- a/Source/BPBIOS/dph.lib +++ b/Source/BPBIOS/dph.lib @@ -11,6 +11,11 @@ ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: CSEG + +; Table has been reordered so that hard disk entries come before +; floppy entries. This means that "DRV_A" appears as I: and "DRV_E" +; appears as A:. The point is to allow booting from the first +; hard drive which pretty much needs to be A: DPHTBL: IF DRV_E AND HARDDSK @@ -34,46 +39,46 @@ DPHTBL: DEFW 00 ENDIF - IF DRV_A - DEFW DPH$00 ; Dph for drive A (Floppy) + IF DRV_I AND HARDDSK + DEFW DPH$54 ; Dph for Hard drive Partition I ELSE DEFW 00 ENDIF - IF DRV_B - DEFW DPH$01 ; Dph for drive B (Floppy) + IF DRV_J AND HARDDSK + DEFW DPH$55 ; Dph for Hard drive Partition J ELSE DEFW 00 ENDIF - IF DRV_C - DEFW DPH$02 ; Dph for drive C (Floppy) + IF DRV_K AND HARDDSK + DEFW DPH$56 ; Dph for Hard drive Partition K ELSE DEFW 00 ENDIF - IF DRV_D - DEFW DPH$03 ; Dph for drive D (Floppy) + IF DRV_L AND HARDDSK + DEFW DPH$57 ; Dph for Hard drive Partition L ELSE - DEFW 0 ; Dph for drive D + DEFW 00 ENDIF - IF DRV_I AND HARDDSK - DEFW DPH$54 ; Dph for Hard drive Partition I + IF DRV_A + DEFW DPH$00 ; Dph for drive A (Floppy) ELSE DEFW 00 ENDIF - IF DRV_J AND HARDDSK - DEFW DPH$55 ; Dph for Hard drive Partition J + IF DRV_B + DEFW DPH$01 ; Dph for drive B (Floppy) ELSE DEFW 00 ENDIF - IF DRV_K AND HARDDSK - DEFW DPH$56 ; Dph for Hard drive Partition K + IF DRV_C + DEFW DPH$02 ; Dph for drive C (Floppy) ELSE DEFW 00 ENDIF - IF DRV_L AND HARDDSK - DEFW DPH$57 ; Dph for Hard drive Partition L + IF DRV_D + DEFW DPH$03 ; Dph for drive D (Floppy) ELSE - DEFW 00 + DEFW 0 ; Dph for drive D ENDIF IF DRV_M AND RAMDSK diff --git a/Source/BPBIOS/z33.zex b/Source/BPBIOS/z33.zex index bd8b92d3..ea1e714e 100644 --- a/Source/BPBIOS/z33.zex +++ b/Source/BPBIOS/z33.zex @@ -1,3 +1,3 @@ IOPINIT -LDR SYS.RCP,SYS.NDR,SYS.FCP,WW.Z3T +JETLDR RCP.ZRL,SYS.NDR,FCP.ZRL,MYTERM.Z3T  \ No newline at end of file diff --git a/Source/BPBIOS/z34.zex b/Source/BPBIOS/z34.zex index bd8b92d3..ea1e714e 100644 --- a/Source/BPBIOS/z34.zex +++ b/Source/BPBIOS/z34.zex @@ -1,3 +1,3 @@ IOPINIT -LDR SYS.RCP,SYS.NDR,SYS.FCP,WW.Z3T +JETLDR RCP.ZRL,SYS.NDR,FCP.ZRL,MYTERM.Z3T  \ No newline at end of file diff --git a/Source/BPBIOS/z41.zex b/Source/BPBIOS/z41.zex index 010e3334..aa944b80 100644 --- a/Source/BPBIOS/z41.zex +++ b/Source/BPBIOS/z41.zex @@ -1,4 +1,4 @@ IOPINIT -LDR SYS.NDR,SYS.FCP,WW.Z3T +JETLDR SYS.NDR,FCP.ZRL,MYTERM.Z3T ZSCFG2 CB  \ No newline at end of file diff --git a/Source/Build.cmd b/Source/Build.cmd index ef139f9d..9419b3ce 100644 --- a/Source/Build.cmd +++ b/Source/Build.cmd @@ -4,6 +4,6 @@ setlocal REM setlocal & call BuildDoc || exit /b 1 & endlocal setlocal & call BuildProp || exit /b 1 & endlocal setlocal & call BuildShared || exit /b 1 & endlocal -setlocal & call BuildImages || exit /b 1 & endlocal REM setlocal & call BuildBP || exit /b 1 & endlocal +setlocal & call BuildImages || exit /b 1 & endlocal setlocal & call BuildROM %* || exit /b 1 & endlocal \ No newline at end of file diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index 891419cb..86533ade 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -25,4 +25,5 @@ call BuildHD.cmd nzcom ..\zsdos\zsys_wbw.sys call BuildHD.cmd cpm3 call BuildHD.cmd zpm3 call BuildHD.cmd ws4 -call BuildHD.cmd bp + +if exist ..\BPBIOS\bpbio-ww.rel call BuildHD.cmd bp diff --git a/Source/Images/d_bp.txt b/Source/Images/d_bp.txt new file mode 100644 index 00000000..0a5b33c5 --- /dev/null +++ b/Source/Images/d_bp.txt @@ -0,0 +1,31 @@ +# +# Add RomWBW utilities +# +../../Binary/Apps/assign.com 0: +../../Binary/Apps/fat.com 0: +../../Binary/Apps/fdu.com 0: +../../Binary/Apps/format.com 0: +../../Binary/Apps/mode.com 0: +../../Binary/Apps/osldr.com 0: +../../Binary/Apps/rtc.com 0: +../../Binary/Apps/survey.com 0: +../../Binary/Apps/syscopy.com 0: +../../Binary/Apps/sysgen.com 0: +../../Binary/Apps/talk.com 0: +../../Binary/Apps/timer.com 0: +../../Binary/Apps/xm.com 0: +../../Binary/Apps/inttest.com 0: +# +# Add Tune application and sample files +# +../../Binary/Apps/tune.com 3: +../../Binary/Apps/Tunes/*.* 3: +# +# Add ZSystem images +# +../BPBIOS/*.img 0: +../BPBIOS/*.rel 0: +../BPBIOS/*.zex 0: +../BPBIOS/myterm.z3t 0: +../BPBIOS/Z34RCP11/z34rcp11.rel 0:rcp.zrl +../BPBIOS/NZFCP13/nzfcp13.rel 0:fcp.zrl diff --git a/Source/Images/d_bp/u0/FAT.COM b/Source/Images/d_bp/u0/FAT.COM deleted file mode 100644 index 1dd7dccacc7291705175f18e44b0e5d4426afe6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44928 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 Mx60w`;s4hE2dzr%$p8QV diff --git a/Source/Images/d_bp/u0/JETLDR.COM b/Source/Images/d_bp/u0/JETLDR.COM new file mode 100644 index 0000000000000000000000000000000000000000..c33c0738f7b6621c96c3337f82d2ea39ccffd573 GIT binary patch literal 9088 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 literal 0 HcmV?d00001 diff --git a/Source/Images/d_bp/u0/R.COM b/Source/Images/d_bp/u0/R.COM deleted file mode 100644 index fecaa4ac0f8317af918e2a835a36f51d13cb0678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4224 zcmbtXeQXow89(P7C;q;Jt#Z(Y-b>6z9O5`8Ut}aHNr=`hDJY>pmvwO17sti%Wwt{| zM<8YDq*iSIY?GjT{@bbAb=oGRsT8(@j$^t%0%KFHS(~X`Q7r#4v9V>F$e!mte+AH_ zYF3oo`@GNR@A*B?#p=AH?WLp`k$TDa&K<*K`&2Y0k+?V`^^?ibSDd!NXk1JzkdQpP zu;y|qAfvZSLgu5XX@U`pQN-S|OB&{>takL4HGTdN08#ps{riV@jTM7HR%QKUBGgvxo9a)D z54Dx*d`8V^Q=QTOv>|eQZM13xD%l~r1_ZQ^;b=k%rDW(c?E7px3!Lm3$5)P%``vqLL9Ap~1K$h6&|kqqmWW@i2u|LQa4HH6TA^ z4w(^Cp=n5<(ThDN3F+H&z+hSeWsbi+*y#oMy^McrH$1@ufRaW>_Mz7`4A6SI@=A6FHB0TpD1sj*nTLc&6zRse*&j}_50;r93 z!g+ML0W7Xlm%`_tFxKz6)1Y>uY*~Yrn(&y(>9^dPZ;6R422Zn!?=&0Xmzailq%g^v z_USh6_RDn@A>Ye@C>^a6%%)-v`XjD#UouL+Q74>cJJc(6d<}!wX!YYdJe$ksck95N z@4F1Wyo?52HJ|~1J3a5BQInBLG3bfm2lnafxb!vS0L((1)0gX^o$7B;*aV86yK=;! zCvRmi9I)f|Cp2lALOjCzX){`^K-CCuRP~>F{yPkk)@J4ZvWgcCnK^Tb@TcmLfh|^a z$6sO_Ff=Uy0txGYGAz(RbpvfVOQXvYJjVvlv!H15GWsb_Z>jU0Wq~J`SOu!?GVu;0 zF$nj2tAW93ib47ZG_tD?YTA>H{}dtpb4*Zq%!)l@bW- zKo2E&^n719MHx)FQu0{B(_*Vga89X3S~yKD4(#(?f`9<~790OOg9kdLLNCOlx<)<7 zRY>Hd4e~85L3PDdxm+v!p;jr3=ZfNjds*+`_+?zKu=a-O_Vb+w zKw)QP>;m`1D#Jwybv&>OlcmaWjS00B;Bry7>l~0jYC0XTqv)y=zDRZSrn<%81y<33 z6fmSnitUa=hl|?=Iu1rV9l{dR>B(pY)#!jDxdDtsQ8!0dLvafrJ3m4bO~1>b%@R0A zGJ*4R4w|5g28X*&&&O0?DP@y`j3jxvq47EkPvz5xtZ=Osz&4o~eFUiCsJ=XArez#A zEASVn(DP4~ae{tvEvwhu!npAwL2$lc#5UG_dDA1p2c3&S)}+8f2Ub8&f%7o!@FqIw zG)`?4k9|(u?I0=9$#X|pWQX{U)%MDR%j=C?Aw<7T?tHo1k9r5jl4l#9j5a5=!+1;g9-+(x?i zUM_)In7qKkD+2)2T@I=U%)5uT#!FB4TdOXvs=smzKc$q!Qft<Y}8_@E{e)6v`b5y3~J^xS!e@8&&*e`D?-P-UN zIN_Sn8ocz8ziYX>8$KXb`_Z3mwybaRJXE@uvl>j}04xtr&2y{SOzv(bo7t9G`84n0 zH`e4m_KoJe$C4k8Y+IR*WU{~BwvxZ0<&#bJh4*eI@Hcs=nY>;ves>}hFAc8!!cjay zkvf;jDw@m6H}g<1f0lEtS8Ex;#4GcC53*c`$J)RC&SRzT!41x5VfdBRhUJyK@@cP$ zzf8>ipS$z;x6H)u(eXW_gJf@OyFU>02inQzz}D7bDbyP1BJJJ1ojtuBoz2WQdIDrN SA%~=7626#J|Hu7*#s4p+*ixtf diff --git a/Source/Images/d_bp/u0/RSETSIMH.COM b/Source/Images/d_bp/u0/RSETSIMH.COM deleted file mode 100644 index e055f07a9a16d97b2849d970633e74ff226d9173..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmZQ;u;aV@kM$4>qg4aL_7hf34FAFo2+A??ah_#mILXTulv!FaDSCU$k wmYAHXkdmL5s>jQv;*e=B%d=eBu;o~)fF$p;#~M4NxP<%|7#QYB0STf209!g6lmGw# diff --git a/Source/Images/d_bp/u0/TIMER.COM b/Source/Images/d_bp/u0/TIMER.COM deleted file mode 100644 index 83e6e68842ba2f259ef8acde0649e66d73464674..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 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 G@c%z+v(K^s diff --git a/Source/Images/d_bp/u0/Z41.ZRL b/Source/Images/d_bp/u0/Z41.ZRL deleted file mode 100644 index ed10dfadce1be4513b38abe9c9947ac8e1928b10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6912 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 I|1W?42b(p@&Hw-a diff --git a/Source/Images/d_bp/u0/ZCPR33.REL b/Source/Images/d_bp/u0/ZCPR33.REL deleted file mode 100644 index 7c0a2567317e7d184145252a650170ae13fe22df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 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 diff --git a/Source/Images/d_bp/u0/ZS203.ZRL b/Source/Images/d_bp/u0/ZS203.ZRL deleted file mode 100644 index 11be02dd0bc0d634f1f707e9d6a4d56e8e789ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6912 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 BoWTG9 diff --git a/Source/Images/d_bp/u0/ZSDOS.ZRL b/Source/Images/d_bp/u0/ZSDOS.ZRL deleted file mode 100644 index e43d1b0a8839c0cb5cf21c35ac0fd3be3536966e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4224 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 diff --git a/Source/Images/d_bp/u0/z34.rel b/Source/Images/d_bp/u0/z34.rel deleted file mode 100644 index 0e9d52365dce2737f4fe80afa872417b0c7302ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2816 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 AhyVZp